From 8ca81203f21c4447be36a862eb2b495762af567b Mon Sep 17 00:00:00 2001 From: Li Zefan Date: Sun, 11 Sep 2011 10:52:25 -0400 Subject: [PATCH] --- yaml --- r: 263739 b: refs/heads/master c: d72c0842ff0e71342857723bb65f35b71f57b264 h: refs/heads/master i: 263737: 612f92771a6d0a64f79956459b4b33f3a5e15771 263735: d96ff3f87f29437c6e93c450e90fa2f4b9ea9af2 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/ioctl.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index c83cde97c4d1..79800a3b7a11 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4815053aba7f2304055745df820cd74a39fdaab2 +refs/heads/master: d72c0842ff0e71342857723bb65f35b71f57b264 diff --git a/trunk/fs/btrfs/ioctl.c b/trunk/fs/btrfs/ioctl.c index b3d249d6eba7..028a4b8c12cd 100644 --- a/trunk/fs/btrfs/ioctl.c +++ b/trunk/fs/btrfs/ioctl.c @@ -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,