libafs: track dynroot locks for cmdebug
[openafs.git] / src / afs / afs_callback.c
index 26d5fb6..7e0e2dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
@@ -60,15 +60,13 @@ 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},
     { "afs_discon_vc_dirty", (char *)&afs_xvcdirty},
-#endif
+    { "afs_dynrootDirLock", (char *)&afs_dynrootDirLock},
+    { "afs_dynSymlinkLock", (char *)&afs_dynSymlinkLock},
 };
 unsigned long lastCallBack_vnode;
 unsigned int lastCallBack_dv;
@@ -105,8 +103,8 @@ SRXAFSCB_GetCE(struct rx_call *a_call, afs_int32 a_index,
               struct AFSDBCacheEntry *a_result)
 {
 
-    register int i;            /*Loop variable */
-    register struct vcache *tvc;       /*Ptr to current cache entry */
+    int i;             /*Loop variable */
+    struct vcache *tvc;        /*Ptr to current cache entry */
     int code;                  /*Return code */
     XSTATS_DECLS;
 
@@ -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 */
@@ -191,8 +189,8 @@ int
 SRXAFSCB_GetCE64(struct rx_call *a_call, afs_int32 a_index,
                 struct AFSDBCacheEntry64 *a_result)
 {
-    register int i;            /*Loop variable */
-    register struct vcache *tvc;       /*Ptr to current cache entry */
+    int i;             /*Loop variable */
+    struct vcache *tvc;        /*Ptr to current cache entry */
     int code;                  /*Return code */
     XSTATS_DECLS;
 
@@ -237,13 +235,8 @@ 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 */
-#if !defined(AFS_64BIT_ENV) 
-    a_result->Length.high = 0;
-    a_result->Length.low = tvc->f.m.Length;
-#else
+#endif /* INSTRUMENT_LOCKS */
     a_result->Length = tvc->f.m.Length;
-#endif
     a_result->DataVersion = hgetlo(tvc->f.m.DataVersion);
     a_result->callback = afs_data_pointer_to_int32(tvc->callback);     /* XXXX Now a pointer; change it XXXX */
     a_result->cbExpires = tvc->cbExpires;
@@ -386,7 +379,7 @@ SRXAFSCB_GetLock(struct rx_call *a_call, afs_int32 a_index,
  *
  * Description:
  *     Clear out callback information for the specified file, or
- *     even a whole volume.  Used to worry about callback was from 
+ *     even a whole volume.  Used to worry about callback was from
  *      within the particular cell or not.  Now we don't bother with
  *      that anymore; it's not worth the time.
  *
@@ -408,11 +401,11 @@ Appears to need to be called with GLOCK held, as the icl_Event4 stuff asserts ot
  *------------------------------------------------------------------------*/
 
 static int
-ClearCallBack(register struct rx_connection *a_conn,
-             register struct AFSFid *a_fid)
+ClearCallBack(struct rx_connection *a_conn,
+             struct AFSFid *a_fid)
 {
-    register struct vcache *tvc;
-    register int i;
+    struct vcache *tvc;
+    int i;
     struct VenusFid localFid;
     struct volume *tv;
 #ifdef AFS_DARWIN80_ENV
@@ -446,7 +439,7 @@ loop1:
                i = VCHashV(&localFid);
                for (tq = afs_vhashTV[i].prev; tq != &afs_vhashTV[i]; tq = uq) {
                    uq = QPrev(tq);
-                   tvc = QTOVH(tq);      
+                   tvc = QTOVH(tq);
                    if (tvc->f.fid.Fid.Volume == a_fid->Volume) {
                        tvc->callback = NULL;
                        if (!localFid.Cell)
@@ -457,17 +450,15 @@ loop1:
                            afs_osi_Sleep(&tvc->f.states);
                            goto loop1;
                        }
+#if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
+                       AFS_FAST_HOLD(tvc);
+#else
 #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)
-                       VN_HOLD(AFSTOV(tvc));
-#else
-#ifdef AFS_DARWIN80_ENV
                        vp = AFSTOV(tvc);
                        if (vnode_get(vp))
                            continue;
@@ -478,11 +469,7 @@ loop1:
                            continue;
                        }
 #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 +538,15 @@ loop2:
                        afs_osi_Sleep(&tvc->f.states);
                        goto loop2;
                    }
+#if     defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
+                   AFS_FAST_HOLD(tvc);
+#else
 #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)
-                   VN_HOLD(AFSTOV(tvc));
-#else
-#ifdef AFS_DARWIN80_ENV
                    vp = AFSTOV(tvc);
                    if (vnode_get(vp))
                        continue;
@@ -572,11 +557,7 @@ loop2:
                        continue;
                    }
 #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);
@@ -639,12 +620,12 @@ loop2:
  *------------------------------------------------------------------------*/
 
 int
-SRXAFSCB_CallBack(struct rx_call *a_call, register struct AFSCBFids *a_fids,
+SRXAFSCB_CallBack(struct rx_call *a_call, struct AFSCBFids *a_fids,
                  struct AFSCBs *a_callbacks)
 {
-    register int i;            /*Loop variable */
+    int i;             /*Loop variable */
     struct AFSFid *tfid;       /*Ptr to current fid */
-    register struct rx_connection *tconn;      /*Call's connection */
+    struct rx_connection *tconn;       /*Call's connection */
     int code = 0;
     XSTATS_DECLS;
 
@@ -736,10 +717,10 @@ SRXAFSCB_Probe(struct rx_call *a_call)
 int
 SRXAFSCB_InitCallBackState(struct rx_call *a_call)
 {
-    register int i;
-    register struct vcache *tvc;
-    register struct rx_connection *tconn;
-    register struct rx_peer *peer;
+    int i;
+    struct vcache *tvc;
+    struct rx_connection *tconn;
+    struct rx_peer *peer;
     struct server *ts;
     int code = 0;
     XSTATS_DECLS;
@@ -771,18 +752,21 @@ SRXAFSCB_InitCallBackState(struct rx_call *a_call)
                        ReleaseWriteLock(&afs_xcbhash);
                    }
                }
+
+           /* capabilities need be requested again */
+           ts->flags &= ~SCAPS_KNOWN;
        }
 
 
 
        /* find any volumes residing on this server and flush their state */
        {
-           register struct volume *tv;
-           register int j;
+           struct volume *tv;
+           int j;
 
            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);
                }
@@ -872,7 +856,7 @@ SRXAFSCB_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
                   afs_int32 a_collectionNumber, afs_int32 * a_srvVersionNumP,
                   afs_int32 * a_timeP, AFSCB_CollData * a_dataP)
 {
-    register int code;         /*Return value */
+    int code;          /*Return value */
     afs_int32 *dataBuffP;      /*Ptr to data to be returned */
     afs_int32 dataBytes;       /*Bytes in data buffer */
     XSTATS_DECLS;
@@ -911,6 +895,7 @@ SRXAFSCB_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
         */
        dataBytes = sizeof(struct afs_CMStats);
        dataBuffP = (afs_int32 *) afs_osi_Alloc(dataBytes);
+       osi_Assert(dataBuffP != NULL);
        memcpy((char *)dataBuffP, (char *)&afs_cmstats, dataBytes);
        a_dataP->AFSCB_CollData_len = dataBytes >> 2;
        a_dataP->AFSCB_CollData_val = dataBuffP;
@@ -931,6 +916,7 @@ SRXAFSCB_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
        afs_CountServers();
        dataBytes = sizeof(afs_stats_cmperf);
        dataBuffP = (afs_int32 *) afs_osi_Alloc(dataBytes);
+       osi_Assert(dataBuffP != NULL);
        memcpy((char *)dataBuffP, (char *)&afs_stats_cmperf, dataBytes);
        a_dataP->AFSCB_CollData_len = dataBytes >> 2;
        a_dataP->AFSCB_CollData_val = dataBuffP;
@@ -955,6 +941,7 @@ SRXAFSCB_GetXStats(struct rx_call *a_call, afs_int32 a_clientVersionNum,
 
        dataBytes = sizeof(afs_stats_cmfullperf);
        dataBuffP = (afs_int32 *) afs_osi_Alloc(dataBytes);
+       osi_Assert(dataBuffP != NULL);
        memcpy((char *)dataBuffP, (char *)(&afs_stats_cmfullperf), dataBytes);
        a_dataP->AFSCB_CollData_len = dataBytes >> 2;
        a_dataP->AFSCB_CollData_val = dataBuffP;
@@ -1062,7 +1049,7 @@ shutdown_CB(void)
  *      a_call : Ptr to Rx call on which this request came in.
  *
  * Returns:
- *      RXGEN_OPCODE (always). 
+ *      RXGEN_OPCODE (always).
  *
  * Environment:
  *      Nothing interesting.
@@ -1308,8 +1295,8 @@ SRXAFSCB_GetCellServDB(struct rx_call *a_call, afs_int32 a_index,
        p_name = tcell->cellName;
        for (j = 0; j < AFSMAXCELLHOSTS && tcell->cellHosts[j]; j++);
        i = strlen(p_name);
-       a_hosts->serverList_val =
-           (afs_int32 *) afs_osi_Alloc(j * sizeof(afs_int32));
+       a_hosts->serverList_val = afs_osi_Alloc(j * sizeof(afs_int32));
+       osi_Assert(a_hosts->serverList_val != NULL);
        a_hosts->serverList_len = j;
        for (j = 0; j < AFSMAXCELLHOSTS && tcell->cellHosts[j]; j++)
            a_hosts->serverList_val[j] =
@@ -1317,9 +1304,10 @@ SRXAFSCB_GetCellServDB(struct rx_call *a_call, afs_int32 a_index,
        afs_PutCell(tcell, READ_LOCK);
     }
 
-    t_name = (char *)afs_osi_Alloc(i + 1);
+    t_name = afs_osi_Alloc(i + 1);
     if (t_name == NULL) {
-       afs_osi_Free(a_hosts->serverList_val, (j * sizeof(afs_int32)));
+       if (tcell != NULL)
+           afs_osi_Free(a_hosts->serverList_val, (j * sizeof(afs_int32)));
        RX_AFS_GUNLOCK();
        return ENOMEM;
     }
@@ -1375,7 +1363,7 @@ SRXAFSCB_GetLocalCell(struct rx_call *a_call, char **a_name)
        plen = strlen(p_name);
     else
        plen = 0;
-    t_name = (char *)afs_osi_Alloc(plen + 1);
+    t_name = afs_osi_Alloc(plen + 1);
     if (t_name == NULL) {
        if (tcell)
            afs_PutCell(tcell, READ_LOCK);
@@ -1472,7 +1460,7 @@ SRXAFSCB_GetCacheConfig(struct rx_call *a_call, afs_uint32 callerVersion,
      * Currently only support version 1
      */
     allocsize = sizeof(cm_initparams_v1);
-    t_config = (afs_uint32 *) afs_osi_Alloc(allocsize);
+    t_config = afs_osi_Alloc(allocsize);
     if (t_config == NULL) {
        RX_AFS_GUNLOCK();
        return ENOMEM;
@@ -1613,8 +1601,8 @@ SRXAFSCB_GetCellByNum(struct rx_call *a_call, afs_int32 a_cellnum,
 
     for (sn = 0; sn < AFSMAXCELLHOSTS && tcell->cellHosts[sn]; sn++);
     a_hosts->serverList_len = sn;
-    a_hosts->serverList_val =
-       (afs_int32 *) afs_osi_Alloc(sn * sizeof(afs_int32));
+    a_hosts->serverList_val = afs_osi_Alloc(sn * sizeof(afs_int32));
+    osi_Assert(a_hosts->serverList_val != NULL);
 
     for (i = 0; i < sn; i++)
        a_hosts->serverList_val[i] = ntohl(tcell->cellHosts[i]->addr->sa_ip);
@@ -1655,7 +1643,8 @@ SRXAFSCB_TellMeAboutYourself(struct rx_call *a_call,
     RX_AFS_GUNLOCK();
 
     dataBytes = 1 * sizeof(afs_uint32);
-    dataBuffP = (afs_uint32 *) afs_osi_Alloc(dataBytes);
+    dataBuffP = afs_osi_Alloc(dataBytes);
+    osi_Assert(dataBuffP != NULL);
     dataBuffP[0] = CLIENT_CAPABILITY_ERRORTRANS;
     capabilities->Capabilities_len = dataBytes / sizeof(afs_uint32);
     capabilities->Capabilities_val = dataBuffP;
@@ -1703,7 +1692,7 @@ resume:
         * All done at this level ... ascend and resume the search.
         */
        if (this_parent != parent) {
-               next = this_parent->d_child.next; 
+               next = this_parent->d_child.next;
                this_parent = this_parent->d_parent;
                goto resume;
        }
@@ -1712,7 +1701,7 @@ resume:
  searchdone3:
     if (d_unhashed(dentry))
       *flags = 1;
-    else 
+    else
       *flags = 0;
 
     *fileName = afs_strdup(dentry->d_name.name?dentry->d_name.name:"");
@@ -1726,14 +1715,15 @@ resume:
 }
 #endif
 
-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)
+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)
-    register int i;                    /*Loop variable*/
-    register struct vcache *tvc = afs_globalVp;
+    int i;                     /*Loop variable*/
+    struct vcache *tvc = afs_globalVp;
     struct dentry *dentry;
     struct list_head *cur, *head = &(AFSTOI(tvc))->i_dentry;
 
@@ -1748,9 +1738,9 @@ int SRXAFSCB_GetDE(struct rx_call *a_call, afs_int32 a_index, afs_int32 *addr,
     cur = head;
     while ((cur = cur->next) != head) {
       dentry = list_entry(cur, struct dentry, d_alias);
-      
+
       dget_locked(dentry);
-      
+
 #if defined(AFS_LINUX24_ENV)
       spin_unlock(&dcache_lock);
 #endif
@@ -1764,7 +1754,7 @@ int SRXAFSCB_GetDE(struct rx_call *a_call, afs_int32 a_index, afs_int32 *addr,
        goto fcnDone;
       }
       dput(dentry);
-    }                   
+    }
  searchdone2:
     if (cur == head) {
        /*Past EOF*/
@@ -1775,7 +1765,7 @@ int SRXAFSCB_GetDE(struct rx_call *a_call, afs_int32 a_index, afs_int32 *addr,
 
     if (d_unhashed(dentry))
       *flags = 1;
-    else 
+    else
       *flags = 0;
 
     *fileName = afs_strdup(dentry->d_name.name?dentry->d_name.name:"");