@@ -131,6 +131,40 @@ zero_log(
libxfs_max_lsn = log->l_last_sync_lsn;
}
+/* Perform the user's requested upgrades on filesystem. */
+static void
+upgrade_filesystem(
+ struct xfs_mount *mp)
+{
+ struct xfs_buf *bp;
+ bool dirty = false;
+ int error;
+
+ if (no_modify || !dirty)
+ return;
+
+ bp = libxfs_getsb(mp);
+ if (!bp || bp->b_error) {
+ do_error(
+ _("couldn't get superblock for feature upgrade, err=%d\n"),
+ bp ? bp->b_error : ENOMEM);
+ } else {
+ libxfs_sb_to_disk(bp->b_addr, &mp->m_sb);
+
+ /*
+ * Write the primary super to disk immediately so that
+ * needsrepair will be set if repair doesn't complete.
+ */
+ error = -libxfs_bwrite(bp);
+ if (error)
+ do_error(
+ _("filesystem feature upgrade failed, err=%d\n"),
+ error);
+ }
+ if (bp)
+ libxfs_buf_relse(bp);
+}
+
/*
* ok, at this point, the fs is mounted but the root inode may be
* trashed and the ag headers haven't been checked. So we have
@@ -235,4 +269,10 @@ phase2(
do_warn(_("would correct\n"));
}
}
+
+ /*
+ * Upgrade the filesystem now that we've done a preliminary check of
+ * the superblocks, the AGs, the log, and the metadata inodes.
+ */
+ upgrade_filesystem(mp);
}