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

Zorro Lang
2024-02-04T07:14:50Z

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
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> >