Skip to content

Commit 3973909

Browse files
nefelim4agkdave
authored andcommitted
Btrfs: split btrfs_extent_same
Split btrfs_extent_same() to two parts where one is the main EXTENT_SAME entry and a helper that can be repeatedly called on a range. This will be used in following patches. Signed-off-by: Timofey Titovets <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 399b0bb commit 3973909

File tree

1 file changed

+36
-28
lines changed

1 file changed

+36
-28
lines changed

fs/btrfs/ioctl.c

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3027,8 +3027,8 @@ static int extent_same_check_offsets(struct inode *inode, u64 off, u64 *plen,
30273027
return 0;
30283028
}
30293029

3030-
static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
3031-
struct inode *dst, u64 dst_loff)
3030+
static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 olen,
3031+
struct inode *dst, u64 dst_loff)
30323032
{
30333033
int ret;
30343034
u64 len = olen;
@@ -3037,21 +3037,13 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
30373037
u64 same_lock_start = 0;
30383038
u64 same_lock_len = 0;
30393039

3040-
if (len == 0)
3041-
return 0;
3042-
3043-
if (same_inode)
3044-
inode_lock(src);
3045-
else
3046-
btrfs_double_inode_lock(src, dst);
3047-
30483040
ret = extent_same_check_offsets(src, loff, &len, olen);
30493041
if (ret)
3050-
goto out_unlock;
3042+
return ret;
30513043

30523044
ret = extent_same_check_offsets(dst, dst_loff, &len, olen);
30533045
if (ret)
3054-
goto out_unlock;
3046+
return ret;
30553047

30563048
if (same_inode) {
30573049
/*
@@ -3068,32 +3060,21 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
30683060
* allow an unaligned length so long as it ends at
30693061
* i_size.
30703062
*/
3071-
if (len != olen) {
3072-
ret = -EINVAL;
3073-
goto out_unlock;
3074-
}
3063+
if (len != olen)
3064+
return -EINVAL;
30753065

30763066
/* Check for overlapping ranges */
3077-
if (dst_loff + len > loff && dst_loff < loff + len) {
3078-
ret = -EINVAL;
3079-
goto out_unlock;
3080-
}
3067+
if (dst_loff + len > loff && dst_loff < loff + len)
3068+
return -EINVAL;
30813069

30823070
same_lock_start = min_t(u64, loff, dst_loff);
30833071
same_lock_len = max_t(u64, loff, dst_loff) + len - same_lock_start;
30843072
}
30853073

3086-
/* don't make the dst file partly checksummed */
3087-
if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) !=
3088-
(BTRFS_I(dst)->flags & BTRFS_INODE_NODATASUM)) {
3089-
ret = -EINVAL;
3090-
goto out_unlock;
3091-
}
3092-
30933074
again:
30943075
ret = btrfs_cmp_data_prepare(src, loff, dst, dst_loff, olen, &cmp);
30953076
if (ret)
3096-
goto out_unlock;
3077+
return ret;
30973078

30983079
if (same_inode)
30993080
ret = lock_extent_range(src, same_lock_start, same_lock_len,
@@ -3143,6 +3124,33 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
31433124
btrfs_double_extent_unlock(src, loff, dst, dst_loff, len);
31443125

31453126
btrfs_cmp_data_free(&cmp);
3127+
3128+
return ret;
3129+
}
3130+
3131+
static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
3132+
struct inode *dst, u64 dst_loff)
3133+
{
3134+
int ret;
3135+
bool same_inode = (src == dst);
3136+
3137+
if (olen == 0)
3138+
return 0;
3139+
3140+
if (same_inode)
3141+
inode_lock(src);
3142+
else
3143+
btrfs_double_inode_lock(src, dst);
3144+
3145+
/* don't make the dst file partly checksummed */
3146+
if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) !=
3147+
(BTRFS_I(dst)->flags & BTRFS_INODE_NODATASUM)) {
3148+
ret = -EINVAL;
3149+
goto out_unlock;
3150+
}
3151+
3152+
ret = btrfs_extent_same_range(src, loff, olen, dst, dst_loff);
3153+
31463154
out_unlock:
31473155
if (same_inode)
31483156
inode_unlock(src);

0 commit comments

Comments
 (0)