diff options
author | Chris Mason <chris.mason@oracle.com> | 2009-10-09 11:29:53 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-10-09 11:29:53 -0400 |
commit | ac6889cbb254be1ffea376bea4a96ce9be0e0ed0 (patch) | |
tree | 8f0e073af940b1bdfb134b945a03a1b43b614352 /fs | |
parent | e9061e214810c9534381a705a1b46533e09f2676 (diff) |
Btrfs: fix file clone ioctl for bookend extents
The file clone ioctl was incorrectly taking the offset into the
extent on disk into account when calculating the length of the
cloned extent.
The length never changes based on the offset into the physical extent.
Test case:
fallocate -l 1g image
mke2fs image
bcp image image2
e2fsck -f image2
(errors on image2)
The math bug ends up wrapping the length of the extent, and things
go wrong from there.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/ioctl.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e8795becad4c..cdbb054102b9 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -1123,8 +1123,10 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
1123 | datao += off - key.offset; | 1123 | datao += off - key.offset; |
1124 | datal -= off - key.offset; | 1124 | datal -= off - key.offset; |
1125 | } | 1125 | } |
1126 | if (key.offset + datao + datal > off + len) | 1126 | |
1127 | datal = off + len - key.offset - datao; | 1127 | if (key.offset + datal > off + len) |
1128 | datal = off + len - key.offset; | ||
1129 | |||
1128 | /* disko == 0 means it's a hole */ | 1130 | /* disko == 0 means it's a hole */ |
1129 | if (!disko) | 1131 | if (!disko) |
1130 | datao = 0; | 1132 | datao = 0; |