In message <[email protected]>, Martin
Matuska wr
ites:
> The branch main has been updated by mm:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=8ee579abe09ec1fe15c588fc9a08370b
> 83b81cd6
>
> commit 8ee579abe09ec1fe15c588fc9a08370b83b81cd6
> Author: Martin Matuska <[email protected]>
> AuthorDate: 2023-04-04 11:40:41 +0000
> Commit: Martin Matuska <[email protected]>
> CommitDate: 2023-04-04 11:43:34 +0000
>
> zfs: fall back if block_cloning feature is disabled
>
> If block_cloning is disabled, or other errors from zfs_clone_range()
> return an EXDEV we should fall back to vn_generic_copy_file_range().
>
> This fixes issues when copying files on the same dataset with
> block_cloning disabled.
>
> Upstreamed as pull request to OpenZFS.
>
> Reviewed by: Mateusz Guzik <[email protected]>
> OpenZFS pull request: 14713
> ---
> .../openzfs/module/os/freebsd/zfs/zfs_vnops_os.c | 17 ++++++++++-----
> --
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c b/sys/c
> ontrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
> index 97429b360a36..2cd1d27e37bc 100644
> --- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
> +++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
> @@ -6243,13 +6243,6 @@ zfs_freebsd_copy_file_range(struct vop_copy_file_range
> _args *ap)
> int error;
> uint64_t len = *ap->a_lenp;
>
> - /*
> - * TODO: If offset/length is not aligned to recordsize, use
> - * vn_generic_copy_file_range() on this fragment.
> - * It would be better to do this after we lock the vnodes, but then we
> - * need something else than vn_generic_copy_file_range().
> - */
> -
> /* Lock both vnodes, avoiding risk of deadlock. */
> do {
> mp = NULL;
> @@ -6300,6 +6293,16 @@ unlock:
> if (mp != NULL)
> vn_finished_write(mp);
>
> + /*
> + * Fall back if block_cloning feature is disabled
> + * or other EXDEV failures from zfs_vnops.c
> + */
> + if (error == EXDEV) {
> + error = vn_generic_copy_file_range(ap->a_invp, ap->a_inoffp,
> + ap->a_outvp, ap->a_outoffp, ap->a_lenp, ap->a_flags
> ,
> + ap->a_incred, ap->a_outcred, ap->a_fsizetd);
> + }
> +
> return (error);
> }
>
>
This is too late to fall back. On Rick's suggestion the following makes the
determination at
zfs_freebsd_copy_file_range() entry much earlier.
diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
index d41821ff67f1..e18dcca58192 100644
--- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
+++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
@@ -6243,6 +6243,18 @@ zfs_freebsd_copy_file_range(struct
vop_copy_file_range_args *ap)
int error;
uint64_t len = *ap->a_lenp;
+ znode_t *outzp = VTOZ(ap->a_outvp);
+ zfsvfs_t *outzfsvfs = ZTOZSB(outzp);
+ objset_t *outos = outzfsvfs->z_os;
+
+ if (!spa_feature_is_enabled(dmu_objset_spa(outos),
+ SPA_FEATURE_BLOCK_CLONING)) {
+ error = vn_generic_copy_file_range(ap->a_invp, ap->a_inoffp,
+ ap->a_outvp, ap->a_outoffp, ap->a_lenp, ap->a_flags,
+ ap->a_incred, ap->a_outcred, ap->a_fsizetd);
+ return (error);
+ }
+
/*
* TODO: If offset/length is not aligned to recordsize, use
* vn_generic_copy_file_range() on this fragment.
Can you revert your commit and commit this, please.
--
Cheers,
Cy Schubert <[email protected]>
FreeBSD UNIX: <[email protected]> Web: https://FreeBSD.org
NTP: <[email protected]> Web: https://nwtime.org
e^(i*pi)+1=0