]> git.itanic.dy.fi Git - linux-stable/commitdiff
fs: streamline thaw_super_locked
authorChristoph Hellwig <hch@lst.de>
Fri, 27 Oct 2023 06:40:01 +0000 (08:40 +0200)
committerChristian Brauner <brauner@kernel.org>
Sat, 18 Nov 2023 13:59:24 +0000 (14:59 +0100)
Add a new out_unlock label to share code that just releases s_umount
and returns an error, and rename and reuse the out label that deactivates
the sb for one more case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20231027064001.GA9469@lst.de
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/super.c

index 18b42281ebe2068c236adf2c85a1c8f14f2c30d9..faeab453e6e9536034700eb96091a247a85dd85b 100644 (file)
@@ -2070,34 +2070,28 @@ EXPORT_SYMBOL(freeze_super);
  */
 static int thaw_super_locked(struct super_block *sb, enum freeze_holder who)
 {
-       int error;
+       int error = -EINVAL;
 
-       if (sb->s_writers.frozen == SB_FREEZE_COMPLETE) {
-               if (!(sb->s_writers.freeze_holders & who)) {
-                       super_unlock_excl(sb);
-                       return -EINVAL;
-               }
+       if (sb->s_writers.frozen != SB_FREEZE_COMPLETE)
+               goto out_unlock;
+       if (!(sb->s_writers.freeze_holders & who))
+               goto out_unlock;
 
-               /*
-                * Freeze is shared with someone else.  Release our hold and
-                * drop the active ref that freeze_super assigned to the
-                * freezer.
-                */
-               if (sb->s_writers.freeze_holders & ~who) {
-                       sb->s_writers.freeze_holders &= ~who;
-                       deactivate_locked_super(sb);
-                       return 0;
-               }
-       } else {
-               super_unlock_excl(sb);
-               return -EINVAL;
+       /*
+        * Freeze is shared with someone else.  Release our hold and drop the
+        * active ref that freeze_super assigned to the freezer.
+        */
+       error = 0;
+       if (sb->s_writers.freeze_holders & ~who) {
+               sb->s_writers.freeze_holders &= ~who;
+               goto out_deactivate;
        }
 
        if (sb_rdonly(sb)) {
                sb->s_writers.freeze_holders &= ~who;
                sb->s_writers.frozen = SB_UNFROZEN;
                wake_up_var(&sb->s_writers.frozen);
-               goto out;
+               goto out_deactivate;
        }
 
        lockdep_sb_freeze_acquire(sb);
@@ -2107,8 +2101,7 @@ static int thaw_super_locked(struct super_block *sb, enum freeze_holder who)
                if (error) {
                        printk(KERN_ERR "VFS:Filesystem thaw failed\n");
                        lockdep_sb_freeze_release(sb);
-                       super_unlock_excl(sb);
-                       return error;
+                       goto out_unlock;
                }
        }
 
@@ -2116,9 +2109,13 @@ static int thaw_super_locked(struct super_block *sb, enum freeze_holder who)
        sb->s_writers.frozen = SB_UNFROZEN;
        wake_up_var(&sb->s_writers.frozen);
        sb_freeze_unlock(sb, SB_FREEZE_FS);
-out:
+out_deactivate:
        deactivate_locked_super(sb);
        return 0;
+
+out_unlock:
+       super_unlock_excl(sb);
+       return error;
 }
 
 /**