Because the set/clear SBI_IS_RESIZEFS flag not between any locks,
there is a race:
  thread1               thread2
  ioctl(resizefs)
  set RESIZEFS flag     ioctl(resizefs)
  ...                   set RESIZEFS flag
                        ...
  clear RESIZEFS flag # then no RESIZEFS flag on thread2.

Also before freeze_super, the resizefs not started, we should not set
the SBI_IS_RESIZEFS flag.

So move the set/clear SBI_IS_RESIZEFS flag between the cp_mutex and
gc_lock.

Fixes: b4b10061ef98 ("f2fs: refactor resize_fs to avoid meta updates in 
progress")
Signed-off-by: Zhang Xiaoxu <zhangxiao...@huawei.com>
Signed-off-by: Zhang Qilong <zhangqilo...@huawei.com>
---
 fs/f2fs/gc.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index fd400d148afb..e13aa080ae00 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -2121,8 +2121,6 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 
block_count)
        if (err)
                return err;
 
-       set_sbi_flag(sbi, SBI_IS_RESIZEFS);
-
        freeze_super(sbi->sb);
        f2fs_down_write(&sbi->gc_lock);
        f2fs_down_write(&sbi->cp_global_sem);
@@ -2138,6 +2136,7 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 
block_count)
        if (err)
                goto out_err;
 
+       set_sbi_flag(sbi, SBI_IS_RESIZEFS);
        err = free_segment_range(sbi, secs, false);
        if (err)
                goto recover_out;
@@ -2161,6 +2160,7 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 
block_count)
                f2fs_commit_super(sbi, false);
        }
 recover_out:
+       clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
        if (err) {
                set_sbi_flag(sbi, SBI_NEED_FSCK);
                f2fs_err(sbi, "resize_fs failed, should run fsck to repair!");
@@ -2173,6 +2173,5 @@ int f2fs_resize_fs(struct f2fs_sb_info *sbi, __u64 
block_count)
        f2fs_up_write(&sbi->cp_global_sem);
        f2fs_up_write(&sbi->gc_lock);
        thaw_super(sbi->sb);
-       clear_sbi_flag(sbi, SBI_IS_RESIZEFS);
        return err;
 }
-- 
2.25.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to