Re: [PATCH V2] xfs_metadump: tag metadump image with informational flags

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux