aix vnode hold simplification
[openafs.git] / src / afs / afs_callback.c
index 87f3ec7..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},
@@ -151,7 +149,7 @@ SRXAFSCB_GetCE(struct rx_call *a_call, afs_int32 a_index,
     a_result->lock.pid_last_reader = 0;
     a_result->lock.pid_writer = 0;
     a_result->lock.src_indicator = 0;
-#endif /* AFS_OSF20_ENV */
+#endif /* INSTRUMENT_LOCKS */
 #ifdef AFS_64BIT_CLIENT
     a_result->Length = (afs_int32) tvc->f.m.Length & 0xffffffff;
 #else /* AFS_64BIT_CLIENT */
@@ -237,7 +235,7 @@ SRXAFSCB_GetCE64(struct rx_call *a_call, afs_int32 a_index,
     a_result->lock.pid_last_reader = 0;
     a_result->lock.pid_writer = 0;
     a_result->lock.src_indicator = 0;
-#endif /* AFS_OSF20_ENV */
+#endif /* INSTRUMENT_LOCKS */
 #if !defined(AFS_64BIT_ENV) 
     a_result->Length.high = 0;
     a_result->Length.low = tvc->f.m.Length;
@@ -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_OSF_ENV)  || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
+#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_OSF_ENV)  || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
+#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);
                }
@@ -1726,14 +1726,9 @@ resume:
 }
 #endif
 
-int SRXAFSCB_GetDE(a_call, a_index, addr, inode, flags, time, fileName)
-    struct rx_call *a_call;
-    afs_int32 a_index;
-    afs_int32 *addr;
-    afs_int32 *inode;
-    afs_int32 *flags;
-    afs_int32 *time;
-    char ** fileName;
+int SRXAFSCB_GetDE(struct rx_call *a_call, afs_int32 a_index, afs_int32 *addr,
+                  afs_int32 *inode, afs_int32 *flags, afs_int32 *time,
+                  char ** fileName)
 { /*SRXAFSCB_GetDE*/
     int code = 0;                              /*Return code*/
 #if 0 && defined(AFS_LINUX24_ENV)