f2fs: avoid unnecessary updating inode during fsync
[deliverable/linux.git] / fs / f2fs / file.c
index d0f42587309f2c1ca61d8853a4fd6525f3d2b6a2..23decf050236dbbb46e250872ab285565da47e97 100644 (file)
@@ -171,15 +171,10 @@ static void try_to_fix_pino(struct inode *inode)
        fi->xattr_ver = 0;
        if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
                        get_parent_ino(inode, &pino)) {
-               fi->i_pino = pino;
+               f2fs_i_pino_write(inode, pino);
                file_got_pino(inode);
-               up_write(&fi->i_sem);
-
-               mark_inode_dirty_sync(inode);
-               f2fs_write_inode(inode, NULL);
-       } else {
-               up_write(&fi->i_sem);
        }
+       up_write(&fi->i_sem);
 }
 
 static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
@@ -213,7 +208,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
        }
 
        /* if the inode is dirty, let's recover all the time */
-       if (!datasync) {
+       if (!datasync && !f2fs_skip_inode_update(inode)) {
                f2fs_write_inode(inode, NULL);
                goto go_write;
        }
@@ -256,7 +251,7 @@ go_write:
                goto out;
        }
 sync_nodes:
-       ret = fsync_node_pages(sbi, ino, &wbc, atomic);
+       ret = fsync_node_pages(sbi, inode, &wbc, atomic);
        if (ret)
                goto out;
 
@@ -500,7 +495,6 @@ int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
                                                        dn->inode) + ofs;
                f2fs_update_extent_cache_range(dn, fofs, 0, len);
                dec_valid_block_count(sbi, dn->inode, nr_free);
-               sync_inode_page(dn);
        }
        dn->ofs_in_node = ofs;
 
@@ -636,7 +630,7 @@ int f2fs_truncate(struct inode *inode, bool lock)
                return err;
 
        inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-       mark_inode_dirty(inode);
+       mark_inode_dirty_sync(inode);
        return 0;
 }
 
@@ -726,7 +720,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
                }
        }
 
-       mark_inode_dirty(inode);
+       mark_inode_dirty_sync(inode);
        return err;
 }
 
@@ -1124,10 +1118,8 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
        }
 
 out:
-       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) {
+       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
                f2fs_i_size_write(inode, new_size);
-               update_inode_page(inode);
-       }
 
        return ret;
 }
@@ -1233,10 +1225,8 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
                new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end;
        }
 
-       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) {
+       if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
                f2fs_i_size_write(inode, new_size);
-               update_inode_page(inode);
-       }
 
        return ret;
 }
@@ -1279,7 +1269,7 @@ static long f2fs_fallocate(struct file *file, int mode,
 
        if (!ret) {
                inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-               mark_inode_dirty(inode);
+               mark_inode_dirty_sync(inode);
                f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
        }
 
@@ -1370,9 +1360,8 @@ static int f2fs_ioc_setflags(struct file *filp, unsigned long arg)
        fi->i_flags = flags;
        inode_unlock(inode);
 
-       f2fs_set_inode_flags(inode);
        inode->i_ctime = CURRENT_TIME;
-       mark_inode_dirty(inode);
+       f2fs_set_inode_flags(inode);
 out:
        mnt_drop_write_file(filp);
        return ret;
This page took 0.028113 seconds and 5 git commands to generate.