]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
f2fs: fix freezing filesystem during resize
authorChristian Brauner <brauner@kernel.org>
Sun, 6 Apr 2025 20:28:52 +0000 (22:28 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 9 May 2025 10:41:24 +0000 (12:41 +0200)
Using FREEZE_HOLDER_USERSPACE has two consequences:

(1) If userspace freezes the filesystem after mnt_drop_write_file() but
    before freeze_super() was called filesystem resizing will fail
    because the freeze isn't marked as nestable.

(2) If the kernel has successfully frozen the filesystem via
    FREEZE_HOLDER_USERSPACE userspace can simply undo it by using the
    FITHAW ioctl.

Fix both issues by using FREEZE_HOLDER_KERNEL. It will nest with
FREEZE_HOLDER_USERSPACE and cannot be undone by userspace.

And it is the correct thing to do because the kernel temporarily freezes
the filesystem.

Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/f2fs/gc.c

index 3e8af62c9e15ecd0d2edd85b7f4d0cc859358bd8..dd0ba0532e0110b4498a4edac1dc92ac8d032b21 100644 (file)
@@ -2271,12 +2271,12 @@ out_drop_write:
        if (err)
                return err;
 
-       err = freeze_super(sbi->sb, FREEZE_HOLDER_USERSPACE, NULL);
+       err = freeze_super(sbi->sb, FREEZE_HOLDER_KERNEL, NULL);
        if (err)
                return err;
 
        if (f2fs_readonly(sbi->sb)) {
-               err = thaw_super(sbi->sb, FREEZE_HOLDER_USERSPACE, NULL);
+               err = thaw_super(sbi->sb, FREEZE_HOLDER_KERNEL, NULL);
                if (err)
                        return err;
                return -EROFS;
@@ -2333,6 +2333,6 @@ recover_out:
 out_err:
        f2fs_up_write(&sbi->cp_global_sem);
        f2fs_up_write(&sbi->gc_lock);
-       thaw_super(sbi->sb, FREEZE_HOLDER_USERSPACE, NULL);
+       thaw_super(sbi->sb, FREEZE_HOLDER_KERNEL, NULL);
        return err;
 }