int err = 0;
        bool direct_io = iocb->ki_flags & IOCB_DIRECT;
 
-       /* convert inline data for Direct I/O*/
-       if (direct_io) {
-               err = f2fs_convert_inline_inode(inode);
-               if (err)
-                       return err;
-       }
-
-       if (direct_io && allow_outplace_dio(inode, iocb, from))
-               return 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)
 
                                ret = -EAGAIN;
                                goto out;
                        }
-               } else {
-                       preallocated = true;
-                       target_size = iocb->ki_pos + iov_iter_count(from);
+                       goto write;
+               }
 
-                       err = f2fs_preallocate_blocks(iocb, from);
-                       if (err) {
-                               clear_inode_flag(inode, FI_NO_PREALLOC);
-                               inode_unlock(inode);
-                               ret = err;
-                               goto out;
-                       }
+               if (is_inode_flag_set(inode, FI_NO_PREALLOC))
+                       goto write;
+
+               if (iocb->ki_flags & IOCB_DIRECT) {
+                       /*
+                        * Convert inline data for Direct I/O before entering
+                        * f2fs_direct_IO().
+                        */
+                       err = f2fs_convert_inline_inode(inode);
+                       if (err)
+                               goto out_err;
+                       /*
+                        * If force_buffere_io() is true, we have to allocate
+                        * blocks all the time, since f2fs_direct_IO will fall
+                        * back to buffered IO.
+                        */
+                       if (!f2fs_force_buffered_io(inode, iocb, from) &&
+                                       allow_outplace_dio(inode, iocb, from))
+                               goto write;
+               }
+               preallocated = true;
+               target_size = iocb->ki_pos + iov_iter_count(from);
+
+               err = f2fs_preallocate_blocks(iocb, from);
+               if (err) {
+out_err:
+                       clear_inode_flag(inode, FI_NO_PREALLOC);
+                       inode_unlock(inode);
+                       ret = err;
+                       goto out;
                }
+write:
                ret = __generic_file_write_iter(iocb, from);
                clear_inode_flag(inode, FI_NO_PREALLOC);