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,
 
        /* 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;
        }