xfs: add xfs_remount_ro() helper
authorIan Kent <raven@themaw.net>
Mon, 4 Nov 2019 21:58:43 +0000 (13:58 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 5 Nov 2019 16:28:26 +0000 (08:28 -0800)
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>
fs/xfs/xfs_super.c

index 6eaa1b0..bdf6c06 100644 (file)
@@ -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);
-                       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);
+               error = xfs_remount_ro(mp);
+               if (error)
                        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;