Skip to content

Commit 051178c

Browse files
committed
super: use higher-level helper for {freeze,thaw}
It's not necessary to use low-level locking helpers here. Use the higher-level locking helpers and log if the superblock is dying. Since the caller is assumed to already hold an active reference it isn't possible to observe a dying superblock. Suggested-by: Jan Kara <jack@suse.cz> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 2c18a63 commit 051178c

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

fs/super.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,8 +1873,13 @@ int freeze_super(struct super_block *sb)
18731873
{
18741874
int ret;
18751875

1876+
/* Since the caller must already have an active reference... */
18761877
atomic_inc(&sb->s_active);
1877-
__super_lock_excl(sb);
1878+
1879+
/* ...@sb definitely can't be dying. */
1880+
if (!super_lock_excl(sb))
1881+
WARN(1, "Dying superblock while freezing!");
1882+
18781883
if (sb->s_writers.frozen != SB_UNFROZEN) {
18791884
deactivate_locked_super(sb);
18801885
return -EBUSY;
@@ -1896,7 +1901,10 @@ int freeze_super(struct super_block *sb)
18961901
/* Release s_umount to preserve sb_start_write -> s_umount ordering */
18971902
super_unlock_excl(sb);
18981903
sb_wait_write(sb, SB_FREEZE_WRITE);
1899-
__super_lock_excl(sb);
1904+
1905+
/* We're still holding an active reference. */
1906+
if (!super_lock_excl(sb))
1907+
WARN(1, "Dying superblock while freezing!");
19001908

19011909
/* Now we go and block page faults... */
19021910
sb->s_writers.frozen = SB_FREEZE_PAGEFAULT;
@@ -1979,7 +1987,8 @@ static int thaw_super_locked(struct super_block *sb)
19791987
*/
19801988
int thaw_super(struct super_block *sb)
19811989
{
1982-
__super_lock_excl(sb);
1990+
if (!super_lock_excl(sb))
1991+
WARN(1, "Dying superblock while thawing!");
19831992
return thaw_super_locked(sb);
19841993
}
19851994
EXPORT_SYMBOL(thaw_super);

0 commit comments

Comments
 (0)