aix vnode hold simplification
[openafs.git] / src / afs / afs_callback.c
index 1bfaf1e..f13436a 100644 (file)
@@ -60,10 +60,8 @@ static struct ltable {
       "afs_xsrvAddr", (char *)&afs_xsrvAddr},
     {
       "afs_xvreclaim", (char *)&afs_xvreclaim},
-#ifdef AFS_AFSDB_ENV
     { "afsdb_client_lock", (char *)&afsdb_client_lock},
     { "afsdb_req_lock", (char *)&afsdb_req_lock},
-#endif
 #ifdef AFS_DISCON_ENV
     { "afs_discon_lock", (char *)&afs_discon_lock},
     { "afs_disconDirtyLock", (char *)&afs_disconDirtyLock},
@@ -457,17 +455,17 @@ loop1:
                            afs_osi_Sleep(&tvc->f.states);
                            goto loop1;
                        }
-#ifdef AFS_DARWIN80_ENV
-                       if (tvc->f.states & CDeadVnode) {
-                           ReleaseReadLock(&afs_xvcache);
-                           afs_osi_Sleep(&tvc->f.states);
-                           goto loop1;
-                       }
-#endif
 #if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
                        VN_HOLD(AFSTOV(tvc));
 #else
 #ifdef AFS_DARWIN80_ENV
+                       if (tvc->f.states & CDeadVnode) {
+                           if (!(tvc->f.states & CBulkFetching)) {
+                               ReleaseReadLock(&afs_xvcache);
+                               afs_osi_Sleep(&tvc->f.states);
+                               goto loop1;
+                           }
+                       }
                        vp = AFSTOV(tvc);
                        if (vnode_get(vp))
                            continue;
@@ -477,12 +475,13 @@ loop1:
                            AFS_GLOCK();
                            continue;
                        }
+                       if (tvc->f.states & (CBulkFetching|CDeadVnode)) {
+                           AFS_GUNLOCK();
+                           vnode_recycle(AFSTOV(tvc));
+                           AFS_GLOCK();
+                       }
 #else
-#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-                       osi_vnhold(tvc, 0);
-#else
-                       VREFCOUNT_INC(tvc); /* AIX, apparently */
-#endif
+                       AFS_FAST_HOLD(tvc);
 #endif
 #endif
                        ReleaseReadLock(&afs_xvcache);
@@ -551,17 +550,17 @@ loop2:
                        afs_osi_Sleep(&tvc->f.states);
                        goto loop2;
                    }
-#ifdef AFS_DARWIN80_ENV
-                   if (tvc->f.states & CDeadVnode) {
-                       ReleaseReadLock(&afs_xvcache);
-                       afs_osi_Sleep(&tvc->f.states);
-                       goto loop2;
-                   }
-#endif
 #if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
                    VN_HOLD(AFSTOV(tvc));
 #else
 #ifdef AFS_DARWIN80_ENV
+                   if (tvc->f.states & CDeadVnode) {
+                       if (!(tvc->f.states & CBulkFetching)) {
+                           ReleaseReadLock(&afs_xvcache);
+                           afs_osi_Sleep(&tvc->f.states);
+                           goto loop2;
+                       }
+                   }
                    vp = AFSTOV(tvc);
                    if (vnode_get(vp))
                        continue;
@@ -571,12 +570,13 @@ loop2:
                        AFS_GLOCK();
                        continue;
                    }
+                   if (tvc->f.states & (CBulkFetching|CDeadVnode)) {
+                       AFS_GUNLOCK();
+                       vnode_recycle(AFSTOV(tvc));
+                       AFS_GLOCK();
+                   }
 #else
-#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-                   osi_vnhold(tvc, 0);
-#else
-                   VREFCOUNT_INC(tvc); /* AIX, apparently */
-#endif
+                   AFS_FAST_HOLD(tvc);
 #endif
 #endif
                    ReleaseReadLock(&afs_xvcache);
@@ -782,7 +782,7 @@ SRXAFSCB_InitCallBackState(struct rx_call *a_call)
 
            for (i = 0; i < NVOLS; i++)
                for (tv = afs_volumes[i]; tv; tv = tv->next) {
-                   for (j = 0; j < MAXHOSTS; j++)
+                   for (j = 0; j < AFS_MAXHOSTS; j++)
                        if (tv->serverHost[j] == ts)
                            afs_ResetVolumeInfo(tv);
                }