##/bin/bash # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (c) 2024 Oracle. All Rights Reserved. # # Filesystem metadata dump 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. _xfs_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"* } _xfs_cleanup_verify_metadump() { local img _scratch_unmount &>> $seqres.full 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 # Don't call rm directly with a globbed argument here to avoid # issues issues with variable expansions. for img in "$XFS_METADUMP_IMG"*; do test -e "$img" && rm -f "$img" done fi } # Can xfs_metadump snapshot the fs metadata to a v1 metadump file? _scratch_xfs_can_metadump_v1() { # metadump v1 does not support log devices [ "$USE_EXTERNAL" = yes ] && [ -n "$SCRATCH_LOGDEV" ] && return 1 # metadump v1 does not support realtime devices [ "$USE_EXTERNAL" = yes ] && [ -n "$SCRATCH_RTDEV" ] && return 1 return 0 } # Can xfs_metadump snapshot the fs metadata to a v2 metadump file? _scratch_xfs_can_metadump_v2() { test "$MAX_XFS_METADUMP_VERSION" -ge 2 } # Create a metadump in v1 format, restore it to fs image files, then mount the # images and fsck them. _xfs_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. _xfs_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 _xfs_verify_metadumps() { _scratch_xfs_can_metadump_v1 && _xfs_verify_metadump_v1 "$@" _scratch_xfs_can_metadump_v2 && _xfs_verify_metadump_v2 "$@" }