aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandan Babu R <chandan.babu@oracle.com>2023-11-06 18:40:44 +0530
committerCarlos Maiolino <cem@kernel.org>2023-11-21 14:09:36 +0100
commit11926582821406a17e853f8bac7073a5fd0461e3 (patch)
tree07a98513188e40c8024d76aaa2beac843208b311
parentead0662803cb98d441b4eb9e2bfc4c4875cf92ef (diff)
downloadxfsprogs-dev-11926582821406a17e853f8bac7073a5fd0461e3.tar.gz
metadump: Define metadump ops for v2 format
This commit adds functionality to dump metadata from an XFS filesystem in newly introduced v2 format. Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandan.babu@oracle.com> Signed-off-by: Carlos Maiolino <cem@kernel.org>
-rw-r--r--db/metadump.c74
1 files changed, 71 insertions, 3 deletions
diff --git a/db/metadump.c b/db/metadump.c
index bc203893c6..81023cf178 100644
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -2737,6 +2737,70 @@ static struct metadump_ops metadump1_ops = {
};
static int
+init_metadump_v2(void)
+{
+ struct xfs_metadump_header xmh = {0};
+ uint32_t compat_flags = 0;
+
+ xmh.xmh_magic = cpu_to_be32(XFS_MD_MAGIC_V2);
+ xmh.xmh_version = cpu_to_be32(2);
+
+ if (metadump.obfuscate)
+ compat_flags |= XFS_MD2_COMPAT_OBFUSCATED;
+ if (!metadump.zero_stale_data)
+ compat_flags |= XFS_MD2_COMPAT_FULLBLOCKS;
+ if (metadump.dirty_log)
+ compat_flags |= XFS_MD2_COMPAT_DIRTYLOG;
+
+ xmh.xmh_compat_flags = cpu_to_be32(compat_flags);
+
+ if (fwrite(&xmh, sizeof(xmh), 1, metadump.outf) != 1) {
+ print_warning("error writing to target file");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+write_metadump_v2(
+ enum typnm type,
+ const char *data,
+ xfs_daddr_t off,
+ int len)
+{
+ struct xfs_meta_extent xme;
+ uint64_t addr;
+
+ addr = off;
+ if (type == TYP_LOG &&
+ mp->m_logdev_targp->bt_bdev != mp->m_ddev_targp->bt_bdev)
+ addr |= XME_ADDR_LOG_DEVICE;
+ else
+ addr |= XME_ADDR_DATA_DEVICE;
+
+ xme.xme_addr = cpu_to_be64(addr);
+ xme.xme_len = cpu_to_be32(len);
+
+ if (fwrite(&xme, sizeof(xme), 1, metadump.outf) != 1) {
+ print_warning("error writing to target file");
+ return -EIO;
+ }
+
+ if (fwrite(data, len << BBSHIFT, 1, metadump.outf) != 1) {
+ print_warning("error writing to target file");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static struct metadump_ops metadump2_ops = {
+ .init = init_metadump_v2,
+ .write = write_metadump_v2,
+};
+
+static int
metadump_f(
int argc,
char **argv)
@@ -2872,7 +2936,10 @@ metadump_f(
}
}
- metadump.mdops = &metadump1_ops;
+ if (metadump.version == 1)
+ metadump.mdops = &metadump1_ops;
+ else
+ metadump.mdops = &metadump2_ops;
ret = metadump.mdops->init();
if (ret)
@@ -2896,7 +2963,7 @@ metadump_f(
exitcode = !copy_log();
/* write the remaining index */
- if (!exitcode)
+ if (!exitcode && metadump.mdops->finish_dump)
exitcode = metadump.mdops->finish_dump() < 0;
if (metadump.progress_since_warning)
@@ -2916,7 +2983,8 @@ metadump_f(
while (iocur_sp > start_iocur_sp)
pop_cur();
- metadump.mdops->release();
+ if (metadump.mdops->release)
+ metadump.mdops->release();
out:
return 0;