@@ -153,59 +153,6 @@ print_progress(const char *fmt, ...)
metadump.progress_since_warning = true;
}
-/*
- * A complete dump file will have a "zero" entry in the last index block,
- * even if the dump is exactly aligned, the last index will be full of
- * zeros. If the last index entry is non-zero, the dump is incomplete.
- * Correspondingly, the last chunk will have a count < num_indices.
- *
- * Return 0 for success, -1 for failure.
- */
-
-static int
-write_index(void)
-{
- struct xfs_metablock *metablock = metadump.metablock;
- /*
- * write index block and following data blocks (streaming)
- */
- metablock->mb_count = cpu_to_be16(metadump.cur_index);
- if (fwrite(metablock, (metadump.cur_index + 1) << BBSHIFT, 1,
- metadump.outf) != 1) {
- print_warning("error writing to target file");
- return -1;
- }
-
- memset(metadump.block_index, 0, metadump.num_indices * sizeof(__be64));
- metadump.cur_index = 0;
- return 0;
-}
-
-/*
- * Return 0 for success, -errno for failure.
- */
-static int
-write_buf_segment(
- char *data,
- int64_t off,
- int len)
-{
- int i;
- int ret;
-
- for (i = 0; i < len; i++, off++, data += BBSIZE) {
- metadump.block_index[metadump.cur_index] = cpu_to_be64(off);
- memcpy(&metadump.block_buffer[metadump.cur_index << BBSHIFT],
- data, BBSIZE);
- if (++metadump.cur_index == metadump.num_indices) {
- ret = write_index();
- if (ret)
- return -EIO;
- }
- }
- return 0;
-}
-
/*
* we want to preserve the state of the metadata in the dump - whether it is
* intact or corrupt, so even if the buffer has a verifier attached to it we
@@ -242,15 +189,17 @@ write_buf(
/* handle discontiguous buffers */
if (!buf->bbmap) {
- ret = write_buf_segment(buf->data, buf->bb, buf->blen);
+ ret = metadump.mdops->write(buf->typ->typnm, buf->data, buf->bb,
+ buf->blen);
if (ret)
return ret;
} else {
int len = 0;
for (i = 0; i < buf->bbmap->nmaps; i++) {
- ret = write_buf_segment(buf->data + BBTOB(len),
- buf->bbmap->b[i].bm_bn,
- buf->bbmap->b[i].bm_len);
+ ret = metadump.mdops->write(buf->typ->typnm,
+ buf->data + BBTOB(len),
+ buf->bbmap->b[i].bm_bn,
+ buf->bbmap->b[i].bm_len);
if (ret)
return ret;
len += buf->bbmap->b[i].bm_len;
@@ -2691,7 +2640,7 @@ done:
}
static int
-init_metadump(void)
+init_metadump_v1(void)
{
metadump.metablock = (xfs_metablock_t *)calloc(BBSIZE + 1, BBSIZE);
if (metadump.metablock == NULL) {
@@ -2732,12 +2681,61 @@ init_metadump(void)
return 0;
}
+static int
+finish_dump_metadump_v1(void)
+{
+ /*
+ * write index block and following data blocks (streaming)
+ */
+ metadump.metablock->mb_count = cpu_to_be16(metadump.cur_index);
+ if (fwrite(metadump.metablock, (metadump.cur_index + 1) << BBSHIFT, 1,
+ metadump.outf) != 1) {
+ print_warning("error writing to target file");
+ return -1;
+ }
+
+ memset(metadump.block_index, 0, metadump.num_indices * sizeof(__be64));
+ metadump.cur_index = 0;
+ return 0;
+}
+
+static int
+write_metadump_v1(
+ enum typnm type,
+ const char *data,
+ xfs_daddr_t off,
+ int len)
+{
+ int i;
+ int ret;
+
+ for (i = 0; i < len; i++, off++, data += BBSIZE) {
+ metadump.block_index[metadump.cur_index] = cpu_to_be64(off);
+ memcpy(&metadump.block_buffer[metadump.cur_index << BBSHIFT],
+ data, BBSIZE);
+ if (++metadump.cur_index == metadump.num_indices) {
+ ret = finish_dump_metadump_v1();
+ if (ret)
+ return -EIO;
+ }
+ }
+
+ return 0;
+}
+
static void
-release_metadump(void)
+release_metadump_v1(void)
{
free(metadump.metablock);
}
+static struct metadump_ops metadump1_ops = {
+ .init = init_metadump_v1,
+ .write = write_metadump_v1,
+ .finish_dump = finish_dump_metadump_v1,
+ .release = release_metadump_v1,
+};
+
static int
metadump_f(
int argc,
@@ -2874,7 +2872,9 @@ metadump_f(
}
}
- ret = init_metadump();
+ metadump.mdops = &metadump1_ops;
+
+ ret = metadump.mdops->init();
if (ret)
goto out;
@@ -2897,7 +2897,7 @@ metadump_f(
/* write the remaining index */
if (!exitcode)
- exitcode = write_index() < 0;
+ exitcode = metadump.mdops->finish_dump() < 0;
if (metadump.progress_since_warning)
fputc('\n', metadump.stdout_metadump ? stderr : stdout);
@@ -2916,7 +2916,7 @@ metadump_f(
while (iocur_sp > start_iocur_sp)
pop_cur();
- release_metadump();
+ metadump.mdops->release();
out:
return 0;