From: Darrick J. Wong Date: Thu, 8 Sep 2016 00:22:28 +0000 (+1000) Subject: xfs_db: pass the inode cluster offset when copying inodes X-Git-Tag: v4.8.0-rc1~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=752ae76b3996b329e7c4893f6231543ef4bc68a9;p=thirdparty%2Fxfsprogs-dev.git xfs_db: pass the inode cluster offset when copying inodes In copy_inode_chunk, we try to determine whether or not an inode is free as part of copying the inode records. The macros involved in testing ir_free require both the inode record and the offset of an inode within that chunk. Prior to sparse inode support, the loop index "i" was also the inode chunk offset; however, when sparse support was added, "i" became the inode offset within a cluster and "ioff" became the inode cluster offset within an inode chunk. Therefore, it is necessary to pass "ioff + i" to do the free-ness calculation correctly. This was discovered while trying to take metadumps of fs images for scrub testing. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- diff --git a/db/metadump.c b/db/metadump.c index e82b660c7..c7699586f 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -2292,7 +2292,7 @@ copy_inode_chunk( /* process_inode handles free inodes, too */ if (!process_inode(agno, agino + ioff + i, dip, - XFS_INOBT_IS_FREE_DISK(rp, i))) + XFS_INOBT_IS_FREE_DISK(rp, ioff + i))) goto pop_out; inodes_copied++;