vn_copy_file_range(): provide ENOSYS fallback to vn_generic_copy_file_range()

Reviewed by:	markj, Olivier Certner <olce.freebsd@certner.fr>
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D42603
This commit is contained in:
Konstantin Belousov 2023-11-18 10:59:19 +02:00
parent a9bc863769
commit c5405d1c85
4 changed files with 6 additions and 11 deletions

View file

@ -6321,9 +6321,7 @@ zfs_freebsd_copy_file_range(struct vop_copy_file_range_args *ap)
bad_write_fallback:
if (mp != NULL)
vn_finished_write(mp);
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);
error = ENOSYS;
return (error);
}

View file

@ -860,6 +860,7 @@ fuse_vnop_copy_file_range(struct vop_copy_file_range_args *ap)
pid_t pid;
int err;
err = ENOSYS;
if (mp == NULL || mp != vnode_mount(outvp))
goto fallback;
@ -942,13 +943,9 @@ fuse_vnop_copy_file_range(struct vop_copy_file_range_args *ap)
VOP_UNLOCK(invp);
VOP_UNLOCK(outvp);
if (err == ENOSYS) {
if (err == ENOSYS)
fsess_set_notimpl(mp, FUSE_COPY_FILE_RANGE);
fallback:
err = 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);
}
/*
* No need to call vn_rlimit_fsizex_res before return, since the uio is

View file

@ -3888,9 +3888,7 @@ nfs_copy_file_range(struct vop_copy_file_range_args *ap)
*/
if (invp == outvp || invp->v_mount != outvp->v_mount) {
generic_copy:
return (vn_generic_copy_file_range(invp, ap->a_inoffp,
outvp, ap->a_outoffp, ap->a_lenp, ap->a_flags,
ap->a_incred, ap->a_outcred, ap->a_fsizetd));
return (ENOSYS);
}
/* Lock both vnodes, avoiding risk of deadlock. */

View file

@ -3142,6 +3142,8 @@ vn_copy_file_range(struct vnode *invp, off_t *inoffp, struct vnode *outvp,
error = VOP_COPY_FILE_RANGE(invpl, inoffp, outvpl, outoffp,
lenp, flags, incred, outcred, fsize_td);
else
error = ENOSYS;
if (error == ENOSYS)
error = vn_generic_copy_file_range(invpl, inoffp, outvpl,
outoffp, lenp, flags, incred, outcred, fsize_td);
vfs_unbusy(outmp);