Index: openafs/src/ntbuild.bat diff -c openafs/src/ntbuild.bat:1.14 openafs/src/ntbuild.bat:1.16 *** openafs/src/ntbuild.bat:1.14 Fri Feb 27 01:02:18 2004 --- openafs/src/ntbuild.bat Mon Aug 9 00:20:12 2004 *************** *** 11,21 **** REM ######################################################################## REM ######################################################################## - REM - REM NOTE: You should run NTLANG.REG before attempting to build localized - REM language files! Failure to do so will cause the resource compiler - REM and message-catalog compiler to choke when they hit unknown code pages. - REM REM NOTE: You will need to copy the NLS files into your windows\system32 REM directory prior to building non-english files. REM --- 11,16 ---- *************** *** 35,41 **** REM ######################################################################## REM Location of base folder where source lies, build directory REM e.g. AFSROOT\SRC is source directory of the build tree (8.3 short name) ! set AFSROOT=D:\Dev\AfsSorce\OpenAF~2.2 REM ######################################################################## REM NTMakefile required definitions: --- 30,36 ---- REM ######################################################################## REM Location of base folder where source lies, build directory REM e.g. AFSROOT\SRC is source directory of the build tree (8.3 short name) ! set AFSROOT=C:\SRC\OpenAFS REM ######################################################################## REM NTMakefile required definitions: *************** *** 43,49 **** REM "1200" for VC6 REM "1300" for VC7 (.NET) REM "1310" for .NET 2003 ! set AFSVER_CL=1200 REM Location of Microsoft Visual C++ development folder (8.3 short name) set MSVCDIR=c:\progra~1\micros~2\vc98 --- 38,45 ---- REM "1200" for VC6 REM "1300" for VC7 (.NET) REM "1310" for .NET 2003 ! REM "1400" for VC8 ! set AFSVER_CL=1310 REM Location of Microsoft Visual C++ development folder (8.3 short name) set MSVCDIR=c:\progra~1\micros~2\vc98 *************** *** 106,117 **** --- 102,115 ---- set AFSDEV_BUILDTYPE=%AFSBLD_TYPE% set AFSDEV_INCLUDE=%MSSDKDIR%\include;%MSVCDIR%\include + IF "%AFSVER_CL%" == "1400" set AFSDEV_INCLUDE=%AFSDEV_INCLUDE%;%MSVCDIR%\atlmfc\include IF "%AFSVER_CL%" == "1310" set AFSDEV_INCLUDE=%AFSDEV_INCLUDE%;%MSVCDIR%\atlmfc\include IF "%AFSVER_CL%" == "1300" set AFSDEV_INCLUDE=%AFSDEV_INCLUDE%;%MSVCDIR%\atlmfc\include IF "%AFSVER_CL%" == "1200" set AFSDEV_INCLUDE=%AFSDEV_INCLUDE%;%MSVCDIR%\atl\include;%MSVCDIR%\mfc\include set AFSDEV_INCLUDE=%AFSDEV_INCLUDE%;%NTDDKDIR%\include;%W9XDDKDIR%\include set AFSDEV_LIB=%MSSDKDIR%\lib;%MSVCDIR%\lib + IF "%AFSVER_CL%" == "1400" set AFSDEV_LIB=%AFSDEV_LIB%;%MSVCDIR%\atlmfc\lib IF "%AFSVER_CL%" == "1310" set AFSDEV_LIB=%AFSDEV_LIB%;%MSVCDIR%\atlmfc\lib IF "%AFSVER_CL%" == "1300" set AFSDEV_LIB=%AFSDEV_LIB%;%MSVCDIR%\atlmfc\lib IF "%AFSVER_CL%" == "1200" set AFSDEV_LIB=%AFSDEV_LIB%;%MSVCDIR%\mfc\lib Index: openafs/src/WINNT/afsd/NTMakefile diff -c openafs/src/WINNT/afsd/NTMakefile:1.26 openafs/src/WINNT/afsd/NTMakefile:1.27 *** openafs/src/WINNT/afsd/NTMakefile:1.26 Thu Jul 22 18:15:47 2004 --- openafs/src/WINNT/afsd/NTMakefile Thu Aug 5 12:31:34 2004 *************** *** 172,178 **** $(DESTDIR)\lib\afs\afsreg.lib $(CONF_DLLFILE): $(CONFOBJS) $(OUT)\libafsconf.res $(CONF_DLLLIBS) ! $(DLLGUILINK) -def:libafsconf.def dnsapi.lib $(DLLPREP) $(COPY) $*.lib $(ILIBDIR) $(DEL) $*.lib $*.exp --- 172,178 ---- $(DESTDIR)\lib\afs\afsreg.lib $(CONF_DLLFILE): $(CONFOBJS) $(OUT)\libafsconf.res $(CONF_DLLLIBS) ! $(DLLGUILINK) -def:libafsconf.def dnsapi.lib mpr.lib $(DLLPREP) $(COPY) $*.lib $(ILIBDIR) $(DEL) $*.lib $*.exp *************** *** 221,227 **** $(AFSKFWLIB) LOGON_DLLSDKLIBS =\ ! dnsapi.lib \ advapi32.lib \ secur32.lib \ strsafe.lib \ --- 221,227 ---- $(AFSKFWLIB) LOGON_DLLSDKLIBS =\ ! dnsapi.lib mpr.lib \ advapi32.lib \ secur32.lib \ strsafe.lib \ *************** *** 251,257 **** $(DESTDIR)\lib\libafsconf.lib $(LOG95_DLLFILE): $(LOG95_DLLOBJS) $(LOG95_DLLLIBS) ! $(DLLGUILINK) $(LOGONLINKFLAGS) -def:afslog95.def dnsapi.lib $(DLLPREP) $(COPY) $*.lib $(DESTDIR)\lib $(DEL) $*.lib $*.exp --- 251,257 ---- $(DESTDIR)\lib\libafsconf.lib $(LOG95_DLLFILE): $(LOG95_DLLOBJS) $(LOG95_DLLLIBS) ! $(DLLGUILINK) $(LOGONLINKFLAGS) -def:afslog95.def dnsapi.lib mpr.lib $(DLLPREP) $(COPY) $*.lib $(DESTDIR)\lib $(DEL) $*.lib $*.exp *************** *** 318,334 **** # klog.exe $(EXEDIR)\klog.exe: $(OUT)\cklog.obj $(OUT)\klog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib $(EXEPREP) # tokens.exe $(EXEDIR)\tokens.exe: $(OUT)\ctokens.obj $(OUT)\tokens.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib $(EXEPREP) # unlog.exe $(EXEDIR)\unlog.exe: $(OUT)\cunlog.obj $(OUT)\unlog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib $(EXEPREP) # afsd.exe --- 318,334 ---- # klog.exe $(EXEDIR)\klog.exe: $(OUT)\cklog.obj $(OUT)\klog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib $(EXEPREP) # tokens.exe $(EXEDIR)\tokens.exe: $(OUT)\ctokens.obj $(OUT)\tokens.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib $(EXEPREP) # unlog.exe $(EXEDIR)\unlog.exe: $(OUT)\cunlog.obj $(OUT)\unlog.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib $(EXEPREP) # afsd.exe *************** *** 337,343 **** AFSD_SDKLIBS =\ largeint.lib \ netapi32.lib \ ! dnsapi.lib \ rpcrt4.lib \ user32.lib \ Dbghelp.lib \ --- 337,343 ---- AFSD_SDKLIBS =\ largeint.lib \ netapi32.lib \ ! dnsapi.lib mpr.lib \ rpcrt4.lib \ user32.lib \ Dbghelp.lib \ *************** *** 369,380 **** # fs.exe $(EXEDIR)\fs.exe: $(FSOBJS) $(OUT)\fs.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib $(EXEPREP) # symlink.exe $(EXEDIR)\symlink.exe: $(SLOBJS) $(OUT)\symlink.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib $(EXEPREP) # afsshare.exe --- 369,380 ---- # fs.exe $(EXEDIR)\fs.exe: $(FSOBJS) $(OUT)\fs.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib $(EXEPREP) # symlink.exe $(EXEDIR)\symlink.exe: $(SLOBJS) $(OUT)\symlink.res $(EXELIBS) ! $(EXECONLINK) dnsapi.lib mpr.lib $(EXEPREP) # afsshare.exe Index: openafs/src/WINNT/afsd/afsd_init.c diff -c openafs/src/WINNT/afsd/afsd_init.c:1.37 openafs/src/WINNT/afsd/afsd_init.c:1.40.2.1 *** openafs/src/WINNT/afsd/afsd_init.c:1.37 Sun Jul 25 16:53:12 2004 --- openafs/src/WINNT/afsd/afsd_init.c Mon Aug 9 16:57:11 2004 *************** *** 17,23 **** #include #include #include - #include #include #include "afsd.h" --- 17,22 ---- *************** *** 29,34 **** --- 28,34 ---- #include "smb.h" #include "cm_rpc.h" #include "lanahelper.h" + #include #include "afsicf.h" extern int RXAFSCB_ExecuteRequest(struct rx_call *z_call); *************** *** 69,75 **** char cm_HostName[200]; long cm_HostAddr; ! char cm_NetbiosName[MAX_NB_NAME_LENGTH]; char cm_CachePath[200]; DWORD cm_CachePathLen; --- 69,75 ---- char cm_HostName[200]; long cm_HostAddr; ! char cm_NetbiosName[MAX_NB_NAME_LENGTH] = ""; char cm_CachePath[200]; DWORD cm_CachePathLen; *************** *** 100,107 **** int cm_dnsEnabled = 1; #endif - char cm_NetBiosName[32]; - extern initUpperCaseTable(); void afsd_initUpperCaseTable() { --- 100,105 ---- *************** *** 369,374 **** --- 367,373 ---- long maxcpus; long ltt, ltto; long rx_mtu, rx_nojumbo; + long virtualCache; char rootCellName[256]; struct rx_service *serverp; static struct rx_securityClass *nullServerSecurityClassp; *************** *** 377,382 **** --- 376,382 ---- char buf[200]; HKEY parmKey; DWORD dummyLen; + DWORD regType; long code; /*int freelanceEnabled;*/ WSADATA WSAjunk; *************** *** 587,604 **** /* Don't log */ } ! dummyLen = sizeof(cm_CachePath); ! code = RegQueryValueEx(parmKey, "CachePath", NULL, NULL, ! cm_CachePath, &dummyLen); ! if (code == ERROR_SUCCESS) afsi_log("Cache path %s", cm_CachePath); ! else { GetWindowsDirectory(cm_CachePath, sizeof(cm_CachePath)); cm_CachePath[2] = 0; /* get drive letter only */ StringCbCatA(cm_CachePath, sizeof(cm_CachePath), "\\AFSCache"); afsi_log("Default cache path %s", cm_CachePath); } dummyLen = sizeof(traceOnPanic); code = RegQueryValueEx(parmKey, "TrapOnPanic", NULL, NULL, (BYTE *) &traceOnPanic, &dummyLen); --- 587,623 ---- /* Don't log */ } ! dummyLen = sizeof(buf); ! code = RegQueryValueEx(parmKey, "CachePath", NULL, ®Type, ! buf, &dummyLen); ! if (code == ERROR_SUCCESS && buf[0]) { ! if(regType == REG_EXPAND_SZ) { ! dummyLen = ExpandEnvironmentStrings(buf, cm_CachePath, sizeof(cm_CachePath)); ! if(dummyLen > sizeof(cm_CachePath)) { ! afsi_log("Cache path [%s] longer than %d after expanding env strings", buf, sizeof(cm_CachePath)); ! osi_panic("CachePath too long", __FILE__, __LINE__); ! } ! } else { ! StringCbCopyA(cm_CachePath, sizeof(cm_CachePath), buf); ! } afsi_log("Cache path %s", cm_CachePath); ! } else { GetWindowsDirectory(cm_CachePath, sizeof(cm_CachePath)); cm_CachePath[2] = 0; /* get drive letter only */ StringCbCatA(cm_CachePath, sizeof(cm_CachePath), "\\AFSCache"); afsi_log("Default cache path %s", cm_CachePath); } + dummyLen = sizeof(virtualCache); + code = RegQueryValueEx(parmKey, "NonPersistentCaching", NULL, NULL, + &virtualCache, &dummyLen); + if (code == ERROR_SUCCESS && virtualCache) { + buf_cacheType = CM_BUF_CACHETYPE_VIRTUAL; + } else { + buf_cacheType = CM_BUF_CACHETYPE_FILE; + } + afsi_log("Cache type is %s", ((buf_cacheType == CM_BUF_CACHETYPE_FILE)?"FILE":"VIRTUAL")); + dummyLen = sizeof(traceOnPanic); code = RegQueryValueEx(parmKey, "TrapOnPanic", NULL, NULL, (BYTE *) &traceOnPanic, &dummyLen); *************** *** 677,697 **** } #endif /* AFS_FREELANCE_CLIENT */ dummyLen = sizeof(buf); code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL, (BYTE *) &buf, &dummyLen); if (code == ERROR_SUCCESS) { ! DWORD len = ExpandEnvironmentStrings(buf, cm_NetBiosName, MAX_NB_NAME_LENGTH); if ( len > 0 && len <= MAX_NB_NAME_LENGTH ) { ! afsi_log("Explicit NetBios name is used %s", cm_NetBiosName); } else { afsi_log("Unable to Expand Explicit NetBios name: %s", buf); ! cm_NetBiosName[0] = 0; /* turn it off */ } } else { ! cm_NetBiosName[0] = 0; /* default off */ } dummyLen = sizeof(smb_hideDotFiles); code = RegQueryValueEx(parmKey, "HideDotFiles", NULL, NULL, --- 696,719 ---- } #endif /* AFS_FREELANCE_CLIENT */ + #ifdef COMMENT + /* The netbios name is looked up in lana_GetUNCServerNameEx */ dummyLen = sizeof(buf); code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL, (BYTE *) &buf, &dummyLen); if (code == ERROR_SUCCESS) { ! DWORD len = ExpandEnvironmentStrings(buf, cm_NetbiosName, MAX_NB_NAME_LENGTH); if ( len > 0 && len <= MAX_NB_NAME_LENGTH ) { ! afsi_log("Explicit NetBios name is used %s", cm_NetbiosName); } else { afsi_log("Unable to Expand Explicit NetBios name: %s", buf); ! cm_NetbiosName[0] = 0; /* turn it off */ } } else { ! cm_NetbiosName[0] = 0; /* default off */ } + #endif dummyLen = sizeof(smb_hideDotFiles); code = RegQueryValueEx(parmKey, "HideDotFiles", NULL, NULL, Index: openafs/src/WINNT/afsd/afslogon.c diff -c openafs/src/WINNT/afsd/afslogon.c:1.23 openafs/src/WINNT/afsd/afslogon.c:1.24.2.1 *** openafs/src/WINNT/afsd/afslogon.c:1.23 Mon Jul 26 19:14:42 2004 --- openafs/src/WINNT/afsd/afslogon.c Mon Aug 9 23:46:24 2004 *************** *** 63,68 **** --- 63,109 ---- va_end(marker); } + static HANDLE hInitMutex = NULL; + static BOOL bInit = FALSE; + + BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved) + { + hDLL = dll; + switch (reason) { + case DLL_PROCESS_ATTACH: + /* Initialization Mutex */ + hInitMutex = CreateMutex(NULL, FALSE, NULL); + break; + + case DLL_PROCESS_DETACH: + CloseHandle(hInitMutex); + break; + + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + default: + /* Everything else succeeds but does nothing. */ + break; + } + + return TRUE; + } + + void AfsLogonInit(void) + { + if ( bInit == FALSE ) { + if ( WaitForSingleObject( hInitMutex, INFINITE ) == WAIT_OBJECT_0 ) { + if ( bInit == FALSE ) { + rx_Init(0); + initAFSDirPath(); + ka_Init(0); + bInit = TRUE; + } + ReleaseMutex(hInitMutex); + } + } + } + CHAR *GenRandomName(CHAR *pbuf) { int i; *************** *** 139,166 **** } } - BOOLEAN APIENTRY DllEntryPoint(HANDLE dll, DWORD reason, PVOID reserved) - { - hDLL = dll; - switch (reason) { - case DLL_PROCESS_ATTACH: - /* Initialize AFS libraries */ - rx_Init(0); - initAFSDirPath(); - ka_Init(0); - break; - - /* Everything else succeeds but does nothing. */ - case DLL_PROCESS_DETACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - default: - break; - } - - return TRUE; - } - DWORD APIENTRY NPGetCaps(DWORD index) { switch (index) { --- 180,185 ---- *************** *** 551,556 **** --- 570,578 ---- int retryInterval; int sleepInterval; + /* Make sure the AFS Libraries are initialized */ + AfsLogonInit(); + /* Initialize Logon Script to none */ *lpLogonScript=NULL; *************** *** 772,777 **** --- 794,802 ---- LPVOID StationHandle, DWORD dwChangeInfo) { + /* Make sure the AFS Libraries are initialized */ + AfsLogonInit(); + DebugEvent0("AFS AfsLogon - NPPasswordChangeNotify"); return 0; } *************** *** 815,820 **** --- 840,848 ---- DWORD LSPtype, LSPsize; HKEY NPKey; + /* Make sure the AFS Libraries are initialized */ + AfsLogonInit(); + (void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_CLIENT_PARMS_KEY, 0, KEY_QUERY_VALUE, &NPKey); LSPsize=sizeof(TraceOption); *************** *** 834,839 **** --- 862,870 ---- DWORD retLen; HANDLE hToken; + /* Make sure the AFS Libraries are initialized */ + AfsLogonInit(); + DebugEvent0("AFS_Logoff_Event - Starting"); if (!GetTokenInformation(pInfo->hToken, TokenUser, NULL, 0, &retLen)) *************** *** 853,859 **** */ if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) { WCHAR Domain[64]=L""; ! GetLocalShortDomain(Domain); if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain)) GetUserProfileDirectory(pInfo->hToken, profileDir, &len); } --- 884,890 ---- */ if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, pInfo->Domain)) { WCHAR Domain[64]=L""; ! GetLocalShortDomain(Domain, sizeof(Domain)); if (QueryAdHomePathFromSid( profileDir, sizeof(profileDir), tokenUser->User.Sid, Domain)) GetUserProfileDirectory(pInfo->hToken, profileDir, &len); } Index: openafs/src/WINNT/afsd/afslogon.h diff -c openafs/src/WINNT/afsd/afslogon.h:1.4 openafs/src/WINNT/afsd/afslogon.h:1.5 *** openafs/src/WINNT/afsd/afslogon.h:1.4 Thu Jul 22 18:15:47 2004 --- openafs/src/WINNT/afsd/afslogon.h Wed Aug 4 15:30:03 2004 *************** *** 120,126 **** DWORD GetFileCellName(char * path, char * cell, size_t cellLen); DWORD GetAdHomePath(char * homePath, size_t homePathLen, PLUID lpLogonId, LogonOptions_t * opt); DWORD QueryAdHomePathFromSid(char * homePath, size_t homePathLen, PSID psid, PWSTR domain); ! BOOL GetLocalShortDomain(PWSTR Domain); #ifdef __cplusplus } --- 120,126 ---- DWORD GetFileCellName(char * path, char * cell, size_t cellLen); DWORD GetAdHomePath(char * homePath, size_t homePathLen, PLUID lpLogonId, LogonOptions_t * opt); DWORD QueryAdHomePathFromSid(char * homePath, size_t homePathLen, PSID psid, PWSTR domain); ! BOOL GetLocalShortDomain(PWSTR Domain, DWORD cbDomain); #ifdef __cplusplus } Index: openafs/src/WINNT/afsd/cm_buf.c diff -c openafs/src/WINNT/afsd/cm_buf.c:1.12 openafs/src/WINNT/afsd/cm_buf.c:1.13 *** openafs/src/WINNT/afsd/cm_buf.c:1.12 Sun May 30 10:39:05 2004 --- openafs/src/WINNT/afsd/cm_buf.c Thu Jul 29 10:34:21 2004 *************** *** 75,80 **** --- 75,81 ---- long buf_nOrigBuffers; long buf_bufferSize = CM_BUF_SIZE; long buf_hashSize = CM_BUF_HASHSIZE; + int buf_cacheType = CM_BUF_CACHETYPE_FILE; #ifndef DJGPP static *************** *** 295,300 **** --- 296,302 ---- sectorSize = 1; #ifndef DJGPP + if(buf_cacheType == CM_BUF_CACHETYPE_FILE) { /* Reserve buffer space by mapping cache file */ psa = CreateCacheFileSA(); hf = CreateFile(cm_CachePath, *************** *** 309,314 **** --- 311,319 ---- return CM_ERROR_INVAL; } FreeCacheFileSA(psa); + } else { /* buf_cacheType == CM_BUF_CACHETYPE_VIRTUAL */ + hf = INVALID_HANDLE_VALUE; + } CacheHandle = hf; hm = CreateFileMapping(hf, NULL, *************** *** 327,333 **** 0, 0, buf_nbuffers * buf_bufferSize); if (data == NULL) { ! CloseHandle(hf); CloseHandle(hm); return CM_ERROR_INVAL; } --- 332,338 ---- 0, 0, buf_nbuffers * buf_bufferSize); if (data == NULL) { ! if(hf != INVALID_HANDLE_VALUE) CloseHandle(hf); CloseHandle(hm); return CM_ERROR_INVAL; } *************** *** 404,409 **** --- 409,423 ---- afsi_log("%d buffers being added to the existing cache of size %d", nbuffers, buf_nbuffers); + if (buf_cacheType == CM_BUF_CACHETYPE_VIRTUAL) { + /* The size of a virtual cache cannot be changed after it has + * been created. Subsequent calls to MapViewofFile() with + * an existing mapping object name would not allow the + * object to be resized. Return failure immediately. + */ + return CM_ERROR_INVAL; + } + /* * Cache file mapping constrained by * system allocation granularity; Index: openafs/src/WINNT/afsd/cm_buf.h diff -c openafs/src/WINNT/afsd/cm_buf.h:1.3 openafs/src/WINNT/afsd/cm_buf.h:1.4 *** openafs/src/WINNT/afsd/cm_buf.h:1.3 Mon Apr 30 02:48:03 2001 --- openafs/src/WINNT/afsd/cm_buf.h Thu Jul 29 10:34:21 2004 *************** *** 32,37 **** --- 32,42 ---- #define CM_BUF_HASHSIZE 1024 extern long buf_hashSize; + /* cache type */ + #define CM_BUF_CACHETYPE_FILE 1 + #define CM_BUF_CACHETYPE_VIRTUAL 2 + extern int buf_cacheType; + /* force it to be signed so that mod comes out positive or 0 */ #define BUF_HASH(fidp,offsetp) ((((fidp)->vnode+((fidp)->unique << 5) \ +(fidp)->volume+(fidp)->cell \ Index: openafs/src/WINNT/afsd/cm_callback.c diff -c openafs/src/WINNT/afsd/cm_callback.c:1.15 openafs/src/WINNT/afsd/cm_callback.c:1.20 *** openafs/src/WINNT/afsd/cm_callback.c:1.15 Mon Jul 26 15:08:42 2004 --- openafs/src/WINNT/afsd/cm_callback.c Tue Aug 3 16:10:36 2004 *************** *** 73,78 **** --- 73,82 ---- cm_racingRevokes_t *rp; lock_ObtainWrite(&cm_callbackLock); + + osi_Log3(afsd_logp, "RecordRacingRevoke Volume %d Flags %lX activeCalls %d", + fidp->volume, cancelFlags, cm_activeCallbackGrantingCalls); + if (cm_activeCallbackGrantingCalls > 0) { rp = malloc(sizeof(*rp)); memset(rp, 0, sizeof(*rp)); *************** *** 89,94 **** --- 93,101 ---- */ void cm_CallbackNotifyChange(cm_scache_t *scp) { + osi_Log2(afsd_logp, "CallbackNotifyChange FileType %d Flags %lX", + scp->fileType, scp->flags); + if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { if (scp->flags & CM_SCACHEFLAG_ANYWATCH) smb_NotifyChange(0, *************** *** 134,140 **** tfid.unique = fidp->Unique; hash = CM_SCACHE_HASH(&tfid); ! osi_Log3(afsd_logp, "Revoke callback vol %d vn %d un %d", fidp->Volume, fidp->Vnode, fidp->Unique); /* do this first, so that if we're executing a callback granting call --- 141,147 ---- tfid.unique = fidp->Unique; hash = CM_SCACHE_HASH(&tfid); ! osi_Log3(afsd_logp, "RevokeCallback vol %d vn %d un %d", fidp->Volume, fidp->Vnode, fidp->Unique); /* do this first, so that if we're executing a callback granting call *************** *** 154,160 **** scp->fid.unique == tfid.unique) { scp->refCount++; lock_ReleaseWrite(&cm_scacheLock); ! osi_Log1(afsd_logp, "Revoke scp %x", scp); lock_ObtainMutex(&scp->mx); cm_DiscardSCache(scp); lock_ReleaseMutex(&scp->mx); --- 161,167 ---- scp->fid.unique == tfid.unique) { scp->refCount++; lock_ReleaseWrite(&cm_scacheLock); ! osi_Log1(afsd_logp, "Discarding SCache scp %x", scp); lock_ObtainMutex(&scp->mx); cm_DiscardSCache(scp); lock_ReleaseMutex(&scp->mx); *************** *** 177,182 **** --- 184,191 ---- cm_scache_t *scp; cm_fid_t tfid; + osi_Log1(afsd_logp, "RevokeVolumeCallback %d", fidp->Volume); + /* do this first, so that if we're executing a callback granting call * at this moment, we kill it before it can be merged in. Otherwise, * it could complete while we're doing the scan below, and get missed *************** *** 186,192 **** tfid.volume = fidp->Volume; cm_RecordRacingRevoke(&tfid, CM_RACINGFLAG_CANCELVOL); - osi_Log1(afsd_logp, "Revoke Volume %d", fidp->Volume); lock_ObtainWrite(&cm_scacheLock); for(hash = 0; hash < cm_hashTableSize; hash++) { --- 195,200 ---- *************** *** 195,200 **** --- 203,209 ---- scp->refCount++; lock_ReleaseWrite(&cm_scacheLock); lock_ObtainMutex(&scp->mx); + osi_Log1(afsd_logp, "Discarding SCache scp %x", scp); cm_DiscardSCache(scp); lock_ReleaseMutex(&scp->mx); cm_CallbackNotifyChange(scp); *************** *** 215,227 **** int i; AFSFid *tfidp; for(i=0; i < (long) fidsArrayp->AFSCBFids_len; i++) { tfidp = &fidsArrayp->AFSCBFids_val[i]; ! if (tfidp->Volume == 0) continue; /* means don't do anything */ else if (tfidp->Vnode == 0) cm_RevokeVolumeCallback(callp, tfidp); ! else cm_RevokeCallback(callp, tfidp); } return 0; --- 224,240 ---- int i; AFSFid *tfidp; + osi_Log0(afsd_logp, "SRXAFSCB_CallBack"); + for(i=0; i < (long) fidsArrayp->AFSCBFids_len; i++) { tfidp = &fidsArrayp->AFSCBFids_val[i]; ! if (tfidp->Volume == 0) ! continue; /* means don't do anything */ else if (tfidp->Vnode == 0) cm_RevokeVolumeCallback(callp, tfidp); ! else ! cm_RevokeCallback(callp, tfidp); } return 0; *************** *** 239,244 **** --- 252,259 ---- int hash; int discarded; + osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState"); + if ((rx_ConnectionOf(callp)) && (rx_PeerOf(rx_ConnectionOf(callp)))) { taddr.sin_family = AF_INET; taddr.sin_addr.s_addr = rx_HostOf(rx_PeerOf(rx_ConnectionOf(callp))); *************** *** 281,286 **** --- 296,302 ---- if (scp->cbServerp != NULL) { /* we have a callback, now decide if we should clear it */ if (scp->cbServerp == tsp || tsp == NULL) { + osi_Log1(afsd_logp, "Discarding SCache scp %x", scp); cm_DiscardSCache(scp); discarded = 1; } *************** *** 305,310 **** --- 321,327 ---- /* just returns if we're up */ SRXAFSCB_Probe(struct rx_call *callp) { + osi_Log0(afsd_logp, "SRXAFSCB_Probe - not implemented"); return 0; } *************** *** 312,317 **** --- 329,335 ---- SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry *cep) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_GetCE64 - not implemented"); return RXGEN_OPCODE; } *************** *** 319,324 **** --- 337,343 ---- SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_GetLock - not implemented"); return RXGEN_OPCODE; } *************** *** 326,331 **** --- 345,351 ---- SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_GetCE - not implemented"); return RXGEN_OPCODE; } *************** *** 333,338 **** --- 353,359 ---- SRXAFSCB_XStatsVersion(struct rx_call *callp, long *vp) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_XStatsVersion - not implemented"); *vp = -1; return RXGEN_OPCODE; } *************** *** 342,347 **** --- 363,369 ---- AFSCB_CollData *datap) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_GetXStats - not implemented"); return RXGEN_OPCODE; } *************** *** 349,354 **** --- 371,377 ---- SRXAFSCB_InitCallBackState2(struct rx_call *callp, struct interfaceAddr* addr) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState2 - not implemented"); return RXGEN_OPCODE; } *************** *** 356,361 **** --- 379,385 ---- SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_WhoAreYou - not implemented"); return RXGEN_OPCODE; } *************** *** 363,368 **** --- 387,393 ---- SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState3 - not implemented"); return RXGEN_OPCODE; } *************** *** 370,375 **** --- 395,401 ---- SRXAFSCB_ProbeUuid(struct rx_call *callp, afsUUID* clientUuid) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_ProbeUuid - not implemented"); return RXGEN_OPCODE; } *************** *** 401,406 **** --- 427,434 ---- afs_int32 *a_srvr_addr, afs_int32 *a_srvr_rank) { + osi_Log0(afsd_logp, "SRXAFSCB_GetServerPrefs - not implemented"); + *a_srvr_addr = 0xffffffff; *a_srvr_rank = 0xffffffff; return 0; *************** *** 436,441 **** --- 464,471 ---- { char *t_name; + osi_Log0(afsd_logp, "SRXAFSCB_GetCellServDB - not implemented"); + t_name = (char *)malloc(AFSNAMEMAX); t_name[0] = '\0'; *a_name = t_name; *************** *** 469,474 **** --- 499,506 ---- { char *t_name; + osi_Log0(afsd_logp, "SRXAFSCB_GetLocalCell"); + if (cm_rootCellp) { t_name = (char *)malloc(strlen(cm_rootCellp->namep)+1); strcpy(t_name, cm_rootCellp->namep); *************** *** 554,559 **** --- 586,593 ---- size_t allocsize; extern cm_initparams_v1 cm_initParams; + osi_Log0(afsd_logp, "SRXAFSCB_GetCacheConfig - version 1 only"); + /* * Currently only support version 1 */ *************** *** 616,622 **** --- 650,658 ---- } else if (fdc==2 && !fgc) { // we're in good shape if (cm_getLocalMountPointChange()) { // check for changes cm_clearLocalMountPointChange(); // clear the changefile + lock_ReleaseMutex(&scp->mx); // this is re-locked in reInitLocalMountPoints cm_reInitLocalMountPoints(); // start reinit + lock_ObtainMutex(&scp->mx); // now get the lock back return 0; } return 1; // no change *************** *** 703,710 **** */ if (scp && cbrp->callbackCount != cm_callbackCount && revp->callbackCount > cbrp->callbackCount ! && ( ! (scp->fid.volume == revp->fid.volume && scp->fid.vnode == revp->fid.vnode && scp->fid.unique == revp->fid.unique) || --- 739,745 ---- */ if (scp && cbrp->callbackCount != cm_callbackCount && revp->callbackCount > cbrp->callbackCount ! && (( scp->fid.volume == revp->fid.volume && scp->fid.vnode == revp->fid.vnode && scp->fid.unique == revp->fid.unique) || *************** *** 753,793 **** long sflags; cm_fid_t sfid; #ifdef AFS_FREELANCE_CLIENT - // yj // The case where a callback is needed on /afs is handled // specially. We need to fetch the status by calling // cm_MergeStatus and mark that cm_fakeDirCallback is 2 ! if (cm_freelanceEnabled && ! scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && ! scp->fid.volume==AFS_FAKE_ROOT_VOL_ID && ! scp->fid.unique==0x1 && ! scp->fid.vnode==0x1) { ! // Start by indicating that we're in the process ! // of fetching the callback ! ! lock_ObtainMutex(&cm_Freelance_Lock); ! cm_fakeGettingCallback = 1; ! lock_ReleaseMutex(&cm_Freelance_Lock); ! ! // Fetch the status info ! cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0); ! ! // Indicate that the callback is not done ! lock_ObtainMutex(&cm_Freelance_Lock); ! cm_fakeDirCallback = 2; ! // Indicate that we're no longer fetching the callback ! cm_fakeGettingCallback = 0; ! lock_ReleaseMutex(&cm_Freelance_Lock); ! return 0; ! } ! if (scp->fid.cell==0x1 && scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) { ! osi_Log0(afsd_logp,"cm_getcallback should NEVER EVER get here... "); ! } ! // yj: end of getcallback modifications --------------- ! #endif /* AFS_FREELANCE_CLIENT */ mustCall = (flags & 1); --- 788,828 ---- long sflags; cm_fid_t sfid; + osi_Log2(afsd_logp, "GetCallback scp %x flags %lX", scp, flags); + #ifdef AFS_FREELANCE_CLIENT // The case where a callback is needed on /afs is handled // specially. We need to fetch the status by calling // cm_MergeStatus and mark that cm_fakeDirCallback is 2 ! if (cm_freelanceEnabled) { ! if (scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && ! scp->fid.volume==AFS_FAKE_ROOT_VOL_ID && ! scp->fid.unique==0x1 && ! scp->fid.vnode==0x1) { ! // Start by indicating that we're in the process ! // of fetching the callback ! ! lock_ObtainMutex(&cm_Freelance_Lock); ! cm_fakeGettingCallback = 1; ! lock_ReleaseMutex(&cm_Freelance_Lock); ! // Fetch the status info ! cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0); ! // Indicate that the callback is not done ! lock_ObtainMutex(&cm_Freelance_Lock); ! cm_fakeDirCallback = 2; ! // Indicate that we're no longer fetching the callback ! cm_fakeGettingCallback = 0; ! lock_ReleaseMutex(&cm_Freelance_Lock); ! ! return 0; ! } ! ! if (scp->fid.cell==AFS_FAKE_ROOT_CELL_ID && scp->fid.volume==AFS_FAKE_ROOT_VOL_ID) { ! osi_Log0(afsd_logp,"cm_getcallback should NEVER EVER get here... "); ! } ! } #endif /* AFS_FREELANCE_CLIENT */ mustCall = (flags & 1); *************** *** 814,820 **** code = RXAFS_FetchStatus(connp->callp, &tfid, &afsStatus, &callback, &volSync); ! } while (cm_Analyze(connp, userp, reqp, &sfid, &volSync, &cbr, code)); code = cm_MapRPCError(code, reqp); osi_Log0(afsd_logp, "CALL FetchStatus DONE"); --- 849,855 ---- code = RXAFS_FetchStatus(connp->callp, &tfid, &afsStatus, &callback, &volSync); ! } while (cm_Analyze(connp, userp, reqp, &sfid, &volSync, NULL, &cbr, code)); code = cm_MapRPCError(code, reqp); osi_Log0(afsd_logp, "CALL FetchStatus DONE"); *************** *** 840,845 **** --- 875,882 ---- cm_scache_t *scp; long now; + osi_Log0(afsd_logp, "CheckCBExpiration"); + now = osi_Time(); lock_ObtainWrite(&cm_scacheLock); for(i=0; imx); if (scp->cbServerp && now > scp->cbExpires) { + osi_Log1(afsd_logp, "Discarding SCache scp %x", scp); cm_DiscardSCache(scp); } lock_ReleaseMutex(&scp->mx); *************** *** 863,868 **** --- 901,907 ---- char **a_name, serverList *a_hosts) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_GetCellByNum - not implemented"); return RXGEN_OPCODE; } *************** *** 871,875 **** --- 910,915 ---- char **a_name, serverList *a_hosts) { /* XXXX */ + osi_Log0(afsd_logp, "SRXAFSCB_TellMeAboutYourself - not implemented"); return RXGEN_OPCODE; } Index: openafs/src/WINNT/afsd/cm_cell.c diff -c openafs/src/WINNT/afsd/cm_cell.c:1.12 openafs/src/WINNT/afsd/cm_cell.c:1.14 *** openafs/src/WINNT/afsd/cm_cell.c:1.12 Mon Jul 19 18:40:12 2004 --- openafs/src/WINNT/afsd/cm_cell.c Wed Aug 4 11:52:56 2004 *************** *** 45,56 **** tsp->cellp = cellp; } else ! tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp); /* Insert the vlserver into a sorted list, sorted by server rank */ tsrp = cm_NewServerRef(tsp); cm_InsertServerList(&cellp->vlServersp, tsrp); ! return 0; } --- 45,59 ---- tsp->cellp = cellp; } else ! tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp); /* Insert the vlserver into a sorted list, sorted by server rank */ tsrp = cm_NewServerRef(tsp); cm_InsertServerList(&cellp->vlServersp, tsrp); ! /* drop the allocation reference */ ! lock_ObtainWrite(&cm_serverLock); ! tsrp->refCount--; ! lock_ReleaseWrite(&cm_serverLock); return 0; } *************** *** 94,101 **** --- 97,106 ---- else { dns_expired = 1; /* must empty cp->vlServersp */ + lock_ObtainWrite(&cp->mx); cm_FreeServerList(&cp->vlServersp); cp->vlServersp = NULL; + lock_ReleaseWrite(&cp->mx); } code = cm_SearchCellFile(namep, fullname, cm_AddCellProc, cp); Index: openafs/src/WINNT/afsd/cm_cell.h diff -c openafs/src/WINNT/afsd/cm_cell.h:1.5 openafs/src/WINNT/afsd/cm_cell.h:1.6 *** openafs/src/WINNT/afsd/cm_cell.h:1.5 Sat Jun 5 02:02:39 2004 --- openafs/src/WINNT/afsd/cm_cell.h Sat Jul 31 20:16:37 2004 *************** *** 17,23 **** long cellID; /* cell ID */ struct cm_cell *nextp; /* locked by cm_cellLock */ char *namep; /* cell name; never changes */ ! struct cm_serverRef *vlServersp; /* locked by cm_serverLock */ osi_mutex_t mx; /* mutex locking fields (flags) */ long flags; /* locked by mx */ long timeout; /* if dns, time at which the server addrs expire */ --- 17,23 ---- long cellID; /* cell ID */ struct cm_cell *nextp; /* locked by cm_cellLock */ char *namep; /* cell name; never changes */ ! cm_serverRef_t *vlServersp; /* locked by cm_serverLock */ osi_mutex_t mx; /* mutex locking fields (flags) */ long flags; /* locked by mx */ long timeout; /* if dns, time at which the server addrs expire */ Index: openafs/src/WINNT/afsd/cm_config.h diff -c openafs/src/WINNT/afsd/cm_config.h:1.5 openafs/src/WINNT/afsd/cm_config.h:1.6 *** openafs/src/WINNT/afsd/cm_config.h:1.5 Wed Jul 21 10:06:11 2004 --- openafs/src/WINNT/afsd/cm_config.h Tue Aug 3 13:27:52 2004 *************** *** 13,21 **** #define CM_CONFIGDEFAULT_CACHESIZE 20480 #define CM_CONFIGDEFAULT_BLOCKSIZE 4096 #define CM_CONFIGDEFAULT_STATS 1000 ! #define CM_CONFIGDEFAULT_CHUNKSIZE 15 #define CM_CONFIGDEFAULT_DAEMONS 2 ! #define CM_CONFIGDEFAULT_SVTHREADS 4 #define CM_CONFIGDEFAULT_TRACEBUFSIZE 5000 #ifndef __CM_CONFIG_INTERFACES_ONLY__ --- 13,21 ---- #define CM_CONFIGDEFAULT_CACHESIZE 20480 #define CM_CONFIGDEFAULT_BLOCKSIZE 4096 #define CM_CONFIGDEFAULT_STATS 1000 ! #define CM_CONFIGDEFAULT_CHUNKSIZE 17 #define CM_CONFIGDEFAULT_DAEMONS 2 ! #define CM_CONFIGDEFAULT_SVTHREADS 25 #define CM_CONFIGDEFAULT_TRACEBUFSIZE 5000 #ifndef __CM_CONFIG_INTERFACES_ONLY__ Index: openafs/src/WINNT/afsd/cm_conn.c diff -c openafs/src/WINNT/afsd/cm_conn.c:1.20 openafs/src/WINNT/afsd/cm_conn.c:1.25 *** openafs/src/WINNT/afsd/cm_conn.c:1.20 Sun Jul 25 22:48:47 2004 --- openafs/src/WINNT/afsd/cm_conn.c Wed Aug 4 11:52:56 2004 *************** *** 97,132 **** } ! long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp, ! struct cm_req *reqp, cm_serverRef_t **serverspp) { long code; ! cm_volume_t *volp = NULL; ! cm_serverRef_t *serversp = NULL; ! cm_cell_t *cellp = NULL; ! if (!fidp) { ! *serverspp = NULL; return 0; } cellp = cm_FindCellByID(fidp->cell); ! if (!cellp) return CM_ERROR_NOSUCHCELL; ! code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp); ! if (code) return code; ! ! if (fidp->volume == volp->rwID) ! serversp = volp->rwServersp; ! else if (fidp->volume == volp->roID) ! serversp = volp->roServersp; ! else if (fidp->volume == volp->bkID) ! serversp = volp->bkServersp; ! else ! serversp = NULL; ! cm_PutVolume(volp); ! *serverspp = serversp; return 0; } --- 97,123 ---- } ! static long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp, ! struct cm_req *reqp, cm_serverRef_t ***serversppp) { long code; ! cm_volume_t *volp = NULL; ! cm_cell_t *cellp = NULL; ! if (!fidp) { ! *serversppp = NULL; return 0; } cellp = cm_FindCellByID(fidp->cell); ! if (!cellp) return CM_ERROR_NOSUCHCELL; ! code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp); ! if (code) return code; ! ! *serversppp = cm_GetVolServers(volp, fidp->volume); ! cm_PutVolume(volp); return 0; } *************** *** 148,161 **** */ int cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, ! struct cm_fid *fidp, ! AFSVolSync *volSyncp, cm_callbackRequest_t *cbrp, long errorCode) { cm_server_t *serverp; ! cm_serverRef_t *serversp, *tsrp; cm_ucell_t *ucellp; ! int retry = 0; int dead_session; osi_Log2(afsd_logp, "cm_Analyze connp 0x%x, code %d", (long) connp, errorCode); --- 139,157 ---- */ int cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, ! struct cm_fid *fidp, ! AFSVolSync *volSyncp, ! cm_serverRef_t * serversp, ! cm_callbackRequest_t *cbrp, long errorCode) { cm_server_t *serverp; ! cm_serverRef_t **serverspp = 0; ! cm_serverRef_t *tsrp; cm_ucell_t *ucellp; ! int retry = 0; ! int free_svr_list = 0; int dead_session; + long timeUsed, timeLeft; osi_Log2(afsd_logp, "cm_Analyze connp 0x%x, code %d", (long) connp, errorCode); *************** *** 167,183 **** serverp = connp->serverp; /* Update callback pointer */ ! if (cbrp && errorCode == 0) cbrp->serverp = connp->serverp; /* If not allowed to retry, don't */ if (reqp->flags & CM_REQ_NORETRY) goto out; /* if timeout - check that it did not exceed the SMB timeout ! and retry */ ! if (errorCode == CM_ERROR_TIMEDOUT) ! { ! long timeUsed, timeLeft; /* timeleft - get if from reqp the same way as cmXonnByMServers does */ #ifndef DJGPP timeUsed = (GetCurrentTime() - reqp->startTime) / 1000; --- 163,178 ---- serverp = connp->serverp; /* Update callback pointer */ ! if (cbrp && errorCode == 0) ! cbrp->serverp = connp->serverp; /* If not allowed to retry, don't */ if (reqp->flags & CM_REQ_NORETRY) goto out; /* if timeout - check that it did not exceed the SMB timeout ! * and retry */ ! /* timeleft - get if from reqp the same way as cmXonnByMServers does */ #ifndef DJGPP timeUsed = (GetCurrentTime() - reqp->startTime) / 1000; *************** *** 188,203 **** /* leave 5 seconds margin for sleep */ timeLeft = RDRtimeout - timeUsed; ! if (timeLeft > 5) ! { thrd_Sleep(3000); cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); retry = 1; } - } /* if all servers are offline, mark them non-busy and start over */ ! if (errorCode == CM_ERROR_ALLOFFLINE) { osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLOFFLINE."); thrd_Sleep(5000); /* cm_ForceUpdateVolume marks all servers as non_busy */ --- 183,197 ---- /* leave 5 seconds margin for sleep */ timeLeft = RDRtimeout - timeUsed; ! ! if (errorCode == CM_ERROR_TIMEDOUT && timeLeft > 5 ) { thrd_Sleep(3000); cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); retry = 1; } /* if all servers are offline, mark them non-busy and start over */ ! if (errorCode == CM_ERROR_ALLOFFLINE && timeLeft > 7) { osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLOFFLINE."); thrd_Sleep(5000); /* cm_ForceUpdateVolume marks all servers as non_busy */ *************** *** 205,211 **** * the servers are marked as DOWN. So clear the DOWN * flag and reset the busy state as well. */ ! cm_GetServerList(fidp, userp, reqp, &serversp); if (serversp) { lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { --- 199,209 ---- * the servers are marked as DOWN. So clear the DOWN * flag and reset the busy state as well. */ ! if (!serversp) { ! cm_GetServerList(fidp, userp, reqp, &serverspp); ! serversp = *serverspp; ! free_svr_list = 1; ! } if (serversp) { lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { *************** *** 214,220 **** tsrp->status = not_busy; } lock_ReleaseWrite(&cm_serverLock); ! retry = 1; } --- 212,221 ---- tsrp->status = not_busy; } lock_ReleaseWrite(&cm_serverLock); ! if (free_svr_list) { ! cm_FreeServerList(&serversp); ! *serverspp = serversp; ! } retry = 1; } *************** *** 223,243 **** } /* if all servers are busy, mark them non-busy and start over */ ! if (errorCode == CM_ERROR_ALLBUSY) { ! cm_GetServerList(fidp, userp, reqp, &serversp); lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->status == busy) tsrp->status = not_busy; } lock_ReleaseWrite(&cm_serverLock); ! thrd_Sleep(5000); retry = 1; } /* special codes: VBUSY and VRESTARTING */ if (errorCode == VBUSY || errorCode == VRESTARTING) { ! cm_GetServerList(fidp, userp, reqp, &serversp); lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp --- 224,256 ---- } /* if all servers are busy, mark them non-busy and start over */ ! if (errorCode == CM_ERROR_ALLBUSY && timeLeft > 7) { ! thrd_Sleep(5000); ! if (!serversp) { ! cm_GetServerList(fidp, userp, reqp, &serverspp); ! serversp = *serverspp; ! free_svr_list = 1; ! } lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->status == busy) tsrp->status = not_busy; } lock_ReleaseWrite(&cm_serverLock); ! if (free_svr_list) { ! cm_FreeServerList(&serversp); ! *serverspp = serversp; ! } retry = 1; } /* special codes: VBUSY and VRESTARTING */ if (errorCode == VBUSY || errorCode == VRESTARTING) { ! if (!serversp) { ! cm_GetServerList(fidp, userp, reqp, &serverspp); ! serversp = *serverspp; ! free_svr_list = 1; ! } lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp *************** *** 247,252 **** --- 260,269 ---- } } lock_ReleaseWrite(&cm_serverLock); + if (free_svr_list) { + cm_FreeServerList(&serversp); + *serverspp = serversp; + } retry = 1; } *************** *** 278,289 **** } /* Mark server offline for this volume */ ! cm_GetServerList(fidp, userp, reqp, &serversp); ! for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp) tsrp->status = offline; } retry = 1; } --- 295,314 ---- } /* Mark server offline for this volume */ ! if (!serversp) { ! cm_GetServerList(fidp, userp, reqp, &serverspp); ! serversp = *serverspp; ! free_svr_list = 1; ! } for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp) tsrp->status = offline; } + if (free_svr_list) { + cm_FreeServerList(&serversp); + *serverspp = serversp; + } + if ( timeLeft > 2 ) retry = 1; } *************** *** 312,321 **** else if (errorCode >= -64 && errorCode < 0) { /* mark server as down */ lock_ObtainMutex(&serverp->mx); ! serverp->flags |= CM_SERVERFLAG_DOWN; lock_ReleaseMutex(&serverp->mx); ! retry = 1; ! } if (errorCode == RXKADEXPIRED && !dead_session) { lock_ObtainMutex(&userp->mx); --- 337,347 ---- else if (errorCode >= -64 && errorCode < 0) { /* mark server as down */ lock_ObtainMutex(&serverp->mx); ! serverp->flags |= CM_SERVERFLAG_DOWN; lock_ReleaseMutex(&serverp->mx); ! if ( timeLeft > 2 ) ! retry = 1; ! } if (errorCode == RXKADEXPIRED && !dead_session) { lock_ObtainMutex(&userp->mx); *************** *** 327,332 **** --- 353,359 ---- ucellp->flags &= ~CM_UCELLFLAG_RXKAD; ucellp->gen++; lock_ReleaseMutex(&userp->mx); + if ( timeLeft > 2 ) retry = 1; } *************** *** 347,367 **** { long code; cm_serverRef_t *tsrp; ! cm_server_t *tsp; ! long firstError = 0; int someBusy = 0, someOffline = 0, allBusy = 1, allDown = 1; long timeUsed, timeLeft, hardTimeLeft; #ifdef DJGPP ! struct timeval now; #endif /* DJGPP */ ! *connpp = NULL; #ifndef DJGPP timeUsed = (GetCurrentTime() - reqp->startTime) / 1000; #else ! gettimeofday(&now, NULL); ! timeUsed = sub_time(now, reqp->startTime) / 1000; #endif /* leave 5 seconds margin of safety */ --- 374,394 ---- { long code; cm_serverRef_t *tsrp; ! cm_server_t *tsp; ! long firstError = 0; int someBusy = 0, someOffline = 0, allBusy = 1, allDown = 1; long timeUsed, timeLeft, hardTimeLeft; #ifdef DJGPP ! struct timeval now; #endif /* DJGPP */ ! *connpp = NULL; #ifndef DJGPP timeUsed = (GetCurrentTime() - reqp->startTime) / 1000; #else ! gettimeofday(&now, NULL); ! timeUsed = sub_time(now, reqp->startTime) / 1000; #endif /* leave 5 seconds margin of safety */ *************** *** 369,376 **** hardTimeLeft = HardDeadtimeout - timeUsed - 5; lock_ObtainWrite(&cm_serverLock); ! ! for(tsrp = serversp; tsrp; tsrp=tsrp->next) { tsp = tsrp->server; tsp->refCount++; lock_ReleaseWrite(&cm_serverLock); --- 396,402 ---- hardTimeLeft = HardDeadtimeout - timeUsed - 5; lock_ObtainWrite(&cm_serverLock); ! for (tsrp = serversp; tsrp; tsrp=tsrp->next) { tsp = tsrp->server; tsp->refCount++; lock_ReleaseWrite(&cm_serverLock); *************** *** 393,402 **** hardTimeLeft = HardDeadtimeout; lock_ObtainMutex(&(*connpp)->mx); ! rx_SetConnDeadTime((*connpp)->callp, ! timeLeft); ! rx_SetConnHardDeadTime((*connpp)->callp, ! (u_short) hardTimeLeft); lock_ReleaseMutex(&(*connpp)->mx); return 0; --- 419,426 ---- hardTimeLeft = HardDeadtimeout; lock_ObtainMutex(&(*connpp)->mx); ! rx_SetConnDeadTime((*connpp)->callp, timeLeft); ! rx_SetConnHardDeadTime((*connpp)->callp, (u_short) hardTimeLeft); lock_ReleaseMutex(&(*connpp)->mx); return 0; *************** *** 420,425 **** --- 444,450 ---- else firstError = CM_ERROR_TIMEDOUT; } + osi_Log1(afsd_logp, "cm_ConnByMServers returning %x", firstError); return firstError; } *************** *** 547,560 **** { long code; ! cm_serverRef_t *serversp; ! code = cm_GetServerList(fidp, userp, reqp, &serversp); if (code) { *connpp = NULL; return code; } ! code = cm_ConnByMServers(serversp, userp, reqp, connpp); ! return code; } --- 572,586 ---- { long code; ! cm_serverRef_t **serverspp; ! code = cm_GetServerList(fidp, userp, reqp, &serverspp); if (code) { *connpp = NULL; return code; } ! code = cm_ConnByMServers(*serverspp, userp, reqp, connpp); ! cm_FreeServerList(serverspp); ! return code; } Index: openafs/src/WINNT/afsd/cm_conn.h diff -c openafs/src/WINNT/afsd/cm_conn.h:1.6 openafs/src/WINNT/afsd/cm_conn.h:1.8 *** openafs/src/WINNT/afsd/cm_conn.h:1.6 Sat Jun 5 14:57:58 2004 --- openafs/src/WINNT/afsd/cm_conn.h Sat Jul 31 20:16:37 2004 *************** *** 91,96 **** --- 91,97 ---- extern int cm_Analyze(cm_conn_t *connp, struct cm_user *up, struct cm_req *reqp, struct cm_fid *fidp, struct AFSVolSync *volInfop, + cm_serverRef_t * serversp, struct cm_callbackRequest *cbrp, long code); extern long cm_ConnByMServers(struct cm_serverRef *, struct cm_user *, Index: openafs/src/WINNT/afsd/cm_dcache.c diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.9 openafs/src/WINNT/afsd/cm_dcache.c:1.11 *** openafs/src/WINNT/afsd/cm_dcache.c:1.9 Sun Jul 25 16:53:12 2004 --- openafs/src/WINNT/afsd/cm_dcache.c Sat Aug 7 01:44:05 2004 *************** *** 173,179 **** code = rx_EndCall(callp, code); osi_Log0(afsd_logp, "CALL StoreData DONE"); ! } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, code)); code = cm_MapRPCError(code, reqp); /* now, clean up our state */ --- 173,179 ---- code = rx_EndCall(callp, code); osi_Log0(afsd_logp, "CALL StoreData DONE"); ! } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); /* now, clean up our state */ *************** *** 266,272 **** if (code == 0) code = EndRXAFS_StoreData(callp, &outStatus, &volSync); code = rx_EndCall(callp, code); ! } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, code)); code = cm_MapRPCError(code, reqp); /* now, clean up our state */ --- 266,272 ---- if (code == 0) code = EndRXAFS_StoreData(callp, &outStatus, &volSync); code = rx_EndCall(callp, code); ! } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); /* now, clean up our state */ *************** *** 1186,1193 **** afsStatus.ParentVnode = 0x1; afsStatus.ParentUnique = 0x1; afsStatus.ResidencyMask = 0; ! afsStatus.ClientModTime = 0x3b49f6e2; ! afsStatus.ServerModTime = 0x3b49f6e2; afsStatus.Group = 0; afsStatus.SyncCounter = 0; afsStatus.dataVersionHigh = 0; --- 1186,1193 ---- afsStatus.ParentVnode = 0x1; afsStatus.ParentUnique = 0x1; afsStatus.ResidencyMask = 0; ! afsStatus.ClientModTime = FakeFreelanceModTime; ! afsStatus.ServerModTime = FakeFreelanceModTime; afsStatus.Group = 0; afsStatus.SyncCounter = 0; afsStatus.dataVersionHigh = 0; *************** *** 1345,1351 **** osi_Log0(afsd_logp, "CALL EndCall returns RXKADUNKNOWNKEY"); osi_Log0(afsd_logp, "CALL FetchData DONE"); ! } while (cm_Analyze(connp, up, reqp, &scp->fid, &volSync, NULL, code)); fetchingcompleted: code = cm_MapRPCError(code, reqp); --- 1345,1351 ---- osi_Log0(afsd_logp, "CALL EndCall returns RXKADUNKNOWNKEY"); osi_Log0(afsd_logp, "CALL FetchData DONE"); ! } while (cm_Analyze(connp, up, reqp, &scp->fid, &volSync, NULL, NULL, code)); fetchingcompleted: code = cm_MapRPCError(code, reqp); Index: openafs/src/WINNT/afsd/cm_freelance.c diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.14 openafs/src/WINNT/afsd/cm_freelance.c:1.15 *** openafs/src/WINNT/afsd/cm_freelance.c:1.14 Tue Jul 27 17:34:46 2004 --- openafs/src/WINNT/afsd/cm_freelance.c Sat Aug 7 01:44:05 2004 *************** *** 30,41 **** osi_mutex_t cm_Freelance_Lock; int cm_localMountPointChangeFlag = 0; int cm_freelanceEnabled = 0; void cm_InitFakeRootDir(); void cm_InitFreelance() { lock_InitializeMutex(&cm_Freelance_Lock, "Freelance Lock"); ! // yj: first we make a call to cm_initLocalMountPoints // to read all the local mount points from an ini file cm_InitLocalMountPoints(); --- 30,88 ---- osi_mutex_t cm_Freelance_Lock; int cm_localMountPointChangeFlag = 0; int cm_freelanceEnabled = 0; + afs_uint32 FakeFreelanceModTime = 0x3b49f6e2; void cm_InitFakeRootDir(); + #if !defined(DJGPP) + void cm_FreelanceChangeNotifier(void * parmp) { + HANDLE hFreelanceChangeEvent = 0; + HKEY hkFreelance = 0; + + if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, + "SOFTWARE\\OpenAFS\\Client\\Freelance", + 0, + KEY_NOTIFY, + &hkFreelance) == ERROR_SUCCESS) { + + hFreelanceChangeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (hFreelanceChangeEvent == NULL) { + RegCloseKey(hkFreelance); + return; + } + } + + while ( TRUE ) { + /* check hFreelanceChangeEvent to see if it is set. + * if so, call cm_noteLocalMountPointChange() + */ + if (RegNotifyChangeKeyValue( hkFreelance, /* hKey */ + FALSE, /* bWatchSubtree */ + REG_NOTIFY_CHANGE_LAST_SET, /* dwNotifyFilter */ + hFreelanceChangeEvent, /* hEvent */ + TRUE /* fAsynchronous */ + ) != ERROR_SUCCESS) { + RegCloseKey(hkFreelance); + CloseHandle(hFreelanceChangeEvent); + return; + } + + if (WaitForSingleObject(hFreelanceChangeEvent, INFINITE) == WAIT_OBJECT_0) + { + cm_noteLocalMountPointChange(); + } + } + } + #endif + void cm_InitFreelance() { + #if !defined(DJGPP) + thread_t phandle; + int lpid; + #endif + lock_InitializeMutex(&cm_Freelance_Lock, "Freelance Lock"); ! // yj: first we make a call to cm_initLocalMountPoints // to read all the local mount points from an ini file cm_InitLocalMountPoints(); *************** *** 43,50 **** // then we make a call to InitFakeRootDir to create // a fake root directory based on the local mount points cm_InitFakeRootDir(); - // --- end of yj code } /* yj: Initialization of the fake root directory */ --- 90,104 ---- // then we make a call to InitFakeRootDir to create // a fake root directory based on the local mount points cm_InitFakeRootDir(); // --- end of yj code + + #if !defined(DJGPP) + /* Start the registry monitor */ + phandle = thrd_Create(NULL, 65536, (ThreadFunc) cm_FreelanceChangeNotifier, + NULL, 0, &lpid, "cm_FreelanceChangeNotifier"); + osi_assert(phandle != NULL); + thrd_CloseHandle(phandle); + #endif } /* yj: Initialization of the fake root directory */ *************** *** 232,261 **** return 0; } ! int cm_getLocalMountPointChange() { ! return cm_localMountPointChangeFlag; } ! int cm_clearLocalMountPointChange() { ! cm_localMountPointChangeFlag = 0; ! return 0; } ! /* called directly from ioctl */ ! /* called while not holding freelance lock */ ! int cm_noteLocalMountPointChange() { ! lock_ObtainMutex(&cm_Freelance_Lock); ! cm_fakeDirVersion++; ! cm_localMountPointChangeFlag = 1; ! lock_ReleaseMutex(&cm_Freelance_Lock); ! return 1; } int cm_reInitLocalMountPoints() { cm_fid_t aFid; int i, hash; cm_scache_t *scp, **lscpp, *tscp; - osi_Log0(afsd_logp,"----- freelance reinitialization starts ----- "); --- 286,314 ---- return 0; } ! /* called directly from ioctl */ ! /* called while not holding freelance lock */ ! int cm_noteLocalMountPointChange() { ! lock_ObtainMutex(&cm_Freelance_Lock); ! cm_fakeDirVersion++; ! cm_localMountPointChangeFlag = 1; ! lock_ReleaseMutex(&cm_Freelance_Lock); ! return 1; } ! int cm_getLocalMountPointChange() { ! return cm_localMountPointChangeFlag; } ! int cm_clearLocalMountPointChange() { ! cm_localMountPointChangeFlag = 0; ! return 0; } int cm_reInitLocalMountPoints() { cm_fid_t aFid; int i, hash; cm_scache_t *scp, **lscpp, *tscp; osi_Log0(afsd_logp,"----- freelance reinitialization starts ----- "); *************** *** 339,346 **** /* to be called while holding freelance lock unless during init. */ long cm_InitLocalMountPoints() { FILE *fp; char line[512]; - int i; char* t; cm_localMountPoint_t* aLocalMountPoint; char hdir[120]; --- 392,399 ---- /* to be called while holding freelance lock unless during init. */ long cm_InitLocalMountPoints() { FILE *fp; + int i; char line[512]; char* t; cm_localMountPoint_t* aLocalMountPoint; char hdir[120]; *************** *** 351,356 **** --- 404,411 ---- DWORD dwType, dwSize; DWORD dwMountPoints; DWORD dwIndex; + FILETIME ftLastWriteTime; + afs_uint32 unixTime; #endif #if !defined(DJGPP) *************** *** 371,379 **** NULL, /* lpcMaxValueNameLen */ NULL, /* lpcMaxValueLen */ NULL, /* lpcbSecurityDescriptor */ ! NULL /* lpftLastWriteTime */ ); if ( dwMountPoints == 0 ) { sprintf(line,"%s#%s:root.cell.\n",rootCellName,rootCellName); dwType = REG_SZ; --- 426,436 ---- NULL, /* lpcMaxValueNameLen */ NULL, /* lpcMaxValueLen */ NULL, /* lpcbSecurityDescriptor */ ! &ftLastWriteTime /* lpftLastWriteTime */ ); + smb_UnixTimeFromLargeSearchTime(&FakeFreelanceModTime, &ftLastWriteTime); + if ( dwMountPoints == 0 ) { sprintf(line,"%s#%s:root.cell.\n",rootCellName,rootCellName); dwType = REG_SZ; *************** *** 413,421 **** t = strchr(line, '%'); // make sure that there is a '#' or '%' separator in the line if (!t) { ! afsi_log("error occurred while parsing entry in %s: no # or %% separator in line %d", AFS_FREELANCE_INI, i); ! fprintf(stderr, "error occurred while parsing entry in afs_freelance.ini: no # or %% separator in line %d", i); ! return -1; } aLocalMountPoint->namep=malloc(t-line+1); memcpy(aLocalMountPoint->namep, line, t-line); --- 470,479 ---- t = strchr(line, '%'); // make sure that there is a '#' or '%' separator in the line if (!t) { ! afsi_log("error occurred while parsing entry in %s: no # or %% separator in line %d", AFS_FREELANCE_INI, dwIndex); ! fprintf(stderr, "error occurred while parsing entry in afs_freelance.ini: no # or %% separator in line %d", dwIndex); ! cm_noLocalMountPoints--; ! continue; } aLocalMountPoint->namep=malloc(t-line+1); memcpy(aLocalMountPoint->namep, line, t-line); *************** *** 437,442 **** --- 495,503 ---- } #endif + /* What follows is the old code to read freelance mount points + * out of a text file modified to copy the data into the registry + */ cm_GetConfigDir(hdir); strcat(hdir, AFS_FREELANCE_INI); // open the ini file for reading *************** *** 462,468 **** // we successfully opened the file osi_Log0(afsd_logp,"opened afs_freelance.ini"); - #if !defined(DJGPP) RegCreateKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\OpenAFS\\Client\\Freelance", --- 523,528 ---- *************** *** 584,593 **** don't add the mount point. allow partial matches as a means of poor man's alias. */ /* major performance issue? */ ! osi_Log3(afsd_logp,"Freelance Add Mount request: filename=%s cellname=%s volume=%s %s", osi_LogSaveString(afsd_logp,filename), osi_LogSaveString(afsd_logp,cellname), ! osi_LogSaveString(afsd_logp,volume), rw ? "rw" : "ro"); if (cellname[0] == '.') { if (!cm_GetCell_Gen(&cellname[1], fullname, CM_FLAG_CREATE)) return -1; --- 644,654 ---- don't add the mount point. allow partial matches as a means of poor man's alias. */ /* major performance issue? */ ! osi_Log4(afsd_logp,"Freelance Add Mount request: filename=%s cellname=%s volume=%s %s", osi_LogSaveString(afsd_logp,filename), osi_LogSaveString(afsd_logp,cellname), ! osi_LogSaveString(afsd_logp,volume), ! rw ? "rw" : "ro"); if (cellname[0] == '.') { if (!cm_GetCell_Gen(&cellname[1], fullname, CM_FLAG_CREATE)) return -1; Index: openafs/src/WINNT/afsd/cm_freelance.h diff -c openafs/src/WINNT/afsd/cm_freelance.h:1.4 openafs/src/WINNT/afsd/cm_freelance.h:1.6 *** openafs/src/WINNT/afsd/cm_freelance.h:1.4 Mon Jul 26 15:08:42 2004 --- openafs/src/WINNT/afsd/cm_freelance.h Sat Aug 7 01:44:05 2004 *************** *** 16,23 **** --- 16,27 ---- extern void cm_InitFreelance(); extern long cm_FreelanceRemoveMount(char *toremove); extern long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, cm_fid_t *fidp); + extern int cm_clearLocalMountPointChange(); + #define AFS_FREELANCE_INI "afs_freelance.ini" #define AFS_FAKE_ROOT_CELL_ID 0xFFFFFFFF #define AFS_FAKE_ROOT_VOL_ID 0xFFFFFFFF + + extern afs_uint32 FakeFreelanceModTime; #endif // _CM_FREELANCE_H Index: openafs/src/WINNT/afsd/cm_ioctl.c diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.30 openafs/src/WINNT/afsd/cm_ioctl.c:1.33 *** openafs/src/WINNT/afsd/cm_ioctl.c:1.30 Thu Jul 15 23:38:31 2004 --- openafs/src/WINNT/afsd/cm_ioctl.c Wed Aug 4 11:52:56 2004 *************** *** 419,426 **** if (code) continue; code = RXAFS_FetchACL(connp->callp, &fid, &acl, &fileStatus, &volSync); ! } while (cm_Analyze(connp, userp, &req, &scp->fid, ! &volSync, NULL, code)); code = cm_MapRPCError(code, &req); cm_ReleaseSCache(scp); --- 419,425 ---- if (code) continue; code = RXAFS_FetchACL(connp->callp, &fid, &acl, &fileStatus, &volSync); ! } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, &req); cm_ReleaseSCache(scp); *************** *** 485,492 **** if (code) continue; code = RXAFS_StoreACL(connp->callp, &fid, &acl, &fileStatus, &volSync); ! } while (cm_Analyze(connp, userp, &req, &scp->fid, ! &volSync, NULL, code)); code = cm_MapRPCError(code, &req); /* invalidate cache info, since we just trashed the ACL cache */ --- 484,490 ---- if (code) continue; code = RXAFS_StoreACL(connp->callp, &fid, &acl, &fileStatus, &volSync); ! } while (cm_Analyze(connp, userp, &req, &scp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, &req); /* invalidate cache info, since we just trashed the ACL cache */ *************** *** 611,617 **** code = RXAFS_SetVolumeStatus(tcp->callp, scp->fid.volume, &storeStat, volName, offLineMsg, motd); ! } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, code)); code = cm_MapRPCError(code, &req); /* return on failure */ --- 609,615 ---- code = RXAFS_SetVolumeStatus(tcp->callp, scp->fid.volume, &storeStat, volName, offLineMsg, motd); ! } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, &req); /* return on failure */ *************** *** 669,675 **** code = RXAFS_GetVolumeStatus(tcp->callp, scp->fid.volume, &volStat, &Name, &OfflineMsg, &MOTD); ! } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, code)); code = cm_MapRPCError(code, &req); cm_ReleaseSCache(scp); --- 667,673 ---- code = RXAFS_GetVolumeStatus(tcp->callp, scp->fid.volume, &volStat, &Name, &OfflineMsg, &MOTD); ! } while (cm_Analyze(tcp, userp, &req, &scp->fid, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, &req); cm_ReleaseSCache(scp); *************** *** 695,737 **** long cm_IoctlWhereIs(struct smb_ioctl *ioctlp, struct cm_user *userp) { long code; ! cm_scache_t *scp; ! cm_cell_t *cellp; ! cm_volume_t *tvp; ! cm_serverRef_t *tsrp; ! cm_server_t *tsp; ! unsigned long volume; ! char *cp; ! cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; volume = scp->fid.volume; cellp = cm_FindCellByID(scp->fid.cell); ! osi_assert(cellp); ! cm_ReleaseSCache(scp); code = cm_GetVolumeByID(cellp, volume, userp, &req, &tvp); ! if (code) return code; ! cp = ioctlp->outDatap; lock_ObtainMutex(&tvp->mx); ! tsrp = cm_GetVolServers(tvp, volume); lock_ObtainRead(&cm_serverLock); ! while(tsrp) { ! tsp = tsrp->server; memcpy(cp, (char *)&tsp->addr.sin_addr.s_addr, sizeof(long)); cp += sizeof(long); - tsrp = tsrp->next; } lock_ReleaseRead(&cm_serverLock); ! lock_ReleaseMutex(&tvp->mx); /* still room for terminating NULL, add it on */ volume = 0; /* reuse vbl */ --- 693,735 ---- long cm_IoctlWhereIs(struct smb_ioctl *ioctlp, struct cm_user *userp) { long code; ! cm_scache_t *scp; ! cm_cell_t *cellp; ! cm_volume_t *tvp; ! cm_serverRef_t **tsrpp, *current; ! cm_server_t *tsp; ! unsigned long volume; ! char *cp; ! cm_req_t req; cm_InitReq(&req); ! code = cm_ParseIoctlPath(ioctlp, userp, &req, &scp); ! if (code) return code; volume = scp->fid.volume; cellp = cm_FindCellByID(scp->fid.cell); ! osi_assert(cellp); ! cm_ReleaseSCache(scp); code = cm_GetVolumeByID(cellp, volume, userp, &req, &tvp); ! if (code) return code; ! cp = ioctlp->outDatap; lock_ObtainMutex(&tvp->mx); ! tsrpp = cm_GetVolServers(tvp, volume); lock_ObtainRead(&cm_serverLock); ! for (current = *tsrpp; current; current = current->next) { ! tsp = current->server; memcpy(cp, (char *)&tsp->addr.sin_addr.s_addr, sizeof(long)); cp += sizeof(long); } lock_ReleaseRead(&cm_serverLock); ! cm_FreeServerList(tsrpp); ! lock_ReleaseMutex(&tvp->mx); /* still room for terminating NULL, add it on */ volume = 0; /* reuse vbl */ *************** *** 1007,1020 **** long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp) { long whichCell; ! long magic = 0; cm_cell_t *tcellp; cm_serverRef_t *serverRefp; ! cm_server_t *serverp; long i; ! char *cp; ! char *tp; ! char *basep; cm_SkipIoctlPath(ioctlp); --- 1005,1018 ---- long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp) { long whichCell; ! long magic = 0; cm_cell_t *tcellp; cm_serverRef_t *serverRefp; ! cm_server_t *serverp; long i; ! char *cp; ! char *tp; ! char *basep; cm_SkipIoctlPath(ioctlp); *************** *** 1028,1034 **** memcpy((char *)&magic, tp, sizeof(long)); } ! lock_ObtainRead(&cm_cellLock); for(tcellp = cm_allCellsp; tcellp; tcellp = tcellp->nextp) { if (whichCell == 0) break; whichCell--; --- 1026,1032 ---- memcpy((char *)&magic, tp, sizeof(long)); } ! lock_ObtainRead(&cm_cellLock); for(tcellp = cm_allCellsp; tcellp; tcellp = tcellp->nextp) { if (whichCell == 0) break; whichCell--; *************** *** 1044,1058 **** max = 13; } memset(cp, 0, max * sizeof(long)); ! basep = cp; lock_ObtainRead(&cm_serverLock); /* for going down server list */ serverRefp = tcellp->vlServersp; for(i=0; iserver; memcpy(cp, &serverp->addr.sin_addr.s_addr, sizeof(long)); cp += sizeof(long); ! serverRefp = serverRefp->next; } lock_ReleaseRead(&cm_serverLock); cp = basep + max * sizeof(afs_int32); --- 1042,1057 ---- max = 13; } memset(cp, 0, max * sizeof(long)); ! basep = cp; lock_ObtainRead(&cm_serverLock); /* for going down server list */ + /* jaltman - do the reference counts to serverRefp contents need to be increased? */ serverRefp = tcellp->vlServersp; for(i=0; iserver; memcpy(cp, &serverp->addr.sin_addr.s_addr, sizeof(long)); cp += sizeof(long); ! serverRefp = serverRefp->next; } lock_ReleaseRead(&cm_serverLock); cp = basep + max * sizeof(afs_int32); *************** *** 1691,1699 **** if (flags & PIOCTL_LOGON) { /* SMB user name with which to associate tokens */ smbname = tp; ! osi_Log1(smb_logp,"cm_IoctlSetToken for user [%s]",osi_LogSaveString(smb_logp,smbname)); fprintf(stderr, "SMB name = %s\n", smbname); tp += strlen(tp) + 1; } #ifndef DJGPP /* for win95, session key is back in pioctl */ --- 1690,1702 ---- if (flags & PIOCTL_LOGON) { /* SMB user name with which to associate tokens */ smbname = tp; ! osi_Log2(smb_logp,"cm_IoctlSetToken for user [%s] smbname [%s]", ! osi_LogSaveString(smb_logp,uname), osi_LogSaveString(smb_logp,smbname)); fprintf(stderr, "SMB name = %s\n", smbname); tp += strlen(tp) + 1; + } else { + osi_Log1(smb_logp,"cm_IoctlSetToken for user [%s]", + osi_LogSaveString(smb_logp,uname)); } #ifndef DJGPP /* for win95, session key is back in pioctl */ *************** *** 1702,1709 **** if (!cm_FindTokenEvent(uuid, sessionKey)) return CM_ERROR_INVAL; #endif /* !DJGPP */ ! } else cellp = cm_rootCellp; if (flags & PIOCTL_LOGON) { userp = smb_FindCMUserByName(smbname, ioctlp->fidp->vcp->rname); --- 1705,1714 ---- if (!cm_FindTokenEvent(uuid, sessionKey)) return CM_ERROR_INVAL; #endif /* !DJGPP */ ! } else { cellp = cm_rootCellp; + osi_Log0(smb_logp,"cm_IoctlSetToken - no name specified"); + } if (flags & PIOCTL_LOGON) { userp = smb_FindCMUserByName(smbname, ioctlp->fidp->vcp->rname); *************** *** 1712,1717 **** --- 1717,1723 ---- /* store the token */ lock_ObtainMutex(&userp->mx); ucellp = cm_GetUCell(userp, cellp); + osi_Log1(smb_logp,"cm_IoctlSetToken ucellp %lx", ucellp); ucellp->ticketLen = ticketLen; if (ucellp->ticketp) free(ucellp->ticketp); /* Discard old token if any */ *************** *** 1946,1951 **** --- 1952,1959 ---- return CM_ERROR_NOMORETOKENS; } + osi_Log1(smb_logp,"cm_IoctlDelToken ucellp %lx", ucellp); + if (ucellp->ticketp) { free(ucellp->ticketp); ucellp->ticketp = NULL; *************** *** 1966,1972 **** lock_ObtainMutex(&userp->mx); ! for (ucellp = userp->cellInfop; ucellp; ucellp = ucellp->nextp) { ucellp->flags &= ~CM_UCELLFLAG_RXKAD; ucellp->gen++; } --- 1974,1981 ---- lock_ObtainMutex(&userp->mx); ! for (ucellp = userp->cellInfop; ucellp; ucellp = ucellp->nextp) { ! osi_Log1(smb_logp,"cm_IoctlDelAllToken ucellp %lx", ucellp); ucellp->flags &= ~CM_UCELLFLAG_RXKAD; ucellp->gen++; } *************** *** 1982,1988 **** { char afspath[MAX_PATH]; char *submountreqp; - int iteration; int nextAutoSubmount; HKEY hkSubmounts; DWORD dwType, dwSize; --- 1991,1996 ---- *************** *** 2021,2027 **** if (submountreqp && *submountreqp) { char submountPathNormalized[MAX_PATH]; char submountPath[MAX_PATH]; - int submountPathLen; dwSize = sizeof(submountPath); status = RegQueryValueEx( hkSubmounts, submountreqp, 0, --- 2029,2034 ---- Index: openafs/src/WINNT/afsd/cm_scache.c diff -c openafs/src/WINNT/afsd/cm_scache.c:1.13 openafs/src/WINNT/afsd/cm_scache.c:1.14 *** openafs/src/WINNT/afsd/cm_scache.c:1.13 Mon Jul 26 15:08:42 2004 --- openafs/src/WINNT/afsd/cm_scache.c Sat Aug 7 01:44:05 2004 *************** *** 316,323 **** scp->owner=0x0; scp->unixModeBits=0x1ff; ! scp->clientModTime=0x3b49f6e2; ! scp->serverModTime=0x3b49f6e2; scp->parentUnique = 0x1; scp->parentVnode=0x1; scp->group=0; --- 316,323 ---- scp->owner=0x0; scp->unixModeBits=0x1ff; ! scp->clientModTime=FakeFreelanceModTime; ! scp->serverModTime=FakeFreelanceModTime; scp->parentUnique = 0x1; scp->parentVnode=0x1; scp->group=0; *************** *** 819,826 **** statusp->ParentVnode = 0x1; statusp->ParentUnique = 0x1; statusp->ResidencyMask = 0; ! statusp->ClientModTime = 0x3b49f6e2; ! statusp->ServerModTime = 0x3b49f6e2; statusp->Group = 0; statusp->SyncCounter = 0; statusp->dataVersionHigh = 0; --- 819,826 ---- statusp->ParentVnode = 0x1; statusp->ParentUnique = 0x1; statusp->ResidencyMask = 0; ! statusp->ClientModTime = FakeFreelanceModTime; ! statusp->ServerModTime = FakeFreelanceModTime; statusp->Group = 0; statusp->SyncCounter = 0; statusp->dataVersionHigh = 0; Index: openafs/src/WINNT/afsd/cm_scache.h diff -c openafs/src/WINNT/afsd/cm_scache.h:1.3 openafs/src/WINNT/afsd/cm_scache.h:1.4 *** openafs/src/WINNT/afsd/cm_scache.h:1.3 Mon Apr 30 02:48:06 2001 --- openafs/src/WINNT/afsd/cm_scache.h Sat Jul 31 20:16:37 2004 *************** *** 136,145 **** #define CM_SCACHETYPE_MOUNTPOINT 4 /* a mount point */ /* flag bits */ ! #define CM_SCACHEFLAG_STATD 1 /* status info is valid */ ! #define CM_SCACHEFLAG_DELETED 2 /* file has been deleted */ ! #define CM_SCACHEFLAG_CALLBACK 4 /* have a valid callback */ ! #define CM_SCACHEFLAG_STORING 8 /* status being stored back */ #define CM_SCACHEFLAG_FETCHING 0x10 /* status being fetched */ #define CM_SCACHEFLAG_SIZESTORING 0x20 /* status being stored that * changes the data; typically, --- 136,145 ---- #define CM_SCACHETYPE_MOUNTPOINT 4 /* a mount point */ /* flag bits */ ! #define CM_SCACHEFLAG_STATD 0x01 /* status info is valid */ ! #define CM_SCACHEFLAG_DELETED 0x02 /* file has been deleted */ ! #define CM_SCACHEFLAG_CALLBACK 0x04 /* have a valid callback */ ! #define CM_SCACHEFLAG_STORING 0x08 /* status being stored back */ #define CM_SCACHEFLAG_FETCHING 0x10 /* status being fetched */ #define CM_SCACHEFLAG_SIZESTORING 0x20 /* status being stored that * changes the data; typically, *************** *** 171,180 **** * These flags correspond to individual RPCs that we may be making, and at most * one can be set in any one call to SyncOp. */ ! #define CM_SCACHESYNC_FETCHSTATUS 1 /* fetching status info */ ! #define CM_SCACHESYNC_STORESTATUS 2 /* storing status info */ ! #define CM_SCACHESYNC_FETCHDATA 4 /* fetch data */ ! #define CM_SCACHESYNC_STOREDATA 8 /* store data */ #define CM_SCACHESYNC_STORESIZE 0x10 /* store new file size */ #define CM_SCACHESYNC_GETCALLBACK 0x20 /* fetching a callback */ #define CM_SCACHESYNC_STOREDATA_EXCL 0x40 /* store data */ --- 171,180 ---- * These flags correspond to individual RPCs that we may be making, and at most * one can be set in any one call to SyncOp. */ ! #define CM_SCACHESYNC_FETCHSTATUS 0x01 /* fetching status info */ ! #define CM_SCACHESYNC_STORESTATUS 0x02 /* storing status info */ ! #define CM_SCACHESYNC_FETCHDATA 0x04 /* fetch data */ ! #define CM_SCACHESYNC_STOREDATA 0x08 /* store data */ #define CM_SCACHESYNC_STORESIZE 0x10 /* store new file size */ #define CM_SCACHESYNC_GETCALLBACK 0x20 /* fetching a callback */ #define CM_SCACHESYNC_STOREDATA_EXCL 0x40 /* store data */ Index: openafs/src/WINNT/afsd/cm_server.c diff -c openafs/src/WINNT/afsd/cm_server.c:1.9 openafs/src/WINNT/afsd/cm_server.c:1.13 *** openafs/src/WINNT/afsd/cm_server.c:1.9 Wed Jul 14 02:34:09 2004 --- openafs/src/WINNT/afsd/cm_server.c Sat Aug 7 10:12:11 2004 *************** *** 142,147 **** --- 142,152 ---- lock_ReleaseWrite(&cm_serverLock); } + void cm_PutServerNoLock(cm_server_t *serverp) + { + osi_assert(serverp->refCount-- > 0); + } + void cm_SetServerPrefs(cm_server_t * serverp) { unsigned long serverAddr; /* in host byte order */ *************** *** 243,255 **** { cm_serverRef_t *tsrp; ! lock_ObtainWrite(&cm_serverLock); serverp->refCount++; ! lock_ReleaseWrite(&cm_serverLock); tsrp = malloc(sizeof(*tsrp)); tsrp->server = serverp; tsrp->status = not_busy; tsrp->next = NULL; return tsrp; } --- 248,261 ---- { cm_serverRef_t *tsrp; ! lock_ObtainWrite(&cm_serverLock); serverp->refCount++; ! lock_ReleaseWrite(&cm_serverLock); tsrp = malloc(sizeof(*tsrp)); tsrp->server = serverp; tsrp->status = not_busy; tsrp->next = NULL; + tsrp->refCount = 1; return tsrp; } *************** *** 261,267 **** cm_serverRef_t *tsrp; lock_ObtainWrite(&cm_serverLock); - for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (first) first = 0; --- 267,272 ---- *************** *** 277,282 **** --- 282,289 ---- /* ** Insert a server into the server list keeping the list sorted in ** asending order of ipRank. + ** + ** The refCount of the cm_serverRef_t is increased */ void cm_InsertServerList(cm_serverRef_t** list, cm_serverRef_t* element) { *************** *** 284,291 **** unsigned short ipRank = element->server->ipRank; lock_ObtainWrite(&cm_serverLock); ! /* insertion into empty list or at the beginning of the list */ if ( !current || (current->server->ipRank > ipRank) ) { element->next = *list; --- 291,299 ---- unsigned short ipRank = element->server->ipRank; lock_ObtainWrite(&cm_serverLock); + element->refCount++; /* increase refCount */ ! /* insertion into empty list or at the beginning of the list */ if ( !current || (current->server->ipRank > ipRank) ) { element->next = *list; *************** *** 338,343 **** --- 346,356 ---- /* re-insert deleted element into the list with modified rank*/ cm_InsertServerList(list, element); + + /* reduce refCount which was increased by cm_InsertServerList */ + lock_ObtainWrite(&cm_serverLock); + element->refCount--; + lock_ReleaseWrite(&cm_serverLock); return 0; } /* *************** *** 419,435 **** void cm_FreeServerList(cm_serverRef_t** list) { ! cm_serverRef_t *current = *list; ! cm_serverRef_t *next = 0; lock_ObtainWrite(&cm_serverLock); ! while (current) { ! next = current->next; ! cm_FreeServer(current->server); ! free(current); ! current = next; } lock_ReleaseWrite(&cm_serverLock); --- 432,454 ---- void cm_FreeServerList(cm_serverRef_t** list) { ! cm_serverRef_t **current = list; ! cm_serverRef_t **nextp = 0; ! cm_serverRef_t * next = 0; lock_ObtainWrite(&cm_serverLock); ! while (*current) { ! nextp = &(*current)->next; ! if (--((*current)->refCount) == 0) { ! next = *nextp; ! cm_FreeServer((*current)->server); ! free(*current); ! *current = next; ! } else { ! current = nextp; ! } } lock_ReleaseWrite(&cm_serverLock); Index: openafs/src/WINNT/afsd/cm_server.h diff -c openafs/src/WINNT/afsd/cm_server.h:1.4 openafs/src/WINNT/afsd/cm_server.h:1.5 *** openafs/src/WINNT/afsd/cm_server.h:1.4 Sun May 30 10:39:05 2004 --- openafs/src/WINNT/afsd/cm_server.h Fri Jul 30 16:02:58 2004 *************** *** 22,43 **** */ typedef struct cm_server { struct cm_server *allNextp; /* locked by cm_serverLock */ ! struct sockaddr_in addr; /* by mx */ ! int type; /* by mx */ struct cm_conn *connsp; /* locked by cm_connLock */ ! long flags; /* by mx */ ! struct cm_cell *cellp; /* cell containing this server */ int refCount; /* locked by cm_serverLock */ ! osi_mutex_t mx; unsigned short ipRank; /* server priority */ } cm_server_t; enum repstate {not_busy, busy, offline}; typedef struct cm_serverRef { ! struct cm_serverRef *next; ! struct cm_server *server; ! enum repstate status; } cm_serverRef_t; /* types */ --- 22,44 ---- */ typedef struct cm_server { struct cm_server *allNextp; /* locked by cm_serverLock */ ! struct sockaddr_in addr; /* by mx */ ! int type; /* by mx */ struct cm_conn *connsp; /* locked by cm_connLock */ ! long flags; /* by mx */ ! struct cm_cell *cellp; /* cell containing this server */ int refCount; /* locked by cm_serverLock */ ! osi_mutex_t mx; unsigned short ipRank; /* server priority */ } cm_server_t; enum repstate {not_busy, busy, offline}; typedef struct cm_serverRef { ! struct cm_serverRef *next; /* locked by cm_serverLock */ ! struct cm_server *server; /* locked by cm_serverLock */ ! enum repstate status; /* locked by cm_serverLock */ ! int refCount; /* locked by cm_serverLock */ } cm_serverRef_t; /* types */ *************** *** 75,80 **** --- 76,83 ---- extern void cm_PutServer(cm_server_t *); + extern void cm_PutServerNoLock(cm_server_t *); + extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type); extern osi_rwlock_t cm_serverLock; Index: openafs/src/WINNT/afsd/cm_vnodeops.c diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.18 openafs/src/WINNT/afsd/cm_vnodeops.c:1.19 *** openafs/src/WINNT/afsd/cm_vnodeops.c:1.18 Tue Jul 27 17:34:46 2004 --- openafs/src/WINNT/afsd/cm_vnodeops.c Fri Jul 30 16:02:58 2004 *************** *** 1114,1121 **** code = RXAFS_RemoveFile(connp->callp, &afsFid, namep, &newDirStatus, &volSync); ! } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); --- 1114,1120 ---- code = RXAFS_RemoveFile(connp->callp, &afsFid, namep, &newDirStatus, &volSync); ! } while (cm_Analyze(connp, userp, reqp, &dscp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); *************** *** 1630,1636 **** &statStruct, &callbackStruct, &volSync); } while (cm_Analyze(connp, userp, reqp, &dscp->fid, ! &volSync, &cbReq, code)); code = cm_MapRPCError(code, reqp); osi_Log0(afsd_logp, "CALL BulkStatus DONE"); --- 1629,1635 ---- &statStruct, &callbackStruct, &volSync); } while (cm_Analyze(connp, userp, reqp, &dscp->fid, ! &volSync, NULL, &cbReq, code)); code = cm_MapRPCError(code, reqp); osi_Log0(afsd_logp, "CALL BulkStatus DONE"); *************** *** 1850,1856 **** &afsInStatus, &afsOutStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &scp->fid, &volSync, NULL, code)); code = cm_MapRPCError(code, reqp); osi_Log1(afsd_logp, "CALL StoreStatus DONE, code %d", code); --- 1849,1855 ---- &afsInStatus, &afsOutStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &scp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); osi_Log1(afsd_logp, "CALL StoreStatus DONE, code %d", code); *************** *** 1923,1929 **** &updatedDirStatus, &newFileCallback, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, &cbReq, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); --- 1922,1928 ---- &updatedDirStatus, &newFileCallback, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, &cbReq, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); *************** *** 2039,2045 **** &updatedDirStatus, &newDirCallback, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, &cbReq, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); --- 2038,2044 ---- &updatedDirStatus, &newDirCallback, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, &cbReq, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); *************** *** 2121,2127 **** &inStatus, &newAFSFid, &newLinkStatus, &updatedDirStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); --- 2120,2126 ---- &inStatus, &newAFSFid, &newLinkStatus, &updatedDirStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&dscp->mx); *************** *** 2190,2196 **** code = RXAFS_RemoveDir(connp->callp, &dirAFSFid, namep, &updatedDirStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, code)); code = cm_MapRPCErrorRmdir(code, reqp); lock_ObtainMutex(&dscp->mx); --- 2189,2195 ---- code = RXAFS_RemoveDir(connp->callp, &dirAFSFid, namep, &updatedDirStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, ! &dscp->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCErrorRmdir(code, reqp); lock_ObtainMutex(&dscp->mx); *************** *** 2330,2336 **** &updatedOldDirStatus, &updatedNewDirStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, ! &volSync, NULL, code)); code = cm_MapRPCError(code, reqp); /* update the individual stat cache entries for the directories */ --- 2329,2335 ---- &updatedOldDirStatus, &updatedNewDirStatus, &volSync); } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, ! &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); /* update the individual stat cache entries for the directories */ *************** *** 2402,2408 **** code = RXAFS_SetLock(connp->callp, &tfid, Which, &volSync); } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, ! NULL, code)); lock_ObtainMutex(&scp->mx); code = cm_MapRPCError(code, reqp); } --- 2401,2407 ---- code = RXAFS_SetLock(connp->callp, &tfid, Which, &volSync); } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, ! NULL, NULL, code)); lock_ObtainMutex(&scp->mx); code = cm_MapRPCError(code, reqp); } *************** *** 2493,2499 **** break; code = RXAFS_ReleaseLock(connp->callp, &tfid, &volSync); } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, ! NULL, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&scp->mx); } --- 2492,2498 ---- break; code = RXAFS_ReleaseLock(connp->callp, &tfid, &volSync); } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, ! NULL, NULL, code)); code = cm_MapRPCError(code, reqp); lock_ObtainMutex(&scp->mx); } *************** *** 2534,2540 **** code = RXAFS_ExtendLock(connp->callp, &tfid, &volSync); } while (cm_Analyze(connp, fileLock->userp, &req, ! &fileLock->fid, &volSync, NULL, code)); code = cm_MapRPCError(code, &req); lock_ObtainWrite(&cm_scacheLock); --- 2533,2539 ---- code = RXAFS_ExtendLock(connp->callp, &tfid, &volSync); } while (cm_Analyze(connp, fileLock->userp, &req, ! &fileLock->fid, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, &req); lock_ObtainWrite(&cm_scacheLock); *************** *** 2602,2608 **** &volSync); } while (cm_Analyze(connp, oldFileLock->userp, &req, &oldFileLock->fid, &volSync, ! NULL, code)); code = cm_MapRPCError(code, &req); } --- 2601,2607 ---- &volSync); } while (cm_Analyze(connp, oldFileLock->userp, &req, &oldFileLock->fid, &volSync, ! NULL, NULL, code)); code = cm_MapRPCError(code, &req); } Index: openafs/src/WINNT/afsd/cm_volume.c diff -c openafs/src/WINNT/afsd/cm_volume.c:1.6 openafs/src/WINNT/afsd/cm_volume.c:1.8 *** openafs/src/WINNT/afsd/cm_volume.c:1.6 Sat Jul 24 14:59:32 2004 --- openafs/src/WINNT/afsd/cm_volume.c Wed Aug 4 11:52:56 2004 *************** *** 55,75 **** long code; /* clear out old bindings */ ! while (tsrp = volp->rwServersp) { ! volp->rwServersp = tsrp->next; ! cm_PutServer(tsrp->server); ! free(tsrp); ! } ! while (tsrp = volp->roServersp) { ! volp->roServersp = tsrp->next; ! cm_PutServer(tsrp->server); ! free(tsrp); ! } ! while (tsrp = volp->bkServersp) { ! volp->bkServersp = tsrp->next; ! cm_PutServer(tsrp->server); ! free(tsrp); ! } /* now we have volume structure locked and held; make RPC to fill it */ do { --- 55,63 ---- long code; /* clear out old bindings */ ! cm_FreeServerList(&volp->rwServersp); ! cm_FreeServerList(&volp->roServersp); ! cm_FreeServerList(&volp->bkServersp); /* now we have volume structure locked and held; make RPC to fill it */ do { *************** *** 79,85 **** osi_Log1(afsd_logp, "CALL VL_GetEntryByNameO name %s", volp->namep); code = VL_GetEntryByNameO(connp->callp, volp->namep, &vldbEntry); ! } while (cm_Analyze(connp, userp, reqp, NULL, NULL, NULL, code)); code = cm_MapVLRPCError(code, reqp); if (code == 0) { --- 67,73 ---- osi_Log1(afsd_logp, "CALL VL_GetEntryByNameO name %s", volp->namep); code = VL_GetEntryByNameO(connp->callp, volp->namep, &vldbEntry); ! } while (cm_Analyze(connp, userp, reqp, NULL, NULL, cellp->vlServersp, NULL, code)); code = cm_MapVLRPCError(code, reqp); if (code == 0) { *************** *** 126,146 **** if ((tflags & VLSF_RWVOL) && (vldbEntry.flags & VLF_RWEXISTS)) { tsrp = cm_NewServerRef(tsp); ! tsrp->next = volp->rwServersp; ! volp->rwServersp = tsrp; } if ((tflags & VLSF_ROVOL) && (vldbEntry.flags & VLF_ROEXISTS)) { tsrp = cm_NewServerRef(tsp); cm_InsertServerList(&volp->roServersp, tsrp); ROcount++; } /* We don't use VLSF_BACKVOL !?! */ if ((tflags & VLSF_RWVOL) && (vldbEntry.flags & VLF_BACKEXISTS)) { tsrp = cm_NewServerRef(tsp); ! tsrp->next = volp->bkServersp; ! volp->bkServersp = tsrp; } /* Drop the reference obtained by cm_FindServer() */ cm_PutServer(tsp); --- 114,141 ---- if ((tflags & VLSF_RWVOL) && (vldbEntry.flags & VLF_RWEXISTS)) { tsrp = cm_NewServerRef(tsp); ! cm_InsertServerList(&volp->rwServersp, tsrp); ! lock_ObtainWrite(&cm_serverLock); ! tsrp->refCount--; /* drop allocation reference */ ! lock_ReleaseWrite(&cm_serverLock); } if ((tflags & VLSF_ROVOL) && (vldbEntry.flags & VLF_ROEXISTS)) { tsrp = cm_NewServerRef(tsp); cm_InsertServerList(&volp->roServersp, tsrp); + lock_ObtainWrite(&cm_serverLock); + tsrp->refCount--; /* drop allocation reference */ + lock_ReleaseWrite(&cm_serverLock); ROcount++; } /* We don't use VLSF_BACKVOL !?! */ if ((tflags & VLSF_RWVOL) && (vldbEntry.flags & VLF_BACKEXISTS)) { tsrp = cm_NewServerRef(tsp); ! cm_InsertServerList(&volp->bkServersp, tsrp); ! lock_ObtainWrite(&cm_serverLock); ! tsrp->refCount--; /* drop allocation reference */ ! lock_ReleaseWrite(&cm_serverLock); } /* Drop the reference obtained by cm_FindServer() */ cm_PutServer(tsp); *************** *** 308,326 **** } /* find the appropriate servers from a volume */ ! cm_serverRef_t *cm_GetVolServers(cm_volume_t *volp, unsigned long volume) { ! cm_serverRef_t *serversp; if (volume == volp->rwID) ! serversp = volp->rwServersp; else if (volume == volp->roID) ! serversp = volp->roServersp; else if (volume == volp->bkID) ! serversp = volp->bkServersp; else osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__); ! return serversp; } void cm_PutVolume(cm_volume_t *volp) --- 303,329 ---- } /* find the appropriate servers from a volume */ ! cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, unsigned long volume) { ! cm_serverRef_t **serverspp; ! cm_serverRef_t *current;; ! ! lock_ObtainWrite(&cm_serverLock); if (volume == volp->rwID) ! serverspp = &volp->rwServersp; else if (volume == volp->roID) ! serverspp = &volp->roServersp; else if (volume == volp->bkID) ! serverspp = &volp->bkServersp; else osi_panic("bad volume ID in cm_GetVolServers", __FILE__, __LINE__); ! for (current = *serverspp; current; current = current->next) ! current->refCount++; ! ! lock_ReleaseWrite(&cm_serverLock); ! ! return serverspp; } void cm_PutVolume(cm_volume_t *volp) Index: openafs/src/WINNT/afsd/cm_volume.h diff -c openafs/src/WINNT/afsd/cm_volume.h:1.2 openafs/src/WINNT/afsd/cm_volume.h:1.3 *** openafs/src/WINNT/afsd/cm_volume.h:1.2 Sat Nov 4 05:01:41 2000 --- openafs/src/WINNT/afsd/cm_volume.h Wed Aug 4 11:52:56 2004 *************** *** 12,29 **** typedef struct cm_volume { struct cm_cell *cellp; /* never changes */ ! char *namep; /* by cm_volumeLock */ unsigned long rwID; /* by cm_volumeLock */ unsigned long roID; /* by cm_volumeLock */ unsigned long bkID; /* by cm_volumeLock */ ! struct cm_volume *nextp; /* by cm_volumeLock */ struct cm_fid *dotdotFidp; /* parent of volume root */ ! osi_mutex_t mx; ! long flags; /* by mx */ ! int refCount; /* by cm_volumeLock */ ! cm_serverRef_t *rwServersp; /* by mx */ ! cm_serverRef_t *roServersp; /* by mx */ ! cm_serverRef_t *bkServersp; /* by mx */ } cm_volume_t; #define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */ --- 12,29 ---- typedef struct cm_volume { struct cm_cell *cellp; /* never changes */ ! char *namep; /* by cm_volumeLock */ unsigned long rwID; /* by cm_volumeLock */ unsigned long roID; /* by cm_volumeLock */ unsigned long bkID; /* by cm_volumeLock */ ! struct cm_volume *nextp; /* by cm_volumeLock */ struct cm_fid *dotdotFidp; /* parent of volume root */ ! osi_mutex_t mx; ! long flags; /* by mx */ ! int refCount; /* by cm_volumeLock */ ! cm_serverRef_t *rwServersp; /* by mx */ ! cm_serverRef_t *roServersp; /* by mx */ ! cm_serverRef_t *bkServersp; /* by mx */ } cm_volume_t; #define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */ *************** *** 43,49 **** extern void cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp, cm_req_t *reqp); ! extern cm_serverRef_t *cm_GetVolServers(cm_volume_t *volp, unsigned long volume); extern void cm_ChangeRankVolume(cm_server_t *tsp); --- 43,49 ---- extern void cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp, cm_req_t *reqp); ! extern cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, unsigned long volume); extern void cm_ChangeRankVolume(cm_server_t *tsp); Index: openafs/src/WINNT/afsd/logon_ad.cpp diff -c openafs/src/WINNT/afsd/logon_ad.cpp:1.5 openafs/src/WINNT/afsd/logon_ad.cpp:1.6 *** openafs/src/WINNT/afsd/logon_ad.cpp:1.5 Thu Jul 22 19:21:06 2004 --- openafs/src/WINNT/afsd/logon_ad.cpp Wed Aug 4 15:30:03 2004 *************** *** 244,252 **** BSTR bstr; hr = pNto->Get(ADS_NAME_TYPE_1779, &bstr); ! wcscpy(adsPath, bstr); ! SysFreeString(bstr); } } pNto->Release(); --- 244,258 ---- BSTR bstr; hr = pNto->Get(ADS_NAME_TYPE_1779, &bstr); ! if(SUCCEEDED(hr)) { ! hr = StringCchCopyW(adsPath, MAX_PATH, bstr); ! if(FAILED(hr)) { ! DebugEvent("Overflow while copying ADS path"); ! adsPath[0] = L'\0'; ! } ! SysFreeString(bstr); ! } } } pNto->Release(); *************** *** 349,355 **** } } ! BOOL GetLocalShortDomain(PWSTR Domain) { HRESULT hr; IADsADSystemInfo *pADsys; --- 355,361 ---- } } ! BOOL GetLocalShortDomain(PWSTR Domain, DWORD cbDomain) { HRESULT hr; IADsADSystemInfo *pADsys; *************** *** 370,378 **** hr = pADsys->get_DomainShortName(&bstr); if ( !FAILED(hr) ) { ! wcscpy( Domain, bstr ); SysFreeString(bstr); - retval = TRUE; } pADsys->Release(); } --- 376,386 ---- hr = pADsys->get_DomainShortName(&bstr); if ( !FAILED(hr) ) { ! hr = StringCbCopyW( Domain, cbDomain, bstr ); ! if(SUCCEEDED(hr)) { ! retval = TRUE; ! } SysFreeString(bstr); } pADsys->Release(); } Index: openafs/src/WINNT/afsd/smb.c diff -c openafs/src/WINNT/afsd/smb.c:1.51 openafs/src/WINNT/afsd/smb.c:1.55 *** openafs/src/WINNT/afsd/smb.c:1.51 Mon Jul 26 19:22:20 2004 --- openafs/src/WINNT/afsd/smb.c Sun Aug 8 12:55:28 2004 *************** *** 98,104 **** NCB *NCBs[NCBmax]; struct smb_packet *bufs[NCBmax]; ! #define Sessionmax MAXIMUM_WAIT_OBJECTS EVENT_HANDLE SessionEvents[Sessionmax]; unsigned short LSNs[Sessionmax]; int lanas[Sessionmax]; --- 98,104 ---- NCB *NCBs[NCBmax]; struct smb_packet *bufs[NCBmax]; ! #define Sessionmax MAXIMUM_WAIT_OBJECTS - 4 EVENT_HANDLE SessionEvents[Sessionmax]; unsigned short LSNs[Sessionmax]; int lanas[Sessionmax]; *************** *** 156,162 **** * Time in Unix format of midnight, 1/1/1970 local time. * When added to dosUTime, gives Unix (AFS) time. */ ! long smb_localZero; /* Time difference for converting to kludge-GMT */ int smb_NowTZ; --- 156,162 ---- * Time in Unix format of midnight, 1/1/1970 local time. * When added to dosUTime, gives Unix (AFS) time. */ ! long smb_localZero = 0; /* Time difference for converting to kludge-GMT */ int smb_NowTZ; *************** *** 432,438 **** } #ifndef DJGPP ! void ShowUnixTime(char *FuncName, long unixTime) { FILETIME ft; WORD wDate, wTime; --- 432,438 ---- } #ifndef DJGPP ! void ShowUnixTime(char *FuncName, afs_uint32 unixTime) { FILETIME ft; WORD wDate, wTime; *************** *** 583,589 **** } #ifndef DJGPP ! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, long unixTime) { struct tm *ltp; SYSTEMTIME stm; --- 583,589 ---- } #ifndef DJGPP ! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, afs_uint32 unixTime) { struct tm *ltp; SYSTEMTIME stm; *************** *** 623,629 **** SystemTimeToFileTime(&stm, largeTimep); } #else /* DJGPP */ ! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, long unixTime) { /* unixTime: seconds since 1/1/1970 00:00:00 GMT */ /* FILETIME: 100ns intervals since 1/1/1601 00:00:00 ??? */ --- 623,629 ---- SystemTimeToFileTime(&stm, largeTimep); } #else /* DJGPP */ ! void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, afs_uint32 unixTime) { /* unixTime: seconds since 1/1/1970 00:00:00 GMT */ /* FILETIME: 100ns intervals since 1/1/1601 00:00:00 ??? */ *************** *** 645,651 **** #endif /* !DJGPP */ #ifndef DJGPP ! void smb_UnixTimeFromLargeSearchTime(long *unixTimep, FILETIME *largeTimep) { SYSTEMTIME stm; struct tm lt; --- 645,651 ---- #endif /* !DJGPP */ #ifndef DJGPP ! void smb_UnixTimeFromLargeSearchTime(afs_uint32 *unixTimep, FILETIME *largeTimep) { SYSTEMTIME stm; struct tm lt; *************** *** 668,674 **** _timezone = save_timezone; } #else /* DJGPP */ ! void smb_UnixTimeFromLargeSearchTime(long *unixTimep, FILETIME *largeTimep) { /* unixTime: seconds since 1/1/1970 00:00:00 GMT */ /* FILETIME: 100ns intervals since 1/1/1601 00:00:00 GMT? */ --- 668,674 ---- _timezone = save_timezone; } #else /* DJGPP */ ! void smb_UnixTimeFromLargeSearchTime(afs_uint32 *unixTimep, FILETIME *largeTimep) { /* unixTime: seconds since 1/1/1970 00:00:00 GMT */ /* FILETIME: 100ns intervals since 1/1/1601 00:00:00 GMT? */ *************** *** 689,695 **** } #endif /* !DJGPP */ ! void smb_SearchTimeFromUnixTime(long *dosTimep, long unixTime) { struct tm *ltp; int dosDate; --- 689,695 ---- } #endif /* !DJGPP */ ! void smb_SearchTimeFromUnixTime(long *dosTimep, afs_uint32 unixTime) { struct tm *ltp; int dosDate; *************** *** 714,720 **** *dosTimep = (dosDate<<16) | dosTime; } ! void smb_UnixTimeFromSearchTime(long *unixTimep, long searchTime) { unsigned short dosDate; unsigned short dosTime; --- 714,720 ---- *dosTimep = (dosDate<<16) | dosTime; } ! void smb_UnixTimeFromSearchTime(afs_uint32 *unixTimep, long searchTime) { unsigned short dosDate; unsigned short dosTime; *************** *** 734,745 **** *unixTimep = mktime(&localTm); } ! void smb_DosUTimeFromUnixTime(long *dosUTimep, long unixTime) { *dosUTimep = unixTime - smb_localZero; } ! void smb_UnixTimeFromDosUTime(long *unixTimep, long dosTime) { #ifndef DJGPP *unixTimep = dosTime + smb_localZero; --- 734,745 ---- *unixTimep = mktime(&localTm); } ! void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, afs_uint32 unixTime) { *dosUTimep = unixTime - smb_localZero; } ! void smb_UnixTimeFromDosUTime(afs_uint32 *unixTimep, afs_uint32 dosTime) { #ifndef DJGPP *unixTimep = dosTime + smb_localZero; *************** *** 896,902 **** for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) { if (uid == uidp->userID) { uidp->refCount++; ! osi_LogEvent("AFS smb_FindUID (Find by UID)",NULL," VCP[%x] found-uid[%d] name[%s]",(int)vcp,uidp->userID,(uidp->unp) ? uidp->unp->name : ""); break; } } --- 896,904 ---- for(uidp = vcp->usersp; uidp; uidp = uidp->nextp) { if (uid == uidp->userID) { uidp->refCount++; ! osi_LogEvent("AFS smb_FindUID (Find by UID)",NULL," VCP[%x] found-uid[%d] name[%s]", ! (int)vcp, uidp->userID, ! osi_LogSaveString(smb_logp, (uidp->unp) ? uidp->unp->name : "")); break; } } *************** *** 1101,1107 **** sprintf(eventName,"fid_t event vcp=%d fid=%d", vcp->vcID, fid); event = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); if ( GetLastError() == ERROR_ALREADY_EXISTS ) { ! afsi_log("Event Object Already Exists: %s", eventName); thrd_CloseHandle(event); fid++; if (fid == 0) --- 1103,1109 ---- sprintf(eventName,"fid_t event vcp=%d fid=%d", vcp->vcID, fid); event = thrd_CreateEvent(NULL, FALSE, TRUE, eventName); if ( GetLastError() == ERROR_ALREADY_EXISTS ) { ! osi_Log1(smb_logp, "Event Object Already Exists: %s", osi_LogSaveString(smb_logp, eventName)); thrd_CloseHandle(event); fid++; if (fid == 0) *************** *** 1736,1747 **** signed int retval = __dpmi_allocate_dos_memory(npar, &tb_sel); /* DOS segment */ if (retval == -1) { ! afsi_log("Cannot allocate %d paragraphs of DOS memory", npar); osi_panic("",__FILE__,__LINE__); } else { ! afsi_log("Allocated %d paragraphs of DOS mem at 0x%X", npar, retval); seg = retval; } --- 1738,1749 ---- signed int retval = __dpmi_allocate_dos_memory(npar, &tb_sel); /* DOS segment */ if (retval == -1) { ! osi_Log1(smb_logp, "Cannot allocate %d paragraphs of DOS memory", npar); osi_panic("",__FILE__,__LINE__); } else { ! osi_Log2(smb_logp, "Allocated %d paragraphs of DOS mem at 0x%X", npar, retval); seg = retval; } *************** *** 1787,1797 **** signed int retval = __dpmi_allocate_dos_memory(npar, &tb_sel); /* DOS segment */ if (retval == -1) { ! afsi_log("Cannot allocate %d paragraphs of DOS mem in GetNCB", npar); osi_panic("",__FILE__,__LINE__); } else { ! afsi_log("Allocated %d paragraphs of DOS mem at 0x%X in GetNCB", npar, retval); seg = retval; } --- 1789,1799 ---- signed int retval = __dpmi_allocate_dos_memory(npar, &tb_sel); /* DOS segment */ if (retval == -1) { ! osi_Log1(smb_logp, "Cannot allocate %d paragraphs of DOS mem in GetNCB", npar); osi_panic("",__FILE__,__LINE__); } else { ! osi_Log2(smb_logp, "Allocated %d paragraphs of DOS mem at 0x%X in GetNCB", npar, retval); seg = retval; } *************** *** 1888,1911 **** parmCount = *smbp->wctp; if (parm >= parmCount) { #ifndef DJGPP HANDLE h; char *ptbuf[1]; - char s[100]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); sprintf(s, "Bad SMB param %d out of %d, ncb len %d", parm, parmCount, smbp->ncb_length); ptbuf[0] = s; ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1006, NULL, 1, smbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); ! #else /* DJGPP */ ! char s[100]; ! ! sprintf(s, "Bad SMB param %d out of %d, ncb len %d", ! parm, parmCount, smbp->ncb_length); ! osi_Log0(smb_logp, s); ! #endif /* !DJGPP */ osi_panic(s, __FILE__, __LINE__); } parmDatap = smbp->wctp + (2*parm) + 1; --- 1890,1910 ---- parmCount = *smbp->wctp; if (parm >= parmCount) { + char s[100]; #ifndef DJGPP HANDLE h; char *ptbuf[1]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); + #endif sprintf(s, "Bad SMB param %d out of %d, ncb len %d", parm, parmCount, smbp->ncb_length); + #ifndef DJGPP ptbuf[0] = s; ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1006, NULL, 1, smbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); ! #endif ! osi_Log0(smb_logp, osi_LogSaveString(smb_logp, s)); osi_panic(s, __FILE__, __LINE__); } parmDatap = smbp->wctp + (2*parm) + 1; *************** *** 1922,1947 **** parmCount = *smbp->wctp; if (parm * 2 + offset >= parmCount * 2) { #ifndef DJGPP HANDLE h; char *ptbuf[1]; - char s[100]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); sprintf(s, "Bad SMB param %d offset %d out of %d, ncb len %d", parm, offset, parmCount, smbp->ncb_length); ! ptbuf[0] = s; ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1006, NULL, 1, smbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); ! #else /* DJGPP */ ! char s[100]; ! ! sprintf(s, "Bad SMB param %d offset %d out of %d, " ! "ncb len %d", ! parm, offset, parmCount, smbp->ncb_length); ! osi_Log0(smb_logp, s); ! #endif /* !DJGPP */ ! osi_panic(s, __FILE__, __LINE__); } parmDatap = smbp->wctp + (2*parm) + 1 + offset; --- 1921,1941 ---- parmCount = *smbp->wctp; if (parm * 2 + offset >= parmCount * 2) { + char s[100]; #ifndef DJGPP HANDLE h; char *ptbuf[1]; h = RegisterEventSource(NULL, AFS_DAEMON_EVENT_NAME); + #endif sprintf(s, "Bad SMB param %d offset %d out of %d, ncb len %d", parm, offset, parmCount, smbp->ncb_length); ! #ifndef DJGPP ! ptbuf[0] = s; ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 1006, NULL, 1, smbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); ! #endif ! osi_Log0(smb_logp, osi_LogSaveString(smb_logp, s)); osi_panic(s, __FILE__, __LINE__); } parmDatap = smbp->wctp + (2*parm) + 1 + offset; *************** *** 2811,2823 **** void smb_Daemon(void *parmp) { ! int count = 0; while(1) { count++; thrd_Sleep(10000); ! if ((count % 360) == 0) { /* every hour */ struct tm myTime; /* Initialize smb_localZero */ myTime.tm_isdst = -1; /* compute whether on DST or not */ --- 2805,2818 ---- void smb_Daemon(void *parmp) { ! afs_uint32 count = 0; while(1) { count++; thrd_Sleep(10000); ! if ((count % 72) == 0) { /* every five minutes */ struct tm myTime; + long old_localZero = smb_localZero; /* Initialize smb_localZero */ myTime.tm_isdst = -1; /* compute whether on DST or not */ *************** *** 2830,2835 **** --- 2825,2835 ---- smb_localZero = mktime(&myTime); smb_CalculateNowTZ(); + + #ifdef AFS_FREELANCE + if ( smb_localZero != old_localZero ) + cm_noteLocalMountPointChange(); + #endif } /* XXX GC dir search entries */ } *************** *** 3177,3193 **** for(patchp = *dirPatchespp; patchp; patchp = (smb_dirListPatch_t *) osi_QNext(&patchp->q)) { ! code = cm_GetSCache(&patchp->fid, &scp, userp, reqp); ! if (code) continue; lock_ObtainMutex(&scp->mx); code = cm_SyncOp(scp, NULL, userp, reqp, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); if (code) { lock_ReleaseMutex(&scp->mx); cm_ReleaseSCache(scp); continue; } - dptr = patchp->dptr; attr = smb_Attributes(scp); /* check hidden attribute (the flag is only ON when dot file hiding is on ) */ --- 3177,3201 ---- for(patchp = *dirPatchespp; patchp; patchp = (smb_dirListPatch_t *) osi_QNext(&patchp->q)) { ! ! dptr = patchp->dptr; ! ! code = cm_GetSCache(&patchp->fid, &scp, userp, reqp); ! if (code) { ! if( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) ! *dptr++ = SMB_ATTR_HIDDEN; ! continue; ! } lock_ObtainMutex(&scp->mx); code = cm_SyncOp(scp, NULL, userp, reqp, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); if (code) { lock_ReleaseMutex(&scp->mx); cm_ReleaseSCache(scp); + if( patchp->flags & SMB_DIRLISTPATCH_DOTFILE ) + *dptr++ = SMB_ATTR_HIDDEN; continue; } attr = smb_Attributes(scp); /* check hidden attribute (the flag is only ON when dot file hiding is on ) */ *************** *** 3195,3201 **** attr |= SMB_ATTR_HIDDEN; *dptr++ = attr; ! /* get dos time */ smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime); /* copy out time */ --- 3203,3209 ---- attr |= SMB_ATTR_HIDDEN; *dptr++ = attr; ! /* get dos time */ smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime); /* copy out time */ *************** *** 3596,3602 **** fid.unique = ntohl(dep->fid.unique); fileType = cm_FindFileType(&fid); osi_Log2(smb_logp, "smb_ReceiveCoreSearchDir: file %s " ! "has filetype %d", dep->name, fileType); if (fileType == CM_SCACHETYPE_DIRECTORY) goto nextEntry; --- 3604,3610 ---- fid.unique = ntohl(dep->fid.unique); fileType = cm_FindFileType(&fid); osi_Log2(smb_logp, "smb_ReceiveCoreSearchDir: file %s " ! "has filetype %d", osi_LogSaveString(smb_logp, dep->name), fileType); if (fileType == CM_SCACHETYPE_DIRECTORY) goto nextEntry; *************** *** 4467,4473 **** /* Check if the file already exists; if so return error */ code = cm_Lookup(newDscp,newLastNamep,CM_FLAG_CHECKPATH,userp,&req,&tmpscp); if ((code != CM_ERROR_NOSUCHFILE) && (code != CM_ERROR_NOSUCHPATH) && (code != CM_ERROR_NOSUCHVOLUME) ) { ! osi_Log2(afsd_logp, " lookup returns %ld for [%s]", code, osi_LogSaveString(afsd_logp, newLastNamep)); /* Check if the old and the new names differ only in case. If so return --- 4475,4481 ---- /* Check if the file already exists; if so return error */ code = cm_Lookup(newDscp,newLastNamep,CM_FLAG_CHECKPATH,userp,&req,&tmpscp); if ((code != CM_ERROR_NOSUCHFILE) && (code != CM_ERROR_NOSUCHPATH) && (code != CM_ERROR_NOSUCHVOLUME) ) { ! osi_Log2(smb_logp, " lookup returns %ld for [%s]", code, osi_LogSaveString(afsd_logp, newLastNamep)); /* Check if the old and the new names differ only in case. If so return *************** *** 4489,4495 **** } } else { /* file exist, do not rename, also fixes move */ ! osi_Log0(afsd_logp, "Can't rename. Target already exists"); code = CM_ERROR_EXISTS; } --- 4497,4503 ---- } } else { /* file exist, do not rename, also fixes move */ ! osi_Log0(smb_logp, "Can't rename. Target already exists"); code = CM_ERROR_EXISTS; } *************** *** 5956,5965 **** 1, ncbp->ncb_length, ptbuf, inp); DeregisterEventSource(h); #else /* DJGPP */ ! osi_Log1(smb_logp, "SMB message too short, len %d", ! ncbp->ncb_length); #endif /* !DJGPP */ - return; } --- 5964,5971 ---- 1, ncbp->ncb_length, ptbuf, inp); DeregisterEventSource(h); #else /* DJGPP */ ! osi_Log1(smb_logp, "SMB message too short, len %d", ncbp->ncb_length); #endif /* !DJGPP */ return; } *************** *** 6040,6049 **** ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1005, NULL, 1, ncbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); ! #else /* DJGPP */ osi_Log1(smb_logp, "Pkt straddled session startup, " "ncb length %d", ncbp->ncb_length); - #endif /* !DJGPP */ } } else { --- 6046,6054 ---- ReportEvent(h, EVENTLOG_WARNING_TYPE, 0, 1005, NULL, 1, ncbp->ncb_length, ptbuf, smbp); DeregisterEventSource(h); ! #endif /* !DJGPP */ osi_Log1(smb_logp, "Pkt straddled session startup, " "ncb length %d", ncbp->ncb_length); } } else { *************** *** 6084,6093 **** #ifdef NOTSERVICE smb_LogPacket(inp); #endif /* NOTSERVICE */ ! #else /* DJGPP */ osi_Log1(smb_logp, "Invalid SMB message, length %d", ncbp->ncb_length); - #endif /* !DJGPP */ code = CM_ERROR_INVAL; } --- 6089,6097 ---- #ifdef NOTSERVICE smb_LogPacket(inp); #endif /* NOTSERVICE */ ! #endif /* !DJGPP */ osi_Log1(smb_logp, "Invalid SMB message, length %d", ncbp->ncb_length); code = CM_ERROR_INVAL; } *************** *** 6241,6263 **** if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) { int abandonIdx = code - WAIT_ABANDONED_0; ! afsi_log("Error: smb_ClientWaiter event %d abandoned, errno %d\n", abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! afsi_log("Error: smb_ClientWaiter WAIT_IO_COMPLETION\n"); continue; } if (code == WAIT_TIMEOUT) { ! afsi_log("Error: smb_ClientWaiter WAIT_TIMEOUT, errno %d\n", GetLastError()); } if (code == WAIT_FAILED) { ! afsi_log("Error: smb_ClientWaiter WAIT_FAILED, errno %d\n", GetLastError()); } idx = code - WAIT_OBJECT_0; --- 6245,6267 ---- if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) { int abandonIdx = code - WAIT_ABANDONED_0; ! osi_Log2(smb_logp, "Error: smb_ClientWaiter event %d abandoned, errno %d\n", abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! osi_Log0(smb_logp, "Error: smb_ClientWaiter WAIT_IO_COMPLETION\n"); continue; } if (code == WAIT_TIMEOUT) { ! osi_Log1(smb_logp, "Error: smb_ClientWaiter WAIT_TIMEOUT, errno %d\n", GetLastError()); } if (code == WAIT_FAILED) { ! osi_Log1(smb_logp, "Error: smb_ClientWaiter WAIT_FAILED, errno %d\n", GetLastError()); } idx = code - WAIT_OBJECT_0; *************** *** 6266,6272 **** if (idx < 0 || idx > (sizeof(NCBevents) / sizeof(NCBevents[0]))) { /* this is fatal - log as much as possible */ ! afsi_log("Fatal: NCBevents idx [ %d ] out of range.\n", idx); osi_assert(0); } --- 6270,6276 ---- if (idx < 0 || idx > (sizeof(NCBevents) / sizeof(NCBevents[0]))) { /* this is fatal - log as much as possible */ ! osi_Log1(smb_logp, "Fatal: NCBevents idx [ %d ] out of range.\n", idx); osi_assert(0); } *************** *** 6299,6321 **** if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numSessions)) { int abandonIdx = code - WAIT_ABANDONED_0; ! afsi_log("Error: smb_ServerWaiter (SessionEvents) event %d abandoned, errno %d\n", abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! afsi_log("Error: smb_ServerWaiter (SessionEvents) WAIT_IO_COMPLETION\n"); continue; } if (code == WAIT_TIMEOUT) { ! afsi_log("Error: smb_ServerWaiter (SessionEvents) WAIT_TIMEOUT, errno %d\n", GetLastError()); } if (code == WAIT_FAILED) { ! afsi_log("Error: smb_ServerWaiter (SessionEvents) WAIT_FAILED, errno %d\n", GetLastError()); } idx_session = code - WAIT_OBJECT_0; --- 6303,6325 ---- if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numSessions)) { int abandonIdx = code - WAIT_ABANDONED_0; ! osi_Log2(smb_logp, "Error: smb_ServerWaiter (SessionEvents) event %d abandoned, errno %d\n", abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! osi_Log0(smb_logp, "Error: smb_ServerWaiter (SessionEvents) WAIT_IO_COMPLETION\n"); continue; } if (code == WAIT_TIMEOUT) { ! osi_Log1(smb_logp, "Error: smb_ServerWaiter (SessionEvents) WAIT_TIMEOUT, errno %d\n", GetLastError()); } if (code == WAIT_FAILED) { ! osi_Log1(smb_logp, "Error: smb_ServerWaiter (SessionEvents) WAIT_FAILED, errno %d\n", GetLastError()); } idx_session = code - WAIT_OBJECT_0; *************** *** 6324,6330 **** if (idx_session < 0 || idx_session > (sizeof(SessionEvents) / sizeof(SessionEvents[0]))) { /* this is fatal - log as much as possible */ ! afsi_log("Fatal: session idx [ %d ] out of range.\n", idx_session); osi_assert(0); } --- 6328,6334 ---- if (idx_session < 0 || idx_session > (sizeof(SessionEvents) / sizeof(SessionEvents[0]))) { /* this is fatal - log as much as possible */ ! osi_Log1(smb_logp, "Fatal: session idx [ %d ] out of range.\n", idx_session); osi_assert(0); } *************** *** 6339,6361 **** if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) { int abandonIdx = code - WAIT_ABANDONED_0; ! afsi_log("Error: smb_ClientWaiter (NCBavails) event %d abandoned, errno %d\n", abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! afsi_log("Error: smb_ClientWaiter (NCBavails) WAIT_IO_COMPLETION\n"); continue; } if (code == WAIT_TIMEOUT) { ! afsi_log("Error: smb_ClientWaiter (NCBavails) WAIT_TIMEOUT, errno %d\n", GetLastError()); } if (code == WAIT_FAILED) { ! afsi_log("Error: smb_ClientWaiter (NCBavails) WAIT_FAILED, errno %d\n", GetLastError()); } idx_NCB = code - WAIT_OBJECT_0; --- 6343,6365 ---- if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) { int abandonIdx = code - WAIT_ABANDONED_0; ! osi_Log2(smb_logp, "Error: smb_ClientWaiter (NCBavails) event %d abandoned, errno %d\n", abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! osi_Log0(smb_logp, "Error: smb_ClientWaiter (NCBavails) WAIT_IO_COMPLETION\n"); continue; } if (code == WAIT_TIMEOUT) { ! osi_Log1(smb_logp, "Error: smb_ClientWaiter (NCBavails) WAIT_TIMEOUT, errno %d\n", GetLastError()); } if (code == WAIT_FAILED) { ! osi_Log1(smb_logp, "Error: smb_ClientWaiter (NCBavails) WAIT_FAILED, errno %d\n", GetLastError()); } idx_NCB = code - WAIT_OBJECT_0; *************** *** 6364,6370 **** if (idx_NCB < 0 || idx_NCB > (sizeof(NCBsessions) / sizeof(NCBsessions[0]))) { /* this is fatal - log as much as possible */ ! afsi_log("Fatal: idx_NCB [ %d ] out of range.\n", idx_NCB); osi_assert(0); } --- 6368,6374 ---- if (idx_NCB < 0 || idx_NCB > (sizeof(NCBsessions) / sizeof(NCBsessions[0]))) { /* this is fatal - log as much as possible */ ! osi_Log1(smb_logp, "Fatal: idx_NCB [ %d ] out of range.\n", idx_NCB); osi_assert(0); } *************** *** 6448,6470 **** if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) { int abandonIdx = code - WAIT_ABANDONED_0; ! afsi_log("Error: smb_Server ( NCBreturns[%d] ) event %d abandoned, errno %d\n", myIdx, abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! afsi_log("Error: smb_Server ( NCBreturns[%d] ) WAIT_IO_COMPLETION\n", myIdx); continue; } if (code == WAIT_TIMEOUT) { ! afsi_log("Error: smb_Server ( NCBreturns[%d] ) WAIT_TIMEOUT, errno %d\n", myIdx, GetLastError()); } if (code == WAIT_FAILED) { ! afsi_log("Error: smb_Server ( NCBreturns[%d] ) WAIT_FAILED, errno %d\n", myIdx, GetLastError()); } idx_NCB = code - WAIT_OBJECT_0; --- 6452,6474 ---- if (code >= WAIT_ABANDONED_0 && code < (WAIT_ABANDONED_0 + numNCBs)) { int abandonIdx = code - WAIT_ABANDONED_0; ! osi_Log3(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) event %d abandoned, errno %d\n", myIdx, abandonIdx, GetLastError()); } if (code == WAIT_IO_COMPLETION) { ! osi_Log1(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) WAIT_IO_COMPLETION\n", myIdx); continue; } if (code == WAIT_TIMEOUT) { ! osi_Log2(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) WAIT_TIMEOUT, errno %d\n", myIdx, GetLastError()); } if (code == WAIT_FAILED) { ! osi_Log2(smb_logp, "Error: smb_Server ( NCBreturns[%d] ) WAIT_FAILED, errno %d\n", myIdx, GetLastError()); } idx_NCB = code - WAIT_OBJECT_0; *************** *** 6473,6479 **** if (idx_NCB < 0 || idx_NCB > (sizeof(NCBs) / sizeof(NCBs[0]))) { /* this is fatal - log as much as possible */ ! afsi_log("Fatal: idx_NCB [ %d ] out of range.\n", idx_NCB); osi_assert(0); } --- 6477,6483 ---- if (idx_NCB < 0 || idx_NCB > (sizeof(NCBs) / sizeof(NCBs[0]))) { /* this is fatal - log as much as possible */ ! osi_Log1(smb_logp, "Fatal: idx_NCB [ %d ] out of range.\n", idx_NCB); osi_assert(0); } *************** *** 6501,6507 **** /* Client closed session */ if (reportSessionStartups) { ! afsi_log("session [ %d ] closed", idx_session); } dead_sessions[idx_session] = TRUE; if (vcp) --- 6505,6511 ---- /* Client closed session */ if (reportSessionStartups) { ! osi_Log1(smb_logp, "session [ %d ] closed", idx_session); } dead_sessions[idx_session] = TRUE; if (vcp) *************** *** 6548,6555 **** char *ptbuf[1]; char s[100]; - osi_Log1(smb_logp, "dispatch smb recv failed, message incomplete, ncb_length %d", - ncbp->ncb_length); h = Reg