| ##/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 "$@" |
| } |