darwin notify don't recurse on vcache lock
authorDerrick Brashear <shadow@dementia.org>
Thu, 3 Jun 2010 19:50:46 +0000 (15:50 -0400)
committerDerrick Brashear <shadow@dementia.org>
Thu, 3 Jun 2010 19:57:01 +0000 (12:57 -0700)
afs_vop_access->afs_VerifyVCache2->afs_GetVCache->afs_FetchStatus->
afs_Analyze->afs_NotifyUser can recurse and try to notify us. Don't
worry about it; we're best-effort.

we lack a lock primitive to see if we own this lock.

Change-Id: Ibc0c8a8164a95f0d268e5f1f42a62c3a28c4ab9d
Reviewed-on: http://gerrit.openafs.org/2081
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/DARWIN/osi_misc.c

index 929f454..adb1ef4 100644 (file)
@@ -79,14 +79,16 @@ loop:
                continue;
            }
            ReleaseReadLock(&afs_xvcache);
-           ObtainWriteLock(&tvc->lock, 234);
-           tvc->f.states |= CEvent;
-           AFS_GUNLOCK();
-           vnode_setattr(vp, &va, afs_osi_ctxtp);
-           tvc->f.states &= ~CEvent;
-           vnode_put(vp);
-           AFS_GLOCK();
-           ReleaseWriteLock(&tvc->lock);
+           /* Avoid potentially re-entering on this lock */
+           if (0 == NBObtainWriteLock(&tvc->lock, 234)) {
+               tvc->f.states |= CEvent;
+               AFS_GUNLOCK();
+               vnode_setattr(vp, &va, afs_osi_ctxtp);
+               tvc->f.states &= ~CEvent;
+               vnode_put(vp);
+               AFS_GLOCK();
+               ReleaseWriteLock(&tvc->lock);
+           }
            ObtainReadLock(&afs_xvcache);
            /* our tvc ptr is still good until now */
            AFS_FAST_RELE(tvc);