From 2bf4a90d1ed94c54a616c028a6b2b84a43f63570 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 11 Jan 2008 19:12:16 +0000 Subject: [PATCH] DEVEL15-windows-callback-getcellservdb-20080111 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) --- src/WINNT/afsd/afsd_init.c | 4 +- src/WINNT/afsd/cm.h | 1 + src/WINNT/afsd/cm_callback.c | 150 ++++++++++++++++++++++++----------- src/WINNT/afsd/cm_cell.c | 34 +++++--- src/WINNT/afsd/cm_cell.h | 2 +- src/WINNT/afsd/cm_conn.c | 4 +- src/WINNT/afsd/cm_ioctl.c | 18 ++--- src/WINNT/afsd/cm_scache.c | 4 +- src/WINNT/afsd/cm_server.c | 5 +- src/WINNT/afsd/cm_server.h | 2 +- src/WINNT/afsd/cm_vnodeops.c | 2 +- src/WINNT/afsd/cm_volume.c | 4 +- 12 files changed, 152 insertions(+), 78 deletions(-) diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index c61878d04..4d7503f61 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -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; } } diff --git a/src/WINNT/afsd/cm.h b/src/WINNT/afsd/cm.h index d2c9bbbcd..65676fb3b 100644 --- a/src/WINNT/afsd/cm.h +++ b/src/WINNT/afsd/cm.h @@ -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 diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 761411c54..bd5d4a021 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -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; } diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index b3d3c4077..491dffdbb 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -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; } diff --git a/src/WINNT/afsd/cm_cell.h b/src/WINNT/afsd/cm_cell.h index 6515e5d50..20f6c4231 100644 --- a/src/WINNT/afsd/cm_cell.h +++ b/src/WINNT/afsd/cm_cell.h @@ -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); diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index e8a386ab6..7233df63f 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -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); } } diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index baf404572..a271fcac0 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -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) diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 560c55ba3..516353151 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -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; diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index cf7dec126..b3e5e5329 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -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; } diff --git a/src/WINNT/afsd/cm_server.h b/src/WINNT/afsd/cm_server.h index 5bb4431c1..19535afc9 100644 --- a/src/WINNT/afsd/cm_server.h +++ b/src/WINNT/afsd/cm_server.h @@ -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); diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 24b5657d1..38e3034d8 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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) { diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 7e62cc7eb..756713603 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -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 */ -- 2.39.5