| #! /bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (C) 2017 SUSE Linux Products GmbH. All Rights Reserved. |
| # |
| # FS QA Test No. btrfs/178 |
| # |
| # Test an incremental send operation in a scenario where the relationship of |
| # ancestor-descendant between multiple directories is inversed, and where |
| # multiple directories that were previously ancestors of another directory now |
| # become descendents of multiple directories that used to be their ancestors in |
| # the parent snapshot. This used to trigger an infinite loop in the kernel code. |
| # |
| . ./common/preamble |
| _begin_fstest auto quick send |
| |
| # Override the default cleanup function. |
| _cleanup() |
| { |
| cd / |
| rm -fr $send_files_dir |
| rm -f $tmp.* |
| } |
| |
| . ./common/filter |
| |
| _require_test |
| _require_scratch |
| _require_fssum |
| |
| send_files_dir=$TEST_DIR/btrfs-test-$seq |
| |
| rm -fr $send_files_dir |
| mkdir $send_files_dir |
| |
| _scratch_mkfs >>$seqres.full 2>&1 |
| _scratch_mount |
| |
| # The name of each directory corresponds to its inode number, to make it easier |
| # to debug since btrfs' send processes inodes in ascending order according to |
| # their number. |
| mkdir $SCRATCH_MNT/257 |
| mkdir $SCRATCH_MNT/258 |
| mv $SCRATCH_MNT/257 $SCRATCH_MNT/258/257 |
| mkdir $SCRATCH_MNT/259 |
| mkdir $SCRATCH_MNT/260 |
| mkdir $SCRATCH_MNT/261 |
| mkdir $SCRATCH_MNT/262 |
| mkdir $SCRATCH_MNT/263 |
| mkdir $SCRATCH_MNT/264 |
| mv $SCRATCH_MNT/258 $SCRATCH_MNT/264/258 |
| mkdir $SCRATCH_MNT/265 |
| mkdir $SCRATCH_MNT/266 |
| mv $SCRATCH_MNT/259 $SCRATCH_MNT/266/259 |
| mv $SCRATCH_MNT/260 $SCRATCH_MNT/266/260 |
| mv $SCRATCH_MNT/264 $SCRATCH_MNT/266/264 |
| mv $SCRATCH_MNT/265 $SCRATCH_MNT/266/265 |
| mkdir $SCRATCH_MNT/266/260/267 |
| mkdir $SCRATCH_MNT/266/268 |
| mkdir $SCRATCH_MNT/266/269 |
| mv $SCRATCH_MNT/262 $SCRATCH_MNT/266/269/262 |
| mkdir $SCRATCH_MNT/266/270 |
| mkdir $SCRATCH_MNT/271 |
| mv $SCRATCH_MNT/266 $SCRATCH_MNT/271/266 |
| mkdir $SCRATCH_MNT/271/266/272 |
| mv $SCRATCH_MNT/263 $SCRATCH_MNT/271/266/272/263 |
| mkdir $SCRATCH_MNT/273 |
| mkdir $SCRATCH_MNT/271/266/274 |
| mv $SCRATCH_MNT/273 $SCRATCH_MNT/271/266/274/273 |
| mkdir $SCRATCH_MNT/271/266/272/275 |
| mv $SCRATCH_MNT/271 $SCRATCH_MNT/261/271 |
| |
| # Filesystem looks like: |
| # |
| # . |
| # |--- 261/ |
| # |--- 271/ |
| # |--- 266/ |
| # |--- 259/ |
| # |--- 260/ |
| # | |--- 267 |
| # | |
| # |--- 264/ |
| # | |--- 258/ |
| # | |--- 257/ |
| # | |
| # |--- 265/ |
| # |--- 268/ |
| # |--- 269/ |
| # | |--- 262/ |
| # | |
| # |--- 270/ |
| # |--- 272/ |
| # | |--- 263/ |
| # | |--- 275/ |
| # | |
| # |--- 274/ |
| # |--- 273/ |
| # |
| $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \ |
| $SCRATCH_MNT/mysnap1 > /dev/null |
| |
| $BTRFS_UTIL_PROG send -f $send_files_dir/1.snap \ |
| $SCRATCH_MNT/mysnap1 2>&1 1>/dev/null | _filter_scratch |
| |
| mv $SCRATCH_MNT/261/271/266/272/275 $SCRATCH_MNT/275 |
| mv $SCRATCH_MNT/261/271/266/274 $SCRATCH_MNT/275/274 |
| mv $SCRATCH_MNT/261/271/266/269/262 $SCRATCH_MNT/275/274/273/262 |
| mv $SCRATCH_MNT/261/271/266/269 $SCRATCH_MNT/275/274/273/262/269 |
| mv $SCRATCH_MNT/261/271/266/264/258/257 $SCRATCH_MNT/261/271/266/272 |
| mv $SCRATCH_MNT/261/271/266/264/258 $SCRATCH_MNT/275/274/273/262/269/258 |
| mv $SCRATCH_MNT/261/271 $SCRATCH_MNT/275/274/273/262/269/258/271 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/268 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/260/267 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/270 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/265 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/266/259/265 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/259 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/259 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/272/263 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/266/264/263 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/272 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/260 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/260 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266/264 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264 |
| mv $SCRATCH_MNT/261 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264/263/261 |
| mv $SCRATCH_MNT/275/274/273/262/269/258/271/266 \ |
| $SCRATCH_MNT/275/274/273/262/269/258/271/268/267/270/272/257/264/263/261/266 |
| |
| # Filesystem now looks like: |
| # |
| # . |
| # |-- 275/ |
| # |-- 274/ |
| # |-- 273/ |
| # |-- 262/ |
| # |-- 269/ |
| # |-- 258/ |
| # |-- 271/ |
| # |-- 268/ |
| # |-- 267/ |
| # |-- 270/ |
| # |-- 259/ |
| # | |-- 265/ |
| # | |
| # |-- 272/ |
| # |-- 257/ |
| # |-- 260/ |
| # |-- 264/ |
| # |-- 263/ |
| # |-- 261/ |
| # |-- 266/ |
| # |
| $BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT \ |
| $SCRATCH_MNT/mysnap2 > /dev/null |
| $BTRFS_UTIL_PROG send -p $SCRATCH_MNT/mysnap1 -f $send_files_dir/2.snap \ |
| $SCRATCH_MNT/mysnap2 2>&1 1>/dev/null | _filter_scratch |
| |
| $FSSUM_PROG -A -f -w $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 |
| $FSSUM_PROG -A -f -w $send_files_dir/2.fssum \ |
| -x $SCRATCH_MNT/mysnap2/mysnap1 $SCRATCH_MNT/mysnap2 |
| |
| # Now recreate the filesystem by receiving both send streams and verify we get |
| # the same content that the original filesystem had. |
| _scratch_unmount |
| _scratch_mkfs >>$seqres.full 2>&1 |
| _scratch_mount |
| |
| $BTRFS_UTIL_PROG receive -f $send_files_dir/1.snap $SCRATCH_MNT > /dev/null |
| $BTRFS_UTIL_PROG receive -f $send_files_dir/2.snap $SCRATCH_MNT > /dev/null |
| $FSSUM_PROG -r $send_files_dir/1.fssum $SCRATCH_MNT/mysnap1 |
| $FSSUM_PROG -r $send_files_dir/2.fssum $SCRATCH_MNT/mysnap2 |
| |
| status=0 |
| exit |