Skip to content

Commit fa4ca9c

Browse files
Dave Chinnerdjwong
authored andcommitted
xfs: catch bad stripe alignment configurations
When stripe alignments are invalid, data alignment algorithms in the allocator may not work correctly. Ensure we catch superblocks with invalid stripe alignment setups at mount time. These data alignment mismatches are now detected at mount time like this: XFS (loop0): SB stripe unit sanity check failed XFS (loop0): Metadata corruption detected at xfs_sb_read_verify+0xab/0x110, xfs_sb block 0xffffffffffffffff XFS (loop0): Unmount and run xfs_repair XFS (loop0): First 128 bytes of corrupted metadata buffer: 0000000091c2de02: 58 46 53 42 00 00 10 00 00 00 00 00 00 00 10 00 XFSB............ 0000000023bff869: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000000cdd8c893: 17 32 37 15 ff ca 46 3d 9a 17 d3 33 04 b5 f1 a2 .27...F=...3.... 000000009fd2844f: 00 00 00 00 00 00 00 04 00 00 00 00 00 00 06 d0 ................ 0000000088e9b0bb: 00 00 00 00 00 00 06 d1 00 00 00 00 00 00 06 d2 ................ 00000000ff233a20: 00 00 00 01 00 00 10 00 00 00 00 01 00 00 00 00 ................ 000000009db0ac8b: 00 00 03 60 e1 34 02 00 08 00 00 02 00 00 00 00 ...`.4.......... 00000000f7022460: 00 00 00 00 00 00 00 00 0c 09 0b 01 0c 00 00 19 ................ XFS (loop0): SB validate failed with error -117. And the mount fails. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
1 parent 117a148 commit fa4ca9c

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

fs/xfs/libxfs/xfs_sb.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,22 @@ xfs_mount_validate_sb(
278278
return -EFSCORRUPTED;
279279
}
280280

281+
if (sbp->sb_unit) {
282+
if (!xfs_sb_version_hasdalign(sbp) ||
283+
sbp->sb_unit > sbp->sb_width ||
284+
(sbp->sb_width % sbp->sb_unit) != 0) {
285+
xfs_notice(mp, "SB stripe unit sanity check failed");
286+
return -EFSCORRUPTED;
287+
}
288+
} else if (xfs_sb_version_hasdalign(sbp)) {
289+
xfs_notice(mp, "SB stripe alignment sanity check failed");
290+
return -EFSCORRUPTED;
291+
} else if (sbp->sb_width) {
292+
xfs_notice(mp, "SB stripe width sanity check failed");
293+
return -EFSCORRUPTED;
294+
}
295+
296+
281297
if (xfs_sb_version_hascrc(&mp->m_sb) &&
282298
sbp->sb_blocksize < XFS_MIN_CRC_BLOCKSIZE) {
283299
xfs_notice(mp, "v5 SB sanity check failed");

0 commit comments

Comments
 (0)