On 6/21/17 3:34 PM, Darrick J. Wong wrote: > 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... well, it's been memset to 0 since inception. Sure, something could have gone wrong in transit, or whatever, I guess... I guess it might be nice to sanity check it, but to avoid another round trip: > ...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> thanks, -Eric > --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 > -- 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