|
@@ -1520,13 +1520,15 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
|
|
while (1) {
|
|
|
struct btrfs_ordered_extent *ordered;
|
|
|
lock_extent(&BTRFS_I(src)->io_tree, off, off+len, GFP_NOFS);
|
|
|
- ordered = btrfs_lookup_first_ordered_extent(inode, off+len);
|
|
|
- if (BTRFS_I(src)->delalloc_bytes == 0 && !ordered)
|
|
|
+ ordered = btrfs_lookup_first_ordered_extent(src, off+len);
|
|
|
+ if (!ordered &&
|
|
|
+ !test_range_bit(&BTRFS_I(src)->io_tree, off, off+len,
|
|
|
+ EXTENT_DELALLOC, 0, NULL))
|
|
|
break;
|
|
|
unlock_extent(&BTRFS_I(src)->io_tree, off, off+len, GFP_NOFS);
|
|
|
if (ordered)
|
|
|
btrfs_put_ordered_extent(ordered);
|
|
|
- btrfs_wait_ordered_range(src, off, off+len);
|
|
|
+ btrfs_wait_ordered_range(src, off, len);
|
|
|
}
|
|
|
|
|
|
/* clone data */
|