Skip to content

Commit 7f8a44f

Browse files
author
Darrick J. Wong
committed
xfs: fix sb_spino_align checks for large fsblock sizes
For a sparse inodes filesystem, mkfs.xfs computes the values of sb_spino_align and sb_inoalignmt with the following code: int cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; if (cfg->sb_feat.crcs_enabled) cluster_size *= cfg->inodesize / XFS_DINODE_MIN_SIZE; sbp->sb_spino_align = cluster_size >> cfg->blocklog; sbp->sb_inoalignmt = XFS_INODES_PER_CHUNK * cfg->inodesize >> cfg->blocklog; On a V5 filesystem with 64k fsblocks and 512 byte inodes, this results in cluster_size = 8192 * (512 / 256) = 16384. As a result, sb_spino_align and sb_inoalignmt are both set to zero. Unfortunately, this trips the new sb_spino_align check that was just added to xfs_validate_sb_common, and the mkfs fails: # mkfs.xfs -f -b size=64k, /dev/sda meta-data=/dev/sda isize=512 agcount=4, agsize=81136 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=1 = reflink=1 bigtime=1 inobtcount=1 nrext64=1 = exchange=0 metadir=0 data = bsize=65536 blocks=324544, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=65536 ascii-ci=0, ftype=1, parent=0 log =internal log bsize=65536 blocks=5006, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=65536 blocks=0, rtextents=0 = rgcount=0 rgsize=0 extents Discarding blocks...Sparse inode alignment (0) is invalid. Metadata corruption detected at 0x560ac5a80bbe, xfs_sb block 0x0/0x200 libxfs_bwrite: write verifier failed on xfs_sb bno 0x0/0x1 mkfs.xfs: Releasing dirty buffer to free list! found dirty buffer (bulk) on free list! Sparse inode alignment (0) is invalid. Metadata corruption detected at 0x560ac5a80bbe, xfs_sb block 0x0/0x200 libxfs_bwrite: write verifier failed on xfs_sb bno 0x0/0x1 mkfs.xfs: writing AG headers failed, err=22 Prior to commit 59e43f5 this all worked fine, even if "sparse" inodes are somewhat meaningless when everything fits in a single fsblock. Adjust the checks to handle existing filesystems. Cc: <[email protected]> # v6.13-rc1 Fixes: 59e43f5 ("xfs: sb_spino_align is not verified") Signed-off-by: "Darrick J. Wong" <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]>
1 parent ca37818 commit 7f8a44f

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

fs/xfs/libxfs/xfs_sb.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -494,12 +494,13 @@ xfs_validate_sb_common(
494494
return -EINVAL;
495495
}
496496

497-
if (!sbp->sb_spino_align ||
498-
sbp->sb_spino_align > sbp->sb_inoalignmt ||
499-
(sbp->sb_inoalignmt % sbp->sb_spino_align) != 0) {
497+
if (sbp->sb_spino_align &&
498+
(sbp->sb_spino_align > sbp->sb_inoalignmt ||
499+
(sbp->sb_inoalignmt % sbp->sb_spino_align) != 0)) {
500500
xfs_warn(mp,
501-
"Sparse inode alignment (%u) is invalid.",
502-
sbp->sb_spino_align);
501+
"Sparse inode alignment (%u) is invalid, must be integer factor of (%u).",
502+
sbp->sb_spino_align,
503+
sbp->sb_inoalignmt);
503504
return -EINVAL;
504505
}
505506
} else if (sbp->sb_spino_align) {

0 commit comments

Comments
 (0)