This can guarantee inline_data has smaller i_size.

Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org>
---
 fs/f2fs/file.c | 25 +++++++++----------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 08caaead6f16..a43193dd27cb 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -815,14 +815,20 @@ int f2fs_setattr(struct dentry *dentry, struct iattr 
*attr)
 
        if (attr->ia_valid & ATTR_SIZE) {
                loff_t old_size = i_size_read(inode);
-               bool to_smaller = (attr->ia_size <= old_size);
+
+               if (attr->ia_size > MAX_INLINE_DATA(inode)) {
+                       /* should convert inline inode here */
+                       err = f2fs_convert_inline_inode(inode);
+                       if (err)
+                               return err;
+               }
 
                down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
                down_write(&F2FS_I(inode)->i_mmap_sem);
 
                truncate_setsize(inode, attr->ia_size);
 
-               if (to_smaller)
+               if (attr->ia_size <= old_size)
                        err = f2fs_truncate(inode);
                /*
                 * do not trim all blocks after i_size if target size is
@@ -830,24 +836,11 @@ int f2fs_setattr(struct dentry *dentry, struct iattr 
*attr)
                 */
                up_write(&F2FS_I(inode)->i_mmap_sem);
                up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
-
                if (err)
                        return err;
 
-               if (!to_smaller) {
-                       /* should convert inline inode here */
-                       if (!f2fs_may_inline_data(inode)) {
-                               err = f2fs_convert_inline_inode(inode);
-                               if (err) {
-                                       /* recover old i_size */
-                                       i_size_write(inode, old_size);
-                                       return err;
-                               }
-                       }
-                       inode->i_mtime = inode->i_ctime = current_time(inode);
-               }
-
                down_write(&F2FS_I(inode)->i_sem);
+               inode->i_mtime = inode->i_ctime = current_time(inode);
                F2FS_I(inode)->last_disk_size = i_size_read(inode);
                up_write(&F2FS_I(inode)->i_sem);
        }
-- 
2.19.0.605.g01d371f741-goog

Reply via email to