@@ -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;
}