All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Chandan Babu R <chandan.babu@oracle.com>
Cc: linux-xfs@vger.kernel.org, cem@kernel.org
Subject: Re: [PATCH V3 13/23] metadump: Add support for passing version option
Date: Tue, 1 Aug 2023 16:51:20 -0700	[thread overview]
Message-ID: <20230801235120.GU11352@frogsfrogsfrogs> (raw)
In-Reply-To: <20230724043527.238600-14-chandan.babu@oracle.com>

On Mon, Jul 24, 2023 at 10:05:17AM +0530, Chandan Babu R wrote:
> The new option allows the user to explicitly specify the version of metadump
> to use. However, we will default to using the v1 format.
> 
> Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>

Why did this lose its RVB tag from v2?

--D

> ---
>  db/metadump.c           | 81 +++++++++++++++++++++++++++++++++++------
>  db/xfs_metadump.sh      |  3 +-
>  man/man8/xfs_metadump.8 | 14 +++++++
>  3 files changed, 86 insertions(+), 12 deletions(-)
> 
> diff --git a/db/metadump.c b/db/metadump.c
> index 9b4ed70d..9fe9fe65 100644
> --- a/db/metadump.c
> +++ b/db/metadump.c
> @@ -37,7 +37,7 @@ static void	metadump_help(void);
>  
>  static const cmdinfo_t	metadump_cmd =
>  	{ "metadump", NULL, metadump_f, 0, -1, 0,
> -		N_("[-a] [-e] [-g] [-m max_extent] [-w] [-o] filename"),
> +		N_("[-a] [-e] [-g] [-m max_extent] [-w] [-o] [-v 1|2] filename"),
>  		N_("dump metadata to a file"), metadump_help };
>  
>  struct metadump_ops {
> @@ -74,6 +74,7 @@ static struct metadump {
>  	bool			zero_stale_data;
>  	bool			progress_since_warning;
>  	bool			dirty_log;
> +	bool			external_log;
>  	bool			stdout_metadump;
>  	xfs_ino_t		cur_ino;
>  	/* Metadump file */
> @@ -107,6 +108,7 @@ metadump_help(void)
>  "   -g -- Display dump progress\n"
>  "   -m -- Specify max extent size in blocks to copy (default = %d blocks)\n"
>  "   -o -- Don't obfuscate names and extended attributes\n"
> +"   -v -- Metadump version to be used\n"
>  "   -w -- Show warnings of bad metadata information\n"
>  "\n"), DEFAULT_MAX_EXT_SIZE);
>  }
> @@ -2909,8 +2911,20 @@ copy_log(void)
>  		print_progress("Copying log");
>  
>  	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 (metadump.external_log) {
> +		ASSERT(mp->m_sb.sb_logstart == 0);
> +		set_log_cur(&typtab[TYP_LOG],
> +				XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart),
> +				mp->m_sb.sb_logblocks * blkbb, DB_RING_IGN,
> +				NULL);
> +	} else {
> +		ASSERT(mp->m_sb.sb_logstart != 0);
> +		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 == NULL) {
>  		pop_cur();
>  		print_warning("cannot read log");
> @@ -3071,6 +3085,8 @@ init_metadump_v2(void)
>  		compat_flags |= XFS_MD2_INCOMPAT_FULLBLOCKS;
>  	if (metadump.dirty_log)
>  		compat_flags |= XFS_MD2_INCOMPAT_DIRTYLOG;
> +	if (metadump.external_log)
> +		compat_flags |= XFS_MD2_INCOMPAT_EXTERNALLOG;
>  
>  	xmh.xmh_compat_flags = cpu_to_be32(compat_flags);
>  
> @@ -3131,6 +3147,7 @@ metadump_f(
>  	int		outfd = -1;
>  	int		ret;
>  	char		*p;
> +	bool		version_opt_set = false;
>  
>  	exitcode = 1;
>  
> @@ -3142,6 +3159,7 @@ metadump_f(
>  	metadump.obfuscate = true;
>  	metadump.zero_stale_data = true;
>  	metadump.dirty_log = false;
> +	metadump.external_log = false;
>  
>  	if (mp->m_sb.sb_magicnum != XFS_SB_MAGIC) {
>  		print_warning("bad superblock magic number %x, giving up",
> @@ -3159,7 +3177,7 @@ metadump_f(
>  		return 0;
>  	}
>  
> -	while ((c = getopt(argc, argv, "aegm:ow")) != EOF) {
> +	while ((c = getopt(argc, argv, "aegm:ov:w")) != EOF) {
>  		switch (c) {
>  			case 'a':
>  				metadump.zero_stale_data = false;
> @@ -3183,6 +3201,17 @@ metadump_f(
>  			case 'o':
>  				metadump.obfuscate = false;
>  				break;
> +			case 'v':
> +				metadump.version = (int)strtol(optarg, &p, 0);
> +				if (*p != '\0' ||
> +				    (metadump.version != 1 &&
> +						metadump.version != 2)) {
> +					print_warning("bad metadump version: %s",
> +						optarg);
> +					return 0;
> +				}
> +				version_opt_set = true;
> +				break;
>  			case 'w':
>  				metadump.show_warnings = true;
>  				break;
> @@ -3197,12 +3226,42 @@ metadump_f(
>  		return 0;
>  	}
>  
> -	/* If we'll copy the log, see if the log is dirty */
> -	if (mp->m_sb.sb_logstart) {
> +	if (mp->m_logdev_targp->bt_bdev != mp->m_ddev_targp->bt_bdev)
> +		metadump.external_log = true;
> +
> +	if (metadump.external_log && !version_opt_set)
> +		metadump.version = 2;
> +
> +	if (metadump.version == 2 && mp->m_sb.sb_logstart == 0 &&
> +	    !metadump.external_log) {
> +		print_warning("external log device not loaded, use -l");
> +		return -ENODEV;
> +	}
> +
> +	/*
> +	 * If we'll copy the log, see if the log is dirty.
> +	 *
> +	 * Metadump v1 does not support dumping the contents of an external
> +	 * log. Hence we skip the dirty log check.
> +	 */
> +	if (!(metadump.version == 1 && metadump.external_log)) {
>  		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 (metadump.external_log) {
> +			ASSERT(mp->m_sb.sb_logstart == 0);
> +			set_log_cur(&typtab[TYP_LOG],
> +					XFS_FSB_TO_DADDR(mp,
> +							mp->m_sb.sb_logstart),
> +					mp->m_sb.sb_logblocks * blkbb,
> +					DB_RING_IGN, NULL);
> +		} else {
> +			ASSERT(mp->m_sb.sb_logstart != 0);
> +			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;
>  
> @@ -3278,8 +3337,8 @@ metadump_f(
>  	if (!exitcode)
>  		exitcode = !copy_sb_inodes();
>  
> -	/* copy log if it's internal */
> -	if ((mp->m_sb.sb_logstart != 0) && !exitcode)
> +	/* copy log */
> +	if (!exitcode && !(metadump.version == 1 && metadump.external_log))
>  		exitcode = !copy_log();
>  
>  	/* write the remaining index */
> diff --git a/db/xfs_metadump.sh b/db/xfs_metadump.sh
> index 9852a5bc..9e8f86e5 100755
> --- a/db/xfs_metadump.sh
> +++ b/db/xfs_metadump.sh
> @@ -8,7 +8,7 @@ OPTS=" "
>  DBOPTS=" "
>  USAGE="Usage: xfs_metadump [-aefFogwV] [-m max_extents] [-l logdev] source target"
>  
> -while getopts "aefgl:m:owFV" c
> +while getopts "aefgl:m:owFv:V" c
>  do
>  	case $c in
>  	a)	OPTS=$OPTS"-a ";;
> @@ -20,6 +20,7 @@ do
>  	f)	DBOPTS=$DBOPTS" -f";;
>  	l)	DBOPTS=$DBOPTS" -l "$OPTARG" ";;
>  	F)	DBOPTS=$DBOPTS" -F";;
> +	v)	OPTS=$OPTS"-v "$OPTARG" ";;
>  	V)	xfs_db -p xfs_metadump -V
>  		status=$?
>  		exit $status
> diff --git a/man/man8/xfs_metadump.8 b/man/man8/xfs_metadump.8
> index c0e79d77..1732012c 100644
> --- a/man/man8/xfs_metadump.8
> +++ b/man/man8/xfs_metadump.8
> @@ -11,6 +11,9 @@ xfs_metadump \- copy XFS filesystem metadata to a file
>  ] [
>  .B \-l
>  .I logdev
> +] [
> +.B \-v
> +.I version
>  ]
>  .I source
>  .I target
> @@ -74,6 +77,12 @@ metadata such as filenames is not considered sensitive.  If obfuscation
>  is required on a metadump with a dirty log, please inform the recipient
>  of the metadump image about this situation.
>  .PP
> +The contents of an external log device can be dumped only when using the v2
> +format.
> +Metadump in v2 format can be generated by passing the "-v 2" option.
> +Metadump in v2 format is generated by default if the filesystem has an
> +external log and the metadump version to use is not explicitly mentioned.
> +.PP
>  .B xfs_metadump
>  should not be used for any purposes other than for debugging and reporting
>  filesystem problems. The most common usage scenario for this tool is when
> @@ -134,6 +143,11 @@ this value.  The default size is 2097151 blocks.
>  .B \-o
>  Disables obfuscation of file names and extended attributes.
>  .TP
> +.B \-v
> +The format of the metadump file to be produced.
> +Valid values are 1 and 2.
> +The default metadump format is 1.
> +.TP
>  .B \-w
>  Prints warnings of inconsistent metadata encountered to stderr. Bad metadata
>  is still copied.
> -- 
> 2.39.1
> 

  reply	other threads:[~2023-08-01 23:51 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-24  4:35 [PATCH V3 00/23] Metadump v2 Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 01/23] metadump: Use boolean values true/false instead of 1/0 Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 02/23] mdrestore: Fix logic used to check if target device is large enough Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 03/23] metadump: Declare boolean variables with bool type Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 04/23] metadump: Define and use struct metadump Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 05/23] metadump: Add initialization and release functions Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 06/23] metadump: Postpone invocation of init_metadump() Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 07/23] metadump: Introduce struct metadump_ops Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 08/23] metadump: Introduce metadump v1 operations Chandan Babu R
2023-08-01 23:44   ` Darrick J. Wong
2023-07-24  4:35 ` [PATCH V3 09/23] metadump: Rename XFS_MD_MAGIC to XFS_MD_MAGIC_V1 Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 10/23] metadump: Define metadump v2 ondisk format structures and macros Chandan Babu R
2023-08-01 23:47   ` Darrick J. Wong
2023-08-02 13:08     ` Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 11/23] metadump: Define metadump ops for v2 format Chandan Babu R
2023-08-01 23:49   ` Darrick J. Wong
2023-08-02 13:08     ` Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 12/23] xfs_db: Add support to read from external log device Chandan Babu R
2023-08-01 23:49   ` Darrick J. Wong
2023-07-24  4:35 ` [PATCH V3 13/23] metadump: Add support for passing version option Chandan Babu R
2023-08-01 23:51   ` Darrick J. Wong [this message]
2023-08-02 13:18     ` Chandan Babu R
2023-08-02 17:14       ` Darrick J. Wong
2023-07-24  4:35 ` [PATCH V3 14/23] mdrestore: Declare boolean variables with bool type Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 15/23] mdrestore: Define and use struct mdrestore Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 16/23] mdrestore: Detect metadump v1 magic before reading the header Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 17/23] mdrestore: Add open_device(), read_header() and show_info() functions Chandan Babu R
2023-08-01 23:54   ` Darrick J. Wong
2023-07-24  4:35 ` [PATCH V3 18/23] mdrestore: Introduce struct mdrestore_ops Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 19/23] mdrestore: Replace metadump header pointer argument with a union pointer Chandan Babu R
2023-08-02  0:01   ` Darrick J. Wong
2023-08-02 13:17     ` Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 20/23] mdrestore: Introduce mdrestore v1 operations Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 21/23] mdrestore: Extract target device size verification into a function Chandan Babu R
2023-07-24  4:35 ` [PATCH V3 22/23] mdrestore: Define mdrestore ops for v2 format Chandan Babu R
2023-08-02 17:16   ` Darrick J. Wong
2023-07-24  4:35 ` [PATCH V3 23/23] mdrestore: Add support for passing log device as an argument Chandan Babu R
2023-10-31 16:46 ` [PATCH V3 00/23] Metadump v2 Darrick J. Wong
2023-11-01 14:58   ` Carlos Maiolino
2023-11-01 18:02     ` Darrick J. Wong
  -- strict thread matches above, loose matches on Subject: below --
2023-07-21  9:45 Chandan Babu R
2023-07-21  9:45 ` [PATCH V3 13/23] metadump: Add support for passing version option Chandan Babu R

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230801235120.GU11352@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=cem@kernel.org \
    --cc=chandan.babu@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.