|
@@ -588,6 +588,11 @@ xfs_sb_verify(
|
|
|
* single bit error could clear the feature bit and unused parts of the
|
|
|
* superblock are supposed to be zero. Hence a non-null crc field indicates that
|
|
|
* we've potentially lost a feature bit and we should check it anyway.
|
|
|
+ *
|
|
|
+ * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the
|
|
|
+ * last field in V4 secondary superblocks. So for secondary superblocks,
|
|
|
+ * we are more forgiving, and ignore CRC failures if the primary doesn't
|
|
|
+ * indicate that the fs version is V5.
|
|
|
*/
|
|
|
static void
|
|
|
xfs_sb_read_verify(
|
|
@@ -608,8 +613,12 @@ xfs_sb_read_verify(
|
|
|
|
|
|
if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize),
|
|
|
offsetof(struct xfs_sb, sb_crc))) {
|
|
|
- error = EFSCORRUPTED;
|
|
|
- goto out_error;
|
|
|
+ /* Only fail bad secondaries on a known V5 filesystem */
|
|
|
+ if (bp->b_bn != XFS_SB_DADDR &&
|
|
|
+ xfs_sb_version_hascrc(&mp->m_sb)) {
|
|
|
+ error = EFSCORRUPTED;
|
|
|
+ goto out_error;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
error = xfs_sb_verify(bp, true);
|