From: Matt Benjamin Date: Sun, 29 Aug 2010 21:33:03 +0000 (-0400) Subject: FBSD try-relax child vnode locking (recurse only) X-Git-Tag: openafs-devel-1_5_77~30 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=88bcd3ed6367280bd97ae56cc2c25308e82d86e0;p=packages%2Fo%2Fopenafs.git FBSD try-relax child vnode locking (recurse only) 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 Tested-by: Derrick Brashear (cherry picked from commit ec85304dd738935d8be3f8934b166f78a10995bf) Reviewed-on: http://gerrit.openafs.org/2683 --- diff --git a/src/afs/FBSD/osi_vnodeops.c b/src/afs/FBSD/osi_vnodeops.c index d5c16b285..cbd94d797 100644 --- a/src/afs/FBSD/osi_vnodeops.c +++ b/src/afs/FBSD/osi_vnodeops.c @@ -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();