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 |
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
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 >
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 > > >
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 > > > > > >
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 > > > > > > > > > > >
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 > > > > > > > > > > > > > > > > >
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 > > > > > > > > > > > > > > > > > > > > > > > > >
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 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
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 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
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 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
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 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
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 >
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 --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