fuse_vnop_copy_file_range(): use vn_lock_pair()

Reviewed by:	asomers, jah
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D42625
This commit is contained in:
Konstantin Belousov 2023-11-15 00:48:47 +02:00
parent 884eeff20c
commit 318c56714a

View file

@ -879,23 +879,11 @@ fuse_vnop_copy_file_range(struct vop_copy_file_range_args *ap)
td = ap->a_fsizetd;
pid = td->td_proc->p_pid;
/* Lock both vnodes, avoiding risk of deadlock. */
do {
err = vn_lock(outvp, LK_EXCLUSIVE);
if (invp == outvp)
break;
if (err == 0) {
err = vn_lock(invp, LK_SHARED | LK_NOWAIT);
if (err == 0)
break;
VOP_UNLOCK(outvp);
err = vn_lock(invp, LK_SHARED);
if (err == 0)
VOP_UNLOCK(invp);
}
} while (err == 0);
if (err != 0)
return (err);
vn_lock_pair(invp, false, LK_SHARED, outvp, false, LK_EXCLUSIVE);
if (invp->v_data == NULL || outvp->v_data == NULL) {
err = EBADF;
goto unlock;
}
err = fuse_filehandle_getrw(invp, FREAD, &infufh, incred, pid);
if (err)