xfs: define a new "needrepair" feature
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 24 Nov 2020 19:45:55 +0000 (11:45 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 9 Dec 2020 17:48:13 +0000 (09:48 -0800)
Define an incompat feature flag to indicate that the filesystem needs to
be repaired.  While libxfs will recognize this feature, the kernel will
refuse to mount if the feature flag is set, and only xfs_repair will be
able to clear the flag.  The goal here is to force the admin to run
xfs_repair to completion after upgrading the filesystem, or if we
otherwise detect anomalies.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
fs/xfs/libxfs/xfs_format.h
fs/xfs/xfs_super.c

index dd764da08f6fcc1d4379ef7263f859bd2a7e3be2..5d8ba609ac0bc5cb582f32101d61e51f7d1b71e5 100644 (file)
@@ -468,6 +468,7 @@ xfs_sb_has_ro_compat_feature(
 #define XFS_SB_FEAT_INCOMPAT_SPINODES  (1 << 1)        /* sparse inode chunks */
 #define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2)        /* metadata UUID */
 #define XFS_SB_FEAT_INCOMPAT_BIGTIME   (1 << 3)        /* large timestamps */
+#define XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR (1 << 4)      /* needs xfs_repair */
 #define XFS_SB_FEAT_INCOMPAT_ALL \
                (XFS_SB_FEAT_INCOMPAT_FTYPE|    \
                 XFS_SB_FEAT_INCOMPAT_SPINODES| \
@@ -584,6 +585,12 @@ static inline bool xfs_sb_version_hasinobtcounts(struct xfs_sb *sbp)
                (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_INOBTCNT);
 }
 
+static inline bool xfs_sb_version_needsrepair(struct xfs_sb *sbp)
+{
+       return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
+               (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR);
+}
+
 /*
  * end of superblock version macros
  */
index 599566c1a3b41d37beb4d699b33cdd6c2d59e24b..36002f460d7cd0ebda15bf779671938b71dffd67 100644 (file)
@@ -1467,6 +1467,13 @@ xfs_fc_fill_super(
 #endif
        }
 
+       /* Filesystem claims it needs repair, so refuse the mount. */
+       if (xfs_sb_version_needsrepair(&mp->m_sb)) {
+               xfs_warn(mp, "Filesystem needs repair.  Please run xfs_repair.");
+               error = -EFSCORRUPTED;
+               goto out_free_sb;
+       }
+
        /*
         * Don't touch the filesystem if a user tool thinks it owns the primary
         * superblock.  mkfs doesn't clear the flag from secondary supers, so