|
@@ -3808,11 +3808,6 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
|
|
|
src->i_sb != inode->i_sb)
|
|
|
return -EXDEV;
|
|
|
|
|
|
- /* don't make the dst file partly checksummed */
|
|
|
- if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) !=
|
|
|
- (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))
|
|
|
return -EISDIR;
|
|
|
|
|
@@ -3822,6 +3817,13 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
|
|
|
inode_lock(src);
|
|
|
}
|
|
|
|
|
|
+ /* don't make the dst file partly checksummed */
|
|
|
+ if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) !=
|
|
|
+ (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
/* determine range to clone */
|
|
|
ret = -EINVAL;
|
|
|
if (off + len > src->i_size || off + len < off)
|