|
@@ -3125,26 +3125,27 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
|
|
|
int ret;
|
|
|
u64 len = olen;
|
|
|
struct cmp_pages cmp;
|
|
|
- int same_inode = 0;
|
|
|
+ bool same_inode = (src == dst);
|
|
|
u64 same_lock_start = 0;
|
|
|
u64 same_lock_len = 0;
|
|
|
|
|
|
- if (src == dst)
|
|
|
- same_inode = 1;
|
|
|
-
|
|
|
if (len == 0)
|
|
|
return 0;
|
|
|
|
|
|
- if (same_inode) {
|
|
|
+ if (same_inode)
|
|
|
inode_lock(src);
|
|
|
+ else
|
|
|
+ btrfs_double_inode_lock(src, dst);
|
|
|
|
|
|
- ret = extent_same_check_offsets(src, loff, &len, olen);
|
|
|
- if (ret)
|
|
|
- goto out_unlock;
|
|
|
- ret = extent_same_check_offsets(src, dst_loff, &len, olen);
|
|
|
- if (ret)
|
|
|
- goto out_unlock;
|
|
|
+ ret = extent_same_check_offsets(src, loff, &len, olen);
|
|
|
+ if (ret)
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
+ ret = extent_same_check_offsets(dst, dst_loff, &len, olen);
|
|
|
+ if (ret)
|
|
|
+ goto out_unlock;
|
|
|
+
|
|
|
+ if (same_inode) {
|
|
|
/*
|
|
|
* Single inode case wants the same checks, except we
|
|
|
* don't want our length pushed out past i_size as
|
|
@@ -3172,16 +3173,6 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
|
|
|
|
|
|
same_lock_start = min_t(u64, loff, dst_loff);
|
|
|
same_lock_len = max_t(u64, loff, dst_loff) + len - same_lock_start;
|
|
|
- } else {
|
|
|
- btrfs_double_inode_lock(src, dst);
|
|
|
-
|
|
|
- ret = extent_same_check_offsets(src, loff, &len, olen);
|
|
|
- if (ret)
|
|
|
- goto out_unlock;
|
|
|
-
|
|
|
- ret = extent_same_check_offsets(dst, dst_loff, &len, olen);
|
|
|
- if (ret)
|
|
|
- goto out_unlock;
|
|
|
}
|
|
|
|
|
|
/* don't make the dst file partly checksummed */
|