fstests: generic/158, test dedupe with destination offset past EOF
PATCH 1/1 fstests: generic/158, test dedupe with destination offset past EOF
From: Filipe Manana <[email protected]>
We were testing when the source file offset starts at EOF or beyond, but not when the destination offset is beyond EOF or when the destination offset is smaller than EOF but destination offset plus dedup length is greater than EOF.
This is motivated by a bug in btrfs' extent_same (dedup) ioctl where we allowed the destination offset to start at EOF and beyond (and destination offset + length beyond EOF) for the case where the source and destination files are the same (was not allowed for different files used as source and destination). This also made the file's metadata inconsistent when the dedup operation succeeded, which happened when the source range corresponded to a file hole, prealloc extent or a data extent filled with zeroes.
The btrfs issue is fixed by the following patch for the linux kernel:
"Btrfs: fix extent_same allowing destination offset beyond i_size"
--- tests/generic/158 | 10 +++++++++- tests/generic/158.out | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-)
tests/generic/158 +9 -1
@@ -97,9 +97,17 @@ _dedupe_range "$testdir1/file1" 37 "$testdir1/file1" 59 23 echo "Try overlapping dedupe" _dedupe_range "$testdir1/file1" 0 "$testdir1/file1" 1 $((blksz * 2)) -echo "Try dedupe past EOF" +echo "Try dedupe from past EOF" _dedupe_range "$testdir1/file1" $(( (blks + 10) * blksz)) "$testdir1/file1" 0 $blksz +echo "Try dedupe to past EOF, destination offset beyond EOF" +_dedupe_range "$testdir1/file1" 0 "$testdir1/file1" $(( (blks + 10) * blksz)) \ + $blksz + +echo "Try dedupe to past EOF, destination offset behind EOF" +_dedupe_range "$testdir1/file1" 0 "$testdir1/file1" $(( (blks - 1) * blksz)) \ + $(( blksz * 2)) + echo "Try to dedupe a dir" _dedupe_range "$testdir1/dir1" 0 "$testdir1/file2" 0 $blksz
tests/generic/158.out +5 -1
@@ -7,7 +7,11 @@ Try unaligned dedupe dedupe: Invalid argument Try overlapping dedupe dedupe: Invalid argument -Try dedupe past EOF +Try dedupe from past EOF +dedupe: Invalid argument +Try dedupe to past EOF, destination offset beyond EOF +dedupe: Invalid argument +Try dedupe to past EOF, destination offset behind EOF dedupe: Invalid argument Try to dedupe a dir XFS_IOC_FILE_EXTENT_SAME: Is a directory
Signature · 1 line
2.7.0.rc3
Quoted 7 lines · On Fri, Feb 12, 2016 at 04:23:59PM +0000, [email protected] wrote:
From: Filipe Manana <[email protected]>
We were testing when the source file offset starts at EOF or beyond, but not when the destination offset is beyond EOF or when the destination offset is smaller than EOF but destination offset plus dedup length is greater than EOF.
Quoted 8 lines
This is motivated by a bug in btrfs'
extent_same(dedup) ioctl where we allowed the destination offset to start at EOF and beyond (and destination offset + length beyond EOF) for the case where the source and destination files are the same (was not allowed for different files used as source and destination). This also made the file's metadata inconsistent when the dedup operation succeeded, which happened when the source range corresponded to a file hole, prealloc extent or a data extent filled with zeroes.
Good catch! Unfortunately I seem to have broken it with the gigantic cleanup/new patch series that I just posted... so I'll fix this up and post a v2.
--D
Quoted 57 lines
The btrfs issue is fixed by the following patch for the linux kernel:
"Btrfs: fix
extent_sameallowing destination offset beyondi_size"Signed-off-by Filipe Manana <[email protected]>--- tests/generic/158 | 10 +++++++++- tests/generic/158.out | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-)tests/generic/158 +9
-1@@ -97,9 +97,17 @@ _dedupe_range "$testdir1/file1" 37 "$testdir1/file1" 59 23 echo "Try overlapping dedupe" _dedupe_range "$testdir1/file1" 0 "$testdir1/file1" 1 $((blksz * 2)) -echo "Try dedupe past EOF" +echo "Try dedupe from past EOF" _dedupe_range "$testdir1/file1" $(( (blks + 10) * blksz)) "$testdir1/file1" 0 $blksz +echo "Try dedupe to past EOF, destination offset beyond EOF" +_dedupe_range "$testdir1/file1" 0 "$testdir1/file1" $(( (blks + 10) * blksz)) \ + $blksz + +echo "Try dedupe to past EOF, destination offset behind EOF" +_dedupe_range "$testdir1/file1" 0 "$testdir1/file1" $(( (blks - 1) * blksz)) \ + $(( blksz * 2)) + echo "Try to dedupe a dir" _dedupe_range "$testdir1/dir1" 0 "$testdir1/file2" 0 $blksztests/generic/158.out +5
-1@@ -7,7 +7,11 @@ Try unaligned dedupe dedupe: Invalid argument Try overlapping dedupe dedupe: Invalid argument -Try dedupe past EOF +Try dedupe from past EOF +dedupe: Invalid argument +Try dedupe to past EOF, destination offset beyond EOF +dedupe: Invalid argument +Try dedupe to past EOF, destination offset behind EOF dedupe: Invalid argument Try to dedupe a dir XFS_IOC_FILE_EXTENT_SAME: Is a directorySignature · 6 lines
2.7.0.rc3 -- To unsubscribe from this list: send the line "unsubscribe fstests" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html