#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2015 Red Hat, Inc. All Rights Reserved. # # FS QA Test 077 # # test UUID modification of CRC-enabled filesystems # # CRC-enabled / V5 superblock filesystems have a UUID stamped into # every piece of metadata, and a mechanism was added later to allow # changing the user-visible UUID by copying the original UUID (which # matches all the existing metadata) to a new superblock location. # Exercise some of that behavior. # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 _cleanup() { cd / rm -f $tmp.* } # get standard environment, filters and checks . ./common/rc . ./common/filter # real QA test starts here _supported_fs xfs _require_xfs_copy _require_scratch _require_no_large_scratch_dev _require_xfs_crc _require_meta_uuid # Takes 2 args, 2nd optional: # 1: generate, rewrite, or restore # 2: Expected UUID after the action. Blank if new uuid generated # After the action check the fs, and make sure it can be mounted # Sets NEW_UUID to the resulting UUID. _test_uuid() { ACTION=$1 EXPECTED_UUID=$2 _scratch_xfs_db -x -c "uuid $ACTION" \ | _filter_uuid $EXPECTED_UUID NEW_UUID=`_scratch_xfs_db -c "uuid" | awk '{print $NF}'` _check_scratch_fs _try_scratch_mount || _fail "Mount failed after UUID $ACTION" _scratch_unmount } _fs_has_META_UUID() { FS=$1 $XFS_DB_PROG -r -c version $FS | grep -q META_UUID } rm -f $seqres.full _scratch_mkfs_xfs -m crc=1 >> $seqres.full 2>&1 || _fail "mkfs failed" ORIG_UUID=`_scratch_xfs_db -c "uuid" | awk '{print $NF}'` _scratch_mount # Put some stuff on the fs $FSSTRESS_PROG -d $SCRATCH_MNT -n 100 -p 4 >> $seqres.full 2>&1 _scratch_unmount # Can xfs_db change it? echo "== Generate new UUID" _test_uuid generate [ "$NEW_UUID" == "$ORIG_UUID" ] && _fail "Failed to change UUID" _fs_has_META_UUID $SCRATCH_DEV || _fail "META_UUID feature not set" # This should be a no-op echo "== Rewrite UUID" _test_uuid rewrite $NEW_UUID _fs_has_META_UUID $SCRATCH_DEV || _fail "META_UUID feature not set" # Can we change it back? echo "== Restore old UUID" _test_uuid restore $ORIG_UUID [ "$NEW_UUID" != "$ORIG_UUID" ] && _fail "Failed to restore UUID" _fs_has_META_UUID $SCRATCH_DEV && _fail "META_UUID feature should not be not set" # This should be a no-op too. echo "== Rewrite UUID" _test_uuid rewrite $ORIG_UUID _fs_has_META_UUID $SCRATCH_DEV && _fail "META_UUID feature should not be not set" # Ok, now what does xfs_copy do; it changes UUID by default IMGFILE=$TEST_DIR/$seq.copy.img rm -f $IMGFILE # xfs_copy changes the UUID by default echo "== xfs_copy with new UUID" $XFS_COPY_PROG $SCRATCH_DEV $IMGFILE 2>&1 >> $seqres.full || \ _fail "xfs_copy (new UUID) failed" _check_xfs_filesystem $IMGFILE none none || _fail "Copy looks corrupted" # The copy should have META_UUID feature set _fs_has_META_UUID $IMGFILE || _fail "META_UUID feature not set on copy" _try_scratch_mount || _fail "Mount failed after UUID rewrite" _scratch_unmount rm -f $IMGFILE # duplicating the UUID should be fine too echo "== xfs_copy with duplicate UUID" $XFS_COPY_PROG -d $SCRATCH_DEV $IMGFILE 2>&1 >> $seqres.full || \ _fail "xfs_copy (duplicate) failed" _check_xfs_filesystem $IMGFILE none none || _fail "Duplicate copy looks corrupted" # The copy should not have META_UUID feature set _fs_has_META_UUID $IMGFILE && _fail "META_UUID feature should not be set on copy" # success, all done status=0 exit