Re: git: 8ee579abe09e - main - zfs: fall back if block_cloning feature is disabled
- Reply: Mateusz Guzik : "Re: git: 8ee579abe09e - main - zfs: fall back if block_cloning feature is disabled"
- Reply: Rick Macklem : "Re: git: 8ee579abe09e - main - zfs: fall back if block_cloning feature is disabled"
- In reply to: Martin Matuska : "git: 8ee579abe09e - main - zfs: fall back if block_cloning feature is disabled"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 04 Apr 2023 14:17:17 UTC
In message <202304041145.334Bjx6l035872@gitrepo.freebsd.org>, 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 <mm@FreeBSD.org>
> AuthorDate: 2023-04-04 11:40:41 +0000
> Commit: Martin Matuska <mm@FreeBSD.org>
> 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 <mjguzik@gmail.com>
> 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 <Cy.Schubert@cschubert.com>
FreeBSD UNIX: <cy@FreeBSD.org> Web: https://FreeBSD.org
NTP: <cy@nwtime.org> Web: https://nwtime.org
e^(i*pi)+1=0