Page MenuHomeFreeBSD

D42625.diff
No OneTemporary

D42625.diff

diff --git a/sys/fs/fuse/fuse_vnops.c b/sys/fs/fuse/fuse_vnops.c
--- a/sys/fs/fuse/fuse_vnops.c
+++ b/sys/fs/fuse/fuse_vnops.c
@@ -879,23 +879,11 @@
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)

File Metadata

Mime Type
text/plain
Expires
Tue, Feb 11, 8:01 PM (15 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16600337
Default Alt Text
D42625.diff (830 B)

Event Timeline