| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved. |
| # |
| # FS QA Test No. btrfs/110 |
| # |
| # Test that sending and receiving snapshots across different filesystems works |
| # for full and incremental send operations. |
| # |
| seq=`basename $0` |
| seqres=$RESULT_DIR/$seq |
| echo "QA output created by $seq" |
| |
| tmp=/tmp/$$ |
| status=1 # failure is the default! |
| trap "_cleanup; exit \$status" 0 1 2 3 15 |
| |
| _cleanup() |
| { |
| cd / |
| rm -fr $send_files_dir |
| rm -f $tmp.* |
| } |
| |
| # get standard environment, filters and checks |
| . ./common/rc |
| . ./common/filter |
| |
| # real QA test starts here |
| _supported_fs btrfs |
| _require_scratch |
| |
| send_files_dir=$TEST_DIR/btrfs-test-$seq |
| |
| rm -f $seqres.full |
| rm -fr $send_files_dir |
| mkdir $send_files_dir |
| |
| _scratch_mkfs >>$seqres.full 2>&1 |
| _scratch_mount |
| |
| # Create a test file |
| $XFS_IO_PROG -f -c "pwrite -S 0xaa 0K 32K" $SCRATCH_MNT/foo | _filter_xfs_io |
| |
| # Create the first snapshot. |
| _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/snap1 |
| |
| echo "File digest in the first filesystem, first snapshot:" |
| md5sum $SCRATCH_MNT/snap1/foo | _filter_scratch |
| |
| # Save send stream for this snapshot. |
| _run_btrfs_util_prog send -f $send_files_dir/1.snap $SCRATCH_MNT/snap1 |
| |
| # Create a new filesystem and receive the snapshot. |
| _scratch_unmount |
| _scratch_mkfs >>$seqres.full 2>&1 |
| _scratch_mount |
| |
| _run_btrfs_util_prog receive -f $send_files_dir/1.snap $SCRATCH_MNT |
| |
| echo "File digest in the second filesystem, first snapshot:" |
| # Must match the digest we got in the first filesystem. |
| md5sum $SCRATCH_MNT/snap1/foo | _filter_scratch |
| |
| # Snapshot the first snapshot as rw, modify this new snapshot and then snapshot |
| # it as RO to use in a send operation (send requires RO snapshots). |
| _run_btrfs_util_prog subvolume snapshot $SCRATCH_MNT/snap1 $SCRATCH_MNT/snap2_rw |
| |
| $XFS_IO_PROG -c "pwrite -S 0xbb 4K 4K" \ |
| $SCRATCH_MNT/snap2_rw/foo | _filter_xfs_io |
| |
| _run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT/snap2_rw \ |
| $SCRATCH_MNT/snap2 |
| |
| echo "File digest in the second filesystem, second snapshot:" |
| md5sum $SCRATCH_MNT/snap2/foo | _filter_scratch |
| |
| _run_btrfs_util_prog send -p $SCRATCH_MNT/snap1 -f $send_files_dir/2.snap \ |
| $SCRATCH_MNT/snap2 |
| |
| # Create a new filesystem and receive both the first snapshot, through the first |
| # send stream we created, and the second snapshot through the incremental send |
| # stream we just created. Verify this works and the file data is correct in both |
| # snapshots. |
| _scratch_unmount |
| _scratch_mkfs >>$seqres.full 2>&1 |
| _scratch_mount |
| |
| _run_btrfs_util_prog receive -f $send_files_dir/1.snap $SCRATCH_MNT |
| # Receiving the second snapshot used to fail because the send stream used an |
| # incorrect value for the clone sources uuid field - it used the uuid of |
| # snapshot 1, which is different on each filesystem, instead of the received |
| # uuid value, which is preserved across different filesystems. |
| _run_btrfs_util_prog receive -f $send_files_dir/2.snap $SCRATCH_MNT |
| |
| echo "File digests in the third filesystem:" |
| # Must match the digests we got in the previous filesystems. |
| md5sum $SCRATCH_MNT/snap1/foo | _filter_scratch |
| md5sum $SCRATCH_MNT/snap2/foo | _filter_scratch |
| |
| status=0 |
| exit |