]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blobdiff - db/metadump.c
metadump: Add initialization and release functions
[thirdparty/xfsprogs-dev.git] / db / metadump.c
index da91000c7ab9efebed07c1919f5f676ad64fe858..8d921500d88418b6b550e3aa23d6ff0be440075f 100644 (file)
@@ -2665,6 +2665,54 @@ done:
        return !write_buf(iocur_top);
 }
 
+static int
+init_metadump(void)
+{
+       metadump.metablock = (xfs_metablock_t *)calloc(BBSIZE + 1, BBSIZE);
+       if (metadump.metablock == NULL) {
+               print_warning("memory allocation failure");
+               return -1;
+       }
+       metadump.metablock->mb_blocklog = BBSHIFT;
+       metadump.metablock->mb_magic = cpu_to_be32(XFS_MD_MAGIC);
+
+       /* Set flags about state of metadump */
+       metadump.metablock->mb_info = XFS_METADUMP_INFO_FLAGS;
+       if (metadump.obfuscate)
+               metadump.metablock->mb_info |= XFS_METADUMP_OBFUSCATED;
+       if (!metadump.zero_stale_data)
+               metadump.metablock->mb_info |= XFS_METADUMP_FULLBLOCKS;
+       if (metadump.dirty_log)
+               metadump.metablock->mb_info |= XFS_METADUMP_DIRTYLOG;
+
+       metadump.block_index = (__be64 *)((char *)metadump.metablock +
+                               sizeof(xfs_metablock_t));
+       metadump.block_buffer = (char *)(metadump.metablock) + BBSIZE;
+       metadump.num_indices = (BBSIZE - sizeof(xfs_metablock_t)) / sizeof(__be64);
+
+       /*
+        * A metadump block can hold at most num_indices of BBSIZE sectors;
+        * do not try to dump a filesystem with a sector size which does not
+        * fit within num_indices (i.e. within a single metablock).
+        */
+       if (mp->m_sb.sb_sectsize > metadump.num_indices * BBSIZE) {
+               print_warning("Cannot dump filesystem with sector size %u",
+                             mp->m_sb.sb_sectsize);
+               free(metadump.metablock);
+               return -1;
+       }
+
+       metadump.cur_index = 0;
+
+       return 0;
+}
+
+static void
+release_metadump(void)
+{
+       free(metadump.metablock);
+}
+
 static int
 metadump_f(
        int             argc,
@@ -2757,48 +2805,16 @@ metadump_f(
                pop_cur();
        }
 
-       metadump.metablock = (xfs_metablock_t *)calloc(BBSIZE + 1, BBSIZE);
-       if (metadump.metablock == NULL) {
-               print_warning("memory allocation failure");
-               return -1;
-       }
-       metadump.metablock->mb_blocklog = BBSHIFT;
-       metadump.metablock->mb_magic = cpu_to_be32(XFS_MD_MAGIC);
-
-       /* Set flags about state of metadump */
-       metadump.metablock->mb_info = XFS_METADUMP_INFO_FLAGS;
-       if (metadump.obfuscate)
-               metadump.metablock->mb_info |= XFS_METADUMP_OBFUSCATED;
-       if (!metadump.zero_stale_data)
-               metadump.metablock->mb_info |= XFS_METADUMP_FULLBLOCKS;
-       if (metadump.dirty_log)
-               metadump.metablock->mb_info |= XFS_METADUMP_DIRTYLOG;
-
-       metadump.block_index = (__be64 *)((char *)metadump.metablock +
-                                       sizeof(xfs_metablock_t));
-       metadump.block_buffer = (char *)metadump.metablock + BBSIZE;
-       metadump.num_indices = (BBSIZE - sizeof(xfs_metablock_t)) /
-               sizeof(__be64);
-
-       /*
-        * A metadump block can hold at most num_indices of BBSIZE sectors;
-        * do not try to dump a filesystem with a sector size which does not
-        * fit within num_indices (i.e. within a single metablock).
-        */
-       if (mp->m_sb.sb_sectsize > metadump.num_indices * BBSIZE) {
-               print_warning("Cannot dump filesystem with sector size %u",
-                             mp->m_sb.sb_sectsize);
-               free(metadump.metablock);
+       ret = init_metadump();
+       if (ret)
                return 0;
-       }
 
        start_iocur_sp = iocur_sp;
 
        if (strcmp(argv[optind], "-") == 0) {
                if (isatty(fileno(stdout))) {
                        print_warning("cannot write to a terminal");
-                       free(metadump.metablock);
-                       return 0;
+                       goto out;
                }
                /*
                 * Redirect stdout to stderr for the duration of the
@@ -2875,7 +2891,7 @@ metadump_f(
        while (iocur_sp > start_iocur_sp)
                pop_cur();
 out:
-       free(metadump.metablock);
+       release_metadump();
 
        return 0;
 }