diff mbox series

[05/10] common: refactor metadump v1 and v2 tests

Message ID 170620924435.3283496.2022458241568622607.stgit@frogsfrogsfrogs (mailing list archive)
State New, archived
Headers show
Series [01/10] generic/256: constrain runtime with TIME_FACTOR | expand

Commit Message

Darrick J. Wong Jan. 25, 2024, 7:05 p.m. UTC
From: Darrick J. Wong <djwong@kernel.org>

Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
duplicate copies of the same code.

While we're at it, fix the fsck so that it includes xfs_scrub.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 common/rc                 |   10 ----
 common/xfs                |   14 +++++
 common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
 tests/xfs/129             |   90 ++-------------------------------
 tests/xfs/234             |   91 ++-------------------------------
 tests/xfs/253             |   89 ++-------------------------------
 tests/xfs/291             |   31 ++++-------
 tests/xfs/432             |   30 ++---------
 tests/xfs/503             |   60 +++-------------------
 tests/xfs/605             |   84 ++-----------------------------
 10 files changed, 181 insertions(+), 441 deletions(-)
 create mode 100644 common/xfs_metadump_tests

Comments

Christoph Hellwig Jan. 26, 2024, 1:34 p.m. UTC | #1
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Zorro Lang Jan. 27, 2024, 8:47 a.m. UTC | #2
On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> duplicate copies of the same code.
> 
> While we're at it, fix the fsck so that it includes xfs_scrub.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  common/rc                 |   10 ----
>  common/xfs                |   14 +++++
>  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/129             |   90 ++-------------------------------
>  tests/xfs/234             |   91 ++-------------------------------
>  tests/xfs/253             |   89 ++-------------------------------
>  tests/xfs/291             |   31 ++++-------
>  tests/xfs/432             |   30 ++---------
>  tests/xfs/503             |   60 +++-------------------
>  tests/xfs/605             |   84 ++-----------------------------
>  10 files changed, 181 insertions(+), 441 deletions(-)
>  create mode 100644 common/xfs_metadump_tests
> 
> 
> diff --git a/common/rc b/common/rc
> index 524ffa02aa..0b69f7f54f 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -3320,15 +3320,7 @@ _check_scratch_fs()
>  
>      case $FSTYP in
>      xfs)
> -	local scratch_log="none"
> -	local scratch_rt="none"
> -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> -	    scratch_log="$SCRATCH_LOGDEV"
> -
> -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> -	    scratch_rt="$SCRATCH_RTDEV"
> -
> -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> +	_check_xfs_scratch_fs $device
>  	;;
>      udf)
>  	_check_udf_filesystem $device $udf_fsize
> diff --git a/common/xfs b/common/xfs
> index 248ccefda3..6a48960a7f 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
>  	return $?
>  }
>  
> +_check_xfs_scratch_fs()
> +{
> +	local device="${1:-$SCRATCH_DEV}"
> +	local scratch_log="none"
> +	local scratch_rt="none"
> +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> +	    scratch_log="$SCRATCH_LOGDEV"
> +
> +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> +	    scratch_rt="$SCRATCH_RTDEV"
> +
> +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> +}
> +
>  # modeled after _scratch_xfs_repair
>  _test_xfs_repair()
>  {
> diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests

Hi Darrick,

Thanks for this improvement.

I'm wondering do we need a separated common file only for xfs metadump
helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
_xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
in common/xfs.

Thanks,
Zorro

> new file mode 100644
> index 0000000000..dd3dec1fb4
> --- /dev/null
> +++ b/common/xfs_metadump_tests
> @@ -0,0 +1,123 @@
> +#
> +# XFS specific metadump testing functions.
> +#
> +
> +# Set up environment variables for a metadump test.  Requires the test and
> +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> +_setup_verify_metadump()
> +{
> +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> +
> +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> +}
> +
> +_cleanup_verify_metadump()
> +{
> +	_scratch_unmount &>> $seqres.full
> +
> +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> +		losetup -d "$ldev"
> +	done
> +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> +}
> +
> +# Create a metadump in v1 format, restore it to fs image files, then mount the
> +# images and fsck them.
> +_verify_metadump_v1()
> +{
> +	local metadump_args="$1"
> +	local extra_test="$2"
> +
> +	local metadump_file="$XFS_METADUMP_FILE"
> +	local version=""
> +	local data_img="$XFS_METADUMP_IMG.data"
> +	local data_loop
> +
> +	# Force v1 if we detect v2 support
> +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> +		version="-v 1"
> +	fi
> +
> +	# Capture metadump, which creates metadump_file
> +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> +
> +	# Restore metadump, which creates data_img
> +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> +
> +	# Create loopdev for data device so we can mount the fs
> +	data_loop=$(_create_loop_device $data_img)
> +
> +	# Mount fs, run an extra test, fsck, and unmount
> +	SCRATCH_DEV=$data_loop _scratch_mount
> +	if [ -n "$extra_test" ]; then
> +		SCRATCH_DEV=$data_loop $extra_test
> +	fi
> +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> +	SCRATCH_DEV=$data_loop _scratch_unmount
> +
> +	# Tear down what we created
> +	_destroy_loop_device $data_loop
> +	rm -f $data_img
> +}
> +
> +# Create a metadump in v2 format, restore it to fs image files, then mount the
> +# images and fsck them.
> +_verify_metadump_v2()
> +{
> +	local metadump_args="$1"
> +	local extra_test="$2"
> +
> +	local metadump_file="$XFS_METADUMP_FILE"
> +	local version="-v 2"
> +	local data_img="$XFS_METADUMP_IMG.data"
> +	local data_loop
> +	local log_img=""
> +	local log_loop
> +
> +	# Capture metadump, which creates metadump_file
> +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> +
> +	#
> +	# Metadump v2 files can contain contents dumped from an external log
> +	# device. Use a temporary file to hold the log device contents restored
> +	# from such a metadump file.
> +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> +
> +	# Restore metadump, which creates data_img and log_img
> +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> +		_scratch_xfs_mdrestore $metadump_file
> +
> +	# Create loopdev for data device so we can mount the fs
> +	data_loop=$(_create_loop_device $data_img)
> +
> +	# Create loopdev for log device if we recovered anything
> +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> +
> +	# Mount fs, run an extra test, fsck, and unmount
> +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> +	if [ -n "$extra_test" ]; then
> +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> +	fi
> +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> +	SCRATCH_DEV=$data_loop _scratch_unmount
> +
> +	# Tear down what we created
> +	if [ -b "$log_loop" ]; then
> +		_destroy_loop_device $log_loop
> +		rm -f $log_img
> +	fi
> +	_destroy_loop_device $data_loop
> +	rm -f $data_img
> +}
> +
> +# Verify both metadump formats if possible
> +_verify_metadumps()
> +{
> +	_verify_metadump_v1 "$@"
> +
> +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> +		_verify_metadump_v2 "$@"
> +	fi
> +}
> diff --git a/tests/xfs/129 b/tests/xfs/129
> index cdac2349df..c3a9bcefee 100755
> --- a/tests/xfs/129
> +++ b/tests/xfs/129
> @@ -16,98 +16,23 @@ _cleanup()
>  {
>      cd /
>      _scratch_unmount > /dev/null 2>&1
> -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> -	    _destroy_loop_device $logdev
> -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> -       $TEST_DIR/log-image
> +    _cleanup_verify_metadump
> +    rm -rf $tmp.* $testdir
>  }
>  
>  # Import common functions.
>  . ./common/filter
>  . ./common/reflink
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_loop
>  _require_scratch_reflink
> -
> -metadump_file=$TEST_DIR/${seq}_metadump
> -
> -verify_metadump_v1()
> -{
> -	local max_version=$1
> -	local version=""
> -
> -	if [[ $max_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	logdev=$SCRATCH_LOGDEV
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	version="-v 2"
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=${SCRATCH_LOGDEV}
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $TEST_DIR/log-image
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> +_setup_verify_metadump
>  
>  _scratch_mkfs >/dev/null 2>&1
> -
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  _scratch_mount
>  
>  testdir=$SCRATCH_MNT/test-$seq
> @@ -127,12 +52,7 @@ done
>  _scratch_unmount
>  
>  echo "Create metadump file, restore it and check restored fs"
> -
> -verify_metadump_v1 $max_md_version
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/234 b/tests/xfs/234
> index f4f8af6d3a..8f808c7507 100755
> --- a/tests/xfs/234
> +++ b/tests/xfs/234
> @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
>  _cleanup()
>  {
>      cd /
> -    _scratch_unmount > /dev/null 2>&1
> -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> -	    _destroy_loop_device $logdev
> -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> -       $TEST_DIR/log-image
> +    _cleanup_verify_metadump
> +    rm -rf $tmp.* $testdir
>  }
>  
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
> @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_loop
>  _require_xfs_scratch_rmapbt
>  _require_xfs_io_command "fpunch"
> -
> -metadump_file=$TEST_DIR/${seq}_metadump
> -
> -verify_metadump_v1()
> -{
> -	local max_version=$1
> -	local version=""
> -
> -	if [[ $max_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	logdev=$SCRATCH_LOGDEV
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	version="-v 2"
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=${SCRATCH_LOGDEV}
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $TEST_DIR/log-image
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> +_setup_verify_metadump
>  
>  _scratch_mkfs >/dev/null 2>&1
> -
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  _scratch_mount
>  
>  testdir=$SCRATCH_MNT/test-$seq
> @@ -127,12 +51,7 @@ done
>  _scratch_unmount
>  
>  echo "Create metadump file, restore it and check restored fs"
> -
> -verify_metadump_v1 $max_md_version
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/253 b/tests/xfs/253
> index 3b567999d8..6623c435e5 100755
> --- a/tests/xfs/253
> +++ b/tests/xfs/253
> @@ -26,23 +26,21 @@ _cleanup()
>      cd /
>      rm -f $tmp.*
>      rm -rf "${OUTPUT_DIR}"
> -    rm -f "${METADUMP_FILE}"
> -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> -	    _destroy_loop_device $logdev
> -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> +    _cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_test
>  _require_scratch
> +_setup_verify_metadump
>  
>  # real QA test starts here
>  
>  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
>  ORPHANAGE="lost+found"
>  
>  _supported_fs xfs
> @@ -52,24 +50,7 @@ function create_file() {
>  	touch $(printf "$@")
>  }
>  
> -verify_metadump_v1()
> -{
> -	local max_version=$1
> -	local version=""
> -
> -	if [[ $max_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $METADUMP_FILE $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> -		   _scratch_xfs_mdrestore $METADUMP_FILE
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -
> +extra_test() {
>  	cd "${SCRATCH_MNT}"
>  
>  	# Get a listing of all the files after obfuscation
> @@ -78,60 +59,6 @@ verify_metadump_v1()
>  	ls -R | od -c >> $seqres.full
>  
>  	cd /
> -
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	version="-v 2"
> -
> -	_scratch_xfs_metadump $METADUMP_FILE $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $METADUMP_FILE
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=${SCRATCH_LOGDEV}
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -
> -	cd "${SCRATCH_MNT}"
> -
> -	# Get a listing of all the files after obfuscation
> -	echo "Metadump v2" >> $seqres.full
> -	ls -R >> $seqres.full
> -	ls -R | od -c >> $seqres.full
> -
> -	cd /
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $TEST_DIR/log-image
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
>  }
>  
>  echo "Disciplyne of silence is goed."
> @@ -233,13 +160,7 @@ cd $here
>  
>  _scratch_unmount
>  
> -max_md_version=$(_xfs_metadump_max_version)
> -
> -verify_metadump_v1 $max_md_version
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps '' extra_test
>  
>  # Finally, re-make the filesystem since to ensure we don't
>  # leave a directory with duplicate entries lying around.
> diff --git a/tests/xfs/291 b/tests/xfs/291
> index 1433140821..c475d89ad9 100755
> --- a/tests/xfs/291
> +++ b/tests/xfs/291
> @@ -9,11 +9,21 @@
>  . ./common/preamble
>  _begin_fstest auto repair metadump
>  
> +# Override the default cleanup function.
> +_cleanup()
> +{
> +	cd /
> +	rm -r -f $tmp.*
> +	_cleanup_verify_metadump
> +}
> +
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  _supported_fs xfs
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> +_setup_verify_metadump
>  
>  # real QA test starts here
>  _require_scratch
> @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
>  
>  # Yes they can!  Now...
>  # Can xfs_metadump cope with this monster?
> -max_md_version=$(_xfs_metadump_max_version)
> -
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> -		_fail "xfs_metadump failed"
> -
> -	slogdev=$SCRATCH_LOGDEV
> -	if [[ -z $version || $version == "-v 1" ]]; then
> -		slogdev=""
> -	fi
> -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> -		_fail "xfs_repair of metadump failed"
> -done
> +_verify_metadumps '-a -o'
>  
>  # Yes it can; success, all done
>  status=0
> diff --git a/tests/xfs/432 b/tests/xfs/432
> index 7e402aa88f..579e1b556a 100755
> --- a/tests/xfs/432
> +++ b/tests/xfs/432
> @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
>  _cleanup()
>  {
>  	cd /
> -	rm -f "$tmp".* $metadump_file $metadump_img
> +	rm -f "$tmp".*
> +	_cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_scratch
> +_setup_verify_metadump
>  
>  rm -f "$seqres.full"
>  
> @@ -54,9 +57,6 @@ echo "Format and mount"
>  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
>  _scratch_mount >> "$seqres.full" 2>&1
>  
> -metadump_file="$TEST_DIR/meta-$seq"
> -metadump_img="$TEST_DIR/img-$seq"
> -rm -f $metadump_file $metadump_img
>  testdir="$SCRATCH_MNT/test-$seq"
>  max_fname_len=255
>  blksz=$(_get_block_size $SCRATCH_MNT)
> @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
>  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
>  
>  echo "Try to metadump, restore and check restored metadump image"
> -max_md_version=$(_xfs_metadump_max_version)
> -
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> -
> -	slogdev=$SCRATCH_LOGDEV
> -	if [[ -z $version || $version == "-v 1" ]]; then
> -		slogdev=""
> -	fi
> -
> -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> -		echo "xfs_repair on restored fs returned $?"
> -done
> +_verify_metadumps '-a -o -w'
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/503 b/tests/xfs/503
> index 8643c3d483..ff6b344a9c 100755
> --- a/tests/xfs/503
> +++ b/tests/xfs/503
> @@ -17,11 +17,13 @@ _cleanup()
>  {
>  	cd /
>  	rm -rf $tmp.* $testdir
> +	_cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/filter
>  . ./common/populate
> +. ./common/xfs_metadump_tests
>  
>  testdir=$TEST_DIR/test-$seq
>  
> @@ -35,6 +37,7 @@ _require_scratch_nocheck
>  _require_populate_commands
>  _xfs_skip_online_rebuild
>  _xfs_skip_offline_rebuild
> +_setup_verify_metadump
>  
>  echo "Format and populate"
>  _scratch_populate_cached nofill > $seqres.full 2>&1
> @@ -43,66 +46,17 @@ mkdir -p $testdir
>  metadump_file=$testdir/scratch.md
>  copy_file=$testdir/copy.img
>  
> -check_restored_metadump_image()
> -{
> -	local image=$1
> -
> -	loop_dev=$(_create_loop_device $image)
> -	SCRATCH_DEV=$loop_dev _scratch_mount
> -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> -	SCRATCH_DEV=$loop_dev _scratch_unmount
> -	_destroy_loop_device $loop_dev
> -}
> -
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  echo "metadump and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-a -o'
>  
>  echo "metadump a and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-a'
>  
>  echo "metadump g and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-g' >> $seqres.full
>  
>  echo "metadump ag and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-a -g' >> $seqres.full
>  
>  echo copy
>  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> diff --git a/tests/xfs/605 b/tests/xfs/605
> index f2cd7aba98..af917f0f32 100755
> --- a/tests/xfs/605
> +++ b/tests/xfs/605
> @@ -15,17 +15,13 @@ _cleanup()
>  {
>  	cd /
>  	rm -r -f $tmp.*
> -	_scratch_unmount > /dev/null 2>&1
> -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> -		_destroy_loop_device $logdev
> -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> -	rm -r -f $metadump_file $TEST_DIR/data-image \
> -	   $TEST_DIR/log-image
> +	_cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/dmflakey
>  . ./common/inject
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
> @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
>  _require_dm_target flakey
>  _require_xfs_io_command "pwrite"
>  _require_test_program "punch-alternating"
> +_setup_verify_metadump
>  
> -metadump_file=${TEST_DIR}/${seq}.md
>  testfile=${SCRATCH_MNT}/testfile
>  
>  echo "Format filesystem on scratch device"
>  _scratch_mkfs >> $seqres.full 2>&1
>  
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  external_log=0
>  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
>  	external_log=1
>  fi
>  
> -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
>  	_notrun "metadump v1 does not support external log device"
>  fi
>  
> -verify_metadump_v1()
> -{
> -	local version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -o $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -	SCRATCH_DEV=$datadev _check_scratch_fs
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	local version="-v 2"
> -
> -	_scratch_xfs_metadump $metadump_file -a -o $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=""
> -	if [[ -s $slogdev ]]; then
> -		logdev=$(_create_loop_device $slogdev)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	if [[ -s $logdev ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $slogdev
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
>  echo "Initialize and mount filesystem on flakey device"
>  _init_flakey
>  _load_flakey_table $FLAKEY_ALLOW_WRITES
> @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
>  _print_logstate
>  
>  echo "Create metadump file, restore it and check restored fs"
> -
> -if [[ $external_log == 0 ]]; then
> -	verify_metadump_v1 $max_md_version
> -fi
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps '-a -o'
>  
>  # Mount the fs to replay the contents from the dirty log.
>  _scratch_mount
>
Darrick J. Wong Jan. 27, 2024, 5:22 p.m. UTC | #3
On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> > 
> > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > duplicate copies of the same code.
> > 
> > While we're at it, fix the fsck so that it includes xfs_scrub.
> > 
> > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > ---
> >  common/rc                 |   10 ----
> >  common/xfs                |   14 +++++
> >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/129             |   90 ++-------------------------------
> >  tests/xfs/234             |   91 ++-------------------------------
> >  tests/xfs/253             |   89 ++-------------------------------
> >  tests/xfs/291             |   31 ++++-------
> >  tests/xfs/432             |   30 ++---------
> >  tests/xfs/503             |   60 +++-------------------
> >  tests/xfs/605             |   84 ++-----------------------------
> >  10 files changed, 181 insertions(+), 441 deletions(-)
> >  create mode 100644 common/xfs_metadump_tests
> > 
> > 
> > diff --git a/common/rc b/common/rc
> > index 524ffa02aa..0b69f7f54f 100644
> > --- a/common/rc
> > +++ b/common/rc
> > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> >  
> >      case $FSTYP in
> >      xfs)
> > -	local scratch_log="none"
> > -	local scratch_rt="none"
> > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > -	    scratch_log="$SCRATCH_LOGDEV"
> > -
> > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > -	    scratch_rt="$SCRATCH_RTDEV"
> > -
> > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > +	_check_xfs_scratch_fs $device
> >  	;;
> >      udf)
> >  	_check_udf_filesystem $device $udf_fsize
> > diff --git a/common/xfs b/common/xfs
> > index 248ccefda3..6a48960a7f 100644
> > --- a/common/xfs
> > +++ b/common/xfs
> > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> >  	return $?
> >  }
> >  
> > +_check_xfs_scratch_fs()
> > +{
> > +	local device="${1:-$SCRATCH_DEV}"
> > +	local scratch_log="none"
> > +	local scratch_rt="none"
> > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > +	    scratch_log="$SCRATCH_LOGDEV"
> > +
> > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > +	    scratch_rt="$SCRATCH_RTDEV"
> > +
> > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > +}
> > +
> >  # modeled after _scratch_xfs_repair
> >  _test_xfs_repair()
> >  {
> > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> 
> Hi Darrick,
> 
> Thanks for this improvement.
> 
> I'm wondering do we need a separated common file only for xfs metadump
> helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> in common/xfs.

Yes, that's certainly possible, but keep in mind that common/$FSTYP
files are getting big:

   509 fstests/common/overlay
   523 fstests/common/quota
   550 fstests/common/reflink
   638 fstests/common/log
   640 fstests/common/punch
   663 fstests/common/filter
   794 fstests/common/btrfs
   936 fstests/common/config
  1030 fstests/common/encrypt
  1162 fstests/common/populate
  1519 fstests/common/fuzzy
  1531 fstests/common/dump
  2218 fstests/common/xfs
  5437 fstests/common/rc

with common/xfs being particularly larger than most everything else.

Since the common/xfs_metadump_tests functions are shared helper
functions for testing metadump/mdrestore that are not use by most tests,
I decided that a split was appropriate both to maintain the (ha!)
cohesion of common/xfs and not add more bash parsing costs to every
single testcase.

--D

> Thanks,
> Zorro
> 
> > new file mode 100644
> > index 0000000000..dd3dec1fb4
> > --- /dev/null
> > +++ b/common/xfs_metadump_tests
> > @@ -0,0 +1,123 @@
> > +#
> > +# XFS specific metadump testing functions.
> > +#
> > +
> > +# Set up environment variables for a metadump test.  Requires the test and
> > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > +_setup_verify_metadump()
> > +{
> > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > +
> > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > +}
> > +
> > +_cleanup_verify_metadump()
> > +{
> > +	_scratch_unmount &>> $seqres.full
> > +
> > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > +		losetup -d "$ldev"
> > +	done
> > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > +}
> > +
> > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > +# images and fsck them.
> > +_verify_metadump_v1()
> > +{
> > +	local metadump_args="$1"
> > +	local extra_test="$2"
> > +
> > +	local metadump_file="$XFS_METADUMP_FILE"
> > +	local version=""
> > +	local data_img="$XFS_METADUMP_IMG.data"
> > +	local data_loop
> > +
> > +	# Force v1 if we detect v2 support
> > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > +		version="-v 1"
> > +	fi
> > +
> > +	# Capture metadump, which creates metadump_file
> > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > +
> > +	# Restore metadump, which creates data_img
> > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > +
> > +	# Create loopdev for data device so we can mount the fs
> > +	data_loop=$(_create_loop_device $data_img)
> > +
> > +	# Mount fs, run an extra test, fsck, and unmount
> > +	SCRATCH_DEV=$data_loop _scratch_mount
> > +	if [ -n "$extra_test" ]; then
> > +		SCRATCH_DEV=$data_loop $extra_test
> > +	fi
> > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > +
> > +	# Tear down what we created
> > +	_destroy_loop_device $data_loop
> > +	rm -f $data_img
> > +}
> > +
> > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > +# images and fsck them.
> > +_verify_metadump_v2()
> > +{
> > +	local metadump_args="$1"
> > +	local extra_test="$2"
> > +
> > +	local metadump_file="$XFS_METADUMP_FILE"
> > +	local version="-v 2"
> > +	local data_img="$XFS_METADUMP_IMG.data"
> > +	local data_loop
> > +	local log_img=""
> > +	local log_loop
> > +
> > +	# Capture metadump, which creates metadump_file
> > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > +
> > +	#
> > +	# Metadump v2 files can contain contents dumped from an external log
> > +	# device. Use a temporary file to hold the log device contents restored
> > +	# from such a metadump file.
> > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > +
> > +	# Restore metadump, which creates data_img and log_img
> > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > +		_scratch_xfs_mdrestore $metadump_file
> > +
> > +	# Create loopdev for data device so we can mount the fs
> > +	data_loop=$(_create_loop_device $data_img)
> > +
> > +	# Create loopdev for log device if we recovered anything
> > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > +
> > +	# Mount fs, run an extra test, fsck, and unmount
> > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > +	if [ -n "$extra_test" ]; then
> > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > +	fi
> > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > +
> > +	# Tear down what we created
> > +	if [ -b "$log_loop" ]; then
> > +		_destroy_loop_device $log_loop
> > +		rm -f $log_img
> > +	fi
> > +	_destroy_loop_device $data_loop
> > +	rm -f $data_img
> > +}
> > +
> > +# Verify both metadump formats if possible
> > +_verify_metadumps()
> > +{
> > +	_verify_metadump_v1 "$@"
> > +
> > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > +		_verify_metadump_v2 "$@"
> > +	fi
> > +}
> > diff --git a/tests/xfs/129 b/tests/xfs/129
> > index cdac2349df..c3a9bcefee 100755
> > --- a/tests/xfs/129
> > +++ b/tests/xfs/129
> > @@ -16,98 +16,23 @@ _cleanup()
> >  {
> >      cd /
> >      _scratch_unmount > /dev/null 2>&1
> > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > -	    _destroy_loop_device $logdev
> > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > -       $TEST_DIR/log-image
> > +    _cleanup_verify_metadump
> > +    rm -rf $tmp.* $testdir
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> >  . ./common/reflink
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_loop
> >  _require_scratch_reflink
> > -
> > -metadump_file=$TEST_DIR/${seq}_metadump
> > -
> > -verify_metadump_v1()
> > -{
> > -	local max_version=$1
> > -	local version=""
> > -
> > -	if [[ $max_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	logdev=$SCRATCH_LOGDEV
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	version="-v 2"
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=${SCRATCH_LOGDEV}
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $TEST_DIR/log-image
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > +_setup_verify_metadump
> >  
> >  _scratch_mkfs >/dev/null 2>&1
> > -
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  _scratch_mount
> >  
> >  testdir=$SCRATCH_MNT/test-$seq
> > @@ -127,12 +52,7 @@ done
> >  _scratch_unmount
> >  
> >  echo "Create metadump file, restore it and check restored fs"
> > -
> > -verify_metadump_v1 $max_md_version
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps
> >  
> >  # success, all done
> >  status=0
> > diff --git a/tests/xfs/234 b/tests/xfs/234
> > index f4f8af6d3a..8f808c7507 100755
> > --- a/tests/xfs/234
> > +++ b/tests/xfs/234
> > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> >  _cleanup()
> >  {
> >      cd /
> > -    _scratch_unmount > /dev/null 2>&1
> > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > -	    _destroy_loop_device $logdev
> > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > -       $TEST_DIR/log-image
> > +    _cleanup_verify_metadump
> > +    rm -rf $tmp.* $testdir
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_loop
> >  _require_xfs_scratch_rmapbt
> >  _require_xfs_io_command "fpunch"
> > -
> > -metadump_file=$TEST_DIR/${seq}_metadump
> > -
> > -verify_metadump_v1()
> > -{
> > -	local max_version=$1
> > -	local version=""
> > -
> > -	if [[ $max_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	logdev=$SCRATCH_LOGDEV
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	version="-v 2"
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=${SCRATCH_LOGDEV}
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $TEST_DIR/log-image
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > +_setup_verify_metadump
> >  
> >  _scratch_mkfs >/dev/null 2>&1
> > -
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  _scratch_mount
> >  
> >  testdir=$SCRATCH_MNT/test-$seq
> > @@ -127,12 +51,7 @@ done
> >  _scratch_unmount
> >  
> >  echo "Create metadump file, restore it and check restored fs"
> > -
> > -verify_metadump_v1 $max_md_version
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps
> >  
> >  # success, all done
> >  status=0
> > diff --git a/tests/xfs/253 b/tests/xfs/253
> > index 3b567999d8..6623c435e5 100755
> > --- a/tests/xfs/253
> > +++ b/tests/xfs/253
> > @@ -26,23 +26,21 @@ _cleanup()
> >      cd /
> >      rm -f $tmp.*
> >      rm -rf "${OUTPUT_DIR}"
> > -    rm -f "${METADUMP_FILE}"
> > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > -	    _destroy_loop_device $logdev
> > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > +    _cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_test
> >  _require_scratch
> > +_setup_verify_metadump
> >  
> >  # real QA test starts here
> >  
> >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> >  ORPHANAGE="lost+found"
> >  
> >  _supported_fs xfs
> > @@ -52,24 +50,7 @@ function create_file() {
> >  	touch $(printf "$@")
> >  }
> >  
> > -verify_metadump_v1()
> > -{
> > -	local max_version=$1
> > -	local version=""
> > -
> > -	if [[ $max_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -
> > +extra_test() {
> >  	cd "${SCRATCH_MNT}"
> >  
> >  	# Get a listing of all the files after obfuscation
> > @@ -78,60 +59,6 @@ verify_metadump_v1()
> >  	ls -R | od -c >> $seqres.full
> >  
> >  	cd /
> > -
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	version="-v 2"
> > -
> > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=${SCRATCH_LOGDEV}
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -
> > -	cd "${SCRATCH_MNT}"
> > -
> > -	# Get a listing of all the files after obfuscation
> > -	echo "Metadump v2" >> $seqres.full
> > -	ls -R >> $seqres.full
> > -	ls -R | od -c >> $seqres.full
> > -
> > -	cd /
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $TEST_DIR/log-image
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> >  }
> >  
> >  echo "Disciplyne of silence is goed."
> > @@ -233,13 +160,7 @@ cd $here
> >  
> >  _scratch_unmount
> >  
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> > -verify_metadump_v1 $max_md_version
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps '' extra_test
> >  
> >  # Finally, re-make the filesystem since to ensure we don't
> >  # leave a directory with duplicate entries lying around.
> > diff --git a/tests/xfs/291 b/tests/xfs/291
> > index 1433140821..c475d89ad9 100755
> > --- a/tests/xfs/291
> > +++ b/tests/xfs/291
> > @@ -9,11 +9,21 @@
> >  . ./common/preamble
> >  _begin_fstest auto repair metadump
> >  
> > +# Override the default cleanup function.
> > +_cleanup()
> > +{
> > +	cd /
> > +	rm -r -f $tmp.*
> > +	_cleanup_verify_metadump
> > +}
> > +
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  _supported_fs xfs
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > +_setup_verify_metadump
> >  
> >  # real QA test starts here
> >  _require_scratch
> > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> >  
> >  # Yes they can!  Now...
> >  # Can xfs_metadump cope with this monster?
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > -		_fail "xfs_metadump failed"
> > -
> > -	slogdev=$SCRATCH_LOGDEV
> > -	if [[ -z $version || $version == "-v 1" ]]; then
> > -		slogdev=""
> > -	fi
> > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > -		_fail "xfs_repair of metadump failed"
> > -done
> > +_verify_metadumps '-a -o'
> >  
> >  # Yes it can; success, all done
> >  status=0
> > diff --git a/tests/xfs/432 b/tests/xfs/432
> > index 7e402aa88f..579e1b556a 100755
> > --- a/tests/xfs/432
> > +++ b/tests/xfs/432
> > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> >  _cleanup()
> >  {
> >  	cd /
> > -	rm -f "$tmp".* $metadump_file $metadump_img
> > +	rm -f "$tmp".*
> > +	_cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_scratch
> > +_setup_verify_metadump
> >  
> >  rm -f "$seqres.full"
> >  
> > @@ -54,9 +57,6 @@ echo "Format and mount"
> >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> >  _scratch_mount >> "$seqres.full" 2>&1
> >  
> > -metadump_file="$TEST_DIR/meta-$seq"
> > -metadump_img="$TEST_DIR/img-$seq"
> > -rm -f $metadump_file $metadump_img
> >  testdir="$SCRATCH_MNT/test-$seq"
> >  max_fname_len=255
> >  blksz=$(_get_block_size $SCRATCH_MNT)
> > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> >  
> >  echo "Try to metadump, restore and check restored metadump image"
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > -
> > -	slogdev=$SCRATCH_LOGDEV
> > -	if [[ -z $version || $version == "-v 1" ]]; then
> > -		slogdev=""
> > -	fi
> > -
> > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > -		echo "xfs_repair on restored fs returned $?"
> > -done
> > +_verify_metadumps '-a -o -w'
> >  
> >  # success, all done
> >  status=0
> > diff --git a/tests/xfs/503 b/tests/xfs/503
> > index 8643c3d483..ff6b344a9c 100755
> > --- a/tests/xfs/503
> > +++ b/tests/xfs/503
> > @@ -17,11 +17,13 @@ _cleanup()
> >  {
> >  	cd /
> >  	rm -rf $tmp.* $testdir
> > +	_cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> >  . ./common/populate
> > +. ./common/xfs_metadump_tests
> >  
> >  testdir=$TEST_DIR/test-$seq
> >  
> > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> >  _require_populate_commands
> >  _xfs_skip_online_rebuild
> >  _xfs_skip_offline_rebuild
> > +_setup_verify_metadump
> >  
> >  echo "Format and populate"
> >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > @@ -43,66 +46,17 @@ mkdir -p $testdir
> >  metadump_file=$testdir/scratch.md
> >  copy_file=$testdir/copy.img
> >  
> > -check_restored_metadump_image()
> > -{
> > -	local image=$1
> > -
> > -	loop_dev=$(_create_loop_device $image)
> > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > -	_destroy_loop_device $loop_dev
> > -}
> > -
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  echo "metadump and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-a -o'
> >  
> >  echo "metadump a and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-a'
> >  
> >  echo "metadump g and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-g' >> $seqres.full
> >  
> >  echo "metadump ag and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-a -g' >> $seqres.full
> >  
> >  echo copy
> >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > diff --git a/tests/xfs/605 b/tests/xfs/605
> > index f2cd7aba98..af917f0f32 100755
> > --- a/tests/xfs/605
> > +++ b/tests/xfs/605
> > @@ -15,17 +15,13 @@ _cleanup()
> >  {
> >  	cd /
> >  	rm -r -f $tmp.*
> > -	_scratch_unmount > /dev/null 2>&1
> > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > -		_destroy_loop_device $logdev
> > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > -	   $TEST_DIR/log-image
> > +	_cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/dmflakey
> >  . ./common/inject
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> >  _require_dm_target flakey
> >  _require_xfs_io_command "pwrite"
> >  _require_test_program "punch-alternating"
> > +_setup_verify_metadump
> >  
> > -metadump_file=${TEST_DIR}/${seq}.md
> >  testfile=${SCRATCH_MNT}/testfile
> >  
> >  echo "Format filesystem on scratch device"
> >  _scratch_mkfs >> $seqres.full 2>&1
> >  
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  external_log=0
> >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> >  	external_log=1
> >  fi
> >  
> > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> >  	_notrun "metadump v1 does not support external log device"
> >  fi
> >  
> > -verify_metadump_v1()
> > -{
> > -	local version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	local version="-v 2"
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=""
> > -	if [[ -s $slogdev ]]; then
> > -		logdev=$(_create_loop_device $slogdev)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	if [[ -s $logdev ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $slogdev
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> >  echo "Initialize and mount filesystem on flakey device"
> >  _init_flakey
> >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> >  _print_logstate
> >  
> >  echo "Create metadump file, restore it and check restored fs"
> > -
> > -if [[ $external_log == 0 ]]; then
> > -	verify_metadump_v1 $max_md_version
> > -fi
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps '-a -o'
> >  
> >  # Mount the fs to replay the contents from the dirty log.
> >  _scratch_mount
> > 
>
Zorro Lang Jan. 28, 2024, 1:23 p.m. UTC | #4
On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > From: Darrick J. Wong <djwong@kernel.org>
> > > 
> > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > duplicate copies of the same code.
> > > 
> > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > 
> > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > ---
> > >  common/rc                 |   10 ----
> > >  common/xfs                |   14 +++++
> > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > >  tests/xfs/129             |   90 ++-------------------------------
> > >  tests/xfs/234             |   91 ++-------------------------------
> > >  tests/xfs/253             |   89 ++-------------------------------
> > >  tests/xfs/291             |   31 ++++-------
> > >  tests/xfs/432             |   30 ++---------
> > >  tests/xfs/503             |   60 +++-------------------
> > >  tests/xfs/605             |   84 ++-----------------------------
> > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > >  create mode 100644 common/xfs_metadump_tests
> > > 
> > > 
> > > diff --git a/common/rc b/common/rc
> > > index 524ffa02aa..0b69f7f54f 100644
> > > --- a/common/rc
> > > +++ b/common/rc
> > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > >  
> > >      case $FSTYP in
> > >      xfs)
> > > -	local scratch_log="none"
> > > -	local scratch_rt="none"
> > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > -
> > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > -
> > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > +	_check_xfs_scratch_fs $device
> > >  	;;
> > >      udf)
> > >  	_check_udf_filesystem $device $udf_fsize
> > > diff --git a/common/xfs b/common/xfs
> > > index 248ccefda3..6a48960a7f 100644
> > > --- a/common/xfs
> > > +++ b/common/xfs
> > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > >  	return $?
> > >  }
> > >  
> > > +_check_xfs_scratch_fs()
> > > +{
> > > +	local device="${1:-$SCRATCH_DEV}"
> > > +	local scratch_log="none"
> > > +	local scratch_rt="none"
> > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > +
> > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > +
> > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > +}
> > > +
> > >  # modeled after _scratch_xfs_repair
> > >  _test_xfs_repair()
> > >  {
> > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > 
> > Hi Darrick,
> > 
> > Thanks for this improvement.
> > 
> > I'm wondering do we need a separated common file only for xfs metadump
> > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > in common/xfs.
> 
> Yes, that's certainly possible, but keep in mind that common/$FSTYP
> files are getting big:
> 
>    509 fstests/common/overlay
>    523 fstests/common/quota
>    550 fstests/common/reflink
>    638 fstests/common/log
>    640 fstests/common/punch
>    663 fstests/common/filter
>    794 fstests/common/btrfs
>    936 fstests/common/config
>   1030 fstests/common/encrypt
>   1162 fstests/common/populate
>   1519 fstests/common/fuzzy
>   1531 fstests/common/dump
>   2218 fstests/common/xfs
>   5437 fstests/common/rc
> 
> with common/xfs being particularly larger than most everything else.

Haha, maybe we'll have a common/xfs/ directory in one day :)

> 
> Since the common/xfs_metadump_tests functions are shared helper
> functions for testing metadump/mdrestore that are not use by most tests,
> I decided that a split was appropriate both to maintain the (ha!)
> cohesion of common/xfs and not add more bash parsing costs to every
> single testcase.

OK, a split makes sense, but I have 3 questions:
1) Will you move all metadump helpers from common/xfs to this new file?
2) Can we call it common/metadump? (Not sure if any other fs has metadump
   things:)
3) Or move to common/dump directly? (looks not proper ;-)

Thanks,
Zorro

> 
> --D
> 
> > Thanks,
> > Zorro
> > 
> > > new file mode 100644
> > > index 0000000000..dd3dec1fb4
> > > --- /dev/null
> > > +++ b/common/xfs_metadump_tests
> > > @@ -0,0 +1,123 @@
> > > +#
> > > +# XFS specific metadump testing functions.
> > > +#
> > > +
> > > +# Set up environment variables for a metadump test.  Requires the test and
> > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > +_setup_verify_metadump()
> > > +{
> > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > +
> > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > +}
> > > +
> > > +_cleanup_verify_metadump()
> > > +{
> > > +	_scratch_unmount &>> $seqres.full
> > > +
> > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > +		losetup -d "$ldev"
> > > +	done
> > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > +}
> > > +
> > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > +# images and fsck them.
> > > +_verify_metadump_v1()
> > > +{
> > > +	local metadump_args="$1"
> > > +	local extra_test="$2"
> > > +
> > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > +	local version=""
> > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > +	local data_loop
> > > +
> > > +	# Force v1 if we detect v2 support
> > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > +		version="-v 1"
> > > +	fi
> > > +
> > > +	# Capture metadump, which creates metadump_file
> > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > +
> > > +	# Restore metadump, which creates data_img
> > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > +
> > > +	# Create loopdev for data device so we can mount the fs
> > > +	data_loop=$(_create_loop_device $data_img)
> > > +
> > > +	# Mount fs, run an extra test, fsck, and unmount
> > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > +	if [ -n "$extra_test" ]; then
> > > +		SCRATCH_DEV=$data_loop $extra_test
> > > +	fi
> > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > +
> > > +	# Tear down what we created
> > > +	_destroy_loop_device $data_loop
> > > +	rm -f $data_img
> > > +}
> > > +
> > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > +# images and fsck them.
> > > +_verify_metadump_v2()
> > > +{
> > > +	local metadump_args="$1"
> > > +	local extra_test="$2"
> > > +
> > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > +	local version="-v 2"
> > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > +	local data_loop
> > > +	local log_img=""
> > > +	local log_loop
> > > +
> > > +	# Capture metadump, which creates metadump_file
> > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > +
> > > +	#
> > > +	# Metadump v2 files can contain contents dumped from an external log
> > > +	# device. Use a temporary file to hold the log device contents restored
> > > +	# from such a metadump file.
> > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > +
> > > +	# Restore metadump, which creates data_img and log_img
> > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > +		_scratch_xfs_mdrestore $metadump_file
> > > +
> > > +	# Create loopdev for data device so we can mount the fs
> > > +	data_loop=$(_create_loop_device $data_img)
> > > +
> > > +	# Create loopdev for log device if we recovered anything
> > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > +
> > > +	# Mount fs, run an extra test, fsck, and unmount
> > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > +	if [ -n "$extra_test" ]; then
> > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > +	fi
> > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > +
> > > +	# Tear down what we created
> > > +	if [ -b "$log_loop" ]; then
> > > +		_destroy_loop_device $log_loop
> > > +		rm -f $log_img
> > > +	fi
> > > +	_destroy_loop_device $data_loop
> > > +	rm -f $data_img
> > > +}
> > > +
> > > +# Verify both metadump formats if possible
> > > +_verify_metadumps()
> > > +{
> > > +	_verify_metadump_v1 "$@"
> > > +
> > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > +		_verify_metadump_v2 "$@"
> > > +	fi
> > > +}
> > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > index cdac2349df..c3a9bcefee 100755
> > > --- a/tests/xfs/129
> > > +++ b/tests/xfs/129
> > > @@ -16,98 +16,23 @@ _cleanup()
> > >  {
> > >      cd /
> > >      _scratch_unmount > /dev/null 2>&1
> > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > -	    _destroy_loop_device $logdev
> > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > -       $TEST_DIR/log-image
> > > +    _cleanup_verify_metadump
> > > +    rm -rf $tmp.* $testdir
> > >  }
> > >  
> > >  # Import common functions.
> > >  . ./common/filter
> > >  . ./common/reflink
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  # real QA test starts here
> > >  _supported_fs xfs
> > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > >  _require_loop
> > >  _require_scratch_reflink
> > > -
> > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > -
> > > -verify_metadump_v1()
> > > -{
> > > -	local max_version=$1
> > > -	local version=""
> > > -
> > > -	if [[ $max_version == 2 ]]; then
> > > -		version="-v 1"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file $version
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > -		   _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > -
> > > -	logdev=$SCRATCH_LOGDEV
> > > -	[[ -z $logdev ]] && logdev=none
> > > -	_check_xfs_filesystem $datadev $logdev none
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > -
> > > -verify_metadump_v2()
> > > -{
> > > -	version="-v 2"
> > > -
> > > -	_scratch_xfs_metadump $metadump_file $version
> > > -
> > > -	# Metadump v2 files can contain contents dumped from an external log
> > > -	# device. Use a temporary file to hold the log device contents restored
> > > -	# from such a metadump file.
> > > -	slogdev=""
> > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > -		slogdev=$TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > -		   _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	logdev=${SCRATCH_LOGDEV}
> > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > -
> > > -	[[ -z $logdev ]] && logdev=none
> > > -	_check_xfs_filesystem $datadev $logdev none
> > > -
> > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > -		_destroy_loop_device $logdev
> > > -		logdev=""
> > > -		rm -f $TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > +_setup_verify_metadump
> > >  
> > >  _scratch_mkfs >/dev/null 2>&1
> > > -
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > >  _scratch_mount
> > >  
> > >  testdir=$SCRATCH_MNT/test-$seq
> > > @@ -127,12 +52,7 @@ done
> > >  _scratch_unmount
> > >  
> > >  echo "Create metadump file, restore it and check restored fs"
> > > -
> > > -verify_metadump_v1 $max_md_version
> > > -
> > > -if [[ $max_md_version == 2 ]]; then
> > > -	verify_metadump_v2
> > > -fi
> > > +_verify_metadumps
> > >  
> > >  # success, all done
> > >  status=0
> > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > index f4f8af6d3a..8f808c7507 100755
> > > --- a/tests/xfs/234
> > > +++ b/tests/xfs/234
> > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > >  _cleanup()
> > >  {
> > >      cd /
> > > -    _scratch_unmount > /dev/null 2>&1
> > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > -	    _destroy_loop_device $logdev
> > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > -       $TEST_DIR/log-image
> > > +    _cleanup_verify_metadump
> > > +    rm -rf $tmp.* $testdir
> > >  }
> > >  
> > >  # Import common functions.
> > >  . ./common/filter
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  # real QA test starts here
> > >  _supported_fs xfs
> > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > >  _require_loop
> > >  _require_xfs_scratch_rmapbt
> > >  _require_xfs_io_command "fpunch"
> > > -
> > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > -
> > > -verify_metadump_v1()
> > > -{
> > > -	local max_version=$1
> > > -	local version=""
> > > -
> > > -	if [[ $max_version == 2 ]]; then
> > > -		version="-v 1"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file $version
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > -		   _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > -
> > > -	logdev=$SCRATCH_LOGDEV
> > > -	[[ -z $logdev ]] && logdev=none
> > > -	_check_xfs_filesystem $datadev $logdev none
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > -
> > > -verify_metadump_v2()
> > > -{
> > > -	version="-v 2"
> > > -
> > > -	_scratch_xfs_metadump $metadump_file $version
> > > -
> > > -	# Metadump v2 files can contain contents dumped from an external log
> > > -	# device. Use a temporary file to hold the log device contents restored
> > > -	# from such a metadump file.
> > > -	slogdev=""
> > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > -		slogdev=$TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > -		   _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	logdev=${SCRATCH_LOGDEV}
> > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > -
> > > -	[[ -z $logdev ]] && logdev=none
> > > -	_check_xfs_filesystem $datadev $logdev none
> > > -
> > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > -		_destroy_loop_device $logdev
> > > -		logdev=""
> > > -		rm -f $TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > +_setup_verify_metadump
> > >  
> > >  _scratch_mkfs >/dev/null 2>&1
> > > -
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > >  _scratch_mount
> > >  
> > >  testdir=$SCRATCH_MNT/test-$seq
> > > @@ -127,12 +51,7 @@ done
> > >  _scratch_unmount
> > >  
> > >  echo "Create metadump file, restore it and check restored fs"
> > > -
> > > -verify_metadump_v1 $max_md_version
> > > -
> > > -if [[ $max_md_version == 2 ]]; then
> > > -	verify_metadump_v2
> > > -fi
> > > +_verify_metadumps
> > >  
> > >  # success, all done
> > >  status=0
> > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > index 3b567999d8..6623c435e5 100755
> > > --- a/tests/xfs/253
> > > +++ b/tests/xfs/253
> > > @@ -26,23 +26,21 @@ _cleanup()
> > >      cd /
> > >      rm -f $tmp.*
> > >      rm -rf "${OUTPUT_DIR}"
> > > -    rm -f "${METADUMP_FILE}"
> > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > -	    _destroy_loop_device $logdev
> > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > +    _cleanup_verify_metadump
> > >  }
> > >  
> > >  # Import common functions.
> > >  . ./common/filter
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > >  _require_test
> > >  _require_scratch
> > > +_setup_verify_metadump
> > >  
> > >  # real QA test starts here
> > >  
> > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > >  ORPHANAGE="lost+found"
> > >  
> > >  _supported_fs xfs
> > > @@ -52,24 +50,7 @@ function create_file() {
> > >  	touch $(printf "$@")
> > >  }
> > >  
> > > -verify_metadump_v1()
> > > -{
> > > -	local max_version=$1
> > > -	local version=""
> > > -
> > > -	if [[ $max_version == 2 ]]; then
> > > -		version="-v 1"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > -
> > > +extra_test() {
> > >  	cd "${SCRATCH_MNT}"
> > >  
> > >  	# Get a listing of all the files after obfuscation
> > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > >  	ls -R | od -c >> $seqres.full
> > >  
> > >  	cd /
> > > -
> > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > -
> > > -verify_metadump_v2()
> > > -{
> > > -	version="-v 2"
> > > -
> > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > -
> > > -	# Metadump v2 files can contain contents dumped from an external log
> > > -	# device. Use a temporary file to hold the log device contents restored
> > > -	# from such a metadump file.
> > > -	slogdev=""
> > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > -		slogdev=$TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	logdev=${SCRATCH_LOGDEV}
> > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > -
> > > -	cd "${SCRATCH_MNT}"
> > > -
> > > -	# Get a listing of all the files after obfuscation
> > > -	echo "Metadump v2" >> $seqres.full
> > > -	ls -R >> $seqres.full
> > > -	ls -R | od -c >> $seqres.full
> > > -
> > > -	cd /
> > > -
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > -
> > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > -		_destroy_loop_device $logdev
> > > -		logdev=""
> > > -		rm -f $TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > >  }
> > >  
> > >  echo "Disciplyne of silence is goed."
> > > @@ -233,13 +160,7 @@ cd $here
> > >  
> > >  _scratch_unmount
> > >  
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > > -verify_metadump_v1 $max_md_version
> > > -
> > > -if [[ $max_md_version == 2 ]]; then
> > > -	verify_metadump_v2
> > > -fi
> > > +_verify_metadumps '' extra_test
> > >  
> > >  # Finally, re-make the filesystem since to ensure we don't
> > >  # leave a directory with duplicate entries lying around.
> > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > index 1433140821..c475d89ad9 100755
> > > --- a/tests/xfs/291
> > > +++ b/tests/xfs/291
> > > @@ -9,11 +9,21 @@
> > >  . ./common/preamble
> > >  _begin_fstest auto repair metadump
> > >  
> > > +# Override the default cleanup function.
> > > +_cleanup()
> > > +{
> > > +	cd /
> > > +	rm -r -f $tmp.*
> > > +	_cleanup_verify_metadump
> > > +}
> > > +
> > >  # Import common functions.
> > >  . ./common/filter
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  _supported_fs xfs
> > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > +_setup_verify_metadump
> > >  
> > >  # real QA test starts here
> > >  _require_scratch
> > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > >  
> > >  # Yes they can!  Now...
> > >  # Can xfs_metadump cope with this monster?
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > > -for md_version in $(seq 1 $max_md_version); do
> > > -	version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v $md_version"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > -		_fail "xfs_metadump failed"
> > > -
> > > -	slogdev=$SCRATCH_LOGDEV
> > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > -		slogdev=""
> > > -	fi
> > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > -		_fail "xfs_repair of metadump failed"
> > > -done
> > > +_verify_metadumps '-a -o'
> > >  
> > >  # Yes it can; success, all done
> > >  status=0
> > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > index 7e402aa88f..579e1b556a 100755
> > > --- a/tests/xfs/432
> > > +++ b/tests/xfs/432
> > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > >  _cleanup()
> > >  {
> > >  	cd /
> > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > +	rm -f "$tmp".*
> > > +	_cleanup_verify_metadump
> > >  }
> > >  
> > >  # Import common functions.
> > >  . ./common/filter
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  # real QA test starts here
> > >  _supported_fs xfs
> > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > >  _require_scratch
> > > +_setup_verify_metadump
> > >  
> > >  rm -f "$seqres.full"
> > >  
> > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > >  _scratch_mount >> "$seqres.full" 2>&1
> > >  
> > > -metadump_file="$TEST_DIR/meta-$seq"
> > > -metadump_img="$TEST_DIR/img-$seq"
> > > -rm -f $metadump_file $metadump_img
> > >  testdir="$SCRATCH_MNT/test-$seq"
> > >  max_fname_len=255
> > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > >  
> > >  echo "Try to metadump, restore and check restored metadump image"
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > > -for md_version in $(seq 1 $max_md_version); do
> > > -	version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v $md_version"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > -
> > > -	slogdev=$SCRATCH_LOGDEV
> > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > -		slogdev=""
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > -		   _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > -		echo "xfs_repair on restored fs returned $?"
> > > -done
> > > +_verify_metadumps '-a -o -w'
> > >  
> > >  # success, all done
> > >  status=0
> > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > index 8643c3d483..ff6b344a9c 100755
> > > --- a/tests/xfs/503
> > > +++ b/tests/xfs/503
> > > @@ -17,11 +17,13 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	rm -rf $tmp.* $testdir
> > > +	_cleanup_verify_metadump
> > >  }
> > >  
> > >  # Import common functions.
> > >  . ./common/filter
> > >  . ./common/populate
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  testdir=$TEST_DIR/test-$seq
> > >  
> > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > >  _require_populate_commands
> > >  _xfs_skip_online_rebuild
> > >  _xfs_skip_offline_rebuild
> > > +_setup_verify_metadump
> > >  
> > >  echo "Format and populate"
> > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > >  metadump_file=$testdir/scratch.md
> > >  copy_file=$testdir/copy.img
> > >  
> > > -check_restored_metadump_image()
> > > -{
> > > -	local image=$1
> > > -
> > > -	loop_dev=$(_create_loop_device $image)
> > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > -	_destroy_loop_device $loop_dev
> > > -}
> > > -
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > >  echo "metadump and mdrestore"
> > > -for md_version in $(seq 1 $max_md_version); do
> > > -	version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v $md_version"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > -	check_restored_metadump_image $TEST_DIR/image
> > > -done
> > > +_verify_metadumps '-a -o'
> > >  
> > >  echo "metadump a and mdrestore"
> > > -for md_version in $(seq 1 $max_md_version); do
> > > -	version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v $md_version"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > -	check_restored_metadump_image $TEST_DIR/image
> > > -done
> > > +_verify_metadumps '-a'
> > >  
> > >  echo "metadump g and mdrestore"
> > > -for md_version in $(seq 1 $max_md_version); do
> > > -	version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v $md_version"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > -	check_restored_metadump_image $TEST_DIR/image
> > > -done
> > > +_verify_metadumps '-g' >> $seqres.full
> > >  
> > >  echo "metadump ag and mdrestore"
> > > -for md_version in $(seq 1 $max_md_version); do
> > > -	version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v $md_version"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > -	check_restored_metadump_image $TEST_DIR/image
> > > -done
> > > +_verify_metadumps '-a -g' >> $seqres.full
> > >  
> > >  echo copy
> > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > index f2cd7aba98..af917f0f32 100755
> > > --- a/tests/xfs/605
> > > +++ b/tests/xfs/605
> > > @@ -15,17 +15,13 @@ _cleanup()
> > >  {
> > >  	cd /
> > >  	rm -r -f $tmp.*
> > > -	_scratch_unmount > /dev/null 2>&1
> > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > -		_destroy_loop_device $logdev
> > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > -	   $TEST_DIR/log-image
> > > +	_cleanup_verify_metadump
> > >  }
> > >  
> > >  # Import common functions.
> > >  . ./common/dmflakey
> > >  . ./common/inject
> > > +. ./common/xfs_metadump_tests
> > >  
> > >  # real QA test starts here
> > >  _supported_fs xfs
> > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > >  _require_dm_target flakey
> > >  _require_xfs_io_command "pwrite"
> > >  _require_test_program "punch-alternating"
> > > +_setup_verify_metadump
> > >  
> > > -metadump_file=${TEST_DIR}/${seq}.md
> > >  testfile=${SCRATCH_MNT}/testfile
> > >  
> > >  echo "Format filesystem on scratch device"
> > >  _scratch_mkfs >> $seqres.full 2>&1
> > >  
> > > -max_md_version=$(_xfs_metadump_max_version)
> > > -
> > >  external_log=0
> > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > >  	external_log=1
> > >  fi
> > >  
> > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > >  	_notrun "metadump v1 does not support external log device"
> > >  fi
> > >  
> > > -verify_metadump_v1()
> > > -{
> > > -	local version=""
> > > -	if [[ $max_md_version == 2 ]]; then
> > > -		version="-v 1"
> > > -	fi
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > -
> > > -verify_metadump_v2()
> > > -{
> > > -	local version="-v 2"
> > > -
> > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > -
> > > -	# Metadump v2 files can contain contents dumped from an external log
> > > -	# device. Use a temporary file to hold the log device contents restored
> > > -	# from such a metadump file.
> > > -	slogdev=""
> > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > -		slogdev=$TEST_DIR/log-image
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > -		   _scratch_xfs_mdrestore $metadump_file
> > > -
> > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > -
> > > -	logdev=""
> > > -	if [[ -s $slogdev ]]; then
> > > -		logdev=$(_create_loop_device $slogdev)
> > > -	fi
> > > -
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > -
> > > -	if [[ -s $logdev ]]; then
> > > -		_destroy_loop_device $logdev
> > > -		logdev=""
> > > -		rm -f $slogdev
> > > -	fi
> > > -
> > > -	_destroy_loop_device $datadev
> > > -	datadev=""
> > > -	rm -f $TEST_DIR/data-image
> > > -}
> > > -
> > >  echo "Initialize and mount filesystem on flakey device"
> > >  _init_flakey
> > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > >  _print_logstate
> > >  
> > >  echo "Create metadump file, restore it and check restored fs"
> > > -
> > > -if [[ $external_log == 0 ]]; then
> > > -	verify_metadump_v1 $max_md_version
> > > -fi
> > > -
> > > -if [[ $max_md_version == 2 ]]; then
> > > -	verify_metadump_v2
> > > -fi
> > > +_verify_metadumps '-a -o'
> > >  
> > >  # Mount the fs to replay the contents from the dirty log.
> > >  _scratch_mount
> > > 
> > 
>
Darrick J. Wong Jan. 30, 2024, 1:32 a.m. UTC | #5
On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > 
> > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > duplicate copies of the same code.
> > > > 
> > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > 
> > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > ---
> > > >  common/rc                 |   10 ----
> > > >  common/xfs                |   14 +++++
> > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > >  tests/xfs/129             |   90 ++-------------------------------
> > > >  tests/xfs/234             |   91 ++-------------------------------
> > > >  tests/xfs/253             |   89 ++-------------------------------
> > > >  tests/xfs/291             |   31 ++++-------
> > > >  tests/xfs/432             |   30 ++---------
> > > >  tests/xfs/503             |   60 +++-------------------
> > > >  tests/xfs/605             |   84 ++-----------------------------
> > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > >  create mode 100644 common/xfs_metadump_tests
> > > > 
> > > > 
> > > > diff --git a/common/rc b/common/rc
> > > > index 524ffa02aa..0b69f7f54f 100644
> > > > --- a/common/rc
> > > > +++ b/common/rc
> > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > >  
> > > >      case $FSTYP in
> > > >      xfs)
> > > > -	local scratch_log="none"
> > > > -	local scratch_rt="none"
> > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > -
> > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > -
> > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > +	_check_xfs_scratch_fs $device
> > > >  	;;
> > > >      udf)
> > > >  	_check_udf_filesystem $device $udf_fsize
> > > > diff --git a/common/xfs b/common/xfs
> > > > index 248ccefda3..6a48960a7f 100644
> > > > --- a/common/xfs
> > > > +++ b/common/xfs
> > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > >  	return $?
> > > >  }
> > > >  
> > > > +_check_xfs_scratch_fs()
> > > > +{
> > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > +	local scratch_log="none"
> > > > +	local scratch_rt="none"
> > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > +
> > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > +
> > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > +}
> > > > +
> > > >  # modeled after _scratch_xfs_repair
> > > >  _test_xfs_repair()
> > > >  {
> > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > 
> > > Hi Darrick,
> > > 
> > > Thanks for this improvement.
> > > 
> > > I'm wondering do we need a separated common file only for xfs metadump
> > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > in common/xfs.
> > 
> > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > files are getting big:
> > 
> >    509 fstests/common/overlay
> >    523 fstests/common/quota
> >    550 fstests/common/reflink
> >    638 fstests/common/log
> >    640 fstests/common/punch
> >    663 fstests/common/filter
> >    794 fstests/common/btrfs
> >    936 fstests/common/config
> >   1030 fstests/common/encrypt
> >   1162 fstests/common/populate
> >   1519 fstests/common/fuzzy
> >   1531 fstests/common/dump
> >   2218 fstests/common/xfs
> >   5437 fstests/common/rc
> > 
> > with common/xfs being particularly larger than most everything else.
> 
> Haha, maybe we'll have a common/xfs/ directory in one day :)
> 
> > 
> > Since the common/xfs_metadump_tests functions are shared helper
> > functions for testing metadump/mdrestore that are not use by most tests,
> > I decided that a split was appropriate both to maintain the (ha!)
> > cohesion of common/xfs and not add more bash parsing costs to every
> > single testcase.
> 
> OK, a split makes sense, but I have 3 questions:
> 1) Will you move all metadump helpers from common/xfs to this new file?

I don't really want to, because that's another patch and would require
careful auditing of all the tests to find the ones that want to use
metadump but aren't themselves functional tests of metadump.

IOWs, this new file really is for shared metadump functional testing and
not much else.

> 2) Can we call it common/metadump? (Not sure if any other fs has metadump
>    things:)

Yes, e2image does this for ext*.

> 3) Or move to common/dump directly? (looks not proper ;-)

dump != metadump; one is for all the files in the fs and none of the
non-file metadata; the other is for metadata and none of the files.

--D

> Thanks,
> Zorro
> 
> > 
> > --D
> > 
> > > Thanks,
> > > Zorro
> > > 
> > > > new file mode 100644
> > > > index 0000000000..dd3dec1fb4
> > > > --- /dev/null
> > > > +++ b/common/xfs_metadump_tests
> > > > @@ -0,0 +1,123 @@
> > > > +#
> > > > +# XFS specific metadump testing functions.
> > > > +#
> > > > +
> > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > +_setup_verify_metadump()
> > > > +{
> > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > +
> > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > +}
> > > > +
> > > > +_cleanup_verify_metadump()
> > > > +{
> > > > +	_scratch_unmount &>> $seqres.full
> > > > +
> > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > +		losetup -d "$ldev"
> > > > +	done
> > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > +}
> > > > +
> > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > +# images and fsck them.
> > > > +_verify_metadump_v1()
> > > > +{
> > > > +	local metadump_args="$1"
> > > > +	local extra_test="$2"
> > > > +
> > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > +	local version=""
> > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > +	local data_loop
> > > > +
> > > > +	# Force v1 if we detect v2 support
> > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > +		version="-v 1"
> > > > +	fi
> > > > +
> > > > +	# Capture metadump, which creates metadump_file
> > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > +
> > > > +	# Restore metadump, which creates data_img
> > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > +
> > > > +	# Create loopdev for data device so we can mount the fs
> > > > +	data_loop=$(_create_loop_device $data_img)
> > > > +
> > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > +	if [ -n "$extra_test" ]; then
> > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > +	fi
> > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > +
> > > > +	# Tear down what we created
> > > > +	_destroy_loop_device $data_loop
> > > > +	rm -f $data_img
> > > > +}
> > > > +
> > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > +# images and fsck them.
> > > > +_verify_metadump_v2()
> > > > +{
> > > > +	local metadump_args="$1"
> > > > +	local extra_test="$2"
> > > > +
> > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > +	local version="-v 2"
> > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > +	local data_loop
> > > > +	local log_img=""
> > > > +	local log_loop
> > > > +
> > > > +	# Capture metadump, which creates metadump_file
> > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > +
> > > > +	#
> > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > +	# from such a metadump file.
> > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > +
> > > > +	# Restore metadump, which creates data_img and log_img
> > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > +
> > > > +	# Create loopdev for data device so we can mount the fs
> > > > +	data_loop=$(_create_loop_device $data_img)
> > > > +
> > > > +	# Create loopdev for log device if we recovered anything
> > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > +
> > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > +	if [ -n "$extra_test" ]; then
> > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > +	fi
> > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > +
> > > > +	# Tear down what we created
> > > > +	if [ -b "$log_loop" ]; then
> > > > +		_destroy_loop_device $log_loop
> > > > +		rm -f $log_img
> > > > +	fi
> > > > +	_destroy_loop_device $data_loop
> > > > +	rm -f $data_img
> > > > +}
> > > > +
> > > > +# Verify both metadump formats if possible
> > > > +_verify_metadumps()
> > > > +{
> > > > +	_verify_metadump_v1 "$@"
> > > > +
> > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > +		_verify_metadump_v2 "$@"
> > > > +	fi
> > > > +}
> > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > index cdac2349df..c3a9bcefee 100755
> > > > --- a/tests/xfs/129
> > > > +++ b/tests/xfs/129
> > > > @@ -16,98 +16,23 @@ _cleanup()
> > > >  {
> > > >      cd /
> > > >      _scratch_unmount > /dev/null 2>&1
> > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > -	    _destroy_loop_device $logdev
> > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > -       $TEST_DIR/log-image
> > > > +    _cleanup_verify_metadump
> > > > +    rm -rf $tmp.* $testdir
> > > >  }
> > > >  
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > >  . ./common/reflink
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  # real QA test starts here
> > > >  _supported_fs xfs
> > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > >  _require_loop
> > > >  _require_scratch_reflink
> > > > -
> > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > -
> > > > -verify_metadump_v1()
> > > > -{
> > > > -	local max_version=$1
> > > > -	local version=""
> > > > -
> > > > -	if [[ $max_version == 2 ]]; then
> > > > -		version="-v 1"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > -
> > > > -	logdev=$SCRATCH_LOGDEV
> > > > -	[[ -z $logdev ]] && logdev=none
> > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > -
> > > > -verify_metadump_v2()
> > > > -{
> > > > -	version="-v 2"
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > -
> > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > -	# from such a metadump file.
> > > > -	slogdev=""
> > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > -		slogdev=$TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	logdev=${SCRATCH_LOGDEV}
> > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > -
> > > > -	[[ -z $logdev ]] && logdev=none
> > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > -
> > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > -		_destroy_loop_device $logdev
> > > > -		logdev=""
> > > > -		rm -f $TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > +_setup_verify_metadump
> > > >  
> > > >  _scratch_mkfs >/dev/null 2>&1
> > > > -
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > >  _scratch_mount
> > > >  
> > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > @@ -127,12 +52,7 @@ done
> > > >  _scratch_unmount
> > > >  
> > > >  echo "Create metadump file, restore it and check restored fs"
> > > > -
> > > > -verify_metadump_v1 $max_md_version
> > > > -
> > > > -if [[ $max_md_version == 2 ]]; then
> > > > -	verify_metadump_v2
> > > > -fi
> > > > +_verify_metadumps
> > > >  
> > > >  # success, all done
> > > >  status=0
> > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > index f4f8af6d3a..8f808c7507 100755
> > > > --- a/tests/xfs/234
> > > > +++ b/tests/xfs/234
> > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > >  _cleanup()
> > > >  {
> > > >      cd /
> > > > -    _scratch_unmount > /dev/null 2>&1
> > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > -	    _destroy_loop_device $logdev
> > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > -       $TEST_DIR/log-image
> > > > +    _cleanup_verify_metadump
> > > > +    rm -rf $tmp.* $testdir
> > > >  }
> > > >  
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  # real QA test starts here
> > > >  _supported_fs xfs
> > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > >  _require_loop
> > > >  _require_xfs_scratch_rmapbt
> > > >  _require_xfs_io_command "fpunch"
> > > > -
> > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > -
> > > > -verify_metadump_v1()
> > > > -{
> > > > -	local max_version=$1
> > > > -	local version=""
> > > > -
> > > > -	if [[ $max_version == 2 ]]; then
> > > > -		version="-v 1"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > -
> > > > -	logdev=$SCRATCH_LOGDEV
> > > > -	[[ -z $logdev ]] && logdev=none
> > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > -
> > > > -verify_metadump_v2()
> > > > -{
> > > > -	version="-v 2"
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > -
> > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > -	# from such a metadump file.
> > > > -	slogdev=""
> > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > -		slogdev=$TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	logdev=${SCRATCH_LOGDEV}
> > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > -
> > > > -	[[ -z $logdev ]] && logdev=none
> > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > -
> > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > -		_destroy_loop_device $logdev
> > > > -		logdev=""
> > > > -		rm -f $TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > +_setup_verify_metadump
> > > >  
> > > >  _scratch_mkfs >/dev/null 2>&1
> > > > -
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > >  _scratch_mount
> > > >  
> > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > @@ -127,12 +51,7 @@ done
> > > >  _scratch_unmount
> > > >  
> > > >  echo "Create metadump file, restore it and check restored fs"
> > > > -
> > > > -verify_metadump_v1 $max_md_version
> > > > -
> > > > -if [[ $max_md_version == 2 ]]; then
> > > > -	verify_metadump_v2
> > > > -fi
> > > > +_verify_metadumps
> > > >  
> > > >  # success, all done
> > > >  status=0
> > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > index 3b567999d8..6623c435e5 100755
> > > > --- a/tests/xfs/253
> > > > +++ b/tests/xfs/253
> > > > @@ -26,23 +26,21 @@ _cleanup()
> > > >      cd /
> > > >      rm -f $tmp.*
> > > >      rm -rf "${OUTPUT_DIR}"
> > > > -    rm -f "${METADUMP_FILE}"
> > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > -	    _destroy_loop_device $logdev
> > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > +    _cleanup_verify_metadump
> > > >  }
> > > >  
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > >  _require_test
> > > >  _require_scratch
> > > > +_setup_verify_metadump
> > > >  
> > > >  # real QA test starts here
> > > >  
> > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > >  ORPHANAGE="lost+found"
> > > >  
> > > >  _supported_fs xfs
> > > > @@ -52,24 +50,7 @@ function create_file() {
> > > >  	touch $(printf "$@")
> > > >  }
> > > >  
> > > > -verify_metadump_v1()
> > > > -{
> > > > -	local max_version=$1
> > > > -	local version=""
> > > > -
> > > > -	if [[ $max_version == 2 ]]; then
> > > > -		version="-v 1"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > -
> > > > +extra_test() {
> > > >  	cd "${SCRATCH_MNT}"
> > > >  
> > > >  	# Get a listing of all the files after obfuscation
> > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > >  	ls -R | od -c >> $seqres.full
> > > >  
> > > >  	cd /
> > > > -
> > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > -
> > > > -verify_metadump_v2()
> > > > -{
> > > > -	version="-v 2"
> > > > -
> > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > -
> > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > -	# from such a metadump file.
> > > > -	slogdev=""
> > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > -		slogdev=$TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	logdev=${SCRATCH_LOGDEV}
> > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > -
> > > > -	cd "${SCRATCH_MNT}"
> > > > -
> > > > -	# Get a listing of all the files after obfuscation
> > > > -	echo "Metadump v2" >> $seqres.full
> > > > -	ls -R >> $seqres.full
> > > > -	ls -R | od -c >> $seqres.full
> > > > -
> > > > -	cd /
> > > > -
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > -
> > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > -		_destroy_loop_device $logdev
> > > > -		logdev=""
> > > > -		rm -f $TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > >  }
> > > >  
> > > >  echo "Disciplyne of silence is goed."
> > > > @@ -233,13 +160,7 @@ cd $here
> > > >  
> > > >  _scratch_unmount
> > > >  
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > > -verify_metadump_v1 $max_md_version
> > > > -
> > > > -if [[ $max_md_version == 2 ]]; then
> > > > -	verify_metadump_v2
> > > > -fi
> > > > +_verify_metadumps '' extra_test
> > > >  
> > > >  # Finally, re-make the filesystem since to ensure we don't
> > > >  # leave a directory with duplicate entries lying around.
> > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > index 1433140821..c475d89ad9 100755
> > > > --- a/tests/xfs/291
> > > > +++ b/tests/xfs/291
> > > > @@ -9,11 +9,21 @@
> > > >  . ./common/preamble
> > > >  _begin_fstest auto repair metadump
> > > >  
> > > > +# Override the default cleanup function.
> > > > +_cleanup()
> > > > +{
> > > > +	cd /
> > > > +	rm -r -f $tmp.*
> > > > +	_cleanup_verify_metadump
> > > > +}
> > > > +
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  _supported_fs xfs
> > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > +_setup_verify_metadump
> > > >  
> > > >  # real QA test starts here
> > > >  _require_scratch
> > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > >  
> > > >  # Yes they can!  Now...
> > > >  # Can xfs_metadump cope with this monster?
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > > -for md_version in $(seq 1 $max_md_version); do
> > > > -	version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v $md_version"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > -		_fail "xfs_metadump failed"
> > > > -
> > > > -	slogdev=$SCRATCH_LOGDEV
> > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > -		slogdev=""
> > > > -	fi
> > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > -		_fail "xfs_repair of metadump failed"
> > > > -done
> > > > +_verify_metadumps '-a -o'
> > > >  
> > > >  # Yes it can; success, all done
> > > >  status=0
> > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > index 7e402aa88f..579e1b556a 100755
> > > > --- a/tests/xfs/432
> > > > +++ b/tests/xfs/432
> > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > >  _cleanup()
> > > >  {
> > > >  	cd /
> > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > +	rm -f "$tmp".*
> > > > +	_cleanup_verify_metadump
> > > >  }
> > > >  
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  # real QA test starts here
> > > >  _supported_fs xfs
> > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > >  _require_scratch
> > > > +_setup_verify_metadump
> > > >  
> > > >  rm -f "$seqres.full"
> > > >  
> > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > >  
> > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > -rm -f $metadump_file $metadump_img
> > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > >  max_fname_len=255
> > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > >  
> > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > > -for md_version in $(seq 1 $max_md_version); do
> > > > -	version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v $md_version"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > -
> > > > -	slogdev=$SCRATCH_LOGDEV
> > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > -		slogdev=""
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > -		echo "xfs_repair on restored fs returned $?"
> > > > -done
> > > > +_verify_metadumps '-a -o -w'
> > > >  
> > > >  # success, all done
> > > >  status=0
> > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > index 8643c3d483..ff6b344a9c 100755
> > > > --- a/tests/xfs/503
> > > > +++ b/tests/xfs/503
> > > > @@ -17,11 +17,13 @@ _cleanup()
> > > >  {
> > > >  	cd /
> > > >  	rm -rf $tmp.* $testdir
> > > > +	_cleanup_verify_metadump
> > > >  }
> > > >  
> > > >  # Import common functions.
> > > >  . ./common/filter
> > > >  . ./common/populate
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  testdir=$TEST_DIR/test-$seq
> > > >  
> > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > >  _require_populate_commands
> > > >  _xfs_skip_online_rebuild
> > > >  _xfs_skip_offline_rebuild
> > > > +_setup_verify_metadump
> > > >  
> > > >  echo "Format and populate"
> > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > >  metadump_file=$testdir/scratch.md
> > > >  copy_file=$testdir/copy.img
> > > >  
> > > > -check_restored_metadump_image()
> > > > -{
> > > > -	local image=$1
> > > > -
> > > > -	loop_dev=$(_create_loop_device $image)
> > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > -	_destroy_loop_device $loop_dev
> > > > -}
> > > > -
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > >  echo "metadump and mdrestore"
> > > > -for md_version in $(seq 1 $max_md_version); do
> > > > -	version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v $md_version"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > -done
> > > > +_verify_metadumps '-a -o'
> > > >  
> > > >  echo "metadump a and mdrestore"
> > > > -for md_version in $(seq 1 $max_md_version); do
> > > > -	version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v $md_version"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > -done
> > > > +_verify_metadumps '-a'
> > > >  
> > > >  echo "metadump g and mdrestore"
> > > > -for md_version in $(seq 1 $max_md_version); do
> > > > -	version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v $md_version"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > -done
> > > > +_verify_metadumps '-g' >> $seqres.full
> > > >  
> > > >  echo "metadump ag and mdrestore"
> > > > -for md_version in $(seq 1 $max_md_version); do
> > > > -	version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v $md_version"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > -done
> > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > >  
> > > >  echo copy
> > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > index f2cd7aba98..af917f0f32 100755
> > > > --- a/tests/xfs/605
> > > > +++ b/tests/xfs/605
> > > > @@ -15,17 +15,13 @@ _cleanup()
> > > >  {
> > > >  	cd /
> > > >  	rm -r -f $tmp.*
> > > > -	_scratch_unmount > /dev/null 2>&1
> > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > -		_destroy_loop_device $logdev
> > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > -	   $TEST_DIR/log-image
> > > > +	_cleanup_verify_metadump
> > > >  }
> > > >  
> > > >  # Import common functions.
> > > >  . ./common/dmflakey
> > > >  . ./common/inject
> > > > +. ./common/xfs_metadump_tests
> > > >  
> > > >  # real QA test starts here
> > > >  _supported_fs xfs
> > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > >  _require_dm_target flakey
> > > >  _require_xfs_io_command "pwrite"
> > > >  _require_test_program "punch-alternating"
> > > > +_setup_verify_metadump
> > > >  
> > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > >  testfile=${SCRATCH_MNT}/testfile
> > > >  
> > > >  echo "Format filesystem on scratch device"
> > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > >  
> > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > -
> > > >  external_log=0
> > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > >  	external_log=1
> > > >  fi
> > > >  
> > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > >  	_notrun "metadump v1 does not support external log device"
> > > >  fi
> > > >  
> > > > -verify_metadump_v1()
> > > > -{
> > > > -	local version=""
> > > > -	if [[ $max_md_version == 2 ]]; then
> > > > -		version="-v 1"
> > > > -	fi
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > -
> > > > -verify_metadump_v2()
> > > > -{
> > > > -	local version="-v 2"
> > > > -
> > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > -
> > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > -	# from such a metadump file.
> > > > -	slogdev=""
> > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > -		slogdev=$TEST_DIR/log-image
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > -
> > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > -
> > > > -	logdev=""
> > > > -	if [[ -s $slogdev ]]; then
> > > > -		logdev=$(_create_loop_device $slogdev)
> > > > -	fi
> > > > -
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > -
> > > > -	if [[ -s $logdev ]]; then
> > > > -		_destroy_loop_device $logdev
> > > > -		logdev=""
> > > > -		rm -f $slogdev
> > > > -	fi
> > > > -
> > > > -	_destroy_loop_device $datadev
> > > > -	datadev=""
> > > > -	rm -f $TEST_DIR/data-image
> > > > -}
> > > > -
> > > >  echo "Initialize and mount filesystem on flakey device"
> > > >  _init_flakey
> > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > >  _print_logstate
> > > >  
> > > >  echo "Create metadump file, restore it and check restored fs"
> > > > -
> > > > -if [[ $external_log == 0 ]]; then
> > > > -	verify_metadump_v1 $max_md_version
> > > > -fi
> > > > -
> > > > -if [[ $max_md_version == 2 ]]; then
> > > > -	verify_metadump_v2
> > > > -fi
> > > > +_verify_metadumps '-a -o'
> > > >  
> > > >  # Mount the fs to replay the contents from the dirty log.
> > > >  _scratch_mount
> > > > 
> > > 
> > 
> 
>
Zorro Lang Jan. 31, 2024, 2:09 p.m. UTC | #6
On Mon, Jan 29, 2024 at 05:32:07PM -0800, Darrick J. Wong wrote:
> On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> > On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > > 
> > > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > > duplicate copies of the same code.
> > > > > 
> > > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > > 
> > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > > ---
> > > > >  common/rc                 |   10 ----
> > > > >  common/xfs                |   14 +++++
> > > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > > >  tests/xfs/129             |   90 ++-------------------------------
> > > > >  tests/xfs/234             |   91 ++-------------------------------
> > > > >  tests/xfs/253             |   89 ++-------------------------------
> > > > >  tests/xfs/291             |   31 ++++-------
> > > > >  tests/xfs/432             |   30 ++---------
> > > > >  tests/xfs/503             |   60 +++-------------------
> > > > >  tests/xfs/605             |   84 ++-----------------------------
> > > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > > >  create mode 100644 common/xfs_metadump_tests
> > > > > 
> > > > > 
> > > > > diff --git a/common/rc b/common/rc
> > > > > index 524ffa02aa..0b69f7f54f 100644
> > > > > --- a/common/rc
> > > > > +++ b/common/rc
> > > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > > >  
> > > > >      case $FSTYP in
> > > > >      xfs)
> > > > > -	local scratch_log="none"
> > > > > -	local scratch_rt="none"
> > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > > -
> > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > > -
> > > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > +	_check_xfs_scratch_fs $device
> > > > >  	;;
> > > > >      udf)
> > > > >  	_check_udf_filesystem $device $udf_fsize
> > > > > diff --git a/common/xfs b/common/xfs
> > > > > index 248ccefda3..6a48960a7f 100644
> > > > > --- a/common/xfs
> > > > > +++ b/common/xfs
> > > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > > >  	return $?
> > > > >  }
> > > > >  
> > > > > +_check_xfs_scratch_fs()
> > > > > +{
> > > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > > +	local scratch_log="none"
> > > > > +	local scratch_rt="none"
> > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > > +
> > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > > +
> > > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > +}
> > > > > +
> > > > >  # modeled after _scratch_xfs_repair
> > > > >  _test_xfs_repair()
> > > > >  {
> > > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > > 
> > > > Hi Darrick,
> > > > 
> > > > Thanks for this improvement.
> > > > 
> > > > I'm wondering do we need a separated common file only for xfs metadump
> > > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > > in common/xfs.
> > > 
> > > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > > files are getting big:
> > > 
> > >    509 fstests/common/overlay
> > >    523 fstests/common/quota
> > >    550 fstests/common/reflink
> > >    638 fstests/common/log
> > >    640 fstests/common/punch
> > >    663 fstests/common/filter
> > >    794 fstests/common/btrfs
> > >    936 fstests/common/config
> > >   1030 fstests/common/encrypt
> > >   1162 fstests/common/populate
> > >   1519 fstests/common/fuzzy
> > >   1531 fstests/common/dump
> > >   2218 fstests/common/xfs
> > >   5437 fstests/common/rc
> > > 
> > > with common/xfs being particularly larger than most everything else.
> > 
> > Haha, maybe we'll have a common/xfs/ directory in one day :)
> > 
> > > 
> > > Since the common/xfs_metadump_tests functions are shared helper
> > > functions for testing metadump/mdrestore that are not use by most tests,
> > > I decided that a split was appropriate both to maintain the (ha!)
> > > cohesion of common/xfs and not add more bash parsing costs to every
> > > single testcase.
> > 
> > OK, a split makes sense, but I have 3 questions:
> > 1) Will you move all metadump helpers from common/xfs to this new file?
> 
> I don't really want to, because that's another patch and would require
> careful auditing of all the tests to find the ones that want to use
> metadump but aren't themselves functional tests of metadump.
> 
> IOWs, this new file really is for shared metadump functional testing and
> not much else.

OK, I think we can care about this part step by step in the future.

> 
> > 2) Can we call it common/metadump? (Not sure if any other fs has metadump
> >    things:)
> 
> Yes, e2image does this for ext*.

OK, I'll rename this file to common/metadump, and change other patches to
souce the new name when I merge this patchset. Is that good to you?

Thanks,
Zorro

> 
> > 3) Or move to common/dump directly? (looks not proper ;-)
> 
> dump != metadump; one is for all the files in the fs and none of the
> non-file metadata; the other is for metadata and none of the files.
> 
> --D
> 
> > Thanks,
> > Zorro
> > 
> > > 
> > > --D
> > > 
> > > > Thanks,
> > > > Zorro
> > > > 
> > > > > new file mode 100644
> > > > > index 0000000000..dd3dec1fb4
> > > > > --- /dev/null
> > > > > +++ b/common/xfs_metadump_tests
> > > > > @@ -0,0 +1,123 @@
> > > > > +#
> > > > > +# XFS specific metadump testing functions.
> > > > > +#
> > > > > +
> > > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > > +_setup_verify_metadump()
> > > > > +{
> > > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > > +
> > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > +}
> > > > > +
> > > > > +_cleanup_verify_metadump()
> > > > > +{
> > > > > +	_scratch_unmount &>> $seqres.full
> > > > > +
> > > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > > +		losetup -d "$ldev"
> > > > > +	done
> > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > +}
> > > > > +
> > > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > > +# images and fsck them.
> > > > > +_verify_metadump_v1()
> > > > > +{
> > > > > +	local metadump_args="$1"
> > > > > +	local extra_test="$2"
> > > > > +
> > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > +	local version=""
> > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > +	local data_loop
> > > > > +
> > > > > +	# Force v1 if we detect v2 support
> > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > > +		version="-v 1"
> > > > > +	fi
> > > > > +
> > > > > +	# Capture metadump, which creates metadump_file
> > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > +
> > > > > +	# Restore metadump, which creates data_img
> > > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > > +
> > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > +
> > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > > +	if [ -n "$extra_test" ]; then
> > > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > > +	fi
> > > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > +
> > > > > +	# Tear down what we created
> > > > > +	_destroy_loop_device $data_loop
> > > > > +	rm -f $data_img
> > > > > +}
> > > > > +
> > > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > > +# images and fsck them.
> > > > > +_verify_metadump_v2()
> > > > > +{
> > > > > +	local metadump_args="$1"
> > > > > +	local extra_test="$2"
> > > > > +
> > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > +	local version="-v 2"
> > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > +	local data_loop
> > > > > +	local log_img=""
> > > > > +	local log_loop
> > > > > +
> > > > > +	# Capture metadump, which creates metadump_file
> > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > +
> > > > > +	#
> > > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > > +	# from such a metadump file.
> > > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > > +
> > > > > +	# Restore metadump, which creates data_img and log_img
> > > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > > +
> > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > +
> > > > > +	# Create loopdev for log device if we recovered anything
> > > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > > +
> > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > > +	if [ -n "$extra_test" ]; then
> > > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > > +	fi
> > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > +
> > > > > +	# Tear down what we created
> > > > > +	if [ -b "$log_loop" ]; then
> > > > > +		_destroy_loop_device $log_loop
> > > > > +		rm -f $log_img
> > > > > +	fi
> > > > > +	_destroy_loop_device $data_loop
> > > > > +	rm -f $data_img
> > > > > +}
> > > > > +
> > > > > +# Verify both metadump formats if possible
> > > > > +_verify_metadumps()
> > > > > +{
> > > > > +	_verify_metadump_v1 "$@"
> > > > > +
> > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > > +		_verify_metadump_v2 "$@"
> > > > > +	fi
> > > > > +}
> > > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > > index cdac2349df..c3a9bcefee 100755
> > > > > --- a/tests/xfs/129
> > > > > +++ b/tests/xfs/129
> > > > > @@ -16,98 +16,23 @@ _cleanup()
> > > > >  {
> > > > >      cd /
> > > > >      _scratch_unmount > /dev/null 2>&1
> > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > -	    _destroy_loop_device $logdev
> > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > > -       $TEST_DIR/log-image
> > > > > +    _cleanup_verify_metadump
> > > > > +    rm -rf $tmp.* $testdir
> > > > >  }
> > > > >  
> > > > >  # Import common functions.
> > > > >  . ./common/filter
> > > > >  . ./common/reflink
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  # real QA test starts here
> > > > >  _supported_fs xfs
> > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > >  _require_loop
> > > > >  _require_scratch_reflink
> > > > > -
> > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > -
> > > > > -verify_metadump_v1()
> > > > > -{
> > > > > -	local max_version=$1
> > > > > -	local version=""
> > > > > -
> > > > > -	if [[ $max_version == 2 ]]; then
> > > > > -		version="-v 1"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > -
> > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > -
> > > > > -verify_metadump_v2()
> > > > > -{
> > > > > -	version="-v 2"
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > -
> > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > -	# from such a metadump file.
> > > > > -	slogdev=""
> > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > -		slogdev=$TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > -
> > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > -
> > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > -		_destroy_loop_device $logdev
> > > > > -		logdev=""
> > > > > -		rm -f $TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > +_setup_verify_metadump
> > > > >  
> > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > -
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > >  _scratch_mount
> > > > >  
> > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > @@ -127,12 +52,7 @@ done
> > > > >  _scratch_unmount
> > > > >  
> > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > -
> > > > > -verify_metadump_v1 $max_md_version
> > > > > -
> > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > -	verify_metadump_v2
> > > > > -fi
> > > > > +_verify_metadumps
> > > > >  
> > > > >  # success, all done
> > > > >  status=0
> > > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > > index f4f8af6d3a..8f808c7507 100755
> > > > > --- a/tests/xfs/234
> > > > > +++ b/tests/xfs/234
> > > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > > >  _cleanup()
> > > > >  {
> > > > >      cd /
> > > > > -    _scratch_unmount > /dev/null 2>&1
> > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > -	    _destroy_loop_device $logdev
> > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > > -       $TEST_DIR/log-image
> > > > > +    _cleanup_verify_metadump
> > > > > +    rm -rf $tmp.* $testdir
> > > > >  }
> > > > >  
> > > > >  # Import common functions.
> > > > >  . ./common/filter
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  # real QA test starts here
> > > > >  _supported_fs xfs
> > > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > >  _require_loop
> > > > >  _require_xfs_scratch_rmapbt
> > > > >  _require_xfs_io_command "fpunch"
> > > > > -
> > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > -
> > > > > -verify_metadump_v1()
> > > > > -{
> > > > > -	local max_version=$1
> > > > > -	local version=""
> > > > > -
> > > > > -	if [[ $max_version == 2 ]]; then
> > > > > -		version="-v 1"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > -
> > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > -
> > > > > -verify_metadump_v2()
> > > > > -{
> > > > > -	version="-v 2"
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > -
> > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > -	# from such a metadump file.
> > > > > -	slogdev=""
> > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > -		slogdev=$TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > -
> > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > -
> > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > -		_destroy_loop_device $logdev
> > > > > -		logdev=""
> > > > > -		rm -f $TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > +_setup_verify_metadump
> > > > >  
> > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > -
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > >  _scratch_mount
> > > > >  
> > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > @@ -127,12 +51,7 @@ done
> > > > >  _scratch_unmount
> > > > >  
> > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > -
> > > > > -verify_metadump_v1 $max_md_version
> > > > > -
> > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > -	verify_metadump_v2
> > > > > -fi
> > > > > +_verify_metadumps
> > > > >  
> > > > >  # success, all done
> > > > >  status=0
> > > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > > index 3b567999d8..6623c435e5 100755
> > > > > --- a/tests/xfs/253
> > > > > +++ b/tests/xfs/253
> > > > > @@ -26,23 +26,21 @@ _cleanup()
> > > > >      cd /
> > > > >      rm -f $tmp.*
> > > > >      rm -rf "${OUTPUT_DIR}"
> > > > > -    rm -f "${METADUMP_FILE}"
> > > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > -	    _destroy_loop_device $logdev
> > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > +    _cleanup_verify_metadump
> > > > >  }
> > > > >  
> > > > >  # Import common functions.
> > > > >  . ./common/filter
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > >  _require_test
> > > > >  _require_scratch
> > > > > +_setup_verify_metadump
> > > > >  
> > > > >  # real QA test starts here
> > > > >  
> > > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > > >  ORPHANAGE="lost+found"
> > > > >  
> > > > >  _supported_fs xfs
> > > > > @@ -52,24 +50,7 @@ function create_file() {
> > > > >  	touch $(printf "$@")
> > > > >  }
> > > > >  
> > > > > -verify_metadump_v1()
> > > > > -{
> > > > > -	local max_version=$1
> > > > > -	local version=""
> > > > > -
> > > > > -	if [[ $max_version == 2 ]]; then
> > > > > -		version="-v 1"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > -
> > > > > +extra_test() {
> > > > >  	cd "${SCRATCH_MNT}"
> > > > >  
> > > > >  	# Get a listing of all the files after obfuscation
> > > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > > >  	ls -R | od -c >> $seqres.full
> > > > >  
> > > > >  	cd /
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > -
> > > > > -verify_metadump_v2()
> > > > > -{
> > > > > -	version="-v 2"
> > > > > -
> > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > -
> > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > -	# from such a metadump file.
> > > > > -	slogdev=""
> > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > -		slogdev=$TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > -
> > > > > -	cd "${SCRATCH_MNT}"
> > > > > -
> > > > > -	# Get a listing of all the files after obfuscation
> > > > > -	echo "Metadump v2" >> $seqres.full
> > > > > -	ls -R >> $seqres.full
> > > > > -	ls -R | od -c >> $seqres.full
> > > > > -
> > > > > -	cd /
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > -
> > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > -		_destroy_loop_device $logdev
> > > > > -		logdev=""
> > > > > -		rm -f $TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > >  }
> > > > >  
> > > > >  echo "Disciplyne of silence is goed."
> > > > > @@ -233,13 +160,7 @@ cd $here
> > > > >  
> > > > >  _scratch_unmount
> > > > >  
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > > -verify_metadump_v1 $max_md_version
> > > > > -
> > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > -	verify_metadump_v2
> > > > > -fi
> > > > > +_verify_metadumps '' extra_test
> > > > >  
> > > > >  # Finally, re-make the filesystem since to ensure we don't
> > > > >  # leave a directory with duplicate entries lying around.
> > > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > > index 1433140821..c475d89ad9 100755
> > > > > --- a/tests/xfs/291
> > > > > +++ b/tests/xfs/291
> > > > > @@ -9,11 +9,21 @@
> > > > >  . ./common/preamble
> > > > >  _begin_fstest auto repair metadump
> > > > >  
> > > > > +# Override the default cleanup function.
> > > > > +_cleanup()
> > > > > +{
> > > > > +	cd /
> > > > > +	rm -r -f $tmp.*
> > > > > +	_cleanup_verify_metadump
> > > > > +}
> > > > > +
> > > > >  # Import common functions.
> > > > >  . ./common/filter
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  _supported_fs xfs
> > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > +_setup_verify_metadump
> > > > >  
> > > > >  # real QA test starts here
> > > > >  _require_scratch
> > > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > > >  
> > > > >  # Yes they can!  Now...
> > > > >  # Can xfs_metadump cope with this monster?
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > -	version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v $md_version"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > > -		_fail "xfs_metadump failed"
> > > > > -
> > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > -		slogdev=""
> > > > > -	fi
> > > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > > -		_fail "xfs_repair of metadump failed"
> > > > > -done
> > > > > +_verify_metadumps '-a -o'
> > > > >  
> > > > >  # Yes it can; success, all done
> > > > >  status=0
> > > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > > index 7e402aa88f..579e1b556a 100755
> > > > > --- a/tests/xfs/432
> > > > > +++ b/tests/xfs/432
> > > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > > >  _cleanup()
> > > > >  {
> > > > >  	cd /
> > > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > > +	rm -f "$tmp".*
> > > > > +	_cleanup_verify_metadump
> > > > >  }
> > > > >  
> > > > >  # Import common functions.
> > > > >  . ./common/filter
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  # real QA test starts here
> > > > >  _supported_fs xfs
> > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > >  _require_scratch
> > > > > +_setup_verify_metadump
> > > > >  
> > > > >  rm -f "$seqres.full"
> > > > >  
> > > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > > >  
> > > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > > -rm -f $metadump_file $metadump_img
> > > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > > >  max_fname_len=255
> > > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > > >  
> > > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > -	version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v $md_version"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > > -
> > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > -		slogdev=""
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > > -		echo "xfs_repair on restored fs returned $?"
> > > > > -done
> > > > > +_verify_metadumps '-a -o -w'
> > > > >  
> > > > >  # success, all done
> > > > >  status=0
> > > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > > index 8643c3d483..ff6b344a9c 100755
> > > > > --- a/tests/xfs/503
> > > > > +++ b/tests/xfs/503
> > > > > @@ -17,11 +17,13 @@ _cleanup()
> > > > >  {
> > > > >  	cd /
> > > > >  	rm -rf $tmp.* $testdir
> > > > > +	_cleanup_verify_metadump
> > > > >  }
> > > > >  
> > > > >  # Import common functions.
> > > > >  . ./common/filter
> > > > >  . ./common/populate
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  testdir=$TEST_DIR/test-$seq
> > > > >  
> > > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > > >  _require_populate_commands
> > > > >  _xfs_skip_online_rebuild
> > > > >  _xfs_skip_offline_rebuild
> > > > > +_setup_verify_metadump
> > > > >  
> > > > >  echo "Format and populate"
> > > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > > >  metadump_file=$testdir/scratch.md
> > > > >  copy_file=$testdir/copy.img
> > > > >  
> > > > > -check_restored_metadump_image()
> > > > > -{
> > > > > -	local image=$1
> > > > > -
> > > > > -	loop_dev=$(_create_loop_device $image)
> > > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > > -	_destroy_loop_device $loop_dev
> > > > > -}
> > > > > -
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > >  echo "metadump and mdrestore"
> > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > -	version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v $md_version"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > -done
> > > > > +_verify_metadumps '-a -o'
> > > > >  
> > > > >  echo "metadump a and mdrestore"
> > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > -	version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v $md_version"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > -done
> > > > > +_verify_metadumps '-a'
> > > > >  
> > > > >  echo "metadump g and mdrestore"
> > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > -	version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v $md_version"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > -done
> > > > > +_verify_metadumps '-g' >> $seqres.full
> > > > >  
> > > > >  echo "metadump ag and mdrestore"
> > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > -	version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v $md_version"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > -done
> > > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > > >  
> > > > >  echo copy
> > > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > > index f2cd7aba98..af917f0f32 100755
> > > > > --- a/tests/xfs/605
> > > > > +++ b/tests/xfs/605
> > > > > @@ -15,17 +15,13 @@ _cleanup()
> > > > >  {
> > > > >  	cd /
> > > > >  	rm -r -f $tmp.*
> > > > > -	_scratch_unmount > /dev/null 2>&1
> > > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > -		_destroy_loop_device $logdev
> > > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > > -	   $TEST_DIR/log-image
> > > > > +	_cleanup_verify_metadump
> > > > >  }
> > > > >  
> > > > >  # Import common functions.
> > > > >  . ./common/dmflakey
> > > > >  . ./common/inject
> > > > > +. ./common/xfs_metadump_tests
> > > > >  
> > > > >  # real QA test starts here
> > > > >  _supported_fs xfs
> > > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > > >  _require_dm_target flakey
> > > > >  _require_xfs_io_command "pwrite"
> > > > >  _require_test_program "punch-alternating"
> > > > > +_setup_verify_metadump
> > > > >  
> > > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > > >  testfile=${SCRATCH_MNT}/testfile
> > > > >  
> > > > >  echo "Format filesystem on scratch device"
> > > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > > >  
> > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > -
> > > > >  external_log=0
> > > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > > >  	external_log=1
> > > > >  fi
> > > > >  
> > > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > > >  	_notrun "metadump v1 does not support external log device"
> > > > >  fi
> > > > >  
> > > > > -verify_metadump_v1()
> > > > > -{
> > > > > -	local version=""
> > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > -		version="-v 1"
> > > > > -	fi
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > -
> > > > > -verify_metadump_v2()
> > > > > -{
> > > > > -	local version="-v 2"
> > > > > -
> > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > -
> > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > -	# from such a metadump file.
> > > > > -	slogdev=""
> > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > -		slogdev=$TEST_DIR/log-image
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > -
> > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > -
> > > > > -	logdev=""
> > > > > -	if [[ -s $slogdev ]]; then
> > > > > -		logdev=$(_create_loop_device $slogdev)
> > > > > -	fi
> > > > > -
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > -
> > > > > -	if [[ -s $logdev ]]; then
> > > > > -		_destroy_loop_device $logdev
> > > > > -		logdev=""
> > > > > -		rm -f $slogdev
> > > > > -	fi
> > > > > -
> > > > > -	_destroy_loop_device $datadev
> > > > > -	datadev=""
> > > > > -	rm -f $TEST_DIR/data-image
> > > > > -}
> > > > > -
> > > > >  echo "Initialize and mount filesystem on flakey device"
> > > > >  _init_flakey
> > > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > > >  _print_logstate
> > > > >  
> > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > -
> > > > > -if [[ $external_log == 0 ]]; then
> > > > > -	verify_metadump_v1 $max_md_version
> > > > > -fi
> > > > > -
> > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > -	verify_metadump_v2
> > > > > -fi
> > > > > +_verify_metadumps '-a -o'
> > > > >  
> > > > >  # Mount the fs to replay the contents from the dirty log.
> > > > >  _scratch_mount
> > > > > 
> > > > 
> > > 
> > 
> > 
>
Darrick J. Wong Jan. 31, 2024, 7:24 p.m. UTC | #7
On Wed, Jan 31, 2024 at 10:09:19PM +0800, Zorro Lang wrote:
> On Mon, Jan 29, 2024 at 05:32:07PM -0800, Darrick J. Wong wrote:
> > On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> > > On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > > > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > > > 
> > > > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > > > duplicate copies of the same code.
> > > > > > 
> > > > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > > > 
> > > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > > > ---
> > > > > >  common/rc                 |   10 ----
> > > > > >  common/xfs                |   14 +++++
> > > > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > >  tests/xfs/129             |   90 ++-------------------------------
> > > > > >  tests/xfs/234             |   91 ++-------------------------------
> > > > > >  tests/xfs/253             |   89 ++-------------------------------
> > > > > >  tests/xfs/291             |   31 ++++-------
> > > > > >  tests/xfs/432             |   30 ++---------
> > > > > >  tests/xfs/503             |   60 +++-------------------
> > > > > >  tests/xfs/605             |   84 ++-----------------------------
> > > > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > > > >  create mode 100644 common/xfs_metadump_tests
> > > > > > 
> > > > > > 
> > > > > > diff --git a/common/rc b/common/rc
> > > > > > index 524ffa02aa..0b69f7f54f 100644
> > > > > > --- a/common/rc
> > > > > > +++ b/common/rc
> > > > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > > > >  
> > > > > >      case $FSTYP in
> > > > > >      xfs)
> > > > > > -	local scratch_log="none"
> > > > > > -	local scratch_rt="none"
> > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > -
> > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > -
> > > > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > +	_check_xfs_scratch_fs $device
> > > > > >  	;;
> > > > > >      udf)
> > > > > >  	_check_udf_filesystem $device $udf_fsize
> > > > > > diff --git a/common/xfs b/common/xfs
> > > > > > index 248ccefda3..6a48960a7f 100644
> > > > > > --- a/common/xfs
> > > > > > +++ b/common/xfs
> > > > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > > > >  	return $?
> > > > > >  }
> > > > > >  
> > > > > > +_check_xfs_scratch_fs()
> > > > > > +{
> > > > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > > > +	local scratch_log="none"
> > > > > > +	local scratch_rt="none"
> > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > +
> > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > +
> > > > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > +}
> > > > > > +
> > > > > >  # modeled after _scratch_xfs_repair
> > > > > >  _test_xfs_repair()
> > > > > >  {
> > > > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > > > 
> > > > > Hi Darrick,
> > > > > 
> > > > > Thanks for this improvement.
> > > > > 
> > > > > I'm wondering do we need a separated common file only for xfs metadump
> > > > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > > > in common/xfs.
> > > > 
> > > > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > > > files are getting big:
> > > > 
> > > >    509 fstests/common/overlay
> > > >    523 fstests/common/quota
> > > >    550 fstests/common/reflink
> > > >    638 fstests/common/log
> > > >    640 fstests/common/punch
> > > >    663 fstests/common/filter
> > > >    794 fstests/common/btrfs
> > > >    936 fstests/common/config
> > > >   1030 fstests/common/encrypt
> > > >   1162 fstests/common/populate
> > > >   1519 fstests/common/fuzzy
> > > >   1531 fstests/common/dump
> > > >   2218 fstests/common/xfs
> > > >   5437 fstests/common/rc
> > > > 
> > > > with common/xfs being particularly larger than most everything else.
> > > 
> > > Haha, maybe we'll have a common/xfs/ directory in one day :)
> > > 
> > > > 
> > > > Since the common/xfs_metadump_tests functions are shared helper
> > > > functions for testing metadump/mdrestore that are not use by most tests,
> > > > I decided that a split was appropriate both to maintain the (ha!)
> > > > cohesion of common/xfs and not add more bash parsing costs to every
> > > > single testcase.
> > > 
> > > OK, a split makes sense, but I have 3 questions:
> > > 1) Will you move all metadump helpers from common/xfs to this new file?
> > 
> > I don't really want to, because that's another patch and would require
> > careful auditing of all the tests to find the ones that want to use
> > metadump but aren't themselves functional tests of metadump.
> > 
> > IOWs, this new file really is for shared metadump functional testing and
> > not much else.
> 
> OK, I think we can care about this part step by step in the future.

<nod>

> > 
> > > 2) Can we call it common/metadump? (Not sure if any other fs has metadump
> > >    things:)
> > 
> > Yes, e2image does this for ext*.
> 
> OK, I'll rename this file to common/metadump, and change other patches to
> souce the new name when I merge this patchset. Is that good to you?

Sorry, I realized that my statement was ambiguous -- the "yes" applies
to "Not sure if any other fs has metadump things", not "Can we call it
common/metadump?".  The code in common/xfs_metadump_tests is specific to
xfs and is not used for e2image testing, so let's leave the name as-is.

--D

> Thanks,
> Zorro
> 
> > 
> > > 3) Or move to common/dump directly? (looks not proper ;-)
> > 
> > dump != metadump; one is for all the files in the fs and none of the
> > non-file metadata; the other is for metadata and none of the files.
> > 
> > --D
> > 
> > > Thanks,
> > > Zorro
> > > 
> > > > 
> > > > --D
> > > > 
> > > > > Thanks,
> > > > > Zorro
> > > > > 
> > > > > > new file mode 100644
> > > > > > index 0000000000..dd3dec1fb4
> > > > > > --- /dev/null
> > > > > > +++ b/common/xfs_metadump_tests
> > > > > > @@ -0,0 +1,123 @@
> > > > > > +#
> > > > > > +# XFS specific metadump testing functions.
> > > > > > +#
> > > > > > +
> > > > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > > > +_setup_verify_metadump()
> > > > > > +{
> > > > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > > > +
> > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > +}
> > > > > > +
> > > > > > +_cleanup_verify_metadump()
> > > > > > +{
> > > > > > +	_scratch_unmount &>> $seqres.full
> > > > > > +
> > > > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > > > +		losetup -d "$ldev"
> > > > > > +	done
> > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > +}
> > > > > > +
> > > > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > > > +# images and fsck them.
> > > > > > +_verify_metadump_v1()
> > > > > > +{
> > > > > > +	local metadump_args="$1"
> > > > > > +	local extra_test="$2"
> > > > > > +
> > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > +	local version=""
> > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > +	local data_loop
> > > > > > +
> > > > > > +	# Force v1 if we detect v2 support
> > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > > > +		version="-v 1"
> > > > > > +	fi
> > > > > > +
> > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > +
> > > > > > +	# Restore metadump, which creates data_img
> > > > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > > > +
> > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > +
> > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > > > +	fi
> > > > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > +
> > > > > > +	# Tear down what we created
> > > > > > +	_destroy_loop_device $data_loop
> > > > > > +	rm -f $data_img
> > > > > > +}
> > > > > > +
> > > > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > > > +# images and fsck them.
> > > > > > +_verify_metadump_v2()
> > > > > > +{
> > > > > > +	local metadump_args="$1"
> > > > > > +	local extra_test="$2"
> > > > > > +
> > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > +	local version="-v 2"
> > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > +	local data_loop
> > > > > > +	local log_img=""
> > > > > > +	local log_loop
> > > > > > +
> > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > +
> > > > > > +	#
> > > > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > > > +	# from such a metadump file.
> > > > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > > > +
> > > > > > +	# Restore metadump, which creates data_img and log_img
> > > > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > > > +
> > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > +
> > > > > > +	# Create loopdev for log device if we recovered anything
> > > > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > > > +
> > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > > > +	fi
> > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > +
> > > > > > +	# Tear down what we created
> > > > > > +	if [ -b "$log_loop" ]; then
> > > > > > +		_destroy_loop_device $log_loop
> > > > > > +		rm -f $log_img
> > > > > > +	fi
> > > > > > +	_destroy_loop_device $data_loop
> > > > > > +	rm -f $data_img
> > > > > > +}
> > > > > > +
> > > > > > +# Verify both metadump formats if possible
> > > > > > +_verify_metadumps()
> > > > > > +{
> > > > > > +	_verify_metadump_v1 "$@"
> > > > > > +
> > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > > > +		_verify_metadump_v2 "$@"
> > > > > > +	fi
> > > > > > +}
> > > > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > > > index cdac2349df..c3a9bcefee 100755
> > > > > > --- a/tests/xfs/129
> > > > > > +++ b/tests/xfs/129
> > > > > > @@ -16,98 +16,23 @@ _cleanup()
> > > > > >  {
> > > > > >      cd /
> > > > > >      _scratch_unmount > /dev/null 2>&1
> > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > -	    _destroy_loop_device $logdev
> > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > > > -       $TEST_DIR/log-image
> > > > > > +    _cleanup_verify_metadump
> > > > > > +    rm -rf $tmp.* $testdir
> > > > > >  }
> > > > > >  
> > > > > >  # Import common functions.
> > > > > >  . ./common/filter
> > > > > >  . ./common/reflink
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  # real QA test starts here
> > > > > >  _supported_fs xfs
> > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > >  _require_loop
> > > > > >  _require_scratch_reflink
> > > > > > -
> > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > -
> > > > > > -verify_metadump_v1()
> > > > > > -{
> > > > > > -	local max_version=$1
> > > > > > -	local version=""
> > > > > > -
> > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > -		version="-v 1"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > -
> > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > -
> > > > > > -verify_metadump_v2()
> > > > > > -{
> > > > > > -	version="-v 2"
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > -
> > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > -	# from such a metadump file.
> > > > > > -	slogdev=""
> > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > -
> > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > -
> > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > -		_destroy_loop_device $logdev
> > > > > > -		logdev=""
> > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > -
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > >  _scratch_mount
> > > > > >  
> > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > @@ -127,12 +52,7 @@ done
> > > > > >  _scratch_unmount
> > > > > >  
> > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > -
> > > > > > -verify_metadump_v1 $max_md_version
> > > > > > -
> > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > -	verify_metadump_v2
> > > > > > -fi
> > > > > > +_verify_metadumps
> > > > > >  
> > > > > >  # success, all done
> > > > > >  status=0
> > > > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > > > index f4f8af6d3a..8f808c7507 100755
> > > > > > --- a/tests/xfs/234
> > > > > > +++ b/tests/xfs/234
> > > > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > > > >  _cleanup()
> > > > > >  {
> > > > > >      cd /
> > > > > > -    _scratch_unmount > /dev/null 2>&1
> > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > -	    _destroy_loop_device $logdev
> > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > > > -       $TEST_DIR/log-image
> > > > > > +    _cleanup_verify_metadump
> > > > > > +    rm -rf $tmp.* $testdir
> > > > > >  }
> > > > > >  
> > > > > >  # Import common functions.
> > > > > >  . ./common/filter
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  # real QA test starts here
> > > > > >  _supported_fs xfs
> > > > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > >  _require_loop
> > > > > >  _require_xfs_scratch_rmapbt
> > > > > >  _require_xfs_io_command "fpunch"
> > > > > > -
> > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > -
> > > > > > -verify_metadump_v1()
> > > > > > -{
> > > > > > -	local max_version=$1
> > > > > > -	local version=""
> > > > > > -
> > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > -		version="-v 1"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > -
> > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > -
> > > > > > -verify_metadump_v2()
> > > > > > -{
> > > > > > -	version="-v 2"
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > -
> > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > -	# from such a metadump file.
> > > > > > -	slogdev=""
> > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > -
> > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > -
> > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > -		_destroy_loop_device $logdev
> > > > > > -		logdev=""
> > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > -
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > >  _scratch_mount
> > > > > >  
> > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > @@ -127,12 +51,7 @@ done
> > > > > >  _scratch_unmount
> > > > > >  
> > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > -
> > > > > > -verify_metadump_v1 $max_md_version
> > > > > > -
> > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > -	verify_metadump_v2
> > > > > > -fi
> > > > > > +_verify_metadumps
> > > > > >  
> > > > > >  # success, all done
> > > > > >  status=0
> > > > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > > > index 3b567999d8..6623c435e5 100755
> > > > > > --- a/tests/xfs/253
> > > > > > +++ b/tests/xfs/253
> > > > > > @@ -26,23 +26,21 @@ _cleanup()
> > > > > >      cd /
> > > > > >      rm -f $tmp.*
> > > > > >      rm -rf "${OUTPUT_DIR}"
> > > > > > -    rm -f "${METADUMP_FILE}"
> > > > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > -	    _destroy_loop_device $logdev
> > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > +    _cleanup_verify_metadump
> > > > > >  }
> > > > > >  
> > > > > >  # Import common functions.
> > > > > >  . ./common/filter
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > >  _require_test
> > > > > >  _require_scratch
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > >  # real QA test starts here
> > > > > >  
> > > > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > > > >  ORPHANAGE="lost+found"
> > > > > >  
> > > > > >  _supported_fs xfs
> > > > > > @@ -52,24 +50,7 @@ function create_file() {
> > > > > >  	touch $(printf "$@")
> > > > > >  }
> > > > > >  
> > > > > > -verify_metadump_v1()
> > > > > > -{
> > > > > > -	local max_version=$1
> > > > > > -	local version=""
> > > > > > -
> > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > -		version="-v 1"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > -
> > > > > > +extra_test() {
> > > > > >  	cd "${SCRATCH_MNT}"
> > > > > >  
> > > > > >  	# Get a listing of all the files after obfuscation
> > > > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > > > >  	ls -R | od -c >> $seqres.full
> > > > > >  
> > > > > >  	cd /
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > -
> > > > > > -verify_metadump_v2()
> > > > > > -{
> > > > > > -	version="-v 2"
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > -
> > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > -	# from such a metadump file.
> > > > > > -	slogdev=""
> > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > -
> > > > > > -	cd "${SCRATCH_MNT}"
> > > > > > -
> > > > > > -	# Get a listing of all the files after obfuscation
> > > > > > -	echo "Metadump v2" >> $seqres.full
> > > > > > -	ls -R >> $seqres.full
> > > > > > -	ls -R | od -c >> $seqres.full
> > > > > > -
> > > > > > -	cd /
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > -
> > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > -		_destroy_loop_device $logdev
> > > > > > -		logdev=""
> > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > >  }
> > > > > >  
> > > > > >  echo "Disciplyne of silence is goed."
> > > > > > @@ -233,13 +160,7 @@ cd $here
> > > > > >  
> > > > > >  _scratch_unmount
> > > > > >  
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > > -verify_metadump_v1 $max_md_version
> > > > > > -
> > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > -	verify_metadump_v2
> > > > > > -fi
> > > > > > +_verify_metadumps '' extra_test
> > > > > >  
> > > > > >  # Finally, re-make the filesystem since to ensure we don't
> > > > > >  # leave a directory with duplicate entries lying around.
> > > > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > > > index 1433140821..c475d89ad9 100755
> > > > > > --- a/tests/xfs/291
> > > > > > +++ b/tests/xfs/291
> > > > > > @@ -9,11 +9,21 @@
> > > > > >  . ./common/preamble
> > > > > >  _begin_fstest auto repair metadump
> > > > > >  
> > > > > > +# Override the default cleanup function.
> > > > > > +_cleanup()
> > > > > > +{
> > > > > > +	cd /
> > > > > > +	rm -r -f $tmp.*
> > > > > > +	_cleanup_verify_metadump
> > > > > > +}
> > > > > > +
> > > > > >  # Import common functions.
> > > > > >  . ./common/filter
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  _supported_fs xfs
> > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > >  # real QA test starts here
> > > > > >  _require_scratch
> > > > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > > > >  
> > > > > >  # Yes they can!  Now...
> > > > > >  # Can xfs_metadump cope with this monster?
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > -	version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v $md_version"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > > > -		_fail "xfs_metadump failed"
> > > > > > -
> > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > -		slogdev=""
> > > > > > -	fi
> > > > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > > > -		_fail "xfs_repair of metadump failed"
> > > > > > -done
> > > > > > +_verify_metadumps '-a -o'
> > > > > >  
> > > > > >  # Yes it can; success, all done
> > > > > >  status=0
> > > > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > > > index 7e402aa88f..579e1b556a 100755
> > > > > > --- a/tests/xfs/432
> > > > > > +++ b/tests/xfs/432
> > > > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > > > >  _cleanup()
> > > > > >  {
> > > > > >  	cd /
> > > > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > > > +	rm -f "$tmp".*
> > > > > > +	_cleanup_verify_metadump
> > > > > >  }
> > > > > >  
> > > > > >  # Import common functions.
> > > > > >  . ./common/filter
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  # real QA test starts here
> > > > > >  _supported_fs xfs
> > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > >  _require_scratch
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > >  rm -f "$seqres.full"
> > > > > >  
> > > > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > > > >  
> > > > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > > > -rm -f $metadump_file $metadump_img
> > > > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > > > >  max_fname_len=255
> > > > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > > > >  
> > > > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > -	version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v $md_version"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > > > -
> > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > -		slogdev=""
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > > > -		echo "xfs_repair on restored fs returned $?"
> > > > > > -done
> > > > > > +_verify_metadumps '-a -o -w'
> > > > > >  
> > > > > >  # success, all done
> > > > > >  status=0
> > > > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > > > index 8643c3d483..ff6b344a9c 100755
> > > > > > --- a/tests/xfs/503
> > > > > > +++ b/tests/xfs/503
> > > > > > @@ -17,11 +17,13 @@ _cleanup()
> > > > > >  {
> > > > > >  	cd /
> > > > > >  	rm -rf $tmp.* $testdir
> > > > > > +	_cleanup_verify_metadump
> > > > > >  }
> > > > > >  
> > > > > >  # Import common functions.
> > > > > >  . ./common/filter
> > > > > >  . ./common/populate
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  testdir=$TEST_DIR/test-$seq
> > > > > >  
> > > > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > > > >  _require_populate_commands
> > > > > >  _xfs_skip_online_rebuild
> > > > > >  _xfs_skip_offline_rebuild
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > >  echo "Format and populate"
> > > > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > > > >  metadump_file=$testdir/scratch.md
> > > > > >  copy_file=$testdir/copy.img
> > > > > >  
> > > > > > -check_restored_metadump_image()
> > > > > > -{
> > > > > > -	local image=$1
> > > > > > -
> > > > > > -	loop_dev=$(_create_loop_device $image)
> > > > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > > > -	_destroy_loop_device $loop_dev
> > > > > > -}
> > > > > > -
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > >  echo "metadump and mdrestore"
> > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > -	version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v $md_version"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > -done
> > > > > > +_verify_metadumps '-a -o'
> > > > > >  
> > > > > >  echo "metadump a and mdrestore"
> > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > -	version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v $md_version"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > -done
> > > > > > +_verify_metadumps '-a'
> > > > > >  
> > > > > >  echo "metadump g and mdrestore"
> > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > -	version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v $md_version"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > -done
> > > > > > +_verify_metadumps '-g' >> $seqres.full
> > > > > >  
> > > > > >  echo "metadump ag and mdrestore"
> > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > -	version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v $md_version"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > -done
> > > > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > > > >  
> > > > > >  echo copy
> > > > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > > > index f2cd7aba98..af917f0f32 100755
> > > > > > --- a/tests/xfs/605
> > > > > > +++ b/tests/xfs/605
> > > > > > @@ -15,17 +15,13 @@ _cleanup()
> > > > > >  {
> > > > > >  	cd /
> > > > > >  	rm -r -f $tmp.*
> > > > > > -	_scratch_unmount > /dev/null 2>&1
> > > > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > -		_destroy_loop_device $logdev
> > > > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > > > -	   $TEST_DIR/log-image
> > > > > > +	_cleanup_verify_metadump
> > > > > >  }
> > > > > >  
> > > > > >  # Import common functions.
> > > > > >  . ./common/dmflakey
> > > > > >  . ./common/inject
> > > > > > +. ./common/xfs_metadump_tests
> > > > > >  
> > > > > >  # real QA test starts here
> > > > > >  _supported_fs xfs
> > > > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > > > >  _require_dm_target flakey
> > > > > >  _require_xfs_io_command "pwrite"
> > > > > >  _require_test_program "punch-alternating"
> > > > > > +_setup_verify_metadump
> > > > > >  
> > > > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > > > >  testfile=${SCRATCH_MNT}/testfile
> > > > > >  
> > > > > >  echo "Format filesystem on scratch device"
> > > > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > > > >  
> > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > -
> > > > > >  external_log=0
> > > > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > > > >  	external_log=1
> > > > > >  fi
> > > > > >  
> > > > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > > > >  	_notrun "metadump v1 does not support external log device"
> > > > > >  fi
> > > > > >  
> > > > > > -verify_metadump_v1()
> > > > > > -{
> > > > > > -	local version=""
> > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > -		version="-v 1"
> > > > > > -	fi
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > -
> > > > > > -verify_metadump_v2()
> > > > > > -{
> > > > > > -	local version="-v 2"
> > > > > > -
> > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > -
> > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > -	# from such a metadump file.
> > > > > > -	slogdev=""
> > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > -
> > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > -
> > > > > > -	logdev=""
> > > > > > -	if [[ -s $slogdev ]]; then
> > > > > > -		logdev=$(_create_loop_device $slogdev)
> > > > > > -	fi
> > > > > > -
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > -
> > > > > > -	if [[ -s $logdev ]]; then
> > > > > > -		_destroy_loop_device $logdev
> > > > > > -		logdev=""
> > > > > > -		rm -f $slogdev
> > > > > > -	fi
> > > > > > -
> > > > > > -	_destroy_loop_device $datadev
> > > > > > -	datadev=""
> > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > -}
> > > > > > -
> > > > > >  echo "Initialize and mount filesystem on flakey device"
> > > > > >  _init_flakey
> > > > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > > > >  _print_logstate
> > > > > >  
> > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > -
> > > > > > -if [[ $external_log == 0 ]]; then
> > > > > > -	verify_metadump_v1 $max_md_version
> > > > > > -fi
> > > > > > -
> > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > -	verify_metadump_v2
> > > > > > -fi
> > > > > > +_verify_metadumps '-a -o'
> > > > > >  
> > > > > >  # Mount the fs to replay the contents from the dirty log.
> > > > > >  _scratch_mount
> > > > > > 
> > > > > 
> > > > 
> > > 
> > > 
> > 
> 
>
Zorro Lang Feb. 1, 2024, 6:29 a.m. UTC | #8
On Wed, Jan 31, 2024 at 11:24:33AM -0800, Darrick J. Wong wrote:
> On Wed, Jan 31, 2024 at 10:09:19PM +0800, Zorro Lang wrote:
> > On Mon, Jan 29, 2024 at 05:32:07PM -0800, Darrick J. Wong wrote:
> > > On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> > > > On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > > > > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > > > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > > > > 
> > > > > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > > > > duplicate copies of the same code.
> > > > > > > 
> > > > > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > > > > 
> > > > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > > > > ---
> > > > > > >  common/rc                 |   10 ----
> > > > > > >  common/xfs                |   14 +++++
> > > > > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > > >  tests/xfs/129             |   90 ++-------------------------------
> > > > > > >  tests/xfs/234             |   91 ++-------------------------------
> > > > > > >  tests/xfs/253             |   89 ++-------------------------------
> > > > > > >  tests/xfs/291             |   31 ++++-------
> > > > > > >  tests/xfs/432             |   30 ++---------
> > > > > > >  tests/xfs/503             |   60 +++-------------------
> > > > > > >  tests/xfs/605             |   84 ++-----------------------------
> > > > > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > > > > >  create mode 100644 common/xfs_metadump_tests
> > > > > > > 
> > > > > > > 
> > > > > > > diff --git a/common/rc b/common/rc
> > > > > > > index 524ffa02aa..0b69f7f54f 100644
> > > > > > > --- a/common/rc
> > > > > > > +++ b/common/rc
> > > > > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > > > > >  
> > > > > > >      case $FSTYP in
> > > > > > >      xfs)
> > > > > > > -	local scratch_log="none"
> > > > > > > -	local scratch_rt="none"
> > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > -
> > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > -
> > > > > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > +	_check_xfs_scratch_fs $device
> > > > > > >  	;;
> > > > > > >      udf)
> > > > > > >  	_check_udf_filesystem $device $udf_fsize
> > > > > > > diff --git a/common/xfs b/common/xfs
> > > > > > > index 248ccefda3..6a48960a7f 100644
> > > > > > > --- a/common/xfs
> > > > > > > +++ b/common/xfs
> > > > > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > > > > >  	return $?
> > > > > > >  }
> > > > > > >  
> > > > > > > +_check_xfs_scratch_fs()
> > > > > > > +{
> > > > > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > > > > +	local scratch_log="none"
> > > > > > > +	local scratch_rt="none"
> > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > +
> > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > +
> > > > > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > +}
> > > > > > > +
> > > > > > >  # modeled after _scratch_xfs_repair
> > > > > > >  _test_xfs_repair()
> > > > > > >  {
> > > > > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > > > > 
> > > > > > Hi Darrick,
> > > > > > 
> > > > > > Thanks for this improvement.
> > > > > > 
> > > > > > I'm wondering do we need a separated common file only for xfs metadump
> > > > > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > > > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > > > > in common/xfs.
> > > > > 
> > > > > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > > > > files are getting big:
> > > > > 
> > > > >    509 fstests/common/overlay
> > > > >    523 fstests/common/quota
> > > > >    550 fstests/common/reflink
> > > > >    638 fstests/common/log
> > > > >    640 fstests/common/punch
> > > > >    663 fstests/common/filter
> > > > >    794 fstests/common/btrfs
> > > > >    936 fstests/common/config
> > > > >   1030 fstests/common/encrypt
> > > > >   1162 fstests/common/populate
> > > > >   1519 fstests/common/fuzzy
> > > > >   1531 fstests/common/dump
> > > > >   2218 fstests/common/xfs
> > > > >   5437 fstests/common/rc
> > > > > 
> > > > > with common/xfs being particularly larger than most everything else.
> > > > 
> > > > Haha, maybe we'll have a common/xfs/ directory in one day :)
> > > > 
> > > > > 
> > > > > Since the common/xfs_metadump_tests functions are shared helper
> > > > > functions for testing metadump/mdrestore that are not use by most tests,
> > > > > I decided that a split was appropriate both to maintain the (ha!)
> > > > > cohesion of common/xfs and not add more bash parsing costs to every
> > > > > single testcase.
> > > > 
> > > > OK, a split makes sense, but I have 3 questions:
> > > > 1) Will you move all metadump helpers from common/xfs to this new file?
> > > 
> > > I don't really want to, because that's another patch and would require
> > > careful auditing of all the tests to find the ones that want to use
> > > metadump but aren't themselves functional tests of metadump.
> > > 
> > > IOWs, this new file really is for shared metadump functional testing and
> > > not much else.
> > 
> > OK, I think we can care about this part step by step in the future.
> 
> <nod>
> 
> > > 
> > > > 2) Can we call it common/metadump? (Not sure if any other fs has metadump
> > > >    things:)
> > > 
> > > Yes, e2image does this for ext*.
> > 
> > OK, I'll rename this file to common/metadump, and change other patches to
> > souce the new name when I merge this patchset. Is that good to you?
> 
> Sorry, I realized that my statement was ambiguous -- the "yes" applies
> to "Not sure if any other fs has metadump things", not "Can we call it
> common/metadump?".  The code in common/xfs_metadump_tests is specific to
> xfs and is not used for e2image testing, so let's leave the name as-is.

Oh, maybe it can be used for e2image or other metadump helpers later, if
we call it common/metadump?

> 
> --D
> 
> > Thanks,
> > Zorro
> > 
> > > 
> > > > 3) Or move to common/dump directly? (looks not proper ;-)
> > > 
> > > dump != metadump; one is for all the files in the fs and none of the
> > > non-file metadata; the other is for metadata and none of the files.
> > > 
> > > --D
> > > 
> > > > Thanks,
> > > > Zorro
> > > > 
> > > > > 
> > > > > --D
> > > > > 
> > > > > > Thanks,
> > > > > > Zorro
> > > > > > 
> > > > > > > new file mode 100644
> > > > > > > index 0000000000..dd3dec1fb4
> > > > > > > --- /dev/null
> > > > > > > +++ b/common/xfs_metadump_tests
> > > > > > > @@ -0,0 +1,123 @@
> > > > > > > +#
> > > > > > > +# XFS specific metadump testing functions.
> > > > > > > +#
> > > > > > > +
> > > > > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > > > > +_setup_verify_metadump()
> > > > > > > +{
> > > > > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > > > > +
> > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > +}
> > > > > > > +
> > > > > > > +_cleanup_verify_metadump()
> > > > > > > +{
> > > > > > > +	_scratch_unmount &>> $seqres.full
> > > > > > > +
> > > > > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > > > > +		losetup -d "$ldev"
> > > > > > > +	done
> > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > +}
> > > > > > > +
> > > > > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > > > > +# images and fsck them.
> > > > > > > +_verify_metadump_v1()
> > > > > > > +{
> > > > > > > +	local metadump_args="$1"
> > > > > > > +	local extra_test="$2"
> > > > > > > +
> > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > +	local version=""
> > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > +	local data_loop
> > > > > > > +
> > > > > > > +	# Force v1 if we detect v2 support
> > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > > > > +		version="-v 1"
> > > > > > > +	fi
> > > > > > > +
> > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > +
> > > > > > > +	# Restore metadump, which creates data_img
> > > > > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > > > > +
> > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > +
> > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > > > > +	fi
> > > > > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > +
> > > > > > > +	# Tear down what we created
> > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > +	rm -f $data_img
> > > > > > > +}
> > > > > > > +
> > > > > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > > > > +# images and fsck them.
> > > > > > > +_verify_metadump_v2()
> > > > > > > +{
> > > > > > > +	local metadump_args="$1"
> > > > > > > +	local extra_test="$2"
> > > > > > > +
> > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > +	local version="-v 2"
> > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > +	local data_loop
> > > > > > > +	local log_img=""
> > > > > > > +	local log_loop
> > > > > > > +
> > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > +
> > > > > > > +	#
> > > > > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > > > > +	# from such a metadump file.
> > > > > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > > > > +
> > > > > > > +	# Restore metadump, which creates data_img and log_img
> > > > > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > > > > +
> > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > +
> > > > > > > +	# Create loopdev for log device if we recovered anything
> > > > > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > > > > +
> > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > > > > +	fi
> > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > +
> > > > > > > +	# Tear down what we created
> > > > > > > +	if [ -b "$log_loop" ]; then
> > > > > > > +		_destroy_loop_device $log_loop
> > > > > > > +		rm -f $log_img
> > > > > > > +	fi
> > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > +	rm -f $data_img
> > > > > > > +}
> > > > > > > +
> > > > > > > +# Verify both metadump formats if possible
> > > > > > > +_verify_metadumps()
> > > > > > > +{
> > > > > > > +	_verify_metadump_v1 "$@"
> > > > > > > +
> > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > > > > +		_verify_metadump_v2 "$@"
> > > > > > > +	fi
> > > > > > > +}
> > > > > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > > > > index cdac2349df..c3a9bcefee 100755
> > > > > > > --- a/tests/xfs/129
> > > > > > > +++ b/tests/xfs/129
> > > > > > > @@ -16,98 +16,23 @@ _cleanup()
> > > > > > >  {
> > > > > > >      cd /
> > > > > > >      _scratch_unmount > /dev/null 2>&1
> > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > > > > -       $TEST_DIR/log-image
> > > > > > > +    _cleanup_verify_metadump
> > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > >  }
> > > > > > >  
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/filter
> > > > > > >  . ./common/reflink
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  # real QA test starts here
> > > > > > >  _supported_fs xfs
> > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > >  _require_loop
> > > > > > >  _require_scratch_reflink
> > > > > > > -
> > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > -
> > > > > > > -verify_metadump_v1()
> > > > > > > -{
> > > > > > > -	local max_version=$1
> > > > > > > -	local version=""
> > > > > > > -
> > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > -		version="-v 1"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > -
> > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > -
> > > > > > > -verify_metadump_v2()
> > > > > > > -{
> > > > > > > -	version="-v 2"
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > -
> > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > -	# from such a metadump file.
> > > > > > > -	slogdev=""
> > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > -
> > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > -
> > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > -		_destroy_loop_device $logdev
> > > > > > > -		logdev=""
> > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > -
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > >  _scratch_mount
> > > > > > >  
> > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > @@ -127,12 +52,7 @@ done
> > > > > > >  _scratch_unmount
> > > > > > >  
> > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > -
> > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > -
> > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > -	verify_metadump_v2
> > > > > > > -fi
> > > > > > > +_verify_metadumps
> > > > > > >  
> > > > > > >  # success, all done
> > > > > > >  status=0
> > > > > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > > > > index f4f8af6d3a..8f808c7507 100755
> > > > > > > --- a/tests/xfs/234
> > > > > > > +++ b/tests/xfs/234
> > > > > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > > > > >  _cleanup()
> > > > > > >  {
> > > > > > >      cd /
> > > > > > > -    _scratch_unmount > /dev/null 2>&1
> > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > > > > -       $TEST_DIR/log-image
> > > > > > > +    _cleanup_verify_metadump
> > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > >  }
> > > > > > >  
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/filter
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  # real QA test starts here
> > > > > > >  _supported_fs xfs
> > > > > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > >  _require_loop
> > > > > > >  _require_xfs_scratch_rmapbt
> > > > > > >  _require_xfs_io_command "fpunch"
> > > > > > > -
> > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > -
> > > > > > > -verify_metadump_v1()
> > > > > > > -{
> > > > > > > -	local max_version=$1
> > > > > > > -	local version=""
> > > > > > > -
> > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > -		version="-v 1"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > -
> > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > -
> > > > > > > -verify_metadump_v2()
> > > > > > > -{
> > > > > > > -	version="-v 2"
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > -
> > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > -	# from such a metadump file.
> > > > > > > -	slogdev=""
> > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > -
> > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > -
> > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > -		_destroy_loop_device $logdev
> > > > > > > -		logdev=""
> > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > -
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > >  _scratch_mount
> > > > > > >  
> > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > @@ -127,12 +51,7 @@ done
> > > > > > >  _scratch_unmount
> > > > > > >  
> > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > -
> > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > -
> > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > -	verify_metadump_v2
> > > > > > > -fi
> > > > > > > +_verify_metadumps
> > > > > > >  
> > > > > > >  # success, all done
> > > > > > >  status=0
> > > > > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > > > > index 3b567999d8..6623c435e5 100755
> > > > > > > --- a/tests/xfs/253
> > > > > > > +++ b/tests/xfs/253
> > > > > > > @@ -26,23 +26,21 @@ _cleanup()
> > > > > > >      cd /
> > > > > > >      rm -f $tmp.*
> > > > > > >      rm -rf "${OUTPUT_DIR}"
> > > > > > > -    rm -f "${METADUMP_FILE}"
> > > > > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > +    _cleanup_verify_metadump
> > > > > > >  }
> > > > > > >  
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/filter
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > >  _require_test
> > > > > > >  _require_scratch
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > >  # real QA test starts here
> > > > > > >  
> > > > > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > > > > >  ORPHANAGE="lost+found"
> > > > > > >  
> > > > > > >  _supported_fs xfs
> > > > > > > @@ -52,24 +50,7 @@ function create_file() {
> > > > > > >  	touch $(printf "$@")
> > > > > > >  }
> > > > > > >  
> > > > > > > -verify_metadump_v1()
> > > > > > > -{
> > > > > > > -	local max_version=$1
> > > > > > > -	local version=""
> > > > > > > -
> > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > -		version="-v 1"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > -
> > > > > > > +extra_test() {
> > > > > > >  	cd "${SCRATCH_MNT}"
> > > > > > >  
> > > > > > >  	# Get a listing of all the files after obfuscation
> > > > > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > > > > >  	ls -R | od -c >> $seqres.full
> > > > > > >  
> > > > > > >  	cd /
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > -
> > > > > > > -verify_metadump_v2()
> > > > > > > -{
> > > > > > > -	version="-v 2"
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > -
> > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > -	# from such a metadump file.
> > > > > > > -	slogdev=""
> > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > -
> > > > > > > -	cd "${SCRATCH_MNT}"
> > > > > > > -
> > > > > > > -	# Get a listing of all the files after obfuscation
> > > > > > > -	echo "Metadump v2" >> $seqres.full
> > > > > > > -	ls -R >> $seqres.full
> > > > > > > -	ls -R | od -c >> $seqres.full
> > > > > > > -
> > > > > > > -	cd /
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > -
> > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > -		_destroy_loop_device $logdev
> > > > > > > -		logdev=""
> > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > >  }
> > > > > > >  
> > > > > > >  echo "Disciplyne of silence is goed."
> > > > > > > @@ -233,13 +160,7 @@ cd $here
> > > > > > >  
> > > > > > >  _scratch_unmount
> > > > > > >  
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > -
> > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > -	verify_metadump_v2
> > > > > > > -fi
> > > > > > > +_verify_metadumps '' extra_test
> > > > > > >  
> > > > > > >  # Finally, re-make the filesystem since to ensure we don't
> > > > > > >  # leave a directory with duplicate entries lying around.
> > > > > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > > > > index 1433140821..c475d89ad9 100755
> > > > > > > --- a/tests/xfs/291
> > > > > > > +++ b/tests/xfs/291
> > > > > > > @@ -9,11 +9,21 @@
> > > > > > >  . ./common/preamble
> > > > > > >  _begin_fstest auto repair metadump
> > > > > > >  
> > > > > > > +# Override the default cleanup function.
> > > > > > > +_cleanup()
> > > > > > > +{
> > > > > > > +	cd /
> > > > > > > +	rm -r -f $tmp.*
> > > > > > > +	_cleanup_verify_metadump
> > > > > > > +}
> > > > > > > +
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/filter
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  _supported_fs xfs
> > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > >  # real QA test starts here
> > > > > > >  _require_scratch
> > > > > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > > > > >  
> > > > > > >  # Yes they can!  Now...
> > > > > > >  # Can xfs_metadump cope with this monster?
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > -	version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v $md_version"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > > > > -		_fail "xfs_metadump failed"
> > > > > > > -
> > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > -		slogdev=""
> > > > > > > -	fi
> > > > > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > > > > -		_fail "xfs_repair of metadump failed"
> > > > > > > -done
> > > > > > > +_verify_metadumps '-a -o'
> > > > > > >  
> > > > > > >  # Yes it can; success, all done
> > > > > > >  status=0
> > > > > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > > > > index 7e402aa88f..579e1b556a 100755
> > > > > > > --- a/tests/xfs/432
> > > > > > > +++ b/tests/xfs/432
> > > > > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > > > > >  _cleanup()
> > > > > > >  {
> > > > > > >  	cd /
> > > > > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > > > > +	rm -f "$tmp".*
> > > > > > > +	_cleanup_verify_metadump
> > > > > > >  }
> > > > > > >  
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/filter
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  # real QA test starts here
> > > > > > >  _supported_fs xfs
> > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > >  _require_scratch
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > >  rm -f "$seqres.full"
> > > > > > >  
> > > > > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > > > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > > > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > > > > >  
> > > > > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > > > > -rm -f $metadump_file $metadump_img
> > > > > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > > > > >  max_fname_len=255
> > > > > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > > > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > > > > >  
> > > > > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > -	version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v $md_version"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > > > > -
> > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > -		slogdev=""
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > > > > -		echo "xfs_repair on restored fs returned $?"
> > > > > > > -done
> > > > > > > +_verify_metadumps '-a -o -w'
> > > > > > >  
> > > > > > >  # success, all done
> > > > > > >  status=0
> > > > > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > > > > index 8643c3d483..ff6b344a9c 100755
> > > > > > > --- a/tests/xfs/503
> > > > > > > +++ b/tests/xfs/503
> > > > > > > @@ -17,11 +17,13 @@ _cleanup()
> > > > > > >  {
> > > > > > >  	cd /
> > > > > > >  	rm -rf $tmp.* $testdir
> > > > > > > +	_cleanup_verify_metadump
> > > > > > >  }
> > > > > > >  
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/filter
> > > > > > >  . ./common/populate
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  testdir=$TEST_DIR/test-$seq
> > > > > > >  
> > > > > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > > > > >  _require_populate_commands
> > > > > > >  _xfs_skip_online_rebuild
> > > > > > >  _xfs_skip_offline_rebuild
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > >  echo "Format and populate"
> > > > > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > > > > >  metadump_file=$testdir/scratch.md
> > > > > > >  copy_file=$testdir/copy.img
> > > > > > >  
> > > > > > > -check_restored_metadump_image()
> > > > > > > -{
> > > > > > > -	local image=$1
> > > > > > > -
> > > > > > > -	loop_dev=$(_create_loop_device $image)
> > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > > > > -	_destroy_loop_device $loop_dev
> > > > > > > -}
> > > > > > > -
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > >  echo "metadump and mdrestore"
> > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > -	version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v $md_version"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > -done
> > > > > > > +_verify_metadumps '-a -o'
> > > > > > >  
> > > > > > >  echo "metadump a and mdrestore"
> > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > -	version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v $md_version"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > -done
> > > > > > > +_verify_metadumps '-a'
> > > > > > >  
> > > > > > >  echo "metadump g and mdrestore"
> > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > -	version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v $md_version"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > -done
> > > > > > > +_verify_metadumps '-g' >> $seqres.full
> > > > > > >  
> > > > > > >  echo "metadump ag and mdrestore"
> > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > -	version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v $md_version"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > -done
> > > > > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > > > > >  
> > > > > > >  echo copy
> > > > > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > > > > index f2cd7aba98..af917f0f32 100755
> > > > > > > --- a/tests/xfs/605
> > > > > > > +++ b/tests/xfs/605
> > > > > > > @@ -15,17 +15,13 @@ _cleanup()
> > > > > > >  {
> > > > > > >  	cd /
> > > > > > >  	rm -r -f $tmp.*
> > > > > > > -	_scratch_unmount > /dev/null 2>&1
> > > > > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > -		_destroy_loop_device $logdev
> > > > > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > > > > -	   $TEST_DIR/log-image
> > > > > > > +	_cleanup_verify_metadump
> > > > > > >  }
> > > > > > >  
> > > > > > >  # Import common functions.
> > > > > > >  . ./common/dmflakey
> > > > > > >  . ./common/inject
> > > > > > > +. ./common/xfs_metadump_tests
> > > > > > >  
> > > > > > >  # real QA test starts here
> > > > > > >  _supported_fs xfs
> > > > > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > > > > >  _require_dm_target flakey
> > > > > > >  _require_xfs_io_command "pwrite"
> > > > > > >  _require_test_program "punch-alternating"
> > > > > > > +_setup_verify_metadump
> > > > > > >  
> > > > > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > > > > >  testfile=${SCRATCH_MNT}/testfile
> > > > > > >  
> > > > > > >  echo "Format filesystem on scratch device"
> > > > > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > > > > >  
> > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > -
> > > > > > >  external_log=0
> > > > > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > > > > >  	external_log=1
> > > > > > >  fi
> > > > > > >  
> > > > > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > > > > >  	_notrun "metadump v1 does not support external log device"
> > > > > > >  fi
> > > > > > >  
> > > > > > > -verify_metadump_v1()
> > > > > > > -{
> > > > > > > -	local version=""
> > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > -		version="-v 1"
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > -
> > > > > > > -verify_metadump_v2()
> > > > > > > -{
> > > > > > > -	local version="-v 2"
> > > > > > > -
> > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > -
> > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > -	# from such a metadump file.
> > > > > > > -	slogdev=""
> > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > -
> > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > -
> > > > > > > -	logdev=""
> > > > > > > -	if [[ -s $slogdev ]]; then
> > > > > > > -		logdev=$(_create_loop_device $slogdev)
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > -
> > > > > > > -	if [[ -s $logdev ]]; then
> > > > > > > -		_destroy_loop_device $logdev
> > > > > > > -		logdev=""
> > > > > > > -		rm -f $slogdev
> > > > > > > -	fi
> > > > > > > -
> > > > > > > -	_destroy_loop_device $datadev
> > > > > > > -	datadev=""
> > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > -}
> > > > > > > -
> > > > > > >  echo "Initialize and mount filesystem on flakey device"
> > > > > > >  _init_flakey
> > > > > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > > > > >  _print_logstate
> > > > > > >  
> > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > -
> > > > > > > -if [[ $external_log == 0 ]]; then
> > > > > > > -	verify_metadump_v1 $max_md_version
> > > > > > > -fi
> > > > > > > -
> > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > -	verify_metadump_v2
> > > > > > > -fi
> > > > > > > +_verify_metadumps '-a -o'
> > > > > > >  
> > > > > > >  # Mount the fs to replay the contents from the dirty log.
> > > > > > >  _scratch_mount
> > > > > > > 
> > > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > 
> > 
>
Darrick J. Wong Feb. 2, 2024, 4:47 p.m. UTC | #9
On Thu, Feb 01, 2024 at 02:29:22PM +0800, Zorro Lang wrote:
> On Wed, Jan 31, 2024 at 11:24:33AM -0800, Darrick J. Wong wrote:
> > On Wed, Jan 31, 2024 at 10:09:19PM +0800, Zorro Lang wrote:
> > > On Mon, Jan 29, 2024 at 05:32:07PM -0800, Darrick J. Wong wrote:
> > > > On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> > > > > On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > > > > > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > > > > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > > > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > > > > > 
> > > > > > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > > > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > > > > > duplicate copies of the same code.
> > > > > > > > 
> > > > > > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > > > > > 
> > > > > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > > > > > ---
> > > > > > > >  common/rc                 |   10 ----
> > > > > > > >  common/xfs                |   14 +++++
> > > > > > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > > > >  tests/xfs/129             |   90 ++-------------------------------
> > > > > > > >  tests/xfs/234             |   91 ++-------------------------------
> > > > > > > >  tests/xfs/253             |   89 ++-------------------------------
> > > > > > > >  tests/xfs/291             |   31 ++++-------
> > > > > > > >  tests/xfs/432             |   30 ++---------
> > > > > > > >  tests/xfs/503             |   60 +++-------------------
> > > > > > > >  tests/xfs/605             |   84 ++-----------------------------
> > > > > > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > > > > > >  create mode 100644 common/xfs_metadump_tests
> > > > > > > > 
> > > > > > > > 
> > > > > > > > diff --git a/common/rc b/common/rc
> > > > > > > > index 524ffa02aa..0b69f7f54f 100644
> > > > > > > > --- a/common/rc
> > > > > > > > +++ b/common/rc
> > > > > > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > > > > > >  
> > > > > > > >      case $FSTYP in
> > > > > > > >      xfs)
> > > > > > > > -	local scratch_log="none"
> > > > > > > > -	local scratch_rt="none"
> > > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > > -
> > > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > > -
> > > > > > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > > +	_check_xfs_scratch_fs $device
> > > > > > > >  	;;
> > > > > > > >      udf)
> > > > > > > >  	_check_udf_filesystem $device $udf_fsize
> > > > > > > > diff --git a/common/xfs b/common/xfs
> > > > > > > > index 248ccefda3..6a48960a7f 100644
> > > > > > > > --- a/common/xfs
> > > > > > > > +++ b/common/xfs
> > > > > > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > > > > > >  	return $?
> > > > > > > >  }
> > > > > > > >  
> > > > > > > > +_check_xfs_scratch_fs()
> > > > > > > > +{
> > > > > > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > > > > > +	local scratch_log="none"
> > > > > > > > +	local scratch_rt="none"
> > > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > > +
> > > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > > +
> > > > > > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > > +}
> > > > > > > > +
> > > > > > > >  # modeled after _scratch_xfs_repair
> > > > > > > >  _test_xfs_repair()
> > > > > > > >  {
> > > > > > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > > > > > 
> > > > > > > Hi Darrick,
> > > > > > > 
> > > > > > > Thanks for this improvement.
> > > > > > > 
> > > > > > > I'm wondering do we need a separated common file only for xfs metadump
> > > > > > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > > > > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > > > > > in common/xfs.
> > > > > > 
> > > > > > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > > > > > files are getting big:
> > > > > > 
> > > > > >    509 fstests/common/overlay
> > > > > >    523 fstests/common/quota
> > > > > >    550 fstests/common/reflink
> > > > > >    638 fstests/common/log
> > > > > >    640 fstests/common/punch
> > > > > >    663 fstests/common/filter
> > > > > >    794 fstests/common/btrfs
> > > > > >    936 fstests/common/config
> > > > > >   1030 fstests/common/encrypt
> > > > > >   1162 fstests/common/populate
> > > > > >   1519 fstests/common/fuzzy
> > > > > >   1531 fstests/common/dump
> > > > > >   2218 fstests/common/xfs
> > > > > >   5437 fstests/common/rc
> > > > > > 
> > > > > > with common/xfs being particularly larger than most everything else.
> > > > > 
> > > > > Haha, maybe we'll have a common/xfs/ directory in one day :)
> > > > > 
> > > > > > 
> > > > > > Since the common/xfs_metadump_tests functions are shared helper
> > > > > > functions for testing metadump/mdrestore that are not use by most tests,
> > > > > > I decided that a split was appropriate both to maintain the (ha!)
> > > > > > cohesion of common/xfs and not add more bash parsing costs to every
> > > > > > single testcase.
> > > > > 
> > > > > OK, a split makes sense, but I have 3 questions:
> > > > > 1) Will you move all metadump helpers from common/xfs to this new file?
> > > > 
> > > > I don't really want to, because that's another patch and would require
> > > > careful auditing of all the tests to find the ones that want to use
> > > > metadump but aren't themselves functional tests of metadump.
> > > > 
> > > > IOWs, this new file really is for shared metadump functional testing and
> > > > not much else.
> > > 
> > > OK, I think we can care about this part step by step in the future.
> > 
> > <nod>
> > 
> > > > 
> > > > > 2) Can we call it common/metadump? (Not sure if any other fs has metadump
> > > > >    things:)
> > > > 
> > > > Yes, e2image does this for ext*.
> > > 
> > > OK, I'll rename this file to common/metadump, and change other patches to
> > > souce the new name when I merge this patchset. Is that good to you?
> > 
> > Sorry, I realized that my statement was ambiguous -- the "yes" applies
> > to "Not sure if any other fs has metadump things", not "Can we call it
> > common/metadump?".  The code in common/xfs_metadump_tests is specific to
> > xfs and is not used for e2image testing, so let's leave the name as-is.
> 
> Oh, maybe it can be used for e2image or other metadump helpers later, if
> we call it common/metadump?

Sounds ok to me.  Want me to respin?

--D

> > 
> > --D
> > 
> > > Thanks,
> > > Zorro
> > > 
> > > > 
> > > > > 3) Or move to common/dump directly? (looks not proper ;-)
> > > > 
> > > > dump != metadump; one is for all the files in the fs and none of the
> > > > non-file metadata; the other is for metadata and none of the files.
> > > > 
> > > > --D
> > > > 
> > > > > Thanks,
> > > > > Zorro
> > > > > 
> > > > > > 
> > > > > > --D
> > > > > > 
> > > > > > > Thanks,
> > > > > > > Zorro
> > > > > > > 
> > > > > > > > new file mode 100644
> > > > > > > > index 0000000000..dd3dec1fb4
> > > > > > > > --- /dev/null
> > > > > > > > +++ b/common/xfs_metadump_tests
> > > > > > > > @@ -0,0 +1,123 @@
> > > > > > > > +#
> > > > > > > > +# XFS specific metadump testing functions.
> > > > > > > > +#
> > > > > > > > +
> > > > > > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > > > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > > > > > +_setup_verify_metadump()
> > > > > > > > +{
> > > > > > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > > > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > > > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > > > > > +
> > > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > > +}
> > > > > > > > +
> > > > > > > > +_cleanup_verify_metadump()
> > > > > > > > +{
> > > > > > > > +	_scratch_unmount &>> $seqres.full
> > > > > > > > +
> > > > > > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > > > > > +		losetup -d "$ldev"
> > > > > > > > +	done
> > > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > > +}
> > > > > > > > +
> > > > > > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > > > > > +# images and fsck them.
> > > > > > > > +_verify_metadump_v1()
> > > > > > > > +{
> > > > > > > > +	local metadump_args="$1"
> > > > > > > > +	local extra_test="$2"
> > > > > > > > +
> > > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > > +	local version=""
> > > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > > +	local data_loop
> > > > > > > > +
> > > > > > > > +	# Force v1 if we detect v2 support
> > > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > > > > > +		version="-v 1"
> > > > > > > > +	fi
> > > > > > > > +
> > > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > > +
> > > > > > > > +	# Restore metadump, which creates data_img
> > > > > > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > > > > > +
> > > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > > +
> > > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > > > > > +	fi
> > > > > > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > > +
> > > > > > > > +	# Tear down what we created
> > > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > > +	rm -f $data_img
> > > > > > > > +}
> > > > > > > > +
> > > > > > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > > > > > +# images and fsck them.
> > > > > > > > +_verify_metadump_v2()
> > > > > > > > +{
> > > > > > > > +	local metadump_args="$1"
> > > > > > > > +	local extra_test="$2"
> > > > > > > > +
> > > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > > +	local version="-v 2"
> > > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > > +	local data_loop
> > > > > > > > +	local log_img=""
> > > > > > > > +	local log_loop
> > > > > > > > +
> > > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > > +
> > > > > > > > +	#
> > > > > > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > +	# from such a metadump file.
> > > > > > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > > > > > +
> > > > > > > > +	# Restore metadump, which creates data_img and log_img
> > > > > > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > > > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > > > > > +
> > > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > > +
> > > > > > > > +	# Create loopdev for log device if we recovered anything
> > > > > > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > > > > > +
> > > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > > > > > +	fi
> > > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > > +
> > > > > > > > +	# Tear down what we created
> > > > > > > > +	if [ -b "$log_loop" ]; then
> > > > > > > > +		_destroy_loop_device $log_loop
> > > > > > > > +		rm -f $log_img
> > > > > > > > +	fi
> > > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > > +	rm -f $data_img
> > > > > > > > +}
> > > > > > > > +
> > > > > > > > +# Verify both metadump formats if possible
> > > > > > > > +_verify_metadumps()
> > > > > > > > +{
> > > > > > > > +	_verify_metadump_v1 "$@"
> > > > > > > > +
> > > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > > > > > +		_verify_metadump_v2 "$@"
> > > > > > > > +	fi
> > > > > > > > +}
> > > > > > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > > > > > index cdac2349df..c3a9bcefee 100755
> > > > > > > > --- a/tests/xfs/129
> > > > > > > > +++ b/tests/xfs/129
> > > > > > > > @@ -16,98 +16,23 @@ _cleanup()
> > > > > > > >  {
> > > > > > > >      cd /
> > > > > > > >      _scratch_unmount > /dev/null 2>&1
> > > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > > > > > -       $TEST_DIR/log-image
> > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/filter
> > > > > > > >  . ./common/reflink
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  # real QA test starts here
> > > > > > > >  _supported_fs xfs
> > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > >  _require_loop
> > > > > > > >  _require_scratch_reflink
> > > > > > > > -
> > > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > > -
> > > > > > > > -verify_metadump_v1()
> > > > > > > > -{
> > > > > > > > -	local max_version=$1
> > > > > > > > -	local version=""
> > > > > > > > -
> > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > -		version="-v 1"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > -
> > > > > > > > -verify_metadump_v2()
> > > > > > > > -{
> > > > > > > > -	version="-v 2"
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > -
> > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > -	# from such a metadump file.
> > > > > > > > -	slogdev=""
> > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > -
> > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > -		logdev=""
> > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > > -
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > >  _scratch_mount
> > > > > > > >  
> > > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > > @@ -127,12 +52,7 @@ done
> > > > > > > >  _scratch_unmount
> > > > > > > >  
> > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > -
> > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > -
> > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > -	verify_metadump_v2
> > > > > > > > -fi
> > > > > > > > +_verify_metadumps
> > > > > > > >  
> > > > > > > >  # success, all done
> > > > > > > >  status=0
> > > > > > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > > > > > index f4f8af6d3a..8f808c7507 100755
> > > > > > > > --- a/tests/xfs/234
> > > > > > > > +++ b/tests/xfs/234
> > > > > > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > > > > > >  _cleanup()
> > > > > > > >  {
> > > > > > > >      cd /
> > > > > > > > -    _scratch_unmount > /dev/null 2>&1
> > > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > > > > > -       $TEST_DIR/log-image
> > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/filter
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  # real QA test starts here
> > > > > > > >  _supported_fs xfs
> > > > > > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > >  _require_loop
> > > > > > > >  _require_xfs_scratch_rmapbt
> > > > > > > >  _require_xfs_io_command "fpunch"
> > > > > > > > -
> > > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > > -
> > > > > > > > -verify_metadump_v1()
> > > > > > > > -{
> > > > > > > > -	local max_version=$1
> > > > > > > > -	local version=""
> > > > > > > > -
> > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > -		version="-v 1"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > -
> > > > > > > > -verify_metadump_v2()
> > > > > > > > -{
> > > > > > > > -	version="-v 2"
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > -
> > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > -	# from such a metadump file.
> > > > > > > > -	slogdev=""
> > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > -
> > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > -		logdev=""
> > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > > -
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > >  _scratch_mount
> > > > > > > >  
> > > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > > @@ -127,12 +51,7 @@ done
> > > > > > > >  _scratch_unmount
> > > > > > > >  
> > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > -
> > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > -
> > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > -	verify_metadump_v2
> > > > > > > > -fi
> > > > > > > > +_verify_metadumps
> > > > > > > >  
> > > > > > > >  # success, all done
> > > > > > > >  status=0
> > > > > > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > > > > > index 3b567999d8..6623c435e5 100755
> > > > > > > > --- a/tests/xfs/253
> > > > > > > > +++ b/tests/xfs/253
> > > > > > > > @@ -26,23 +26,21 @@ _cleanup()
> > > > > > > >      cd /
> > > > > > > >      rm -f $tmp.*
> > > > > > > >      rm -rf "${OUTPUT_DIR}"
> > > > > > > > -    rm -f "${METADUMP_FILE}"
> > > > > > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > +    _cleanup_verify_metadump
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/filter
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > >  _require_test
> > > > > > > >  _require_scratch
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > >  # real QA test starts here
> > > > > > > >  
> > > > > > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > > > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > > > > > >  ORPHANAGE="lost+found"
> > > > > > > >  
> > > > > > > >  _supported_fs xfs
> > > > > > > > @@ -52,24 +50,7 @@ function create_file() {
> > > > > > > >  	touch $(printf "$@")
> > > > > > > >  }
> > > > > > > >  
> > > > > > > > -verify_metadump_v1()
> > > > > > > > -{
> > > > > > > > -	local max_version=$1
> > > > > > > > -	local version=""
> > > > > > > > -
> > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > -		version="-v 1"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > -
> > > > > > > > +extra_test() {
> > > > > > > >  	cd "${SCRATCH_MNT}"
> > > > > > > >  
> > > > > > > >  	# Get a listing of all the files after obfuscation
> > > > > > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > > > > > >  	ls -R | od -c >> $seqres.full
> > > > > > > >  
> > > > > > > >  	cd /
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > -
> > > > > > > > -verify_metadump_v2()
> > > > > > > > -{
> > > > > > > > -	version="-v 2"
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > > -
> > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > -	# from such a metadump file.
> > > > > > > > -	slogdev=""
> > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > -
> > > > > > > > -	cd "${SCRATCH_MNT}"
> > > > > > > > -
> > > > > > > > -	# Get a listing of all the files after obfuscation
> > > > > > > > -	echo "Metadump v2" >> $seqres.full
> > > > > > > > -	ls -R >> $seqres.full
> > > > > > > > -	ls -R | od -c >> $seqres.full
> > > > > > > > -
> > > > > > > > -	cd /
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > -		logdev=""
> > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  echo "Disciplyne of silence is goed."
> > > > > > > > @@ -233,13 +160,7 @@ cd $here
> > > > > > > >  
> > > > > > > >  _scratch_unmount
> > > > > > > >  
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > -
> > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > -	verify_metadump_v2
> > > > > > > > -fi
> > > > > > > > +_verify_metadumps '' extra_test
> > > > > > > >  
> > > > > > > >  # Finally, re-make the filesystem since to ensure we don't
> > > > > > > >  # leave a directory with duplicate entries lying around.
> > > > > > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > > > > > index 1433140821..c475d89ad9 100755
> > > > > > > > --- a/tests/xfs/291
> > > > > > > > +++ b/tests/xfs/291
> > > > > > > > @@ -9,11 +9,21 @@
> > > > > > > >  . ./common/preamble
> > > > > > > >  _begin_fstest auto repair metadump
> > > > > > > >  
> > > > > > > > +# Override the default cleanup function.
> > > > > > > > +_cleanup()
> > > > > > > > +{
> > > > > > > > +	cd /
> > > > > > > > +	rm -r -f $tmp.*
> > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > +}
> > > > > > > > +
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/filter
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  _supported_fs xfs
> > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > >  # real QA test starts here
> > > > > > > >  _require_scratch
> > > > > > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > > > > > >  
> > > > > > > >  # Yes they can!  Now...
> > > > > > > >  # Can xfs_metadump cope with this monster?
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > -	version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v $md_version"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > > > > > -		_fail "xfs_metadump failed"
> > > > > > > > -
> > > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > > -		slogdev=""
> > > > > > > > -	fi
> > > > > > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > > > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > > > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > > > > > -		_fail "xfs_repair of metadump failed"
> > > > > > > > -done
> > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > >  
> > > > > > > >  # Yes it can; success, all done
> > > > > > > >  status=0
> > > > > > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > > > > > index 7e402aa88f..579e1b556a 100755
> > > > > > > > --- a/tests/xfs/432
> > > > > > > > +++ b/tests/xfs/432
> > > > > > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > > > > > >  _cleanup()
> > > > > > > >  {
> > > > > > > >  	cd /
> > > > > > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > > > > > +	rm -f "$tmp".*
> > > > > > > > +	_cleanup_verify_metadump
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/filter
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  # real QA test starts here
> > > > > > > >  _supported_fs xfs
> > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > >  _require_scratch
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > >  rm -f "$seqres.full"
> > > > > > > >  
> > > > > > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > > > > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > > > > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > > > > > >  
> > > > > > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > > > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > > > > > -rm -f $metadump_file $metadump_img
> > > > > > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > > > > > >  max_fname_len=255
> > > > > > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > > > > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > > > > > >  
> > > > > > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > -	version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v $md_version"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > > > > > -
> > > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > > -		slogdev=""
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > > > > > -		echo "xfs_repair on restored fs returned $?"
> > > > > > > > -done
> > > > > > > > +_verify_metadumps '-a -o -w'
> > > > > > > >  
> > > > > > > >  # success, all done
> > > > > > > >  status=0
> > > > > > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > > > > > index 8643c3d483..ff6b344a9c 100755
> > > > > > > > --- a/tests/xfs/503
> > > > > > > > +++ b/tests/xfs/503
> > > > > > > > @@ -17,11 +17,13 @@ _cleanup()
> > > > > > > >  {
> > > > > > > >  	cd /
> > > > > > > >  	rm -rf $tmp.* $testdir
> > > > > > > > +	_cleanup_verify_metadump
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/filter
> > > > > > > >  . ./common/populate
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  testdir=$TEST_DIR/test-$seq
> > > > > > > >  
> > > > > > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > > > > > >  _require_populate_commands
> > > > > > > >  _xfs_skip_online_rebuild
> > > > > > > >  _xfs_skip_offline_rebuild
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > >  echo "Format and populate"
> > > > > > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > > > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > > > > > >  metadump_file=$testdir/scratch.md
> > > > > > > >  copy_file=$testdir/copy.img
> > > > > > > >  
> > > > > > > > -check_restored_metadump_image()
> > > > > > > > -{
> > > > > > > > -	local image=$1
> > > > > > > > -
> > > > > > > > -	loop_dev=$(_create_loop_device $image)
> > > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > > > > > -	_destroy_loop_device $loop_dev
> > > > > > > > -}
> > > > > > > > -
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > >  echo "metadump and mdrestore"
> > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > -	version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v $md_version"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > -done
> > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > >  
> > > > > > > >  echo "metadump a and mdrestore"
> > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > -	version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v $md_version"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > -done
> > > > > > > > +_verify_metadumps '-a'
> > > > > > > >  
> > > > > > > >  echo "metadump g and mdrestore"
> > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > -	version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v $md_version"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > -done
> > > > > > > > +_verify_metadumps '-g' >> $seqres.full
> > > > > > > >  
> > > > > > > >  echo "metadump ag and mdrestore"
> > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > -	version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v $md_version"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > -done
> > > > > > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > > > > > >  
> > > > > > > >  echo copy
> > > > > > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > > > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > > > > > index f2cd7aba98..af917f0f32 100755
> > > > > > > > --- a/tests/xfs/605
> > > > > > > > +++ b/tests/xfs/605
> > > > > > > > @@ -15,17 +15,13 @@ _cleanup()
> > > > > > > >  {
> > > > > > > >  	cd /
> > > > > > > >  	rm -r -f $tmp.*
> > > > > > > > -	_scratch_unmount > /dev/null 2>&1
> > > > > > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > > > > > -	   $TEST_DIR/log-image
> > > > > > > > +	_cleanup_verify_metadump
> > > > > > > >  }
> > > > > > > >  
> > > > > > > >  # Import common functions.
> > > > > > > >  . ./common/dmflakey
> > > > > > > >  . ./common/inject
> > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > >  
> > > > > > > >  # real QA test starts here
> > > > > > > >  _supported_fs xfs
> > > > > > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > > > > > >  _require_dm_target flakey
> > > > > > > >  _require_xfs_io_command "pwrite"
> > > > > > > >  _require_test_program "punch-alternating"
> > > > > > > > +_setup_verify_metadump
> > > > > > > >  
> > > > > > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > > > > > >  testfile=${SCRATCH_MNT}/testfile
> > > > > > > >  
> > > > > > > >  echo "Format filesystem on scratch device"
> > > > > > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > > > > > >  
> > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > -
> > > > > > > >  external_log=0
> > > > > > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > > > > > >  	external_log=1
> > > > > > > >  fi
> > > > > > > >  
> > > > > > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > > > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > > > > > >  	_notrun "metadump v1 does not support external log device"
> > > > > > > >  fi
> > > > > > > >  
> > > > > > > > -verify_metadump_v1()
> > > > > > > > -{
> > > > > > > > -	local version=""
> > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > -		version="-v 1"
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > -
> > > > > > > > -verify_metadump_v2()
> > > > > > > > -{
> > > > > > > > -	local version="-v 2"
> > > > > > > > -
> > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > > -
> > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > -	# from such a metadump file.
> > > > > > > > -	slogdev=""
> > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > -
> > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > -
> > > > > > > > -	logdev=""
> > > > > > > > -	if [[ -s $slogdev ]]; then
> > > > > > > > -		logdev=$(_create_loop_device $slogdev)
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > -
> > > > > > > > -	if [[ -s $logdev ]]; then
> > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > -		logdev=""
> > > > > > > > -		rm -f $slogdev
> > > > > > > > -	fi
> > > > > > > > -
> > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > -	datadev=""
> > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > -}
> > > > > > > > -
> > > > > > > >  echo "Initialize and mount filesystem on flakey device"
> > > > > > > >  _init_flakey
> > > > > > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > > > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > > > > > >  _print_logstate
> > > > > > > >  
> > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > -
> > > > > > > > -if [[ $external_log == 0 ]]; then
> > > > > > > > -	verify_metadump_v1 $max_md_version
> > > > > > > > -fi
> > > > > > > > -
> > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > -	verify_metadump_v2
> > > > > > > > -fi
> > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > >  
> > > > > > > >  # Mount the fs to replay the contents from the dirty log.
> > > > > > > >  _scratch_mount
> > > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > 
> > > 
> > 
> 
>
Zorro Lang Feb. 4, 2024, 6:59 a.m. UTC | #10
On Fri, Feb 02, 2024 at 08:47:08AM -0800, Darrick J. Wong wrote:
> On Thu, Feb 01, 2024 at 02:29:22PM +0800, Zorro Lang wrote:
> > On Wed, Jan 31, 2024 at 11:24:33AM -0800, Darrick J. Wong wrote:
> > > On Wed, Jan 31, 2024 at 10:09:19PM +0800, Zorro Lang wrote:
> > > > On Mon, Jan 29, 2024 at 05:32:07PM -0800, Darrick J. Wong wrote:
> > > > > On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> > > > > > On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > > > > > > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > > > > > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > > > > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > > > > > > 
> > > > > > > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > > > > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > > > > > > duplicate copies of the same code.
> > > > > > > > > 
> > > > > > > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > > > > > > 
> > > > > > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > > > > > > ---
> > > > > > > > >  common/rc                 |   10 ----
> > > > > > > > >  common/xfs                |   14 +++++
> > > > > > > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > > > > >  tests/xfs/129             |   90 ++-------------------------------
> > > > > > > > >  tests/xfs/234             |   91 ++-------------------------------
> > > > > > > > >  tests/xfs/253             |   89 ++-------------------------------
> > > > > > > > >  tests/xfs/291             |   31 ++++-------
> > > > > > > > >  tests/xfs/432             |   30 ++---------
> > > > > > > > >  tests/xfs/503             |   60 +++-------------------
> > > > > > > > >  tests/xfs/605             |   84 ++-----------------------------
> > > > > > > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > > > > > > >  create mode 100644 common/xfs_metadump_tests
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > diff --git a/common/rc b/common/rc
> > > > > > > > > index 524ffa02aa..0b69f7f54f 100644
> > > > > > > > > --- a/common/rc
> > > > > > > > > +++ b/common/rc
> > > > > > > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > > > > > > >  
> > > > > > > > >      case $FSTYP in
> > > > > > > > >      xfs)
> > > > > > > > > -	local scratch_log="none"
> > > > > > > > > -	local scratch_rt="none"
> > > > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > > > -
> > > > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > > > -
> > > > > > > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > > > +	_check_xfs_scratch_fs $device
> > > > > > > > >  	;;
> > > > > > > > >      udf)
> > > > > > > > >  	_check_udf_filesystem $device $udf_fsize
> > > > > > > > > diff --git a/common/xfs b/common/xfs
> > > > > > > > > index 248ccefda3..6a48960a7f 100644
> > > > > > > > > --- a/common/xfs
> > > > > > > > > +++ b/common/xfs
> > > > > > > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > > > > > > >  	return $?
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > > +_check_xfs_scratch_fs()
> > > > > > > > > +{
> > > > > > > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > > > > > > +	local scratch_log="none"
> > > > > > > > > +	local scratch_rt="none"
> > > > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > > > +
> > > > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > > > +
> > > > > > > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > >  # modeled after _scratch_xfs_repair
> > > > > > > > >  _test_xfs_repair()
> > > > > > > > >  {
> > > > > > > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > > > > > > 
> > > > > > > > Hi Darrick,
> > > > > > > > 
> > > > > > > > Thanks for this improvement.
> > > > > > > > 
> > > > > > > > I'm wondering do we need a separated common file only for xfs metadump
> > > > > > > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > > > > > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > > > > > > in common/xfs.
> > > > > > > 
> > > > > > > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > > > > > > files are getting big:
> > > > > > > 
> > > > > > >    509 fstests/common/overlay
> > > > > > >    523 fstests/common/quota
> > > > > > >    550 fstests/common/reflink
> > > > > > >    638 fstests/common/log
> > > > > > >    640 fstests/common/punch
> > > > > > >    663 fstests/common/filter
> > > > > > >    794 fstests/common/btrfs
> > > > > > >    936 fstests/common/config
> > > > > > >   1030 fstests/common/encrypt
> > > > > > >   1162 fstests/common/populate
> > > > > > >   1519 fstests/common/fuzzy
> > > > > > >   1531 fstests/common/dump
> > > > > > >   2218 fstests/common/xfs
> > > > > > >   5437 fstests/common/rc
> > > > > > > 
> > > > > > > with common/xfs being particularly larger than most everything else.
> > > > > > 
> > > > > > Haha, maybe we'll have a common/xfs/ directory in one day :)
> > > > > > 
> > > > > > > 
> > > > > > > Since the common/xfs_metadump_tests functions are shared helper
> > > > > > > functions for testing metadump/mdrestore that are not use by most tests,
> > > > > > > I decided that a split was appropriate both to maintain the (ha!)
> > > > > > > cohesion of common/xfs and not add more bash parsing costs to every
> > > > > > > single testcase.
> > > > > > 
> > > > > > OK, a split makes sense, but I have 3 questions:
> > > > > > 1) Will you move all metadump helpers from common/xfs to this new file?
> > > > > 
> > > > > I don't really want to, because that's another patch and would require
> > > > > careful auditing of all the tests to find the ones that want to use
> > > > > metadump but aren't themselves functional tests of metadump.
> > > > > 
> > > > > IOWs, this new file really is for shared metadump functional testing and
> > > > > not much else.
> > > > 
> > > > OK, I think we can care about this part step by step in the future.
> > > 
> > > <nod>
> > > 
> > > > > 
> > > > > > 2) Can we call it common/metadump? (Not sure if any other fs has metadump
> > > > > >    things:)
> > > > > 
> > > > > Yes, e2image does this for ext*.
> > > > 
> > > > OK, I'll rename this file to common/metadump, and change other patches to
> > > > souce the new name when I merge this patchset. Is that good to you?
> > > 
> > > Sorry, I realized that my statement was ambiguous -- the "yes" applies
> > > to "Not sure if any other fs has metadump things", not "Can we call it
> > > common/metadump?".  The code in common/xfs_metadump_tests is specific to
> > > xfs and is not used for e2image testing, so let's leave the name as-is.
> > 
> > Oh, maybe it can be used for e2image or other metadump helpers later, if
> > we call it common/metadump?
> 
> Sounds ok to me.  Want me to respin?

No, if it's good to you, I can change that on my side. But your might need to
rebase on it later :)

> 
> --D
> 
> > > 
> > > --D
> > > 
> > > > Thanks,
> > > > Zorro
> > > > 
> > > > > 
> > > > > > 3) Or move to common/dump directly? (looks not proper ;-)
> > > > > 
> > > > > dump != metadump; one is for all the files in the fs and none of the
> > > > > non-file metadata; the other is for metadata and none of the files.
> > > > > 
> > > > > --D
> > > > > 
> > > > > > Thanks,
> > > > > > Zorro
> > > > > > 
> > > > > > > 
> > > > > > > --D
> > > > > > > 
> > > > > > > > Thanks,
> > > > > > > > Zorro
> > > > > > > > 
> > > > > > > > > new file mode 100644
> > > > > > > > > index 0000000000..dd3dec1fb4
> > > > > > > > > --- /dev/null
> > > > > > > > > +++ b/common/xfs_metadump_tests
> > > > > > > > > @@ -0,0 +1,123 @@
> > > > > > > > > +#
> > > > > > > > > +# XFS specific metadump testing functions.
> > > > > > > > > +#
> > > > > > > > > +
> > > > > > > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > > > > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > > > > > > +_setup_verify_metadump()
> > > > > > > > > +{
> > > > > > > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > > > > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > > > > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > > > > > > +
> > > > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > +_cleanup_verify_metadump()
> > > > > > > > > +{
> > > > > > > > > +	_scratch_unmount &>> $seqres.full
> > > > > > > > > +
> > > > > > > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > > > > > > +		losetup -d "$ldev"
> > > > > > > > > +	done
> > > > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > > > > > > +# images and fsck them.
> > > > > > > > > +_verify_metadump_v1()
> > > > > > > > > +{
> > > > > > > > > +	local metadump_args="$1"
> > > > > > > > > +	local extra_test="$2"
> > > > > > > > > +
> > > > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > > > +	local version=""
> > > > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > > > +	local data_loop
> > > > > > > > > +
> > > > > > > > > +	# Force v1 if we detect v2 support
> > > > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > > > > > > +		version="-v 1"
> > > > > > > > > +	fi
> > > > > > > > > +
> > > > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > > > +
> > > > > > > > > +	# Restore metadump, which creates data_img
> > > > > > > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > +
> > > > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > > > +
> > > > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > > > > > > +	fi
> > > > > > > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > > > +
> > > > > > > > > +	# Tear down what we created
> > > > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > > > +	rm -f $data_img
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > > > > > > +# images and fsck them.
> > > > > > > > > +_verify_metadump_v2()
> > > > > > > > > +{
> > > > > > > > > +	local metadump_args="$1"
> > > > > > > > > +	local extra_test="$2"
> > > > > > > > > +
> > > > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > > > +	local version="-v 2"
> > > > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > > > +	local data_loop
> > > > > > > > > +	local log_img=""
> > > > > > > > > +	local log_loop
> > > > > > > > > +
> > > > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > > > +
> > > > > > > > > +	#
> > > > > > > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > +	# from such a metadump file.
> > > > > > > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > > > > > > +
> > > > > > > > > +	# Restore metadump, which creates data_img and log_img
> > > > > > > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > > > > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > > > > > > +
> > > > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > > > +
> > > > > > > > > +	# Create loopdev for log device if we recovered anything
> > > > > > > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > > > > > > +
> > > > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > > > > > > +	fi
> > > > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > > > +
> > > > > > > > > +	# Tear down what we created
> > > > > > > > > +	if [ -b "$log_loop" ]; then
> > > > > > > > > +		_destroy_loop_device $log_loop
> > > > > > > > > +		rm -f $log_img
> > > > > > > > > +	fi
> > > > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > > > +	rm -f $data_img
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > > +# Verify both metadump formats if possible
> > > > > > > > > +_verify_metadumps()
> > > > > > > > > +{
> > > > > > > > > +	_verify_metadump_v1 "$@"
> > > > > > > > > +
> > > > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > > > > > > +		_verify_metadump_v2 "$@"
> > > > > > > > > +	fi
> > > > > > > > > +}
> > > > > > > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > > > > > > index cdac2349df..c3a9bcefee 100755
> > > > > > > > > --- a/tests/xfs/129
> > > > > > > > > +++ b/tests/xfs/129
> > > > > > > > > @@ -16,98 +16,23 @@ _cleanup()
> > > > > > > > >  {
> > > > > > > > >      cd /
> > > > > > > > >      _scratch_unmount > /dev/null 2>&1
> > > > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > > > > > > -       $TEST_DIR/log-image
> > > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/filter
> > > > > > > > >  . ./common/reflink
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  # real QA test starts here
> > > > > > > > >  _supported_fs xfs
> > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > >  _require_loop
> > > > > > > > >  _require_scratch_reflink
> > > > > > > > > -
> > > > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v1()
> > > > > > > > > -{
> > > > > > > > > -	local max_version=$1
> > > > > > > > > -	local version=""
> > > > > > > > > -
> > > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > > -		version="-v 1"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v2()
> > > > > > > > > -{
> > > > > > > > > -	version="-v 2"
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > -
> > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > -	# from such a metadump file.
> > > > > > > > > -	slogdev=""
> > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > -
> > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > -		logdev=""
> > > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > > > -
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > >  _scratch_mount
> > > > > > > > >  
> > > > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > > > @@ -127,12 +52,7 @@ done
> > > > > > > > >  _scratch_unmount
> > > > > > > > >  
> > > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > > -
> > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -	verify_metadump_v2
> > > > > > > > > -fi
> > > > > > > > > +_verify_metadumps
> > > > > > > > >  
> > > > > > > > >  # success, all done
> > > > > > > > >  status=0
> > > > > > > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > > > > > > index f4f8af6d3a..8f808c7507 100755
> > > > > > > > > --- a/tests/xfs/234
> > > > > > > > > +++ b/tests/xfs/234
> > > > > > > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > > > > > > >  _cleanup()
> > > > > > > > >  {
> > > > > > > > >      cd /
> > > > > > > > > -    _scratch_unmount > /dev/null 2>&1
> > > > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > > > > > > -       $TEST_DIR/log-image
> > > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/filter
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  # real QA test starts here
> > > > > > > > >  _supported_fs xfs
> > > > > > > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > >  _require_loop
> > > > > > > > >  _require_xfs_scratch_rmapbt
> > > > > > > > >  _require_xfs_io_command "fpunch"
> > > > > > > > > -
> > > > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v1()
> > > > > > > > > -{
> > > > > > > > > -	local max_version=$1
> > > > > > > > > -	local version=""
> > > > > > > > > -
> > > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > > -		version="-v 1"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v2()
> > > > > > > > > -{
> > > > > > > > > -	version="-v 2"
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > -
> > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > -	# from such a metadump file.
> > > > > > > > > -	slogdev=""
> > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > -
> > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > -		logdev=""
> > > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > > > -
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > >  _scratch_mount
> > > > > > > > >  
> > > > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > > > @@ -127,12 +51,7 @@ done
> > > > > > > > >  _scratch_unmount
> > > > > > > > >  
> > > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > > -
> > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -	verify_metadump_v2
> > > > > > > > > -fi
> > > > > > > > > +_verify_metadumps
> > > > > > > > >  
> > > > > > > > >  # success, all done
> > > > > > > > >  status=0
> > > > > > > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > > > > > > index 3b567999d8..6623c435e5 100755
> > > > > > > > > --- a/tests/xfs/253
> > > > > > > > > +++ b/tests/xfs/253
> > > > > > > > > @@ -26,23 +26,21 @@ _cleanup()
> > > > > > > > >      cd /
> > > > > > > > >      rm -f $tmp.*
> > > > > > > > >      rm -rf "${OUTPUT_DIR}"
> > > > > > > > > -    rm -f "${METADUMP_FILE}"
> > > > > > > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/filter
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > >  _require_test
> > > > > > > > >  _require_scratch
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > >  # real QA test starts here
> > > > > > > > >  
> > > > > > > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > > > > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > > > > > > >  ORPHANAGE="lost+found"
> > > > > > > > >  
> > > > > > > > >  _supported_fs xfs
> > > > > > > > > @@ -52,24 +50,7 @@ function create_file() {
> > > > > > > > >  	touch $(printf "$@")
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > > -verify_metadump_v1()
> > > > > > > > > -{
> > > > > > > > > -	local max_version=$1
> > > > > > > > > -	local version=""
> > > > > > > > > -
> > > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > > -		version="-v 1"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > -
> > > > > > > > > +extra_test() {
> > > > > > > > >  	cd "${SCRATCH_MNT}"
> > > > > > > > >  
> > > > > > > > >  	# Get a listing of all the files after obfuscation
> > > > > > > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > > > > > > >  	ls -R | od -c >> $seqres.full
> > > > > > > > >  
> > > > > > > > >  	cd /
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v2()
> > > > > > > > > -{
> > > > > > > > > -	version="-v 2"
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > > > -
> > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > -	# from such a metadump file.
> > > > > > > > > -	slogdev=""
> > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > -
> > > > > > > > > -	cd "${SCRATCH_MNT}"
> > > > > > > > > -
> > > > > > > > > -	# Get a listing of all the files after obfuscation
> > > > > > > > > -	echo "Metadump v2" >> $seqres.full
> > > > > > > > > -	ls -R >> $seqres.full
> > > > > > > > > -	ls -R | od -c >> $seqres.full
> > > > > > > > > -
> > > > > > > > > -	cd /
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > -		logdev=""
> > > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  echo "Disciplyne of silence is goed."
> > > > > > > > > @@ -233,13 +160,7 @@ cd $here
> > > > > > > > >  
> > > > > > > > >  _scratch_unmount
> > > > > > > > >  
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > > -
> > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -	verify_metadump_v2
> > > > > > > > > -fi
> > > > > > > > > +_verify_metadumps '' extra_test
> > > > > > > > >  
> > > > > > > > >  # Finally, re-make the filesystem since to ensure we don't
> > > > > > > > >  # leave a directory with duplicate entries lying around.
> > > > > > > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > > > > > > index 1433140821..c475d89ad9 100755
> > > > > > > > > --- a/tests/xfs/291
> > > > > > > > > +++ b/tests/xfs/291
> > > > > > > > > @@ -9,11 +9,21 @@
> > > > > > > > >  . ./common/preamble
> > > > > > > > >  _begin_fstest auto repair metadump
> > > > > > > > >  
> > > > > > > > > +# Override the default cleanup function.
> > > > > > > > > +_cleanup()
> > > > > > > > > +{
> > > > > > > > > +	cd /
> > > > > > > > > +	rm -r -f $tmp.*
> > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > > +}
> > > > > > > > > +
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/filter
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  _supported_fs xfs
> > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > >  # real QA test starts here
> > > > > > > > >  _require_scratch
> > > > > > > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > > > > > > >  
> > > > > > > > >  # Yes they can!  Now...
> > > > > > > > >  # Can xfs_metadump cope with this monster?
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > -	version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v $md_version"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > > > > > > -		_fail "xfs_metadump failed"
> > > > > > > > > -
> > > > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > > > -		slogdev=""
> > > > > > > > > -	fi
> > > > > > > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > > > > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > > > > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > > > > > > -		_fail "xfs_repair of metadump failed"
> > > > > > > > > -done
> > > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > > >  
> > > > > > > > >  # Yes it can; success, all done
> > > > > > > > >  status=0
> > > > > > > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > > > > > > index 7e402aa88f..579e1b556a 100755
> > > > > > > > > --- a/tests/xfs/432
> > > > > > > > > +++ b/tests/xfs/432
> > > > > > > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > > > > > > >  _cleanup()
> > > > > > > > >  {
> > > > > > > > >  	cd /
> > > > > > > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > > > > > > +	rm -f "$tmp".*
> > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/filter
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  # real QA test starts here
> > > > > > > > >  _supported_fs xfs
> > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > >  _require_scratch
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > >  rm -f "$seqres.full"
> > > > > > > > >  
> > > > > > > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > > > > > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > > > > > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > > > > > > >  
> > > > > > > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > > > > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > > > > > > -rm -f $metadump_file $metadump_img
> > > > > > > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > > > > > > >  max_fname_len=255
> > > > > > > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > > > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > > > > > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > > > > > > >  
> > > > > > > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > -	version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v $md_version"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > > > > > > -
> > > > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > > > -		slogdev=""
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > > > > > > -		echo "xfs_repair on restored fs returned $?"
> > > > > > > > > -done
> > > > > > > > > +_verify_metadumps '-a -o -w'
> > > > > > > > >  
> > > > > > > > >  # success, all done
> > > > > > > > >  status=0
> > > > > > > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > > > > > > index 8643c3d483..ff6b344a9c 100755
> > > > > > > > > --- a/tests/xfs/503
> > > > > > > > > +++ b/tests/xfs/503
> > > > > > > > > @@ -17,11 +17,13 @@ _cleanup()
> > > > > > > > >  {
> > > > > > > > >  	cd /
> > > > > > > > >  	rm -rf $tmp.* $testdir
> > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/filter
> > > > > > > > >  . ./common/populate
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  testdir=$TEST_DIR/test-$seq
> > > > > > > > >  
> > > > > > > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > > > > > > >  _require_populate_commands
> > > > > > > > >  _xfs_skip_online_rebuild
> > > > > > > > >  _xfs_skip_offline_rebuild
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > >  echo "Format and populate"
> > > > > > > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > > > > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > > > > > > >  metadump_file=$testdir/scratch.md
> > > > > > > > >  copy_file=$testdir/copy.img
> > > > > > > > >  
> > > > > > > > > -check_restored_metadump_image()
> > > > > > > > > -{
> > > > > > > > > -	local image=$1
> > > > > > > > > -
> > > > > > > > > -	loop_dev=$(_create_loop_device $image)
> > > > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > > > > > > -	_destroy_loop_device $loop_dev
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > >  echo "metadump and mdrestore"
> > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > -	version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v $md_version"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > -done
> > > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > > >  
> > > > > > > > >  echo "metadump a and mdrestore"
> > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > -	version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v $md_version"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > -done
> > > > > > > > > +_verify_metadumps '-a'
> > > > > > > > >  
> > > > > > > > >  echo "metadump g and mdrestore"
> > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > -	version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v $md_version"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > -done
> > > > > > > > > +_verify_metadumps '-g' >> $seqres.full
> > > > > > > > >  
> > > > > > > > >  echo "metadump ag and mdrestore"
> > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > -	version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v $md_version"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > -done
> > > > > > > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > > > > > > >  
> > > > > > > > >  echo copy
> > > > > > > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > > > > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > > > > > > index f2cd7aba98..af917f0f32 100755
> > > > > > > > > --- a/tests/xfs/605
> > > > > > > > > +++ b/tests/xfs/605
> > > > > > > > > @@ -15,17 +15,13 @@ _cleanup()
> > > > > > > > >  {
> > > > > > > > >  	cd /
> > > > > > > > >  	rm -r -f $tmp.*
> > > > > > > > > -	_scratch_unmount > /dev/null 2>&1
> > > > > > > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > > > > > > -	   $TEST_DIR/log-image
> > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > >  }
> > > > > > > > >  
> > > > > > > > >  # Import common functions.
> > > > > > > > >  . ./common/dmflakey
> > > > > > > > >  . ./common/inject
> > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > >  
> > > > > > > > >  # real QA test starts here
> > > > > > > > >  _supported_fs xfs
> > > > > > > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > > > > > > >  _require_dm_target flakey
> > > > > > > > >  _require_xfs_io_command "pwrite"
> > > > > > > > >  _require_test_program "punch-alternating"
> > > > > > > > > +_setup_verify_metadump
> > > > > > > > >  
> > > > > > > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > > > > > > >  testfile=${SCRATCH_MNT}/testfile
> > > > > > > > >  
> > > > > > > > >  echo "Format filesystem on scratch device"
> > > > > > > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > > > > > > >  
> > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > -
> > > > > > > > >  external_log=0
> > > > > > > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > > > > > > >  	external_log=1
> > > > > > > > >  fi
> > > > > > > > >  
> > > > > > > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > > > > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > > > > > > >  	_notrun "metadump v1 does not support external log device"
> > > > > > > > >  fi
> > > > > > > > >  
> > > > > > > > > -verify_metadump_v1()
> > > > > > > > > -{
> > > > > > > > > -	local version=""
> > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -		version="-v 1"
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > > -verify_metadump_v2()
> > > > > > > > > -{
> > > > > > > > > -	local version="-v 2"
> > > > > > > > > -
> > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > > > -
> > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > -	# from such a metadump file.
> > > > > > > > > -	slogdev=""
> > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > -
> > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > -
> > > > > > > > > -	logdev=""
> > > > > > > > > -	if [[ -s $slogdev ]]; then
> > > > > > > > > -		logdev=$(_create_loop_device $slogdev)
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > -
> > > > > > > > > -	if [[ -s $logdev ]]; then
> > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > -		logdev=""
> > > > > > > > > -		rm -f $slogdev
> > > > > > > > > -	fi
> > > > > > > > > -
> > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > -	datadev=""
> > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > -}
> > > > > > > > > -
> > > > > > > > >  echo "Initialize and mount filesystem on flakey device"
> > > > > > > > >  _init_flakey
> > > > > > > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > > > > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > > > > > > >  _print_logstate
> > > > > > > > >  
> > > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > > -
> > > > > > > > > -if [[ $external_log == 0 ]]; then
> > > > > > > > > -	verify_metadump_v1 $max_md_version
> > > > > > > > > -fi
> > > > > > > > > -
> > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > -	verify_metadump_v2
> > > > > > > > > -fi
> > > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > > >  
> > > > > > > > >  # Mount the fs to replay the contents from the dirty log.
> > > > > > > > >  _scratch_mount
> > > > > > > > > 
> > > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > 
> > 
>
Zorro Lang Feb. 4, 2024, 7:14 a.m. UTC | #11
On Sun, Feb 04, 2024 at 02:59:42PM +0800, Zorro Lang wrote:
> On Fri, Feb 02, 2024 at 08:47:08AM -0800, Darrick J. Wong wrote:
> > On Thu, Feb 01, 2024 at 02:29:22PM +0800, Zorro Lang wrote:
> > > On Wed, Jan 31, 2024 at 11:24:33AM -0800, Darrick J. Wong wrote:
> > > > On Wed, Jan 31, 2024 at 10:09:19PM +0800, Zorro Lang wrote:
> > > > > On Mon, Jan 29, 2024 at 05:32:07PM -0800, Darrick J. Wong wrote:
> > > > > > On Sun, Jan 28, 2024 at 09:23:04PM +0800, Zorro Lang wrote:
> > > > > > > On Sat, Jan 27, 2024 at 09:22:22AM -0800, Darrick J. Wong wrote:
> > > > > > > > On Sat, Jan 27, 2024 at 04:47:14PM +0800, Zorro Lang wrote:
> > > > > > > > > On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > > > > > > > > > From: Darrick J. Wong <djwong@kernel.org>
> > > > > > > > > > 
> > > > > > > > > > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > > > > > > > > > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > > > > > > > > > duplicate copies of the same code.
> > > > > > > > > > 
> > > > > > > > > > While we're at it, fix the fsck so that it includes xfs_scrub.
> > > > > > > > > > 
> > > > > > > > > > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > > > > > > > > > ---
> > > > > > > > > >  common/rc                 |   10 ----
> > > > > > > > > >  common/xfs                |   14 +++++
> > > > > > > > > >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > > > > > >  tests/xfs/129             |   90 ++-------------------------------
> > > > > > > > > >  tests/xfs/234             |   91 ++-------------------------------
> > > > > > > > > >  tests/xfs/253             |   89 ++-------------------------------
> > > > > > > > > >  tests/xfs/291             |   31 ++++-------
> > > > > > > > > >  tests/xfs/432             |   30 ++---------
> > > > > > > > > >  tests/xfs/503             |   60 +++-------------------
> > > > > > > > > >  tests/xfs/605             |   84 ++-----------------------------
> > > > > > > > > >  10 files changed, 181 insertions(+), 441 deletions(-)
> > > > > > > > > >  create mode 100644 common/xfs_metadump_tests
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > > diff --git a/common/rc b/common/rc
> > > > > > > > > > index 524ffa02aa..0b69f7f54f 100644
> > > > > > > > > > --- a/common/rc
> > > > > > > > > > +++ b/common/rc
> > > > > > > > > > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> > > > > > > > > >  
> > > > > > > > > >      case $FSTYP in
> > > > > > > > > >      xfs)
> > > > > > > > > > -	local scratch_log="none"
> > > > > > > > > > -	local scratch_rt="none"
> > > > > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > > > > -	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > > > > -
> > > > > > > > > > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > > > > -	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > > > > -
> > > > > > > > > > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > > > > +	_check_xfs_scratch_fs $device
> > > > > > > > > >  	;;
> > > > > > > > > >      udf)
> > > > > > > > > >  	_check_udf_filesystem $device $udf_fsize
> > > > > > > > > > diff --git a/common/xfs b/common/xfs
> > > > > > > > > > index 248ccefda3..6a48960a7f 100644
> > > > > > > > > > --- a/common/xfs
> > > > > > > > > > +++ b/common/xfs
> > > > > > > > > > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> > > > > > > > > >  	return $?
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > > +_check_xfs_scratch_fs()
> > > > > > > > > > +{
> > > > > > > > > > +	local device="${1:-$SCRATCH_DEV}"
> > > > > > > > > > +	local scratch_log="none"
> > > > > > > > > > +	local scratch_rt="none"
> > > > > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > > > > > > > > > +	    scratch_log="$SCRATCH_LOGDEV"
> > > > > > > > > > +
> > > > > > > > > > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > > > > > > > > > +	    scratch_rt="$SCRATCH_RTDEV"
> > > > > > > > > > +
> > > > > > > > > > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > >  # modeled after _scratch_xfs_repair
> > > > > > > > > >  _test_xfs_repair()
> > > > > > > > > >  {
> > > > > > > > > > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > > > > > > > > 
> > > > > > > > > Hi Darrick,
> > > > > > > > > 
> > > > > > > > > Thanks for this improvement.
> > > > > > > > > 
> > > > > > > > > I'm wondering do we need a separated common file only for xfs metadump
> > > > > > > > > helpers ? Can't they be in common/xfs ? There're already _xfs_metadump(),
> > > > > > > > > _xfs_mdrestore(), _scratch_xfs_metadump(), _scratch_xfs_mdrestore() etc
> > > > > > > > > in common/xfs.
> > > > > > > > 
> > > > > > > > Yes, that's certainly possible, but keep in mind that common/$FSTYP
> > > > > > > > files are getting big:
> > > > > > > > 
> > > > > > > >    509 fstests/common/overlay
> > > > > > > >    523 fstests/common/quota
> > > > > > > >    550 fstests/common/reflink
> > > > > > > >    638 fstests/common/log
> > > > > > > >    640 fstests/common/punch
> > > > > > > >    663 fstests/common/filter
> > > > > > > >    794 fstests/common/btrfs
> > > > > > > >    936 fstests/common/config
> > > > > > > >   1030 fstests/common/encrypt
> > > > > > > >   1162 fstests/common/populate
> > > > > > > >   1519 fstests/common/fuzzy
> > > > > > > >   1531 fstests/common/dump
> > > > > > > >   2218 fstests/common/xfs
> > > > > > > >   5437 fstests/common/rc
> > > > > > > > 
> > > > > > > > with common/xfs being particularly larger than most everything else.
> > > > > > > 
> > > > > > > Haha, maybe we'll have a common/xfs/ directory in one day :)
> > > > > > > 
> > > > > > > > 
> > > > > > > > Since the common/xfs_metadump_tests functions are shared helper
> > > > > > > > functions for testing metadump/mdrestore that are not use by most tests,
> > > > > > > > I decided that a split was appropriate both to maintain the (ha!)
> > > > > > > > cohesion of common/xfs and not add more bash parsing costs to every
> > > > > > > > single testcase.
> > > > > > > 
> > > > > > > OK, a split makes sense, but I have 3 questions:
> > > > > > > 1) Will you move all metadump helpers from common/xfs to this new file?
> > > > > > 
> > > > > > I don't really want to, because that's another patch and would require
> > > > > > careful auditing of all the tests to find the ones that want to use
> > > > > > metadump but aren't themselves functional tests of metadump.
> > > > > > 
> > > > > > IOWs, this new file really is for shared metadump functional testing and
> > > > > > not much else.
> > > > > 
> > > > > OK, I think we can care about this part step by step in the future.
> > > > 
> > > > <nod>
> > > > 
> > > > > > 
> > > > > > > 2) Can we call it common/metadump? (Not sure if any other fs has metadump
> > > > > > >    things:)
> > > > > > 
> > > > > > Yes, e2image does this for ext*.
> > > > > 
> > > > > OK, I'll rename this file to common/metadump, and change other patches to
> > > > > souce the new name when I merge this patchset. Is that good to you?
> > > > 
> > > > Sorry, I realized that my statement was ambiguous -- the "yes" applies
> > > > to "Not sure if any other fs has metadump things", not "Can we call it
> > > > common/metadump?".  The code in common/xfs_metadump_tests is specific to
> > > > xfs and is not used for e2image testing, so let's leave the name as-is.
> > > 
> > > Oh, maybe it can be used for e2image or other metadump helpers later, if
> > > we call it common/metadump?
> > 
> > Sounds ok to me.  Want me to respin?
> 
> No, if it's good to you, I can change that on my side. But your might need to
> rebase on it later :)

Oh... it's not simple to rename the file name only. All helpers are xfs specific,
if we change the file name to common/metadump, those xfs specific function names
should all have "xfs" prefix. I'd like not to change too much locally without
reviewing. I think we can have this patchset at first, then change it later when
we have more metadump helpers for other filesystems, or when you'd like to change
that in later "random fixes from Darrick".

Thanks,
Zorro

> 
> > 
> > --D
> > 
> > > > 
> > > > --D
> > > > 
> > > > > Thanks,
> > > > > Zorro
> > > > > 
> > > > > > 
> > > > > > > 3) Or move to common/dump directly? (looks not proper ;-)
> > > > > > 
> > > > > > dump != metadump; one is for all the files in the fs and none of the
> > > > > > non-file metadata; the other is for metadata and none of the files.
> > > > > > 
> > > > > > --D
> > > > > > 
> > > > > > > Thanks,
> > > > > > > Zorro
> > > > > > > 
> > > > > > > > 
> > > > > > > > --D
> > > > > > > > 
> > > > > > > > > Thanks,
> > > > > > > > > Zorro
> > > > > > > > > 
> > > > > > > > > > new file mode 100644
> > > > > > > > > > index 0000000000..dd3dec1fb4
> > > > > > > > > > --- /dev/null
> > > > > > > > > > +++ b/common/xfs_metadump_tests
> > > > > > > > > > @@ -0,0 +1,123 @@
> > > > > > > > > > +#
> > > > > > > > > > +# XFS specific metadump testing functions.
> > > > > > > > > > +#
> > > > > > > > > > +
> > > > > > > > > > +# Set up environment variables for a metadump test.  Requires the test and
> > > > > > > > > > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > > > > > > > > > +_setup_verify_metadump()
> > > > > > > > > > +{
> > > > > > > > > > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > > > > > > > > > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > > > > > > > > > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > > > > > > > > > +
> > > > > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > > +_cleanup_verify_metadump()
> > > > > > > > > > +{
> > > > > > > > > > +	_scratch_unmount &>> $seqres.full
> > > > > > > > > > +
> > > > > > > > > > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > > > > > > > > > +		losetup -d "$ldev"
> > > > > > > > > > +	done
> > > > > > > > > > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > > > > > > > > > +# images and fsck them.
> > > > > > > > > > +_verify_metadump_v1()
> > > > > > > > > > +{
> > > > > > > > > > +	local metadump_args="$1"
> > > > > > > > > > +	local extra_test="$2"
> > > > > > > > > > +
> > > > > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > > > > +	local version=""
> > > > > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > > > > +	local data_loop
> > > > > > > > > > +
> > > > > > > > > > +	# Force v1 if we detect v2 support
> > > > > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > > > > > > > > > +		version="-v 1"
> > > > > > > > > > +	fi
> > > > > > > > > > +
> > > > > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > > > > +
> > > > > > > > > > +	# Restore metadump, which creates data_img
> > > > > > > > > > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > +
> > > > > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > > > > +
> > > > > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_mount
> > > > > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > > > > +		SCRATCH_DEV=$data_loop $extra_test
> > > > > > > > > > +	fi
> > > > > > > > > > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > > > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > > > > +
> > > > > > > > > > +	# Tear down what we created
> > > > > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > > > > +	rm -f $data_img
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > > > > > > > > > +# images and fsck them.
> > > > > > > > > > +_verify_metadump_v2()
> > > > > > > > > > +{
> > > > > > > > > > +	local metadump_args="$1"
> > > > > > > > > > +	local extra_test="$2"
> > > > > > > > > > +
> > > > > > > > > > +	local metadump_file="$XFS_METADUMP_FILE"
> > > > > > > > > > +	local version="-v 2"
> > > > > > > > > > +	local data_img="$XFS_METADUMP_IMG.data"
> > > > > > > > > > +	local data_loop
> > > > > > > > > > +	local log_img=""
> > > > > > > > > > +	local log_loop
> > > > > > > > > > +
> > > > > > > > > > +	# Capture metadump, which creates metadump_file
> > > > > > > > > > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > > > > > > > > > +
> > > > > > > > > > +	#
> > > > > > > > > > +	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > > +	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > > +	# from such a metadump file.
> > > > > > > > > > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > > > > > > > > > +
> > > > > > > > > > +	# Restore metadump, which creates data_img and log_img
> > > > > > > > > > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > > > > > > > > > +		_scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > +
> > > > > > > > > > +	# Create loopdev for data device so we can mount the fs
> > > > > > > > > > +	data_loop=$(_create_loop_device $data_img)
> > > > > > > > > > +
> > > > > > > > > > +	# Create loopdev for log device if we recovered anything
> > > > > > > > > > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > > > > > > > > > +
> > > > > > > > > > +	# Mount fs, run an extra test, fsck, and unmount
> > > > > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > > > > > > > > > +	if [ -n "$extra_test" ]; then
> > > > > > > > > > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > > > > > > > > > +	fi
> > > > > > > > > > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > > > > > > > > > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > > > > > > > > > +
> > > > > > > > > > +	# Tear down what we created
> > > > > > > > > > +	if [ -b "$log_loop" ]; then
> > > > > > > > > > +		_destroy_loop_device $log_loop
> > > > > > > > > > +		rm -f $log_img
> > > > > > > > > > +	fi
> > > > > > > > > > +	_destroy_loop_device $data_loop
> > > > > > > > > > +	rm -f $data_img
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > > +# Verify both metadump formats if possible
> > > > > > > > > > +_verify_metadumps()
> > > > > > > > > > +{
> > > > > > > > > > +	_verify_metadump_v1 "$@"
> > > > > > > > > > +
> > > > > > > > > > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > > > > > > > > > +		_verify_metadump_v2 "$@"
> > > > > > > > > > +	fi
> > > > > > > > > > +}
> > > > > > > > > > diff --git a/tests/xfs/129 b/tests/xfs/129
> > > > > > > > > > index cdac2349df..c3a9bcefee 100755
> > > > > > > > > > --- a/tests/xfs/129
> > > > > > > > > > +++ b/tests/xfs/129
> > > > > > > > > > @@ -16,98 +16,23 @@ _cleanup()
> > > > > > > > > >  {
> > > > > > > > > >      cd /
> > > > > > > > > >      _scratch_unmount > /dev/null 2>&1
> > > > > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > > > > > > > > > -       $TEST_DIR/log-image
> > > > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/filter
> > > > > > > > > >  . ./common/reflink
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  # real QA test starts here
> > > > > > > > > >  _supported_fs xfs
> > > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > > >  _require_loop
> > > > > > > > > >  _require_scratch_reflink
> > > > > > > > > > -
> > > > > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v1()
> > > > > > > > > > -{
> > > > > > > > > > -	local max_version=$1
> > > > > > > > > > -	local version=""
> > > > > > > > > > -
> > > > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > > > -		version="-v 1"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v2()
> > > > > > > > > > -{
> > > > > > > > > > -	version="-v 2"
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > > -
> > > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > > -	# from such a metadump file.
> > > > > > > > > > -	slogdev=""
> > > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > > -
> > > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > > -		logdev=""
> > > > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > > > > -
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > >  _scratch_mount
> > > > > > > > > >  
> > > > > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > > > > @@ -127,12 +52,7 @@ done
> > > > > > > > > >  _scratch_unmount
> > > > > > > > > >  
> > > > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > > > -
> > > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -	verify_metadump_v2
> > > > > > > > > > -fi
> > > > > > > > > > +_verify_metadumps
> > > > > > > > > >  
> > > > > > > > > >  # success, all done
> > > > > > > > > >  status=0
> > > > > > > > > > diff --git a/tests/xfs/234 b/tests/xfs/234
> > > > > > > > > > index f4f8af6d3a..8f808c7507 100755
> > > > > > > > > > --- a/tests/xfs/234
> > > > > > > > > > +++ b/tests/xfs/234
> > > > > > > > > > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> > > > > > > > > >  _cleanup()
> > > > > > > > > >  {
> > > > > > > > > >      cd /
> > > > > > > > > > -    _scratch_unmount > /dev/null 2>&1
> > > > > > > > > > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > > > > > > > > > -       $TEST_DIR/log-image
> > > > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > > > +    rm -rf $tmp.* $testdir
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/filter
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  # real QA test starts here
> > > > > > > > > >  _supported_fs xfs
> > > > > > > > > > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > > >  _require_loop
> > > > > > > > > >  _require_xfs_scratch_rmapbt
> > > > > > > > > >  _require_xfs_io_command "fpunch"
> > > > > > > > > > -
> > > > > > > > > > -metadump_file=$TEST_DIR/${seq}_metadump
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v1()
> > > > > > > > > > -{
> > > > > > > > > > -	local max_version=$1
> > > > > > > > > > -	local version=""
> > > > > > > > > > -
> > > > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > > > -		version="-v 1"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	logdev=$SCRATCH_LOGDEV
> > > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v2()
> > > > > > > > > > -{
> > > > > > > > > > -	version="-v 2"
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file $version
> > > > > > > > > > -
> > > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > > -	# from such a metadump file.
> > > > > > > > > > -	slogdev=""
> > > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	[[ -z $logdev ]] && logdev=none
> > > > > > > > > > -	_check_xfs_filesystem $datadev $logdev none
> > > > > > > > > > -
> > > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > > -		logdev=""
> > > > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > >  _scratch_mkfs >/dev/null 2>&1
> > > > > > > > > > -
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > >  _scratch_mount
> > > > > > > > > >  
> > > > > > > > > >  testdir=$SCRATCH_MNT/test-$seq
> > > > > > > > > > @@ -127,12 +51,7 @@ done
> > > > > > > > > >  _scratch_unmount
> > > > > > > > > >  
> > > > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > > > -
> > > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -	verify_metadump_v2
> > > > > > > > > > -fi
> > > > > > > > > > +_verify_metadumps
> > > > > > > > > >  
> > > > > > > > > >  # success, all done
> > > > > > > > > >  status=0
> > > > > > > > > > diff --git a/tests/xfs/253 b/tests/xfs/253
> > > > > > > > > > index 3b567999d8..6623c435e5 100755
> > > > > > > > > > --- a/tests/xfs/253
> > > > > > > > > > +++ b/tests/xfs/253
> > > > > > > > > > @@ -26,23 +26,21 @@ _cleanup()
> > > > > > > > > >      cd /
> > > > > > > > > >      rm -f $tmp.*
> > > > > > > > > >      rm -rf "${OUTPUT_DIR}"
> > > > > > > > > > -    rm -f "${METADUMP_FILE}"
> > > > > > > > > > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > > -	    _destroy_loop_device $logdev
> > > > > > > > > > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > > +    _cleanup_verify_metadump
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/filter
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > > >  _require_test
> > > > > > > > > >  _require_scratch
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > >  # real QA test starts here
> > > > > > > > > >  
> > > > > > > > > >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > > > > > > > > > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> > > > > > > > > >  ORPHANAGE="lost+found"
> > > > > > > > > >  
> > > > > > > > > >  _supported_fs xfs
> > > > > > > > > > @@ -52,24 +50,7 @@ function create_file() {
> > > > > > > > > >  	touch $(printf "$@")
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > > -verify_metadump_v1()
> > > > > > > > > > -{
> > > > > > > > > > -	local max_version=$1
> > > > > > > > > > -	local version=""
> > > > > > > > > > -
> > > > > > > > > > -	if [[ $max_version == 2 ]]; then
> > > > > > > > > > -		version="-v 1"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > > -
> > > > > > > > > > +extra_test() {
> > > > > > > > > >  	cd "${SCRATCH_MNT}"
> > > > > > > > > >  
> > > > > > > > > >  	# Get a listing of all the files after obfuscation
> > > > > > > > > > @@ -78,60 +59,6 @@ verify_metadump_v1()
> > > > > > > > > >  	ls -R | od -c >> $seqres.full
> > > > > > > > > >  
> > > > > > > > > >  	cd /
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v2()
> > > > > > > > > > -{
> > > > > > > > > > -	version="-v 2"
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > > > > > > > > > -
> > > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > > -	# from such a metadump file.
> > > > > > > > > > -	slogdev=""
> > > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	logdev=${SCRATCH_LOGDEV}
> > > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > > -
> > > > > > > > > > -	cd "${SCRATCH_MNT}"
> > > > > > > > > > -
> > > > > > > > > > -	# Get a listing of all the files after obfuscation
> > > > > > > > > > -	echo "Metadump v2" >> $seqres.full
> > > > > > > > > > -	ls -R >> $seqres.full
> > > > > > > > > > -	ls -R | od -c >> $seqres.full
> > > > > > > > > > -
> > > > > > > > > > -	cd /
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	if [[ -s $TEST_DIR/log-image ]]; then
> > > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > > -		logdev=""
> > > > > > > > > > -		rm -f $TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  echo "Disciplyne of silence is goed."
> > > > > > > > > > @@ -233,13 +160,7 @@ cd $here
> > > > > > > > > >  
> > > > > > > > > >  _scratch_unmount
> > > > > > > > > >  
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v1 $max_md_version
> > > > > > > > > > -
> > > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -	verify_metadump_v2
> > > > > > > > > > -fi
> > > > > > > > > > +_verify_metadumps '' extra_test
> > > > > > > > > >  
> > > > > > > > > >  # Finally, re-make the filesystem since to ensure we don't
> > > > > > > > > >  # leave a directory with duplicate entries lying around.
> > > > > > > > > > diff --git a/tests/xfs/291 b/tests/xfs/291
> > > > > > > > > > index 1433140821..c475d89ad9 100755
> > > > > > > > > > --- a/tests/xfs/291
> > > > > > > > > > +++ b/tests/xfs/291
> > > > > > > > > > @@ -9,11 +9,21 @@
> > > > > > > > > >  . ./common/preamble
> > > > > > > > > >  _begin_fstest auto repair metadump
> > > > > > > > > >  
> > > > > > > > > > +# Override the default cleanup function.
> > > > > > > > > > +_cleanup()
> > > > > > > > > > +{
> > > > > > > > > > +	cd /
> > > > > > > > > > +	rm -r -f $tmp.*
> > > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > > > +}
> > > > > > > > > > +
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/filter
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  _supported_fs xfs
> > > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > >  # real QA test starts here
> > > > > > > > > >  _require_scratch
> > > > > > > > > > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> > > > > > > > > >  
> > > > > > > > > >  # Yes they can!  Now...
> > > > > > > > > >  # Can xfs_metadump cope with this monster?
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > > -	version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v $md_version"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > > > > > > > > > -		_fail "xfs_metadump failed"
> > > > > > > > > > -
> > > > > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > > > > -		slogdev=""
> > > > > > > > > > -	fi
> > > > > > > > > > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > > > > > > > > > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > > > > > > > > > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > > > > > > > > > -		_fail "xfs_repair of metadump failed"
> > > > > > > > > > -done
> > > > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > > > >  
> > > > > > > > > >  # Yes it can; success, all done
> > > > > > > > > >  status=0
> > > > > > > > > > diff --git a/tests/xfs/432 b/tests/xfs/432
> > > > > > > > > > index 7e402aa88f..579e1b556a 100755
> > > > > > > > > > --- a/tests/xfs/432
> > > > > > > > > > +++ b/tests/xfs/432
> > > > > > > > > > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> > > > > > > > > >  _cleanup()
> > > > > > > > > >  {
> > > > > > > > > >  	cd /
> > > > > > > > > > -	rm -f "$tmp".* $metadump_file $metadump_img
> > > > > > > > > > +	rm -f "$tmp".*
> > > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/filter
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  # real QA test starts here
> > > > > > > > > >  _supported_fs xfs
> > > > > > > > > >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > > > > > > > > >  _require_scratch
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > >  rm -f "$seqres.full"
> > > > > > > > > >  
> > > > > > > > > > @@ -54,9 +57,6 @@ echo "Format and mount"
> > > > > > > > > >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> > > > > > > > > >  _scratch_mount >> "$seqres.full" 2>&1
> > > > > > > > > >  
> > > > > > > > > > -metadump_file="$TEST_DIR/meta-$seq"
> > > > > > > > > > -metadump_img="$TEST_DIR/img-$seq"
> > > > > > > > > > -rm -f $metadump_file $metadump_img
> > > > > > > > > >  testdir="$SCRATCH_MNT/test-$seq"
> > > > > > > > > >  max_fname_len=255
> > > > > > > > > >  blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > > > > > > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> > > > > > > > > >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> > > > > > > > > >  
> > > > > > > > > >  echo "Try to metadump, restore and check restored metadump image"
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > > -	version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v $md_version"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > > > > > > > > > -
> > > > > > > > > > -	slogdev=$SCRATCH_LOGDEV
> > > > > > > > > > -	if [[ -z $version || $version == "-v 1" ]]; then
> > > > > > > > > > -		slogdev=""
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > > > > > > > > > -		echo "xfs_repair on restored fs returned $?"
> > > > > > > > > > -done
> > > > > > > > > > +_verify_metadumps '-a -o -w'
> > > > > > > > > >  
> > > > > > > > > >  # success, all done
> > > > > > > > > >  status=0
> > > > > > > > > > diff --git a/tests/xfs/503 b/tests/xfs/503
> > > > > > > > > > index 8643c3d483..ff6b344a9c 100755
> > > > > > > > > > --- a/tests/xfs/503
> > > > > > > > > > +++ b/tests/xfs/503
> > > > > > > > > > @@ -17,11 +17,13 @@ _cleanup()
> > > > > > > > > >  {
> > > > > > > > > >  	cd /
> > > > > > > > > >  	rm -rf $tmp.* $testdir
> > > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/filter
> > > > > > > > > >  . ./common/populate
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  testdir=$TEST_DIR/test-$seq
> > > > > > > > > >  
> > > > > > > > > > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> > > > > > > > > >  _require_populate_commands
> > > > > > > > > >  _xfs_skip_online_rebuild
> > > > > > > > > >  _xfs_skip_offline_rebuild
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > >  echo "Format and populate"
> > > > > > > > > >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > > > > > > > > > @@ -43,66 +46,17 @@ mkdir -p $testdir
> > > > > > > > > >  metadump_file=$testdir/scratch.md
> > > > > > > > > >  copy_file=$testdir/copy.img
> > > > > > > > > >  
> > > > > > > > > > -check_restored_metadump_image()
> > > > > > > > > > -{
> > > > > > > > > > -	local image=$1
> > > > > > > > > > -
> > > > > > > > > > -	loop_dev=$(_create_loop_device $image)
> > > > > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > > > > > > > > > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > > > > > > > > > -	_destroy_loop_device $loop_dev
> > > > > > > > > > -}
> > > > > > > > > > -
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > >  echo "metadump and mdrestore"
> > > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > > -	version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v $md_version"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > > -done
> > > > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > > > >  
> > > > > > > > > >  echo "metadump a and mdrestore"
> > > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > > -	version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v $md_version"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > > -done
> > > > > > > > > > +_verify_metadumps '-a'
> > > > > > > > > >  
> > > > > > > > > >  echo "metadump g and mdrestore"
> > > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > > -	version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v $md_version"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > > -done
> > > > > > > > > > +_verify_metadumps '-g' >> $seqres.full
> > > > > > > > > >  
> > > > > > > > > >  echo "metadump ag and mdrestore"
> > > > > > > > > > -for md_version in $(seq 1 $max_md_version); do
> > > > > > > > > > -	version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v $md_version"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -	check_restored_metadump_image $TEST_DIR/image
> > > > > > > > > > -done
> > > > > > > > > > +_verify_metadumps '-a -g' >> $seqres.full
> > > > > > > > > >  
> > > > > > > > > >  echo copy
> > > > > > > > > >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > > > > > > > > > diff --git a/tests/xfs/605 b/tests/xfs/605
> > > > > > > > > > index f2cd7aba98..af917f0f32 100755
> > > > > > > > > > --- a/tests/xfs/605
> > > > > > > > > > +++ b/tests/xfs/605
> > > > > > > > > > @@ -15,17 +15,13 @@ _cleanup()
> > > > > > > > > >  {
> > > > > > > > > >  	cd /
> > > > > > > > > >  	rm -r -f $tmp.*
> > > > > > > > > > -	_scratch_unmount > /dev/null 2>&1
> > > > > > > > > > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > > > > > > > > > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > > > > > > > > > -	   $TEST_DIR/log-image
> > > > > > > > > > +	_cleanup_verify_metadump
> > > > > > > > > >  }
> > > > > > > > > >  
> > > > > > > > > >  # Import common functions.
> > > > > > > > > >  . ./common/dmflakey
> > > > > > > > > >  . ./common/inject
> > > > > > > > > > +. ./common/xfs_metadump_tests
> > > > > > > > > >  
> > > > > > > > > >  # real QA test starts here
> > > > > > > > > >  _supported_fs xfs
> > > > > > > > > > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> > > > > > > > > >  _require_dm_target flakey
> > > > > > > > > >  _require_xfs_io_command "pwrite"
> > > > > > > > > >  _require_test_program "punch-alternating"
> > > > > > > > > > +_setup_verify_metadump
> > > > > > > > > >  
> > > > > > > > > > -metadump_file=${TEST_DIR}/${seq}.md
> > > > > > > > > >  testfile=${SCRATCH_MNT}/testfile
> > > > > > > > > >  
> > > > > > > > > >  echo "Format filesystem on scratch device"
> > > > > > > > > >  _scratch_mkfs >> $seqres.full 2>&1
> > > > > > > > > >  
> > > > > > > > > > -max_md_version=$(_xfs_metadump_max_version)
> > > > > > > > > > -
> > > > > > > > > >  external_log=0
> > > > > > > > > >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> > > > > > > > > >  	external_log=1
> > > > > > > > > >  fi
> > > > > > > > > >  
> > > > > > > > > > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > > > > > > > > > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> > > > > > > > > >  	_notrun "metadump v1 does not support external log device"
> > > > > > > > > >  fi
> > > > > > > > > >  
> > > > > > > > > > -verify_metadump_v1()
> > > > > > > > > > -{
> > > > > > > > > > -	local version=""
> > > > > > > > > > -	if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -		version="-v 1"
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > > > > > > > > > -	SCRATCH_DEV=$datadev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > -
> > > > > > > > > > -verify_metadump_v2()
> > > > > > > > > > -{
> > > > > > > > > > -	local version="-v 2"
> > > > > > > > > > -
> > > > > > > > > > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > > > > > > > > > -
> > > > > > > > > > -	# Metadump v2 files can contain contents dumped from an external log
> > > > > > > > > > -	# device. Use a temporary file to hold the log device contents restored
> > > > > > > > > > -	# from such a metadump file.
> > > > > > > > > > -	slogdev=""
> > > > > > > > > > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > > > > > > > > > -		slogdev=$TEST_DIR/log-image
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > > > > > > > > > -		   _scratch_xfs_mdrestore $metadump_file
> > > > > > > > > > -
> > > > > > > > > > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > > > > > > > > > -
> > > > > > > > > > -	logdev=""
> > > > > > > > > > -	if [[ -s $slogdev ]]; then
> > > > > > > > > > -		logdev=$(_create_loop_device $slogdev)
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > > > > > > > > > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > > > > > > > > > -
> > > > > > > > > > -	if [[ -s $logdev ]]; then
> > > > > > > > > > -		_destroy_loop_device $logdev
> > > > > > > > > > -		logdev=""
> > > > > > > > > > -		rm -f $slogdev
> > > > > > > > > > -	fi
> > > > > > > > > > -
> > > > > > > > > > -	_destroy_loop_device $datadev
> > > > > > > > > > -	datadev=""
> > > > > > > > > > -	rm -f $TEST_DIR/data-image
> > > > > > > > > > -}
> > > > > > > > > > -
> > > > > > > > > >  echo "Initialize and mount filesystem on flakey device"
> > > > > > > > > >  _init_flakey
> > > > > > > > > >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > > > > > > > > > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> > > > > > > > > >  _print_logstate
> > > > > > > > > >  
> > > > > > > > > >  echo "Create metadump file, restore it and check restored fs"
> > > > > > > > > > -
> > > > > > > > > > -if [[ $external_log == 0 ]]; then
> > > > > > > > > > -	verify_metadump_v1 $max_md_version
> > > > > > > > > > -fi
> > > > > > > > > > -
> > > > > > > > > > -if [[ $max_md_version == 2 ]]; then
> > > > > > > > > > -	verify_metadump_v2
> > > > > > > > > > -fi
> > > > > > > > > > +_verify_metadumps '-a -o'
> > > > > > > > > >  
> > > > > > > > > >  # Mount the fs to replay the contents from the dirty log.
> > > > > > > > > >  _scratch_mount
> > > > > > > > > > 
> > > > > > > > > 
> > > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > 
> > > > > 
> > > > > 
> > > > 
> > > 
> > > 
> >
Zorro Lang Feb. 5, 2024, 9:37 a.m. UTC | #12
On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> duplicate copies of the same code.
> 
> While we're at it, fix the fsck so that it includes xfs_scrub.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  common/rc                 |   10 ----
>  common/xfs                |   14 +++++
>  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/129             |   90 ++-------------------------------
>  tests/xfs/234             |   91 ++-------------------------------
>  tests/xfs/253             |   89 ++-------------------------------
>  tests/xfs/291             |   31 ++++-------
>  tests/xfs/432             |   30 ++---------
>  tests/xfs/503             |   60 +++-------------------
>  tests/xfs/605             |   84 ++-----------------------------
>  10 files changed, 181 insertions(+), 441 deletions(-)
>  create mode 100644 common/xfs_metadump_tests
> 
> 
> diff --git a/common/rc b/common/rc
> index 524ffa02aa..0b69f7f54f 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -3320,15 +3320,7 @@ _check_scratch_fs()
>  
>      case $FSTYP in
>      xfs)
> -	local scratch_log="none"
> -	local scratch_rt="none"
> -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> -	    scratch_log="$SCRATCH_LOGDEV"
> -
> -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> -	    scratch_rt="$SCRATCH_RTDEV"
> -
> -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> +	_check_xfs_scratch_fs $device
>  	;;
>      udf)
>  	_check_udf_filesystem $device $udf_fsize
> diff --git a/common/xfs b/common/xfs
> index 248ccefda3..6a48960a7f 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
>  	return $?
>  }
>  
> +_check_xfs_scratch_fs()
> +{
> +	local device="${1:-$SCRATCH_DEV}"
> +	local scratch_log="none"
> +	local scratch_rt="none"
> +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> +	    scratch_log="$SCRATCH_LOGDEV"
> +
> +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> +	    scratch_rt="$SCRATCH_RTDEV"
> +
> +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> +}
> +
>  # modeled after _scratch_xfs_repair
>  _test_xfs_repair()
>  {
> diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> new file mode 100644
> index 0000000000..dd3dec1fb4
> --- /dev/null
> +++ b/common/xfs_metadump_tests
> @@ -0,0 +1,123 @@
> +#
> +# XFS specific metadump testing functions.
> +#
> +
> +# Set up environment variables for a metadump test.  Requires the test and
> +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> +_setup_verify_metadump()
> +{
> +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> +
> +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> +}
> +
> +_cleanup_verify_metadump()
> +{
> +	_scratch_unmount &>> $seqres.full
> +
> +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> +		losetup -d "$ldev"
> +	done

Hi Darrick,

If $XFS_METADUMP_IMG is null, this line will delete all loop device. If
someone uses loop devices to be TEST_DEV and SCRATCH_DEV, then it might
break the whole testing.

> +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*

This's dangerous too, I've explained that in :
  https://lore.kernel.org/fstests/20240205065642.3hqhipmnxkg442kg@dell-per750-06-vm-08.rhts.eng.pek2.redhat.com/T/#m496e69db25755292ed9ac4bee08a22f227ebf7d2

Sorry I didn't notice that when I tested with new upstream kernel. But after I
tested on old kernel, some metadump cases start to _notrun, then trigger this
bug. This bug is too dangerous, one of my regular system has gone, I have to
reinstall. So I decide to reset my last fstests release, to avoid destroying
other folks' machine.

I think we'd better to check XFS_METADUMP_FILE and XFS_METADUMP_IMG aren't
empty at first, e.g.

if [ -n "$XFS_METADUMP_FILE" -a -n "$XFS_METADUMP_IMG" ];then
	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
		losetup -d "$ldev"
	done
	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
fi

Or if you'd like to change more :)

Thanks,
Zorro

> +}
> +
> +# Create a metadump in v1 format, restore it to fs image files, then mount the
> +# images and fsck them.
> +_verify_metadump_v1()
> +{
> +	local metadump_args="$1"
> +	local extra_test="$2"
> +
> +	local metadump_file="$XFS_METADUMP_FILE"
> +	local version=""
> +	local data_img="$XFS_METADUMP_IMG.data"
> +	local data_loop
> +
> +	# Force v1 if we detect v2 support
> +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> +		version="-v 1"
> +	fi
> +
> +	# Capture metadump, which creates metadump_file
> +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> +
> +	# Restore metadump, which creates data_img
> +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> +
> +	# Create loopdev for data device so we can mount the fs
> +	data_loop=$(_create_loop_device $data_img)
> +
> +	# Mount fs, run an extra test, fsck, and unmount
> +	SCRATCH_DEV=$data_loop _scratch_mount
> +	if [ -n "$extra_test" ]; then
> +		SCRATCH_DEV=$data_loop $extra_test
> +	fi
> +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> +	SCRATCH_DEV=$data_loop _scratch_unmount
> +
> +	# Tear down what we created
> +	_destroy_loop_device $data_loop
> +	rm -f $data_img
> +}
> +
> +# Create a metadump in v2 format, restore it to fs image files, then mount the
> +# images and fsck them.
> +_verify_metadump_v2()
> +{
> +	local metadump_args="$1"
> +	local extra_test="$2"
> +
> +	local metadump_file="$XFS_METADUMP_FILE"
> +	local version="-v 2"
> +	local data_img="$XFS_METADUMP_IMG.data"
> +	local data_loop
> +	local log_img=""
> +	local log_loop
> +
> +	# Capture metadump, which creates metadump_file
> +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> +
> +	#
> +	# Metadump v2 files can contain contents dumped from an external log
> +	# device. Use a temporary file to hold the log device contents restored
> +	# from such a metadump file.
> +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> +
> +	# Restore metadump, which creates data_img and log_img
> +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> +		_scratch_xfs_mdrestore $metadump_file
> +
> +	# Create loopdev for data device so we can mount the fs
> +	data_loop=$(_create_loop_device $data_img)
> +
> +	# Create loopdev for log device if we recovered anything
> +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> +
> +	# Mount fs, run an extra test, fsck, and unmount
> +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> +	if [ -n "$extra_test" ]; then
> +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> +	fi
> +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> +	SCRATCH_DEV=$data_loop _scratch_unmount
> +
> +	# Tear down what we created
> +	if [ -b "$log_loop" ]; then
> +		_destroy_loop_device $log_loop
> +		rm -f $log_img
> +	fi
> +	_destroy_loop_device $data_loop
> +	rm -f $data_img
> +}
> +
> +# Verify both metadump formats if possible
> +_verify_metadumps()
> +{
> +	_verify_metadump_v1 "$@"
> +
> +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> +		_verify_metadump_v2 "$@"
> +	fi
> +}
> diff --git a/tests/xfs/129 b/tests/xfs/129
> index cdac2349df..c3a9bcefee 100755
> --- a/tests/xfs/129
> +++ b/tests/xfs/129
> @@ -16,98 +16,23 @@ _cleanup()
>  {
>      cd /
>      _scratch_unmount > /dev/null 2>&1
> -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> -	    _destroy_loop_device $logdev
> -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> -       $TEST_DIR/log-image
> +    _cleanup_verify_metadump
> +    rm -rf $tmp.* $testdir
>  }
>  
>  # Import common functions.
>  . ./common/filter
>  . ./common/reflink
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_loop
>  _require_scratch_reflink
> -
> -metadump_file=$TEST_DIR/${seq}_metadump
> -
> -verify_metadump_v1()
> -{
> -	local max_version=$1
> -	local version=""
> -
> -	if [[ $max_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	logdev=$SCRATCH_LOGDEV
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	version="-v 2"
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=${SCRATCH_LOGDEV}
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $TEST_DIR/log-image
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> +_setup_verify_metadump
>  
>  _scratch_mkfs >/dev/null 2>&1
> -
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  _scratch_mount
>  
>  testdir=$SCRATCH_MNT/test-$seq
> @@ -127,12 +52,7 @@ done
>  _scratch_unmount
>  
>  echo "Create metadump file, restore it and check restored fs"
> -
> -verify_metadump_v1 $max_md_version
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/234 b/tests/xfs/234
> index f4f8af6d3a..8f808c7507 100755
> --- a/tests/xfs/234
> +++ b/tests/xfs/234
> @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
>  _cleanup()
>  {
>      cd /
> -    _scratch_unmount > /dev/null 2>&1
> -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> -	    _destroy_loop_device $logdev
> -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> -       $TEST_DIR/log-image
> +    _cleanup_verify_metadump
> +    rm -rf $tmp.* $testdir
>  }
>  
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
> @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_loop
>  _require_xfs_scratch_rmapbt
>  _require_xfs_io_command "fpunch"
> -
> -metadump_file=$TEST_DIR/${seq}_metadump
> -
> -verify_metadump_v1()
> -{
> -	local max_version=$1
> -	local version=""
> -
> -	if [[ $max_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	logdev=$SCRATCH_LOGDEV
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	version="-v 2"
> -
> -	_scratch_xfs_metadump $metadump_file $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=${SCRATCH_LOGDEV}
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	[[ -z $logdev ]] && logdev=none
> -	_check_xfs_filesystem $datadev $logdev none
> -
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $TEST_DIR/log-image
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> +_setup_verify_metadump
>  
>  _scratch_mkfs >/dev/null 2>&1
> -
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  _scratch_mount
>  
>  testdir=$SCRATCH_MNT/test-$seq
> @@ -127,12 +51,7 @@ done
>  _scratch_unmount
>  
>  echo "Create metadump file, restore it and check restored fs"
> -
> -verify_metadump_v1 $max_md_version
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/253 b/tests/xfs/253
> index 3b567999d8..6623c435e5 100755
> --- a/tests/xfs/253
> +++ b/tests/xfs/253
> @@ -26,23 +26,21 @@ _cleanup()
>      cd /
>      rm -f $tmp.*
>      rm -rf "${OUTPUT_DIR}"
> -    rm -f "${METADUMP_FILE}"
> -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> -	    _destroy_loop_device $logdev
> -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> +    _cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_test
>  _require_scratch
> +_setup_verify_metadump
>  
>  # real QA test starts here
>  
>  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
>  ORPHANAGE="lost+found"
>  
>  _supported_fs xfs
> @@ -52,24 +50,7 @@ function create_file() {
>  	touch $(printf "$@")
>  }
>  
> -verify_metadump_v1()
> -{
> -	local max_version=$1
> -	local version=""
> -
> -	if [[ $max_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $METADUMP_FILE $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> -		   _scratch_xfs_mdrestore $METADUMP_FILE
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -
> +extra_test() {
>  	cd "${SCRATCH_MNT}"
>  
>  	# Get a listing of all the files after obfuscation
> @@ -78,60 +59,6 @@ verify_metadump_v1()
>  	ls -R | od -c >> $seqres.full
>  
>  	cd /
> -
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	version="-v 2"
> -
> -	_scratch_xfs_metadump $METADUMP_FILE $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $METADUMP_FILE
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=${SCRATCH_LOGDEV}
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -
> -	cd "${SCRATCH_MNT}"
> -
> -	# Get a listing of all the files after obfuscation
> -	echo "Metadump v2" >> $seqres.full
> -	ls -R >> $seqres.full
> -	ls -R | od -c >> $seqres.full
> -
> -	cd /
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	if [[ -s $TEST_DIR/log-image ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $TEST_DIR/log-image
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
>  }
>  
>  echo "Disciplyne of silence is goed."
> @@ -233,13 +160,7 @@ cd $here
>  
>  _scratch_unmount
>  
> -max_md_version=$(_xfs_metadump_max_version)
> -
> -verify_metadump_v1 $max_md_version
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps '' extra_test
>  
>  # Finally, re-make the filesystem since to ensure we don't
>  # leave a directory with duplicate entries lying around.
> diff --git a/tests/xfs/291 b/tests/xfs/291
> index 1433140821..c475d89ad9 100755
> --- a/tests/xfs/291
> +++ b/tests/xfs/291
> @@ -9,11 +9,21 @@
>  . ./common/preamble
>  _begin_fstest auto repair metadump
>  
> +# Override the default cleanup function.
> +_cleanup()
> +{
> +	cd /
> +	rm -r -f $tmp.*
> +	_cleanup_verify_metadump
> +}
> +
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  _supported_fs xfs
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> +_setup_verify_metadump
>  
>  # real QA test starts here
>  _require_scratch
> @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
>  
>  # Yes they can!  Now...
>  # Can xfs_metadump cope with this monster?
> -max_md_version=$(_xfs_metadump_max_version)
> -
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> -		_fail "xfs_metadump failed"
> -
> -	slogdev=$SCRATCH_LOGDEV
> -	if [[ -z $version || $version == "-v 1" ]]; then
> -		slogdev=""
> -	fi
> -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> -		_fail "xfs_repair of metadump failed"
> -done
> +_verify_metadumps '-a -o'
>  
>  # Yes it can; success, all done
>  status=0
> diff --git a/tests/xfs/432 b/tests/xfs/432
> index 7e402aa88f..579e1b556a 100755
> --- a/tests/xfs/432
> +++ b/tests/xfs/432
> @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
>  _cleanup()
>  {
>  	cd /
> -	rm -f "$tmp".* $metadump_file $metadump_img
> +	rm -f "$tmp".*
> +	_cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/filter
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
>  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
>  _require_scratch
> +_setup_verify_metadump
>  
>  rm -f "$seqres.full"
>  
> @@ -54,9 +57,6 @@ echo "Format and mount"
>  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
>  _scratch_mount >> "$seqres.full" 2>&1
>  
> -metadump_file="$TEST_DIR/meta-$seq"
> -metadump_img="$TEST_DIR/img-$seq"
> -rm -f $metadump_file $metadump_img
>  testdir="$SCRATCH_MNT/test-$seq"
>  max_fname_len=255
>  blksz=$(_get_block_size $SCRATCH_MNT)
> @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
>  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
>  
>  echo "Try to metadump, restore and check restored metadump image"
> -max_md_version=$(_xfs_metadump_max_version)
> -
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> -
> -	slogdev=$SCRATCH_LOGDEV
> -	if [[ -z $version || $version == "-v 1" ]]; then
> -		slogdev=""
> -	fi
> -
> -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> -		echo "xfs_repair on restored fs returned $?"
> -done
> +_verify_metadumps '-a -o -w'
>  
>  # success, all done
>  status=0
> diff --git a/tests/xfs/503 b/tests/xfs/503
> index 8643c3d483..ff6b344a9c 100755
> --- a/tests/xfs/503
> +++ b/tests/xfs/503
> @@ -17,11 +17,13 @@ _cleanup()
>  {
>  	cd /
>  	rm -rf $tmp.* $testdir
> +	_cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/filter
>  . ./common/populate
> +. ./common/xfs_metadump_tests
>  
>  testdir=$TEST_DIR/test-$seq
>  
> @@ -35,6 +37,7 @@ _require_scratch_nocheck
>  _require_populate_commands
>  _xfs_skip_online_rebuild
>  _xfs_skip_offline_rebuild
> +_setup_verify_metadump
>  
>  echo "Format and populate"
>  _scratch_populate_cached nofill > $seqres.full 2>&1
> @@ -43,66 +46,17 @@ mkdir -p $testdir
>  metadump_file=$testdir/scratch.md
>  copy_file=$testdir/copy.img
>  
> -check_restored_metadump_image()
> -{
> -	local image=$1
> -
> -	loop_dev=$(_create_loop_device $image)
> -	SCRATCH_DEV=$loop_dev _scratch_mount
> -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> -	SCRATCH_DEV=$loop_dev _scratch_unmount
> -	_destroy_loop_device $loop_dev
> -}
> -
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  echo "metadump and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-a -o'
>  
>  echo "metadump a and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-a'
>  
>  echo "metadump g and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-g' >> $seqres.full
>  
>  echo "metadump ag and mdrestore"
> -for md_version in $(seq 1 $max_md_version); do
> -	version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v $md_version"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> -	check_restored_metadump_image $TEST_DIR/image
> -done
> +_verify_metadumps '-a -g' >> $seqres.full
>  
>  echo copy
>  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> diff --git a/tests/xfs/605 b/tests/xfs/605
> index f2cd7aba98..af917f0f32 100755
> --- a/tests/xfs/605
> +++ b/tests/xfs/605
> @@ -15,17 +15,13 @@ _cleanup()
>  {
>  	cd /
>  	rm -r -f $tmp.*
> -	_scratch_unmount > /dev/null 2>&1
> -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> -		_destroy_loop_device $logdev
> -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> -	rm -r -f $metadump_file $TEST_DIR/data-image \
> -	   $TEST_DIR/log-image
> +	_cleanup_verify_metadump
>  }
>  
>  # Import common functions.
>  . ./common/dmflakey
>  . ./common/inject
> +. ./common/xfs_metadump_tests
>  
>  # real QA test starts here
>  _supported_fs xfs
> @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
>  _require_dm_target flakey
>  _require_xfs_io_command "pwrite"
>  _require_test_program "punch-alternating"
> +_setup_verify_metadump
>  
> -metadump_file=${TEST_DIR}/${seq}.md
>  testfile=${SCRATCH_MNT}/testfile
>  
>  echo "Format filesystem on scratch device"
>  _scratch_mkfs >> $seqres.full 2>&1
>  
> -max_md_version=$(_xfs_metadump_max_version)
> -
>  external_log=0
>  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
>  	external_log=1
>  fi
>  
> -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
>  	_notrun "metadump v1 does not support external log device"
>  fi
>  
> -verify_metadump_v1()
> -{
> -	local version=""
> -	if [[ $max_md_version == 2 ]]; then
> -		version="-v 1"
> -	fi
> -
> -	_scratch_xfs_metadump $metadump_file -a -o $version
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	SCRATCH_DEV=$datadev _scratch_mount
> -	SCRATCH_DEV=$datadev _check_scratch_fs
> -	SCRATCH_DEV=$datadev _scratch_unmount
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
> -verify_metadump_v2()
> -{
> -	local version="-v 2"
> -
> -	_scratch_xfs_metadump $metadump_file -a -o $version
> -
> -	# Metadump v2 files can contain contents dumped from an external log
> -	# device. Use a temporary file to hold the log device contents restored
> -	# from such a metadump file.
> -	slogdev=""
> -	if [[ -n $SCRATCH_LOGDEV ]]; then
> -		slogdev=$TEST_DIR/log-image
> -	fi
> -
> -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> -		   _scratch_xfs_mdrestore $metadump_file
> -
> -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> -
> -	logdev=""
> -	if [[ -s $slogdev ]]; then
> -		logdev=$(_create_loop_device $slogdev)
> -	fi
> -
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> -
> -	if [[ -s $logdev ]]; then
> -		_destroy_loop_device $logdev
> -		logdev=""
> -		rm -f $slogdev
> -	fi
> -
> -	_destroy_loop_device $datadev
> -	datadev=""
> -	rm -f $TEST_DIR/data-image
> -}
> -
>  echo "Initialize and mount filesystem on flakey device"
>  _init_flakey
>  _load_flakey_table $FLAKEY_ALLOW_WRITES
> @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
>  _print_logstate
>  
>  echo "Create metadump file, restore it and check restored fs"
> -
> -if [[ $external_log == 0 ]]; then
> -	verify_metadump_v1 $max_md_version
> -fi
> -
> -if [[ $max_md_version == 2 ]]; then
> -	verify_metadump_v2
> -fi
> +_verify_metadumps '-a -o'
>  
>  # Mount the fs to replay the contents from the dirty log.
>  _scratch_mount
>
Darrick J. Wong Feb. 5, 2024, 4:48 p.m. UTC | #13
On Mon, Feb 05, 2024 at 05:37:44PM +0800, Zorro Lang wrote:
> On Thu, Jan 25, 2024 at 11:05:16AM -0800, Darrick J. Wong wrote:
> > From: Darrick J. Wong <djwong@kernel.org>
> > 
> > Refactor the copy-pasta'd code in xfs/129, xfs/234, xfs/253, xfs/291,
> > xfs/432, xfs/503, and xfs/605 so that we don't have to maintain nearly
> > duplicate copies of the same code.
> > 
> > While we're at it, fix the fsck so that it includes xfs_scrub.
> > 
> > Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> > ---
> >  common/rc                 |   10 ----
> >  common/xfs                |   14 +++++
> >  common/xfs_metadump_tests |  123 +++++++++++++++++++++++++++++++++++++++++++++
> >  tests/xfs/129             |   90 ++-------------------------------
> >  tests/xfs/234             |   91 ++-------------------------------
> >  tests/xfs/253             |   89 ++-------------------------------
> >  tests/xfs/291             |   31 ++++-------
> >  tests/xfs/432             |   30 ++---------
> >  tests/xfs/503             |   60 +++-------------------
> >  tests/xfs/605             |   84 ++-----------------------------
> >  10 files changed, 181 insertions(+), 441 deletions(-)
> >  create mode 100644 common/xfs_metadump_tests
> > 
> > 
> > diff --git a/common/rc b/common/rc
> > index 524ffa02aa..0b69f7f54f 100644
> > --- a/common/rc
> > +++ b/common/rc
> > @@ -3320,15 +3320,7 @@ _check_scratch_fs()
> >  
> >      case $FSTYP in
> >      xfs)
> > -	local scratch_log="none"
> > -	local scratch_rt="none"
> > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > -	    scratch_log="$SCRATCH_LOGDEV"
> > -
> > -	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > -	    scratch_rt="$SCRATCH_RTDEV"
> > -
> > -	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > +	_check_xfs_scratch_fs $device
> >  	;;
> >      udf)
> >  	_check_udf_filesystem $device $udf_fsize
> > diff --git a/common/xfs b/common/xfs
> > index 248ccefda3..6a48960a7f 100644
> > --- a/common/xfs
> > +++ b/common/xfs
> > @@ -1035,6 +1035,20 @@ _check_xfs_test_fs()
> >  	return $?
> >  }
> >  
> > +_check_xfs_scratch_fs()
> > +{
> > +	local device="${1:-$SCRATCH_DEV}"
> > +	local scratch_log="none"
> > +	local scratch_rt="none"
> > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
> > +	    scratch_log="$SCRATCH_LOGDEV"
> > +
> > +	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
> > +	    scratch_rt="$SCRATCH_RTDEV"
> > +
> > +	_check_xfs_filesystem $device $scratch_log $scratch_rt
> > +}
> > +
> >  # modeled after _scratch_xfs_repair
> >  _test_xfs_repair()
> >  {
> > diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
> > new file mode 100644
> > index 0000000000..dd3dec1fb4
> > --- /dev/null
> > +++ b/common/xfs_metadump_tests
> > @@ -0,0 +1,123 @@
> > +#
> > +# XFS specific metadump testing functions.
> > +#
> > +
> > +# Set up environment variables for a metadump test.  Requires the test and
> > +# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
> > +_setup_verify_metadump()
> > +{
> > +	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
> > +	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
> > +	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
> > +
> > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> > +}
> > +
> > +_cleanup_verify_metadump()
> > +{
> > +	_scratch_unmount &>> $seqres.full
> > +
> > +	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> > +		losetup -d "$ldev"
> > +	done
> 
> Hi Darrick,
> 
> If $XFS_METADUMP_IMG is null, this line will delete all loop device. If
> someone uses loop devices to be TEST_DEV and SCRATCH_DEV, then it might
> break the whole testing.
> 
> > +	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> 
> This's dangerous too, I've explained that in :
>   https://lore.kernel.org/fstests/20240205065642.3hqhipmnxkg442kg@dell-per750-06-vm-08.rhts.eng.pek2.redhat.com/T/#m496e69db25755292ed9ac4bee08a22f227ebf7d2

Aaaaggghgh f*cking bash!

> Sorry I didn't notice that when I tested with new upstream kernel. But after I
> tested on old kernel, some metadump cases start to _notrun, then trigger this
> bug. This bug is too dangerous, one of my regular system has gone, I have to
> reinstall. So I decide to reset my last fstests release, to avoid destroying
> other folks' machine.
> 
> I think we'd better to check XFS_METADUMP_FILE and XFS_METADUMP_IMG aren't
> empty at first, e.g.
> 
> if [ -n "$XFS_METADUMP_FILE" -a -n "$XFS_METADUMP_IMG" ];then
> 	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
> 		losetup -d "$ldev"
> 	done
> 	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
> fi
> 
> Or if you'd like to change more :)

That's mostly it, though I'd split the cleanup of the two variables:

test -n "$XFS_METADUMP_FILE" && rm -f "$XFS_METADUMP_FILE"

if [ -n "$XFS_METADUMP_IMG" ];then
	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
		losetup -d "$ldev"
	done
	for fubar in "$XFS_METADUMP_IMG"*; do
		rm -f "$fubar"
	done
fi

Anyway I'll try this out and send a patch once I've got this fixed.
Sorry I blew up your machine. :( :(

ALSO: should we call shellcheck (or some other linter) as part of make
all?  That might be a good idea, though I actually /did/ run shellcheck
and it didn't say anything about the rm glob trap.

--D

> 
> Thanks,
> Zorro
> 
> > +}
> > +
> > +# Create a metadump in v1 format, restore it to fs image files, then mount the
> > +# images and fsck them.
> > +_verify_metadump_v1()
> > +{
> > +	local metadump_args="$1"
> > +	local extra_test="$2"
> > +
> > +	local metadump_file="$XFS_METADUMP_FILE"
> > +	local version=""
> > +	local data_img="$XFS_METADUMP_IMG.data"
> > +	local data_loop
> > +
> > +	# Force v1 if we detect v2 support
> > +	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
> > +		version="-v 1"
> > +	fi
> > +
> > +	# Capture metadump, which creates metadump_file
> > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > +
> > +	# Restore metadump, which creates data_img
> > +	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
> > +
> > +	# Create loopdev for data device so we can mount the fs
> > +	data_loop=$(_create_loop_device $data_img)
> > +
> > +	# Mount fs, run an extra test, fsck, and unmount
> > +	SCRATCH_DEV=$data_loop _scratch_mount
> > +	if [ -n "$extra_test" ]; then
> > +		SCRATCH_DEV=$data_loop $extra_test
> > +	fi
> > +	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
> > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > +
> > +	# Tear down what we created
> > +	_destroy_loop_device $data_loop
> > +	rm -f $data_img
> > +}
> > +
> > +# Create a metadump in v2 format, restore it to fs image files, then mount the
> > +# images and fsck them.
> > +_verify_metadump_v2()
> > +{
> > +	local metadump_args="$1"
> > +	local extra_test="$2"
> > +
> > +	local metadump_file="$XFS_METADUMP_FILE"
> > +	local version="-v 2"
> > +	local data_img="$XFS_METADUMP_IMG.data"
> > +	local data_loop
> > +	local log_img=""
> > +	local log_loop
> > +
> > +	# Capture metadump, which creates metadump_file
> > +	_scratch_xfs_metadump $metadump_file $metadump_args $version
> > +
> > +	#
> > +	# Metadump v2 files can contain contents dumped from an external log
> > +	# device. Use a temporary file to hold the log device contents restored
> > +	# from such a metadump file.
> > +	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
> > +
> > +	# Restore metadump, which creates data_img and log_img
> > +	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
> > +		_scratch_xfs_mdrestore $metadump_file
> > +
> > +	# Create loopdev for data device so we can mount the fs
> > +	data_loop=$(_create_loop_device $data_img)
> > +
> > +	# Create loopdev for log device if we recovered anything
> > +	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
> > +
> > +	# Mount fs, run an extra test, fsck, and unmount
> > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
> > +	if [ -n "$extra_test" ]; then
> > +		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
> > +	fi
> > +	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
> > +	SCRATCH_DEV=$data_loop _scratch_unmount
> > +
> > +	# Tear down what we created
> > +	if [ -b "$log_loop" ]; then
> > +		_destroy_loop_device $log_loop
> > +		rm -f $log_img
> > +	fi
> > +	_destroy_loop_device $data_loop
> > +	rm -f $data_img
> > +}
> > +
> > +# Verify both metadump formats if possible
> > +_verify_metadumps()
> > +{
> > +	_verify_metadump_v1 "$@"
> > +
> > +	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
> > +		_verify_metadump_v2 "$@"
> > +	fi
> > +}
> > diff --git a/tests/xfs/129 b/tests/xfs/129
> > index cdac2349df..c3a9bcefee 100755
> > --- a/tests/xfs/129
> > +++ b/tests/xfs/129
> > @@ -16,98 +16,23 @@ _cleanup()
> >  {
> >      cd /
> >      _scratch_unmount > /dev/null 2>&1
> > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > -	    _destroy_loop_device $logdev
> > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
> > -       $TEST_DIR/log-image
> > +    _cleanup_verify_metadump
> > +    rm -rf $tmp.* $testdir
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> >  . ./common/reflink
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_loop
> >  _require_scratch_reflink
> > -
> > -metadump_file=$TEST_DIR/${seq}_metadump
> > -
> > -verify_metadump_v1()
> > -{
> > -	local max_version=$1
> > -	local version=""
> > -
> > -	if [[ $max_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	logdev=$SCRATCH_LOGDEV
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	version="-v 2"
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=${SCRATCH_LOGDEV}
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $TEST_DIR/log-image
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > +_setup_verify_metadump
> >  
> >  _scratch_mkfs >/dev/null 2>&1
> > -
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  _scratch_mount
> >  
> >  testdir=$SCRATCH_MNT/test-$seq
> > @@ -127,12 +52,7 @@ done
> >  _scratch_unmount
> >  
> >  echo "Create metadump file, restore it and check restored fs"
> > -
> > -verify_metadump_v1 $max_md_version
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps
> >  
> >  # success, all done
> >  status=0
> > diff --git a/tests/xfs/234 b/tests/xfs/234
> > index f4f8af6d3a..8f808c7507 100755
> > --- a/tests/xfs/234
> > +++ b/tests/xfs/234
> > @@ -15,16 +15,13 @@ _begin_fstest auto quick rmap punch metadump
> >  _cleanup()
> >  {
> >      cd /
> > -    _scratch_unmount > /dev/null 2>&1
> > -    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > -	    _destroy_loop_device $logdev
> > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > -    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
> > -       $TEST_DIR/log-image
> > +    _cleanup_verify_metadump
> > +    rm -rf $tmp.* $testdir
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> > @@ -32,82 +29,9 @@ _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_loop
> >  _require_xfs_scratch_rmapbt
> >  _require_xfs_io_command "fpunch"
> > -
> > -metadump_file=$TEST_DIR/${seq}_metadump
> > -
> > -verify_metadump_v1()
> > -{
> > -	local max_version=$1
> > -	local version=""
> > -
> > -	if [[ $max_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	logdev=$SCRATCH_LOGDEV
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	version="-v 2"
> > -
> > -	_scratch_xfs_metadump $metadump_file $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=${SCRATCH_LOGDEV}
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	[[ -z $logdev ]] && logdev=none
> > -	_check_xfs_filesystem $datadev $logdev none
> > -
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $TEST_DIR/log-image
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > +_setup_verify_metadump
> >  
> >  _scratch_mkfs >/dev/null 2>&1
> > -
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  _scratch_mount
> >  
> >  testdir=$SCRATCH_MNT/test-$seq
> > @@ -127,12 +51,7 @@ done
> >  _scratch_unmount
> >  
> >  echo "Create metadump file, restore it and check restored fs"
> > -
> > -verify_metadump_v1 $max_md_version
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps
> >  
> >  # success, all done
> >  status=0
> > diff --git a/tests/xfs/253 b/tests/xfs/253
> > index 3b567999d8..6623c435e5 100755
> > --- a/tests/xfs/253
> > +++ b/tests/xfs/253
> > @@ -26,23 +26,21 @@ _cleanup()
> >      cd /
> >      rm -f $tmp.*
> >      rm -rf "${OUTPUT_DIR}"
> > -    rm -f "${METADUMP_FILE}"
> > -    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
> > -	    _destroy_loop_device $logdev
> > -    [[ -n $datadev ]] && _destroy_loop_device $datadev
> > +    _cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_test
> >  _require_scratch
> > +_setup_verify_metadump
> >  
> >  # real QA test starts here
> >  
> >  OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
> > -METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
> >  ORPHANAGE="lost+found"
> >  
> >  _supported_fs xfs
> > @@ -52,24 +50,7 @@ function create_file() {
> >  	touch $(printf "$@")
> >  }
> >  
> > -verify_metadump_v1()
> > -{
> > -	local max_version=$1
> > -	local version=""
> > -
> > -	if [[ $max_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
> > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -
> > +extra_test() {
> >  	cd "${SCRATCH_MNT}"
> >  
> >  	# Get a listing of all the files after obfuscation
> > @@ -78,60 +59,6 @@ verify_metadump_v1()
> >  	ls -R | od -c >> $seqres.full
> >  
> >  	cd /
> > -
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	version="-v 2"
> > -
> > -	_scratch_xfs_metadump $METADUMP_FILE $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $METADUMP_FILE
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=${SCRATCH_LOGDEV}
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		logdev=$(_create_loop_device $TEST_DIR/log-image)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -
> > -	cd "${SCRATCH_MNT}"
> > -
> > -	# Get a listing of all the files after obfuscation
> > -	echo "Metadump v2" >> $seqres.full
> > -	ls -R >> $seqres.full
> > -	ls -R | od -c >> $seqres.full
> > -
> > -	cd /
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	if [[ -s $TEST_DIR/log-image ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $TEST_DIR/log-image
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> >  }
> >  
> >  echo "Disciplyne of silence is goed."
> > @@ -233,13 +160,7 @@ cd $here
> >  
> >  _scratch_unmount
> >  
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> > -verify_metadump_v1 $max_md_version
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps '' extra_test
> >  
> >  # Finally, re-make the filesystem since to ensure we don't
> >  # leave a directory with duplicate entries lying around.
> > diff --git a/tests/xfs/291 b/tests/xfs/291
> > index 1433140821..c475d89ad9 100755
> > --- a/tests/xfs/291
> > +++ b/tests/xfs/291
> > @@ -9,11 +9,21 @@
> >  . ./common/preamble
> >  _begin_fstest auto repair metadump
> >  
> > +# Override the default cleanup function.
> > +_cleanup()
> > +{
> > +	cd /
> > +	rm -r -f $tmp.*
> > +	_cleanup_verify_metadump
> > +}
> > +
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  _supported_fs xfs
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> > +_setup_verify_metadump
> >  
> >  # real QA test starts here
> >  _require_scratch
> > @@ -92,26 +102,7 @@ _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
> >  
> >  # Yes they can!  Now...
> >  # Can xfs_metadump cope with this monster?
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
> > -		_fail "xfs_metadump failed"
> > -
> > -	slogdev=$SCRATCH_LOGDEV
> > -	if [[ -z $version || $version == "-v 1" ]]; then
> > -		slogdev=""
> > -	fi
> > -	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
> > -		   $tmp.metadump || _fail "xfs_mdrestore failed"
> > -	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
> > -		_fail "xfs_repair of metadump failed"
> > -done
> > +_verify_metadumps '-a -o'
> >  
> >  # Yes it can; success, all done
> >  status=0
> > diff --git a/tests/xfs/432 b/tests/xfs/432
> > index 7e402aa88f..579e1b556a 100755
> > --- a/tests/xfs/432
> > +++ b/tests/xfs/432
> > @@ -20,16 +20,19 @@ _begin_fstest auto quick dir metadata metadump
> >  _cleanup()
> >  {
> >  	cd /
> > -	rm -f "$tmp".* $metadump_file $metadump_img
> > +	rm -f "$tmp".*
> > +	_cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> >  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
> >  _require_scratch
> > +_setup_verify_metadump
> >  
> >  rm -f "$seqres.full"
> >  
> > @@ -54,9 +57,6 @@ echo "Format and mount"
> >  _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
> >  _scratch_mount >> "$seqres.full" 2>&1
> >  
> > -metadump_file="$TEST_DIR/meta-$seq"
> > -metadump_img="$TEST_DIR/img-$seq"
> > -rm -f $metadump_file $metadump_img
> >  testdir="$SCRATCH_MNT/test-$seq"
> >  max_fname_len=255
> >  blksz=$(_get_block_size $SCRATCH_MNT)
> > @@ -87,27 +87,7 @@ echo "qualifying extent: $extlen blocks" >> $seqres.full
> >  test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
> >  
> >  echo "Try to metadump, restore and check restored metadump image"
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o -w $version
> > -
> > -	slogdev=$SCRATCH_LOGDEV
> > -	if [[ -z $version || $version == "-v 1" ]]; then
> > -		slogdev=""
> > -	fi
> > -
> > -	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
> > -		echo "xfs_repair on restored fs returned $?"
> > -done
> > +_verify_metadumps '-a -o -w'
> >  
> >  # success, all done
> >  status=0
> > diff --git a/tests/xfs/503 b/tests/xfs/503
> > index 8643c3d483..ff6b344a9c 100755
> > --- a/tests/xfs/503
> > +++ b/tests/xfs/503
> > @@ -17,11 +17,13 @@ _cleanup()
> >  {
> >  	cd /
> >  	rm -rf $tmp.* $testdir
> > +	_cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/filter
> >  . ./common/populate
> > +. ./common/xfs_metadump_tests
> >  
> >  testdir=$TEST_DIR/test-$seq
> >  
> > @@ -35,6 +37,7 @@ _require_scratch_nocheck
> >  _require_populate_commands
> >  _xfs_skip_online_rebuild
> >  _xfs_skip_offline_rebuild
> > +_setup_verify_metadump
> >  
> >  echo "Format and populate"
> >  _scratch_populate_cached nofill > $seqres.full 2>&1
> > @@ -43,66 +46,17 @@ mkdir -p $testdir
> >  metadump_file=$testdir/scratch.md
> >  copy_file=$testdir/copy.img
> >  
> > -check_restored_metadump_image()
> > -{
> > -	local image=$1
> > -
> > -	loop_dev=$(_create_loop_device $image)
> > -	SCRATCH_DEV=$loop_dev _scratch_mount
> > -	SCRATCH_DEV=$loop_dev _check_scratch_fs
> > -	SCRATCH_DEV=$loop_dev _scratch_unmount
> > -	_destroy_loop_device $loop_dev
> > -}
> > -
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  echo "metadump and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-a -o'
> >  
> >  echo "metadump a and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-a'
> >  
> >  echo "metadump g and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-g' >> $seqres.full
> >  
> >  echo "metadump ag and mdrestore"
> > -for md_version in $(seq 1 $max_md_version); do
> > -	version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v $md_version"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
> > -	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
> > -	check_restored_metadump_image $TEST_DIR/image
> > -done
> > +_verify_metadumps '-a -g' >> $seqres.full
> >  
> >  echo copy
> >  $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
> > diff --git a/tests/xfs/605 b/tests/xfs/605
> > index f2cd7aba98..af917f0f32 100755
> > --- a/tests/xfs/605
> > +++ b/tests/xfs/605
> > @@ -15,17 +15,13 @@ _cleanup()
> >  {
> >  	cd /
> >  	rm -r -f $tmp.*
> > -	_scratch_unmount > /dev/null 2>&1
> > -	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
> > -		_destroy_loop_device $logdev
> > -	[[ -n $datadev ]] && _destroy_loop_device $datadev
> > -	rm -r -f $metadump_file $TEST_DIR/data-image \
> > -	   $TEST_DIR/log-image
> > +	_cleanup_verify_metadump
> >  }
> >  
> >  # Import common functions.
> >  . ./common/dmflakey
> >  . ./common/inject
> > +. ./common/xfs_metadump_tests
> >  
> >  # real QA test starts here
> >  _supported_fs xfs
> > @@ -37,85 +33,22 @@ _require_xfs_io_error_injection log_item_pin
> >  _require_dm_target flakey
> >  _require_xfs_io_command "pwrite"
> >  _require_test_program "punch-alternating"
> > +_setup_verify_metadump
> >  
> > -metadump_file=${TEST_DIR}/${seq}.md
> >  testfile=${SCRATCH_MNT}/testfile
> >  
> >  echo "Format filesystem on scratch device"
> >  _scratch_mkfs >> $seqres.full 2>&1
> >  
> > -max_md_version=$(_xfs_metadump_max_version)
> > -
> >  external_log=0
> >  if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
> >  	external_log=1
> >  fi
> >  
> > -if [[ $max_md_version == 1 && $external_log == 1 ]]; then
> > +if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
> >  	_notrun "metadump v1 does not support external log device"
> >  fi
> >  
> > -verify_metadump_v1()
> > -{
> > -	local version=""
> > -	if [[ $max_md_version == 2 ]]; then
> > -		version="-v 1"
> > -	fi
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	SCRATCH_DEV=$datadev _scratch_mount
> > -	SCRATCH_DEV=$datadev _check_scratch_fs
> > -	SCRATCH_DEV=$datadev _scratch_unmount
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> > -verify_metadump_v2()
> > -{
> > -	local version="-v 2"
> > -
> > -	_scratch_xfs_metadump $metadump_file -a -o $version
> > -
> > -	# Metadump v2 files can contain contents dumped from an external log
> > -	# device. Use a temporary file to hold the log device contents restored
> > -	# from such a metadump file.
> > -	slogdev=""
> > -	if [[ -n $SCRATCH_LOGDEV ]]; then
> > -		slogdev=$TEST_DIR/log-image
> > -	fi
> > -
> > -	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
> > -		   _scratch_xfs_mdrestore $metadump_file
> > -
> > -	datadev=$(_create_loop_device $TEST_DIR/data-image)
> > -
> > -	logdev=""
> > -	if [[ -s $slogdev ]]; then
> > -		logdev=$(_create_loop_device $slogdev)
> > -	fi
> > -
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
> > -	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
> > -
> > -	if [[ -s $logdev ]]; then
> > -		_destroy_loop_device $logdev
> > -		logdev=""
> > -		rm -f $slogdev
> > -	fi
> > -
> > -	_destroy_loop_device $datadev
> > -	datadev=""
> > -	rm -f $TEST_DIR/data-image
> > -}
> > -
> >  echo "Initialize and mount filesystem on flakey device"
> >  _init_flakey
> >  _load_flakey_table $FLAKEY_ALLOW_WRITES
> > @@ -160,14 +93,7 @@ echo -n "Filesystem has a "
> >  _print_logstate
> >  
> >  echo "Create metadump file, restore it and check restored fs"
> > -
> > -if [[ $external_log == 0 ]]; then
> > -	verify_metadump_v1 $max_md_version
> > -fi
> > -
> > -if [[ $max_md_version == 2 ]]; then
> > -	verify_metadump_v2
> > -fi
> > +_verify_metadumps '-a -o'
> >  
> >  # Mount the fs to replay the contents from the dirty log.
> >  _scratch_mount
> > 
> 
>
diff mbox series

Patch

diff --git a/common/rc b/common/rc
index 524ffa02aa..0b69f7f54f 100644
--- a/common/rc
+++ b/common/rc
@@ -3320,15 +3320,7 @@  _check_scratch_fs()
 
     case $FSTYP in
     xfs)
-	local scratch_log="none"
-	local scratch_rt="none"
-	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
-	    scratch_log="$SCRATCH_LOGDEV"
-
-	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
-	    scratch_rt="$SCRATCH_RTDEV"
-
-	_check_xfs_filesystem $device $scratch_log $scratch_rt
+	_check_xfs_scratch_fs $device
 	;;
     udf)
 	_check_udf_filesystem $device $udf_fsize
diff --git a/common/xfs b/common/xfs
index 248ccefda3..6a48960a7f 100644
--- a/common/xfs
+++ b/common/xfs
@@ -1035,6 +1035,20 @@  _check_xfs_test_fs()
 	return $?
 }
 
+_check_xfs_scratch_fs()
+{
+	local device="${1:-$SCRATCH_DEV}"
+	local scratch_log="none"
+	local scratch_rt="none"
+	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \
+	    scratch_log="$SCRATCH_LOGDEV"
+
+	[ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \
+	    scratch_rt="$SCRATCH_RTDEV"
+
+	_check_xfs_filesystem $device $scratch_log $scratch_rt
+}
+
 # modeled after _scratch_xfs_repair
 _test_xfs_repair()
 {
diff --git a/common/xfs_metadump_tests b/common/xfs_metadump_tests
new file mode 100644
index 0000000000..dd3dec1fb4
--- /dev/null
+++ b/common/xfs_metadump_tests
@@ -0,0 +1,123 @@ 
+#
+# XFS specific metadump testing functions.
+#
+
+# Set up environment variables for a metadump test.  Requires the test and
+# scratch devices.  Sets XFS_METADUMP_{FILE,IMG} and MAX_XFS_METADUMP_VERSION.
+_setup_verify_metadump()
+{
+	XFS_METADUMP_FILE="$TEST_DIR/${seq}_metadump"
+	XFS_METADUMP_IMG="$TEST_DIR/${seq}_image"
+	MAX_XFS_METADUMP_VERSION="$(_xfs_metadump_max_version)"
+
+	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
+}
+
+_cleanup_verify_metadump()
+{
+	_scratch_unmount &>> $seqres.full
+
+	losetup -n -a -O BACK-FILE,NAME | grep "^$XFS_METADUMP_IMG" | while read backing ldev; do
+		losetup -d "$ldev"
+	done
+	rm -f "$XFS_METADUMP_FILE" "$XFS_METADUMP_IMG"*
+}
+
+# Create a metadump in v1 format, restore it to fs image files, then mount the
+# images and fsck them.
+_verify_metadump_v1()
+{
+	local metadump_args="$1"
+	local extra_test="$2"
+
+	local metadump_file="$XFS_METADUMP_FILE"
+	local version=""
+	local data_img="$XFS_METADUMP_IMG.data"
+	local data_loop
+
+	# Force v1 if we detect v2 support
+	if [[ $MAX_XFS_METADUMP_FORMAT > 1 ]]; then
+		version="-v 1"
+	fi
+
+	# Capture metadump, which creates metadump_file
+	_scratch_xfs_metadump $metadump_file $metadump_args $version
+
+	# Restore metadump, which creates data_img
+	SCRATCH_DEV=$data_img _scratch_xfs_mdrestore $metadump_file
+
+	# Create loopdev for data device so we can mount the fs
+	data_loop=$(_create_loop_device $data_img)
+
+	# Mount fs, run an extra test, fsck, and unmount
+	SCRATCH_DEV=$data_loop _scratch_mount
+	if [ -n "$extra_test" ]; then
+		SCRATCH_DEV=$data_loop $extra_test
+	fi
+	SCRATCH_DEV=$data_loop _check_xfs_scratch_fs
+	SCRATCH_DEV=$data_loop _scratch_unmount
+
+	# Tear down what we created
+	_destroy_loop_device $data_loop
+	rm -f $data_img
+}
+
+# Create a metadump in v2 format, restore it to fs image files, then mount the
+# images and fsck them.
+_verify_metadump_v2()
+{
+	local metadump_args="$1"
+	local extra_test="$2"
+
+	local metadump_file="$XFS_METADUMP_FILE"
+	local version="-v 2"
+	local data_img="$XFS_METADUMP_IMG.data"
+	local data_loop
+	local log_img=""
+	local log_loop
+
+	# Capture metadump, which creates metadump_file
+	_scratch_xfs_metadump $metadump_file $metadump_args $version
+
+	#
+	# Metadump v2 files can contain contents dumped from an external log
+	# device. Use a temporary file to hold the log device contents restored
+	# from such a metadump file.
+	test -n "$SCRATCH_LOGDEV" && log_img="$XFS_METADUMP_IMG.log"
+
+	# Restore metadump, which creates data_img and log_img
+	SCRATCH_DEV=$data_img SCRATCH_LOGDEV=$log_img \
+		_scratch_xfs_mdrestore $metadump_file
+
+	# Create loopdev for data device so we can mount the fs
+	data_loop=$(_create_loop_device $data_img)
+
+	# Create loopdev for log device if we recovered anything
+	test -s "$log_img" && log_loop=$(_create_loop_device $log_img)
+
+	# Mount fs, run an extra test, fsck, and unmount
+	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _scratch_mount
+	if [ -n "$extra_test" ]; then
+		SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop $extra_test
+	fi
+	SCRATCH_DEV=$data_loop SCRATCH_LOGDEV=$log_loop _check_xfs_scratch_fs
+	SCRATCH_DEV=$data_loop _scratch_unmount
+
+	# Tear down what we created
+	if [ -b "$log_loop" ]; then
+		_destroy_loop_device $log_loop
+		rm -f $log_img
+	fi
+	_destroy_loop_device $data_loop
+	rm -f $data_img
+}
+
+# Verify both metadump formats if possible
+_verify_metadumps()
+{
+	_verify_metadump_v1 "$@"
+
+	if [[ $MAX_XFS_METADUMP_FORMAT == 2 ]]; then
+		_verify_metadump_v2 "$@"
+	fi
+}
diff --git a/tests/xfs/129 b/tests/xfs/129
index cdac2349df..c3a9bcefee 100755
--- a/tests/xfs/129
+++ b/tests/xfs/129
@@ -16,98 +16,23 @@  _cleanup()
 {
     cd /
     _scratch_unmount > /dev/null 2>&1
-    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
-	    _destroy_loop_device $logdev
-    [[ -n $datadev ]] && _destroy_loop_device $datadev
-    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/data-image \
-       $TEST_DIR/log-image
+    _cleanup_verify_metadump
+    rm -rf $tmp.* $testdir
 }
 
 # Import common functions.
 . ./common/filter
 . ./common/reflink
+. ./common/xfs_metadump_tests
 
 # real QA test starts here
 _supported_fs xfs
 _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
 _require_loop
 _require_scratch_reflink
-
-metadump_file=$TEST_DIR/${seq}_metadump
-
-verify_metadump_v1()
-{
-	local max_version=$1
-	local version=""
-
-	if [[ $max_version == 2 ]]; then
-		version="-v 1"
-	fi
-
-	_scratch_xfs_metadump $metadump_file $version
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
-		   _scratch_xfs_mdrestore $metadump_file
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	SCRATCH_DEV=$datadev _scratch_mount
-	SCRATCH_DEV=$datadev _scratch_unmount
-
-	logdev=$SCRATCH_LOGDEV
-	[[ -z $logdev ]] && logdev=none
-	_check_xfs_filesystem $datadev $logdev none
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
-
-verify_metadump_v2()
-{
-	version="-v 2"
-
-	_scratch_xfs_metadump $metadump_file $version
-
-	# Metadump v2 files can contain contents dumped from an external log
-	# device. Use a temporary file to hold the log device contents restored
-	# from such a metadump file.
-	slogdev=""
-	if [[ -n $SCRATCH_LOGDEV ]]; then
-		slogdev=$TEST_DIR/log-image
-	fi
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
-		   _scratch_xfs_mdrestore $metadump_file
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	logdev=${SCRATCH_LOGDEV}
-	if [[ -s $TEST_DIR/log-image ]]; then
-		logdev=$(_create_loop_device $TEST_DIR/log-image)
-	fi
-
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
-
-	[[ -z $logdev ]] && logdev=none
-	_check_xfs_filesystem $datadev $logdev none
-
-	if [[ -s $TEST_DIR/log-image ]]; then
-		_destroy_loop_device $logdev
-		logdev=""
-		rm -f $TEST_DIR/log-image
-	fi
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
+_setup_verify_metadump
 
 _scratch_mkfs >/dev/null 2>&1
-
-max_md_version=$(_xfs_metadump_max_version)
-
 _scratch_mount
 
 testdir=$SCRATCH_MNT/test-$seq
@@ -127,12 +52,7 @@  done
 _scratch_unmount
 
 echo "Create metadump file, restore it and check restored fs"
-
-verify_metadump_v1 $max_md_version
-
-if [[ $max_md_version == 2 ]]; then
-	verify_metadump_v2
-fi
+_verify_metadumps
 
 # success, all done
 status=0
diff --git a/tests/xfs/234 b/tests/xfs/234
index f4f8af6d3a..8f808c7507 100755
--- a/tests/xfs/234
+++ b/tests/xfs/234
@@ -15,16 +15,13 @@  _begin_fstest auto quick rmap punch metadump
 _cleanup()
 {
     cd /
-    _scratch_unmount > /dev/null 2>&1
-    [[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
-	    _destroy_loop_device $logdev
-    [[ -n $datadev ]] && _destroy_loop_device $datadev
-    rm -rf $tmp.* $testdir $metadump_file $TEST_DIR/image \
-       $TEST_DIR/log-image
+    _cleanup_verify_metadump
+    rm -rf $tmp.* $testdir
 }
 
 # Import common functions.
 . ./common/filter
+. ./common/xfs_metadump_tests
 
 # real QA test starts here
 _supported_fs xfs
@@ -32,82 +29,9 @@  _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
 _require_loop
 _require_xfs_scratch_rmapbt
 _require_xfs_io_command "fpunch"
-
-metadump_file=$TEST_DIR/${seq}_metadump
-
-verify_metadump_v1()
-{
-	local max_version=$1
-	local version=""
-
-	if [[ $max_version == 2 ]]; then
-		version="-v 1"
-	fi
-
-	_scratch_xfs_metadump $metadump_file $version
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
-		   _scratch_xfs_mdrestore $metadump_file
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	SCRATCH_DEV=$datadev _scratch_mount
-	SCRATCH_DEV=$datadev _scratch_unmount
-
-	logdev=$SCRATCH_LOGDEV
-	[[ -z $logdev ]] && logdev=none
-	_check_xfs_filesystem $datadev $logdev none
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
-
-verify_metadump_v2()
-{
-	version="-v 2"
-
-	_scratch_xfs_metadump $metadump_file $version
-
-	# Metadump v2 files can contain contents dumped from an external log
-	# device. Use a temporary file to hold the log device contents restored
-	# from such a metadump file.
-	slogdev=""
-	if [[ -n $SCRATCH_LOGDEV ]]; then
-		slogdev=$TEST_DIR/log-image
-	fi
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
-		   _scratch_xfs_mdrestore $metadump_file
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	logdev=${SCRATCH_LOGDEV}
-	if [[ -s $TEST_DIR/log-image ]]; then
-		logdev=$(_create_loop_device $TEST_DIR/log-image)
-	fi
-
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
-
-	[[ -z $logdev ]] && logdev=none
-	_check_xfs_filesystem $datadev $logdev none
-
-	if [[ -s $TEST_DIR/log-image ]]; then
-		_destroy_loop_device $logdev
-		logdev=""
-		rm -f $TEST_DIR/log-image
-	fi
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
+_setup_verify_metadump
 
 _scratch_mkfs >/dev/null 2>&1
-
-max_md_version=$(_xfs_metadump_max_version)
-
 _scratch_mount
 
 testdir=$SCRATCH_MNT/test-$seq
@@ -127,12 +51,7 @@  done
 _scratch_unmount
 
 echo "Create metadump file, restore it and check restored fs"
-
-verify_metadump_v1 $max_md_version
-
-if [[ $max_md_version == 2 ]]; then
-	verify_metadump_v2
-fi
+_verify_metadumps
 
 # success, all done
 status=0
diff --git a/tests/xfs/253 b/tests/xfs/253
index 3b567999d8..6623c435e5 100755
--- a/tests/xfs/253
+++ b/tests/xfs/253
@@ -26,23 +26,21 @@  _cleanup()
     cd /
     rm -f $tmp.*
     rm -rf "${OUTPUT_DIR}"
-    rm -f "${METADUMP_FILE}"
-    [[ -n $logdev && $logdev != $SCRATCH_LOGDEV ]] && \
-	    _destroy_loop_device $logdev
-    [[ -n $datadev ]] && _destroy_loop_device $datadev
+    _cleanup_verify_metadump
 }
 
 # Import common functions.
 . ./common/filter
+. ./common/xfs_metadump_tests
 
 _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
 _require_test
 _require_scratch
+_setup_verify_metadump
 
 # real QA test starts here
 
 OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
-METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
 ORPHANAGE="lost+found"
 
 _supported_fs xfs
@@ -52,24 +50,7 @@  function create_file() {
 	touch $(printf "$@")
 }
 
-verify_metadump_v1()
-{
-	local max_version=$1
-	local version=""
-
-	if [[ $max_version == 2 ]]; then
-		version="-v 1"
-	fi
-
-	_scratch_xfs_metadump $METADUMP_FILE $version
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV="" \
-		   _scratch_xfs_mdrestore $METADUMP_FILE
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	SCRATCH_DEV=$datadev _scratch_mount
-
+extra_test() {
 	cd "${SCRATCH_MNT}"
 
 	# Get a listing of all the files after obfuscation
@@ -78,60 +59,6 @@  verify_metadump_v1()
 	ls -R | od -c >> $seqres.full
 
 	cd /
-
-	SCRATCH_DEV=$datadev _scratch_unmount
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
-
-verify_metadump_v2()
-{
-	version="-v 2"
-
-	_scratch_xfs_metadump $METADUMP_FILE $version
-
-	# Metadump v2 files can contain contents dumped from an external log
-	# device. Use a temporary file to hold the log device contents restored
-	# from such a metadump file.
-	slogdev=""
-	if [[ -n $SCRATCH_LOGDEV ]]; then
-		slogdev=$TEST_DIR/log-image
-	fi
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
-		   _scratch_xfs_mdrestore $METADUMP_FILE
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	logdev=${SCRATCH_LOGDEV}
-	if [[ -s $TEST_DIR/log-image ]]; then
-		logdev=$(_create_loop_device $TEST_DIR/log-image)
-	fi
-
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
-
-	cd "${SCRATCH_MNT}"
-
-	# Get a listing of all the files after obfuscation
-	echo "Metadump v2" >> $seqres.full
-	ls -R >> $seqres.full
-	ls -R | od -c >> $seqres.full
-
-	cd /
-
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
-
-	if [[ -s $TEST_DIR/log-image ]]; then
-		_destroy_loop_device $logdev
-		logdev=""
-		rm -f $TEST_DIR/log-image
-	fi
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
 }
 
 echo "Disciplyne of silence is goed."
@@ -233,13 +160,7 @@  cd $here
 
 _scratch_unmount
 
-max_md_version=$(_xfs_metadump_max_version)
-
-verify_metadump_v1 $max_md_version
-
-if [[ $max_md_version == 2 ]]; then
-	verify_metadump_v2
-fi
+_verify_metadumps '' extra_test
 
 # Finally, re-make the filesystem since to ensure we don't
 # leave a directory with duplicate entries lying around.
diff --git a/tests/xfs/291 b/tests/xfs/291
index 1433140821..c475d89ad9 100755
--- a/tests/xfs/291
+++ b/tests/xfs/291
@@ -9,11 +9,21 @@ 
 . ./common/preamble
 _begin_fstest auto repair metadump
 
+# Override the default cleanup function.
+_cleanup()
+{
+	cd /
+	rm -r -f $tmp.*
+	_cleanup_verify_metadump
+}
+
 # Import common functions.
 . ./common/filter
+. ./common/xfs_metadump_tests
 
 _supported_fs xfs
 _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
+_setup_verify_metadump
 
 # real QA test starts here
 _require_scratch
@@ -92,26 +102,7 @@  _scratch_xfs_check >> $seqres.full 2>&1 || _fail "xfs_check failed"
 
 # Yes they can!  Now...
 # Can xfs_metadump cope with this monster?
-max_md_version=$(_xfs_metadump_max_version)
-
-for md_version in $(seq 1 $max_md_version); do
-	version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v $md_version"
-	fi
-
-	_scratch_xfs_metadump $tmp.metadump -a -o $version || \
-		_fail "xfs_metadump failed"
-
-	slogdev=$SCRATCH_LOGDEV
-	if [[ -z $version || $version == "-v 1" ]]; then
-		slogdev=""
-	fi
-	SCRATCH_DEV=$tmp.img SCRATCH_LOGDEV=$slogdev _scratch_xfs_mdrestore \
-		   $tmp.metadump || _fail "xfs_mdrestore failed"
-	SCRATCH_DEV=$tmp.img _scratch_xfs_repair -f &>> $seqres.full || \
-		_fail "xfs_repair of metadump failed"
-done
+_verify_metadumps '-a -o'
 
 # Yes it can; success, all done
 status=0
diff --git a/tests/xfs/432 b/tests/xfs/432
index 7e402aa88f..579e1b556a 100755
--- a/tests/xfs/432
+++ b/tests/xfs/432
@@ -20,16 +20,19 @@  _begin_fstest auto quick dir metadata metadump
 _cleanup()
 {
 	cd /
-	rm -f "$tmp".* $metadump_file $metadump_img
+	rm -f "$tmp".*
+	_cleanup_verify_metadump
 }
 
 # Import common functions.
 . ./common/filter
+. ./common/xfs_metadump_tests
 
 # real QA test starts here
 _supported_fs xfs
 _require_command "$XFS_MDRESTORE_PROG" "xfs_mdrestore"
 _require_scratch
+_setup_verify_metadump
 
 rm -f "$seqres.full"
 
@@ -54,9 +57,6 @@  echo "Format and mount"
 _scratch_mkfs -b size=1k -n size=64k > "$seqres.full" 2>&1
 _scratch_mount >> "$seqres.full" 2>&1
 
-metadump_file="$TEST_DIR/meta-$seq"
-metadump_img="$TEST_DIR/img-$seq"
-rm -f $metadump_file $metadump_img
 testdir="$SCRATCH_MNT/test-$seq"
 max_fname_len=255
 blksz=$(_get_block_size $SCRATCH_MNT)
@@ -87,27 +87,7 @@  echo "qualifying extent: $extlen blocks" >> $seqres.full
 test -n "$extlen" || _notrun "could not create dir extent > 1000 blocks"
 
 echo "Try to metadump, restore and check restored metadump image"
-max_md_version=$(_xfs_metadump_max_version)
-
-for md_version in $(seq 1 $max_md_version); do
-	version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v $md_version"
-	fi
-
-	_scratch_xfs_metadump $metadump_file -a -o -w $version
-
-	slogdev=$SCRATCH_LOGDEV
-	if [[ -z $version || $version == "-v 1" ]]; then
-		slogdev=""
-	fi
-
-	SCRATCH_DEV=$metadump_img SCRATCH_LOGDEV=$slogdev \
-		   _scratch_xfs_mdrestore $metadump_file
-
-	SCRATCH_DEV=$metadump_img _scratch_xfs_repair -n &>> $seqres.full || \
-		echo "xfs_repair on restored fs returned $?"
-done
+_verify_metadumps '-a -o -w'
 
 # success, all done
 status=0
diff --git a/tests/xfs/503 b/tests/xfs/503
index 8643c3d483..ff6b344a9c 100755
--- a/tests/xfs/503
+++ b/tests/xfs/503
@@ -17,11 +17,13 @@  _cleanup()
 {
 	cd /
 	rm -rf $tmp.* $testdir
+	_cleanup_verify_metadump
 }
 
 # Import common functions.
 . ./common/filter
 . ./common/populate
+. ./common/xfs_metadump_tests
 
 testdir=$TEST_DIR/test-$seq
 
@@ -35,6 +37,7 @@  _require_scratch_nocheck
 _require_populate_commands
 _xfs_skip_online_rebuild
 _xfs_skip_offline_rebuild
+_setup_verify_metadump
 
 echo "Format and populate"
 _scratch_populate_cached nofill > $seqres.full 2>&1
@@ -43,66 +46,17 @@  mkdir -p $testdir
 metadump_file=$testdir/scratch.md
 copy_file=$testdir/copy.img
 
-check_restored_metadump_image()
-{
-	local image=$1
-
-	loop_dev=$(_create_loop_device $image)
-	SCRATCH_DEV=$loop_dev _scratch_mount
-	SCRATCH_DEV=$loop_dev _check_scratch_fs
-	SCRATCH_DEV=$loop_dev _scratch_unmount
-	_destroy_loop_device $loop_dev
-}
-
-max_md_version=$(_xfs_metadump_max_version)
-
 echo "metadump and mdrestore"
-for md_version in $(seq 1 $max_md_version); do
-	version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v $md_version"
-	fi
-
-	_scratch_xfs_metadump $metadump_file -a -o $version >> $seqres.full
-	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
-	check_restored_metadump_image $TEST_DIR/image
-done
+_verify_metadumps '-a -o'
 
 echo "metadump a and mdrestore"
-for md_version in $(seq 1 $max_md_version); do
-	version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v $md_version"
-	fi
-
-	_scratch_xfs_metadump $metadump_file -a $version >> $seqres.full
-	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
-	check_restored_metadump_image $TEST_DIR/image
-done
+_verify_metadumps '-a'
 
 echo "metadump g and mdrestore"
-for md_version in $(seq 1 $max_md_version); do
-	version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v $md_version"
-	fi
-
-	_scratch_xfs_metadump $metadump_file -g $version >> $seqres.full
-	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
-	check_restored_metadump_image $TEST_DIR/image
-done
+_verify_metadumps '-g' >> $seqres.full
 
 echo "metadump ag and mdrestore"
-for md_version in $(seq 1 $max_md_version); do
-	version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v $md_version"
-	fi
-
-	_scratch_xfs_metadump $metadump_file -a -g $version >> $seqres.full
-	SCRATCH_DEV=$TEST_DIR/image _scratch_xfs_mdrestore $metadump_file
-	check_restored_metadump_image $TEST_DIR/image
-done
+_verify_metadumps '-a -g' >> $seqres.full
 
 echo copy
 $XFS_COPY_PROG $SCRATCH_DEV $copy_file >> $seqres.full
diff --git a/tests/xfs/605 b/tests/xfs/605
index f2cd7aba98..af917f0f32 100755
--- a/tests/xfs/605
+++ b/tests/xfs/605
@@ -15,17 +15,13 @@  _cleanup()
 {
 	cd /
 	rm -r -f $tmp.*
-	_scratch_unmount > /dev/null 2>&1
-	[[ -n $logdev && $logdev != "none" && $logdev != $SCRATCH_LOGDEV ]] && \
-		_destroy_loop_device $logdev
-	[[ -n $datadev ]] && _destroy_loop_device $datadev
-	rm -r -f $metadump_file $TEST_DIR/data-image \
-	   $TEST_DIR/log-image
+	_cleanup_verify_metadump
 }
 
 # Import common functions.
 . ./common/dmflakey
 . ./common/inject
+. ./common/xfs_metadump_tests
 
 # real QA test starts here
 _supported_fs xfs
@@ -37,85 +33,22 @@  _require_xfs_io_error_injection log_item_pin
 _require_dm_target flakey
 _require_xfs_io_command "pwrite"
 _require_test_program "punch-alternating"
+_setup_verify_metadump
 
-metadump_file=${TEST_DIR}/${seq}.md
 testfile=${SCRATCH_MNT}/testfile
 
 echo "Format filesystem on scratch device"
 _scratch_mkfs >> $seqres.full 2>&1
 
-max_md_version=$(_xfs_metadump_max_version)
-
 external_log=0
 if [[ $USE_EXTERNAL = yes && -n "$SCRATCH_LOGDEV" ]]; then
 	external_log=1
 fi
 
-if [[ $max_md_version == 1 && $external_log == 1 ]]; then
+if [[ $MAX_XFS_METADUMP_FORMAT == 1 && $external_log == 1 ]]; then
 	_notrun "metadump v1 does not support external log device"
 fi
 
-verify_metadump_v1()
-{
-	local version=""
-	if [[ $max_md_version == 2 ]]; then
-		version="-v 1"
-	fi
-
-	_scratch_xfs_metadump $metadump_file -a -o $version
-
-	SCRATCH_DEV=$TEST_DIR/data-image _scratch_xfs_mdrestore $metadump_file
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	SCRATCH_DEV=$datadev _scratch_mount
-	SCRATCH_DEV=$datadev _check_scratch_fs
-	SCRATCH_DEV=$datadev _scratch_unmount
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
-
-verify_metadump_v2()
-{
-	local version="-v 2"
-
-	_scratch_xfs_metadump $metadump_file -a -o $version
-
-	# Metadump v2 files can contain contents dumped from an external log
-	# device. Use a temporary file to hold the log device contents restored
-	# from such a metadump file.
-	slogdev=""
-	if [[ -n $SCRATCH_LOGDEV ]]; then
-		slogdev=$TEST_DIR/log-image
-	fi
-
-	SCRATCH_DEV=$TEST_DIR/data-image SCRATCH_LOGDEV=$slogdev \
-		   _scratch_xfs_mdrestore $metadump_file
-
-	datadev=$(_create_loop_device $TEST_DIR/data-image)
-
-	logdev=""
-	if [[ -s $slogdev ]]; then
-		logdev=$(_create_loop_device $slogdev)
-	fi
-
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_mount
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _check_scratch_fs
-	SCRATCH_DEV=$datadev SCRATCH_LOGDEV=$logdev _scratch_unmount
-
-	if [[ -s $logdev ]]; then
-		_destroy_loop_device $logdev
-		logdev=""
-		rm -f $slogdev
-	fi
-
-	_destroy_loop_device $datadev
-	datadev=""
-	rm -f $TEST_DIR/data-image
-}
-
 echo "Initialize and mount filesystem on flakey device"
 _init_flakey
 _load_flakey_table $FLAKEY_ALLOW_WRITES
@@ -160,14 +93,7 @@  echo -n "Filesystem has a "
 _print_logstate
 
 echo "Create metadump file, restore it and check restored fs"
-
-if [[ $external_log == 0 ]]; then
-	verify_metadump_v1 $max_md_version
-fi
-
-if [[ $max_md_version == 2 ]]; then
-	verify_metadump_v2
-fi
+_verify_metadumps '-a -o'
 
 # Mount the fs to replay the contents from the dirty log.
 _scratch_mount