On Wed, Jun 21, 2017 at 02:18:23PM -0500, Eric Sandeen wrote: > On 5/26/17 11:13 AM, Eric Sandeen wrote: > > After the long discussion about warning the user and/or consumer > > of xfs_metadumps about dirty logs, it crossed my mind that we > > could use the reserved slot in the metadump header to tag the > > file with attributes, so the consumer of the metadump knows how > > it was created. > > > > This patch adds 4 flags to describe the metadump: The first simply > > indicates the presence of any (or no) informational flags. > > The old mb_reserved field has been 0 on disk since inception, so > > the presence of XFS_METADUMP_INFO_FLAGS indicates that this metadump > > may contain the informational flags: > > > > - dirty log > > - obfuscated > > - full blocks (unused portions of metadata blocks > > are not zeroed out). > > > > It then adds a new option to xfs_mdrestore, "-i" to show info, > > which can be used with or without a target file: > > > > # xfs_mdrestore -i metadumpfile > > metadumpfile: not obfuscated, clean log, full metadata blocks > > > > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> > > --- > > > > V2: rename to mb_info, add the "we have flags" flag > > Ping, any thoughts on this V2? /me wonder if show_info mode ought to complain if we see an "obviously" bogus value (flags are set but XFS_METADUMP_INFO_FLAGS is clear, flags we don't know about are set) and dump the raw hex value... ...but on the other hand it's redefining a probably-zero field in a semi-ephemeral data file format to be an optional informational field, so maybe it's good enough. Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > > > diff --git a/db/metadump.c b/db/metadump.c > > index fe068ef..2f5b5b5 100644 > > --- a/db/metadump.c > > +++ b/db/metadump.c > > @@ -2820,6 +2820,28 @@ metadump_f( > > metablock->mb_blocklog = BBSHIFT; > > metablock->mb_magic = cpu_to_be32(XFS_MD_MAGIC); > > > > + /* Set flags about state of metadump */ > > + metablock->mb_info = XFS_METADUMP_INFO_FLAGS; > > + if (obfuscate) > > + metablock->mb_info |= XFS_METADUMP_OBFUSCATED; > > + if (!zero_stale_data) > > + metablock->mb_info |= XFS_METADUMP_FULLBLOCKS; > > + > > + /* If we'll copy the log, see if the log is dirty */ > > + if (mp->m_sb.sb_logstart) { > > + push_cur(); > > + set_cur(&typtab[TYP_LOG], > > + XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart), > > + mp->m_sb.sb_logblocks * blkbb, DB_RING_IGN, NULL); > > + if (iocur_top->data) { /* best effort */ > > + struct xlog log; > > + > > + if (xlog_is_dirty(mp, &log, &x, 0)) > > + metablock->mb_info |= XFS_METADUMP_DIRTYLOG; > > + } > > + pop_cur(); > > + } > > + > > block_index = (__be64 *)((char *)metablock + sizeof(xfs_metablock_t)); > > block_buffer = (char *)metablock + BBSIZE; > > num_indices = (BBSIZE - sizeof(xfs_metablock_t)) / sizeof(__be64); > > diff --git a/include/xfs_metadump.h b/include/xfs_metadump.h > > index f4be51b..7f3039e 100644 > > --- a/include/xfs_metadump.h > > +++ b/include/xfs_metadump.h > > @@ -25,8 +25,14 @@ typedef struct xfs_metablock { > > __be32 mb_magic; > > __be16 mb_count; > > __uint8_t mb_blocklog; > > - __uint8_t mb_reserved; > > + __uint8_t mb_info; > > /* followed by an array of xfs_daddr_t */ > > } xfs_metablock_t; > > > > +/* These flags are informational only, not backwards compatible */ > > +#define XFS_METADUMP_INFO_FLAGS (1 << 0) /* This image has informative flags */ > > +#define XFS_METADUMP_OBFUSCATED (1 << 1) > > +#define XFS_METADUMP_FULLBLOCKS (1 << 2) > > +#define XFS_METADUMP_DIRTYLOG (1 << 3) > > + > > #endif /* _XFS_METADUMP_H_ */ > > diff --git a/man/man8/xfs_mdrestore.8 b/man/man8/xfs_mdrestore.8 > > index 2095f15..72f3b29 100644 > > --- a/man/man8/xfs_mdrestore.8 > > +++ b/man/man8/xfs_mdrestore.8 > > @@ -4,11 +4,15 @@ xfs_mdrestore \- restores an XFS metadump image to a filesystem image > > .SH SYNOPSIS > > .B xfs_mdrestore > > [ > > -.B \-g > > +.B \-gi > > ] > > .I source > > .I target > > .br > > +.B xfs_mdrestore > > +.B \-i > > +.I source > > +.br > > .B xfs_mdrestore \-V > > .SH DESCRIPTION > > .B xfs_mdrestore > > @@ -39,6 +43,12 @@ can be destroyed. > > .B \-g > > Shows restore progress on stdout. > > .TP > > +.B \-i > > +Shows metadump information on stdout. If no > > +.I target > > +is specified, exits after displaying information. Older metadumps man not > > +include any descriptive information. > > +.TP > > .B \-V > > Prints the version number and exits. > > .SH DIAGNOSTICS > > diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c > > index 0d399f1..9d1b4e8 100644 > > --- a/mdrestore/xfs_mdrestore.c > > +++ b/mdrestore/xfs_mdrestore.c > > @@ -21,6 +21,7 @@ > > > > char *progname; > > int show_progress = 0; > > +int show_info = 0; > > int progress_since_warning = 0; > > > > static void > > @@ -213,11 +214,14 @@ main( > > > > progname = basename(argv[0]); > > > > - while ((c = getopt(argc, argv, "gV")) != EOF) { > > + while ((c = getopt(argc, argv, "giV")) != EOF) { > > switch (c) { > > case 'g': > > show_progress = 1; > > break; > > + case 'i': > > + show_info = 1; > > + break; > > case 'V': > > printf("%s version %s\n", progname, VERSION); > > exit(0); > > @@ -226,7 +230,11 @@ main( > > } > > } > > > > - if (argc - optind != 2) > > + if (argc - optind < 1 || argc - optind > 2) > > + usage(); > > + > > + /* show_info without a target is ok */ > > + if (!show_info && argc - optind != 2) > > usage(); > > > > /* open source */ > > @@ -239,6 +247,34 @@ main( > > if (src_f == NULL) > > fatal("cannot open source dump file\n"); > > } > > + > > + if (show_info) { > > + xfs_metablock_t mb; > > + > > + if (fread(&mb, sizeof(mb), 1, src_f) != 1) > > + fatal("error reading from file: %s\n", strerror(errno)); > > + > > + if (be32_to_cpu(mb.mb_magic) != XFS_MD_MAGIC) > > + fatal("specified file is not a metadata dump\n"); > > + > > + if (mb.mb_info & XFS_METADUMP_INFO_FLAGS) { > > + printf("%s: %sobfuscated, %s log, %s metadata blocks\n", > > + argv[optind], > > + mb.mb_info & XFS_METADUMP_OBFUSCATED ? "":"not ", > > + mb.mb_info & XFS_METADUMP_DIRTYLOG ? "dirty":"clean", > > + mb.mb_info & XFS_METADUMP_FULLBLOCKS ? "full":"zeroed"); > > + } else { > > + printf("%s: no informational flags present\n", > > + argv[optind]); > > + } > > + > > + if (argc - optind == 1) > > + exit(0); > > + > > + /* Go back to the beginning for the restore function */ > > + fseek(src_f, 0L, SEEK_SET); > > + } > > + > > optind++; > > > > /* check and open target */ > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html