3 # Test that an incremental send operation works when in both snapshots there are
4 # two directory inodes that have the same number but different generations and
5 # have an entry with the same name that corresponds to different inodes in each
8 source "$TEST_TOP/common"
10 check_prereq mkfs.btrfs
17 FSSUM_PROG="$INTERNAL_BIN/fssum"
18 srcdir=./send-test-dir
21 run_check chmod a+rw "$srcdir"
23 run_check "$TOP/mkfs.btrfs" -f "$TEST_DEV"
24 run_check_mount_test_dev
26 BLOCK_SIZE=$(stat -f -c %S "$TEST_MNT")
28 run_check $SUDO_HELPER "$TOP/btrfs" subvolume create "$TEST_MNT/foo"
29 run_check $SUDO_HELPER "$TOP/btrfs" subvolume create "$TEST_MNT/bar"
30 run_check $SUDO_HELPER "$TOP/btrfs" subvolume create "$TEST_MNT/baz"
31 run_check $SUDO_HELPER "$TOP/btrfs" subvolume create "$TEST_MNT/snap"
33 tr '\000' 'A' < /dev/null |
34 run_check $SUDO_HELPER dd of="$TEST_MNT/foo/file_a" bs="$BLOCK_SIZE" count=32
35 tr '\000' 'B' < /dev/null |
36 run_check $SUDO_HELPER dd of="$TEST_MNT/bar/file_b" bs="$BLOCK_SIZE" count=32
38 run_check $SUDO_HELPER cp --reflink=always "$TEST_MNT/foo/file_a" "$TEST_MNT/baz/file_a"
39 run_check $SUDO_HELPER cp --reflink=always "$TEST_MNT/bar/file_b" "$TEST_MNT/baz/file_b"
41 # Filesystem looks like:
49 # | |--- file_a (clone of "foo/file_a")
50 # | |--- file_b (clone of "bar/file_b")
54 # create snapshots and send streams
56 run_check $SUDO_HELPER "$TOP/btrfs" subvolume snapshot -r "$TEST_MNT/foo" "$TEST_MNT/snap/foo.0"
57 run_check $SUDO_HELPER "$TOP/btrfs" send -f "$srcdir/foo.0.snap" "$TEST_MNT/snap/foo.0"
59 run_check $SUDO_HELPER "$TOP/btrfs" subvolume snapshot -r "$TEST_MNT/bar" "$TEST_MNT/snap/bar.0"
60 run_check $SUDO_HELPER "$TOP/btrfs" send -f "$srcdir/bar.0.snap" "$TEST_MNT/snap/bar.0"
62 run_check $SUDO_HELPER cp --reflink=always "$TEST_MNT/foo/file_a" "$TEST_MNT/foo/file_a.clone"
63 run_check $SUDO_HELPER rm -f -- "$TEST_MNT/foo/file_a"
65 run_check $SUDO_HELPER "$TOP/btrfs" subvolume snapshot -r "$TEST_MNT/foo" \
66 "$TEST_MNT/snap/foo.1"
67 run_check $SUDO_HELPER "$TOP/btrfs" send -p "$TEST_MNT/snap/foo.0" -f "$srcdir/foo.1.snap" \
68 "$TEST_MNT/snap/foo.1"
70 run_check $SUDO_HELPER "$TOP/btrfs" subvolume snapshot -r "$TEST_MNT/baz" \
71 "$TEST_MNT/snap/baz.0"
72 run_check $SUDO_HELPER "$TOP/btrfs" send -p "$TEST_MNT/snap/foo.1" \
73 -c "$TEST_MNT/snap/bar.0" -f "$srcdir/baz.0.snap" \
74 "$TEST_MNT/snap/baz.0"
76 # Filesystem looks like:
80 # | |--- file_a.clone (clone of "foo/file_a")
84 # | |--- file_a (clone of "foo/file_a")
85 # | |--- file_b (clone of "bar/file_b")
87 # |--- bar.0/ (snapshot of "bar")
89 # |--- foo.0/ (snapshot of "foo")
91 # |--- foo.1/ (snapshot of "foo")
93 # |--- baz.0/ (snapshot of "baz")
97 run_check $FSSUM_PROG -A -f -w "$srcdir/foo.0.fssum" "$TEST_MNT/snap/foo.0"
98 run_check $FSSUM_PROG -A -f -w "$srcdir/foo.1.fssum" "$TEST_MNT/snap/foo.1"
99 run_check $FSSUM_PROG -A -f -w "$srcdir/bar.0.fssum" "$TEST_MNT/snap/bar.0"
100 run_check $FSSUM_PROG -A -f -w "$srcdir/baz.0.fssum" "$TEST_MNT/snap/baz.0"
102 run_check_umount_test_dev
103 run_check "$TOP/mkfs.btrfs" -f "$TEST_DEV"
104 run_check_mount_test_dev
105 run_check $SUDO_HELPER "$TOP/btrfs" subvolume create "$TEST_MNT/dest"
106 run_check_umount_test_dev
107 run_check_mount_test_dev -o subvol=/dest
109 run_check $SUDO_HELPER "$TOP/btrfs" receive -f "$srcdir/foo.0.snap" "$TEST_MNT"
110 run_check $SUDO_HELPER "$TOP/btrfs" receive -f "$srcdir/bar.0.snap" "$TEST_MNT"
112 # if "dest/" is not correctly stripped from the beginning of the path to
113 # "foo.0" in the target fs, we would get an error here because the clone source
114 # "foo.0/file_a" for "foo.1/file_a.clone" can't be found.
115 run_check $SUDO_HELPER "$TOP/btrfs" receive -f "$srcdir/foo.1.snap" "$TEST_MNT"
117 # same here, but with send -c instead of -p
118 run_check $SUDO_HELPER "$TOP/btrfs" receive -f "$srcdir/baz.0.snap" "$TEST_MNT"
120 run_check $FSSUM_PROG -r "$srcdir/foo.0.fssum" "$TEST_MNT/foo.0"
121 run_check $FSSUM_PROG -r "$srcdir/foo.1.fssum" "$TEST_MNT/foo.1"
122 run_check $FSSUM_PROG -r "$srcdir/bar.0.fssum" "$TEST_MNT/bar.0"
123 run_check $FSSUM_PROG -r "$srcdir/baz.0.fssum" "$TEST_MNT/baz.0"
125 run_check_umount_test_dev