|
@@ -2333,14 +2333,21 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
|
|
|
|
|
if (type == BTRFS_FILE_EXTENT_REG ||
|
|
|
type == BTRFS_FILE_EXTENT_PREALLOC) {
|
|
|
+ /*
|
|
|
+ * a | --- range to clone ---| b
|
|
|
+ * | ------------- extent ------------- |
|
|
|
+ */
|
|
|
+
|
|
|
+ /* substract range b */
|
|
|
+ if (key.offset + datal > off + len)
|
|
|
+ datal = off + len - key.offset;
|
|
|
+
|
|
|
+ /* substract range a */
|
|
|
if (off > key.offset) {
|
|
|
datao += off - key.offset;
|
|
|
datal -= off - key.offset;
|
|
|
}
|
|
|
|
|
|
- if (key.offset + datal > off + len)
|
|
|
- datal = off + len - key.offset;
|
|
|
-
|
|
|
ret = btrfs_drop_extents(trans, inode,
|
|
|
new_key.offset,
|
|
|
new_key.offset + datal,
|