Skip to content

Commit

Permalink
vfs: make freeze_super abort when sync_filesystem returns error
Browse files Browse the repository at this point in the history
If we fail to synchronize the filesystem while preparing to freeze the
fs, abort the freeze.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Acked-by: Christian Brauner <brauner@kernel.org>
  • Loading branch information
Darrick J. Wong committed Jan 30, 2022
1 parent e783362 commit 2719c71
Showing 1 changed file with 12 additions and 7 deletions.
19 changes: 12 additions & 7 deletions fs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1616,11 +1616,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb)
percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_);
}

static void sb_freeze_unlock(struct super_block *sb)
static void sb_freeze_unlock(struct super_block *sb, int level)
{
int level;

for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--)
for (level--; level >= 0; level--)
percpu_up_write(sb->s_writers.rw_sem + level);
}

Expand Down Expand Up @@ -1691,7 +1689,14 @@ int freeze_super(struct super_block *sb)
sb_wait_write(sb, SB_FREEZE_PAGEFAULT);

/* All writers are done so after syncing there won't be dirty data */
sync_filesystem(sb);
ret = sync_filesystem(sb);
if (ret) {
sb->s_writers.frozen = SB_UNFROZEN;
sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT);
wake_up(&sb->s_writers.wait_unfrozen);
deactivate_locked_super(sb);
return ret;
}

/* Now wait for internal filesystem counter */
sb->s_writers.frozen = SB_FREEZE_FS;
Expand All @@ -1703,7 +1708,7 @@ int freeze_super(struct super_block *sb)
printk(KERN_ERR
"VFS:Filesystem freeze failed\n");
sb->s_writers.frozen = SB_UNFROZEN;
sb_freeze_unlock(sb);
sb_freeze_unlock(sb, SB_FREEZE_FS);
wake_up(&sb->s_writers.wait_unfrozen);
deactivate_locked_super(sb);
return ret;
Expand Down Expand Up @@ -1748,7 +1753,7 @@ static int thaw_super_locked(struct super_block *sb)
}

sb->s_writers.frozen = SB_UNFROZEN;
sb_freeze_unlock(sb);
sb_freeze_unlock(sb, SB_FREEZE_FS);
out:
wake_up(&sb->s_writers.wait_unfrozen);
deactivate_locked_super(sb);
Expand Down

0 comments on commit 2719c71

Please sign in to comment.