Unverified Commit 24c372d5 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christian Brauner
Browse files

fs: streamline thaw_super_locked



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: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20231027064001.GA9469@lst.de


Reviewed-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 218de677
Loading
Loading
Loading
Loading
+20 −23
Original line number Diff line number Diff line
@@ -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.
	 * 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;
			deactivate_locked_super(sb);
			return 0;
		}
	} else {
		super_unlock_excl(sb);
		return -EINVAL;
		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;
}

/**