]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
FBSD try-relax child vnode locking (recurse only)
authorMatt Benjamin <matt@linuxbox.com>
Sun, 29 Aug 2010 21:33:03 +0000 (17:33 -0400)
committerDerrick Brashear <shadow@dementia.org>
Tue, 7 Sep 2010 18:45:27 +0000 (11:45 -0700)
In cases where afs_vop_lookup would return a child vnode
locked, continue to take an exclusive lock, but allow
recursion (LK_CANRECURSE).  Allow recursion also at
afs_vop_link, where we specifically encountered a conflict
due to recursion.

Change-Id: I5f5b0979ce3c86e517f96ea60b96ebdd26401acb
Reviewed-on: http://gerrit.openafs.org/2625
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit ec85304dd738935d8be3f8934b166f78a10995bf)
Reviewed-on: http://gerrit.openafs.org/2683

src/afs/FBSD/osi_vnodeops.c

index d5c16b285d3a0a6f26af3193799babaa4b8eab02..cbd94d797ebcc64a6187074481ee452dd44c673d 100644 (file)
@@ -548,7 +548,7 @@ afs_vop_lookup(ap)
            MA_VOP_UNLOCK(dvp, 0, p);   /* done with parent. */
 #endif
        }
-       ma_vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+       ma_vn_lock(vp, LK_EXCLUSIVE | LK_CANRECURSE | LK_RETRY, p);
        /* always return the child locked */
     }
     *ap->a_vpp = vp;
@@ -1162,7 +1162,7 @@ afs_vop_link(ap)
        error = EISDIR;
        goto out;
     }
-    if ((error = ma_vn_lock(vp, LK_EXCLUSIVE, p)) != 0) {
+    if ((error = ma_vn_lock(vp, LK_CANRECURSE | LK_EXCLUSIVE, p)) != 0) {
        goto out;
     }
     AFS_GLOCK();