do {
retry = 0;
ObtainWriteLock(&afs_xvcache, 597);
- root_vp = afs_FindVCache(tvc->mvid, &retry, 0);
+ root_vp = afs_FindVCache(tvc->mvid, &retry, IS_WLOCK);
if (root_vp && retry) {
ReleaseWriteLock(&afs_xvcache);
afs_PutVCache(root_vp);
do {
retry = 0;
ObtainWriteLock(&afs_xvcache, 130);
- tvcp = afs_FindVCache(&tfid, &retry, 0 /* no stats | LRU */ );
+ tvcp = afs_FindVCache(&tfid, &retry, IS_WLOCK /* no stats | LRU */ );
if (tvcp && retry) {
ReleaseWriteLock(&afs_xvcache);
afs_PutVCache(tvcp);
tfid.Fid.Unique = ntohl(ade->fid.vunique);
if ((avc->states & CForeign) == 0 && (ntohl(ade->fid.vnode) & 1)) {
return DT_DIR;
- } else if ((tvc = afs_FindVCache(&tfid, 0, 0))) {
+ }
+ ObtainReadLock(&afs_xvcache);
+ if ((tvc = afs_FindVCache(&tfid, 0, 0))) {
+ ReleaseReadLock(&afs_xvcache);
if (tvc->mvstat) {
afs_PutVCache(tvc);
return DT_DIR;
/* what other types does AFS support? */
} else
afs_PutVCache(tvc);
- }
+ } else
+ ReleaseReadLock(&afs_xvcache);
return DT_UNKNOWN;
}
#endif
ObtainSharedLock(&afs_xvcache, 5);
- tvc = afs_FindVCache(afid, &retry, DO_STATS | DO_VLRU);
+ tvc = afs_FindVCache(afid, &retry, DO_STATS | DO_VLRU | IS_SLOCK);
if (tvc && retry) {
#if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV)
ReleaseSharedLock(&afs_xvcache);
#endif
ObtainSharedLock(&afs_xvcache, 6);
- tvc = afs_FindVCache(&nfid, &retry, DO_VLRU /* no xstats now */ );
+ tvc = afs_FindVCache(&nfid, &retry, DO_VLRU | IS_SLOCK/* no xstats now */ );
if (tvc && retry) {
#if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV)
ReleaseSharedLock(&afs_xvcache);
loop:
ObtainSharedLock(&afs_xvcache, 8);
- tvc = afs_FindVCache(afid, &retry, DO_VLRU /* no stats */ );
+ tvc = afs_FindVCache(afid, &retry, DO_VLRU| IS_SLOCK /* no stats */ );
if (tvc && retry) {
#if defined(AFS_SGI_ENV) && !defined(AFS_SGI53_ENV)
ReleaseSharedLock(&afs_xvcache);
#endif
} /*afs_PutVCache */
+
+static void findvc_sleep(struct vcache *avc, int flag) {
+ if (flag & IS_SLOCK) {
+ ReleaseSharedLock(&afs_xvcache);
+ } else {
+ if (flag & IS_WLOCK) {
+ ReleaseWriteLock(&afs_xvcache);
+ } else {
+ ReleaseReadLock(&afs_xvcache);
+ }
+ }
+ afs_osi_Sleep(&avc->states);
+ if (flag & IS_SLOCK) {
+ ObtainSharedLock(&afs_xvcache, 341);
+ } else {
+ if (flag & IS_WLOCK) {
+ ObtainWriteLock(&afs_xvcache, 343);
+ } else {
+ ObtainReadLock(&afs_xvcache);
+ }
+ }
+}
/*
* afs_FindVCache
*
for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) {
if (FidMatches(afid, tvc)) {
if (tvc->states & CVInit) {
- int lock;
- lock = CheckLock(&afs_xvcache);
- if (lock > 0)
- ReleaseReadLock(&afs_xvcache);
- else
- ReleaseSharedLock(&afs_xvcache);
- afs_osi_Sleep(&tvc->states);
- if (lock > 0)
- ObtainReadLock(&afs_xvcache);
- else
- ObtainSharedLock(&afs_xvcache, 341);
+ findvc_sleep(tvc, flag);
goto findloop;
}
#ifdef AFS_OSF_ENV
#ifdef AFS_DARWIN80_ENV
int vg;
if (tvc->states & CDeadVnode) {
- int lock;
- lock = CheckLock(&afs_xvcache);
- if (lock > 0)
- ReleaseReadLock(&afs_xvcache);
- else
- ReleaseSharedLock(&afs_xvcache);
- afs_osi_Sleep(&tvc->states);
- if (lock > 0)
- ObtainReadLock(&afs_xvcache);
- else
- ObtainSharedLock(&afs_xvcache, 341);
+ findvc_sleep(tvc, flag);
goto findloop;
}
AFS_GUNLOCK();