Skip to content

Commit

Permalink
Merge pull request #164 from truenas/sync-zfs-2.2-release
Browse files Browse the repository at this point in the history
sync with upstream zfs-2.2-release branch
  • Loading branch information
amotin authored Sep 12, 2023
2 parents a2b04c6 + ad9aab0 commit 50ed8e6
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions module/zfs/zfs_vnops.c
Original file line number Diff line number Diff line change
Expand Up @@ -1172,9 +1172,20 @@ zfs_clone_range(znode_t *inzp, uint64_t *inoffp, znode_t *outzp,
inblksz = inzp->z_blksz;

/*
* We cannot clone into files with different block size.
* We cannot clone into files with different block size if we can't
* grow it (block size is already bigger or more than one block).
*/
if (inblksz != outzp->z_blksz && outzp->z_size > inblksz) {
if (inblksz != outzp->z_blksz && (outzp->z_size > outzp->z_blksz ||
outzp->z_size > inblksz)) {
error = SET_ERROR(EINVAL);
goto unlock;
}

/*
* Block size must be power-of-2 if destination offset != 0.
* There can be no multiple blocks of non-power-of-2 size.
*/
if (outoff != 0 && !ISP2(inblksz)) {
error = SET_ERROR(EINVAL);
goto unlock;
}
Expand Down Expand Up @@ -1358,6 +1369,12 @@ zfs_clone_range(znode_t *inzp, uint64_t *inoffp, znode_t *outzp,
*inoffp += done;
*outoffp += done;
*lenp = done;
} else {
/*
* If we made no progress, there must be a good reason.
* EOF is handled explicitly above, before the loop.
*/
ASSERT3S(error, !=, 0);
}

zfs_exit_two(inzfsvfs, outzfsvfs, FTAG);
Expand Down

0 comments on commit 50ed8e6

Please sign in to comment.