aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-10-09 11:29:53 -0400
committerChris Mason <chris.mason@oracle.com>2009-10-09 11:29:53 -0400
commitac6889cbb254be1ffea376bea4a96ce9be0e0ed0 (patch)
tree8f0e073af940b1bdfb134b945a03a1b43b614352 /fs
parente9061e214810c9534381a705a1b46533e09f2676 (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.c6
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;