aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2023-04-05 20:42:28 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2023-04-07 15:47:45 +0000
commit20be1b4fc4b72f10d5f9411e5bbde0f46a98be5b (patch)
tree62ed089a74329b00f8a86d675f865516c7d81d85
parentd012836fb61654942c9d573c8e0f9def598d4ae2 (diff)
downloadsrc-20be1b4fc4b72f10d5f9411e5bbde0f46a98be5b.tar.gz
src-20be1b4fc4b72f10d5f9411e5bbde0f46a98be5b.zip
zfs: try to fallback early if can't do optimized copy
Not complete, but already shaves on some locking. Sponsored by: Rubicon Communications, LLC ("Netgate")
-rw-r--r--sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c8
1 files changed, 8 insertions, 0 deletions
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 67c1a6e3344b..2ddc7133d416 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
@@ -6236,6 +6236,7 @@ struct vop_copy_file_range_args {
static int
zfs_freebsd_copy_file_range(struct vop_copy_file_range_args *ap)
{
+ zfsvfs_t *outzfsvfs;
struct vnode *invp = ap->a_invp;
struct vnode *outvp = ap->a_outvp;
struct mount *mp;
@@ -6251,6 +6252,13 @@ zfs_freebsd_copy_file_range(struct vop_copy_file_range_args *ap)
*/
vn_start_write(outvp, &mp, V_WAIT);
+ if (__predict_true(mp == outvp->v_mount)) {
+ outzfsvfs = (zfsvfs_t *)mp->mnt_data;
+ if (!spa_feature_is_enabled(dmu_objset_spa(outzfsvfs->z_os),
+ SPA_FEATURE_BLOCK_CLONING)) {
+ goto bad_write_fallback;
+ }
+ }
if (invp == outvp) {
if (vn_lock(outvp, LK_EXCLUSIVE) != 0) {
goto bad_write_fallback;