xfs: add xfs_remount_rw() helper
authorIan Kent <raven@themaw.net>
Mon, 4 Nov 2019 21:58:42 +0000 (13:58 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 5 Nov 2019 16:28:25 +0000 (08:28 -0800)
Factor the remount read write 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 6d908b7..6eaa1b0 100644 (file)
@@ -1184,6 +1184,68 @@ xfs_test_remount_options(
        return error;
 }
 
+static int
+xfs_remount_rw(
+       struct xfs_mount        *mp)
+{
+       struct xfs_sb           *sbp = &mp->m_sb;
+       int error;
+
+       if (mp->m_flags & XFS_MOUNT_NORECOVERY) {
+               xfs_warn(mp,
+                       "ro->rw transition prohibited on norecovery mount");
+               return -EINVAL;
+       }
+
+       if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
+           xfs_sb_has_ro_compat_feature(sbp, XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) {
+               xfs_warn(mp,
+       "ro->rw transition prohibited on unknown (0x%x) ro-compat filesystem",
+                       (sbp->sb_features_ro_compat &
+                               XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
+               return -EINVAL;
+       }
+
+       mp->m_flags &= ~XFS_MOUNT_RDONLY;
+
+       /*
+        * If this is the first remount to writeable state we might have some
+        * superblock changes to update.
+        */
+       if (mp->m_update_sb) {
+               error = xfs_sync_sb(mp, false);
+               if (error) {
+                       xfs_warn(mp, "failed to write sb changes");
+                       return error;
+               }
+               mp->m_update_sb = false;
+       }
+
+       /*
+        * Fill out the reserve pool if it is empty. Use the stashed value if
+        * it is non-zero, otherwise go with the default.
+        */
+       xfs_restore_resvblks(mp);
+       xfs_log_work_queue(mp);
+
+       /* Recover any CoW blocks that never got remapped. */
+       error = xfs_reflink_recover_cow(mp);
+       if (error) {
+               xfs_err(mp,
+                       "Error %d recovering leftover CoW allocations.", error);
+                       xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
+               return error;
+       }
+       xfs_start_block_reaping(mp);
+
+       /* Create the per-AG metadata reservation pool .*/
+       error = xfs_fs_reserve_ag_blocks(mp);
+       if (error && error != -ENOSPC)
+               return error;
+
+       return 0;
+}
+
 STATIC int
 xfs_fs_remount(
        struct super_block      *sb,
@@ -1247,57 +1309,8 @@ xfs_fs_remount(
 
        /* ro -> rw */
        if ((mp->m_flags & XFS_MOUNT_RDONLY) && !(*flags & SB_RDONLY)) {
-               if (mp->m_flags & XFS_MOUNT_NORECOVERY) {
-                       xfs_warn(mp,
-               "ro->rw transition prohibited on norecovery mount");
-                       return -EINVAL;
-               }
-
-               if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
-                   xfs_sb_has_ro_compat_feature(sbp,
-                                       XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) {
-                       xfs_warn(mp,
-"ro->rw transition prohibited on unknown (0x%x) ro-compat filesystem",
-                               (sbp->sb_features_ro_compat &
-                                       XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
-                       return -EINVAL;
-               }
-
-               mp->m_flags &= ~XFS_MOUNT_RDONLY;
-
-               /*
-                * If this is the first remount to writeable state we
-                * might have some superblock changes to update.
-                */
-               if (mp->m_update_sb) {
-                       error = xfs_sync_sb(mp, false);
-                       if (error) {
-                               xfs_warn(mp, "failed to write sb changes");
-                               return error;
-                       }
-                       mp->m_update_sb = false;
-               }
-
-               /*
-                * Fill out the reserve pool if it is empty. Use the stashed
-                * value if it is non-zero, otherwise go with the default.
-                */
-               xfs_restore_resvblks(mp);
-               xfs_log_work_queue(mp);
-
-               /* Recover any CoW blocks that never got remapped. */
-               error = xfs_reflink_recover_cow(mp);
-               if (error) {
-                       xfs_err(mp,
-       "Error %d recovering leftover CoW allocations.", error);
-                       xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
-                       return error;
-               }
-               xfs_start_block_reaping(mp);
-
-               /* Create the per-AG metadata reservation pool .*/
-               error = xfs_fs_reserve_ag_blocks(mp);
-               if (error && error != -ENOSPC)
+               error = xfs_remount_rw(mp);
+               if (error)
                        return error;
        }