]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gfs2: pass through holder from the VFS for freeze/thaw
authorChristian Brauner <brauner@kernel.org>
Fri, 4 Apr 2025 19:02:28 +0000 (21:02 +0200)
committerChristian Brauner <brauner@kernel.org>
Mon, 7 Apr 2025 07:37:17 +0000 (09:37 +0200)
The filesystem's freeze/thaw functions can be called from contexts where
the holder isn't userspace but the kernel, e.g., during systemd
suspend/hibernate. So pass through the freeze/thaw flags from the VFS
instead of hard-coding them.

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

index 44e5658b896c88ae4ccae610a49152fc05a2b06b..a3fe95e519cbc93453e48594cdf1aaf337c2ed10 100644 (file)
@@ -674,7 +674,7 @@ static int gfs2_sync_fs(struct super_block *sb, int wait)
        return sdp->sd_log_error;
 }
 
-static int gfs2_do_thaw(struct gfs2_sbd *sdp)
+static int gfs2_do_thaw(struct gfs2_sbd *sdp, enum freeze_holder who)
 {
        struct super_block *sb = sdp->sd_vfs;
        int error;
@@ -682,7 +682,7 @@ static int gfs2_do_thaw(struct gfs2_sbd *sdp)
        error = gfs2_freeze_lock_shared(sdp);
        if (error)
                goto fail;
-       error = thaw_super(sb, FREEZE_HOLDER_USERSPACE);
+       error = thaw_super(sb, who);
        if (!error)
                return 0;
 
@@ -710,7 +710,7 @@ void gfs2_freeze_func(struct work_struct *work)
        gfs2_freeze_unlock(sdp);
        set_bit(SDF_FROZEN, &sdp->sd_flags);
 
-       error = gfs2_do_thaw(sdp);
+       error = gfs2_do_thaw(sdp, FREEZE_HOLDER_USERSPACE);
        if (error)
                goto out;
 
@@ -728,6 +728,7 @@ out:
 /**
  * gfs2_freeze_super - prevent further writes to the filesystem
  * @sb: the VFS structure for the filesystem
+ * @who: freeze flags
  *
  */
 
@@ -744,7 +745,7 @@ static int gfs2_freeze_super(struct super_block *sb, enum freeze_holder who)
        }
 
        for (;;) {
-               error = freeze_super(sb, FREEZE_HOLDER_USERSPACE);
+               error = freeze_super(sb, who);
                if (error) {
                        fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n",
                                error);
@@ -758,7 +759,7 @@ static int gfs2_freeze_super(struct super_block *sb, enum freeze_holder who)
                        break;
                }
 
-               error = gfs2_do_thaw(sdp);
+               error = gfs2_do_thaw(sdp, who);
                if (error)
                        goto out;
 
@@ -796,6 +797,7 @@ static int gfs2_freeze_fs(struct super_block *sb)
 /**
  * gfs2_thaw_super - reallow writes to the filesystem
  * @sb: the VFS structure for the filesystem
+ * @who: freeze flags
  *
  */
 
@@ -814,7 +816,7 @@ static int gfs2_thaw_super(struct super_block *sb, enum freeze_holder who)
        atomic_inc(&sb->s_active);
        gfs2_freeze_unlock(sdp);
 
-       error = gfs2_do_thaw(sdp);
+       error = gfs2_do_thaw(sdp, who);
 
        if (!error) {
                clear_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);