mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
btrfs/055: work on non-4k block sized filesystems
This commit makes use of the new _filter_xfs_io_blocks_modified and _filter_od filtering functions to print information in terms of file blocks rather than file offset. Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com> Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
committed by
Dave Chinner
parent
b9d31daeee
commit
ea8a0d9de3
+75
-53
@@ -60,88 +60,110 @@ test_btrfs_clone_with_holes()
|
||||
_scratch_mkfs "$1" >/dev/null 2>&1
|
||||
_scratch_mount
|
||||
|
||||
# Create a file with 4 extents and 1 hole, all with a size of 8Kb each.
|
||||
# The hole is in the range [16384, 24576[.
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0x01 -b 8192 0 8192" \
|
||||
-c "pwrite -S 0x02 -b 8192 8192 8192" \
|
||||
-c "pwrite -S 0x04 -b 8192 24576 8192" \
|
||||
-c "pwrite -S 0x05 -b 8192 32768 8192" \
|
||||
$SCRATCH_MNT/foo | _filter_xfs_io
|
||||
BLOCK_SIZE=$(get_block_size $SCRATCH_MNT)
|
||||
|
||||
# Clone destination file, 1 extent of 96kb.
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0xff -b 98304 0 98304" \
|
||||
$SCRATCH_MNT/bar | _filter_xfs_io
|
||||
EXTENT_SIZE=$((2 * $BLOCK_SIZE))
|
||||
|
||||
# Clone 2nd extent, 8Kb hole and 3rd extent of foo into bar.
|
||||
$CLONER_PROG -s 8192 -d 0 -l 24576 $SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
OFFSET=0
|
||||
|
||||
# Create a file with 4 extents and 1 hole, all with 2 blocks each.
|
||||
# The hole is in the block range [4, 5[.
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0x01 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" \
|
||||
$SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
||||
|
||||
OFFSET=$(($OFFSET + $EXTENT_SIZE))
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0x02 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" \
|
||||
$SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
||||
|
||||
OFFSET=$(($OFFSET + 2 * $EXTENT_SIZE))
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0x04 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" \
|
||||
$SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
||||
|
||||
OFFSET=$(($OFFSET + $EXTENT_SIZE))
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0x05 -b $EXTENT_SIZE $OFFSET $EXTENT_SIZE" \
|
||||
$SCRATCH_MNT/foo | _filter_xfs_io_blocks_modified
|
||||
|
||||
# Clone destination file, 1 extent of 24 blocks.
|
||||
EXTENT_SIZE=$((24 * $BLOCK_SIZE))
|
||||
$XFS_IO_PROG -s -f -c "pwrite -S 0xff -b $EXTENT_SIZE 0 $EXTENT_SIZE" \
|
||||
$SCRATCH_MNT/bar | _filter_xfs_io_blocks_modified
|
||||
|
||||
# Clone 2nd extent, 2-blocks sized hole and 3rd extent of foo into bar.
|
||||
$CLONER_PROG -s $((2 * $BLOCK_SIZE)) -d 0 -l $((6 * $BLOCK_SIZE)) \
|
||||
$SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
|
||||
# Verify both extents and the hole were cloned.
|
||||
echo "1) Check both extents and the hole were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Cloning range starts at the middle of an hole.
|
||||
$CLONER_PROG -s 20480 -d 32768 -l 12288 $SCRATCH_MNT/foo \
|
||||
$SCRATCH_MNT/bar
|
||||
# Cloning range starts at the middle of a hole.
|
||||
$CLONER_PROG -s $((5 * $BLOCK_SIZE)) -d $((8 * $BLOCK_SIZE)) \
|
||||
-l $((3 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
|
||||
# Verify that half of the hole and the following 8Kb extent were cloned.
|
||||
echo "2) Check half hole and one 8Kb extent were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
# Verify that half of the hole and the following 2 block extent were cloned.
|
||||
echo "2) Check half hole and the following 2 block extent were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Cloning range ends at the middle of an hole.
|
||||
$CLONER_PROG -s 0 -d 65536 -l 20480 $SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
# Cloning range ends at the middle of a hole.
|
||||
$CLONER_PROG -s 0 -d $((16 * $BLOCK_SIZE)) -l $((5 * $BLOCK_SIZE)) \
|
||||
$SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
|
||||
# Verify that 2 extents of 8kb and a 4kb hole were cloned.
|
||||
echo "3) Check that 2 extents of 8kb eacg and a 4kb hole were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
# Verify that 2 extents of 2 blocks size and a 1-block hole were cloned.
|
||||
echo "3) Check that 2 extents of 2 blocks each and a hole of 1 block were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Create a 24Kb hole at the end of the source file (foo).
|
||||
$XFS_IO_PROG -c "truncate 65536" $SCRATCH_MNT/foo
|
||||
# Create a 6-block hole at the end of the source file (foo).
|
||||
$XFS_IO_PROG -c "truncate $((16 * $BLOCK_SIZE))" $SCRATCH_MNT/foo \
|
||||
| _filter_xfs_io_blocks_modified
|
||||
sync
|
||||
|
||||
# Now clone a range that overlaps that hole at the end of the foo file.
|
||||
# It should clone the last 4Kb of the extent at offset 32768 and the
|
||||
# first 8kb of the 24kb hole at the end of foo.
|
||||
$CLONER_PROG -s 36864 -d 86016 -l 12288 $SCRATCH_MNT/foo \
|
||||
$SCRATCH_MNT/bar
|
||||
# It should clone the 10th block and the first two blocks of the hole
|
||||
# at the end of foo.
|
||||
$CLONER_PROG -s $((9 * $BLOCK_SIZE)) -d $((21 * $BLOCK_SIZE)) \
|
||||
-l $((3 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
|
||||
# Verify that the second half of the 8Kb extent at offset 32768 of foo
|
||||
# and the first 8Kb of the 24kb hole of foo were cloned into bar.
|
||||
echo "4) Check that 4kb of 1 extent and 8Kb of an hole were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
# Verify that the 9th block of foo and the first 2 blocks of the
|
||||
# 6-block hole of foo were cloned into bar.
|
||||
echo "4) Check that a block of 1 extent and 2 blocks of a hole were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Clone the same range as before, but clone it into a different offset
|
||||
# of the target (bar) such that it increases the size of the target
|
||||
# by 8Kb.
|
||||
$CLONER_PROG -s 36864 -d 94208 -l 12288 $SCRATCH_MNT/foo \
|
||||
$SCRATCH_MNT/bar
|
||||
# by 2 blocks.
|
||||
$CLONER_PROG -s $((9 * $BLOCK_SIZE)) -d $((23 * $BLOCK_SIZE)) \
|
||||
-l $((3 * $BLOCK_SIZE)) $SCRATCH_MNT/foo $SCRATCH_MNT/bar
|
||||
|
||||
# Verify that the second half of the 8Kb extent at offset 32768 of foo
|
||||
# and the first 8Kb of the 24kb hole of foo were cloned into bar at
|
||||
# bar's offset 94208 and that bar's size increased by 8Kb.
|
||||
echo "5) Check that 4kb of 1 extent and 8Kb of an hole were cloned and file size increased"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
# Verify that the 9th block of foo and the first 2 blocks of the 6-block
|
||||
# hole of foo were cloned into bar at bar's 23rd block and that bar's
|
||||
# size increased by 2 blocks.
|
||||
echo "5) Check that a block of 1 extent and 2 blocks of a hole were" \
|
||||
"cloned and file size increased"
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Create a new completely sparse file (no extents, it's a big hole).
|
||||
$XFS_IO_PROG -f -c "truncate 100000" $SCRATCH_MNT/qwerty
|
||||
$XFS_IO_PROG -f -c "truncate $((25 * $BLOCK_SIZE))" $SCRATCH_MNT/qwerty \
|
||||
| _filter_xfs_io_blocks_modified
|
||||
sync
|
||||
|
||||
# Test cloning a range from the sparse file to the bar file without
|
||||
# increasing bar's size.
|
||||
$CLONER_PROG -s 4096 -d 0 -l 8192 $SCRATCH_MNT/qwerty $SCRATCH_MNT/bar
|
||||
$CLONER_PROG -s $((1 * $BLOCK_SIZE)) -d 0 -l $((2 * $BLOCK_SIZE)) \
|
||||
$SCRATCH_MNT/qwerty $SCRATCH_MNT/bar
|
||||
|
||||
# First 8Kb of bar should now be zeroes.
|
||||
echo "6) Check that 8kb of the hole were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
# First 2 blocks of bar should now be zeroes.
|
||||
echo "6) Check that 2 blocks of the hole were cloned"
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Test cloning a range from the sparse file to the end of the bar file.
|
||||
# The bar file currently has a size of 106496 bytes.
|
||||
$CLONER_PROG -s 0 -d 106496 -l 32768 $SCRATCH_MNT/qwerty \
|
||||
# The bar file currently has 26 blocks.
|
||||
$CLONER_PROG -s 0 -d $((26 * $BLOCK_SIZE)) -l $((8 * $BLOCK_SIZE)) $SCRATCH_MNT/qwerty \
|
||||
$SCRATCH_MNT/bar
|
||||
|
||||
# Verify bar's size increased to 106496 + 32768 bytes (136Kb), and its
|
||||
# last 32768 bytes are all zeroes.
|
||||
echo "7) Check that 32kb of the hole were cloned and the file size increased"
|
||||
od -t x1 $SCRATCH_MNT/bar
|
||||
# Verify bar's size increased to 26 + 8 blocks, and its
|
||||
# last 8 blocks are all zeroes.
|
||||
echo "7) Check that 8 blocks of the hole were cloned and the file size increased"
|
||||
od -t x1 $SCRATCH_MNT/bar | _filter_od
|
||||
|
||||
# Verify that there are no consistency errors.
|
||||
_check_scratch_fs
|
||||
|
||||
+184
-194
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user