f2fs: check s_dirty under cp_mutex
authorJaegeuk Kim <jaegeuk@kernel.org>
Tue, 12 Aug 2014 01:37:46 +0000 (18:37 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 21 Aug 2014 16:21:02 +0000 (09:21 -0700)
It needs to check s_dirty under cp_mutex, since s_dirty is reset under that
mutex.
And previous condition was not correct, since we can omit doing checkpoint
when checkpoint was done followed by all the node pages were written back.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/checkpoint.c
fs/f2fs/super.c

index 6f38aad8e6545b16c7082fdda570fdcc2b07aa73..dc29b7837687af58dfb713ff2a5ed835d8068f94 100644 (file)
@@ -952,6 +952,10 @@ void write_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
        trace_f2fs_write_checkpoint(sbi->sb, is_umount, "start block_ops");
 
        mutex_lock(&sbi->cp_mutex);
+
+       if (!sbi->s_dirty)
+               goto out;
+
        block_operations(sbi);
 
        trace_f2fs_write_checkpoint(sbi->sb, is_umount, "finish block_ops");
@@ -976,9 +980,9 @@ void write_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
        do_checkpoint(sbi, is_umount);
 
        unblock_operations(sbi);
-       mutex_unlock(&sbi->cp_mutex);
-
        stat_inc_cp_count(sbi->stat_info);
+out:
+       mutex_unlock(&sbi->cp_mutex);
        trace_f2fs_write_checkpoint(sbi->sb, is_umount, "finish checkpoint");
 }
 
index 8aabe3ef42f6cf412f1135f00b7bd579117fdf3a..e7a7b619ffd4a472aa6b0e47901b6d44ca3d3040 100644 (file)
@@ -460,9 +460,6 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
 
        trace_f2fs_sync_fs(sb, sync);
 
-       if (!sbi->s_dirty && !get_pages(sbi, F2FS_DIRTY_NODES))
-               return 0;
-
        if (sync) {
                mutex_lock(&sbi->gc_mutex);
                write_checkpoint(sbi, false);