From: Darrick J. Wong Date: Mon, 24 Feb 2025 18:21:58 +0000 (-0800) Subject: xfs_db: don't abort when bmapping on a non-extents/bmbt fork X-Git-Tag: v6.14.0~83 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=37ebf93592e9607c6d64f3afe2f02d14b6edcd2a;p=thirdparty%2Fxfsprogs-dev.git xfs_db: don't abort when bmapping on a non-extents/bmbt fork We're going to introduce new fork formats, so let's fix the problem that xfs_db's bmap command aborts when the fork format isn't one of the existing ones. Signed-off-by: "Darrick J. Wong" Reviewed-by: Christoph Hellwig --- diff --git a/db/bmap.c b/db/bmap.c index 1c5694c3..e8dd98d6 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -65,16 +65,18 @@ bmap( fmt = (enum xfs_dinode_fmt)XFS_DFORK_FORMAT(dip, whichfork); typ = whichfork == XFS_DATA_FORK ? TYP_BMAPBTD : TYP_BMAPBTA; ASSERT(typtab[typ].typnm == typ); - ASSERT(fmt == XFS_DINODE_FMT_LOCAL || fmt == XFS_DINODE_FMT_EXTENTS || - fmt == XFS_DINODE_FMT_BTREE); - if (fmt == XFS_DINODE_FMT_EXTENTS) { + switch (fmt) { + case XFS_DINODE_FMT_LOCAL: + break; + case XFS_DINODE_FMT_EXTENTS: nextents = xfs_dfork_nextents(dip, whichfork); xp = (xfs_bmbt_rec_t *)XFS_DFORK_PTR(dip, whichfork); for (ep = xp; ep < &xp[nextents] && n < nex; ep++) { if (!bmap_one_extent(ep, &curoffset, eoffset, &n, bep)) break; } - } else if (fmt == XFS_DINODE_FMT_BTREE) { + break; + case XFS_DINODE_FMT_BTREE: push_cur(); rblock = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); fsize = XFS_DFORK_SIZE(dip, mp, whichfork); @@ -114,6 +116,13 @@ bmap( block = (struct xfs_btree_block *)iocur_top->data; } pop_cur(); + break; + default: + dbprintf( + _("%s fork format %u does not support indexable blocks\n"), + whichfork == XFS_DATA_FORK ? "data" : "attr", + fmt); + break; } pop_cur(); *nexp = n;