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>
This commit is contained in:
parent
2c18a63b76
commit
051178c366
15
fs/super.c
15
fs/super.c
|
@ -1873,8 +1873,13 @@ int freeze_super(struct super_block *sb)
|
|||
{
|
||||
int ret;
|
||||
|
||||
/* Since the caller must already have an active reference... */
|
||||
atomic_inc(&sb->s_active);
|
||||
__super_lock_excl(sb);
|
||||
|
||||
/* ...@sb definitely can't be dying. */
|
||||
if (!super_lock_excl(sb))
|
||||
WARN(1, "Dying superblock while freezing!");
|
||||
|
||||
if (sb->s_writers.frozen != SB_UNFROZEN) {
|
||||
deactivate_locked_super(sb);
|
||||
return -EBUSY;
|
||||
|
@ -1896,7 +1901,10 @@ int freeze_super(struct super_block *sb)
|
|||
/* Release s_umount to preserve sb_start_write -> s_umount ordering */
|
||||
super_unlock_excl(sb);
|
||||
sb_wait_write(sb, SB_FREEZE_WRITE);
|
||||
__super_lock_excl(sb);
|
||||
|
||||
/* We're still holding an active reference. */
|
||||
if (!super_lock_excl(sb))
|
||||
WARN(1, "Dying superblock while freezing!");
|
||||
|
||||
/* Now we go and block page faults... */
|
||||
sb->s_writers.frozen = SB_FREEZE_PAGEFAULT;
|
||||
|
@ -1979,7 +1987,8 @@ out:
|
|||
*/
|
||||
int thaw_super(struct super_block *sb)
|
||||
{
|
||||
__super_lock_excl(sb);
|
||||
if (!super_lock_excl(sb))
|
||||
WARN(1, "Dying superblock while thawing!");
|
||||
return thaw_super_locked(sb);
|
||||
}
|
||||
EXPORT_SYMBOL(thaw_super);
|
||||
|
|
Loading…
Reference in New Issue