From 1bee63ac33e4ddfcc7f443d9b8f507d49cab4948 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Mon, 12 May 2025 15:17:37 +0200 Subject: [PATCH] xfs_mdrestore: don't allow restoring onto zoned block devices The way mdrestore works is not very amendable to zone devices. The code that checks the device size tries to write to the highest offset, which doesn't match the write pointer of a clean zone device. And while that is relatively easily fixable, the metadata for each RTG records the highest written offset, and the mount code compares that to the hardware write pointer, which will mismatch. This could be fixed by using write zeroes to pad the RTG until the expected write pointer, but this turns the quick metadata operation that mdrestore is supposed to be into something that could take hours on HDD. So instead error out when someone tries to mdrestore onto a zoned device to clearly document that this won't work. Doing a mdrestore into a file still works perfectly fine, and we might look into a new mdrestore option to restore into a set of files suitable for the zoned loop device driver to make mdrestore fully usable for debugging. Signed-off-by: Christoph Hellwig Reviewed-by: "Darrick J. Wong" --- mdrestore/xfs_mdrestore.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 95b01a99..f10c4bef 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -8,6 +8,7 @@ #include "xfs_metadump.h" #include #include "libfrog/div64.h" +#include union mdrestore_headers { __be32 magic; @@ -148,6 +149,13 @@ open_device( dev->fd = open(path, open_flags, 0644); if (dev->fd < 0) fatal("couldn't open \"%s\"\n", path); + + if (!dev->is_file) { + uint32_t zone_size; + + if (ioctl(dev->fd, BLKGETZONESZ, &zone_size) == 0 && zone_size) + fatal("can't restore to zoned device \"%s\"\n", path); + } } static void -- 2.47.3