git: 318c56714aa8 - main - fuse_vnop_copy_file_range(): use vn_lock_pair()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 16 Nov 2023 20:11:49 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=318c56714aa8c170132ebe008f52904e0f119b5f
commit 318c56714aa8c170132ebe008f52904e0f119b5f
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2023-11-14 22:48:47 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2023-11-16 20:10:30 +0000
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
---
sys/fs/fuse/fuse_vnops.c | 22 +++++-----------------
1 file changed, 5 insertions(+), 17 deletions(-)
diff --git a/sys/fs/fuse/fuse_vnops.c b/sys/fs/fuse/fuse_vnops.c
index 3249e5988801..aead188276ec 100644
--- a/sys/fs/fuse/fuse_vnops.c
+++ b/sys/fs/fuse/fuse_vnops.c
@@ -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)