@@ -3027,8 +3027,8 @@ static int extent_same_check_offsets(struct inode *inode, u64 off, u64 *plen,
3027
3027
return 0 ;
3028
3028
}
3029
3029
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 )
3032
3032
{
3033
3033
int ret ;
3034
3034
u64 len = olen ;
@@ -3037,21 +3037,13 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
3037
3037
u64 same_lock_start = 0 ;
3038
3038
u64 same_lock_len = 0 ;
3039
3039
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
-
3048
3040
ret = extent_same_check_offsets (src , loff , & len , olen );
3049
3041
if (ret )
3050
- goto out_unlock ;
3042
+ return ret ;
3051
3043
3052
3044
ret = extent_same_check_offsets (dst , dst_loff , & len , olen );
3053
3045
if (ret )
3054
- goto out_unlock ;
3046
+ return ret ;
3055
3047
3056
3048
if (same_inode ) {
3057
3049
/*
@@ -3068,32 +3060,21 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
3068
3060
* allow an unaligned length so long as it ends at
3069
3061
* i_size.
3070
3062
*/
3071
- if (len != olen ) {
3072
- ret = - EINVAL ;
3073
- goto out_unlock ;
3074
- }
3063
+ if (len != olen )
3064
+ return - EINVAL ;
3075
3065
3076
3066
/* 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 ;
3081
3069
3082
3070
same_lock_start = min_t (u64 , loff , dst_loff );
3083
3071
same_lock_len = max_t (u64 , loff , dst_loff ) + len - same_lock_start ;
3084
3072
}
3085
3073
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
-
3093
3074
again :
3094
3075
ret = btrfs_cmp_data_prepare (src , loff , dst , dst_loff , olen , & cmp );
3095
3076
if (ret )
3096
- goto out_unlock ;
3077
+ return ret ;
3097
3078
3098
3079
if (same_inode )
3099
3080
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,
3143
3124
btrfs_double_extent_unlock (src , loff , dst , dst_loff , len );
3144
3125
3145
3126
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
+
3146
3154
out_unlock :
3147
3155
if (same_inode )
3148
3156
inode_unlock (src );
0 commit comments