struct f2fs_map_blocks map;
        int err = 0;
 
+       if (is_inode_flag_set(inode, FI_NO_PREALLOC))
+               return 0;
+
        map.m_lblk = F2FS_BLK_ALIGN(iocb->ki_pos);
        map.m_len = F2FS_BYTES_TO_BLK(iocb->ki_pos + iov_iter_count(from));
        if (map.m_len > map.m_lblk)
         * we already allocated all the blocks, so we don't need to get
         * the block addresses when there is no need to fill the page.
         */
-       if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE)
+       if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE &&
+                       !is_inode_flag_set(inode, FI_NO_PREALLOC))
                return 0;
 
        if (f2fs_has_inline_data(inode) ||
 
        FI_INLINE_DOTS,         /* indicate inline dot dentries */
        FI_DO_DEFRAG,           /* indicate defragment is running */
        FI_DIRTY_FILE,          /* indicate regular/symlink has dirty pages */
+       FI_NO_PREALLOC,         /* indicate skipped preallocated blocks */
 };
 
 static inline void __mark_inode_dirty_flag(struct inode *inode,
 
 #include <linux/uaccess.h>
 #include <linux/mount.h>
 #include <linux/pagevec.h>
+#include <linux/uio.h>
 #include <linux/uuid.h>
 #include <linux/file.h>
 
        inode_lock(inode);
        ret = generic_write_checks(iocb, from);
        if (ret > 0) {
-               int err = f2fs_preallocate_blocks(iocb, from);
+               int err;
 
+               if (iov_iter_fault_in_readable(from, iov_iter_count(from)))
+                       set_inode_flag(inode, FI_NO_PREALLOC);
+
+               err = f2fs_preallocate_blocks(iocb, from);
                if (err) {
                        inode_unlock(inode);
                        return err;
                blk_start_plug(&plug);
                ret = __generic_file_write_iter(iocb, from);
                blk_finish_plug(&plug);
+               clear_inode_flag(inode, FI_NO_PREALLOC);
        }
        inode_unlock(inode);