]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mdrestore: Replace metadump header pointer argument with a union pointer
authorChandan Babu R <chandanbabu@kernel.org>
Mon, 6 Nov 2023 13:10:50 +0000 (18:40 +0530)
committerCarlos Maiolino <cem@kernel.org>
Tue, 21 Nov 2023 13:09:36 +0000 (14:09 +0100)
We will need two variants of read_header(), show_info() and restore() helper
functions to support two versions of metadump formats. To this end, A future
commit will introduce a vector of function pointers to work with the two
metadump formats. To have a common function signature for the function
pointers, this commit replaces the first argument of the previously listed
function pointers from "struct xfs_metablock *" with "union
mdrestore_headers *".

Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
mdrestore/xfs_mdrestore.c

index d67a06298f923c0f4a8da7af8408c16183cf434f..40de0d1e3ac5bc5c76d2e43dd13732e132e1f3f7 100644 (file)
@@ -8,6 +8,11 @@
 #include "xfs_metadump.h"
 #include <libfrog/platform.h>
 
+union mdrestore_headers {
+       __be32                  magic;
+       struct xfs_metablock    v1;
+};
+
 static struct mdrestore {
        bool    show_progress;
        bool    show_info;
@@ -78,27 +83,25 @@ open_device(
 
 static void
 read_header(
-       struct xfs_metablock    *mb,
+       union mdrestore_headers *h,
        FILE                    *md_fp)
 {
-       mb->mb_magic = cpu_to_be32(XFS_MD_MAGIC_V1);
-
-       if (fread((uint8_t *)mb + sizeof(mb->mb_magic),
-                       sizeof(*mb) - sizeof(mb->mb_magic), 1, md_fp) != 1)
+       if (fread((uint8_t *)&(h->v1.mb_count),
+                       sizeof(h->v1) - sizeof(h->magic), 1, md_fp) != 1)
                fatal("error reading from metadump file\n");
 }
 
 static void
 show_info(
-       struct xfs_metablock    *mb,
+       union mdrestore_headers *h,
        const char              *md_file)
 {
-       if (mb->mb_info & XFS_METADUMP_INFO_FLAGS) {
+       if (h->v1.mb_info & XFS_METADUMP_INFO_FLAGS) {
                printf("%s: %sobfuscated, %s log, %s metadata blocks\n",
                        md_file,
-                       mb->mb_info & XFS_METADUMP_OBFUSCATED ? "":"not ",
-                       mb->mb_info & XFS_METADUMP_DIRTYLOG ? "dirty":"clean",
-                       mb->mb_info & XFS_METADUMP_FULLBLOCKS ? "full":"zeroed");
+                       h->v1.mb_info & XFS_METADUMP_OBFUSCATED ? "":"not ",
+                       h->v1.mb_info & XFS_METADUMP_DIRTYLOG ? "dirty":"clean",
+                       h->v1.mb_info & XFS_METADUMP_FULLBLOCKS ? "full":"zeroed");
        } else {
                printf("%s: no informational flags present\n", md_file);
        }
@@ -116,10 +119,10 @@ show_info(
  */
 static void
 restore(
+       union mdrestore_headers *h,
        FILE                    *md_fp,
        int                     ddev_fd,
-       int                     is_target_file,
-       const struct xfs_metablock      *mbp)
+       int                     is_target_file)
 {
        struct xfs_metablock    *metablock;     /* header + index + blocks */
        __be64                  *block_index;
@@ -131,14 +134,14 @@ restore(
        xfs_sb_t                sb;
        int64_t                 bytes_read;
 
-       block_size = 1 << mbp->mb_blocklog;
+       block_size = 1 << h->v1.mb_blocklog;
        max_indices = (block_size - sizeof(xfs_metablock_t)) / sizeof(__be64);
 
        metablock = (xfs_metablock_t *)calloc(max_indices + 1, block_size);
        if (metablock == NULL)
                fatal("memory allocation failure\n");
 
-       mb_count = be16_to_cpu(mbp->mb_count);
+       mb_count = be16_to_cpu(h->v1.mb_count);
        if (mb_count == 0 || mb_count > max_indices)
                fatal("bad block count: %u\n", mb_count);
 
@@ -152,8 +155,7 @@ restore(
        if (block_index[0] != 0)
                fatal("first block is not the primary superblock\n");
 
-
-       if (fread(block_buffer, mb_count << mbp->mb_blocklog, 1, md_fp) != 1)
+       if (fread(block_buffer, mb_count << h->v1.mb_blocklog, 1, md_fp) != 1)
                fatal("error reading from metadump file\n");
 
        libxfs_sb_from_disk(&sb, (struct xfs_dsb *)block_buffer);
@@ -200,7 +202,7 @@ restore(
 
                for (cur_index = 0; cur_index < mb_count; cur_index++) {
                        if (pwrite(ddev_fd, &block_buffer[cur_index <<
-                                       mbp->mb_blocklog], block_size,
+                                       h->v1.mb_blocklog], block_size,
                                        be64_to_cpu(block_index[cur_index]) <<
                                                BBSHIFT) < 0)
                                fatal("error writing block %llu: %s\n",
@@ -219,11 +221,11 @@ restore(
                if (mb_count > max_indices)
                        fatal("bad block count: %u\n", mb_count);
 
-               if (fread(block_buffer, mb_count << mbp->mb_blocklog,
+               if (fread(block_buffer, mb_count << h->v1.mb_blocklog,
                                1, md_fp) != 1)
                        fatal("error reading from metadump file\n");
 
-               bytes_read += block_size + (mb_count << mbp->mb_blocklog);
+               bytes_read += block_size + (mb_count << h->v1.mb_blocklog);
        }
 
        if (mdrestore.progress_since_warning)
@@ -252,15 +254,14 @@ usage(void)
 
 int
 main(
-       int             argc,
-       char            **argv)
+       int                     argc,
+       char                    **argv)
 {
-       FILE            *src_f;
-       int             dst_fd;
-       int             c;
-       bool            is_target_file;
-       uint32_t        magic;
-       struct xfs_metablock    mb;
+       union mdrestore_headers headers;
+       FILE                    *src_f;
+       int                     dst_fd;
+       int                     c;
+       bool                    is_target_file;
 
        mdrestore.show_progress = false;
        mdrestore.show_info = false;
@@ -307,20 +308,21 @@ main(
                        fatal("cannot open source dump file\n");
        }
 
-       if (fread(&magic, sizeof(magic), 1, src_f) != 1)
+       if (fread(&headers.magic, sizeof(headers.magic), 1, src_f) != 1)
                fatal("Unable to read metadump magic from metadump file\n");
 
-       switch (be32_to_cpu(magic)) {
+       switch (be32_to_cpu(headers.magic)) {
        case XFS_MD_MAGIC_V1:
-               read_header(&mb, src_f);
                break;
        default:
                fatal("specified file is not a metadata dump\n");
                break;
        }
 
+       read_header(&headers, src_f);
+
        if (mdrestore.show_info) {
-               show_info(&mb, argv[optind]);
+               show_info(&headers, argv[optind]);
 
                if (argc - optind == 1)
                        exit(0);
@@ -331,7 +333,7 @@ main(
        /* check and open target */
        dst_fd = open_device(argv[optind], &is_target_file);
 
-       restore(src_f, dst_fd, is_target_file, &mb);
+       restore(&headers, src_f, dst_fd, is_target_file);
 
        close(dst_fd);
        if (src_f != stdin)