From a872b6221db3457a0288b39e3b32b66a66ba71f6 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Mon, 3 Mar 2014 12:21:21 +1100 Subject: [PATCH] xfs_copy: band-aids for CRC filesystems xfs_copy needs a fair bit of work for CRCs because it rewrites UUIDs by default, but this change will get it working properly with the "-d" (duplicate) option which keeps the same UUID. Accept the the CRC magic valid, change the ASSERT() to an error message and exit more gracefully, and don't even get started if we don't have the '-d' option. Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- copy/xfs_copy.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 9986fbf60..9f2f99dcb 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -684,6 +684,16 @@ main(int argc, char **argv) sb = &mbuf.m_sb; libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); + /* + * For now, V5 superblock filesystems are not supported without -d; + * we do not have the infrastructure yet to fix CRCs when a new UUID + * is generated. + */ + if (xfs_sb_version_hascrc(sb) && !duplicate) { + do_log(_("%s: Cannot yet copy V5 fs without '-d'\n"), progname); + exit(1); + } + mp = libxfs_mount(&mbuf, sb, xargs.ddev, xargs.logdev, xargs.rtdev, 0); if (mp == NULL) { do_log(_("%s: %s filesystem failed to initialize\n" @@ -957,7 +967,13 @@ main(int argc, char **argv) ((char *)btree_buf.data + pos - btree_buf.position); - ASSERT(be32_to_cpu(block->bb_magic) == XFS_ABTB_MAGIC); + if (be32_to_cpu(block->bb_magic) != + (xfs_sb_version_hascrc(&mp->m_sb) ? + XFS_ABTB_CRC_MAGIC : XFS_ABTB_MAGIC)) { + do_log(_("Bad btree magic 0x%x\n"), + be32_to_cpu(block->bb_magic)); + exit(1); + } if (be16_to_cpu(block->bb_level) == 0) break; -- 2.47.2