]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-callback-getcellservdb-20080111
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 11 Jan 2008 19:12:16 +0000 (19:12 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 11 Jan 2008 19:12:16 +0000 (19:12 +0000)
LICENSE MIT

Add support for RXAFS_GetCellServDB.  Implemented by generalizing
RXAFS_GetCellByNum and special casing the index values to do the
right thing.

Conditionalize grabbing the callp->lock in the callback functions.
The race conditions in rx have long since been fixed and the potential
for deadlocks are too great.

Add a new flag CM_FLAG_NOPROBE for use in calls to cm_GetCell.  When
set the newly discovered servers will not be immediately probed.  Useful
when setting tokens, setting server preferences, or responding to cmdebug
callbacks.

(cherry picked from commit ae9dc9ad4ddd8313d24e457faf48bc15ccd2c86c)

12 files changed:
src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/cm.h
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_cell.h
src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_server.h
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/cm_volume.c

index c61878d044b081c0c149615047a9e93d485c7b80..4d7503f6135644819582301cae6ba1cd4efec0dd 100644 (file)
@@ -466,7 +466,7 @@ static void afsd_InitServerPreferences(void)
             }
             else       /* add a new server without a cell */
             {
-                tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL); /* refcount = 1 */
+                tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
                 tsp->ipRank = (USHORT)dwRank;
             }
         }
@@ -536,7 +536,7 @@ static void afsd_InitServerPreferences(void)
             }
             else       /* add a new server without a cell */
             {
-                tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL); /* refcount = 1 */
+                tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
                 tsp->ipRank = (USHORT)dwRank;
             }
         }
index d2c9bbbcd8e76a7afefe7e7b78f3ac3ee0141c7f..65676fb3bc540b320947ae0f4eef1cf19a3460ce 100644 (file)
@@ -245,6 +245,7 @@ int RXAFS_Lookup (struct rx_connection *,
 #define CM_FLAG_NOMOUNTCHASE   0x20            /* don't follow mount points */
 #define CM_FLAG_DIRSEARCH      0x40            /* for directory search */
 #define CM_FLAG_CHECKPATH      0x80            /* Path instead of File */
+#define CM_FLAG_NOPROBE         0x100           /* For use with cm_GetCellxxx - do not probe server status */
 
 /* error codes */
 #define CM_ERROR_BASE                  0x66543200
index 761411c5447031aae4e31095a3697aa1abecbfef..bd5d4a02127a8f66980d936abcfa41a1a2e49684 100644 (file)
@@ -361,8 +361,9 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray
     cm_server_t *tsp = NULL;
     cm_cell_t* cellp = NULL;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -395,8 +396,9 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray
         else
             cm_RevokeCallback(callp, cellp, tfidp);
     }
-
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -436,8 +438,9 @@ SRXAFSCB_InitCallBackState(struct rx_call *callp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -518,7 +521,9 @@ SRXAFSCB_InitCallBackState(struct rx_call *callp)
             cm_PutServer(tsp);
        } 
     }
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -550,8 +555,9 @@ SRXAFSCB_Probe(struct rx_call *callp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -561,7 +567,9 @@ SRXAFSCB_Probe(struct rx_call *callp)
               ntohl(host),
               ntohs(port));
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -656,8 +664,9 @@ SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -700,7 +709,9 @@ SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp)
         code = 0;
     }
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return code;
 }
 
@@ -716,8 +727,9 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -809,7 +821,9 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
   fcnDone:
     lock_ReleaseRead(&cm_scacheLock);
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return (code);
 }
 
@@ -825,8 +839,9 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -923,7 +938,9 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep)
   fcnDone:
     lock_ReleaseRead(&cm_scacheLock);
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return (code);
 }
 
@@ -936,8 +953,9 @@ SRXAFSCB_XStatsVersion(struct rx_call *callp, long *vp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -947,7 +965,9 @@ SRXAFSCB_XStatsVersion(struct rx_call *callp, long *vp)
              ntohl(host), ntohs(port));
     *vp = -1;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return RXGEN_OPCODE;
 }
 
@@ -961,8 +981,9 @@ SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -971,7 +992,9 @@ SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long
     osi_Log2(afsd_logp, "SRXAFSCB_GetXStats from host 0x%x port %d - not implemented",
              ntohl(host), ntohs(port));
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return RXGEN_OPCODE;
 }
 
@@ -999,8 +1022,9 @@ SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1026,7 +1050,9 @@ SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr)
             cm_NetMtu[i] : rx_mtu;
     }
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -1055,8 +1081,9 @@ SRXAFSCB_ProbeUuid(struct rx_call *callp, afsUUID* clientUuid)
     char *p,*q;
     int code = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1079,40 +1106,23 @@ SRXAFSCB_ProbeUuid(struct rx_call *callp, afsUUID* clientUuid)
                   ntohl(host),
                   ntohs(port));
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return code;
 }
 
 /* debug interface */
-int 
-SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum,
-                      char **a_name, serverList *a_hosts)
+static int 
+GetCellCommon(afs_int32 a_cellnum, char **a_name, serverList *a_hosts)
 {
     afs_int32 sn;
     cm_cell_t * cellp;
     cm_serverRef_t * serverRefp; 
-    struct rx_connection *connp;
-    struct rx_peer *peerp;
-    unsigned long host = 0;
-    unsigned short port = 0;
-
-    MUTEX_ENTER(&callp->lock);
 
-    if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
-        host = rx_HostOf(peerp);
-        port = rx_PortOf(peerp);
-    }
-
-    osi_Log3(afsd_logp, "SRXAFSCB_GetCellByNum(%d) from host 0x%x port %d",
-             a_cellnum, ntohl(host), ntohs(port));
-
-    a_hosts->serverList_val = 0;
-    a_hosts->serverList_len = 0;
-
-    cellp = cm_FindCellByID(a_cellnum);
+    cellp = cm_FindCellByID(a_cellnum, CM_FLAG_NOPROBE);
     if (!cellp) {
         *a_name = strdup("");
-        MUTEX_EXIT(&callp->lock);
         return 0;
     }
 
@@ -1134,10 +1144,43 @@ SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum,
     }
 
     lock_ReleaseRead(&cm_serverLock);
-    MUTEX_EXIT(&callp->lock);
     return 0;
 }
 
+/* debug interface */
+int 
+SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum,
+                      char **a_name, serverList *a_hosts)
+{
+    struct rx_connection *connp;
+    struct rx_peer *peerp;
+    unsigned long host = 0;
+    unsigned short port = 0;
+    int rc;
+
+#ifdef HOLD_CALL_MUTEX
+    MUTEX_ENTER(&callp->lock);
+#endif
+    if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
+        host = rx_HostOf(peerp);
+        port = rx_PortOf(peerp);
+    }
+
+    osi_Log3(afsd_logp, "SRXAFSCB_GetCellByNum(%d) from host 0x%x port %d",
+             a_cellnum, ntohl(host), ntohs(port));
+
+    a_hosts->serverList_val = 0;
+    a_hosts->serverList_len = 0;
+
+
+    rc = GetCellCommon(a_cellnum, a_name, a_hosts);
+
+#ifdef HOLD_CALL_MUTEX
+    MUTEX_EXIT(&callp->lock);
+#endif
+    return rc;
+}
+
 /* debug interface */
 int 
 SRXAFSCB_TellMeAboutYourself( struct rx_call *callp, 
@@ -1158,8 +1201,9 @@ SRXAFSCB_TellMeAboutYourself( struct rx_call *callp,
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1191,7 +1235,9 @@ SRXAFSCB_TellMeAboutYourself( struct rx_call *callp,
     capabilities->Capabilities_len = dataBytes / sizeof(afs_int32);
     capabilities->Capabilities_val = dataBuffP;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -1228,8 +1274,9 @@ int SRXAFSCB_GetServerPrefs(
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1242,7 +1289,9 @@ int SRXAFSCB_GetServerPrefs(
     *a_srvr_addr = 0xffffffff;
     *a_srvr_rank = 0xffffffff;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -1271,14 +1320,15 @@ int SRXAFSCB_GetServerPrefs(
 int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name, 
                            serverList *a_hosts)
 {
-    char *t_name;
     struct rx_connection *connp;
     struct rx_peer *peerp;
     unsigned long host = 0;
     unsigned short port = 0;
+    int rc;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1287,12 +1337,14 @@ int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name
     osi_Log2(afsd_logp, "SRXAFSCB_GetCellServDB from host 0x%x port %d - not implemented",
              ntohl(host), ntohs(port));
 
-    t_name = (char *)malloc(AFSNAMEMAX);
-    t_name[0] = '\0';
-    *a_name = t_name;
-    a_hosts->serverList_len = 0;
-
-    MUTEX_EXIT(&callp->lock);
+#ifdef AFS_FREELANCE_CLIENT
+    if (cm_freelanceEnabled && index == 0) {
+        rc = GetCellCommon(AFS_FAKE_ROOT_CELL_ID, a_name, a_hosts);
+    } else
+#endif
+    {
+        rc = GetCellCommon(index+1, a_name, a_hosts);
+    }
     return 0;
 }
 
@@ -1324,8 +1376,9 @@ int SRXAFSCB_GetLocalCell(struct rx_call *callp, char **a_name)
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1343,7 +1396,9 @@ int SRXAFSCB_GetLocalCell(struct rx_call *callp, char **a_name)
     }
     *a_name = t_name;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
@@ -1423,8 +1478,9 @@ int SRXAFSCB_GetCacheConfig(struct rx_call *callp,
     unsigned long host = 0;
     unsigned short port = 0;
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_ENTER(&callp->lock);
-
+#endif
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1452,7 +1508,9 @@ int SRXAFSCB_GetCacheConfig(struct rx_call *callp,
     config->cacheConfig_val = t_config;
     config->cacheConfig_len = (*configCount)/sizeof(afs_uint32);
 
+#ifdef HOLD_CALL_MUTEX
     MUTEX_EXIT(&callp->lock);
+#endif
     return 0;
 }
 
index b3d3c4077acb7b7ea234d5ac998c5704d77f4791..491dffdbbee14f0a0d93d76af9676b72fed5e0dd 100644 (file)
@@ -30,13 +30,21 @@ osi_rwlock_t cm_cellLock;
  *
  * At the present time the return value is ignored by the caller.
  */
+typedef struct cm_cell_rock {
+    cm_cell_t * cellp;
+    afs_uint32  flags;
+} cm_cell_rock_t;
+
 long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep)
 {
     cm_server_t *tsp;
     cm_serverRef_t *tsrp;
     cm_cell_t *cellp;
+    cm_cell_rock_t *cellrockp = (cm_cell_rock_t *)rockp;
+    afs_uint32 probe;
         
-    cellp = rockp;
+    cellp = cellrockp->cellp;
+    probe = !(cellrockp->flags & CM_FLAG_NOPROBE);
 
     /* if this server was previously created by fs setserverprefs */
     if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB))
@@ -51,7 +59,7 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep)
         }
     }       
     else
-        tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp);
+        tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp, probe ? 0 : CM_FLAG_NOPROBE);
 
     /* Insert the vlserver into a sorted list, sorted by server rank */
     tsrp = cm_NewServerRef(tsp, 0);
@@ -68,9 +76,10 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep)
  * and check to make sure we have a valid set of volume servers
  * this function must be called with a Write Lock on cm_cellLock
  */
-cm_cell_t *cm_UpdateCell(cm_cell_t * cp)
+static cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
 {
     long code = 0;
+    cm_cell_rock_t rock;
 
     if (cp == NULL)
         return NULL;
@@ -92,13 +101,15 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp)
             cp->vlServersp = NULL;
         }
 
-        code = cm_SearchCellFile(cp->name, NULL, cm_AddCellProc, cp);
+        rock.cellp = cp;
+        rock.flags = flags;
+        code = cm_SearchCellFile(cp->name, NULL, cm_AddCellProc, &rock);
 #ifdef AFS_AFSDB_ENV
         if (code) {
             if (cm_dnsEnabled) {
                 int ttl;
 
-                code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, cp);
+                code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, &rock);
                 if (code == 0) {   /* got cell from DNS */
                     cp->flags |= CM_CELLFLAG_DNS;
                     cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
@@ -136,6 +147,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
     char fullname[200]="";
     int  hasWriteLock = 0;
     afs_uint32 hash;
+    cm_cell_rock_t rock;
 
     if (!strcmp(namep,SMB_IOCTL_FILENAME_NOSLASH))
         return NULL;
@@ -162,7 +174,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
     lock_ReleaseRead(&cm_cellLock);
 
     if (cp) {
-        cm_UpdateCell(cp);
+        cm_UpdateCell(cp, flags);
     } else if (flags & CM_FLAG_CREATE) {
         lock_ObtainWrite(&cm_cellLock);
         hasWriteLock = 1;
@@ -200,7 +212,9 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
         memset(cp, 0, sizeof(cm_cell_t));
         cp->magic = CM_CELL_MAGIC;
         
-        code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp);
+        rock.cellp = cp;
+        rock.flags = flags;
+        code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, &rock);
         if (code) {
             osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellFile(%s) returns code= %d fullname= %s", 
                       osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname));
@@ -209,7 +223,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
             if (cm_dnsEnabled) {
                 int ttl;
 
-                code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, cp);
+                code = cm_SearchCellByDNS(namep, fullname, &ttl, cm_AddCellProc, &rock);
                 if ( code ) {
                     osi_Log3(afsd_logp,"in cm_GetCell_gen cm_SearchCellByDNS(%s) returns code= %d fullname= %s", 
                              osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname));
@@ -288,7 +302,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
     return cp;
 }
 
-cm_cell_t *cm_FindCellByID(afs_int32 cellID)
+cm_cell_t *cm_FindCellByID(afs_int32 cellID, afs_uint32 flags)
 {
     cm_cell_t *cp;
     afs_uint32 hash;
@@ -304,7 +318,7 @@ cm_cell_t *cm_FindCellByID(afs_int32 cellID)
     lock_ReleaseRead(&cm_cellLock);    
 
     if (cp)
-        cm_UpdateCell(cp);
+        cm_UpdateCell(cp, flags);
 
     return cp;
 }
index 6515e5d50cb2db058125f52fe7f749ba102a2ce9..20f6c42316400e5f4104aca55ec8c89fc63fd872 100644 (file)
@@ -50,7 +50,7 @@ extern cm_cell_t *cm_GetCell(char *namep, afs_uint32 flags);
 
 extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags);
 
-extern cm_cell_t *cm_FindCellByID(afs_int32 cellID);
+extern cm_cell_t *cm_FindCellByID(afs_int32 cellID, afs_uint32 flags);
 
 extern void cm_ChangeRankCellVLServer(cm_server_t *tsp);
 
index e8a386ab6dd4d02f84a3b18de18ffc5bd34c147f..7233df63fcd8be4149bb9e599d912a47f0380647 100644 (file)
@@ -122,7 +122,7 @@ static long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
         return CM_ERROR_INVAL;
     }
 
-    cellp = cm_FindCellByID(fidp->cell);
+    cellp = cm_FindCellByID(fidp->cell, 0);
     if (!cellp) 
         return CM_ERROR_NOSUCHCELL;
 
@@ -226,7 +226,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
             }
         } 
         if (cellp == NULL && fidp) {
-            cellp = cm_FindCellByID(fidp->cell);
+            cellp = cm_FindCellByID(fidp->cell, 0);
         }
     }
 
index baf404572eacaf94354ce0130e0eac041e4cc9da..a271fcac09fb3cb05be01e941ffc9b49fb9240cf 100644 (file)
@@ -642,7 +642,7 @@ long cm_IoctlGetFileCellName(struct smb_ioctl *ioctlp, struct cm_user *userp)
     } else 
 #endif /* AFS_FREELANCE_CLIENT */
     {
-        cellp = cm_FindCellByID(scp->fid.cell);
+        cellp = cm_FindCellByID(scp->fid.cell, CM_FLAG_NOPROBE);
         if (cellp) {
             StringCbCopyA(ioctlp->outDatap, SMB_IOCTL_MAXDATA - (ioctlp->outDatap - ioctlp->outAllocp), cellp->name);
             ioctlp->outDatap += strlen(ioctlp->outDatap) + 1;
@@ -813,7 +813,7 @@ long cm_IoctlSetVolumeStatus(struct smb_ioctl *ioctlp, struct cm_user *userp)
     } else
 #endif
     {
-        cellp = cm_FindCellByID(scp->fid.cell);
+        cellp = cm_FindCellByID(scp->fid.cell, 0);
         osi_assertx(cellp, "null cm_cell_t");
 
         if (scp->flags & CM_SCACHEFLAG_RO) {
@@ -1035,7 +1035,7 @@ long cm_IoctlWhereIs(struct smb_ioctl *ioctlp, struct cm_user *userp)
         
     volume = scp->fid.volume;
 
-    cellp = cm_FindCellByID(scp->fid.cell);
+    cellp = cm_FindCellByID(scp->fid.cell, 0);
 
     cm_ReleaseSCache(scp);
 
@@ -1216,14 +1216,14 @@ long cm_IoctlCheckServers(struct smb_ioctl *ioctlp, struct cm_user *userp)
      */
     if (haveCell) {
         /* have cell name, too */
-        cellp = cm_GetCell(cp, 0);
+        cellp = cm_GetCell(cp, (temp & 1) ? CM_FLAG_NOPROBE : 0);
         if (!cellp) 
             return CM_ERROR_NOSUCHCELL;
     }
     else cellp = (cm_cell_t *) 0;
     if (!cellp && (temp & 2)) {
         /* use local cell */
-        cellp = cm_FindCellByID(1);
+        cellp = cm_FindCellByID(1, 0);
     }
     if (!(temp & 1)) { /* if not fast, call server checker routine */
         /* check down servers */
@@ -1668,7 +1668,7 @@ long cm_IoctlSetSPrefs(struct smb_ioctl *ioctlp, struct cm_user *userp)
         }
         else   /* add a new server without a cell */
         {
-            tsp = cm_NewServer(&tmp, type, NULL); /* refcount = 1 */
+            tsp = cm_NewServer(&tmp, type, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
             tsp->ipRank = rank;
         }
        lock_ObtainMutex(&tsp->mx);
@@ -2166,7 +2166,7 @@ long cm_IoctlSetToken(struct smb_ioctl *ioctlp, struct cm_user *userp)
         tp += sizeof(int);
 
         /* cell name */
-        cellp = cm_GetCell(tp, CM_FLAG_CREATE);
+        cellp = cm_GetCell(tp, CM_FLAG_CREATE | CM_FLAG_NOPROBE);
         if (!cellp) 
             return CM_ERROR_NOSUCHCELL;
         tp += strlen(tp) + 1;
@@ -2952,7 +2952,7 @@ long cm_IoctlPathAvailability(struct smb_ioctl *ioctlp, struct cm_user *userp)
     {
         volume = scp->fid.volume;
 
-        cellp = cm_FindCellByID(scp->fid.cell);
+        cellp = cm_FindCellByID(scp->fid.cell, 0);
 
         cm_ReleaseSCache(scp);
 
@@ -3044,7 +3044,7 @@ long cm_IoctlVolStatTest(struct smb_ioctl *ioctlp, struct cm_user *userp)
     }
 
     if (testp->fid.cell > 0) {
-        cellp = cm_FindCellByID(testp->fid.cell);
+        cellp = cm_FindCellByID(testp->fid.cell, 0);
     }
 
     if (!cellp)
index 560c55ba37bdf20d428350b368d3dd823e505b40..51635315159ff84b80c74891278e2fc6756ae983 100644 (file)
@@ -774,7 +774,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
     /* otherwise, we need to find the volume */
     if (!cm_freelanceEnabled || !isRoot) {
         lock_ReleaseWrite(&cm_scacheLock);     /* for perf. reasons */
-        cellp = cm_FindCellByID(fidp->cell);
+        cellp = cm_FindCellByID(fidp->cell, 0);
         if (!cellp) 
             return CM_ERROR_NOSUCHCELL;
 
@@ -1546,7 +1546,7 @@ void cm_MergeStatus(cm_scache_t *dscp,
     if (!(flags & CM_MERGEFLAG_FORCE) && dataVersion < scp->dataVersion) {
         struct cm_cell *cellp;
 
-        cellp = cm_FindCellByID(scp->fid.cell);
+        cellp = cm_FindCellByID(scp->fid.cell, 0);
         if (scp->cbServerp) {
             struct cm_volume *volp = NULL;
 
index cf7dec126c836b3dc2d8b69d800155d53ca5fecb..b3e5e5329bbcd7ae78b2251c76bb4bb00f93582d 100644 (file)
@@ -363,7 +363,7 @@ void cm_SetServerPrefs(cm_server_t * serverp)
     } /* and of for loop */
 }
 
-cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) {
+cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp, afs_uint32 flags) {
     cm_server_t *tsp;
 
     osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family");
@@ -385,7 +385,8 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell
         cm_allServersp = tsp;
         lock_ReleaseWrite(&cm_serverLock);     /* release server lock */
 
-        cm_PingServer(tsp);                    /* Obtain Capabilities and check up/down state */
+        if ( !(flags & CM_FLAG_NOPROBE) )
+            cm_PingServer(tsp);                        /* Obtain Capabilities and check up/down state */
     }
     return tsp;
 }
index 5bb4431c1bc0cd1daf5f6bec612fb4ef74952831..19535afc9eec70e0a4d250111f396918f329752d 100644 (file)
@@ -82,7 +82,7 @@ typedef struct cm_serverRef {
 #define CM_MAXINTERFACE_ADDR          16
 
 extern cm_server_t *cm_NewServer(struct sockaddr_in *addrp, int type,
-       struct cm_cell *cellp);
+       struct cm_cell *cellp, afs_uint32 flags);
 
 extern cm_serverRef_t *cm_NewServerRef(struct cm_server *serverp, afs_uint32 volID);
 
index 24b5657d1d5f51920e65ac0baae3ff1aaf2d8e9d..38e3034d8c20d854a0a9ef3dde0d4b60df45a891 100644 (file)
@@ -1086,7 +1086,7 @@ long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp,
         /* normal mt pt */
         strcpy(volNamep, mpNamep+1);
 
-        cellp = cm_FindCellByID(scp->fid.cell);
+        cellp = cm_FindCellByID(scp->fid.cell, 0);
     }
 
     if (!cellp) {
index 7e62cc7eb93600495f7aab37b08dba697e37969e..7567136034539f9ab76ed9a397934ed350c80ab8 100644 (file)
@@ -451,7 +451,7 @@ long cm_UpdateVolume(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
             tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE);
             if (!tsp)
                 tsp = cm_NewServer(&tsockAddr, CM_SERVER_FILE,
-                                    cellp);
+                                    cellp, 0);
 
             /* if this server was created by fs setserverprefs */
             if ( !tsp->cellp ) 
@@ -818,7 +818,7 @@ void cm_ForceUpdateVolume(cm_fid_t *fidp, cm_user_t *userp, cm_req_t *reqp)
 
     if (!fidp) return;
 
-    cellp = cm_FindCellByID(fidp->cell);
+    cellp = cm_FindCellByID(fidp->cell, 0);
     if (!cellp) return;
 
     /* search for the volume */