mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
Restrict short block cloning requests
If we are copying only one block and it is smaller than recordsize property, do not allow destination to grow beyond one block if it is not there yet. Otherwise the destination will get stuck with that block size forever, that can be as small as 512 bytes, no matter how big the destination grow later. Reviewed-by: Kay Pedersen <mail@mkwg.de> Reviewed-by: Rob Norris <rob.norris@klarasystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15321
This commit is contained in:
parent
b34bf2d5f6
commit
3079bf2e6c
@ -1206,6 +1206,19 @@ zfs_clone_range(znode_t *inzp, uint64_t *inoffp, znode_t *outzp,
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we are copying only one block and it is smaller than recordsize
|
||||||
|
* property, do not allow destination to grow beyond one block if it
|
||||||
|
* is not there yet. Otherwise the destination will get stuck with
|
||||||
|
* that block size forever, that can be as small as 512 bytes, no
|
||||||
|
* matter how big the destination grow later.
|
||||||
|
*/
|
||||||
|
if (len <= inblksz && inblksz < outzfsvfs->z_max_blksz &&
|
||||||
|
outzp->z_size <= inblksz && outoff + len > inblksz) {
|
||||||
|
error = SET_ERROR(EINVAL);
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
error = zn_rlimit_fsize(outoff + len);
|
error = zn_rlimit_fsize(outoff + len);
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
Loading…
Reference in New Issue
Block a user