mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-14 06:24:53 +08:00
xfs: add xfs_remount_ro() helper
Factor the remount read only code into a helper to simplify the subsequent change from the super block method .remount_fs to the mount-api fs_context_operations method .reconfigure. Signed-off-by: Ian Kent <raven@themaw.net> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
82332b6da2
commit
2c6eba3177
@ -1246,6 +1246,47 @@ xfs_remount_rw(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
xfs_remount_ro(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
int error;
|
||||
|
||||
/*
|
||||
* Cancel background eofb scanning so it cannot race with the final
|
||||
* log force+buftarg wait and deadlock the remount.
|
||||
*/
|
||||
xfs_stop_block_reaping(mp);
|
||||
|
||||
/* Get rid of any leftover CoW reservations... */
|
||||
error = xfs_icache_free_cowblocks(mp, NULL);
|
||||
if (error) {
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Free the per-AG metadata reservation pool. */
|
||||
error = xfs_fs_unreserve_ag_blocks(mp);
|
||||
if (error) {
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Before we sync the metadata, we need to free up the reserve block
|
||||
* pool so that the used block count in the superblock on disk is
|
||||
* correct at the end of the remount. Stash the current* reserve pool
|
||||
* size so that if we get remounted rw, we can return it to the same
|
||||
* size.
|
||||
*/
|
||||
xfs_save_resvblks(mp);
|
||||
|
||||
xfs_quiesce_attr(mp);
|
||||
mp->m_flags |= XFS_MOUNT_RDONLY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_fs_remount(
|
||||
struct super_block *sb,
|
||||
@ -1316,37 +1357,9 @@ xfs_fs_remount(
|
||||
|
||||
/* rw -> ro */
|
||||
if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (*flags & SB_RDONLY)) {
|
||||
/*
|
||||
* Cancel background eofb scanning so it cannot race with the
|
||||
* final log force+buftarg wait and deadlock the remount.
|
||||
*/
|
||||
xfs_stop_block_reaping(mp);
|
||||
|
||||
/* Get rid of any leftover CoW reservations... */
|
||||
error = xfs_icache_free_cowblocks(mp, NULL);
|
||||
if (error) {
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
error = xfs_remount_ro(mp);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Free the per-AG metadata reservation pool. */
|
||||
error = xfs_fs_unreserve_ag_blocks(mp);
|
||||
if (error) {
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Before we sync the metadata, we need to free up the reserve
|
||||
* block pool so that the used block count in the superblock on
|
||||
* disk is correct at the end of the remount. Stash the current
|
||||
* reserve pool size so that if we get remounted rw, we can
|
||||
* return it to the same size.
|
||||
*/
|
||||
xfs_save_resvblks(mp);
|
||||
|
||||
xfs_quiesce_attr(mp);
|
||||
mp->m_flags |= XFS_MOUNT_RDONLY;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user