]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: pass the inode cluster offset when copying inodes
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 8 Sep 2016 00:22:28 +0000 (10:22 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 8 Sep 2016 00:22:28 +0000 (10:22 +1000)
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 <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/metadump.c

index e82b660c70a0b3eedfb61ffe216870795af912db..c7699586ffc5ba72452e9a35cc44ed94b7e7599c 100644 (file)
@@ -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++;