diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c.orig b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c --- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c.orig +++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c @@ -6239,7 +6239,8 @@ struct mount *mp; struct uio io; int error; - uint64_t len = *ap->a_lenp; + uint64_t len; + ssize_t r = 0; if (!zfs_bclone_enabled) { mp = NULL; @@ -6287,9 +6288,14 @@ io.uio_offset = *ap->a_outoffp; io.uio_resid = *ap->a_lenp; - error = vn_rlimit_fsize(outvp, &io, ap->a_fsizetd); + error = vn_rlimit_fsizex(outvp, &io, 0, &r, ap->a_fsize_td); if (error != 0) goto out_locked; + len = io.uio_resid; + /* + * No need to call vn_rlimit_fsizex_res before return, + * since the uio is local. + */ error = zfs_clone_range(VTOZ(invp), ap->a_inoffp, VTOZ(outvp), ap->a_outoffp, &len, ap->a_outcred);