Index: openafs/src/NTMakefile
diff -c openafs/src/NTMakefile:1.27.2.7 openafs/src/NTMakefile:1.27.2.8
*** openafs/src/NTMakefile:1.27.2.7	Fri Feb  1 21:48:12 2008
--- openafs/src/NTMakefile	Tue Mar 11 13:02:04 2008
***************
*** 60,66 ****
  	$(NTMAKE_HEADERS)
  	$(CD) ..\..\..
  
! util: procmgmt_headers afsreg_headers
       echo ***** $@
  	$(DOCD) $(SRC)\$@
  	$(CD) $(SRC)\$@
--- 60,73 ----
  	$(NTMAKE_HEADERS)
  	$(CD) ..\..\..
  
! lwp_headers:
!      echo ***** $@
! 	$(DOCD) $(SRC)\lwp
! 	$(CD) $(SRC)\lwp
! 	$(NTMAKE_HEADERS)
! 	$(CD) ..\..\..
! 
! util: procmgmt_headers afsreg_headers lwp_headers
       echo ***** $@
  	$(DOCD) $(SRC)\$@
  	$(CD) $(SRC)\$@
Index: openafs/src/WINNT/afsd/NTMakefile
diff -c openafs/src/WINNT/afsd/NTMakefile:1.46.2.9 openafs/src/WINNT/afsd/NTMakefile:1.46.2.11
*** openafs/src/WINNT/afsd/NTMakefile:1.46.2.9	Fri Feb  8 21:32:19 2008
--- openafs/src/WINNT/afsd/NTMakefile	Wed Mar 19 09:59:29 2008
***************
*** 64,69 ****
--- 64,70 ----
  	$(INCFILEDIR)\cm_buf.h \
  	$(INCFILEDIR)\cm_freelance.h \
          $(INCFILEDIR)\cm_memmap.h \
+ 	$(INCFILEDIR)\cm_performance.h \
          $(INCFILEDIR)\afsd_eventlog.h \
          $(INCFILEDIR)\afsd_eventmessages.h \
          $(INCFILEDIR)\afskfw.h \
***************
*** 89,103 ****
  $(IDLFILES):afsrpc.idl
  	midl $(MIDL_FLAGS) $(AFSDEV_AUXMIDLFLAGS) /app_config $?
  
- RPCOBJS = $(OUT)\ifs_rpc.obj
- 
- $(RPCOBJS):..\afsrdr\ifs_rpc.c
- 	$(C2OBJ) ..\afsrdr\ifs_rpc.c
- 
  AFSDOBJS=\
-         $(OUT)\ifs_rpc.obj \
          $(OUT)\rawops.obj \
-         $(OUT)\afsdifs.obj \
  	$(OUT)\afsd_init.obj \
          $(OUT)\cm_btree.obj \
  	$(OUT)\cm_cell.obj \
--- 90,97 ----
***************
*** 125,130 ****
--- 119,125 ----
  	$(OUT)\cm_dnlc.obj \
  	$(OUT)\cm_rpc.obj \
          $(OUT)\cm_memmap.obj \
+         $(OUT)\cm_performance.obj \
  	$(OUT)\afsrpc_s.obj \
  !IFDEF OSICRASH
  	$(OUT)\afsdcrash.obj \
Index: openafs/src/WINNT/afsd/afsd.c
diff -c openafs/src/WINNT/afsd/afsd.c:1.13 openafs/src/WINNT/afsd/afsd.c:1.13.4.2
*** openafs/src/WINNT/afsd/afsd.c:1.13	Thu Aug  4 12:32:32 2005
--- openafs/src/WINNT/afsd/afsd.c	Wed Mar 19 11:36:25 2008
***************
*** 6,35 ****
   * License.  For details, see the LICENSE file in the top-level source
   * directory or online at http://www.openafs.org/dl/license10.html
   */
- /* AFSIFS Portions copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
  
  #include <afs/param.h>
  #include <afs/stds.h>
--- 6,11 ----
***************
*** 49,56 ****
  #include <crtdbg.h>
  #endif
  
- #include "afsdifs.h"
- 
  HANDLE main_inst;
  HWND main_wnd;
  char main_statusText[100];
--- 25,30 ----
***************
*** 134,147 ****
          DispatchMessage(&msg);
      }
  
- #ifdef AFSIFS
-     WaitForMultipleObjects(WORKER_THREADS, hAFSDWorkerThread, TRUE, INFINITE);
-     for (i = 0; i < WORKER_THREADS; i++)
-         CloseHandle(hAFSDWorkerThread[i]);
-     //CloseHandle(hAFSDMainThread);
-     RpcMgmtStopServerListening(NULL);
- #endif
- 
      return (msg.wParam);
  }
  
--- 108,113 ----
***************
*** 223,245 ****
  	if (code != 0)
  		osi_panic(reason, __FILE__, __LINE__);
  
- #ifndef AFSIFS
          code = afsd_InitSMB(&reason, MessageBox);
- #else
- 	code = ifs_Init(&reason);
- #endif
  
  	if (code != 0)
              osi_panic(reason, __FILE__, __LINE__);
  
- #ifdef AFSIFS
- 	DoTerminate = CreateEvent(NULL, TRUE, FALSE, TEXT("afsd_service_DoTerminate"));
-         if ( GetLastError() == ERROR_ALREADY_EXISTS )
-             afsi_log("Event Object Already Exists: %s", TEXT("afsd_service_DoTerminate"));
- 	for (cnt = 0; cnt < WORKER_THREADS; cnt++)
-             hAFSDWorkerThread[cnt] = CreateThread(NULL, 0, ifs_MainLoop, 0, 0, NULL);
- #endif
- 
  	ShowWindow(hWnd, SW_SHOWMINNOACTIVE);
  	UpdateWindow(hWnd);
  	return (TRUE);
--- 189,199 ----
***************
*** 276,284 ****
  		break;
  
  	    case WM_DESTROY:
- #ifdef AFSIFS
- 		SetEvent(DoTerminate);
- #endif
  		RpcMgmtStopServerListening(NULL);
  		PostQuitMessage(0);
  		break;
--- 230,235 ----
Index: openafs/src/WINNT/afsd/afsd.h
diff -c openafs/src/WINNT/afsd/afsd.h:1.18.2.6 openafs/src/WINNT/afsd/afsd.h:1.18.2.8
*** openafs/src/WINNT/afsd/afsd.h:1.18.2.6	Sat Dec 22 23:52:58 2007
--- openafs/src/WINNT/afsd/afsd.h	Fri Mar  7 17:24:04 2008
***************
*** 62,67 ****
--- 62,68 ----
  #include "cm_buf.h"
  #include "cm_memmap.h"
  #include "cm_freelance.h"
+ #include "cm_performance.h"
  #include "smb_ioctl.h"
  #include "afsd_init.h"
  #ifdef DJGPP
***************
*** 112,123 ****
  extern int cm_fakeDirSize;				// size (in bytes) of fake root.afs directory
  
  extern int cm_fakeDirCallback;				// state of the fake root.afs directory. indicates
! 													// if it needs to be refreshed
  
  extern int cm_fakeGettingCallback;			// 1 if currently updating the fake root.afs directory,
! 													// 0 otherwise
! 
! extern int cm_fakeDirVersion;				// the version number of the root.afs directory. used 
  #endif /* AFS_FREELANCE_CLIENT */
  
  extern int cm_dnsEnabled;
--- 113,122 ----
  extern int cm_fakeDirSize;				// size (in bytes) of fake root.afs directory
  
  extern int cm_fakeDirCallback;				// state of the fake root.afs directory. indicates
!                                                         // if it needs to be refreshed
  
  extern int cm_fakeGettingCallback;			// 1 if currently updating the fake root.afs directory,
! 							// 0 otherwise
  #endif /* AFS_FREELANCE_CLIENT */
  
  extern int cm_dnsEnabled;
Index: openafs/src/WINNT/afsd/afsd_eventlog.c
diff -c openafs/src/WINNT/afsd/afsd_eventlog.c:1.5 openafs/src/WINNT/afsd/afsd_eventlog.c:1.5.4.3
*** openafs/src/WINNT/afsd/afsd_eventlog.c:1.5	Sun Jan 15 21:05:27 2006
--- openafs/src/WINNT/afsd/afsd_eventlog.c	Sat Mar  8 09:17:32 2008
***************
*** 64,155 ****
  AddEventSource()
  {
      HKEY	hKey = NULL, hLogKey; 
!     UCHAR	szBuf[MAX_PATH]; 
      DWORD	dwData, dwDisposition; 
!     BOOL	bRet = TRUE;
  
!     do {
! 	if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_APPLOG_SUBKEY, 0,
! 			   KEY_QUERY_VALUE, &hLogKey ) )
! 	{			
! 	    // nope - create it		
! 	    if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_APPLOG_SUBKEY, 0,
! 				 NULL, REG_OPTION_NON_VOLATILE,
! 				 KEY_ALL_ACCESS, NULL, &hLogKey,
! 				 &dwDisposition)) 
! 	    {	
! 		bRet = FALSE;
! 		break;
! 	    }
! 	}
! 
! 	// Let's see if key already exists as a subkey under the 
! 	// Application key in the EventLog registry key.  If not,
! 	// create it.
! 	if ( RegOpenKeyEx( hLogKey, AFSREG_CLT_APPLOG_SUBKEY, 0,
! 			   KEY_QUERY_VALUE, &hKey ) )
! 	{			
! 	    // nope - create it		
! 	    if ( RegCreateKeyEx(hLogKey, AFSREG_CLT_APPLOG_SUBKEY, 0,
! 				 NULL, REG_OPTION_NON_VOLATILE,
! 				 KEY_ALL_ACCESS, NULL, &hKey,
! 				 &dwDisposition)) 
! 	    {	
! 		bRet = FALSE;
! 		break;
! 	    }
! 
! 	    // Set the name of the message file
! 	    // Get "ImagePath" from TransarcAFSDaemon service
! 	    memset(szBuf, '\0', MAX_PATH);
! 	    dwData = MAX_PATH;
! 	    GetServicePath(szBuf, &dwData);
! 
! 	    // Add the name to the EventMessageFile subkey. 
! 	    if ( RegSetValueEx( hKey,			// subkey handle 
! 				AFSREG_APPLOG_MSGFILE_VALUE,	// value name 
! 				0,			// must be zero 
! 				REG_EXPAND_SZ,		// value type 
! 				(LPBYTE) szBuf,		// pointer to value data 
! 				(DWORD)strlen(szBuf) + 1))	// length of value data
! 	    {	
! 		bRet = FALSE;
! 		break;
! 	    }
! 
! 	    // Set the supported event types in the TypesSupported subkey. 
! 	    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
! 		EVENTLOG_INFORMATION_TYPE; 
! 
! 	    if ( RegSetValueEx( hKey,			// subkey handle 
! 				AFSREG_APPLOG_MSGTYPE_VALUE,	// value name 
! 				0,			// must be zero 
! 				REG_DWORD,		// value type 
! 				(LPBYTE) &dwData,	// pointer to value data 
! 				sizeof(DWORD)))		// length of value data
! 	    {	
! 		bRet = FALSE;
! 		break;
! 	    }
! 	}
! 	else
! 	{
! 	    // key was opened - read it
! 	    memset(szBuf, '\0', MAX_PATH);
! 	    dwData = MAX_PATH;
! 	    if ( RegQueryValueEx( hKey,			// handle to key
! 				  AFSREG_APPLOG_MSGFILE_VALUE,	// value name
! 				  NULL,			// reserved
! 				  NULL,			// type buffer
! 				  (LPBYTE) szBuf,		// data buffer
! 				  &dwData))		// size of data buffer
! 	    {	
! 		bRet = FALSE;
! 		break;
! 	    }
! 	}
!     } while (0);
! 				
      if (hKey != NULL)
  	RegCloseKey(hKey); 
  
--- 64,136 ----
  AddEventSource()
  {
      HKEY	hKey = NULL, hLogKey; 
!     UCHAR	szBuf[MAX_PATH] = "afsd_service.exe"; 
      DWORD	dwData, dwDisposition; 
!     static BOOL	bRet = TRUE;
!     static BOOL bOnce = TRUE;
  
!     if (!bOnce)
!         return bRet;
! 
!     if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, AFSREG_APPLOG_SUBKEY, 0,
!                        KEY_SET_VALUE, &hLogKey ) )
!     {	        		
!         // nope - create it		
!         if ( RegCreateKeyEx(HKEY_LOCAL_MACHINE, AFSREG_APPLOG_SUBKEY, 0,
!                              NULL, REG_OPTION_NON_VOLATILE,
!                              KEY_ALL_ACCESS, NULL, &hLogKey,
!                              &dwDisposition)) 
!         {	
!             bRet = FALSE;
!             goto done;
!         }
!     }
! 
!     // Let's see if key already exists as a subkey under the 
!     // Application key in the EventLog registry key.  If not,
!     // create it.
!     if ( RegOpenKeyEx( hLogKey, AFSREG_CLT_APPLOG_SUBKEY, 0,
!                        KEY_SET_VALUE, &hKey ) )
!     {	        		
!         // nope - create it		
!         if ( RegCreateKeyEx(hLogKey, AFSREG_CLT_APPLOG_SUBKEY, 0,
!                              NULL, REG_OPTION_NON_VOLATILE,
!                              KEY_ALL_ACCESS, NULL, &hKey,
!                              &dwDisposition)) 
!         {	        
!             bRet = FALSE;
!             goto done;
!         }
!     }
! 
!     // Add the name to the EventMessageFile subkey. 
!     if ( RegSetValueEx( hKey,			// subkey handle 
!                         AFSREG_APPLOG_MSGFILE_VALUE,	// value name 
!                         0,			// must be zero 
!                         REG_SZ,		        // value type 
!                         (LPBYTE) szBuf,		// pointer to value data 
!                         (DWORD)strlen(szBuf) + 1))	// length of value data
!     {	        
!         bRet = FALSE;
!         goto done;
!     }
! 
!     // Set the supported event types in the TypesSupported subkey. 
!     dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
!         EVENTLOG_INFORMATION_TYPE; 
! 
!     if ( RegSetValueEx( hKey,			// subkey handle 
!                         AFSREG_APPLOG_MSGTYPE_VALUE,	// value name 
!                         0,			// must be zero 
!                         REG_DWORD,		// value type 
!                         (LPBYTE) &dwData,	// pointer to value data 
!                         sizeof(DWORD)))		// length of value data
!     {	        
!         bRet = FALSE;
! 	goto done;
!     }
! 	    
!   done:
      if (hKey != NULL)
  	RegCloseKey(hKey); 
  
Index: openafs/src/WINNT/afsd/afsd_init.c
diff -c openafs/src/WINNT/afsd/afsd_init.c:1.79.2.32 openafs/src/WINNT/afsd/afsd_init.c:1.79.2.38
*** openafs/src/WINNT/afsd/afsd_init.c:1.79.2.32	Mon Feb 25 17:21:24 2008
--- openafs/src/WINNT/afsd/afsd_init.c	Wed Mar 19 20:01:59 2008
***************
*** 62,70 ****
  DWORD cm_mountRootLen;
  int cm_logChunkSize;
  int cm_chunkSize;
- #ifdef AFS_FREELANCE_CLIENT
- char *cm_FakeRootDir;
- #endif /* freelance */
  
  int smb_UseV3 = 1;
  
--- 62,67 ----
***************
*** 558,566 ****
      DWORD blockSize;
      long logChunkSize;
      DWORD stats;
      DWORD dwValue;
!     DWORD rx_enable_peer_stats = 0;
!     DWORD rx_enable_process_stats = 0;
      long traceBufSize;
      long maxcpus;
      long ltt, ltto;
--- 555,565 ----
      DWORD blockSize;
      long logChunkSize;
      DWORD stats;
+     DWORD volumes;
+     DWORD cells;
      DWORD dwValue;
!     DWORD rx_enable_peer_stats;
!     DWORD rx_enable_process_stats;
      long traceBufSize;
      long maxcpus;
      long ltt, ltto;
***************
*** 776,785 ****
      code = RegQueryValueEx(parmKey, "Stats", NULL, NULL,
                              (BYTE *) &stats, &dummyLen);
      if (code == ERROR_SUCCESS)
!         afsi_log("Status cache size %d", stats);
      else {
          stats = CM_CONFIGDEFAULT_STATS;
!         afsi_log("Default status cache size %d", stats);
      }
  
      dummyLen = sizeof(ltt);
--- 775,804 ----
      code = RegQueryValueEx(parmKey, "Stats", NULL, NULL,
                              (BYTE *) &stats, &dummyLen);
      if (code == ERROR_SUCCESS)
!         afsi_log("Status cache entries: %d", stats);
      else {
          stats = CM_CONFIGDEFAULT_STATS;
!         afsi_log("Default status cache entries: %d", stats);
!     }
! 
!     dummyLen = sizeof(volumes);
!     code = RegQueryValueEx(parmKey, "Volumes", NULL, NULL,
!                             (BYTE *) &volumes, &dummyLen);
!     if (code == ERROR_SUCCESS)
!         afsi_log("Volumes cache entries: %d", volumes);
!     else {
!         volumes = CM_CONFIGDEFAULT_STATS / 3;
!         afsi_log("Default volume cache entries: %d", volumes);
!     }
! 
!     dummyLen = sizeof(cells);
!     code = RegQueryValueEx(parmKey, "Cells", NULL, NULL,
!                             (BYTE *) &cells, &dummyLen);
!     if (code == ERROR_SUCCESS)
!         afsi_log("Cell cache entries: %d", cells);
!     else {
!         cells = CM_CONFIGDEFAULT_CELLS;
!         afsi_log("Default cell cache entries: %d", cells);
      }
  
      dummyLen = sizeof(ltt);
***************
*** 1044,1062 ****
      code = RegQueryValueEx(parmKey, "RxEnablePeerStats", NULL, NULL,
                             (BYTE *) &rx_enable_peer_stats, &dummyLen);
      if (code != ERROR_SUCCESS) {
!         rx_enable_peer_stats = 0;
      }
      if (rx_enable_peer_stats)
          afsi_log("RX Peer Statistics gathering is enabled");
  
      dummyLen = sizeof(rx_enable_process_stats);
      code = RegQueryValueEx(parmKey, "RxEnableProcessStats", NULL, NULL,
                             (BYTE *) &rx_enable_process_stats, &dummyLen);
      if (code != ERROR_SUCCESS) {
!         rx_enable_process_stats = 0;
      }
      if (rx_enable_process_stats)
          afsi_log("RX Process Statistics gathering is enabled");
  
      dummyLen = sizeof(dwValue);
      dwValue = 0;
--- 1063,1085 ----
      code = RegQueryValueEx(parmKey, "RxEnablePeerStats", NULL, NULL,
                             (BYTE *) &rx_enable_peer_stats, &dummyLen);
      if (code != ERROR_SUCCESS) {
!         rx_enable_peer_stats = 1;
      }
      if (rx_enable_peer_stats)
          afsi_log("RX Peer Statistics gathering is enabled");
+     else
+         afsi_log("RX Peer Statistics gathering is disabled");
  
      dummyLen = sizeof(rx_enable_process_stats);
      code = RegQueryValueEx(parmKey, "RxEnableProcessStats", NULL, NULL,
                             (BYTE *) &rx_enable_process_stats, &dummyLen);
      if (code != ERROR_SUCCESS) {
!         rx_enable_process_stats = 1;
      }
      if (rx_enable_process_stats)
          afsi_log("RX Process Statistics gathering is enabled");
+     else
+         afsi_log("RX Process Statistics gathering is disabled");
  
      dummyLen = sizeof(dwValue);
      dwValue = 0;
***************
*** 1199,1205 ****
      cm_initParams.nChunkFiles = 0;
      cm_initParams.nStatCaches = stats;
      cm_initParams.nDataCaches = (afs_uint32)(cacheBlocks > 0xFFFFFFFF ? 0xFFFFFFFF : cacheBlocks);
!     cm_initParams.nVolumeCaches = stats/2;
      cm_initParams.firstChunkSize = cm_chunkSize;
      cm_initParams.otherChunkSize = cm_chunkSize;
      cm_initParams.cacheSize = cacheSize;
--- 1222,1228 ----
      cm_initParams.nChunkFiles = 0;
      cm_initParams.nStatCaches = stats;
      cm_initParams.nDataCaches = (afs_uint32)(cacheBlocks > 0xFFFFFFFF ? 0xFFFFFFFF : cacheBlocks);
!     cm_initParams.nVolumeCaches = volumes;
      cm_initParams.firstChunkSize = cm_chunkSize;
      cm_initParams.otherChunkSize = cm_chunkSize;
      cm_initParams.cacheSize = cacheSize;
***************
*** 1222,1228 ****
          
      cm_InitCallback();
  
!     code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, cm_chunkSize, cacheBlocks, blockSize);
      afsi_log("cm_InitMappedMemory code %x", code);
      if (code != 0) {
          *reasonP = "error initializing cache file";
--- 1245,1251 ----
          
      cm_InitCallback();
  
!     code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, volumes, cells, cm_chunkSize, cacheBlocks, blockSize);
      afsi_log("cm_InitMappedMemory code %x", code);
      if (code != 0) {
          *reasonP = "error initializing cache file";
***************
*** 1348,1356 ****
  
          osi_Log0(afsd_logp, "Loading Root Volume from cell");
  	do {
! 	    code = cm_GetVolumeByName(cm_data.rootCellp, cm_rootVolumeName, cm_rootUserp,
  				       &req, CM_GETVOL_FLAG_CREATE, &cm_data.rootVolumep);
! 	    afsi_log("cm_GetVolumeByName code %x root vol %x", code,
  		      (code ? (cm_volume_t *)-1 : cm_data.rootVolumep));
  	} while (code && --attempts);
          if (code != 0) {
--- 1371,1379 ----
  
          osi_Log0(afsd_logp, "Loading Root Volume from cell");
  	do {
! 	    code = cm_FindVolumeByName(cm_data.rootCellp, cm_rootVolumeName, cm_rootUserp,
  				       &req, CM_GETVOL_FLAG_CREATE, &cm_data.rootVolumep);
! 	    afsi_log("cm_FindVolumeByName code %x root vol %x", code,
  		      (code ? (cm_volume_t *)-1 : cm_data.rootVolumep));
  	} while (code && --attempts);
          if (code != 0) {
***************
*** 1401,1407 ****
          code = RegQueryValueEx(parmKey, "EnableSMBAsyncStore", NULL, NULL,
                                  (BYTE *) &dwValue, &dummyLen);
          if (code == ERROR_SUCCESS)
!             smb_AsyncStore = dwValue ? 1 : 0;
          afsi_log("EnableSMBAsyncStore = %d", smb_AsyncStore);
  
          dummyLen = sizeof(DWORD);
--- 1424,1430 ----
          code = RegQueryValueEx(parmKey, "EnableSMBAsyncStore", NULL, NULL,
                                  (BYTE *) &dwValue, &dummyLen);
          if (code == ERROR_SUCCESS)
!             smb_AsyncStore = dwValue == 2 ? 2 : (dwValue ? 1 : 0);
          afsi_log("EnableSMBAsyncStore = %d", smb_AsyncStore);
  
          dummyLen = sizeof(DWORD);
Index: openafs/src/WINNT/afsd/afsd_service.c
diff -c openafs/src/WINNT/afsd/afsd_service.c:1.52.4.23 openafs/src/WINNT/afsd/afsd_service.c:1.52.4.25
*** openafs/src/WINNT/afsd/afsd_service.c:1.52.4.23	Sat Feb  2 17:27:11 2008
--- openafs/src/WINNT/afsd/afsd_service.c	Wed Mar 19 11:36:25 2008
***************
*** 23,29 ****
  #ifdef _DEBUG
  #include <crtdbg.h>
  #endif
- #include "afsdifs.h"
  
  //#define REGISTER_POWER_NOTIFICATIONS 1
  #include "afsd_flushvol.h"
--- 23,28 ----
***************
*** 34,42 ****
  static SERVICE_STATUS_HANDLE	StatusHandle;
  
  HANDLE hAFSDMainThread = NULL;
- #ifdef AFSIFS
- HANDLE hAFSDWorkerThread[WORKER_THREADS];
- #endif
  
  HANDLE WaitToTerminate;
  
--- 33,38 ----
***************
*** 58,66 ****
   */
  static void afsd_notifier(char *msgp, char *filep, long line)
  {
- #ifdef AFSIFS
-     int i;
- #endif
      if (!msgp)
          msgp = "unspecified assert";
  
--- 54,59 ----
***************
*** 96,106 ****
  #endif
  
      SetEvent(WaitToTerminate);
- #ifdef AFSIFS
-     WaitForMultipleObjects(WORKER_THREADS, hAFSDWorkerThread, TRUE, INFINITE);
-     for (i = 0; i < WORKER_THREADS; i++)
-         CloseHandle(hAFSDWorkerThread[i]);
- #endif
  
  #ifdef JUMP
      if (GetCurrentThreadId() == MainThreadId)
--- 89,94 ----
***************
*** 425,433 ****
  #define MAX_DRIVES  23
  static DWORD __stdcall MountGlobalDrivesThread(void * notUsed)
  {
- #ifndef AFSIFS
      char szAfsPath[_MAX_PATH];
- #endif
      char szDriveToMapTo[5];
      DWORD dwResult;
      char szKeyName[256];
--- 413,419 ----
***************
*** 456,462 ****
              }
          }
  
- #ifndef AFSIFS
          for (dwRetry = 0 ; dwRetry < MAX_RETRIES; dwRetry++)
          {
              NETRESOURCE nr;
--- 442,447 ----
***************
*** 483,492 ****
              /* Disconnect any previous mappings */
              dwResult = WNetCancelConnection2(szDriveToMapTo, 0, TRUE);
          }
- #else
- 	/* FIXFIX: implement */
- 	afsi_log("GlobalAutoMap of %s to %s not implemented", szDriveToMapTo, szSubMount);
- #endif
      }        
  
      RegCloseKey(hKey);
--- 468,473 ----
***************
*** 515,528 ****
  
  static void DismountGlobalDrives()
  {
- #ifndef AFSIFS
      char szAfsPath[_MAX_PATH];
      char szDriveToMapTo[5];
      DWORD dwDriveSize;
      DWORD dwSubMountSize;
      char szSubMount[256];
      DWORD dwType;
- #endif
      DWORD dwResult;
      char szKeyName[256];
      HKEY hKey;
--- 496,507 ----
***************
*** 547,555 ****
      if (dwResult != ERROR_SUCCESS)
          return;
  
- #ifdef AFSIFS    
-     /* FIXFIX: implement */
- #else
      while (dwIndex < MAX_DRIVES) {
          dwDriveSize = sizeof(szDriveToMapTo);
          dwSubMountSize = sizeof(szSubMount);
--- 526,531 ----
***************
*** 569,575 ****
          
          afsi_log("Disconnect from GlobalAutoMap of %s to %s %s", szDriveToMapTo, szSubMount, dwResult ? "succeeded" : "failed");
      }        
- #endif
  
      RegCloseKey(hKey);
  }
--- 545,550 ----
***************
*** 1117,1125 ****
  #endif /* JUMP */
      HMODULE hHookDll;
      HMODULE hAdvApi32;
- #ifdef AFSIFS
-     int cnt;
- #endif
  
  #ifdef _DEBUG
      afsd_DbgBreakAllocInit();
--- 1092,1097 ----
***************
*** 1321,1341 ****
  /* the following ifdef chooses the mode of operation for the service.  to enable
   * a runtime flag (instead of compile-time), pioctl() would need to dynamically
   * determine the mode, in order to use the correct ioctl special-file path. */
- #ifndef AFSIFS
          code = afsd_InitSMB(&reason, MessageBox);
          if (code != 0) {
              afsi_log("afsd_InitSMB failed: %s (code = %d)", reason, code);
              osi_panic(reason, __FILE__, __LINE__);
          }
- #else
-         code = ifs_Init(&reason);
-         if (code != 0) {
-             afsi_log("ifs_Init failed: %s (code = %d)", reason, code);
-             osi_panic(reason, __FILE__, __LINE__);
-         }     
-         for (cnt = 0; cnt < WORKER_THREADS; cnt++)
-             hAFSDWorkerThread[cnt] = CreateThread(NULL, 0, ifs_MainLoop, 0, 0, NULL);
- #endif  
  
          /* allow an exit to be called post smb initialization */
          hHookDll = LoadLibrary(AFSD_HOOK_DLL);
--- 1293,1303 ----
***************
*** 1407,1419 ****
          }
      }
  
- #ifndef AFSIFS
      WaitForSingleObject(WaitToTerminate, INFINITE);
- #else
-     WaitForMultipleObjects(WORKER_THREADS, hAFSDWorkerThread, TRUE, INFINITE);
-     for (cnt = 0; cnt < WORKER_THREADS; cnt++)
-         CloseHandle(hAFSDWorkerThread[cnt]);
- #endif
  
      ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING;
      ServiceStatus.dwWin32ExitCode = NO_ERROR;
--- 1369,1375 ----
***************
*** 1463,1472 ****
      rx_Finalize();                       
      afsi_log("rx finalization complete");
                                           
- #ifndef AFSIFS
      smb_Shutdown();                      
      afsi_log("smb shutdown complete");   
- #endif
                                           
      RpcShutdown();                       
  
--- 1419,1426 ----
***************
*** 1565,1573 ****
              printf("Hit <Enter> to terminate OpenAFS Client Service\n");
              getchar();  
              SetEvent(WaitToTerminate);
- #ifdef AFSIFS
- 	    dc_release_hooks();
- #endif
          }
      }
  
--- 1519,1524 ----
Index: openafs/src/WINNT/afsd/afsdifs.c
diff -c openafs/src/WINNT/afsd/afsdifs.c:1.5.4.1 openafs/src/WINNT/afsd/afsdifs.c:removed
*** openafs/src/WINNT/afsd/afsdifs.c:1.5.4.1	Thu Jul 20 17:46:18 2006
--- openafs/src/WINNT/afsd/afsdifs.c	Sat Mar 22 21:01:32 2008
***************
*** 1,1160 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- #include <osi.h>
- #include "afsd.h"
- #include <winioctl.h>
- #include "..\afsrdr\kif.h"
- #include "..\afsrdr\ifs_rpc.h"
- 
- #include "afsdifs.h"
- 
- 
- /****************************/
- /* parameters, macros, etc. */
- /****************************/
- #define IFSL_SUCCEEDED(st)		(!(st & IFSL_FAIL_BASE))
- #define MAP_RETURN(code)		if (code) return ifs_MapCmError(code);
- #define ROOTPATH			"\\"
- #define TRANSFER_BUF_SIZE		(RPC_BUF_SIZE + TRANSFER_CHUNK_SIZE)
- #define SCPL_LOCK			EnterCriticalSection(&scp_list_lock);
- #define SCPL_UNLOCK			LeaveCriticalSection(&scp_list_lock);
- 
- 
- /****************************/
- /* structs                  */
- /****************************/
- struct user_map_entry			/* how we keep users straight.  total of MAX_AFS_USERS of these */
- {
-     LARGE_INTEGER id;			/* internal id created by kernel */
-     cm_user_t *creds;			/* global (thread-specific) var userp is set to this */
- };
- 
- struct scp_status				/* one for each unique file in afs */
- {
-     struct scp_status *next;	/* stored in a global chain in a chain locked by SCPL_[UN]LOCK */
-     cm_scache_t *scp;			/* file handle used with cm_ fns */
-     ULONG fid;					/* internal id generated by FID_HASH_FN from AFS's 128-bit FID */
- };
- typedef struct scp_status scp_status_t;
- 
- struct readdir_context			/* temporary struct, allocated as necessary, for cm_Apply callback */
- {
-     char *matchString;			/* for matching against */
-     char *buf, *buf_pos;		/* filling buffer to length, currently at buf_pos */
-     ULONG_PTR length;
-     ULONG count;			/* number of entries packed so far */
- };
- typedef struct readdir_context readdir_context_t;
- 
- 
- /****************************/
- /* global vars              */
- /****************************/
- /* the table user_map is used to store cm_user structs keyed on the calling
-  * process' 64-bit ID token.  the rpc library sets userp to point to this
-  * entry; userp is specific to each thread, and thus may be used securely
-  * as a global.
-  */
- __declspec(thread) cm_user_t *userp;
- struct user_map_entry user_map[MAX_AFS_USERS];
- 
- CRITICAL_SECTION mapLock, scp_list_lock;
- 
- scp_status_t *scp_list_head = NULL;
- 
- 
- /****************************/
- /* error functions          */
- /****************************/
- char *IfslErrorToText(unsigned long ifsl)
- {
-     switch (ifsl)
-     {
-     case IFSL_SUCCESS:
-         return "success";
-     case IFSL_DOES_NOT_EXIST:
-         return "does not exist";
-     case IFSL_NOT_IMPLEMENTED:
-         return "not implemented";
-     case IFSL_END_OF_ENUM:
-         return "end of enum";
-     case IFSL_CANNOT_MAKE:
-         return "cannot make";
-     case IFSL_END_OF_FILE:
-         return "end of file";
-     case IFSL_NO_ACCESS:
-         return "no access";
-     case IFSL_BUFFER_TOO_SMALL:
-         return "buffer too small";
-     case IFSL_SHARING_VIOLATION:
-         return "sharing violation";
-     case IFSL_BAD_INPUT:
-         return "bad input";
-     case IFSL_GENERIC_FAILURE:
-         return "generic failure";
-     case IFSL_OPEN_CREATED:
-         return "open created";
-     case IFSL_OPEN_EXISTS:
-         return "open exists";
-     case IFSL_OPEN_OPENED:
-         return "opened";
-     case IFSL_OPEN_OVERWRITTEN:
-         return "overwritten";
-     case IFSL_OPEN_SUPERSCEDED:
-         return "supersceded";
-     case IFSL_BADFILENAME:
-         return "bad filename";
-     case IFSL_READONLY:
-         return "read only";
-     case IFSL_IS_A_DIR:
-         return "is a dir";
-     case IFSL_PATH_DOES_NOT_EXIST:
-         return "path does not exist";
-     case IFSL_IS_A_FILE:
-         return "is a file";
-     case IFSL_NOT_EMPTY:
-         return "dir not empty";
-     case IFSL_UNSPEC:
-         return "unspecified error";
-     default:
-         return "NOT FOUND";
-     }
- }       
- 
- unsigned long ifs_MapCmError(unsigned long code)
- {
-     switch (code)
-     {
-     case CM_ERROR_STOPNOW:
-     case 0:
-         return IFSL_SUCCESS;
-     case CM_ERROR_NOSUCHCELL:
-     case CM_ERROR_NOSUCHVOLUME:
-     case CM_ERROR_NOSUCHFILE:
-         return IFSL_DOES_NOT_EXIST;
-     case CM_ERROR_NOSUCHPATH:
-         return IFSL_PATH_DOES_NOT_EXIST;
-     case CM_ERROR_BADNTFILENAME:
-         return IFSL_BADFILENAME;
-     case CM_ERROR_TIMEDOUT:
-     case CM_ERROR_ALLOFFLINE:
-     case CM_ERROR_CLOCKSKEW:
-     case CM_ERROR_REMOTECONN:
-     case CM_ERROR_ALLBUSY:
-         return IFSL_GENERIC_FAILURE;
-     case CM_ERROR_NOACCESS:
-         return IFSL_NO_ACCESS;
-     case CM_ERROR_RETRY:
-     case CM_ERROR_TOOBIG:
-     case CM_ERROR_BADFD:
-     case CM_ERROR_BADFDOP:
-     case CM_ERROR_CROSSDEVLINK:
-         return IFSL_GENERIC_FAILURE;
-     case CM_ERROR_EXISTS:
-         return IFSL_OPEN_EXISTS;
-     case CM_ERROR_BADOP:
-     case CM_ERROR_INVAL:
- 	case CM_ERROR_UNKNOWN:
-     case CM_ERROR_BADSMB:
-         return IFSL_GENERIC_FAILURE;
-     case CM_ERROR_NOTDIR:
-     case CM_ERROR_ISDIR:
-     case CM_ERROR_READONLY:
-         return IFSL_BAD_INPUT;
-     case CM_ERROR_BUFFERTOOSMALL:
-         return IFSL_BUFFER_TOO_SMALL;
-     case CM_ERROR_WOULDBLOCK:
-     case CM_ERROR_BADSHARENAME:
-     case CM_ERROR_NOMORETOKENS:
-     case CM_ERROR_NOTEMPTY:
-     case CM_ERROR_USESTD:
-     case CM_ERROR_ATSYS:
-         return IFSL_GENERIC_FAILURE;
-     case CM_ERROR_NOFILES:
-     case CM_ERROR_BADTID:
-         return IFSL_END_OF_ENUM;
-     case CM_ERROR_PARTIALWRITE:
-     case CM_ERROR_NOIPC:
-     case CM_ERROR_RENAME_IDENTICAL:
-     case CM_ERROR_AMBIGUOUS_FILENAME:
-         return IFSL_GENERIC_FAILURE;
-     case IFSL_SHARING_VIOLATION:
-         return IFSL_SHARING_VIOLATION;
-     case IFSL_NOT_EMPTY:
-         return IFSL_NOT_EMPTY;
-     case CM_ERROR_SPACE:
-     case CM_ERROR_QUOTA:
-         return IFSL_OVERQUOTA;	
-     }
-     return IFSL_GENERIC_FAILURE;
- }
- 
- 
- /****************************/
- /* support fns              */
- /****************************/
- cm_scache_t *ifs_FindScp(ULONG fid)		/* walk list to find scp<->fid mapping */
- {
-     scp_status_t *curr;
- 
-     SCPL_LOCK;
- 
-     curr = scp_list_head;
-     while (curr)
-     {
- 	if (curr->fid == fid)
-         {
-             SCPL_UNLOCK;
-             return curr->scp;
-         }
- 	curr = curr->next;
-     }
-     SCPL_UNLOCK;
-     return NULL;
- }
- 
- /* must call with scp write-locked.  will always return correct results
-    unless network fails (it loops properly). */
- ifs_CheckAcl(cm_scache_t *scp, ULONG access, ULONG *granted)
- {
-     long code;
-     cm_req_t req;
- 
-     cm_InitReq(&req);
- 
-     /* ripped from cm_scache.c */
-     while (1)
-     {
- 	if (cm_HaveAccessRights(scp, userp, access, granted))
-         {
-             return 0;
-         }
- 	else
-         {
-             /* we don't know the required access rights */
-             code = cm_GetAccessRights(scp, userp, &req);
-             MAP_RETURN(code);
-             continue;
-         }
-     }
- 
-     return 0;
- }
- 
- /* extract data from scp.  an ifs_ support function to centralize changes. */
- ifs_CopyInfo(cm_scache_t *scp, ULONG *attribs, LARGE_INTEGER *size,
-               LARGE_INTEGER *creation, LARGE_INTEGER *access,
-               LARGE_INTEGER *change, LARGE_INTEGER *written)
- {
-     access->QuadPart = 0;						/* these mappings are not quite correct.  we can */
-     change->QuadPart = scp->clientModTime;		/* leave them zero, if necessary. */
-     written->QuadPart = scp->clientModTime;
-     creation->QuadPart = scp->serverModTime;
- 
-     *attribs = 0;
-     if (scp->fileType == CM_SCACHETYPE_DIRECTORY ||
-         scp->fileType == CM_SCACHETYPE_SYMLINK ||
- 	scp->fileType == CM_SCACHETYPE_MOUNTPOINT/* ||
- 	scp->fileType == 0*/)
- 	*attribs |= FILE_ATTRIBUTE_DIRECTORY;
- 
-     /*if (!attribs && scp->fileType == CM_SCACHETYPE_FILE)
-     *attribs |= FILE_ATTRIBUTE_NORMAL;*/
- 
-     if (*attribs == FILE_ATTRIBUTE_DIRECTORY)
- 	size->QuadPart = 0;
-     else
- 	*size = scp->length;
- 
-     return 0;
- }
- 
- 
- /* close and zero scp pointer.  zeroing pointer should
-    help eliminate accessing discarded cache entries. */
- void ifs_InternalClose(cm_scache_t **scpp)
- {
-     osi_assert(scpp && *scpp);
- 
-     lock_ObtainMutex(&((*scpp)->mx));
-     cm_ReleaseSCache(*scpp);
- 
-     lock_ReleaseMutex(&((*scpp)->mx));
-     *scpp = NULL;
- }
- 
- /* normalizes path by removing trailing slashes.  separates last
-  * path component with a null, so that *dirp points to parent path
-  * and *filep points to filename.  modifies string path.
-  */
- BOOLEAN ifs_FindComponents(char *path, const char **dirp, const char **filep)
- {
-     char *lastSep;
-     BOOLEAN removed;
-     static char emptyPath[] = "\\";		/* if the path contains only one component, this is the parent. */
- 
-     osi_assert(path);
- 
-     if (strlen(path))
- 	removed = (path[strlen(path)-1] == '\\');
-     else
- 	removed = 1;
- 
-     lastSep = strrchr(path, '\\');
-     while (lastSep == path + strlen(path) - 1)
-     {
- 	*lastSep = '\0';
- 	lastSep = strrchr(path, '\\');
-     }
- 
-     if (lastSep)
-     {
- 	*lastSep = '\0';
- 
- 	*dirp = path;
- 	*filep = lastSep + 1;
-     }
-     else    
-     {
- 	lastSep = path + strlen(path);
- 
- 	*dirp = emptyPath;
- 	*filep = path;
-     }
- 
-     return removed;
- }
- 
- /* here to make maintenance easy */
- unsigned long ifs_ConvertFileName(wchar_t *in, unsigned int inchars, char *out, unsigned int outchars)
- {
-     unsigned long code;
- 
-     code = WideCharToMultiByte(CP_UTF8, 0/*WC_NO_BEST_FIT_CHARS*/, in, inchars, out, outchars-1, NULL, NULL);
-     if (!code)
- 	return IFSL_BADFILENAME;
- 
-     return 0;
- }
- 
- /* called by rpc_ library to let us initialize environment.
-  * call with id of zero to clear current thread auth. */
- ifs_ImpersonateClient(LARGE_INTEGER user_id)
- {
-     int x, empty;
- 
-     if (!user_id.QuadPart)
-     {
- 	userp = NULL;
- 	return 0;
-     }
- 
-     empty = -1;
-     EnterCriticalSection(&mapLock);
-     for (x = 0; x < MAX_AFS_USERS; x++)
-     {
- 	if (user_map[x].id.QuadPart == 0)
-             empty = x;
-  	if (user_map[x].id.QuadPart == user_id.QuadPart)
-             goto done;
-     }
-     if (empty == -1)
-     {
- 	LeaveCriticalSection(&mapLock);
- 	return -1;
-     }
-     user_map[empty].id = user_id;
-     user_map[empty].creds = cm_NewUser();
-     x = empty;
- 
-   done:
-     userp = user_map[x].creds;
-     LeaveCriticalSection(&mapLock);
- 
-     return 0;
- }
- 
- 
- /****************************/
- /* upcalls                  */
- /****************************/
- long uc_namei(WCHAR *name, ULONG *fid)	/* performs name<->fid mapping, and enters it into table */
- {
-     char *buffer;				/* we support semi-infinite path lengths */
-     long code;
-     cm_scache_t *scp, *dscp;
-     char *dirp, *filep;
-     cm_req_t req;
-     scp_status_t *st;
-     short len;
- 
-     cm_InitReq(&req);
- 
-     len = (short)wcslen(name)+20;			/* characters *should* map 1<->1, but in case */
-     buffer = malloc(len);
-     code = ifs_ConvertFileName(name, -1, buffer, len);
-     if (code)
-     {
- 	free(buffer);
- 	MAP_RETURN(code);
-     }
-     ifs_FindComponents(buffer, &dirp, &filep);
- 
-     code = cm_NameI(cm_data.rootSCachep, dirp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp);
-     if (code)
-     {
- 	free(buffer);
- 	MAP_RETURN(code);
-     }
-     if (*filep)
- 	code = cm_Lookup(dscp, filep, 0, userp, &req, &scp);
-     else
- 	cm_HoldSCache(scp = dscp);
-     cm_ReleaseSCache(dscp);
- 
-     if (code)
-     {
- 	free(buffer);
- 	MAP_RETURN(code);
-     }
- 
-     if (ifs_FindScp(FID_HASH_FN(&scp->fid)))
- 	{
- 	osi_assertx(ifs_FindScp(FID_HASH_FN(&scp->fid)) == scp, "uc_namei: same fid hash for two files");
- 	*fid = FID_HASH_FN(&scp->fid);
- 	osi_assert(scp->refCount > 1);
- 	cm_ReleaseSCache(scp);
- 	}
-     else
- 	{
- 	SCPL_LOCK;
- 	st = malloc(sizeof(scp_status_t));
- 	st->scp = scp;
- 	st->fid = FID_HASH_FN(&scp->fid);
- 	st->next = scp_list_head;
- 	scp_list_head = st;
- 	SCPL_UNLOCK;
- 	osi_assert(scp->refCount == 1);
- 	*fid = st->fid;
- 	}
- 
-     free(buffer);
- 
-     return 0;
- }
- 
- /* this should only be called right after open, so we do not need to stat file.
-  * we only check the server's restrictions.  sharing violations are handled in the
-  * kernel. the access mode we grant sticks with the file_object until its death. */
- long uc_check_access(ULONG fid, ULONG access, ULONG *granted)
- {
-     ULONG afs_acc, afs_gr;
-     cm_scache_t *scp;
-     ULONG gr;
-     BOOLEAN file, dir;
- 
-     gr = 0;
-  
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     file = (scp->fileType == CM_SCACHETYPE_FILE);
-     dir = !file;
- 
-     /* access definitions from prs_fs.h */
-     afs_acc = 0;
-     if (access & FILE_READ_DATA)
- 	afs_acc |= PRSFS_READ;
-     if (file && ((access & FILE_WRITE_DATA) || (access & FILE_APPEND_DATA)))
- 	afs_acc |= PRSFS_WRITE;
-     if (access & FILE_WRITE_EA || access & FILE_WRITE_ATTRIBUTES)
- 	afs_acc |= PRSFS_WRITE;
-     if (dir && ((access & FILE_ADD_FILE) || (access & FILE_ADD_SUBDIRECTORY)))
- 	afs_acc |= PRSFS_INSERT;
-     if (dir && (access & FILE_LIST_DIRECTORY))
- 	afs_acc |= PRSFS_LOOKUP;
-     if (access & FILE_READ_EA || access & FILE_READ_ATTRIBUTES)
- 	afs_acc |= PRSFS_LOOKUP;
-     if (file && (access & FILE_EXECUTE))
- 	afs_acc |= PRSFS_WRITE;
-     if (dir && (access & FILE_TRAVERSE))
- 	afs_acc |= PRSFS_READ;
-     if (dir && (access & FILE_DELETE_CHILD))
- 	afs_acc |= PRSFS_DELETE;
-     if ((access & DELETE))
- 	afs_acc |= PRSFS_DELETE;
- 
-     /* check ACL with server */
-     lock_ObtainMutex(&(scp->mx));
-     ifs_CheckAcl(scp, afs_acc, &afs_gr);
-     lock_ReleaseMutex(&(scp->mx));
- 
-     *granted = 0;
-     if (afs_gr & PRSFS_READ)
- 	*granted |= FILE_READ_DATA | FILE_EXECUTE;
-     if (afs_gr & PRSFS_WRITE)
- 	*granted |= FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES | FILE_EXECUTE;
-     if (afs_gr & PRSFS_INSERT)
- 	*granted |= (dir ? FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY : 0) | (file ? FILE_ADD_SUBDIRECTORY : 0);
-     if (afs_gr & PRSFS_LOOKUP)
-  	*granted |= (dir ? FILE_LIST_DIRECTORY : 0) | FILE_READ_EA | FILE_READ_ATTRIBUTES;
-     if (afs_gr & PRSFS_DELETE)
- 	*granted |= FILE_DELETE_CHILD | DELETE;
-     if (afs_gr & PRSFS_LOCK)
-  	*granted |= 0;
-     if (afs_gr & PRSFS_ADMINISTER)
- 	*granted |= 0;
- 
-     * granted |= SYNCHRONIZE | READ_CONTROL;
- 
-     return 0;
- }
- 
- long uc_create(WCHAR *name, ULONG attribs, LARGE_INTEGER alloc, ULONG access, ULONG *granted, ULONG *fid)
- {
-     char *buffer;					/* we support semi-infinite path lengths */
-     long code;
-     cm_scache_t *scp, *dscp;
-     char *dirp, *filep;
-     unsigned char removed;
-     cm_req_t req;
-     scp_status_t *st;
-     cm_attr_t attr;
-     short len;
- 
-     cm_InitReq(&req);
- 
-     len = (short)wcslen(name)+20;			/* characters *should* map 1<->1, but in case */
-     buffer = malloc(len);
-     code = ifs_ConvertFileName(name, -1, buffer, len);
-     if (code)
-     {
- 	free(buffer);
- 	MAP_RETURN(code);
-     }
-     removed = ifs_FindComponents(buffer, &dirp, &filep);
- 
-     /* lookup the parent directory, which must exist */
-     code = cm_NameI(cm_data.rootSCachep, dirp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp);
-     if (code)
-     {
- 	free(buffer);
- 	MAP_RETURN(code);
-     }
- 
-     osi_assert(filep);
-     if (*filep)
-     {
- 	attr.mask = CM_ATTRMASK_LENGTH;
- 	attr.length = alloc;
- 
- 	if (attribs & FILE_ATTRIBUTE_DIRECTORY)
-         {
-             code = cm_MakeDir(dscp, filep, 0, &attr, userp, &req);
-             if (!code)
-                 code = cm_Lookup(dscp, filep, 0, userp, &req, &scp);
-         }
- 	else
- 	    code = cm_Create(dscp, filep, 0, &attr, &scp, userp, &req);
-     }
-     cm_ReleaseSCache(dscp);
- 
-     if (code)
-     {
- 	free(buffer);
- 	MAP_RETURN(code);
-     }
- 
-     SCPL_LOCK;
-     st = malloc(sizeof(scp_status_t));
-     st->scp = scp;
-     st->fid = FID_HASH_FN(&scp->fid);
-     st->next = scp_list_head;
-     scp_list_head = st;
-     SCPL_UNLOCK;
- 
-     *fid = st->fid;
-     *granted = access;
- 
-     free(buffer);
- 
-     return 0;
- }
- 
- /* this does not fill the attribs member completely.  additional flags must
-    be added in the kernel, such as read-only. */
- long uc_stat(ULONG fid, ULONG *attribs, LARGE_INTEGER *size, LARGE_INTEGER *creation,
- 		LARGE_INTEGER *access, LARGE_INTEGER *change, LARGE_INTEGER *written)
- {
-     cm_scache_t *scp;
-     cm_req_t req;
-     ULONG code;
- 
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     /* stat file; don't want callback */
-     cm_InitReq(&req);
-     lock_ObtainMutex(&(scp->mx));
-     cm_HoldUser(userp);
-     code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS);
-     cm_ReleaseUser(userp);
- 
-     if (code)
- 	lock_ReleaseMutex(&(scp->mx));
-     MAP_RETURN(code);
- 
-     code = ifs_CopyInfo(scp, attribs, size, creation, access, change, written);
-     lock_ReleaseMutex(&(scp->mx));
-     MAP_RETURN(code);
- 
-     return 0;
- }
- 
- /* set atime, mtime, etc. */
- long uc_setinfo(ULONG fid, ULONG attribs, LARGE_INTEGER creation, LARGE_INTEGER access,
- 		   LARGE_INTEGER change, LARGE_INTEGER written)
- {
-     return IFSL_GENERIC_FAILURE;
- }
- 
- /* FIXFIX: this code may not catch over-quota errors, because the end
-  * of the file is not written to the server by the time this returns. */
- /* truncate or extend file, in cache and on server */
- long uc_trunc(ULONG fid, LARGE_INTEGER size)
- {
-     ULONG code;
-     cm_scache_t *scp;
-     cm_req_t req;
-     osi_hyper_t oldLen;
- 
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     /* we have already checked permissions in the kernel; but, if we do not
-      * have access as this userp, code will fail in rpc layer.
-      */
- 
-     cm_InitReq(&req);
-     lock_ObtainMutex(&(scp->mx));
- 
-     code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS);
- 
-     if (code)
- 	lock_ReleaseMutex(&(scp->mx));
-     MAP_RETURN(code);
- 
-     oldLen = scp->length;
-     lock_ReleaseMutex(&(scp->mx));
- 
-     code = cm_SetLength(scp, &size, userp, &req);
-     MAP_RETURN(code);
-     /*code = cm_FSync(scp, userp, &req);
-     MAP_RETURN(code);*/
-     /*code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS);
-     MAP_RETURN(code);*/
- 
- #if 0
-     /* attempt to write last byte of file.  fails to bring out quota errors because of delayed writing. */
-     if (oldLen.QuadPart < size.QuadPart)
-     {
- 	writePos.QuadPart = size.QuadPart - 1;
- 	WriteData(scp, writePos, 1, &"\0\0\0", userp, &written);
- 	MAP_RETURN(code);
- 	if (written != 1)
-             return IFSL_UNSPEC;
-     }
- #endif
- 
-     return 0;
- }
- 
- /* read data from a file */
- long uc_read(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *read, char *data)
- {
-     ULONG code;
-     cm_scache_t *scp;
- 
-     *read = 0;
-  
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     if (scp->fileType == CM_SCACHETYPE_DIRECTORY)
- 	return IFSL_IS_A_DIR;
- 
-     code = ReadData(scp, offset, (unsigned long)length, data, userp, read);
-     MAP_RETURN(code);
- 
-     return 0;
- }
- 
- /* FIXFIX: this does not catch all overquota errors, because the file
-  * is not necessarily written to the server when this returns. */
- /* write data to a file */
- long uc_write(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *written, char *data)
- {
-     ULONG code;
-     cm_scache_t *scp;
- 
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     if (offset.QuadPart == -1)
- 	offset = scp->length;
-     code = WriteData(scp, offset, (unsigned long)length, data, userp, written);
-     MAP_RETURN(code);
- 
-     return 0;
- }
- 
- long uc_rename(ULONG fid, WCHAR *curr, WCHAR *new_dir, WCHAR *new_name, ULONG *new_fid)
- {
-     int code;
-     cm_req_t req;
-     char *curdir, *curfile, *newdir, *newfile;
-     cm_scache_t *dscp1, *dscp2, *scp;
-     char b1[MAX_PATH], b2[MAX_PATH], b3[MAX_PATH];
-     wchar_t b3_w[MAX_PATH];
- 
-     code = !(scp = ifs_FindScp(fid));
-     if (!code)
- 	code = ifs_ConvertFileName(curr, -1, b1, MAX_PATH);
-     if (!code)
- 	code = ifs_ConvertFileName(new_name, -1, b2, MAX_PATH);
-     if (!code)
- 	code = ifs_ConvertFileName(new_dir, -1, b3, MAX_PATH);
-     if (!code)
-     {
- 	ifs_FindComponents(b1, &curdir, &curfile);
- 	ifs_FindComponents(b2, &newdir, &newfile);
- 	newdir = b3;
- 	uc_close(fid);
- 	code = cm_NameI(cm_data.rootSCachep, curdir, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp1);
-     }
-     if (!code)
-     {
- 	if (!strcmp(curdir, newdir))
-         {
-             dscp2 = dscp1;
-             dscp1->refCount++;
-         }
- 	else
-             code = cm_NameI(cm_data.rootSCachep, newdir, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp2);
- 	if (!code)
-         {
-             code = cm_Rename(dscp1, curfile, dscp2, newfile, userp, &req);
-             if (!code)
-             {
-                 strcat(b3, "\\");
-                 strcat(b3, b2);
- 		mbstowcs(b3_w, b3, MAX_PATH);
-                 uc_namei(b3_w, new_fid);
-             }
-             else
-             {
-                 code = uc_namei(curr, new_fid);
-             }
-             ifs_InternalClose(&dscp2);
-         }
- 	else
-         {
-             code = uc_namei(curr, new_fid);
-         }
- 	ifs_InternalClose(&dscp1);
-     }
- 
-     MAP_RETURN(code);
-     return 0;
- }
- 
- uc_flush(ULONG fid)
- {
-     ULONG code;
-     cm_scache_t *scp;
-     cm_req_t req;
- 
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     cm_InitReq(&req);
-     code = cm_FSync(scp, userp, &req);
- 
-     MAP_RETURN(code);
-     return 0;
- }
- 
- ifs_ReaddirCallback(cm_scache_t *scp, cm_dirEntry_t *entry, void *param, osi_hyper_t *offset)
- {
-     readdir_context_t *context;
-     ULONG name_len;
-     readdir_data_t *info;
-     char short_name[14], *endp;
-     ULONG code;
-     cm_req_t req;
-     cm_scache_t *child_scp;
-     cm_fid_t child_fid;
-     int t;
- 
-     context = param;
- 
-     name_len = (ULONG) strlen(entry->name);
- 
-     info = (readdir_data_t *)context->buf_pos;
-     if (context->length - (context->buf_pos - context->buf) < sizeof(readdir_data_t) + name_len * sizeof(WCHAR) + sizeof(LARGE_INTEGER))
-     {
- 	if (context->count == 0)
-             return CM_ERROR_BUFFERTOOSMALL;
- 	info->cookie = *offset;
- 	return CM_ERROR_STOPNOW;
-     }
- 
-     if ((context->matchString && context->matchString[0] && (!strcmp(context->matchString, entry->name) || context->matchString[0]=='*')) ||
-          !(context->matchString && context->matchString[0]))
- 	;       
-     else
- 	return 0;
- 
-     cm_InitReq(&req);
-     cm_HoldUser(userp);
-     child_scp = NULL;
- 
-     child_fid.cell = scp->fid.cell;
-     child_fid.volume = scp->fid.volume;
-     child_fid.vnode = ntohl(entry->fid.vnode);
-     child_fid.unique = ntohl(entry->fid.unique);
-     code = cm_GetSCache(&child_fid, &child_scp, userp, &req);
-     if (code || !child_scp)
-     {
- 	cm_ReleaseUser(userp);
- 	return 0;
-     }
- 
-     {
- 	lock_ObtainMutex(&child_scp->mx);
- 	code = cm_SyncOp(child_scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
- 	lock_ReleaseMutex(&child_scp->mx);
-     }
- 
-     if (code)	/* perhaps blank fields we do not know, and continue.  bad filents should not prevent readdirs. */
- 	;
- 
-     info->cookie = *offset;
- 
-     lock_ObtainMutex(&(child_scp->mx));
-     code = ifs_CopyInfo(child_scp, &info->attribs, &info->size, &info->creation, &info->access, &info->change, &info->write);
- #if 0
- 	/* make files we do not have write access to read-only */
- 	/* this is a handy feature, but it takes a lot of time and traffic to enumerate */
-     ifs_CheckAcl(child_scp, FILE_WRITE_DATA, &gr);	/* perhaps add flag to not loop, to avoid network traffic if not found*/
-     if (gr & FILE_READ_DATA && !(gr & FILE_WRITE_DATA))
-     	info->attribs |= FILE_ATTRIBUTE_READONLY;
- #endif
-     lock_ReleaseMutex(&(child_scp->mx));
-     ifs_InternalClose(&child_scp);
-     MAP_RETURN(code);
- 
-     cm_Gen8Dot3Name(entry, short_name, &endp);
-     *endp = '\0';
-     info->short_name_length = (CCHAR)sizeof(WCHAR)*((t=MultiByteToWideChar(CP_UTF8, 0, short_name, -1, info->short_name, 14))?t-1:0);
-     info->name_length = sizeof(WCHAR)*((t=MultiByteToWideChar(CP_UTF8, 0, entry->name, -1, info->name, 600))?t-1:0);
- 
-     context->buf_pos = ((char*)info) + sizeof(readdir_data_t) + info->name_length;
-     context->count++;
- 
-     info = (readdir_data_t *)context->buf_pos;
-     info->cookie.QuadPart = -1;
- 
-     return 0;
- }
- 
- long uc_readdir(ULONG fid, LARGE_INTEGER cookie_in, WCHAR *filter, ULONG *count, char *data, ULONG_PTR *len)
- {
-     ULONG code;
-     char buffer[2048];
-     cm_req_t req;
-     cm_scache_t *scp;
-     readdir_context_t context;
-     LARGE_INTEGER cookie;
- 
-     if (cookie_in.QuadPart == -1)
-     {
- 	*len = 0;
- 	*count = 0;
- 	return 0;
-     }
- 
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
-     code = ifs_ConvertFileName(filter, -1, buffer, 2048);
-     if (code)
- 	return code;
- 
-     cm_InitReq(&req);
-     cm_HoldUser(userp);
- 
-     cookie = cookie_in;
-     context.matchString = buffer;
-     context.buf_pos = context.buf = data;
-     context.length = *len;
-     context.count = 0;
-     *count = 0;
- 
-     ((LARGE_INTEGER *)context.buf)->QuadPart = -1;
- 
-     code = cm_ApplyDir(scp, ifs_ReaddirCallback, &context, &cookie, userp, &req, NULL);
- 
-     context.buf_pos += sizeof(LARGE_INTEGER);
- 
-     *count = context.count;
- 
-     cm_ReleaseUser(userp);
-     *len = context.buf_pos - context.buf;
- 
-     code = ifs_MapCmError(code);
-     return code;
- }
- 
- long uc_close(ULONG fid)
- {
-     cm_scache_t *scp;
-     cm_req_t req;
-     scp_status_t *prev, *curr;
- 
-     scp = ifs_FindScp(fid);
-     if (!scp)
- 	return IFSL_BAD_INPUT;
- 
-     cm_InitReq(&req);
-     cm_FSync(scp, userp, &req);
- 
-     SCPL_LOCK;	/* perhaps this should be earlier */
- 
-     lock_ObtainMutex(&(scp->mx));
-     cm_ReleaseSCache(scp);
-     lock_ReleaseMutex(&(scp->mx));
-  
-     prev = NULL, curr = scp_list_head;
- 
-     while (curr)
-     {
- 	if (curr->fid == fid)
-         {
-             if (prev)
-                 prev->next = curr->next;
-             else
-                 scp_list_head = curr->next;
-             free(curr);
-             break;
-         }
- 	prev = curr;
- 	curr = curr->next;
-     }
- 
-     SCPL_UNLOCK;
- 
-     return 0;
- }
- 
- long uc_unlink(WCHAR *name)
- {
-     char buffer[2048];
-     long code;
-     cm_scache_t *dscp;
-     char *dirp, *filep;
-     unsigned char removed;
-     cm_req_t req;
- 
-     cm_InitReq(&req);
- 
-     code = ifs_ConvertFileName(name, -1, buffer, 2048);
-     MAP_RETURN(code);
-     removed = ifs_FindComponents(buffer, &dirp, &filep);
- 
-     if (!(*filep))
- 	return IFSL_BADFILENAME;
- 
-     code = cm_NameI(cm_data.rootSCachep, dirp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp);
-     MAP_RETURN(code);
- 
-     code = cm_Unlink(dscp, filep, userp, &req);
-     if (code)
- 	code = cm_RemoveDir(dscp, filep, userp, &req);
- 
-     cm_ReleaseSCache(dscp);
-     MAP_RETURN(code);
- 
-     return 0;
- }
- 
- 
- long uc_ioctl_write(ULONG length, char *data, ULONG_PTR *key)
- {
-     smb_ioctl_t *iop;
- 
-     iop = malloc(sizeof(smb_ioctl_t));
-     memset(iop, 0, sizeof(smb_ioctl_t));
-     smb_IoctlPrepareWrite(NULL, iop);
- 
-     memcpy(iop->inDatap + iop->inCopied, data, length);
-     iop->inCopied += length;
-     *key = (ULONG_PTR)iop;
- 
-     return 0;
- }
- 
- long uc_ioctl_read(ULONG_PTR key, ULONG *length, char *data)
- {
-     smb_ioctl_t *iop;
- 
-     iop = (smb_ioctl_t *)key;
-     osi_assert(iop);
- 
-     cm_HoldUser(userp);
-     smb_IoctlPrepareRead(NULL, iop, userp);
-     cm_ReleaseUser(userp);
- 
-     *length = iop->outDatap - iop->outAllocp;
-     memcpy(data, iop->outAllocp, *length);
-     free(iop);
- 
-     return 0;
- }
- 
- int ifs_Init(char **reason)
- {
-     HANDLE kcom;
- 
-     kcom = CreateFile("\\\\.\\afscom\\upcallhook", GENERIC_READ | GENERIC_WRITE,
-                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
-                        0, NULL);
-     if (kcom == INVALID_HANDLE_VALUE)
-     {
- 	*reason = "error creating communications file";
- 	return CM_ERROR_REMOTECONN;
-     }
-     CloseHandle(kcom);
- 
-     memset(user_map, 0, MAX_AFS_USERS*sizeof(struct user_map_entry));
-     InitializeCriticalSection(&mapLock);
-     InitializeCriticalSection(&scp_list_lock);
- 
-     return 0;
- }
- 
- ifs_TransactRpc(char *outbuf, int outlen, char *inbuf, int *inlen)
- {
-     HANDLE hf;
-     DWORD read = 0;
-     DWORD inmax;
- 
-     if (!outbuf || !inbuf)
- 	return IFSL_GENERIC_FAILURE;
- 
-     hf = CreateFile("\\\\.\\afscom\\downcall", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
-     if (hf == INVALID_HANDLE_VALUE)
- 	return 0;
- 
-     inmax = *inlen;
-     if (!DeviceIoControl(hf, IOCTL_AFSRDR_DOWNCALL, outbuf, outlen, inbuf, inmax, inlen, NULL))
-     {
- 	CloseHandle(hf);
- 	return IFSL_GENERIC_FAILURE;
-     }
- 
-     CloseHandle(hf);
-     return inlen ? IFSL_SUCCESS : IFSL_GENERIC_FAILURE;
- }
- 
- 
- DWORD WINAPI ifs_MainLoop(LPVOID param)
- {
-     HANDLE pipe;
-     DWORD written;
-     unsigned char *bufIn, *bufOut;
-     DWORD lenIn;
-     rpc_t rpc;
-     BOOL st;
- 
-     bufIn = VirtualAlloc(NULL, TRANSFER_BUF_SIZE, MEM_COMMIT, PAGE_READWRITE);
-     bufOut = VirtualAlloc(NULL, TRANSFER_BUF_SIZE, MEM_COMMIT, PAGE_READWRITE);
-     if (!bufIn || !bufOut)
-     {
- 	if (bufIn) VirtualFree(bufIn, 0, MEM_RELEASE);
- 	if (bufOut) VirtualFree(bufOut, 0, MEM_RELEASE);
- 	osi_panic("ifs: allocate transfer buffers", __FILE__, __LINE__);
-     }
- 
-     pipe = CreateFile("\\\\.\\afscom\\upcallhook", GENERIC_READ | GENERIC_WRITE,
-                        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
-                        0, NULL);
-     if (pipe == INVALID_HANDLE_VALUE)
-     {
- 	VirtualFree(bufIn, 0, MEM_RELEASE);
- 	VirtualFree(bufOut, 0, MEM_RELEASE);
- 	osi_panic("ifs: creating communications handle", __FILE__, __LINE__);
-     }
- 
-     while (1)
-     {
- 	/* just check if the event is already signalled, do not wait */
- 	if (WaitForSingleObject(WaitToTerminate, 0) == WAIT_OBJECT_0)
- 	    break;
- 
- 	/* read request... */
- 	st = ReadFile(pipe, bufIn, TRANSFER_BUF_SIZE, &lenIn, NULL);
- 	if (!st) {
- 	if (GetLastError() == ERROR_INVALID_HANDLE)
- 		break;
- 	else
- 		continue;
-         }
- 
- 	ZeroMemory(&rpc, sizeof(rpc));
- 	rpc.in_buf = rpc.in_pos = bufIn;
- 	rpc.out_buf = rpc.out_pos = bufOut;
- 
- 	/* ...process it... */
- 	rpc_parse(&rpc);
- 
- 	/* ...and write it back */
- 	st = WriteFile(pipe, rpc.out_buf, rpc.out_pos - rpc.out_buf, &written, NULL);
- 	if (!st)
- 	    if (GetLastError() == ERROR_INVALID_HANDLE)
- 		break;
- 	    else
- 		continue;
-     }
- 
-     return (DWORD)1;
- }
--- 0 ----
Index: openafs/src/WINNT/afsd/afsdifs.h
diff -c openafs/src/WINNT/afsd/afsdifs.h:1.1 openafs/src/WINNT/afsd/afsdifs.h:removed
*** openafs/src/WINNT/afsd/afsdifs.h:1.1	Wed Jun 15 12:51:45 2005
--- openafs/src/WINNT/afsd/afsdifs.h	Sat Mar 22 21:01:32 2008
***************
*** 1,33 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- int ifs_Init(char **reason);
- DWORD WINAPI ifs_MainLoop(LPVOID);
- 
- 
- long ReadData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op,
- 	cm_user_t *userp, long *readp);
- long WriteData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op,
- 	cm_user_t *userp, long *readp);
--- 0 ----
Index: openafs/src/WINNT/afsd/cm.h
diff -c openafs/src/WINNT/afsd/cm.h:1.17.2.11 openafs/src/WINNT/afsd/cm.h:1.17.2.13
*** openafs/src/WINNT/afsd/cm.h:1.17.2.11	Fri Feb  8 21:32:19 2008
--- openafs/src/WINNT/afsd/cm.h	Thu Mar 13 00:39:17 2008
***************
*** 90,97 ****
  #define CM_ERROR_BPLUS_NOMATCH          (CM_ERROR_BASE+55)
  #define CM_ERROR_EAS_NOT_SUPPORTED      (CM_ERROR_BASE+56)
  #define CM_ERROR_RANGE_NOT_LOCKED       (CM_ERROR_BASE+57)
  
! /* Used by cm_FollowMountPoint and cm_GetVolumeByName */
  #define RWVOL	0
  #define ROVOL	1
  #define BACKVOL	2
--- 90,99 ----
  #define CM_ERROR_BPLUS_NOMATCH          (CM_ERROR_BASE+55)
  #define CM_ERROR_EAS_NOT_SUPPORTED      (CM_ERROR_BASE+56)
  #define CM_ERROR_RANGE_NOT_LOCKED       (CM_ERROR_BASE+57)
+ #define CM_ERROR_NOSUCHDEVICE           (CM_ERROR_BASE+58)
+ #define CM_ERROR_LOCK_NOT_GRANTED       (CM_ERROR_BASE+59)
  
! /* Used by cm_FollowMountPoint and cm_FindVolumeByName */
  #define RWVOL	0
  #define ROVOL	1
  #define BACKVOL	2
Index: openafs/src/WINNT/afsd/cm_access.c
diff -c openafs/src/WINNT/afsd/cm_access.c:1.7.2.17 openafs/src/WINNT/afsd/cm_access.c:1.7.2.18
*** openafs/src/WINNT/afsd/cm_access.c:1.7.2.17	Sun Feb 24 01:28:57 2008
--- openafs/src/WINNT/afsd/cm_access.c	Sun Mar  2 23:25:40 2008
***************
*** 59,65 ****
          if (!aclScp) 
              return 0;
          if (aclScp != scp) {
!             code = lock_TryMutex(&aclScp->mx);
              if (code == 0) {
                  /* can't get lock safely and easily */
                  cm_ReleaseSCache(aclScp);
--- 59,65 ----
          if (!aclScp) 
              return 0;
          if (aclScp != scp) {
!             code = lock_TryRead(&aclScp->rw);
              if (code == 0) {
                  /* can't get lock safely and easily */
                  cm_ReleaseSCache(aclScp);
***************
*** 69,75 ****
  	    /* check that we have a callback, too */
              if (!cm_HaveCallback(aclScp)) {
                  /* can't use it */
!                 lock_ReleaseMutex(&aclScp->mx);
                  cm_ReleaseSCache(aclScp);
                  return 0;
              }
--- 69,75 ----
  	    /* check that we have a callback, too */
              if (!cm_HaveCallback(aclScp)) {
                  /* can't use it */
!                 lock_ReleaseRead(&aclScp->rw);
                  cm_ReleaseSCache(aclScp);
                  return 0;
              }
***************
*** 78,84 ****
          release = 1;
      }
  
!     lock_AssertMutex(&aclScp->mx);
          
      /* now if rights is a subset of the public rights, we're done.
       * Otherwise, if we an explicit acl entry, we're also in good shape,
--- 78,84 ----
          release = 1;
      }
  
!     lock_AssertAny(&aclScp->rw);
          
      /* now if rights is a subset of the public rights, we're done.
       * Otherwise, if we an explicit acl entry, we're also in good shape,
***************
*** 139,145 ****
  
    done:
      if (didLock) 
!         lock_ReleaseMutex(&aclScp->mx);
      if (release)
          cm_ReleaseSCache(aclScp);
      return code;
--- 139,145 ----
  
    done:
      if (didLock) 
!         lock_ReleaseRead(&aclScp->rw);
      if (release)
          cm_ReleaseSCache(aclScp);
      return code;
***************
*** 175,197 ****
      } else {
          /* not a dir, use parent dir's acl */
          cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, scp->parentVnode, scp->parentUnique);
!         lock_ReleaseMutex(&scp->mx);
          code = cm_GetSCache(&tfid, &aclScp, userp, reqp);
          if (code) {
!             lock_ObtainMutex(&scp->mx);
  	    goto _done;
          }       
                  
          osi_Log2(afsd_logp, "GetAccess parent scp %x user %x", aclScp, userp);
! 	lock_ObtainMutex(&aclScp->mx);
  	code = cm_SyncOp(aclScp, NULL, userp, reqp, 0,
  			 CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_FORCECB);
  	if (!code)
  	    cm_SyncOpDone(aclScp, NULL, 
  			  CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
! 	lock_ReleaseMutex(&aclScp->mx);
          cm_ReleaseSCache(aclScp);
!         lock_ObtainMutex(&scp->mx);
      }
  
    _done:
--- 175,197 ----
      } else {
          /* not a dir, use parent dir's acl */
          cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, scp->parentVnode, scp->parentUnique);
!         lock_ReleaseWrite(&scp->rw);
          code = cm_GetSCache(&tfid, &aclScp, userp, reqp);
          if (code) {
!             lock_ObtainWrite(&scp->rw);
  	    goto _done;
          }       
                  
          osi_Log2(afsd_logp, "GetAccess parent scp %x user %x", aclScp, userp);
! 	lock_ObtainWrite(&aclScp->rw);
  	code = cm_SyncOp(aclScp, NULL, userp, reqp, 0,
  			 CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_FORCECB);
  	if (!code)
  	    cm_SyncOpDone(aclScp, NULL, 
  			  CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
! 	lock_ReleaseWrite(&aclScp->rw);
          cm_ReleaseSCache(aclScp);
!         lock_ObtainWrite(&scp->rw);
      }
  
    _done:
Index: openafs/src/WINNT/afsd/cm_aclent.c
diff -c openafs/src/WINNT/afsd/cm_aclent.c:1.14.2.3 openafs/src/WINNT/afsd/cm_aclent.c:1.14.2.4
*** openafs/src/WINNT/afsd/cm_aclent.c:1.14.2.3	Tue Feb  5 12:11:45 2008
--- openafs/src/WINNT/afsd/cm_aclent.c	Sun Mar  2 23:25:40 2008
***************
*** 41,47 ****
              /* 
               * Remove the entry from the vnode's list 
               */
!             lock_AssertMutex(&aclp->backp->mx);
              laclpp = &aclp->backp->randomACLp;
              for (taclp = *laclpp; taclp; laclpp = &taclp->nextp, taclp = *laclpp) {
                  if (taclp == aclp) 
--- 41,47 ----
              /* 
               * Remove the entry from the vnode's list 
               */
!             lock_AssertWrite(&aclp->backp->rw);
              laclpp = &aclp->backp->randomACLp;
              for (taclp = *laclpp; taclp; laclpp = &taclp->nextp, taclp = *laclpp) {
                  if (taclp == aclp) 
***************
*** 129,141 ****
      if (aclp->backp && scp != aclp->backp) {
          ascp = aclp->backp;
          lock_ReleaseWrite(&cm_aclLock);
!         lock_ObtainMutex(&ascp->mx);
          lock_ObtainWrite(&cm_aclLock);
      }
      CleanupACLEnt(aclp);
  
      if (ascp)
!         lock_ReleaseMutex(&ascp->mx);
      return aclp;
  }
  
--- 129,141 ----
      if (aclp->backp && scp != aclp->backp) {
          ascp = aclp->backp;
          lock_ReleaseWrite(&cm_aclLock);
!         lock_ObtainWrite(&ascp->rw);
          lock_ObtainWrite(&cm_aclLock);
      }
      CleanupACLEnt(aclp);
  
      if (ascp)
!         lock_ReleaseWrite(&ascp->rw);
      return aclp;
  }
  
Index: openafs/src/WINNT/afsd/cm_buf.c
diff -c openafs/src/WINNT/afsd/cm_buf.c:1.31.2.28 openafs/src/WINNT/afsd/cm_buf.c:1.31.2.36
*** openafs/src/WINNT/afsd/cm_buf.c:1.31.2.28	Sat Feb 23 16:14:19 2008
--- openafs/src/WINNT/afsd/cm_buf.c	Thu Mar  6 20:14:13 2008
***************
*** 130,139 ****
           * double check that the refCount is actually zero
           * before we remove the buffer from the LRU queue.
           */
!         if (!writeLocked) {
!             lock_ReleaseRead(&buf_globalLock);
!             lock_ObtainWrite(&buf_globalLock);
!         }
  
          if (bp->refCount == 0 &&
              !(bp->flags & CM_BUF_INLRU)) {
--- 130,137 ----
           * double check that the refCount is actually zero
           * before we remove the buffer from the LRU queue.
           */
!         if (!writeLocked)
!             lock_ConvertRToW(&buf_globalLock);
  
          if (bp->refCount == 0 &&
              !(bp->flags & CM_BUF_INLRU)) {
***************
*** 145,154 ****
              bp->flags |= CM_BUF_INLRU;
          }
  
!         if (!writeLocked) {
!             lock_ReleaseWrite(&buf_globalLock);
!             lock_ObtainRead(&buf_globalLock);
!         }
      }
  }       
  
--- 143,150 ----
              bp->flags |= CM_BUF_INLRU;
          }
  
!         if (!writeLocked)
!             lock_ConvertWToR(&buf_globalLock);
      }
  }       
  
***************
*** 204,214 ****
  
          /* now go through our percentage of the buffers */
          for (bpp = &cm_data.buf_dirtyListp; bp = *bpp; ) {
- 
  	    /* all dirty buffers are held when they are added to the
  	     * dirty list.  No need for an additional hold.
  	     */
! 
  	    if (bp->flags & CM_BUF_DIRTY) {
  		/* start cleaning the buffer; don't touch log pages since
   		 * the log code counts on knowing exactly who is writing
--- 200,209 ----
  
          /* now go through our percentage of the buffers */
          for (bpp = &cm_data.buf_dirtyListp; bp = *bpp; ) {
  	    /* all dirty buffers are held when they are added to the
  	     * dirty list.  No need for an additional hold.
  	     */
!             lock_ObtainMutex(&bp->mx);
  	    if (bp->flags & CM_BUF_DIRTY) {
  		/* start cleaning the buffer; don't touch log pages since
   		 * the log code counts on knowing exactly who is writing
***************
*** 216,248 ****
  		 */
  		cm_InitReq(&req);
  		req.flags |= CM_REQ_NORETRY;
! 		wasDirty |= buf_CleanAsync(bp, &req);
  	    }
  
  	    /* the buffer may or may not have been dirty
  	     * and if dirty may or may not have been cleaned
  	     * successfully.  check the dirty flag again.  
  	     */
! 	    if (!(bp->flags & CM_BUF_DIRTY)) {
! 		lock_ObtainMutex(&bp->mx);
! 		if (!(bp->flags & CM_BUF_DIRTY)) {
! 		    /* remove the buffer from the dirty list */
! 		    lock_ObtainWrite(&buf_globalLock);
! 		    *bpp = bp->dirtyp;
! 		    bp->dirtyp = NULL;
! 		    if (cm_data.buf_dirtyListp == NULL)
! 			cm_data.buf_dirtyListEndp = NULL;
! 		    buf_ReleaseLocked(bp, TRUE);
! 		    lock_ReleaseWrite(&buf_globalLock);
! 		} else {
! 		    /* advance the pointer so we don't loop forever */
! 		    bpp = &bp->dirtyp;
! 		}
! 		lock_ReleaseMutex(&bp->mx);
! 	    } else {
! 		/* advance the pointer so we don't loop forever */
! 		bpp = &bp->dirtyp;
! 	    }
          }	/* for loop over a bunch of buffers */
      }		/* whole daemon's while loop */
  }
--- 211,237 ----
  		 */
  		cm_InitReq(&req);
  		req.flags |= CM_REQ_NORETRY;
! 		wasDirty |= buf_CleanAsyncLocked(bp, &req);
  	    }
  
  	    /* the buffer may or may not have been dirty
  	     * and if dirty may or may not have been cleaned
  	     * successfully.  check the dirty flag again.  
  	     */
!             if (!(bp->flags & CM_BUF_DIRTY)) {
!                 /* remove the buffer from the dirty list */
!                 lock_ObtainWrite(&buf_globalLock);
!                 *bpp = bp->dirtyp;
!                 bp->dirtyp = NULL;
!                 if (cm_data.buf_dirtyListp == NULL)
!                     cm_data.buf_dirtyListEndp = NULL;
!                 buf_ReleaseLocked(bp, TRUE);
!                 lock_ReleaseWrite(&buf_globalLock);
!             } else {
!                 /* advance the pointer so we don't loop forever */
!                 bpp = &bp->dirtyp;
!             }
!             lock_ReleaseMutex(&bp->mx);
          }	/* for loop over a bunch of buffers */
      }		/* whole daemon's while loop */
  }
***************
*** 571,582 ****
  		 release = 1;
          }
          if ( scp ) {
!             lock_ObtainMutex(&scp->mx);
              if (scp->flags & CM_SCACHEFLAG_WAITING) {
                  osi_Log1(buf_logp, "buf_WaitIO waking scp 0x%p", scp);
                  osi_Wakeup((LONG_PTR)&scp->flags);
              }
! 	    lock_ReleaseMutex(&scp->mx);
          }
      }
          
--- 560,571 ----
  		 release = 1;
          }
          if ( scp ) {
!             lock_ObtainRead(&scp->rw);
              if (scp->flags & CM_SCACHEFLAG_WAITING) {
                  osi_Log1(buf_logp, "buf_WaitIO waking scp 0x%p", scp);
                  osi_Wakeup((LONG_PTR)&scp->flags);
              }
! 	    lock_ReleaseRead(&scp->rw);
          }
      }
          
***************
*** 657,663 ****
  
              offset = bp->offset;
              LargeIntegerAdd(offset, ConvertLongToLargeInteger(bp->dirty_offset));
! 	    code = (*cm_buf_opsp->Writep)(scp, &offset, bp->dirty_length, 0, bp->userp, reqp);
  	    osi_Log3(buf_logp, "buf_CleanAsyncLocked I/O on scp 0x%p buf 0x%p, done=%d", scp, bp, code);
  
  	    cm_ReleaseSCache(scp);
--- 646,661 ----
  
              offset = bp->offset;
              LargeIntegerAdd(offset, ConvertLongToLargeInteger(bp->dirty_offset));
! 	    code = (*cm_buf_opsp->Writep)(scp, &offset, 
! #if 1
!                                            /* we might as well try to write all of the contiguous 
!                                             * dirty buffers in one RPC 
!                                             */
!                                            cm_chunkSize,
! #else
!                                           bp->dirty_length, 
! #endif
!                                           0, bp->userp, reqp);
  	    osi_Log3(buf_logp, "buf_CleanAsyncLocked I/O on scp 0x%p buf 0x%p, done=%d", scp, bp, code);
  
  	    cm_ReleaseSCache(scp);
***************
*** 678,684 ****
              bp->dirty_offset = 0;
              bp->dirty_length = 0;
  	    bp->error = code;
! 	    bp->dataVersion = -1; /* bad */
  	    bp->dirtyCounter++;
  	}
  
--- 676,682 ----
              bp->dirty_offset = 0;
              bp->dirty_length = 0;
  	    bp->error = code;
! 	    bp->dataVersion = CM_BUF_VERSION_BAD; /* bad */
  	    bp->dirtyCounter++;
  	}
  
***************
*** 775,786 ****
          bp->flags &= ~CM_BUF_INHASH;
      }
  
-     /* bump the soft reference counter now, to invalidate softRefs; no
-      * wakeup is required since people don't sleep waiting for this
-      * counter to change.
-      */
-     bp->idCounter++;
- 
      /* make the fid unrecognizable */
      memset(&bp->fid, 0, sizeof(cm_fid_t));
  }       
--- 773,778 ----
***************
*** 914,920 ****
  
              /* clean up junk flags */
              bp->flags &= ~(CM_BUF_EOF | CM_BUF_ERROR);
!             bp->dataVersion = -1;	/* unknown so far */
  
              /* now hash in as our new buffer, and give it the
               * appropriate label, if requested.
--- 906,912 ----
  
              /* clean up junk flags */
              bp->flags &= ~(CM_BUF_EOF | CM_BUF_ERROR);
!             bp->dataVersion = CM_BUF_VERSION_BAD;	/* unknown so far */
  
              /* now hash in as our new buffer, and give it the
               * appropriate label, if requested.
***************
*** 1196,1202 ****
           * has been invalidate (by having its DV stomped upon), then
           * count it as free, since it isn't really being utilized.
           */
!         if (!(bufp->flags & CM_BUF_INHASH) || bufp->dataVersion <= 0)
              count++;
      }       
      lock_ReleaseRead(&buf_globalLock);
--- 1188,1194 ----
           * has been invalidate (by having its DV stomped upon), then
           * count it as free, since it isn't really being utilized.
           */
!         if (!(bufp->flags & CM_BUF_INHASH) || bufp->dataVersion == CM_BUF_VERSION_BAD)
              count++;
      }       
      lock_ReleaseRead(&buf_globalLock);
***************
*** 1217,1231 ****
  }       
  
  /* wait for a buffer's cleaning to finish */
! void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp)
  {
      osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic");
  
!     lock_ObtainMutex(&bp->mx);
      if (bp->flags & CM_BUF_WRITING) {
          buf_WaitIO(scp, bp);
      }
!     lock_ReleaseMutex(&bp->mx);
  }       
  
  /* set the dirty flag on a buffer, and set associated write-ahead log,
--- 1209,1225 ----
  }       
  
  /* wait for a buffer's cleaning to finish */
! void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp, afs_uint32 locked)
  {
      osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic");
  
!     if (!locked)
!         lock_ObtainMutex(&bp->mx);
      if (bp->flags & CM_BUF_WRITING) {
          buf_WaitIO(scp, bp);
      }
!     if (!locked)
!         lock_ReleaseMutex(&bp->mx);
  }       
  
  /* set the dirty flag on a buffer, and set associated write-ahead log,
***************
*** 1331,1337 ****
  		req.flags |= CM_REQ_NORETRY;
  
  		buf_CleanAsync(bp, &req);
! 		buf_CleanWait(NULL, bp);
  
                  /* relock and release buffer */
                  lock_ObtainRead(&buf_globalLock);
--- 1325,1331 ----
  		req.flags |= CM_REQ_NORETRY;
  
  		buf_CleanAsync(bp, &req);
! 		buf_CleanWait(NULL, bp, FALSE);
  
                  /* relock and release buffer */
                  lock_ObtainRead(&buf_globalLock);
***************
*** 1442,1448 ****
               LargeIntegerLessThan(*sizep, bufEnd)) {
              buf_WaitIO(scp, bufp);
          }
!         lock_ObtainMutex(&scp->mx);
  	
          /* make sure we have a callback (so we have the right value for
           * the length), and wait for it to be safe to do a truncate.
--- 1436,1442 ----
               LargeIntegerLessThan(*sizep, bufEnd)) {
              buf_WaitIO(scp, bufp);
          }
!         lock_ObtainWrite(&scp->rw);
  	
          /* make sure we have a callback (so we have the right value for
           * the length), and wait for it to be safe to do a truncate.
***************
*** 1472,1478 ****
                  bufp->flags &= ~CM_BUF_DIRTY;
                  bufp->dirty_offset = 0;
                  bufp->dirty_length = 0;
!                 bufp->dataVersion = -1;	/* known bad */
                  bufp->dirtyCounter++;
              }
              else {
--- 1466,1472 ----
                  bufp->flags &= ~CM_BUF_DIRTY;
                  bufp->dirty_offset = 0;
                  bufp->dirty_length = 0;
!                 bufp->dataVersion = CM_BUF_VERSION_BAD;	/* known bad */
                  bufp->dirtyCounter++;
              }
              else {
***************
*** 1495,1501 ****
  		       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS
  		       | CM_SCACHESYNC_SETSIZE | CM_SCACHESYNC_BUFLOCKED);
  
!         lock_ReleaseMutex(&scp->mx);
          lock_ReleaseMutex(&bufp->mx);
      
  	if (!code) {
--- 1489,1495 ----
  		       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS
  		       | CM_SCACHESYNC_SETSIZE | CM_SCACHESYNC_BUFLOCKED);
  
!         lock_ReleaseWrite(&scp->rw);
          lock_ReleaseMutex(&bufp->mx);
      
  	if (!code) {
***************
*** 1552,1570 ****
              if (code && code != CM_ERROR_BADFD) 
                  goto skip;
  
! 	    /* if the scp's FID is bad its because we received VNOVNODE 
! 	     * when attempting to FetchStatus before the write.  This
! 	     * page therefore contains data that can no longer be stored.
! 	     */
! 	    lock_ObtainMutex(&bp->mx);
! 	    bp->flags &= ~CM_BUF_DIRTY;
! 	    bp->flags |= CM_BUF_ERROR;
! 	    bp->error = code;
!             bp->dirty_offset = 0;
!             bp->dirty_length = 0;
!             bp->dataVersion = -1;	/* known bad */
!             bp->dirtyCounter++;
! 	    lock_ReleaseMutex(&bp->mx);
  
              /* actually, we only know that buffer is clean if ref
               * count is 1, since we don't have buffer itself locked.
--- 1546,1566 ----
              if (code && code != CM_ERROR_BADFD) 
                  goto skip;
  
!             if (code == CM_ERROR_BADFD) {
!                 /* if the scp's FID is bad its because we received VNOVNODE 
!                  * when attempting to FetchStatus before the write.  This
!                  * page therefore contains data that can no longer be stored.
!                  */
!                 lock_ObtainMutex(&bp->mx);
!                 bp->flags &= ~CM_BUF_DIRTY;
!                 bp->flags |= CM_BUF_ERROR;
!                 bp->error = CM_ERROR_BADFD;
!                 bp->dirty_offset = 0;
!                 bp->dirty_length = 0;
!                 bp->dataVersion = CM_BUF_VERSION_BAD;	/* known bad */
!                 bp->dirtyCounter++;
!                 lock_ReleaseMutex(&bp->mx);
!             }
  
              /* actually, we only know that buffer is clean if ref
               * count is 1, since we don't have buffer itself locked.
***************
*** 1582,1588 ****
                  lock_ReleaseWrite(&buf_globalLock);
              }
  
! 	    if (code != CM_ERROR_BADFD)
  		(*cm_buf_opsp->Unstabilizep)(scp, userp);
          }
  
--- 1578,1584 ----
                  lock_ReleaseWrite(&buf_globalLock);
              }
  
! 	    if (code == 0)
  		(*cm_buf_opsp->Unstabilizep)(scp, userp);
          }
  
***************
*** 1605,1618 ****
      return code;
  }       
  
! /* Must be called with scp->mx held */
  long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion)
  {
      cm_buf_t * bp;
      afs_uint32 i;
      int found = 0;
  
!     lock_AssertMutex(&scp->mx);
  
      i = BUF_FILEHASH(&scp->fid);
  
--- 1601,1614 ----
      return code;
  }       
  
! /* Must be called with scp->rw held */
  long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion)
  {
      cm_buf_t * bp;
      afs_uint32 i;
      int found = 0;
  
!     lock_AssertAny(&scp->rw);
  
      i = BUF_FILEHASH(&scp->fid);
  
***************
*** 1652,1672 ****
      for (; bp; bp = nbp) {
          /* clean buffer synchronously */
          if (cm_FidCmp(&bp->fid, &scp->fid) == 0) {
-             if (userp) {
-                 cm_HoldUser(userp);
-                 lock_ObtainMutex(&bp->mx);
-                 if (bp->userp) 
-                     cm_ReleaseUser(bp->userp);
-                 bp->userp = userp;
-                 lock_ReleaseMutex(&bp->mx);
-             }   
-             wasDirty = buf_CleanAsync(bp, reqp);
- 	    buf_CleanWait(scp, bp);
              lock_ObtainMutex(&bp->mx);
!             if (bp->flags & CM_BUF_ERROR) {
! 		code = bp->error;
!                 if (code == 0) 
!                     code = -1;
              }
              lock_ReleaseMutex(&bp->mx);
          }
--- 1648,1668 ----
      for (; bp; bp = nbp) {
          /* clean buffer synchronously */
          if (cm_FidCmp(&bp->fid, &scp->fid) == 0) {
              lock_ObtainMutex(&bp->mx);
!             if (bp->flags & CM_BUF_DIRTY) {
!                 if (userp) {
!                     cm_HoldUser(userp);
!                     if (bp->userp) 
!                         cm_ReleaseUser(bp->userp);
!                     bp->userp = userp;
!                 }   
!                 wasDirty = buf_CleanAsyncLocked(bp, reqp);
!                 buf_CleanWait(scp, bp, TRUE);
!                 if (bp->flags & CM_BUF_ERROR) {
!                     code = bp->error;
!                     if (code == 0) 
!                         code = -1;
!                 }
              }
              lock_ReleaseMutex(&bp->mx);
          }
***************
*** 1853,1859 ****
              bp->dirty_length = 0;
  	    bp->flags |= CM_BUF_ERROR;
  	    bp->error = VNOVNODE;
! 	    bp->dataVersion = -1; /* bad */
  	    bp->dirtyCounter++;
  	    if (bp->flags & CM_BUF_WAITING) {
  		osi_Log2(buf_logp, "BUF CleanDirtyBuffers Waking [scp 0x%x] bp 0x%x", scp, bp);
--- 1849,1855 ----
              bp->dirty_length = 0;
  	    bp->flags |= CM_BUF_ERROR;
  	    bp->error = VNOVNODE;
! 	    bp->dataVersion = CM_BUF_VERSION_BAD; /* bad */
  	    bp->dirtyCounter++;
  	    if (bp->flags & CM_BUF_WAITING) {
  		osi_Log2(buf_logp, "BUF CleanDirtyBuffers Waking [scp 0x%x] bp 0x%x", scp, bp);
Index: openafs/src/WINNT/afsd/cm_buf.h
diff -c openafs/src/WINNT/afsd/cm_buf.h:1.12.4.10 openafs/src/WINNT/afsd/cm_buf.h:1.12.4.13
*** openafs/src/WINNT/afsd/cm_buf.h:1.12.4.10	Sat Feb 23 02:30:18 2008
--- openafs/src/WINNT/afsd/cm_buf.h	Sun Mar  2 16:56:18 2008
***************
*** 23,31 ****
  /* default buffer size */
  #define CM_BUF_BLOCKSIZE CM_CONFIGDEFAULT_BLOCKSIZE
  
- /* default hash size */
- #define CM_BUF_HASHSIZE	1024
- 
  /* cache type */
  #define CM_BUF_CACHETYPE_FILE 1
  #define CM_BUF_CACHETYPE_VIRTUAL 2
--- 23,28 ----
***************
*** 39,49 ****
  /* another hash fn */
  #define BUF_FILEHASH(fidp) ((fidp)->hash % cm_data.buf_hashSize)
  
- /* backup over pointer to the buffer */
- #define BUF_OVERTOBUF(op) ((cm_buf_t *)(((char *)op) - ((long)(&((cm_buf_t *)0)->over))))
- 
  #define CM_BUF_MAGIC    ('B' | 'U' <<8 | 'F'<<16 | 'F'<<24)
  
  /* represents a single buffer */
  typedef struct cm_buf {
      osi_queue_t q;		/* queue of all zero-refcount buffers */
--- 36,45 ----
  /* another hash fn */
  #define BUF_FILEHASH(fidp) ((fidp)->hash % cm_data.buf_hashSize)
  
  #define CM_BUF_MAGIC    ('B' | 'U' <<8 | 'F'<<16 | 'F'<<24)
  
+ #define CM_BUF_VERSION_BAD 0xFFFFFFFFFFFFFFFF
+ 
  /* represents a single buffer */
  typedef struct cm_buf {
      osi_queue_t q;		/* queue of all zero-refcount buffers */
***************
*** 63,75 ****
      struct cm_buf *dirtyp;	/* next in the dirty list */
      osi_mutex_t mx;		/* mutex protecting structure except refcount */
      afs_int32 refCount;	        /* reference count (buf_globalLock) */
!     long idCounter;		/* counter for softrefs; bumped at each recycle */
!     long dirtyCounter;	        /* bumped at each dirty->clean transition */
      osi_hyper_t offset;	        /* offset */
      cm_fid_t fid;		/* file ID */
      afs_uint32 flags;		/* flags we're using */
      char *datap;		/* data in this buffer */
!     unsigned long error;	/* last error code, if CM_BUF_ERROR is set */
      cm_user_t *userp;	        /* user who wrote to the buffer last */
          
      /* fields added for the CM; locked by scp->mx */
--- 59,70 ----
      struct cm_buf *dirtyp;	/* next in the dirty list */
      osi_mutex_t mx;		/* mutex protecting structure except refcount */
      afs_int32 refCount;	        /* reference count (buf_globalLock) */
!     afs_uint32 dirtyCounter;	/* bumped at each dirty->clean transition */
      osi_hyper_t offset;	        /* offset */
      cm_fid_t fid;		/* file ID */
      afs_uint32 flags;		/* flags we're using */
      char *datap;		/* data in this buffer */
!     afs_uint32 error;	        /* last error code, if CM_BUF_ERROR is set */
      cm_user_t *userp;	        /* user who wrote to the buffer last */
          
      /* fields added for the CM; locked by scp->mx */
***************
*** 102,122 ****
  /* waiting is done based on scp->flags.  Removing bits from cmFlags
     should be followed by waking the scp. */
  
- /* represents soft reference which is OK to lose on a recycle */
- typedef struct cm_softRef {
-     cm_buf_t *bufp;	/* buffer (may get reused) */
-     long counter;		/* counter of changes to identity */
- } cm_softRef_t;
- 
  #define CM_BUF_READING	1	/* now reading buffer from the disk */
  #define CM_BUF_WRITING	2	/* now writing buffer to the disk */
  #define CM_BUF_INHASH	4	/* in the hash table */
! #define CM_BUF_DIRTY		8	/* buffer is dirty */
! #define CM_BUF_INLRU		0x10	/* in lru queue */
! #define CM_BUF_ERROR		0x20	/* something went wrong on delayed write */
  #define CM_BUF_WAITING	0x40	/* someone's waiting for a flag to change */
! #define CM_BUF_EVWAIT	0x80	/* someone's waiting for the buffer event */
! #define CM_BUF_EOF		0x100	/* read 0 bytes; used for detecting EOF */
  
  typedef struct cm_buf_ops {
      long (*Writep)(void *, osi_hyper_t *, long, long, struct cm_user *,
--- 97,111 ----
  /* waiting is done based on scp->flags.  Removing bits from cmFlags
     should be followed by waking the scp. */
  
  #define CM_BUF_READING	1	/* now reading buffer from the disk */
  #define CM_BUF_WRITING	2	/* now writing buffer to the disk */
  #define CM_BUF_INHASH	4	/* in the hash table */
! #define CM_BUF_DIRTY	8	/* buffer is dirty */
! #define CM_BUF_INLRU	0x10	/* in lru queue */
! #define CM_BUF_ERROR	0x20	/* something went wrong on delayed write */
  #define CM_BUF_WAITING	0x40	/* someone's waiting for a flag to change */
! 
! #define CM_BUF_EOF	0x100	/* read 0 bytes; used for detecting EOF */
  
  typedef struct cm_buf_ops {
      long (*Writep)(void *, osi_hyper_t *, long, long, struct cm_user *,
***************
*** 159,165 ****
  
  extern long buf_CleanAsync(cm_buf_t *, cm_req_t *);
  
! extern void buf_CleanWait(cm_scache_t *, cm_buf_t *);
  
  extern void buf_SetDirty(cm_buf_t *, afs_uint32 offset, afs_uint32 length);
  
--- 148,154 ----
  
  extern long buf_CleanAsync(cm_buf_t *, cm_req_t *);
  
! extern void buf_CleanWait(cm_scache_t *, cm_buf_t *, afs_uint32 locked);
  
  extern void buf_SetDirty(cm_buf_t *, afs_uint32 offset, afs_uint32 length);
  
Index: openafs/src/WINNT/afsd/cm_callback.c
diff -c openafs/src/WINNT/afsd/cm_callback.c:1.41.4.34 openafs/src/WINNT/afsd/cm_callback.c:1.41.4.41
*** openafs/src/WINNT/afsd/cm_callback.c:1.41.4.34	Fri Feb 22 19:17:34 2008
--- openafs/src/WINNT/afsd/cm_callback.c	Wed Mar 19 09:59:30 2008
***************
*** 27,33 ****
  
  #include <WINNT/syscfg.h>
  #include <WINNT/afsreg.h>
- #include <../afsrdr/kif.h>
  
  /*extern void afsi_log(char *pattern, ...);*/
  
--- 27,32 ----
***************
*** 130,143 ****
  
      /* for directories, this sends a change notification on the dir itself */
      if (scp->fileType == CM_SCACHETYPE_DIRECTORY) {
- #ifndef AFSIFS
          if (scp->flags & CM_SCACHEFLAG_ANYWATCH)
              smb_NotifyChange(0,
                               FILE_NOTIFY_GENERIC_DIRECTORY_FILTER,
                               scp, NULL, NULL, TRUE);
- #else
-         dc_break_callback(FID_HASH_FN(&scp->fid));
- #endif
      } else {
  	/* and for files, this sends a change notification on the file's parent dir */
          cm_fid_t tfid;
--- 129,138 ----
***************
*** 145,160 ****
  
          cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, scp->parentVnode, scp->parentUnique);
          dscp = cm_FindSCache(&tfid);
- #ifndef AFSIFS
          if ( dscp &&
               dscp->flags & CM_SCACHEFLAG_ANYWATCH )
              smb_NotifyChange( 0,
                                FILE_NOTIFY_GENERIC_FILE_FILTER,
                                dscp, NULL, NULL, TRUE);
- #else
-         if (dscp)
-             dc_break_callback(FID_HASH_FN(&dscp->fid));
- #endif
          if (dscp) 
              cm_ReleaseSCache(dscp);
      }
--- 140,150 ----
***************
*** 209,217 ****
              osi_Log4(afsd_logp, "RevokeCallback Discarding SCache scp 0x%p vol %u vn %u uniq %u", 
                       scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
  
!             lock_ObtainMutex(&scp->mx);
              cm_DiscardSCache(scp);
!             lock_ReleaseMutex(&scp->mx);
  
              cm_CallbackNotifyChange(scp);
              
--- 199,207 ----
              osi_Log4(afsd_logp, "RevokeCallback Discarding SCache scp 0x%p vol %u vn %u uniq %u", 
                       scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
  
!             lock_ObtainWrite(&scp->rw);
              cm_DiscardSCache(scp);
!             lock_ReleaseWrite(&scp->rw);
  
              cm_CallbackNotifyChange(scp);
              
***************
*** 257,276 ****
                  cm_HoldSCacheNoLock(scp);
                  lock_ReleaseWrite(&cm_scacheLock);
  
!                 lock_ObtainMutex(&scp->mx);
                  osi_Log4(afsd_logp, "RevokeVolumeCallback Discarding SCache scp 0x%p vol %u vn %u uniq %u", 
                            scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
                  cm_DiscardSCache(scp);
!                 lock_ReleaseMutex(&scp->mx);
  
                  cm_CallbackNotifyChange(scp);
                  lock_ObtainWrite(&cm_scacheLock);
                  cm_ReleaseSCacheNoLock(scp);
! 
!                 if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
!                     scp->volp->cbExpiresRO = 0;
                  }
-                 
              }
          }	/* search one hash bucket */
      }	/* search all hash buckets */
--- 247,268 ----
                  cm_HoldSCacheNoLock(scp);
                  lock_ReleaseWrite(&cm_scacheLock);
  
!                 lock_ObtainWrite(&scp->rw);
                  osi_Log4(afsd_logp, "RevokeVolumeCallback Discarding SCache scp 0x%p vol %u vn %u uniq %u", 
                            scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
                  cm_DiscardSCache(scp);
!                 lock_ReleaseWrite(&scp->rw);
  
                  cm_CallbackNotifyChange(scp);
                  lock_ObtainWrite(&cm_scacheLock);
                  cm_ReleaseSCacheNoLock(scp);
!                 if (scp->flags & CM_SCACHEFLAG_PURERO) {
!                     cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!                     if (volp) {
!                         volp->cbExpiresRO = 0;
!                         cm_PutVolume(volp);
!                     }
                  }
              }
          }	/* search one hash bucket */
      }	/* search all hash buckets */
***************
*** 358,366 ****
      cm_server_t *tsp = NULL;
      cm_cell_t* cellp = NULL;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 350,355 ----
***************
*** 393,401 ****
          else
              cm_RevokeCallback(callp, cellp, tfidp);
      }
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 382,387 ----
***************
*** 435,443 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 421,426 ----
***************
*** 484,490 ****
              for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
                  cm_HoldSCacheNoLock(scp);
                  lock_ReleaseWrite(&cm_scacheLock);
!                 lock_ObtainMutex(&scp->mx);
                  discarded = 0;
                  if (scp->cbExpires > 0 && scp->cbServerp != NULL) {
                      /* we have a callback, now decide if we should clear it */
--- 467,473 ----
              for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
                  cm_HoldSCacheNoLock(scp);
                  lock_ReleaseWrite(&cm_scacheLock);
!                 lock_ObtainWrite(&scp->rw);
                  discarded = 0;
                  if (scp->cbExpires > 0 && scp->cbServerp != NULL) {
                      /* we have a callback, now decide if we should clear it */
***************
*** 495,508 ****
                          discarded = 1;
                      }
                  }
!                 lock_ReleaseMutex(&scp->mx);
                  if (discarded)
                      cm_CallbackNotifyChange(scp);
                  lock_ObtainWrite(&cm_scacheLock);
                  cm_ReleaseSCacheNoLock(scp);
  
!                 if (discarded && (scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp && scp->volp->cbExpiresRO != 0)
!                     scp->volp->cbExpiresRO = 0;
  
              }	/* search one hash bucket */
  	}      	/* search all hash buckets */
--- 478,497 ----
                          discarded = 1;
                      }
                  }
!                 lock_ReleaseWrite(&scp->rw);
                  if (discarded)
                      cm_CallbackNotifyChange(scp);
                  lock_ObtainWrite(&cm_scacheLock);
                  cm_ReleaseSCacheNoLock(scp);
  
!                 if (discarded && (scp->flags & CM_SCACHEFLAG_PURERO)) {
!                     cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!                     if (volp) {
!                         if (volp->cbExpiresRO != 0)
!                             volp->cbExpiresRO = 0;
!                         cm_PutVolume(volp);
!                     }
!                 }
  
              }	/* search one hash bucket */
  	}      	/* search all hash buckets */
***************
*** 518,526 ****
              cm_PutServer(tsp);
  	} 
      }
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 507,512 ----
***************
*** 552,560 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 538,543 ----
***************
*** 564,572 ****
                ntohl(host),
                ntohs(port));
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 547,552 ----
***************
*** 597,609 ****
  
  extern osi_rwlock_t cm_aclLock;
  extern osi_rwlock_t buf_globalLock;
- extern osi_rwlock_t cm_callbackLock;
  extern osi_rwlock_t cm_cellLock;
  extern osi_rwlock_t cm_connLock;
  extern osi_rwlock_t cm_daemonLock;
  extern osi_rwlock_t cm_dnlcLock;
  extern osi_rwlock_t cm_scacheLock;
  extern osi_rwlock_t cm_serverLock;
  extern osi_rwlock_t cm_userLock;
  extern osi_rwlock_t cm_utilsLock;
  extern osi_rwlock_t cm_volumeLock;
--- 577,589 ----
  
  extern osi_rwlock_t cm_aclLock;
  extern osi_rwlock_t buf_globalLock;
  extern osi_rwlock_t cm_cellLock;
  extern osi_rwlock_t cm_connLock;
  extern osi_rwlock_t cm_daemonLock;
  extern osi_rwlock_t cm_dnlcLock;
  extern osi_rwlock_t cm_scacheLock;
  extern osi_rwlock_t cm_serverLock;
+ extern osi_rwlock_t cm_syscfgLock;
  extern osi_rwlock_t cm_userLock;
  extern osi_rwlock_t cm_utilsLock;
  extern osi_rwlock_t cm_volumeLock;
***************
*** 629,634 ****
--- 609,615 ----
      {"buf_globalLock",   (char*)&buf_globalLock,        LOCKTYPE_RW},
      {"cm_serverLock",    (char*)&cm_serverLock,         LOCKTYPE_RW},
      {"cm_callbackLock",  (char*)&cm_callbackLock,       LOCKTYPE_RW},
+     {"cm_syscfgLock",    (char*)&cm_syscfgLock,         LOCKTYPE_RW},
      {"cm_aclLock",       (char*)&cm_aclLock,            LOCKTYPE_RW},
      {"cm_cellLock",      (char*)&cm_cellLock,           LOCKTYPE_RW},
      {"cm_connLock",      (char*)&cm_connLock,           LOCKTYPE_RW},
***************
*** 661,669 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 642,647 ----
***************
*** 706,714 ****
          code = 0;
      }
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return code;
  }
  
--- 684,689 ----
***************
*** 724,732 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 699,704 ----
***************
*** 761,778 ****
      cep->netFid.Vnode = scp->fid.vnode;
      cep->netFid.Unique = scp->fid.unique;
      cep->lock.waitStates = 0;
!     cep->lock.exclLocked = scp->mx.flags;
      cep->lock.readersReading = 0;
!     cep->lock.numWaiting = scp->mx.waiters;
      cep->lock.pid_last_reader = 0;
      cep->lock.pid_writer = 0;
      cep->lock.src_indicator = 0;
      cep->Length = scp->length.LowPart;
      cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
      cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
!     if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
!         cep->cbExpires = scp->volp->cbExpiresRO;
!     else
          cep->cbExpires = scp->cbExpires;
      cep->refCount = scp->refCount;
      cep->opens = scp->openReads;
--- 733,754 ----
      cep->netFid.Vnode = scp->fid.vnode;
      cep->netFid.Unique = scp->fid.unique;
      cep->lock.waitStates = 0;
!     cep->lock.exclLocked = scp->rw.flags;
      cep->lock.readersReading = 0;
!     cep->lock.numWaiting = scp->rw.waiters;
      cep->lock.pid_last_reader = 0;
      cep->lock.pid_writer = 0;
      cep->lock.src_indicator = 0;
      cep->Length = scp->length.LowPart;
      cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
      cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
!     if (scp->flags & CM_SCACHEFLAG_PURERO) {
!         cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!         if (volp) {
!             cep->cbExpires = volp->cbExpiresRO;
!             cm_PutVolume(volp);
!         }
!     } else
          cep->cbExpires = scp->cbExpires;
      cep->refCount = scp->refCount;
      cep->opens = scp->openReads;
***************
*** 818,826 ****
    fcnDone:
      lock_ReleaseRead(&cm_scacheLock);
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return (code);
  }
  
--- 794,799 ----
***************
*** 836,844 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 809,814 ----
***************
*** 873,881 ****
      cep->netFid.Vnode = scp->fid.vnode;
      cep->netFid.Unique = scp->fid.unique;
      cep->lock.waitStates = 0;
!     cep->lock.exclLocked = scp->mx.flags;
      cep->lock.readersReading = 0;
!     cep->lock.numWaiting = scp->mx.waiters;
      cep->lock.pid_last_reader = 0;
      cep->lock.pid_writer = 0;
      cep->lock.src_indicator = 0;
--- 843,851 ----
      cep->netFid.Vnode = scp->fid.vnode;
      cep->netFid.Unique = scp->fid.unique;
      cep->lock.waitStates = 0;
!     cep->lock.exclLocked = scp->rw.flags;
      cep->lock.readersReading = 0;
!     cep->lock.numWaiting = scp->rw.waiters;
      cep->lock.pid_last_reader = 0;
      cep->lock.pid_writer = 0;
      cep->lock.src_indicator = 0;
***************
*** 887,895 ****
  #endif
      cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
      cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
!     if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
!         cep->cbExpires = scp->volp->cbExpiresRO;
!     else
          cep->cbExpires = scp->cbExpires;
      cep->refCount = scp->refCount;
      cep->opens = scp->openReads;
--- 857,869 ----
  #endif
      cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
      cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
!     if (scp->flags & CM_SCACHEFLAG_PURERO) {
!         cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!         if (volp) {
!             cep->cbExpires = volp->cbExpiresRO;
!             cm_PutVolume(volp);
!         }
!     } else
          cep->cbExpires = scp->cbExpires;
      cep->refCount = scp->refCount;
      cep->opens = scp->openReads;
***************
*** 935,943 ****
    fcnDone:
      lock_ReleaseRead(&cm_scacheLock);
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return (code);
  }
  
--- 909,914 ----
***************
*** 950,958 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 921,926 ----
***************
*** 962,970 ****
               ntohl(host), ntohs(port));
      *vp = -1;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return RXGEN_OPCODE;
  }
  
--- 930,935 ----
***************
*** 978,986 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 943,948 ----
***************
*** 989,997 ****
      osi_Log2(afsd_logp, "SRXAFSCB_GetXStats from host 0x%x port %d - not implemented",
               ntohl(host), ntohs(port));
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return RXGEN_OPCODE;
  }
  
--- 951,956 ----
***************
*** 1008,1043 ****
  SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr)
  {
      int i;
-     int cm_noIPAddr;         /* number of client network interfaces */
-     int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
-     int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
-     int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
-     int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
      long code;
      struct rx_connection *connp;
      struct rx_peer *peerp;
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
      }
  
-     /* get network related info */
-     cm_noIPAddr = CM_MAXINTERFACE_ADDR;
-     code = syscfg_GetIFInfo(&cm_noIPAddr,
-                              cm_IPAddr, cm_SubnetMask,
-                              cm_NetMtu, cm_NetFlags);
- 
-     /* return all network interface addresses */
      osi_Log2(afsd_logp, "SRXAFSCB_WhoAreYou from host 0x%x port %d",
                ntohl(host),
                ntohs(port));
  
      addr->numberOfInterfaces = cm_noIPAddr;
      addr->uuid = cm_data.Uuid;
      for ( i=0; i < cm_noIPAddr; i++ ) {
--- 967,1002 ----
  SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr)
  {
      int i;
      long code;
      struct rx_connection *connp;
      struct rx_peer *peerp;
      unsigned long host = 0;
      unsigned short port = 0;
  
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
      }
  
      osi_Log2(afsd_logp, "SRXAFSCB_WhoAreYou from host 0x%x port %d",
                ntohl(host),
                ntohs(port));
  
+     lock_ObtainRead(&cm_syscfgLock);
+     if (cm_LanAdapterChangeDetected) {
+         lock_ConvertRToW(&cm_syscfgLock);
+         if (cm_LanAdapterChangeDetected) {
+             /* get network related info */
+             cm_noIPAddr = CM_MAXINTERFACE_ADDR;
+             code = syscfg_GetIFInfo(&cm_noIPAddr,
+                                      cm_IPAddr, cm_SubnetMask,
+                                      cm_NetMtu, cm_NetFlags);
+             cm_LanAdapterChangeDetected = 0;
+         }
+         lock_ConvertWToR(&cm_syscfgLock);
+     }
+ 
+     /* return all network interface addresses */
      addr->numberOfInterfaces = cm_noIPAddr;
      addr->uuid = cm_data.Uuid;
      for ( i=0; i < cm_noIPAddr; i++ ) {
***************
*** 1047,1055 ****
              cm_NetMtu[i] : rx_mtu;
      }
  
! #ifdef HOLD_CALL_MUTEX
!     MUTEX_EXIT(&callp->lock);
! #endif
      return 0;
  }
  
--- 1006,1013 ----
              cm_NetMtu[i] : rx_mtu;
      }
  
!     lock_ReleaseRead(&cm_syscfgLock);
! 
      return 0;
  }
  
***************
*** 1078,1086 ****
      char *p,*q;
      int code = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 1036,1041 ----
***************
*** 1103,1111 ****
                    ntohl(host),
                    ntohs(port));
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return code;
  }
  
--- 1058,1063 ----
***************
*** 1155,1163 ****
      unsigned short port = 0;
      int rc;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 1107,1112 ----
***************
*** 1172,1180 ****
  
      rc = GetCellCommon(a_cellnum, a_name, a_hosts);
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return rc;
  }
  
--- 1121,1126 ----
***************
*** 1187,1221 ****
      int i;
      afs_int32 *dataBuffP;
      afs_int32 dataBytes;
-     int cm_noIPAddr;         /* number of client network interfaces */
-     int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
-     int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
-     int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
-     int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
      long code;
      struct rx_connection *connp;
      struct rx_peer *peerp;
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
      }
  
-     /* get network related info */
-     cm_noIPAddr = CM_MAXINTERFACE_ADDR;
-     code = syscfg_GetIFInfo(&cm_noIPAddr,
-                              cm_IPAddr, cm_SubnetMask,
-                              cm_NetMtu, cm_NetFlags);
- 
      osi_Log2(afsd_logp, "SRXAFSCB_TellMeAboutYourself from host 0x%x port %d",
                ntohl(host),
                ntohs(port));
  
      /* return all network interface addresses */
      addr->numberOfInterfaces = cm_noIPAddr;
      addr->uuid = cm_data.Uuid;
--- 1133,1167 ----
      int i;
      afs_int32 *dataBuffP;
      afs_int32 dataBytes;
      long code;
      struct rx_connection *connp;
      struct rx_peer *peerp;
      unsigned long host = 0;
      unsigned short port = 0;
  
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
      }
  
      osi_Log2(afsd_logp, "SRXAFSCB_TellMeAboutYourself from host 0x%x port %d",
                ntohl(host),
                ntohs(port));
  
+     lock_ObtainRead(&cm_syscfgLock);
+     if (cm_LanAdapterChangeDetected) {
+         lock_ConvertRToW(&cm_syscfgLock);
+         if (cm_LanAdapterChangeDetected) {
+             /* get network related info */
+             cm_noIPAddr = CM_MAXINTERFACE_ADDR;
+             code = syscfg_GetIFInfo(&cm_noIPAddr,
+                                      cm_IPAddr, cm_SubnetMask,
+                                      cm_NetMtu, cm_NetFlags);
+             cm_LanAdapterChangeDetected = 0;
+         }
+         lock_ConvertWToR(&cm_syscfgLock);
+     }
+ 
      /* return all network interface addresses */
      addr->numberOfInterfaces = cm_noIPAddr;
      addr->uuid = cm_data.Uuid;
***************
*** 1225,1230 ****
--- 1171,1177 ----
          addr->mtu[i] = (rx_mtu == -1 || (rx_mtu != -1 && cm_NetMtu[i] < rx_mtu)) ? 
              cm_NetMtu[i] : rx_mtu;
      }
+     lock_ReleaseRead(&cm_syscfgLock);
  
      dataBytes = 1 * sizeof(afs_int32);
      dataBuffP = (afs_int32 *) osi_Alloc(dataBytes);
***************
*** 1232,1240 ****
      capabilities->Capabilities_len = dataBytes / sizeof(afs_int32);
      capabilities->Capabilities_val = dataBuffP;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 1179,1184 ----
***************
*** 1271,1279 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 1215,1220 ----
***************
*** 1286,1294 ****
      *a_srvr_addr = 0xffffffff;
      *a_srvr_rank = 0xffffffff;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 1227,1232 ----
***************
*** 1323,1331 ****
      unsigned short port = 0;
      int rc;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 1261,1266 ----
***************
*** 1373,1381 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 1308,1313 ----
***************
*** 1393,1401 ****
      }
      *a_name = t_name;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 1325,1330 ----
***************
*** 1475,1483 ****
      unsigned long host = 0;
      unsigned short port = 0;
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_ENTER(&callp->lock);
- #endif
      if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
          host = rx_HostOf(peerp);
          port = rx_PortOf(peerp);
--- 1404,1409 ----
***************
*** 1505,1513 ****
      config->cacheConfig_val = t_config;
      config->cacheConfig_len = (*configCount)/sizeof(afs_uint32);
  
- #ifdef HOLD_CALL_MUTEX
-     MUTEX_EXIT(&callp->lock);
- #endif
      return 0;
  }
  
--- 1431,1436 ----
***************
*** 1559,1567 ****
          } 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
--- 1482,1490 ----
          } else if (fdc==2 && !fgc) { 	// we're in good shape
              if (cm_getLocalMountPointChange()) {	// check for changes
                  cm_clearLocalMountPointChange(); // clear the changefile
!                 lock_ReleaseWrite(&scp->rw);      // this is re-locked in reInitLocalMountPoints
                  cm_reInitLocalMountPoints();	// start reinit
!                 lock_ObtainWrite(&scp->rw);      // now get the lock back 
                  return 0;
              }
              return 1;			// no change
***************
*** 1573,1589 ****
      if (scp->cbServerp != NULL) {
  	return 1;
      } else if (cm_OfflineROIsValid) {
!         switch (cm_GetVolumeStatus(scp->volp, scp->fid.volume)) {
!         case vl_offline:
!         case vl_alldown:
!         case vl_unknown:
!             return 1;
!         default:
!             return 0;
          }
!     } else {
!         return 0;
      }
  }
  
  /* need to detect a broken callback that races with our obtaining a callback.
--- 1496,1517 ----
      if (scp->cbServerp != NULL) {
  	return 1;
      } else if (cm_OfflineROIsValid) {
!         cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!         if (volp) {
!             switch (cm_GetVolumeStatus(volp, scp->fid.volume)) {
!             case vl_offline:
!             case vl_alldown:
!             case vl_unknown:
!                 cm_PutVolume(volp);
!                 return 1;
!             default:
!                 cm_PutVolume(volp);
!                 return 0;
!             }
          }
!         return 1;
      }
+     return 0;
  }
  
  /* need to detect a broken callback that races with our obtaining a callback.
***************
*** 1618,1624 ****
  /* Called at the end of a callback-granting call, to remove the callback
   * info from the scache entry, if necessary.
   *
!  * Called with scp locked, so we can discard the callbacks easily with
   * this locking hierarchy.
   */
  void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp,
--- 1546,1552 ----
  /* Called at the end of a callback-granting call, to remove the callback
   * info from the scache entry, if necessary.
   *
!  * Called with scp write locked, so we can discard the callbacks easily with
   * this locking hierarchy.
   */
  void cm_EndCallbackGrantingCall(cm_scache_t *scp, cm_callbackRequest_t *cbrp,
***************
*** 1657,1664 ****
                      serverp = cbrp->serverp;
              }
              scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
!             if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
!                 scp->volp->cbExpiresRO = scp->cbExpires;
          } else {
              if (freeFlag)
                  serverp = cbrp->serverp;
--- 1585,1597 ----
                      serverp = cbrp->serverp;
              }
              scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
!             if (scp->flags & CM_SCACHEFLAG_PURERO) {
!                 cm_volume_t * volp = cm_GetVolumeByFID(&scp->fid);
!                 if (volp) {
!                     volp->cbExpiresRO = scp->cbExpires;
!                     cm_PutVolume(volp);
!                 }
!             }
          } else {
              if (freeFlag)
                  serverp = cbrp->serverp;
***************
*** 1696,1705 ****
                        cbrp->callbackCount, revp->callbackCount,
                        cm_callbackCount);
              discardScp = 1;
! 
!             if ((scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp && 
!                 (revp->flags & (CM_RACINGFLAG_CANCELVOL | CM_RACINGFLAG_CANCELALL)))
!                 scp->volp->cbExpiresRO = 0;
          }
          if (freeFlag) 
              free(revp);
--- 1629,1642 ----
                        cbrp->callbackCount, revp->callbackCount,
                        cm_callbackCount);
              discardScp = 1;
!             if ((scp->flags & CM_SCACHEFLAG_PURERO) && 
!                  (revp->flags & (CM_RACINGFLAG_CANCELVOL | CM_RACINGFLAG_CANCELALL))) {
!                 cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!                 if (volp) {
!                     volp->cbExpiresRO = 0;
!                     cm_PutVolume(volp);
!                 }
!             }
          }
          if (freeFlag) 
              free(revp);
***************
*** 1713,1721 ****
  
      if ( discardScp ) {
          cm_DiscardSCache(scp);
!         lock_ReleaseMutex(&scp->mx);
          cm_CallbackNotifyChange(scp);
!         lock_ObtainMutex(&scp->mx);
      } 
  
      if ( serverp ) {
--- 1650,1658 ----
  
      if ( discardScp ) {
          cm_DiscardSCache(scp);
!         lock_ReleaseWrite(&scp->rw);
          cm_CallbackNotifyChange(scp);
!         lock_ObtainWrite(&scp->rw);
      } 
  
      if ( serverp ) {
***************
*** 1804,1810 ****
  	}
          cm_StartCallbackGrantingCall(scp, &cbr);
          sfid = scp->fid;
!         lock_ReleaseMutex(&scp->mx);
  		
          /* now make the RPC */
          osi_Log4(afsd_logp, "CALL FetchStatus scp 0x%p vol %u vn %u uniq %u", 
--- 1741,1747 ----
  	}
          cm_StartCallbackGrantingCall(scp, &cbr);
          sfid = scp->fid;
!         lock_ReleaseWrite(&scp->rw);
  		
          /* now make the RPC */
          osi_Log4(afsd_logp, "CALL FetchStatus scp 0x%p vol %u vn %u uniq %u", 
***************
*** 1829,1835 ****
              osi_Log4(afsd_logp, "CALL FetchStatus SUCCESS scp 0x%p vol %u vn %u uniq %u", 
                       scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
  
!         lock_ObtainMutex(&scp->mx);
          if (code == 0) {
              cm_EndCallbackGrantingCall(scp, &cbr, &callback, 0);
              cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, 0);
--- 1766,1772 ----
              osi_Log4(afsd_logp, "CALL FetchStatus SUCCESS scp 0x%p vol %u vn %u uniq %u", 
                       scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
  
!         lock_ObtainWrite(&scp->rw);
          if (code == 0) {
              cm_EndCallbackGrantingCall(scp, &cbr, &callback, 0);
              cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, 0);
***************
*** 1862,1868 ****
  long cm_CBServersUp(cm_scache_t *scp, time_t * downTime)
  {
      cm_vol_state_t *statep;
!     cm_volume_t * volp = scp->volp;
      afs_uint32 volID = scp->fid.volume;
      cm_serverRef_t *tsrp;
      int found;
--- 1799,1805 ----
  long cm_CBServersUp(cm_scache_t *scp, time_t * downTime)
  {
      cm_vol_state_t *statep;
!     cm_volume_t * volp;
      afs_uint32 volID = scp->fid.volume;
      cm_serverRef_t *tsrp;
      int found;
***************
*** 1872,1877 ****
--- 1809,1818 ----
      if (scp->cbServerp == NULL)
          return 1;
  
+     volp = cm_GetVolumeByFID(&scp->fid);
+     if (!volp)
+         return 1;
+ 
      if (volp->rw.ID == volID) {
          statep = &volp->rw;
      } else if (volp->ro.ID == volID) {
***************
*** 1879,1885 ****
      } else if (volp->bk.ID == volID) {
          statep = &volp->bk;
      }
! 
      if (statep->state == vl_online)
          return 1;
  
--- 1820,1826 ----
      } else if (volp->bk.ID == volID) {
          statep = &volp->bk;
      }
!     cm_PutVolume(volp);
      if (statep->state == vl_online)
          return 1;
  
***************
*** 1911,1921 ****
      for (i=0; i<cm_data.scacheHashTableSize; i++) {
          for (scp = cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) {
              downTime = 0;
!             if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
!                 if (scp->volp->cbExpiresRO > scp->cbExpires && scp->cbExpires > 0)
!                     scp->cbExpires = scp->volp->cbExpiresRO;
              }
- 
              if (scp->cbServerp && scp->cbExpires > 0 && now > scp->cbExpires && 
                   (cm_CBServersUp(scp, &downTime) || downTime == 0 || downTime >= scp->cbExpires)) 
              {
--- 1852,1865 ----
      for (i=0; i<cm_data.scacheHashTableSize; i++) {
          for (scp = cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) {
              downTime = 0;
!             if (scp->flags & CM_SCACHEFLAG_PURERO) {
!                 cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!                 if (volp) {
!                     if (volp->cbExpiresRO > scp->cbExpires && scp->cbExpires > 0)
!                         scp->cbExpires = volp->cbExpiresRO;
!                     cm_PutVolume(volp);
!                 }
              }
              if (scp->cbServerp && scp->cbExpires > 0 && now > scp->cbExpires && 
                   (cm_CBServersUp(scp, &downTime) || downTime == 0 || downTime >= scp->cbExpires)) 
              {
***************
*** 1924,1932 ****
                  
                  osi_Log4(afsd_logp, "Callback Expiration Discarding SCache scp 0x%p vol %u vn %u uniq %u",
                            scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
!                 lock_ObtainMutex(&scp->mx);
                  cm_DiscardSCache(scp);
!                 lock_ReleaseMutex(&scp->mx);
                  cm_CallbackNotifyChange(scp);
  
                  lock_ObtainWrite(&cm_scacheLock);
--- 1868,1876 ----
                  
                  osi_Log4(afsd_logp, "Callback Expiration Discarding SCache scp 0x%p vol %u vn %u uniq %u",
                            scp, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
!                 lock_ObtainWrite(&scp->rw);
                  cm_DiscardSCache(scp);
!                 lock_ReleaseWrite(&scp->rw);
                  cm_CallbackNotifyChange(scp);
  
                  lock_ObtainWrite(&cm_scacheLock);
***************
*** 1978,1984 ****
  
                          cm_InitReq(&req);
  
!                         code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                   &req, CM_GETVOL_FLAG_NO_LRU_UPDATE | CM_GETVOL_FLAG_NO_RESET, &volp);
                          if (code == 0) {    
                              cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
--- 1922,1928 ----
  
                          cm_InitReq(&req);
  
!                         code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                   &req, CM_GETVOL_FLAG_NO_LRU_UPDATE | CM_GETVOL_FLAG_NO_RESET, &volp);
                          if (code == 0) {    
                              cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
Index: openafs/src/WINNT/afsd/cm_config.h
diff -c openafs/src/WINNT/afsd/cm_config.h:1.8.6.6 openafs/src/WINNT/afsd/cm_config.h:1.8.6.8
*** openafs/src/WINNT/afsd/cm_config.h:1.8.6.6	Mon Feb 25 10:34:31 2008
--- openafs/src/WINNT/afsd/cm_config.h	Wed Mar 19 20:01:59 2008
***************
*** 13,23 ****
  #define CM_CONFIGDEFAULT_CACHESIZE	98304
  #define CM_CONFIGDEFAULT_BLOCKSIZE	4096
  #define CM_CONFIGDEFAULT_ASYNCSTORESIZE	131072  /* 128K */
  #define CM_CONFIGDEFAULT_STATS		10000
  #define CM_CONFIGDEFAULT_CHUNKSIZE	18      /* 256KB */
! #define CM_CONFIGDEFAULT_DAEMONS	1
  #define CM_CONFIGDEFAULT_SVTHREADS	25
! #define CM_CONFIGDEFAULT_TRACEBUFSIZE	5000
  
  #ifndef __CM_CONFIG_INTERFACES_ONLY__
  
--- 13,24 ----
  #define CM_CONFIGDEFAULT_CACHESIZE	98304
  #define CM_CONFIGDEFAULT_BLOCKSIZE	4096
  #define CM_CONFIGDEFAULT_ASYNCSTORESIZE	131072  /* 128K */
+ #define CM_CONFIGDEFAULT_CELLS          1024
  #define CM_CONFIGDEFAULT_STATS		10000
  #define CM_CONFIGDEFAULT_CHUNKSIZE	18      /* 256KB */
! #define CM_CONFIGDEFAULT_DAEMONS	4
  #define CM_CONFIGDEFAULT_SVTHREADS	25
! #define CM_CONFIGDEFAULT_TRACEBUFSIZE	10000
  
  #ifndef __CM_CONFIG_INTERFACES_ONLY__
  
Index: openafs/src/WINNT/afsd/cm_conn.c
diff -c openafs/src/WINNT/afsd/cm_conn.c:1.49.2.35 openafs/src/WINNT/afsd/cm_conn.c:1.49.2.39
*** openafs/src/WINNT/afsd/cm_conn.c:1.49.2.35	Mon Feb 25 17:21:24 2008
--- openafs/src/WINNT/afsd/cm_conn.c	Thu Mar 13 00:39:17 2008
***************
*** 20,25 ****
--- 20,26 ----
  #include <rx/rx.h>
  #include <rx/rxkad.h>
  #include <afs/unified_afs.h>
+ #include <afs/vlserver.h>
  #include <WINNT/afsreg.h>
  
  osi_rwlock_t cm_connLock;
***************
*** 36,44 ****
  
  void cm_PutConn(cm_conn_t *connp)
  {
! 	lock_ObtainWrite(&cm_connLock);
! 	osi_assertx(connp->refCount-- > 0, "cm_conn_t refcount 0");
! 	lock_ReleaseWrite(&cm_connLock);
  }
  
  void cm_InitConn(void)
--- 37,44 ----
  
  void cm_PutConn(cm_conn_t *connp)
  {
!     afs_int32 refCount = InterlockedDecrement(&connp->refCount);
!     osi_assertx(refCount >= 0, "cm_conn_t refcount underflow");
  }
  
  void cm_InitConn(void)
***************
*** 127,133 ****
      if (!cellp) 
          return CM_ERROR_NOSUCHCELL;
  
!     code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, CM_GETVOL_FLAG_CREATE, &volp);
      if (code) 
          return code;
      
--- 127,133 ----
      if (!cellp) 
          return CM_ERROR_NOSUCHCELL;
  
!     code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, CM_GETVOL_FLAG_CREATE, &volp);
      if (code) 
          return code;
      
***************
*** 213,219 ****
  #endif
  	    
      /* leave 5 seconds margin for sleep */
!     timeLeft = HardDeadtimeout - timeUsed;
  
      /* get a pointer to the cell */
      if (errorCode) {
--- 213,222 ----
  #endif
  	    
      /* leave 5 seconds margin for sleep */
!     if (reqp->flags & CM_REQ_NORETRY)
!         timeLeft = 0;
!     else
!         timeLeft = HardDeadtimeout - timeUsed;
  
      /* get a pointer to the cell */
      if (errorCode) {
***************
*** 232,238 ****
      }
  
      if (errorCode == CM_ERROR_TIMEDOUT) {
!         if (timeLeft > 5 ) {
              thrd_Sleep(3000);
              cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, cellp);
              retry = 1;
--- 235,241 ----
      }
  
      if (errorCode == CM_ERROR_TIMEDOUT) {
!         if ( timeLeft > 5 ) {
              thrd_Sleep(3000);
              cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, cellp);
              retry = 1;
***************
*** 242,248 ****
      else if (errorCode == UAEWOULDBLOCK || errorCode == EWOULDBLOCK ||
                errorCode == UAEAGAIN || errorCode == EAGAIN) {
  	osi_Log0(afsd_logp, "cm_Analyze passed EWOULDBLOCK or EAGAIN.");
!         if (timeLeft > 5 ) {
              thrd_Sleep(1000);
              retry = 1;
          }
--- 245,251 ----
      else if (errorCode == UAEWOULDBLOCK || errorCode == EWOULDBLOCK ||
                errorCode == UAEAGAIN || errorCode == EAGAIN) {
  	osi_Log0(afsd_logp, "cm_Analyze passed EWOULDBLOCK or EAGAIN.");
!         if ( timeLeft > 5 ) {
              thrd_Sleep(1000);
              retry = 1;
          }
***************
*** 281,287 ****
          if (timeLeft > 7 && fidp) {
              thrd_Sleep(5000);
  
!             code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, 
                                      CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                      &volp);
              if (code == 0) {
--- 284,290 ----
          if (timeLeft > 7 && fidp) {
              thrd_Sleep(5000);
  
!             code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, 
                                      CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                      &volp);
              if (code == 0) {
***************
*** 313,319 ****
              thrd_Sleep(5000);
  
              if (fidp) { /* File Server query */
!                 code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, 
                                          CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                          &volp);
                  if (code == 0) {
--- 316,322 ----
              thrd_Sleep(5000);
  
              if (fidp) { /* File Server query */
!                 code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, 
                                          CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                          &volp);
                  if (code == 0) {
***************
*** 383,389 ****
              if (tsrp->server == serverp && tsrp->status == srv_not_busy) {
                  tsrp->status = srv_busy;
                  if (fidp) { /* File Server query */
!                     code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, 
                                               CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                               &volp);
                      if (code == 0) {
--- 386,392 ----
              if (tsrp->server == serverp && tsrp->status == srv_not_busy) {
                  tsrp->status = srv_busy;
                  if (fidp) { /* File Server query */
!                     code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, 
                                               CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                               &volp);
                      if (code == 0) {
***************
*** 494,500 ****
                  }
  
                  if (fidp) { /* File Server query */
!                     code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, 
                                               CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                               &volp);
                      if (code == 0) {
--- 497,503 ----
                  }
  
                  if (fidp) { /* File Server query */
!                     code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, 
                                               CM_GETVOL_FLAG_NO_LRU_UPDATE, 
                                               &volp);
                      if (code == 0) {
***************
*** 538,557 ****
  		    pscp = cm_FindSCacheParent(scp);
  
  
! 		lock_ObtainMutex(&scp->mx);
  		lock_ObtainWrite(&cm_scacheLock);
  		cm_RemoveSCacheFromHashTable(scp);
  		lock_ReleaseWrite(&cm_scacheLock);
                  cm_LockMarkSCacheLost(scp);
  		scp->flags |= CM_SCACHEFLAG_DELETED;
! 		lock_ReleaseMutex(&scp->mx);
  		cm_ReleaseSCache(scp);
  
   		if (pscp) {
  		    if (cm_HaveCallback(pscp)) {
!  			lock_ObtainMutex(&pscp->mx);
   			cm_DiscardSCache(pscp);
!  			lock_ReleaseMutex(&pscp->mx);
   		    }
   		    cm_ReleaseSCache(pscp);
   		}
--- 541,560 ----
  		    pscp = cm_FindSCacheParent(scp);
  
  
! 		lock_ObtainWrite(&scp->rw);
  		lock_ObtainWrite(&cm_scacheLock);
  		cm_RemoveSCacheFromHashTable(scp);
  		lock_ReleaseWrite(&cm_scacheLock);
                  cm_LockMarkSCacheLost(scp);
  		scp->flags |= CM_SCACHEFLAG_DELETED;
! 		lock_ReleaseWrite(&scp->rw);
  		cm_ReleaseSCache(scp);
  
   		if (pscp) {
  		    if (cm_HaveCallback(pscp)) {
!  			lock_ObtainWrite(&pscp->rw);
   			cm_DiscardSCache(pscp);
!  			lock_ReleaseWrite(&pscp->rw);
   		    }
   		    cm_ReleaseSCache(pscp);
   		}
***************
*** 615,620 ****
--- 618,627 ----
              if ( timeLeft > 2 )
                  retry = 1;
          }
+     } else if (errorCode >= ERROR_TABLE_BASE_RXK && errorCode < ERROR_TABLE_BASE_RXK + 256) {
+         reqp->tokenErrorServp = serverp;
+         reqp->tokenError = errorCode;
+         retry = 1;
      } else if (errorCode == VICECONNBAD || errorCode == VICETOKENDEAD) {
  	cm_ForceNewConnections(serverp);
          if ( timeLeft > 2 )
***************
*** 663,668 ****
--- 670,707 ----
  	    case VICETOKENDEAD     : s = "VICETOKENDEAD";      break;
              case WSAEWOULDBLOCK    : s = "WSAEWOULDBLOCK";     break;
              case UAEWOULDBLOCK     : s = "UAEWOULDBLOCK";      break;
+             case VL_IDEXIST        : s = "VL_IDEXIST";         break;
+             case VL_IO             : s = "VL_IO";              break;
+             case VL_NAMEEXIST      : s = "VL_NAMEEXIST";       break;
+             case VL_CREATEFAIL     : s = "VL_CREATEFAIL";      break;
+             case VL_NOENT          : s = "VL_NOENT";           break;
+             case VL_EMPTY          : s = "VL_EMPTY";           break;
+             case VL_ENTDELETED     : s = "VL_ENTDELETED";      break;
+             case VL_BADNAME        : s = "VL_BADNAME";         break;
+             case VL_BADINDEX       : s = "VL_BADINDEX";        break;
+             case VL_BADVOLTYPE     : s = "VL_BADVOLTYPE";      break;
+             case VL_BADSERVER      : s = "VL_BADSERVER";       break;
+             case VL_BADPARTITION   : s = "VL_BADPARTITION";    break;
+             case VL_REPSFULL       : s = "VL_REPSFULL";        break;
+             case VL_NOREPSERVER    : s = "VL_NOREPSERVER";     break;
+             case VL_DUPREPSERVER   : s = "VL_DUPREPSERVER";    break;
+             case VL_RWNOTFOUND     : s = "VL_RWNOTFOUND";      break;
+             case VL_BADREFCOUNT    : s = "VL_BADREFCOUNT";     break;
+             case VL_SIZEEXCEEDED   : s = "VL_SIZEEXCEEDED";    break;
+             case VL_BADENTRY       : s = "VL_BADENTRY";        break;
+             case VL_BADVOLIDBUMP   : s = "VL_BADVOLIDBUMP";    break;
+             case VL_IDALREADYHASHED: s = "VL_IDALREADYHASHED"; break;
+             case VL_ENTRYLOCKED    : s = "VL_ENTRYLOCKED";     break;
+             case VL_BADVOLOPER     : s = "VL_BADVOLOPER";      break;
+             case VL_BADRELLOCKTYPE : s = "VL_BADRELLOCKTYPE";  break;
+             case VL_RERELEASE      : s = "VL_RERELEASE";       break;
+             case VL_BADSERVERFLAG  : s = "VL_BADSERVERFLAG";   break;
+             case VL_PERM           : s = "VL_PERM";            break;
+             case VL_NOMEM          : s = "VL_NOMEM";           break;
+             case VL_BADVERSION     : s = "VL_BADVERSION";      break;
+             case VL_INDEXERANGE    : s = "VL_INDEXERANGE";     break;
+             case VL_MULTIPADDR     : s = "VL_MULTIPADDR";      break;
+             case VL_BADMASK        : s = "VL_BADMASK";         break;
  	    case CM_ERROR_NOSUCHCELL	    : s = "CM_ERROR_NOSUCHCELL";         break; 			
  	    case CM_ERROR_NOSUCHVOLUME	    : s = "CM_ERROR_NOSUCHVOLUME";       break; 			
  	    case CM_ERROR_TIMEDOUT	    : s = "CM_ERROR_TIMEDOUT";           break; 		
***************
*** 767,777 ****
      timeLeft =  ConnDeadtimeout - timeUsed - 5;
      hardTimeLeft = HardDeadtimeout - timeUsed - 5;
  
!     lock_ObtainWrite(&cm_serverLock);
      for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
          tsp = tsrp->server;
          cm_GetServerNoLock(tsp);
!         lock_ReleaseWrite(&cm_serverLock);
          if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
  	    allDown = 0;
              if (tsrp->status == srv_deleted) {
--- 806,827 ----
      timeLeft =  ConnDeadtimeout - timeUsed - 5;
      hardTimeLeft = HardDeadtimeout - timeUsed - 5;
  
!     lock_ObtainRead(&cm_serverLock);
      for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
          tsp = tsrp->server;
+         if (reqp->tokenErrorServp) {
+             /* 
+              * search the list until we find the server
+              * that failed last time.  When we find it
+              * clear the error, skip it and try the one
+              * in the list.
+              */
+             if (tsp == reqp->tokenErrorServp)
+                 reqp->tokenErrorServp = NULL;
+             continue;
+         }
          cm_GetServerNoLock(tsp);
!         lock_ReleaseRead(&cm_serverLock);
          if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
  	    allDown = 0;
              if (tsrp->status == srv_deleted) {
***************
*** 807,820 ****
                      firstError = code;
              }
          }
!         lock_ObtainWrite(&cm_serverLock);
          cm_PutServerNoLock(tsp);
      }   
!     lock_ReleaseWrite(&cm_serverLock);
  
      if (firstError == 0) {
          if (allDown) 
!             firstError = CM_ERROR_ALLDOWN;
          else if (allBusy) 
              firstError = CM_ERROR_ALLBUSY;
  	else if (allOffline || (someBusy && someOffline))
--- 857,870 ----
                      firstError = code;
              }
          }
!         lock_ObtainRead(&cm_serverLock);
          cm_PutServerNoLock(tsp);
      }   
!     lock_ReleaseRead(&cm_serverLock);
  
      if (firstError == 0) {
          if (allDown) 
!             firstError = (reqp->tokenError ? reqp->tokenError : CM_ERROR_ALLDOWN);
          else if (allBusy) 
              firstError = CM_ERROR_ALLBUSY;
  	else if (allOffline || (someBusy && someOffline))
***************
*** 914,920 ****
          userp = cm_rootUserp;
  
      lock_ObtainMutex(&userp->mx);
!     lock_ObtainWrite(&cm_connLock);
      for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
          if (tcp->userp == userp) 
              break;
--- 964,970 ----
          userp = cm_rootUserp;
  
      lock_ObtainMutex(&userp->mx);
!     lock_ObtainRead(&cm_connLock);
      for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
          if (tcp->userp == userp) 
              break;
***************
*** 923,928 ****
--- 973,987 ----
      /* find ucell structure */
      ucellp = cm_GetUCell(userp, serverp->cellp);
      if (!tcp) {
+         lock_ConvertRToW(&cm_connLock);
+         for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) {
+             if (tcp->userp == userp) 
+                 break;
+         }
+         if (tcp) {
+             lock_ReleaseWrite(&cm_connLock);
+             goto haveconn;
+         }
          cm_GetServer(serverp);
          tcp = malloc(sizeof(*tcp));
          memset(tcp, 0, sizeof(*tcp));
***************
*** 937,943 ****
--- 996,1008 ----
          cm_NewRXConnection(tcp, ucellp, serverp);
          tcp->refCount = 1;
          lock_ReleaseMutex(&tcp->mx);
+         lock_ReleaseWrite(&cm_connLock);
      } else {
+         lock_ReleaseRead(&cm_connLock);
+       haveconn:
+         InterlockedIncrement(&tcp->refCount);
+ 
+         lock_ObtainMutex(&tcp->mx);
          if ((tcp->flags & CM_CONN_FLAG_FORCE_NEW) ||
              (tcp->ucgen < ucellp->gen) ||
              (tcp->cryptlevel != (cryptall ? (ucellp->flags & CM_UCELLFLAG_RXKAD ? rxkad_crypt : rxkad_clear) : rxkad_clear)))
***************
*** 946,960 ****
                  osi_Log0(afsd_logp, "cm_ConnByServer replace connection due to token update");
              else
                  osi_Log0(afsd_logp, "cm_ConnByServer replace connection due to crypt change");
-             lock_ObtainMutex(&tcp->mx);
  	    tcp->flags &= ~CM_CONN_FLAG_FORCE_NEW;
              rx_DestroyConnection(tcp->callp);
              cm_NewRXConnection(tcp, ucellp, serverp);
-             lock_ReleaseMutex(&tcp->mx);
          }
!         tcp->refCount++;
      }
-     lock_ReleaseWrite(&cm_connLock);
      lock_ReleaseMutex(&userp->mx);
  
      /* return this pointer to our caller */
--- 1011,1022 ----
                  osi_Log0(afsd_logp, "cm_ConnByServer replace connection due to token update");
              else
                  osi_Log0(afsd_logp, "cm_ConnByServer replace connection due to crypt change");
  	    tcp->flags &= ~CM_CONN_FLAG_FORCE_NEW;
              rx_DestroyConnection(tcp->callp);
              cm_NewRXConnection(tcp, ucellp, serverp);
          }
!         lock_ReleaseMutex(&tcp->mx);
      }
      lock_ReleaseMutex(&userp->mx);
  
      /* return this pointer to our caller */
***************
*** 979,988 ****
      if (code)
          return 0;
  
!     lock_ObtainWrite(&cm_serverLock);
      for (tsrp = *serverspp; tsrp; tsrp=tsrp->next) {
          tsp = tsrp->server;
-         cm_GetServerNoLock(tsp);
          if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
  	    allDown = 0;
              if (tsrp->status == srv_busy) {
--- 1041,1049 ----
      if (code)
          return 0;
  
!     lock_ObtainRead(&cm_serverLock);
      for (tsrp = *serverspp; tsrp; tsrp=tsrp->next) {
          tsp = tsrp->server;
          if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
  	    allDown = 0;
              if (tsrp->status == srv_busy) {
***************
*** 996,1004 ****
                  allBusy = 0;
              }
          }
-         cm_PutServerNoLock(tsp);
      }   
!     lock_ReleaseWrite(&cm_serverLock);
      cm_FreeServerList(serverspp, 0);
  
      if (allDown)
--- 1057,1064 ----
                  allBusy = 0;
              }
          }
      }   
!     lock_ReleaseRead(&cm_serverLock);
      cm_FreeServerList(serverspp, 0);
  
      if (allDown)
Index: openafs/src/WINNT/afsd/cm_conn.h
diff -c openafs/src/WINNT/afsd/cm_conn.h:1.13.4.9 openafs/src/WINNT/afsd/cm_conn.h:1.13.4.10
*** openafs/src/WINNT/afsd/cm_conn.h:1.13.4.9	Sat Dec 22 23:52:58 2007
--- openafs/src/WINNT/afsd/cm_conn.h	Fri Mar  7 17:16:06 2008
***************
*** 24,32 ****
          struct rx_connection *callp;	/* locked by mx */
          struct cm_user *userp;		/* locked by mx; a held reference */
          osi_mutex_t mx;			/* mutex for some of these fields */
!         unsigned long refCount;		/* locked by cm_connLock */
  	int ucgen;			/* ucellp's generation number */
!         long flags;			/* locked by mx */
  	int cryptlevel;			/* encrytion status */
  } cm_conn_t;
  
--- 24,32 ----
          struct rx_connection *callp;	/* locked by mx */
          struct cm_user *userp;		/* locked by mx; a held reference */
          osi_mutex_t mx;			/* mutex for some of these fields */
!         afs_int32 refCount;		/* Interlocked */
  	int ucgen;			/* ucellp's generation number */
!         afs_uint32 flags;		/* locked by mx */
  	int cryptlevel;			/* encrytion status */
  } cm_conn_t;
  
***************
*** 42,48 ****
  	int rpcError;			/* RPC error code */
  	int volumeError;		/* volume error code */
  	int accessError;		/* access error code */
! 	int flags;
          char * tidPathp;
          char * relPathp;
  } cm_req_t;
--- 42,50 ----
  	int rpcError;			/* RPC error code */
  	int volumeError;		/* volume error code */
  	int accessError;		/* access error code */
!         struct cm_server * tokenErrorServp;  /* server that reported a token error other than expired */
!         int tokenError;
! 	afs_uint32 flags;
          char * tidPathp;
          char * relPathp;
  } cm_req_t;
Index: openafs/src/WINNT/afsd/cm_daemon.c
diff -c openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.25 openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.28
*** openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.25	Thu Jan 10 18:00:41 2008
--- openafs/src/WINNT/afsd/cm_daemon.c	Sat Mar  8 18:25:08 2008
***************
*** 38,43 ****
--- 38,44 ----
  long cm_daemonCheckLockInterval  = 60;
  long cm_daemonTokenCheckInterval = 180;
  long cm_daemonCheckOfflineVolInterval = 600;
+ long cm_daemonPerformanceTuningInterval = 0;
  
  osi_rwlock_t cm_daemonLock;
  
***************
*** 77,82 ****
--- 78,84 ----
          if (Result == NO_ERROR && daemon_ShutdownFlag == 0) {
              lastIPAddrChange = osi_Time();
              smb_SetLanAdapterChangeDetected();
+             cm_SetLanAdapterChangeDetected();
              thrd_ResetEvent(cm_IPAddrDaemon_ShutdownEvent);
  	}	
      }
***************
*** 111,117 ****
          /* we found a request */
          for (rp = cm_bkgListEndp; rp; rp = (cm_bkgRequest_t *) osi_QPrev(&rp->q))
  	{
! 	    if (cm_ServerAvailable(&rp->scp->fid, rp->userp))
  		break;
  	}
  	if (rp == NULL) {
--- 113,120 ----
          /* we found a request */
          for (rp = cm_bkgListEndp; rp; rp = (cm_bkgRequest_t *) osi_QPrev(&rp->q))
  	{
! 	    if (cm_ServerAvailable(&rp->scp->fid, rp->userp) && 
!                 !(rp->scp->flags & CM_SCACHEFLAG_DATASTORING))
  		break;
  	}
  	if (rp == NULL) {
***************
*** 143,148 ****
--- 146,155 ----
  
          lock_ObtainWrite(&cm_daemonLock);
  
+         /* 
+         * Keep the following list synchronized with the
+         * error code list in cm_BkgStore
+         */
  	switch ( code ) {
  	case 0: /* success */
  	    osi_Log1(afsd_logp,"cm_BkgDaemon SUCCESS: request 0x%p", rp);
***************
*** 274,333 ****
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckDownInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckDownInterval = dummy;
      afsi_log("daemonCheckDownInterval is %d", cm_daemonCheckDownInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckUpInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckUpInterval = dummy;
      afsi_log("daemonCheckUpInterval is %d", cm_daemonCheckUpInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckVolInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckVolInterval = dummy;
      afsi_log("daemonCheckVolInterval is %d", cm_daemonCheckVolInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckCBInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckCBInterval = dummy;
      afsi_log("daemonCheckCBInterval is %d", cm_daemonCheckCBInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckVolCBInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckVolCBInterval = dummy;
      afsi_log("daemonCheckVolCBInterval is %d", cm_daemonCheckVolCBInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckLockInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckLockInterval = dummy;
      afsi_log("daemonCheckLockInterval is %d", cm_daemonCheckLockInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckTokenInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonTokenCheckInterval = dummy;
      afsi_log("daemonCheckTokenInterval is %d", cm_daemonTokenCheckInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckOfflineVolInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS)
  	cm_daemonCheckOfflineVolInterval = dummy;
      afsi_log("daemonCheckOfflineVolInterval is %d", cm_daemonCheckOfflineVolInterval);
      
      RegCloseKey(parmKey);
  }
  
  /* periodic check daemon */
--- 281,350 ----
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckDownInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckDownInterval = dummy;
      afsi_log("daemonCheckDownInterval is %d", cm_daemonCheckDownInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckUpInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckUpInterval = dummy;
      afsi_log("daemonCheckUpInterval is %d", cm_daemonCheckUpInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckVolInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckVolInterval = dummy;
      afsi_log("daemonCheckVolInterval is %d", cm_daemonCheckVolInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckCBInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckCBInterval = dummy;
      afsi_log("daemonCheckCBInterval is %d", cm_daemonCheckCBInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckVolCBInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckVolCBInterval = dummy;
      afsi_log("daemonCheckVolCBInterval is %d", cm_daemonCheckVolCBInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckLockInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckLockInterval = dummy;
      afsi_log("daemonCheckLockInterval is %d", cm_daemonCheckLockInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckTokenInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonTokenCheckInterval = dummy;
      afsi_log("daemonCheckTokenInterval is %d", cm_daemonTokenCheckInterval);
  
      dummyLen = sizeof(DWORD);
      code = RegQueryValueEx(parmKey, "daemonCheckOfflineVolInterval", NULL, NULL,
  			    (BYTE *) &dummy, &dummyLen);
!     if (code == ERROR_SUCCESS && dummy)
  	cm_daemonCheckOfflineVolInterval = dummy;
      afsi_log("daemonCheckOfflineVolInterval is %d", cm_daemonCheckOfflineVolInterval);
      
+     dummyLen = sizeof(DWORD);
+     code = RegQueryValueEx(parmKey, "daemonPerformanceTuningInterval", NULL, NULL,
+ 			    (BYTE *) &dummy, &dummyLen);
+     if (code == ERROR_SUCCESS)
+ 	cm_daemonPerformanceTuningInterval = dummy;
+     afsi_log("daemonPerformanceTuningInterval is %d", cm_daemonPerformanceTuningInterval);
+     
      RegCloseKey(parmKey);
+ 
+     if (cm_daemonPerformanceTuningInterval)
+         cm_PerformanceTuningInit();
  }
  
  /* periodic check daemon */
***************
*** 342,347 ****
--- 359,365 ----
      time_t lastUpServerCheck;
      time_t lastTokenCacheCheck;
      time_t lastBusyVolCheck;
+     time_t lastPerformanceCheck;
      char thostName[200];
      unsigned long code;
      struct hostent *thp;
***************
*** 390,395 ****
--- 408,415 ----
      lastUpServerCheck = now - cm_daemonCheckUpInterval/2 + (rand() % cm_daemonCheckUpInterval);
      lastTokenCacheCheck = now - cm_daemonTokenCheckInterval/2 + (rand() % cm_daemonTokenCheckInterval);
      lastBusyVolCheck = now - cm_daemonCheckOfflineVolInterval/2 * (rand() % cm_daemonCheckOfflineVolInterval);
+     if (cm_daemonPerformanceTuningInterval)
+         lastPerformanceCheck = now - cm_daemonPerformanceTuningInterval/2 * (rand() % cm_daemonPerformanceTuningInterval);
  
      while (daemon_ShutdownFlag == 0) {
  	/* check to see if the listener threads halted due to network 
***************
*** 540,546 ****
          if (daemon_ShutdownFlag == 1) {
              break;
          }
! 	thrd_Sleep(10000);		/* sleep 10 seconds */
      }
      thrd_SetEvent(cm_Daemon_ShutdownEvent);
  }       
--- 560,577 ----
          if (daemon_ShutdownFlag == 1) {
              break;
          }
! 
!         if (cm_daemonPerformanceTuningInterval &&
!             now > lastPerformanceCheck + cm_daemonPerformanceTuningInterval &&
!              daemon_ShutdownFlag == 0) {
!             lastPerformanceCheck = now;
!             cm_PerformanceTuningCheck();
!             if (daemon_ShutdownFlag == 1)
!                 break;
! 	    now = osi_Time();
!         }
!         
!         thrd_Sleep(10000);		/* sleep 10 seconds */
      }
      thrd_SetEvent(cm_Daemon_ShutdownEvent);
  }       
Index: openafs/src/WINNT/afsd/cm_dcache.c
diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.27 openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.30
*** openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.27	Sun Feb 24 01:33:20 2008
--- openafs/src/WINNT/afsd/cm_dcache.c	Thu Mar  6 09:34:29 2008
***************
*** 83,91 ****
       * buffer, although more likely it will just return a new, empty, buffer.
       */
  
!     lock_ObtainMutex(&scp->mx);
      if (scp->flags & CM_SCACHEFLAG_DELETED) {
! 	lock_ReleaseMutex(&scp->mx);
  	return CM_ERROR_NOSUCHFILE;
      }
  
--- 83,91 ----
       * buffer, although more likely it will just return a new, empty, buffer.
       */
  
!     lock_ObtainWrite(&scp->rw);
      if (scp->flags & CM_SCACHEFLAG_DELETED) {
! 	lock_ReleaseWrite(&scp->rw);
  	return CM_ERROR_NOSUCHFILE;
      }
  
***************
*** 94,106 ****
      code = cm_SetupStoreBIOD(scp, offsetp, length, &biod, userp, reqp);
      if (code) {
          osi_Log1(afsd_logp, "cm_SetupStoreBIOD code %x", code);
!         lock_ReleaseMutex(&scp->mx);
          return code;
      }
  
      if (biod.length == 0) {
          osi_Log0(afsd_logp, "cm_SetupStoreBIOD length 0");
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseBIOD(&biod, 1, 0);	/* should be a NOOP */
          return 0;
      }
--- 94,106 ----
      code = cm_SetupStoreBIOD(scp, offsetp, length, &biod, userp, reqp);
      if (code) {
          osi_Log1(afsd_logp, "cm_SetupStoreBIOD code %x", code);
!         lock_ReleaseWrite(&scp->rw);
          return code;
      }
  
      if (biod.length == 0) {
          osi_Log0(afsd_logp, "cm_SetupStoreBIOD length 0");
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseBIOD(&biod, 1, 0);	/* should be a NOOP */
          return 0;
      }
***************
*** 145,151 ****
          require_64bit_ops = 1;
      }
          
!     lock_ReleaseMutex(&scp->mx);
  
      /* now we're ready to do the store operation */
      do {
--- 145,151 ----
          require_64bit_ops = 1;
      }
          
!     lock_ReleaseWrite(&scp->rw);
  
      /* now we're ready to do the store operation */
      do {
***************
*** 262,268 ****
          osi_Log1(afsd_logp, "CALL StoreData SUCCESS scp 0x%p", scp);
  
      /* now, clean up our state */
!     lock_ObtainMutex(&scp->mx);
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
  
--- 262,268 ----
          osi_Log1(afsd_logp, "CALL StoreData SUCCESS scp 0x%p", scp);
  
      /* now, clean up our state */
!     lock_ObtainWrite(&scp->rw);
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
  
***************
*** 304,310 ****
          else if (code == CM_ERROR_QUOTA)
              scp->flags |= CM_SCACHEFLAG_OVERQUOTA;
      }
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseBIOD(&biod, 1, code);
  
      return code;
--- 304,310 ----
          else if (code == CM_ERROR_QUOTA)
              scp->flags |= CM_SCACHEFLAG_OVERQUOTA;
      }
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseBIOD(&biod, 1, code);
  
      return code;
***************
*** 350,356 ****
          require_64bit_ops = 1;
      }
  
!     lock_ReleaseMutex(&scp->mx);
  
      cm_AFSFidFromFid(&tfid, &scp->fid);
  
--- 350,356 ----
          require_64bit_ops = 1;
      }
  
!     lock_ReleaseWrite(&scp->rw);
  
      cm_AFSFidFromFid(&tfid, &scp->fid);
  
***************
*** 401,407 ****
      code = cm_MapRPCError(code, reqp);
          
      /* now, clean up our state */
!     lock_ObtainMutex(&scp->mx);
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
  
--- 401,407 ----
      code = cm_MapRPCError(code, reqp);
          
      /* now, clean up our state */
!     lock_ObtainWrite(&scp->rw);
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
  
***************
*** 442,452 ****
      cm_scache_t *scp = vscp;
      long code;
  
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, reqp, 0, 
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_SETSIZE);
      if (code) {
!         lock_ReleaseMutex(&scp->mx);
          return code;
      }
          
--- 442,452 ----
      cm_scache_t *scp = vscp;
      long code;
  
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, reqp, 0, 
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_SETSIZE);
      if (code) {
!         lock_ReleaseWrite(&scp->rw);
          return code;
      }
          
***************
*** 460,466 ****
          
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_SETSIZE);
  
!     lock_ReleaseMutex(&scp->mx);
          
      /* always succeeds */
      return 0;
--- 460,466 ----
          
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_SETSIZE);
  
!     lock_ReleaseWrite(&scp->rw);
          
      /* always succeeds */
      return 0;
***************
*** 549,562 ****
      tlength = *length;
      tblocksize = ConvertLongToLargeInteger(cm_data.buf_blockSize);
      stop = 0;
!     lock_ObtainMutex(&scp->mx);
      while (LargeIntegerGreaterThanZero(tlength)) {
          /* get callback so we can do a meaningful dataVersion comparison */
          code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                           CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
          if (code) {
              scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
!             lock_ReleaseMutex(&scp->mx);
              return code;
          }
                  
--- 549,562 ----
      tlength = *length;
      tblocksize = ConvertLongToLargeInteger(cm_data.buf_blockSize);
      stop = 0;
!     lock_ObtainWrite(&scp->rw);
      while (LargeIntegerGreaterThanZero(tlength)) {
          /* get callback so we can do a meaningful dataVersion comparison */
          code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                           CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
          if (code) {
              scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
!             lock_ReleaseWrite(&scp->rw);
              return code;
          }
                  
***************
*** 569,575 ****
          /* We cheat slightly by not locking the bp mutex. */
          if (bp) {
              if ((bp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING)) == 0
!                  && bp->dataVersion != scp->dataVersion)
                  stop = 1;
              buf_Release(bp);
  	    bp = NULL;
--- 569,575 ----
          /* We cheat slightly by not locking the bp mutex. */
          if (bp) {
              if ((bp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING)) == 0
!                  && (bp->dataVersion < scp->bufDataVersionLow || bp->dataVersion > scp->dataVersion))
                  stop = 1;
              buf_Release(bp);
  	    bp = NULL;
***************
*** 600,606 ****
          *realBasep = tbase;
          code = 0;
      }
!     lock_ReleaseMutex(&scp->mx);
      return code;
  }
  
--- 600,606 ----
          *realBasep = tbase;
          code = 0;
      }
!     lock_ReleaseWrite(&scp->rw);
      return code;
  }
  
***************
*** 632,641 ****
  	osi_Log4(afsd_logp, "Finished BKG store scp 0x%p, offset 0x%x:%08x, code 0x%x", scp, p2, p1, code);
      }
  
!     lock_ObtainMutex(&scp->mx);
!     cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_ASYNCSTORE);
!     lock_ReleaseMutex(&scp->mx);
! 
      return code;
  }
  
--- 632,656 ----
  	osi_Log4(afsd_logp, "Finished BKG store scp 0x%p, offset 0x%x:%08x, code 0x%x", scp, p2, p1, code);
      }
  
!     /* 
!      * Keep the following list synchronized with the
!      * error code list in cm_BkgDaemon 
!      */
!     switch ( code ) {
!     case CM_ERROR_TIMEDOUT: /* or server restarting */
!     case CM_ERROR_RETRY:
!     case CM_ERROR_WOULDBLOCK:
!     case CM_ERROR_ALLBUSY:
!     case CM_ERROR_ALLDOWN:
!     case CM_ERROR_ALLOFFLINE:
!     case CM_ERROR_PARTIALWRITE:
!         break;  /* cm_BkgDaemon will re-insert the request in the queue */
!     case 0:
!     default:
!         lock_ObtainWrite(&scp->rw);
!         cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_ASYNCSTORE);
!         lock_ReleaseWrite(&scp->rw);
!     }
      return code;
  }
  
***************
*** 693,699 ****
            offset = LargeIntegerAdd(offset, tblocksize) )
      {
          if (mxheld) {
!             lock_ReleaseMutex(&scp->mx);
              mxheld = 0;
          }
  
--- 708,714 ----
            offset = LargeIntegerAdd(offset, tblocksize) )
      {
          if (mxheld) {
!             lock_ReleaseWrite(&scp->rw);
              mxheld = 0;
          }
  
***************
*** 709,715 ****
          }
  
          if (!mxheld) {
!             lock_ObtainMutex(&scp->mx);
              mxheld = 1;
          }
  
--- 724,730 ----
          }
  
          if (!mxheld) {
!             lock_ObtainWrite(&scp->rw);
              mxheld = 1;
          }
  
***************
*** 720,731 ****
      }
      
      if (!mxheld) {
!         lock_ObtainMutex(&scp->mx);
          mxheld = 1;
      }
      cm_ClearPrefetchFlag(LargeIntegerGreaterThanZero(fetched) ? 0 : code, 
                           scp, &base, &fetched);
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log4(afsd_logp, "Ending BKG prefetch scp 0x%p, code %d bytes 0x%x:%x", 
                scp, code, fetched.HighPart, fetched.LowPart);
--- 735,746 ----
      }
      
      if (!mxheld) {
!         lock_ObtainWrite(&scp->rw);
          mxheld = 1;
      }
      cm_ClearPrefetchFlag(LargeIntegerGreaterThanZero(fetched) ? 0 : code, 
                           scp, &base, &fetched);
!     lock_ReleaseWrite(&scp->rw);
  
      osi_Log4(afsd_logp, "Ending BKG prefetch scp 0x%p, code %d bytes 0x%x:%x", 
                scp, code, fetched.HighPart, fetched.LowPart);
***************
*** 750,759 ****
  
      readLength = ConvertLongToLargeInteger(count);
  
!     lock_ObtainMutex(&scp->mx);
      if ((scp->flags & CM_SCACHEFLAG_PREFETCHING)
           || LargeIntegerLessThanOrEqualTo(readBase, scp->prefetch.base)) {
!         lock_ReleaseMutex(&scp->mx);
          return;
      }
      scp->flags |= CM_SCACHEFLAG_PREFETCHING;
--- 765,774 ----
  
      readLength = ConvertLongToLargeInteger(count);
  
!     lock_ObtainWrite(&scp->rw);
      if ((scp->flags & CM_SCACHEFLAG_PREFETCHING)
           || LargeIntegerLessThanOrEqualTo(readBase, scp->prefetch.base)) {
!         lock_ReleaseWrite(&scp->rw);
          return;
      }
      scp->flags |= CM_SCACHEFLAG_PREFETCHING;
***************
*** 764,770 ****
      if (LargeIntegerGreaterThan(scp->prefetch.end, readBase))
          readBase = scp->prefetch.end;
  
!     lock_ReleaseMutex(&scp->mx);
  
      code = cm_CheckFetchRange(scp, &readBase, &readLength, userp, reqp,
                                &realBase);
--- 779,785 ----
      if (LargeIntegerGreaterThan(scp->prefetch.end, readBase))
          readBase = scp->prefetch.end;
  
!     lock_ReleaseWrite(&scp->rw);
  
      code = cm_CheckFetchRange(scp, &readBase, &readLength, userp, reqp,
                                &realBase);
***************
*** 814,822 ****
      biop->reserved = 0;
  
      /* reserve a chunk's worth of buffers */
!     lock_ReleaseMutex(&scp->mx);
      buf_ReserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
!     lock_ObtainMutex(&scp->mx);
  
      bufp = NULL;
      for (temp = 0; temp < inSize; temp += cm_data.buf_blockSize) {
--- 829,837 ----
      biop->reserved = 0;
  
      /* reserve a chunk's worth of buffers */
!     lock_ReleaseWrite(&scp->rw);
      buf_ReserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
!     lock_ObtainWrite(&scp->rw);
  
      bufp = NULL;
      for (temp = 0; temp < inSize; temp += cm_data.buf_blockSize) {
***************
*** 826,834 ****
          bufp = buf_Find(scp, &tbase);
          if (bufp) {
              /* get buffer mutex and scp mutex safely */
!             lock_ReleaseMutex(&scp->mx);
              lock_ObtainMutex(&bufp->mx);
!             lock_ObtainMutex(&scp->mx);
  
              flags = CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_STOREDATA | CM_SCACHESYNC_BUFLOCKED;
              code = cm_SyncOp(scp, bufp, userp, reqp, 0, flags); 
--- 841,849 ----
          bufp = buf_Find(scp, &tbase);
          if (bufp) {
              /* get buffer mutex and scp mutex safely */
!             lock_ReleaseWrite(&scp->rw);
              lock_ObtainMutex(&bufp->mx);
!             lock_ObtainWrite(&scp->rw);
  
              flags = CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_STOREDATA | CM_SCACHESYNC_BUFLOCKED;
              code = cm_SyncOp(scp, bufp, userp, reqp, 0, flags); 
***************
*** 902,910 ****
              break;
  
          /* try to lock it, and quit if we can't (simplifies locking) */
!         lock_ReleaseMutex(&scp->mx);
          code = lock_TryMutex(&bufp->mx);
!         lock_ObtainMutex(&scp->mx);
          if (code == 0) {
              buf_Release(bufp);
  	    bufp = NULL;
--- 917,925 ----
              break;
  
          /* try to lock it, and quit if we can't (simplifies locking) */
!         lock_ReleaseWrite(&scp->rw);
          code = lock_TryMutex(&bufp->mx);
!         lock_ObtainWrite(&scp->rw);
          if (code == 0) {
              buf_Release(bufp);
  	    bufp = NULL;
***************
*** 962,970 ****
              break;
  
          /* try to lock it, and quit if we can't (simplifies locking) */
!         lock_ReleaseMutex(&scp->mx);
          code = lock_TryMutex(&bufp->mx);
!         lock_ObtainMutex(&scp->mx);
          if (code == 0) {
              buf_Release(bufp);
  	    bufp = NULL;
--- 977,985 ----
              break;
  
          /* try to lock it, and quit if we can't (simplifies locking) */
!         lock_ReleaseWrite(&scp->rw);
          code = lock_TryMutex(&bufp->mx);
!         lock_ObtainWrite(&scp->rw);
          if (code == 0) {
              buf_Release(bufp);
  	    bufp = NULL;
***************
*** 1053,1059 ****
      /* copy out size, since it may change */
      fileSize = scp->serverLength;
          
!     lock_ReleaseMutex(&scp->mx);
  
      pageBase = *offsetp;
      collected = pageBase.LowPart & (cm_chunkSize - 1);
--- 1068,1074 ----
      /* copy out size, since it may change */
      fileSize = scp->serverLength;
          
!     lock_ReleaseWrite(&scp->rw);
  
      pageBase = *offsetp;
      collected = pageBase.LowPart & (cm_chunkSize - 1);
***************
*** 1093,1099 ****
          code = buf_Get(scp, &pageBase, &tbp);
          if (code) {
              //lock_ReleaseMutex(&cm_bufGetMutex);
!             lock_ObtainMutex(&scp->mx);
              cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
              return code;
          }
--- 1108,1114 ----
          code = buf_Get(scp, &pageBase, &tbp);
          if (code) {
              //lock_ReleaseMutex(&cm_bufGetMutex);
!             lock_ObtainWrite(&scp->rw);
              cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
              return code;
          }
***************
*** 1158,1169 ****
  
          /* now lock the buffer lock */
          lock_ObtainMutex(&tbp->mx);
!         lock_ObtainMutex(&scp->mx);
  
          /* don't bother fetching over data that is already current */
          if (tbp->dataVersion <= scp->dataVersion && tbp->dataVersion >= scp->bufDataVersionLow) {
              /* we don't need this buffer, since it is current */
!             lock_ReleaseMutex(&scp->mx);
              lock_ReleaseMutex(&tbp->mx);
              break;
          }
--- 1173,1184 ----
  
          /* now lock the buffer lock */
          lock_ObtainMutex(&tbp->mx);
!         lock_ObtainWrite(&scp->rw);
  
          /* don't bother fetching over data that is already current */
          if (tbp->dataVersion <= scp->dataVersion && tbp->dataVersion >= scp->bufDataVersionLow) {
              /* we don't need this buffer, since it is current */
!             lock_ReleaseWrite(&scp->rw);
              lock_ReleaseMutex(&tbp->mx);
              break;
          }
***************
*** 1177,1183 ****
           */
          code = cm_SyncOp(scp, tbp, userp, reqp, 0, flags);
          if (code) {
!             lock_ReleaseMutex(&scp->mx);
              lock_ReleaseMutex(&tbp->mx);
              break;
          }
--- 1192,1198 ----
           */
          code = cm_SyncOp(scp, tbp, userp, reqp, 0, flags);
          if (code) {
!             lock_ReleaseWrite(&scp->rw);
              lock_ReleaseMutex(&tbp->mx);
              break;
          }
***************
*** 1185,1197 ****
          /* don't fetch over dirty buffers */
          if (tbp->flags & CM_BUF_DIRTY) {
              cm_SyncOpDone(scp, tbp, flags);
!             lock_ReleaseMutex(&scp->mx);
              lock_ReleaseMutex(&tbp->mx);
              break;
          }
  
          /* Release locks */
!         lock_ReleaseMutex(&scp->mx);
          lock_ReleaseMutex(&tbp->mx);
  
          /* add the buffer to the list */
--- 1200,1212 ----
          /* don't fetch over dirty buffers */
          if (tbp->flags & CM_BUF_DIRTY) {
              cm_SyncOpDone(scp, tbp, flags);
!             lock_ReleaseWrite(&scp->rw);
              lock_ReleaseMutex(&tbp->mx);
              break;
          }
  
          /* Release locks */
!         lock_ReleaseWrite(&scp->rw);
          lock_ReleaseMutex(&tbp->mx);
  
          /* add the buffer to the list */
***************
*** 1225,1231 ****
      }
  
      /* Caller expects this */
!     lock_ObtainMutex(&scp->mx);
   
      /* if we got a failure setting up the first buffer, then we don't have
       * any side effects yet, and we also have failed an operation that the
--- 1240,1246 ----
      }
  
      /* Caller expects this */
!     lock_ObtainWrite(&scp->rw);
   
      /* if we got a failure setting up the first buffer, then we don't have
       * any side effects yet, and we also have failed an operation that the
***************
*** 1279,1285 ****
  
  	    /* now, mark I/O as done, unlock the buffer and release it */
  	    lock_ObtainMutex(&bufp->mx);
! 	    lock_ObtainMutex(&scp->mx);
  	    cm_SyncOpDone(scp, bufp, flags);
                  
  	    /* turn off writing and wakeup users */
--- 1294,1300 ----
  
  	    /* now, mark I/O as done, unlock the buffer and release it */
  	    lock_ObtainMutex(&bufp->mx);
! 	    lock_ObtainWrite(&scp->rw);
  	    cm_SyncOpDone(scp, bufp, flags);
                  
  	    /* turn off writing and wakeup users */
***************
*** 1296,1310 ****
                  }
  	    }
  
! 	    lock_ReleaseMutex(&scp->mx);
  	    lock_ReleaseMutex(&bufp->mx);
  	    buf_Release(bufp);
  	    bufp = NULL;
  	}
      } else {
! 	lock_ObtainMutex(&scp->mx);
  	cm_SyncOpDone(scp, NULL, flags);
! 	lock_ReleaseMutex(&scp->mx);
      }
  
      /* clean things out */
--- 1311,1325 ----
                  }
  	    }
  
! 	    lock_ReleaseWrite(&scp->rw);
  	    lock_ReleaseMutex(&bufp->mx);
  	    buf_Release(bufp);
  	    bufp = NULL;
  	}
      } else {
! 	lock_ObtainWrite(&scp->rw);
  	cm_SyncOpDone(scp, NULL, flags);
! 	lock_ReleaseWrite(&scp->rw);
      }
  
      /* clean things out */
***************
*** 1377,1399 ****
       * which case we just retry.
       */
      if (bufp->dataVersion <= scp->dataVersion && bufp->dataVersion >= scp->bufDataVersionLow || biod.length == 0) {
!         if ((bufp->dataVersion == -1 || bufp->dataVersion < scp->dataVersion) && 
               LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->serverLength)) 
          {
!             osi_Log3(afsd_logp, "Bad DVs %I64d, %I64d or length 0x%x",
!                       bufp->dataVersion, scp->dataVersion, biod.length);
  
!             if (bufp->dataVersion == -1)
                  memset(bufp->datap, 0, cm_data.buf_blockSize);
              bufp->dataVersion = scp->dataVersion;
          }
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseBIOD(&biod, 0, 0);
!         lock_ObtainMutex(&scp->mx);
          return 0;
      }
  
!     lock_ReleaseMutex(&scp->mx);
  
      if (LargeIntegerGreaterThan(LargeIntegerAdd(biod.offset,
                                                  ConvertLongToLargeInteger(biod.length)),
--- 1392,1423 ----
       * which case we just retry.
       */
      if (bufp->dataVersion <= scp->dataVersion && bufp->dataVersion >= scp->bufDataVersionLow || biod.length == 0) {
!         if ((bufp->dataVersion == CM_BUF_VERSION_BAD || bufp->dataVersion < scp->bufDataVersionLow) && 
               LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->serverLength)) 
          {
!             osi_Log4(afsd_logp, "Bad DVs 0x%x != (0x%x -> 0x%x) or length 0x%x",
!                      bufp->dataVersion, scp->bufDataVersionLow, scp->dataVersion, biod.length);
  
!             if (bufp->dataVersion == CM_BUF_VERSION_BAD)
                  memset(bufp->datap, 0, cm_data.buf_blockSize);
              bufp->dataVersion = scp->dataVersion;
          }
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseBIOD(&biod, 0, 0);
!         lock_ObtainWrite(&scp->rw);
!         return 0;
!     } else if ((bufp->dataVersion == CM_BUF_VERSION_BAD || bufp->dataVersion < scp->bufDataVersionLow)
!                 && (scp->mask & CM_SCACHEMASK_TRUNCPOS) &&
!                 LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->truncPos)) {
!         memset(bufp->datap, 0, cm_data.buf_blockSize);
!         bufp->dataVersion = scp->dataVersion;
!         lock_ReleaseWrite(&scp->rw);
!         cm_ReleaseBIOD(&biod, 0, 0);
!         lock_ObtainWrite(&scp->rw);
          return 0;
      }
  
!     lock_ReleaseWrite(&scp->rw);
  
      if (LargeIntegerGreaterThan(LargeIntegerAdd(biod.offset,
                                                  ConvertLongToLargeInteger(biod.length)),
***************
*** 1401,1410 ****
          require_64bit_ops = 1;
      }
  
! #ifdef DISKCACHE95
!     DPRINTF("cm_GetBuffer: fetching data scpDV=%I64d bufDV=%I64d scp=%x bp=%x dcp=%x\n",
!             scp->dataVersion, bufp->dataVersion, scp, bufp, bufp->dcp);
! #endif /* DISKCACHE95 */
  
  #ifdef AFS_FREELANCE_CLIENT
  
--- 1425,1433 ----
          require_64bit_ops = 1;
      }
  
!     osi_Log2(afsd_logp, "cm_GetBuffer: fetching data scp %p bufp %p", scp, bufp);
!     osi_Log3(afsd_logp, "cm_GetBuffer: fetching data scpDV 0x%x scpDVLow 0x%x bufDV 0x%x",
!              scp->dataVersion, scp->bufDataVersionLow, bufp->dataVersion);
  
  #ifdef AFS_FREELANCE_CLIENT
  
***************
*** 1593,1599 ****
                   * this buffer will start a prefetch.
                   */
                  tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED;
!                 lock_ObtainMutex(&scp->mx);
                  if (scp->flags & CM_SCACHEFLAG_WAITING) {
                      osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%p", scp);
                      osi_Wakeup((LONG_PTR) &scp->flags);
--- 1616,1622 ----
                   * this buffer will start a prefetch.
                   */
                  tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED;
!                 lock_ObtainWrite(&scp->rw);
                  if (scp->flags & CM_SCACHEFLAG_WAITING) {
                      osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%p", scp);
                      osi_Wakeup((LONG_PTR) &scp->flags);
***************
*** 1603,1609 ****
                      *cpffp = 1;
                      cm_ClearPrefetchFlag(0, scp, &biod.offset, &tlength);
                  }
!                 lock_ReleaseMutex(&scp->mx);
  
                  /* and adjust counters */
                  nbytes -= temp;
--- 1626,1632 ----
                      *cpffp = 1;
                      cm_ClearPrefetchFlag(0, scp, &biod.offset, &tlength);
                  }
!                 lock_ReleaseWrite(&scp->rw);
  
                  /* and adjust counters */
                  nbytes -= temp;
***************
*** 1671,1677 ****
    fetchingcompleted:
      code = cm_MapRPCError(code, reqp);
  
!     lock_ObtainMutex(&scp->mx);
      
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_FETCHSTATUS);
  
--- 1694,1700 ----
    fetchingcompleted:
      code = cm_MapRPCError(code, reqp);
  
!     lock_ObtainWrite(&scp->rw);
      
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_FETCHSTATUS);
  
***************
*** 1698,1706 ****
      }
  
      /* release scatter/gather I/O structure (buffers, locks) */
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseBIOD(&biod, 0, code);
!     lock_ObtainMutex(&scp->mx);
  
      if (code == 0) 
          cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, 0);
--- 1721,1729 ----
      }
  
      /* release scatter/gather I/O structure (buffers, locks) */
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseBIOD(&biod, 0, code);
!     lock_ObtainWrite(&scp->rw);
  
      if (code == 0) 
          cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, 0);
Index: openafs/src/WINNT/afsd/cm_dcache.h
diff -c openafs/src/WINNT/afsd/cm_dcache.h:1.4.4.5 openafs/src/WINNT/afsd/cm_dcache.h:1.4.4.6
*** openafs/src/WINNT/afsd/cm_dcache.h:1.4.4.5	Fri Feb 22 19:17:34 2008
--- openafs/src/WINNT/afsd/cm_dcache.h	Thu Feb 28 12:17:15 2008
***************
*** 57,60 ****
--- 57,63 ----
  
  extern long cm_ShutdownDCache(void);
  
+ extern long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
+                  cm_user_t *userp, cm_req_t *reqp);
+ 
  #endif /*  __CM_DCACHE_ENV__ */
Index: openafs/src/WINNT/afsd/cm_dir.c
diff -c openafs/src/WINNT/afsd/cm_dir.c:1.4.4.11 openafs/src/WINNT/afsd/cm_dir.c:1.4.4.14
*** openafs/src/WINNT/afsd/cm_dir.c:1.4.4.11	Fri Feb 22 19:17:34 2008
--- openafs/src/WINNT/afsd/cm_dir.c	Sun Mar  2 23:25:40 2008
***************
*** 136,145 ****
     entry is a string name.
  
     On entry:
!        op->scp->mx is unlocked
  
     On exit:
!        op->scp->mx is unlocked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
--- 136,145 ----
     entry is a string name.
  
     On entry:
!        op->scp->rw is unlocked
  
     On exit:
!        op->scp->rw is unlocked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
***************
*** 234,243 ****
  /* Return the length of a directory in pages
  
     On entry:
!        op->scp->mx is locked
  
     On exit:
!        op->scp->mx is locked
  
     The first directory page for op->scp should not be locked by the
     calling thread.
--- 234,243 ----
  /* Return the length of a directory in pages
  
     On entry:
!        op->scp->rw is locked
  
     On exit:
!        op->scp->rw is locked
  
     The first directory page for op->scp should not be locked by the
     calling thread.
***************
*** 271,280 ****
  /* Delete a directory entry.
  
     On entry:
!        op->scp->mx is unlocked
  
     On exit:
!        op->scp->mx is unlocked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
--- 271,280 ----
  /* Delete a directory entry.
  
     On entry:
!        op->scp->rw is unlocked
  
     On exit:
!        op->scp->rw is unlocked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
***************
*** 340,346 ****
  
  /* Find a bunch of contiguous entries; at least nblobs in a row.
  
!    Called with op->scp->mx */
  static long
  cm_DirFindBlobs(cm_dirOp_t * op, int nblobs)
  {
--- 340,346 ----
  
  /* Find a bunch of contiguous entries; at least nblobs in a row.
  
!    Called with op->scp->rw */
  static long
  cm_DirFindBlobs(cm_dirOp_t * op, int nblobs)
  {
***************
*** 444,450 ****
  
  /* Add a page to a directory. 
  
!    Called with op->scp->mx
  */
  static long
  cm_DirAddPage(cm_dirOp_t * op, int pageno)
--- 444,450 ----
  
  /* Add a page to a directory. 
  
!    Called with op->scp->rw
  */
  static long
  cm_DirAddPage(cm_dirOp_t * op, int pageno)
***************
*** 477,483 ****
  
  /* Free a whole bunch of directory entries.
  
!    Called with op->scp->mx
  */
  static long
  cm_DirFreeBlobs(cm_dirOp_t * op, int firstblob, int nblobs)
--- 477,483 ----
  
  /* Free a whole bunch of directory entries.
  
!    Called with op->scp->rw
  */
  static long
  cm_DirFreeBlobs(cm_dirOp_t * op, int firstblob, int nblobs)
***************
*** 528,534 ****
   * directory header page are allocated, 1 to the page header, 4 to the
   * allocation map and 8 to the hash table.
   *
!  * Called with op->scp->mx unlocked
   */
  int
  cm_DirMakeDir(cm_dirOp_t * op, cm_fid_t * me, cm_fid_t * parent)
--- 528,534 ----
   * directory header page are allocated, 1 to the page header, 4 to the
   * allocation map and 8 to the hash table.
   *
!  * Called with op->scp->rw unlocked
   */
  int
  cm_DirMakeDir(cm_dirOp_t * op, cm_fid_t * me, cm_fid_t * parent)
***************
*** 577,586 ****
  /* Look up a file name in directory.
  
     On entry:
!        op->scp->mx is unlocked
  
     On exit:
!        op->scp->mx is unlocked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
--- 577,586 ----
  /* Look up a file name in directory.
  
     On entry:
!        op->scp->rw is unlocked
  
     On exit:
!        op->scp->rw is unlocked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
***************
*** 636,645 ****
  /* Look up a file name in directory.
  
     On entry:
!        op->scp->mx is locked
  
     On exit:
!        op->scp->mx is locked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
--- 636,645 ----
  /* Look up a file name in directory.
  
     On entry:
!        op->scp->rw is locked
  
     On exit:
!        op->scp->rw is locked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
***************
*** 694,703 ****
  /* Apply a function to every directory entry in a directory.
  
     On entry:
!        op->scp->mx is locked
  
     On exit:
!        op->scp->mx is locked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
--- 694,703 ----
  /* Apply a function to every directory entry in a directory.
  
     On entry:
!        op->scp->rw is locked
  
     On exit:
!        op->scp->rw is locked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
***************
*** 749,758 ****
  /* Check if a directory is empty
  
     On entry:
!        op->scp->mx is locked
  
     On exit:
!        op->scp->mx is locked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
--- 749,758 ----
  /* Check if a directory is empty
  
     On entry:
!        op->scp->rw is locked
  
     On exit:
!        op->scp->rw is locked
  
     None of the directory buffers for op->scp should be locked by the
     calling thread.
***************
*** 802,816 ****
  /* Return a pointer to an entry, given its number.
  
     On entry:
!      scp->mx locked
       if *bufferpp != NULL, then *bufferpp->mx is locked
  
     During:
!      scp->mx may be unlocked
       *bufferpp may be released
  
     On exit:
!      scp->mx locked
       if *bufferpp != NULL, then *bufferpp->mx is locked
  
       *bufferpp should be released via cm_DirReleasePage() or any other
--- 802,816 ----
  /* Return a pointer to an entry, given its number.
  
     On entry:
!      scp->rw locked
       if *bufferpp != NULL, then *bufferpp->mx is locked
  
     During:
!      scp->rw may be unlocked
       *bufferpp may be released
  
     On exit:
!      scp->rw locked
       if *bufferpp != NULL, then *bufferpp->mx is locked
  
       *bufferpp should be released via cm_DirReleasePage() or any other
***************
*** 863,872 ****
   * pointer is returned instead.
   *
   * On entry:
!  *  scp->mx locked
   *
   * On exit:
!  *  scp->mx locked
   */
  static long
  cm_DirFindItem(cm_dirOp_t * op,
--- 863,872 ----
   * pointer is returned instead.
   *
   * On entry:
!  *  scp->rw locked
   *
   * On exit:
!  *  scp->rw locked
   */
  static long
  cm_DirFindItem(cm_dirOp_t * op,
***************
*** 959,965 ****
  }
  
  /* Begin a sequence of directory operations.  
!  * Called with scp->mx unlocked.
   */
  long
  cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp,
--- 959,965 ----
  }
  
  /* Begin a sequence of directory operations.  
!  * Called with scp->rw unlocked.
   */
  long
  cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp,
***************
*** 993,999 ****
          lock_ObtainRead(&scp->dirlock);
          haveWrite = 0;
      }
!     lock_ObtainMutex(&scp->mx);
      mxheld = 1;
      code = cm_DirCheckStatus(op, 1);
      if (code == 0) {
--- 993,999 ----
          lock_ObtainRead(&scp->dirlock);
          haveWrite = 0;
      }
!     lock_ObtainWrite(&scp->rw);
      mxheld = 1;
      code = cm_DirCheckStatus(op, 1);
      if (code == 0) {
***************
*** 1029,1043 ****
                repeat:
                  if (!haveWrite) {
                      if (mxheld) {
!                         lock_ReleaseMutex(&scp->mx);
                          mxheld = 0;
                      }
!                     lock_ReleaseRead(&scp->dirlock);
!                     lock_ObtainWrite(&scp->dirlock);
                      haveWrite = 1;
                  }
                  if (!mxheld) {
!                     lock_ObtainMutex(&scp->mx);
                      mxheld = 1;
                  }
                  if (scp->dirBplus && 
--- 1029,1042 ----
                repeat:
                  if (!haveWrite) {
                      if (mxheld) {
!                         lock_ReleaseWrite(&scp->rw);
                          mxheld = 0;
                      }
!                     lock_ConvertRToW(&scp->dirlock);
                      haveWrite = 1;
                  }
                  if (!mxheld) {
!                     lock_ObtainWrite(&scp->rw);
                      mxheld = 1;
                  }
                  if (scp->dirBplus && 
***************
*** 1052,1063 ****
  
                  if (!scp->dirBplus) {
                      if (mxheld) {
!                         lock_ReleaseMutex(&scp->mx);
                          mxheld = 0;
                      }
                      cm_BPlusDirBuildTree(scp, userp, reqp);
                      if (!mxheld) {
!                         lock_ObtainMutex(&scp->mx);
                          mxheld = 1;
                      }
                      if (op->dataVersion != scp->dataVersion) {
--- 1051,1062 ----
  
                  if (!scp->dirBplus) {
                      if (mxheld) {
!                         lock_ReleaseWrite(&scp->rw);
                          mxheld = 0;
                      }
                      cm_BPlusDirBuildTree(scp, userp, reqp);
                      if (!mxheld) {
!                         lock_ObtainWrite(&scp->rw);
                          mxheld = 1;
                      }
                      if (op->dataVersion != scp->dataVersion) {
***************
*** 1108,1121 ****
  #endif
          op->lockType = lockType;
          if (mxheld)
!             lock_ReleaseMutex(&scp->mx);
      } else {
          if (haveWrite)
              lock_ReleaseWrite(&scp->dirlock);
          else
              lock_ReleaseRead(&scp->dirlock);
          if (mxheld)
!             lock_ReleaseMutex(&scp->mx);
          cm_EndDirOp(op);
      }
  
--- 1107,1120 ----
  #endif
          op->lockType = lockType;
          if (mxheld)
!             lock_ReleaseWrite(&scp->rw);
      } else {
          if (haveWrite)
              lock_ReleaseWrite(&scp->dirlock);
          else
              lock_ReleaseRead(&scp->dirlock);
          if (mxheld)
!             lock_ReleaseWrite(&scp->rw);
          cm_EndDirOp(op);
      }
  
***************
*** 1123,1129 ****
  }
  
  /* Check if it is safe for us to perform local directory updates.
!    Called with scp->mx unlocked. */
  int
  cm_CheckDirOpForSingleChange(cm_dirOp_t * op)
  {
--- 1122,1128 ----
  }
  
  /* Check if it is safe for us to perform local directory updates.
!    Called with scp->rw unlocked. */
  int
  cm_CheckDirOpForSingleChange(cm_dirOp_t * op)
  {
***************
*** 1133,1139 ****
      if (op->scp == NULL)
          return 0;
  
!     lock_ObtainMutex(&op->scp->mx);
      code = cm_DirCheckStatus(op, 1);
  
      if (code == 0 &&
--- 1132,1138 ----
      if (op->scp == NULL)
          return 0;
  
!     lock_ObtainWrite(&op->scp->rw);
      code = cm_DirCheckStatus(op, 1);
  
      if (code == 0 &&
***************
*** 1146,1164 ****
  
          rc = 1;
      }
!     lock_ReleaseMutex(&op->scp->mx); 
      
      if (rc)
          osi_Log0(afsd_logp, "cm_CheckDirOpForSingleChange succeeded");
      else
          osi_Log3(afsd_logp,
!                  "cm_CheckDirOpForSingleChange failed.  code=0x%x, old dv=%I64d, new dv=%I64d",
                   code, op->dataVersion, op->scp->dataVersion);
      return rc;
  }
  
  /* End a sequence of directory operations.  
!  * Called with op->scp->mx unlocked.*/
  long
  cm_EndDirOp(cm_dirOp_t * op)
  {
--- 1145,1163 ----
  
          rc = 1;
      }
!     lock_ReleaseWrite(&op->scp->rw); 
      
      if (rc)
          osi_Log0(afsd_logp, "cm_CheckDirOpForSingleChange succeeded");
      else
          osi_Log3(afsd_logp,
!                  "cm_CheckDirOpForSingleChange failed.  code=0x%x, old dv=%d, new dv=%d",
                   code, op->dataVersion, op->scp->dataVersion);
      return rc;
  }
  
  /* End a sequence of directory operations.  
!  * Called with op->scp->rw unlocked.*/
  long
  cm_EndDirOp(cm_dirOp_t * op)
  {
***************
*** 1194,1202 ****
  
          /* we made changes.  We should go through the list of buffers
           * and update the dataVersion for each. */
!         lock_ObtainMutex(&op->scp->mx);
          code = buf_ForceDataVersion(op->scp, op->dataVersion, op->newDataVersion);
!         lock_ReleaseMutex(&op->scp->mx);
      }
  
      switch (op->lockType) {
--- 1193,1201 ----
  
          /* we made changes.  We should go through the list of buffers
           * and update the dataVersion for each. */
!         lock_ObtainWrite(&op->scp->rw);
          code = buf_ForceDataVersion(op->scp, op->dataVersion, op->newDataVersion);
!         lock_ReleaseWrite(&op->scp->rw);
      }
  
      switch (op->lockType) {
***************
*** 1223,1229 ****
      return code;
  }
  
! /* NOTE: Called without scp->mx and without bufferp->mx */
  static long
  cm_DirOpAddBuffer(cm_dirOp_t * op, cm_buf_t * bufferp)
  {
--- 1222,1228 ----
      return code;
  }
  
! /* NOTE: Called without scp->rw and without bufferp->mx */
  static long
  cm_DirOpAddBuffer(cm_dirOp_t * op, cm_buf_t * bufferp)
  {
***************
*** 1262,1268 ****
          osi_assert(i < CM_DIROP_MAXBUFFERS);
  
          lock_ObtainMutex(&bufferp->mx);
!         lock_ObtainMutex(&op->scp->mx);
  
          /* Make sure we are synchronized. */
          osi_assert(op->lockType != CM_DIRLOCK_NONE);
--- 1261,1267 ----
          osi_assert(i < CM_DIROP_MAXBUFFERS);
  
          lock_ObtainMutex(&bufferp->mx);
!         lock_ObtainWrite(&op->scp->rw);
  
          /* Make sure we are synchronized. */
          osi_assert(op->lockType != CM_DIRLOCK_NONE);
***************
*** 1273,1279 ****
                           CM_SCACHESYNC_BUFLOCKED);
  
          if (code == 0 && bufferp->dataVersion != op->dataVersion) {
!             osi_Log2(afsd_logp, "cm_DirOpAddBuffer: buffer data version mismatch. buf dv = %I64d. needs %I64d", 
                       bufferp->dataVersion, op->dataVersion);
  
              cm_SyncOpDone(op->scp, bufferp,
--- 1272,1278 ----
                           CM_SCACHESYNC_BUFLOCKED);
  
          if (code == 0 && bufferp->dataVersion != op->dataVersion) {
!             osi_Log2(afsd_logp, "cm_DirOpAddBuffer: buffer data version mismatch. buf dv = %d. needs %d", 
                       bufferp->dataVersion, op->dataVersion);
  
              cm_SyncOpDone(op->scp, bufferp,
***************
*** 1284,1290 ****
              code = CM_ERROR_INVAL;
          }
  
!         lock_ReleaseMutex(&op->scp->mx);
          lock_ReleaseMutex(&bufferp->mx);
  
          if (code) {
--- 1283,1289 ----
              code = CM_ERROR_INVAL;
          }
  
!         lock_ReleaseWrite(&op->scp->rw);
          lock_ReleaseMutex(&bufferp->mx);
  
          if (code) {
***************
*** 1306,1312 ****
      }
  }
  
! /* Note: Called without op->scp->mx */
  static int
  cm_DirOpFindBuffer(cm_dirOp_t * op, osi_hyper_t offset, cm_buf_t ** bufferpp)
  {
--- 1305,1311 ----
      }
  }
  
! /* Note: Called without op->scp->rw */
  static int
  cm_DirOpFindBuffer(cm_dirOp_t * op, osi_hyper_t offset, cm_buf_t ** bufferpp)
  {
***************
*** 1335,1341 ****
  }
  
  
! /* NOTE: called with scp->mx held or not depending on the flags */
  static int
  cm_DirOpDelBuffer(cm_dirOp_t * op, cm_buf_t * bufferp, int flags)
  {
--- 1334,1340 ----
  }
  
  
! /* NOTE: called with scp->rw held or not depending on the flags */
  static int
  cm_DirOpDelBuffer(cm_dirOp_t * op, cm_buf_t * bufferp, int flags)
  {
***************
*** 1367,1373 ****
                 version of the buffer with the data version of the
                 scp. */
              if (!(flags & DIROP_SCPLOCKED)) {
!                 lock_ObtainMutex(&op->scp->mx);
              }
  
              /* first make sure that the buffer is idle.  It should
--- 1366,1372 ----
                 version of the buffer with the data version of the
                 scp. */
              if (!(flags & DIROP_SCPLOCKED)) {
!                 lock_ObtainWrite(&op->scp->rw);
              }
  
              /* first make sure that the buffer is idle.  It should
***************
*** 1384,1395 ****
              osi_assert(bufferp->dataVersion == op->dataVersion);
  #endif
  
!             lock_ReleaseMutex(&op->scp->mx);
  
              lock_ObtainMutex(&bufferp->mx);
  
              if (flags & DIROP_SCPLOCKED) {
!                 lock_ObtainMutex(&op->scp->mx);
              }
  
              if (flags & DIROP_MODIFIED) {
--- 1383,1394 ----
              osi_assert(bufferp->dataVersion == op->dataVersion);
  #endif
  
!             lock_ReleaseWrite(&op->scp->rw);
  
              lock_ObtainMutex(&bufferp->mx);
  
              if (flags & DIROP_SCPLOCKED) {
!                 lock_ObtainWrite(&op->scp->rw);
              }
  
              if (flags & DIROP_MODIFIED) {
***************
*** 1434,1446 ****
     This should be called before cm_DirGetPage() is called per scp.
  
     On entry:
!      scp->mx locked state indicated by parameter
  
     On exit:
!      scp->mx same state as upon entry
  
     During:
!      scp->mx may be released
   */
  static long
  cm_DirCheckStatus(cm_dirOp_t * op, afs_uint32 locked)
--- 1433,1445 ----
     This should be called before cm_DirGetPage() is called per scp.
  
     On entry:
!      scp->rw locked state indicated by parameter
  
     On exit:
!      scp->rw same state as upon entry
  
     During:
!      scp->rw may be released
   */
  static long
  cm_DirCheckStatus(cm_dirOp_t * op, afs_uint32 locked)
***************
*** 1448,1458 ****
      long code;
  
      if (!locked)
!         lock_ObtainMutex(&op->scp->mx);
      code = cm_SyncOp(op->scp, NULL, op->userp, &op->req, PRSFS_LOOKUP,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (!locked)
!         lock_ReleaseMutex(&op->scp->mx);
  
      osi_Log2(afsd_logp, "cm_DirCheckStatus for op 0x%p returning code 0x%x",
               op, code);
--- 1447,1457 ----
      long code;
  
      if (!locked)
!         lock_ObtainWrite(&op->scp->rw);
      code = cm_SyncOp(op->scp, NULL, op->userp, &op->req, PRSFS_LOOKUP,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (!locked)
!         lock_ReleaseWrite(&op->scp->rw);
  
      osi_Log2(afsd_logp, "cm_DirCheckStatus for op 0x%p returning code 0x%x",
               op, code);
***************
*** 1464,1470 ****
     cm_DirGetPage() or any other function that returns a locked, held,
     directory page buffer.
  
!    Called with scp->mx unlocked
   */
  static long
  cm_DirReleasePage(cm_dirOp_t * op, cm_buf_t ** bufferpp, int modified)
--- 1463,1469 ----
     cm_DirGetPage() or any other function that returns a locked, held,
     directory page buffer.
  
!    Called with scp->rw unlocked
   */
  static long
  cm_DirReleasePage(cm_dirOp_t * op, cm_buf_t ** bufferpp, int modified)
***************
*** 1504,1518 ****
     should be released via cm_DirReleasePage().
  
     On entry:
!      scp->mx unlocked.
       If *bufferpp is non-NULL, then *bufferpp->mx is locked.
  
     On exit:
!      scp->mx unlocked
       If *bufferpp is non-NULL, then *bufferpp->mx is locked.
  
     During:
!      scp->mx will be obtained and released
  
   */
  static long
--- 1503,1517 ----
     should be released via cm_DirReleasePage().
  
     On entry:
!      scp->rw unlocked.
       If *bufferpp is non-NULL, then *bufferpp->mx is locked.
  
     On exit:
!      scp->rw unlocked
       If *bufferpp is non-NULL, then *bufferpp->mx is locked.
  
     During:
!      scp->rw will be obtained and released
  
   */
  static long
***************
*** 1586,1599 ****
             doing directory updates locally is to avoid fetching all
             the data from the server. */
          while (1) {
!             lock_ObtainMutex(&op->scp->mx);
              code = cm_SyncOp(op->scp, bufferp, op->userp, &op->req, PRSFS_LOOKUP,
                               CM_SCACHESYNC_NEEDCALLBACK |
                               CM_SCACHESYNC_READ |
                               CM_SCACHESYNC_BUFLOCKED);
  
              if (code) {
!                 lock_ReleaseMutex(&op->scp->mx);
                  break;
              }
  
--- 1585,1598 ----
             doing directory updates locally is to avoid fetching all
             the data from the server. */
          while (1) {
!             lock_ObtainWrite(&op->scp->rw);
              code = cm_SyncOp(op->scp, bufferp, op->userp, &op->req, PRSFS_LOOKUP,
                               CM_SCACHESYNC_NEEDCALLBACK |
                               CM_SCACHESYNC_READ |
                               CM_SCACHESYNC_BUFLOCKED);
  
              if (code) {
!                 lock_ReleaseWrite(&op->scp->rw);
                  break;
              }
  
***************
*** 1603,1615 ****
                            CM_SCACHESYNC_BUFLOCKED);
  
              if (cm_HaveBuffer(op->scp, bufferp, 1)) {
!                 lock_ReleaseMutex(&op->scp->mx);
                  break;
              }
  
              lock_ReleaseMutex(&bufferp->mx);
              code = cm_GetBuffer(op->scp, bufferp, NULL, op->userp, &op->req);
!             lock_ReleaseMutex(&op->scp->mx);
              lock_ObtainMutex(&bufferp->mx);
  
              if (code)
--- 1602,1614 ----
                            CM_SCACHESYNC_BUFLOCKED);
  
              if (cm_HaveBuffer(op->scp, bufferp, 1)) {
!                 lock_ReleaseWrite(&op->scp->rw);
                  break;
              }
  
              lock_ReleaseMutex(&bufferp->mx);
              code = cm_GetBuffer(op->scp, bufferp, NULL, op->userp, &op->req);
!             lock_ReleaseWrite(&op->scp->rw);
              lock_ObtainMutex(&bufferp->mx);
  
              if (code)
Index: openafs/src/WINNT/afsd/cm_dnlc.c
diff -c openafs/src/WINNT/afsd/cm_dnlc.c:1.10.4.3 openafs/src/WINNT/afsd/cm_dnlc.c:1.10.4.6
*** openafs/src/WINNT/afsd/cm_dnlc.c:1.10.4.3	Sat Oct  7 18:33:29 2006
--- openafs/src/WINNT/afsd/cm_dnlc.c	Fri Feb 29 10:58:53 2008
***************
*** 26,31 ****
--- 26,32 ----
  #include <stdlib.h>
  #include <osi.h>
  #include "afsd.h"
+ #include <WINNT/afsreg.h>
  
  osi_rwlock_t cm_dnlcLock;
  
***************
*** 113,118 ****
--- 114,120 ----
      unsigned int key, skey, new=0;
      char *ts = aname;
      int safety;
+     int writeLocked = 0;
  
      if (!cm_useDnlc)
  	return ;
***************
*** 129,137 ****
  	return ;
      skey = key & (NHSIZE -1);
  
!     lock_ObtainWrite(&cm_dnlcLock);
!     dnlcstats.enters++;
!   
      for (tnc = cm_data.nameHash[skey], safety=0; tnc; tnc = tnc->next, safety++ )
  	if ((tnc->dirp == adp) && (!strcmp(tnc->name, aname)))
  	    break;				/* preexisting entry */
--- 131,139 ----
  	return ;
      skey = key & (NHSIZE -1);
  
!     InterlockedIncrement(&dnlcstats.enters);
!     lock_ObtainRead(&cm_dnlcLock);
!   retry:
      for (tnc = cm_data.nameHash[skey], safety=0; tnc; tnc = tnc->next, safety++ )
  	if ((tnc->dirp == adp) && (!strcmp(tnc->name, aname)))
  	    break;				/* preexisting entry */
***************
*** 142,149 ****
  	}
  	else if (safety > NCSIZE) 
  	{
! 	    dnlcstats.cycles++;
! 	    lock_ReleaseWrite(&cm_dnlcLock);
  
  	    if ( cm_debugDnlc )
                  osi_Log0(afsd_logp, "DNLC cycle");
--- 144,154 ----
  	}
  	else if (safety > NCSIZE) 
  	{
! 	    InterlockedIncrement(&dnlcstats.cycles);
!             if (writeLocked)
!                 lock_ReleaseWrite(&cm_dnlcLock);
!             else
!                 lock_ReleaseRead(&cm_dnlcLock);
  
  	    if ( cm_debugDnlc )
                  osi_Log0(afsd_logp, "DNLC cycle");
***************
*** 153,158 ****
--- 158,168 ----
  	
      if ( !tnc )
      {
+         if ( !writeLocked ) {
+             lock_ConvertRToW(&cm_dnlcLock);
+             writeLocked = 1;
+             goto retry;
+         }
  	new = 1;	/* entry does not exist, we are creating a new entry*/
  	tnc = GetMeAnEntry();
      }
***************
*** 167,173 ****
  		InsertEntry(tnc);
  
      }
!     lock_ReleaseWrite(&cm_dnlcLock);
  
      if ( !tnc)
  	cm_dnlcPurge();
--- 177,186 ----
  		InsertEntry(tnc);
  
      }
!     if (writeLocked)
!         lock_ReleaseWrite(&cm_dnlcLock);
!     else
!         lock_ReleaseRead(&cm_dnlcLock);
  
      if ( !tnc)
  	cm_dnlcPurge();
***************
*** 188,205 ****
    
      if (!cm_useDnlc)
  	return NULL;
      if ( cm_debugDnlc ) 
  	osi_Log2(afsd_logp, "cm_dnlcLookup dir %x name %s", 
  		adp, osi_LogSaveString(afsd_logp,aname));
  
      dnlcHash( ts, key );  /* leaves ts pointing at the NULL */
!     if (ts - aname >= CM_AFSNCNAMESIZE) 
  	return NULL;
  
      skey = key & (NHSIZE -1);
  
      lock_ObtainRead(&cm_dnlcLock);
!     dnlcstats.lookups++;	     /* Is a dnlcread lock sufficient? */
  
      ts = 0;
      tnc_begin = cm_data.nameHash[skey];
--- 201,223 ----
    
      if (!cm_useDnlc)
  	return NULL;
+ 
      if ( cm_debugDnlc ) 
  	osi_Log2(afsd_logp, "cm_dnlcLookup dir %x name %s", 
  		adp, osi_LogSaveString(afsd_logp,aname));
  
      dnlcHash( ts, key );  /* leaves ts pointing at the NULL */
! 
!     if (ts - aname >= CM_AFSNCNAMESIZE) {
!         InterlockedIncrement(&dnlcstats.lookups);
!         InterlockedIncrement(&dnlcstats.misses);
  	return NULL;
+     }
  
      skey = key & (NHSIZE -1);
  
      lock_ObtainRead(&cm_dnlcLock);
!     InterlockedIncrement(&dnlcstats.lookups);
  
      ts = 0;
      tnc_begin = cm_data.nameHash[skey];
***************
*** 258,264 ****
  	}
  	else if (tnc->next == tnc_begin || safety > NCSIZE) 
  	{
! 	    dnlcstats.cycles++;
  	    lock_ReleaseRead(&cm_dnlcLock);
  
  	    if ( cm_debugDnlc ) 
--- 276,282 ----
  	}
  	else if (tnc->next == tnc_begin || safety > NCSIZE) 
  	{
! 	    InterlockedIncrement(&dnlcstats.cycles);
  	    lock_ReleaseRead(&cm_dnlcLock);
  
  	    if ( cm_debugDnlc ) 
***************
*** 276,282 ****
      }
  
      if (!tvc) 
!         dnlcstats.misses++; 	/* Is a dnlcread lock sufficient? */
      else 
      {
          sp->found = 1;
--- 294,300 ----
      }
  
      if (!tvc) 
!         InterlockedIncrement(&dnlcstats.misses);
      else 
      {
          sp->found = 1;
***************
*** 341,347 ****
  
      skey = key & (NHSIZE -1);
      lock_ObtainWrite(&cm_dnlcLock);
!     dnlcstats.removes++;
  
      for (tnc = cm_data.nameHash[skey], safety=0; tnc; safety++) 
      {
--- 359,365 ----
  
      skey = key & (NHSIZE -1);
      lock_ObtainWrite(&cm_dnlcLock);
!     InterlockedIncrement(&dnlcstats.removes);
  
      for (tnc = cm_data.nameHash[skey], safety=0; tnc; safety++) 
      {
***************
*** 365,371 ****
  	    tnc = tnc->next;
  	if ( safety > NCSIZE )
  	{
! 	    dnlcstats.cycles++;
  	    lock_ReleaseWrite(&cm_dnlcLock);
  
  	    if ( cm_debugDnlc ) 
--- 383,389 ----
  	    tnc = tnc->next;
  	if ( safety > NCSIZE )
  	{
! 	    InterlockedIncrement(&dnlcstats.cycles);
  	    lock_ReleaseWrite(&cm_dnlcLock);
  
  	    if ( cm_debugDnlc ) 
***************
*** 397,403 ****
  	osi_Log1(afsd_logp, "cm_dnlcPurgedp dir %x", adp);
  
      lock_ObtainWrite(&cm_dnlcLock);
!     dnlcstats.purgeds++;
  
      for (i=0; i<NCSIZE && !err; i++) 
      {
--- 415,421 ----
  	osi_Log1(afsd_logp, "cm_dnlcPurgedp dir %x", adp);
  
      lock_ObtainWrite(&cm_dnlcLock);
!     InterlockedIncrement(&dnlcstats.purgeds);
  
      for (i=0; i<NCSIZE && !err; i++) 
      {
***************
*** 434,440 ****
  	osi_Log1(afsd_logp, "cm_dnlcPurgevp scache %x", avc);
  
      lock_ObtainWrite(&cm_dnlcLock);
!     dnlcstats.purgevs++;
  
      for (i=0; i<NCSIZE && !err ; i++) 
      {
--- 452,458 ----
  	osi_Log1(afsd_logp, "cm_dnlcPurgevp scache %x", avc);
  
      lock_ObtainWrite(&cm_dnlcLock);
!     InterlockedIncrement(&dnlcstats.purgevs);
  
      for (i=0; i<NCSIZE && !err ; i++) 
      {
***************
*** 469,475 ****
  	osi_Log0(afsd_logp, "cm_dnlcPurge");
  
      lock_ObtainWrite(&cm_dnlcLock);
!     dnlcstats.purges++;
      
      cm_data.ncfreelist = (cm_nc_t *) 0;
      memset (cm_data.nameCache, 0, sizeof(cm_nc_t) * NCSIZE);
--- 487,493 ----
  	osi_Log0(afsd_logp, "cm_dnlcPurge");
  
      lock_ObtainWrite(&cm_dnlcLock);
!     InterlockedIncrement(&dnlcstats.purges);
      
      cm_data.ncfreelist = (cm_nc_t *) 0;
      memset (cm_data.nameCache, 0, sizeof(cm_nc_t) * NCSIZE);
***************
*** 493,499 ****
      if (!cm_useDnlc)
          return ;
  
!     dnlcstats.purgevols++;
      cm_dnlcPurge();
  }
  
--- 511,517 ----
      if (!cm_useDnlc)
          return ;
  
!     InterlockedIncrement(&dnlcstats.purgevols);
      cm_dnlcPurge();
  }
  
***************
*** 627,635 ****
  cm_dnlcInit(int newFile)
  {
      int i;
! 
!     if (!cm_useDnlc)
!         return ;
  
      if ( cm_debugDnlc )
  	osi_Log0(afsd_logp,"cm_dnlcInit");
--- 645,673 ----
  cm_dnlcInit(int newFile)
  {
      int i;
!     HKEY parmKey;
!     DWORD dummyLen;
!     DWORD dwValue;
!     DWORD code;
! 
!     code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY,
!                          0, KEY_QUERY_VALUE, &parmKey);
!     if (code == ERROR_SUCCESS) {
!         dummyLen = sizeof(DWORD);
!         code = RegQueryValueEx(parmKey, "UseDNLC", NULL, NULL,
!                                 (BYTE *) &dwValue, &dummyLen);
!         if (code == ERROR_SUCCESS)
!             cm_useDnlc = dwValue ? 1 : 0;
!         afsi_log("CM UseDNLC = %d", cm_useDnlc);
! 
!         dummyLen = sizeof(DWORD);
!         code = RegQueryValueEx(parmKey, "DebugDNLC", NULL, NULL,
!                                 (BYTE *) &dwValue, &dummyLen);
!         if (code == ERROR_SUCCESS)
!             cm_debugDnlc = dwValue ? 1 : 0;
!         afsi_log("CM DebugDNLC = %d", cm_debugDnlc);
!         RegCloseKey (parmKey);
!     }
  
      if ( cm_debugDnlc )
  	osi_Log0(afsd_logp,"cm_dnlcInit");
Index: openafs/src/WINNT/afsd/cm_dnlc.h
diff -c openafs/src/WINNT/afsd/cm_dnlc.h:1.4.6.1 openafs/src/WINNT/afsd/cm_dnlc.h:1.4.6.2
*** openafs/src/WINNT/afsd/cm_dnlc.h:1.4.6.1	Mon Feb 19 22:14:45 2007
--- openafs/src/WINNT/afsd/cm_dnlc.h	Tue Feb 26 23:55:16 2008
***************
*** 24,32 ****
  } cm_nc_t;
  
  typedef struct {
!     unsigned int enters, lookups, misses, removes;
!     unsigned int purgeds, purgevs, purgevols, purges;
!     unsigned int cycles, lookuprace;
  } cm_dnlcstats_t;
  
  #define dnlcHash(ts, hval) for (hval=0; *ts; ts++) {    \
--- 24,32 ----
  } cm_nc_t;
  
  typedef struct {
!     afs_int32 enters, lookups, misses, removes;
!     afs_int32 purgeds, purgevs, purgevols, purges;
!     afs_int32 cycles, lookuprace;
  } cm_dnlcstats_t;
  
  #define dnlcHash(ts, hval) for (hval=0; *ts; ts++) {    \
Index: openafs/src/WINNT/afsd/cm_freelance.c
diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.7 openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.9
*** openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.7	Fri Feb 22 19:17:35 2008
--- openafs/src/WINNT/afsd/cm_freelance.c	Sun Mar  2 23:25:40 2008
***************
*** 23,29 ****
  extern void afsi_log(char *pattern, ...);
  
  int cm_noLocalMountPoints;
! int cm_fakeDirSize;
  int cm_fakeDirCallback=0;
  int cm_fakeGettingCallback=0;
  cm_localMountPoint_t* cm_localMountPoints;
--- 23,30 ----
  extern void afsi_log(char *pattern, ...);
  
  int cm_noLocalMountPoints;
! char * cm_FakeRootDir = NULL;
! int cm_fakeDirSize = 0;
  int cm_fakeDirCallback=0;
  int cm_fakeGettingCallback=0;
  cm_localMountPoint_t* cm_localMountPoints;
***************
*** 231,238 ****
      }
  
      dirSize = (curPage+1) *  CM_DIR_PAGESIZE;
!     cm_FakeRootDir = malloc(dirSize);
!     cm_fakeDirSize = dirSize;
  
      // yj: when we get here, we've figured out how much memory we need and 
      // allocated the appropriate space for it. we now prceed to fill
--- 232,243 ----
      }
  
      dirSize = (curPage+1) *  CM_DIR_PAGESIZE;
!     if (cm_fakeDirSize != dirSize) {
!         if (cm_FakeRootDir)
!             free(cm_FakeRootDir);
!         cm_FakeRootDir = malloc(dirSize);
!         cm_fakeDirSize = dirSize;
!     }
  
      // yj: when we get here, we've figured out how much memory we need and 
      // allocated the appropriate space for it. we now prceed to fill
***************
*** 410,418 ****
                  // mark the scp to be reused
                  cm_HoldSCacheNoLock(scp);
                  lock_ReleaseWrite(&cm_scacheLock);
!                 lock_ObtainMutex(&scp->mx);
                  cm_DiscardSCache(scp);
!                 lock_ReleaseMutex(&scp->mx);
                  cm_CallbackNotifyChange(scp);
                  lock_ObtainWrite(&cm_scacheLock);
                  cm_ReleaseSCacheNoLock(scp);
--- 415,423 ----
                  // mark the scp to be reused
                  cm_HoldSCacheNoLock(scp);
                  lock_ReleaseWrite(&cm_scacheLock);
!                 lock_ObtainWrite(&scp->rw);
                  cm_DiscardSCache(scp);
!                 lock_ReleaseWrite(&scp->rw);
                  cm_CallbackNotifyChange(scp);
                  lock_ObtainWrite(&cm_scacheLock);
                  cm_ReleaseSCacheNoLock(scp);
***************
*** 423,431 ****
                       lscpp = &tscp->nextp, tscp = tscp->nextp) {
                      if (tscp == scp) {
                          *lscpp = scp->nextp;
! 			lock_ObtainMutex(&scp->mx);
                          scp->flags &= ~CM_SCACHEFLAG_INHASH;
! 			lock_ReleaseMutex(&scp->mx);
                          break;
                      }
                  }
--- 428,436 ----
                       lscpp = &tscp->nextp, tscp = tscp->nextp) {
                      if (tscp == scp) {
                          *lscpp = scp->nextp;
! 			lock_ObtainWrite(&scp->rw);
                          scp->flags &= ~CM_SCACHEFLAG_INHASH;
! 			lock_ReleaseWrite(&scp->rw);
                          break;
                      }
                  }
***************
*** 447,457 ****
      cm_InitLocalMountPoints();
      osi_Log0(afsd_logp,"\tcreated new set of localmountpoints!");
  
-     // now we have to free the memory allocated in cm_initfakerootdir
-     osi_Log0(afsd_logp,"Removing old fakedir...  ");
-     free(cm_FakeRootDir);
-     osi_Log0(afsd_logp,"\t\told fakedir removed!");
- 
      // then we re-create that dir
      osi_Log0(afsd_logp,"Creating new fakedir...  ");
      cm_InitFakeRootDir();
--- 452,457 ----
Index: openafs/src/WINNT/afsd/cm_ioctl.c
diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.36 openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.40
*** openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.36	Fri Feb 22 19:17:35 2008
--- openafs/src/WINNT/afsd/cm_ioctl.c	Wed Mar 19 09:59:30 2008
***************
*** 44,50 ****
  #include "cm_rpc.h"
  #include <strsafe.h>
  #include <winioctl.h>
- #include <..\afsrdr\kif.h>
  #include <rx\rx.h>
  
  #ifdef _DEBUG
--- 44,49 ----
***************
*** 73,81 ****
  
      code = buf_CleanVnode(scp, userp, reqp);
          
!     lock_ObtainMutex(&scp->mx);
      cm_DiscardSCache(scp);
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log2(afsd_logp,"cm_CleanFile scp 0x%x returns error: [%x]",scp, code);
      return code;
--- 72,80 ----
  
      code = buf_CleanVnode(scp, userp, reqp);
          
!     lock_ObtainWrite(&scp->rw);
      cm_DiscardSCache(scp);
!     lock_ReleaseWrite(&scp->rw);
  
      osi_Log2(afsd_logp,"cm_CleanFile scp 0x%x returns error: [%x]",scp, code);
      return code;
***************
*** 94,103 ****
  
      code = buf_FlushCleanPages(scp, userp, reqp);
          
!     lock_ObtainMutex(&scp->mx);
      cm_DiscardSCache(scp);
  
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log2(afsd_logp,"cm_FlushFile scp 0x%x returns error: [%x]",scp, code);
      return code;
--- 93,102 ----
  
      code = buf_FlushCleanPages(scp, userp, reqp);
          
!     lock_ObtainWrite(&scp->rw);
      cm_DiscardSCache(scp);
  
!     lock_ReleaseWrite(&scp->rw);
  
      osi_Log2(afsd_logp,"cm_FlushFile scp 0x%x returns error: [%x]",scp, code);
      return code;
***************
*** 164,172 ****
          for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
              cm_HoldSCacheNoLock(scp);
              lock_ReleaseWrite(&cm_scacheLock);
!             lock_ObtainMutex(&scp->mx);
              cm_InvalidateACLUser(scp, userp);
!             lock_ReleaseMutex(&scp->mx);
              lock_ObtainWrite(&cm_scacheLock);
              cm_ReleaseSCacheNoLock(scp);
          }
--- 163,171 ----
          for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
              cm_HoldSCacheNoLock(scp);
              lock_ReleaseWrite(&cm_scacheLock);
!             lock_ObtainWrite(&scp->rw);
              cm_InvalidateACLUser(scp, userp);
!             lock_ReleaseWrite(&scp->rw);
              lock_ObtainWrite(&cm_scacheLock);
              cm_ReleaseSCacheNoLock(scp);
          }
***************
*** 213,222 ****
  	cm_scache_t **scpp, afs_uint32 flags)
  {
      long code;
- #ifndef AFSIFS
      cm_scache_t *substRootp = NULL;
      cm_scache_t *iscp = NULL;
- #endif
      char * relativePath;
      char * lastComponent = NULL;
      afs_uint32 follow = (flags & CM_PARSE_FLAG_LITERAL ? CM_FLAG_NOMOUNTCHASE : CM_FLAG_FOLLOW);
--- 212,219 ----
***************
*** 245,265 ****
      /* This is usually nothing, but for StatMountPoint it is the file name. */
      // TranslateExtendedChars(ioctlp->inDatap);
  
- #ifdef AFSIFS
-     /* we have passed the whole path, including the afs prefix.
-        when the pioctl call is made, we perform an ioctl to afsrdr
-        and it returns the correct (full) path.  therefore, there is
-        no drive letter, and the path is absolute. */
-     code = cm_NameI(cm_data.rootSCachep, relativePath,
-                      CM_FLAG_CASEFOLD,
-                      userp, "", reqp, scpp);
- 
-     if (code) {
- 	osi_Log1(afsd_logp,"cm_ParseIoctlPath code 0x%x", code);
- 	return code;
-     }
- #else /* AFSIFS */
- 
      if (relativePath[0] == relativePath[1] &&
           relativePath[1] == '\\' && 
           !_strnicmp(cm_NetbiosName,relativePath+2,strlen(cm_NetbiosName))) 
--- 242,247 ----
***************
*** 397,403 ****
              return code;
  	}
      }
- #endif /* AFSIFS */
  
      if (substRootp)
  	cm_ReleaseSCache(substRootp);
--- 379,384 ----
***************
*** 754,762 ****
          code = cm_MapRPCError(code, &req);
  
          /* invalidate cache info, since we just trashed the ACL cache */
!         lock_ObtainMutex(&scp->mx);
          cm_DiscardSCache(scp);
!         lock_ReleaseMutex(&scp->mx);
      }
      cm_ReleaseSCache(scp);
  
--- 735,743 ----
          code = cm_MapRPCError(code, &req);
  
          /* invalidate cache info, since we just trashed the ACL cache */
!         lock_ObtainWrite(&scp->rw);
          cm_DiscardSCache(scp);
!         lock_ReleaseWrite(&scp->rw);
      }
      cm_ReleaseSCache(scp);
  
***************
*** 904,910 ****
              return CM_ERROR_READONLY;
          }
  
!         code = cm_GetVolumeByID(cellp, scp->fid.volume, userp, &req, 
                                   CM_GETVOL_FLAG_CREATE, &tvp);
          if (code) {
              cm_ReleaseSCache(scp);
--- 885,891 ----
              return CM_ERROR_READONLY;
          }
  
!         code = cm_FindVolumeByID(cellp, scp->fid.volume, userp, &req, 
                                   CM_GETVOL_FLAG_CREATE, &tvp);
          if (code) {
              cm_ReleaseSCache(scp);
***************
*** 1230,1236 ****
      } else 
  #endif
      {
!         code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp);
          if (code) 
              return code;
  	
--- 1211,1217 ----
      } else 
  #endif
      {
!         code = cm_FindVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp);
          if (code) 
              return code;
  	
***************
*** 1278,1288 ****
      cm_ReleaseSCache(dscp);
      if (code) return code;
          
!     lock_ObtainMutex(&scp->mx);
  
      /* now check that this is a real mount point */
      if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) {
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          return CM_ERROR_INVAL;
      }
--- 1259,1269 ----
      cm_ReleaseSCache(dscp);
      if (code) return code;
          
!     lock_ObtainWrite(&scp->rw);
  
      /* now check that this is a real mount point */
      if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) {
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          return CM_ERROR_INVAL;
      }
***************
*** 1294,1300 ****
          cp += strlen(cp) + 1;
          ioctlp->outDatap = cp;
      }
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
  
      return code;
--- 1275,1281 ----
          cp += strlen(cp) + 1;
          ioctlp->outDatap = cp;
      }
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
  
      return code;
***************
*** 1322,1346 ****
          goto done2;
      }
          
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {     
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          goto done2;
      }
  
      /* now check that this is a real mount point */
      if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) {
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          code = CM_ERROR_INVAL;
          goto done1;
      }
  
      /* time to make the RPC, so drop the lock */
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
  
      /* easier to do it this way */
--- 1303,1327 ----
          goto done2;
      }
          
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {     
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          goto done2;
      }
  
      /* now check that this is a real mount point */
      if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) {
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          code = CM_ERROR_INVAL;
          goto done1;
      }
  
      /* time to make the RPC, so drop the lock */
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
  
      /* easier to do it this way */
***************
*** 1351,1359 ****
                            dscp, cp, NULL, TRUE);
  
    done1:
!     lock_ObtainMutex(&scp->mx);
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!     lock_ReleaseMutex(&scp->mx);
  
    done2:
      cm_ReleaseSCache(dscp);
--- 1332,1340 ----
                            dscp, cp, NULL, TRUE);
  
    done1:
!     lock_ObtainWrite(&scp->rw);
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!     lock_ReleaseWrite(&scp->rw);
  
    done2:
      cm_ReleaseSCache(dscp);
***************
*** 2187,2193 ****
      if (code)
          goto done3;
          
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code)
--- 2168,2174 ----
      if (code)
          goto done3;
          
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code)
***************
*** 2202,2208 ****
      }
  	
      /* time to make the RPC, so drop the lock */
!     lock_ReleaseMutex(&scp->mx);
          
      /* easier to do it this way */
      code = cm_Unlink(dscp, cp, userp, &req);
--- 2183,2189 ----
      }
  	
      /* time to make the RPC, so drop the lock */
!     lock_ReleaseWrite(&scp->rw);
          
      /* easier to do it this way */
      code = cm_Unlink(dscp, cp, userp, &req);
***************
*** 2212,2223 ****
                            | FILE_NOTIFY_CHANGE_DIR_NAME,
                            dscp, cp, NULL, TRUE);
  
!     lock_ObtainMutex(&scp->mx);
    done1:
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
    done2:
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
  
    done3:
--- 2193,2204 ----
                            | FILE_NOTIFY_CHANGE_DIR_NAME,
                            dscp, cp, NULL, TRUE);
  
!     lock_ObtainWrite(&scp->rw);
    done1:
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
    done2:
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
  
    done3:
***************
*** 2316,2324 ****
      afs_uuid_t uuid;
      int flags;
      char sessionKey[8];
- #ifndef AFSIFS
      char *smbname;
- #endif
      int release_userp = 0;
      char * wdir = NULL;
  
--- 2297,2303 ----
***************
*** 2366,2372 ****
          uname = tp;
          tp += strlen(tp) + 1;
  
- #ifndef AFSIFS	/* no SMB username, so we cannot logon based on this */
          if (flags & PIOCTL_LOGON) {
              /* SMB user name with which to associate tokens */
              smbname = tp;
--- 2345,2350 ----
***************
*** 2378,2384 ****
              osi_Log1(smb_logp,"cm_IoctlSetToken for user [%s]",
                       osi_LogSaveString(smb_logp, uname));
          }
- #endif
  
  #ifndef DJGPP   /* for win95, session key is back in pioctl */
  		/* uuid */
--- 2356,2361 ----
***************
*** 2391,2403 ****
          osi_Log0(smb_logp,"cm_IoctlSetToken - no name specified");
      }
  
- #ifndef AFSIFS
      if (flags & PIOCTL_LOGON) {
          userp = smb_FindCMUserByName(smbname, ioctlp->fidp->vcp->rname,
  				     SMB_FLAG_CREATE|SMB_FLAG_AFSLOGON);
  	release_userp = 1;
      }
- #endif /* AFSIFS */
  
      /* store the token */
      lock_ObtainMutex(&userp->mx);
--- 2368,2378 ----
***************
*** 3161,3167 ****
          if (!cellp)
              return CM_ERROR_NOSUCHCELL;
  
!         code = cm_GetVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp);
          if (code) 
              return code;
  	
--- 3136,3142 ----
          if (!cellp)
              return CM_ERROR_NOSUCHCELL;
  
!         code = cm_FindVolumeByID(cellp, volume, userp, &req, CM_GETVOL_FLAG_CREATE, &tvp);
          if (code) 
              return code;
  	
***************
*** 3257,3267 ****
          if (n)
              testp->fid.volume = n;
          else
!             code = cm_GetVolumeByName(cellp, testp->volname, userp, &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
      }
  
      if (testp->fid.volume > 0)
!         code = cm_GetVolumeByID(cellp, testp->fid.volume, userp, &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
  
      if (code)
          return code;
--- 3232,3242 ----
          if (n)
              testp->fid.volume = n;
          else
!             code = cm_FindVolumeByName(cellp, testp->volname, userp, &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
      }
  
      if (testp->fid.volume > 0)
!         code = cm_FindVolumeByID(cellp, testp->fid.volume, userp, &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
  
      if (code)
          return code;
Index: openafs/src/WINNT/afsd/cm_memmap.c
diff -c openafs/src/WINNT/afsd/cm_memmap.c:1.7.2.8 openafs/src/WINNT/afsd/cm_memmap.c:1.7.2.10
*** openafs/src/WINNT/afsd/cm_memmap.c:1.7.2.8	Wed Jan  2 10:55:00 2008
--- openafs/src/WINNT/afsd/cm_memmap.c	Wed Mar 19 20:01:59 2008
***************
*** 622,636 ****
  }
  
  int
! cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, 
!                     afs_uint64 cacheBlocks, afs_uint32 blockSize)
  {
      HANDLE hf = INVALID_HANDLE_VALUE, hm;
      PSECURITY_ATTRIBUTES psa;
      int newFile = 1;
      afs_uint64 mappingSize;
-     DWORD maxVols = stats/2;
-     DWORD maxCells = stats/4;
      DWORD volumeSerialNumber = 0;
      DWORD sidStringSize = 0;
      DWORD rc;
--- 622,634 ----
  }
  
  int
! cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD maxVols, DWORD maxCells,
!                     DWORD chunkSize, afs_uint64 cacheBlocks, afs_uint32 blockSize)
  {
      HANDLE hf = INVALID_HANDLE_VALUE, hm;
      PSECURITY_ATTRIBUTES psa;
      int newFile = 1;
      afs_uint64 mappingSize;
      DWORD volumeSerialNumber = 0;
      DWORD sidStringSize = 0;
      DWORD rc;
Index: openafs/src/WINNT/afsd/cm_memmap.h
diff -c openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.7 openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.10
*** openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.7	Fri Feb 22 19:17:35 2008
--- openafs/src/WINNT/afsd/cm_memmap.h	Wed Mar 19 20:01:59 2008
***************
*** 10,16 ****
  #ifndef CM_MEMMAP_H
  #define CM_MEMMAP_H 1
  
! #define CM_CONFIG_DATA_VERSION  1
  #define CM_CONFIG_DATA_MAGIC            ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
  
  typedef struct cm_config_data {
--- 10,16 ----
  #ifndef CM_MEMMAP_H
  #define CM_MEMMAP_H 1
  
! #define CM_CONFIG_DATA_VERSION  2
  #define CM_CONFIG_DATA_MAGIC            ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
  
  typedef struct cm_config_data {
***************
*** 116,120 ****
  VOID  FreeCacheFileSA(PSECURITY_ATTRIBUTES psa);
  int   cm_ShutdownMappedMemory(void);
  int   cm_ValidateMappedMemory(char * cachePath);
! int   cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, afs_uint64 cacheBlocks, afs_uint32 blockSize);
  #endif /* CM_MEMMAP_H */
\ No newline at end of file
--- 116,120 ----
  VOID  FreeCacheFileSA(PSECURITY_ATTRIBUTES psa);
  int   cm_ShutdownMappedMemory(void);
  int   cm_ValidateMappedMemory(char * cachePath);
! int   cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD maxVols, DWORD maxCells, DWORD chunkSize, afs_uint64 cacheBlocks, afs_uint32 blockSize);
  #endif /* CM_MEMMAP_H */
\ No newline at end of file
Index: openafs/src/WINNT/afsd/cm_performance.c
diff -c /dev/null openafs/src/WINNT/afsd/cm_performance.c:1.1.2.4
*** /dev/null	Sat Mar 22 21:01:33 2008
--- openafs/src/WINNT/afsd/cm_performance.c	Thu Mar 13 00:39:17 2008
***************
*** 0 ****
--- 1,549 ----
+ /* 
+  *  Copyright (c) 2008 - Secure Endpoints Inc.
+  */
+ 
+ #include <afs/param.h>
+ #include <afs/stds.h>
+ 
+ #include <windows.h>
+ #include <winsock2.h>
+ #include <iphlpapi.h>
+ #include <stdlib.h>
+ #include <malloc.h>
+ #include <string.h>
+ 
+ #include "afsd.h"
+ 
+ static cm_fid_stats_t ** fidStatsHashTablep = NULL;
+ static afs_uint32        fidStatsHashTableSize = 0;
+ 
+ /*
+  * algorithm and implementation adapted from code written by
+  * Frank Pilhofer <fp@fpx.de> 
+  */
+ afs_uint32 nearest_prime(afs_uint32 s)
+ {
+ #define TEST(f,x)	(*(f+(x)/16)&(1<<(((x)%16L)/2)))
+ #define SET(f,x)	*(f+(x)/16)|=1<<(((x)%16L)/2)
+     unsigned char *feld=NULL, *zzz;
+     afs_uint32 teste=1, mom, hits=1, count, max, alloc, largest_prime = 0;
+ 
+     max = s + 10000L;
+ 
+     while (feld==NULL)
+         zzz = feld = malloc (alloc=((max>>4)+1L));
+ 
+     for (count=0; count<alloc; count++) 
+         *zzz++ = 0x00;
+ 
+     while ((teste+=2) < max) {
+         if (!TEST(feld, teste)) {
+             for (mom=3L*teste; mom<max; mom+=teste<<1) 
+                 SET (feld, mom);
+         }
+     }
+ 
+     count=s-2; 
+     if (s%2==0) 
+         count++;
+     while ((count+=2)<max) {
+         if (!TEST(feld,count)) {
+             largest_prime = count;
+             break;
+         }
+     }
+     free (feld);
+     return largest_prime;
+ }
+ 
+ /* We never free these objects so we don't need to 
+  * worry about reuse or tracking the allocations
+  * 
+  * The management of the free allocation is not
+  * thread safe because we never expect this code
+  * to be called from more than one thread.
+  */
+ cm_fid_stats_t * cm_PerformanceGetNew(void)
+ {
+     static cm_fid_stats_t * allocp = NULL;
+     static afs_int32        allocSize = 0;
+     static afs_int32        nextFree = 0;
+ 
+     if (nextFree < allocSize)
+         return &allocp[nextFree++];
+ 
+     allocp = (cm_fid_stats_t *)malloc(32768);
+     if (allocp == NULL)
+         return NULL;
+ 
+     allocSize = 32768/sizeof(cm_fid_stats_t);
+     memset(allocp, 0, 32768);
+     nextFree = 1;
+     return allocp;
+ }
+ 
+ void cm_PerformanceInsertToHashTable(cm_fid_stats_t *statp)
+ {
+     afs_uint32 hash = statp->fid.hash % fidStatsHashTableSize;
+     
+     statp->nextp = fidStatsHashTablep[hash];
+     fidStatsHashTablep[hash] = statp;
+ }
+ 
+ void cm_PerformanceAddSCache(cm_scache_t *scp)
+ {
+     cm_fid_stats_t * statp = cm_PerformanceGetNew();
+ 
+     if (!statp)
+         return;
+ 
+     lock_ObtainRead(&scp->rw);
+     if (!(scp->flags & CM_SCACHEFLAG_DELETED)) {
+         statp->fid = scp->fid;
+         statp->fileLength = scp->length;
+         statp->fileType   = scp->fileType;
+         statp->flags = CM_FIDSTATS_FLAG_HAVE_SCACHE;
+         lock_ConvertRToW(&scp->rw);
+         if (cm_HaveCallback(scp))
+             statp->flags |= CM_FIDSTATS_FLAG_CALLBACK;
+         lock_ConvertWToR(&scp->rw);
+         if (scp->flags & CM_SCACHEFLAG_RO)
+             statp->flags |= CM_FIDSTATS_FLAG_RO;
+         if (scp->flags & CM_SCACHEFLAG_PURERO)
+             statp->flags |= CM_FIDSTATS_FLAG_PURERO;
+     }
+     lock_ReleaseRead(&scp->rw);
+ 
+ #if 0
+     if (statp->fid.vnode == 1) {
+         cm_volume_t *volp = NULL;
+         cm_cell_t *cellp = NULL;
+         cm_req_t req;
+ 
+         cm_InitReq(&req);
+         
+         cellp = cm_FindCellByID(statp->fid.cell, 0);
+         if (cellp) {
+             if (!cm_FindVolumeByID(cellp, statp->fid.volume, cm_rootUserp, &req, 0, &volp)) {
+                 statp->flags |= CM_FIDSTATS_HAVE_VOLUME;
+                 cm_PutVolume(volp);
+             }
+         }
+     }
+ #endif
+ 
+     cm_PerformanceInsertToHashTable(statp);
+ }
+ 
+ 
+ void cm_PerformanceTuningInit(void)
+ {
+     afs_uint32 i;
+     cm_scache_t *scp;
+     cm_volume_t *volp;
+     cm_buf_t *bp;
+     cm_fid_t fid;
+     afs_uint32 hash;
+     cm_fid_stats_t * statp;
+ 
+     fidStatsHashTableSize = nearest_prime(cm_data.stats/3);
+     if (fidStatsHashTableSize == 0)
+         fidStatsHashTableSize = cm_data.stats/3;
+     fidStatsHashTablep = (cm_fid_stats_t **)malloc(fidStatsHashTableSize * sizeof(cm_fid_stats_t *));
+     if (fidStatsHashTablep == NULL) {
+         fidStatsHashTableSize = 0;
+         return;
+     }
+ 
+     memset(fidStatsHashTablep, 0, fidStatsHashTableSize * sizeof(cm_fid_stats_t *));
+ 
+     lock_ObtainRead(&cm_scacheLock);
+     for (i=0; i<cm_data.scacheHashTableSize; i++) {
+         for (scp=cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) { 
+             if (scp->fid.cell == 0)
+                 continue;
+             lock_ReleaseRead(&cm_scacheLock);
+             cm_PerformanceAddSCache(scp);
+             lock_ObtainRead(&cm_scacheLock);
+         }
+     }
+     lock_ReleaseRead(&cm_scacheLock);
+ 
+     lock_ObtainRead(&cm_volumeLock);
+     for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
+         if (volp->rw.ID) {
+             cm_SetFid(&fid, volp->cellp->cellID, volp->rw.ID, 1, 1);
+             hash = fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 statp = cm_PerformanceGetNew();
+                 statp->fid = fid;
+                 statp->fileType = CM_SCACHETYPE_DIRECTORY;
+                 statp->flags = CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                 cm_PerformanceInsertToHashTable(statp);
+             }
+         }
+         if (volp->ro.ID) {
+             cm_SetFid(&fid, volp->cellp->cellID, volp->ro.ID, 1, 1);
+             hash = fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 statp = cm_PerformanceGetNew();
+                 statp->fid = fid;
+                 statp->fileType = CM_SCACHETYPE_DIRECTORY;
+                 statp->flags = CM_FIDSTATS_FLAG_HAVE_VOLUME | CM_FIDSTATS_FLAG_RO | CM_FIDSTATS_FLAG_PURERO;
+                 cm_PerformanceInsertToHashTable(statp);
+             }
+         }
+         if (volp->bk.ID) {
+             cm_SetFid(&fid, volp->cellp->cellID, volp->bk.ID, 1, 1);
+             hash = fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 statp = cm_PerformanceGetNew();
+                 statp->fid = fid;
+                 statp->fileType = CM_SCACHETYPE_DIRECTORY;
+                 statp->flags = CM_FIDSTATS_FLAG_HAVE_VOLUME | CM_FIDSTATS_FLAG_RO;
+                 cm_PerformanceInsertToHashTable(statp);
+             }
+         }
+     }	
+     lock_ReleaseRead(&cm_volumeLock);
+ 
+     lock_ObtainRead(&buf_globalLock);
+     for (bp = cm_data.buf_allp; bp; bp=bp->allp) {
+         int valid = 0;
+     
+         if (bp->fid.cell == 0)
+             continue;
+ 
+         lock_ReleaseRead(&buf_globalLock);
+         scp = cm_FindSCache(&bp->fid);
+         if (scp) {
+             lock_ObtainMutex(&bp->mx);
+             lock_ObtainRead(&scp->rw);
+             valid = cm_HaveBuffer(scp, bp, TRUE);
+             lock_ReleaseRead(&scp->rw);
+             lock_ReleaseMutex(&bp->mx);
+             cm_ReleaseSCache(scp);
+         
+             if (valid) {
+                 hash = bp->fid.hash % fidStatsHashTableSize;
+                 for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                     if (!cm_FidCmp(&bp->fid, &statp->fid)) {
+                         statp->buffers++;
+                         break;
+                     }
+                 }
+             }
+         }
+         lock_ObtainRead(&buf_globalLock);
+     }
+     lock_ReleaseRead(&buf_globalLock);
+ 
+     cm_PerformancePrintReport();
+ }
+ 
+ void cm_PerformanceTuningCheck(void) 
+ {
+     afs_uint32 i;
+     cm_scache_t *scp;
+     cm_volume_t *volp;
+     cm_buf_t *bp;
+     cm_fid_t fid;
+     afs_uint32 hash;
+     cm_fid_stats_t * statp;
+ 
+     if (fidStatsHashTablep == NULL)
+         return;
+ 
+     /* Clean all cm_fid_stat_t objects first */
+     for (i = 0; i < fidStatsHashTableSize; i++) {
+         for (statp = fidStatsHashTablep[i]; statp; statp = statp->nextp) {
+             statp->flags &= (CM_FIDSTATS_FLAG_RO | CM_FIDSTATS_FLAG_PURERO);
+             statp->buffers = 0;
+             statp->fileLength.QuadPart = 0;
+         }
+     }
+ 
+     lock_ObtainRead(&cm_scacheLock);
+     for (i=0; i<cm_data.scacheHashTableSize; i++) {
+         for (scp=cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) {
+             if (scp->fid.cell == 0)
+                 continue;
+             hash = scp->fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->fileType = scp->fileType;
+                     if (cm_HaveCallback(scp))
+                         statp->flags |= CM_FIDSTATS_FLAG_CALLBACK;
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_SCACHE;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 lock_ReleaseRead(&cm_scacheLock);
+                 cm_PerformanceAddSCache(scp);
+                 lock_ObtainRead(&cm_scacheLock);
+             }
+         }
+     }
+     lock_ReleaseRead(&cm_scacheLock);
+ 
+     lock_ObtainRead(&cm_volumeLock);
+     for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
+         if (volp->rw.ID) {
+             cm_SetFid(&fid, volp->cellp->cellID, volp->rw.ID, 1, 1);
+             hash = fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 statp = cm_PerformanceGetNew();
+                 statp->fid = fid;
+                 statp->fileType = CM_SCACHETYPE_DIRECTORY;
+                 statp->flags = CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                 cm_PerformanceInsertToHashTable(statp);
+             }
+         }
+         if (volp->ro.ID) {
+             cm_SetFid(&fid, volp->cellp->cellID, volp->ro.ID, 1, 1);
+             hash = fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 statp = cm_PerformanceGetNew();
+                 statp->fid = fid;
+                 statp->fileType = CM_SCACHETYPE_DIRECTORY;
+                 statp->flags = CM_FIDSTATS_FLAG_HAVE_VOLUME | CM_FIDSTATS_FLAG_RO | CM_FIDSTATS_FLAG_PURERO;
+                 cm_PerformanceInsertToHashTable(statp);
+             }
+         }
+         if (volp->bk.ID) {
+             cm_SetFid(&fid, volp->cellp->cellID, volp->bk.ID, 1, 1);
+             hash = fid.hash % fidStatsHashTableSize;
+ 
+             for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                 if (!cm_FidCmp(&fid, &statp->fid)) {
+                     statp->flags |= CM_FIDSTATS_FLAG_HAVE_VOLUME;
+                     break;
+                 }
+             }
+             if (!statp) {
+                 statp = cm_PerformanceGetNew();
+                 statp->fid = fid;
+                 statp->fileType = CM_SCACHETYPE_DIRECTORY;
+                 statp->flags = CM_FIDSTATS_FLAG_HAVE_VOLUME | CM_FIDSTATS_FLAG_RO;
+                 cm_PerformanceInsertToHashTable(statp);
+             }
+         }
+     }	
+     lock_ReleaseRead(&cm_volumeLock);
+ 
+     lock_ObtainRead(&buf_globalLock);
+     for (bp = cm_data.buf_allp; bp; bp=bp->allp) {
+         int valid = 0;
+     
+         if (bp->fid.cell == 0)
+             continue;
+ 
+         lock_ReleaseRead(&buf_globalLock);
+         scp = cm_FindSCache(&bp->fid);
+         if (scp) {
+             lock_ObtainMutex(&bp->mx);
+             lock_ObtainRead(&scp->rw);
+             valid = cm_HaveBuffer(scp, bp, TRUE);
+             lock_ReleaseRead(&scp->rw);
+             lock_ReleaseMutex(&bp->mx);
+             cm_ReleaseSCache(scp);
+         
+             if (valid) {
+                 hash = bp->fid.hash % fidStatsHashTableSize;
+                 for (statp = fidStatsHashTablep[hash]; statp; statp = statp->nextp) {
+                     if (!cm_FidCmp(&bp->fid, &statp->fid)) {
+                         statp->buffers++;
+                         break;
+                     }
+                 }
+             }
+         }
+         lock_ObtainRead(&buf_globalLock);
+     }
+     lock_ReleaseRead(&buf_globalLock);
+ 
+     cm_PerformancePrintReport();
+ }
+ 
+ void cm_PerformancePrintReport(void)
+ {
+     afs_uint32 i;
+     cm_fid_stats_t *statp;
+ 
+     afs_uint32 rw_vols = 0, ro_vols = 0, bk_vols = 0;
+     afs_uint32 fid_cnt = 0, fid_w_vol = 0, fid_w_scache = 0, fid_w_buffers = 0, fid_w_callbacks = 0;
+     afs_uint32 fid_w_scache_no_vol = 0, fid_w_scache_no_buf = 0, fid_w_vol_no_scache = 0, fid_w_buf_no_scache = 0;
+     afs_uint32 fid_file = 0, fid_dir = 0, fid_mp = 0, fid_sym = 0, fid_other = 0;
+     afs_uint32 fid_0k = 0, fid_1k = 0, fid_4k = 0, fid_64k = 0, fid_1m = 0, fid_20m = 0, fid_100m = 0, fid_1g = 0, fid_2g = 0, fid_large = 0;
+ 
+     HANDLE hLogFile;
+     char logfileName[MAX_PATH+1];
+     DWORD dwSize;
+ 
+     if (fidStatsHashTablep == NULL)
+         return;
+ 
+     /* Clean all cm_fid_stat_t objects first */
+     for (i = 0; i < fidStatsHashTableSize; i++) {
+         for (statp = fidStatsHashTablep[i]; statp; statp = statp->nextp) {
+             /* summarize the data */
+             fid_cnt++;
+ 
+             if ((statp->flags & (CM_FIDSTATS_FLAG_RO | CM_FIDSTATS_FLAG_PURERO)) == (CM_FIDSTATS_FLAG_RO | CM_FIDSTATS_FLAG_PURERO))
+                 ro_vols++;
+             else if (statp->flags & CM_FIDSTATS_FLAG_RO) 
+                 bk_vols++;
+             else
+                 rw_vols++;
+ 
+             if (statp->flags & CM_FIDSTATS_FLAG_HAVE_VOLUME)
+                 fid_w_vol++;
+ 
+             if (statp->flags & CM_FIDSTATS_FLAG_HAVE_SCACHE)
+                 fid_w_scache++;
+ 
+             if (statp->flags & CM_FIDSTATS_FLAG_CALLBACK)
+                 fid_w_callbacks++;
+ 
+             if (statp->buffers > 0)
+                 fid_w_buffers++;
+ 
+             if ((statp->flags & CM_FIDSTATS_FLAG_HAVE_SCACHE) &&
+                 !(statp->flags & CM_FIDSTATS_FLAG_HAVE_VOLUME))
+                 fid_w_scache_no_vol++;
+ 
+             if ((statp->flags & CM_FIDSTATS_FLAG_HAVE_SCACHE) &&
+                 statp->buffers == 0)
+                 fid_w_scache_no_buf++;
+ 
+             if ((statp->flags & CM_FIDSTATS_FLAG_HAVE_VOLUME) &&
+                 !(statp->flags & CM_FIDSTATS_FLAG_HAVE_SCACHE))
+                 fid_w_vol_no_scache++;
+ 
+             if (!(statp->flags & CM_FIDSTATS_FLAG_HAVE_SCACHE) &&
+                 statp->buffers > 0)
+                 fid_w_buf_no_scache++;
+ 
+             switch (statp->fileType) {
+             case CM_SCACHETYPE_FILE       :
+                 fid_file++;
+                 break;
+             case CM_SCACHETYPE_DIRECTORY  :
+                 fid_dir++;
+                 break;
+             case CM_SCACHETYPE_SYMLINK    :
+                 fid_sym++;
+                 break;
+             case CM_SCACHETYPE_MOUNTPOINT :
+                 fid_mp++;
+                 break;
+             case CM_SCACHETYPE_DFSLINK    :
+             case CM_SCACHETYPE_INVALID    :
+             default:
+                 fid_other++;
+             }
+ 
+             if (statp->fileType == CM_SCACHETYPE_FILE) {
+                 if (statp->fileLength.HighPart == 0) {
+                     if (statp->fileLength.LowPart == 0)
+                         fid_0k++;
+                     else if (statp->fileLength.LowPart <= 1024)
+                         fid_1k++;
+                     else if (statp->fileLength.LowPart <= 4096) 
+                         fid_4k++;
+                     else if (statp->fileLength.LowPart <= 65536)
+                         fid_64k++;
+                     else if (statp->fileLength.LowPart <= 1024*1024)
+                         fid_1m++;
+                     else if (statp->fileLength.LowPart <= 20*1024*1024)
+                         fid_20m++;
+                     else if (statp->fileLength.LowPart <= 100*1024*1024)
+                         fid_100m++;
+                     else if (statp->fileLength.LowPart <= 1024*1024*1024)
+                         fid_1g++;
+                     else
+                         fid_2g++;
+                 } else {    
+                     fid_large++;
+                 }   
+             }
+         }
+     }
+ 
+     dwSize = GetEnvironmentVariable("TEMP", logfileName, sizeof(logfileName));
+     if ( dwSize == 0 || dwSize > sizeof(logfileName) )
+     {
+         GetWindowsDirectory(logfileName, sizeof(logfileName));
+     }
+     strncat(logfileName, "\\afsd_performance.log", sizeof(logfileName));
+ 
+     hLogFile = CreateFile(logfileName, FILE_APPEND_DATA, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 
+                           FILE_ATTRIBUTE_NORMAL, NULL);
+ 
+     if (hLogFile) {
+         char output[1024];
+         char t[100];
+         int zilch;
+ 
+         GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, NULL, NULL, t, sizeof(t));
+ 
+         StringCbPrintfA(output, sizeof(output),
+                         "TIME - %s\r\n"
+                         "INUSE- stats=(%u of %u) vols=(%u of %u) bufs=(%I64u of %I64u)\r\n"
+                         "FIDs - total=%u haveVol=%u haveStat=%u haveCB=%u haveBuf=%u haveStatNoVol=%u haveVolNoStat=%u haveStatNoBuf=%u haveBufNoStat=%u\r\n"
+                         "VOLs - rw=%u ro=%u bk=%u\r\n"
+                         "TYPEs- file=%u dir=%u mp=%u sym=%u unk=%u\r\n"
+                         "SIZEs- 0kb=%u 1kb=%u 4kb=%u 64kb=%u 1mb=%u 20m=%u 100mb=%u 1gb=%u 2gb=%u larger=%u\r\n\r\n",
+                          t, 
+                          cm_data.currentSCaches, cm_data.maxSCaches, cm_data.currentVolumes, cm_data.maxVolumes,
+                          cm_data.buf_nbuffers - buf_CountFreeList(), cm_data.buf_nbuffers,
+                          fid_cnt, fid_w_vol, fid_w_scache, fid_w_callbacks, fid_w_buffers,
+                          fid_w_scache_no_vol, fid_w_vol_no_scache, fid_w_scache_no_buf, fid_w_buf_no_scache,
+                          rw_vols, ro_vols, bk_vols,
+                          fid_file, fid_dir, fid_mp, fid_sym, fid_other,
+                          fid_0k, fid_1k, fid_4k, fid_64k, fid_1m, fid_20m, fid_100m, fid_1g, fid_2g, fid_large
+                          );
+         WriteFile(hLogFile, output, (DWORD)strlen(output), &zilch, NULL);
+ 
+         CloseHandle(hLogFile);
+     }
+ 
+ 
+ }
Index: openafs/src/WINNT/afsd/cm_performance.h
diff -c /dev/null openafs/src/WINNT/afsd/cm_performance.h:1.1.2.2
*** /dev/null	Sat Mar 22 21:01:33 2008
--- openafs/src/WINNT/afsd/cm_performance.h	Fri Mar  7 17:24:04 2008
***************
*** 0 ****
--- 1,37 ----
+ /* 
+  *  Copyright (c) 2008 - Secure Endpoints Inc.
+  */
+ 
+ /* 
+  *  The performance module when activated collects 
+  *  data necessary to analyze the usage of the cache 
+  *  manager and establish recommendations for future
+  *  cache manager configuration changes. 
+  *
+  *  As a starting point, the package will collect 
+  *  a list of all FIDs accessed during the session
+  *  which will be used to periodically analyzed the
+  *  contents of the cm_buf_t, cm_scache_t, cm_volume_t
+  *  and cm_cell_t pools.  
+ 
+  */
+ 
+ typedef struct cm_fid_stats {
+     cm_fid_t    fid;
+     afs_uint32  fileType;
+     osi_hyper_t  fileLength;
+     afs_uint32  flags;
+     afs_uint32  buffers;
+     struct cm_fid_stats * nextp;
+ } cm_fid_stats_t;
+ 
+ #define CM_FIDSTATS_FLAG_HAVE_SCACHE 0x01  /* set if cm_scache_t present */
+ #define CM_FIDSTATS_FLAG_HAVE_VOLUME 0x02  /* set on (vnode = 1) if cm_vol_t present */
+ #define CM_FIDSTATS_FLAG_RO          0x04
+ #define CM_FIDSTATS_FLAG_PURERO      0x08    
+ #define CM_FIDSTATS_FLAG_CALLBACK    0x10 
+ 
+ extern void cm_PerformanceTuningCheck(void);
+ 
+ extern void cm_PerformancePrintReport(void);
+ 
Index: openafs/src/WINNT/afsd/cm_scache.c
diff -c openafs/src/WINNT/afsd/cm_scache.c:1.35.2.62 openafs/src/WINNT/afsd/cm_scache.c:1.35.2.70
*** openafs/src/WINNT/afsd/cm_scache.c:1.35.2.62	Sun Feb 24 10:35:34 2008
--- openafs/src/WINNT/afsd/cm_scache.c	Wed Mar 19 16:18:37 2008
***************
*** 191,202 ****
       * tried to store this to server but failed */
      scp->mask = 0;
  
-     /* drop held volume ref */
-     if (scp->volp) {
- 	cm_PutVolume(scp->volp);
- 	scp->volp = NULL;
-     }
- 
      /* discard symlink info */
      scp->mountPointStringp[0] = '\0';
      memset(&scp->mountRootFid, 0, sizeof(cm_fid_t));
--- 191,196 ----
***************
*** 320,326 ****
                  "invalid cm_scache_t address");
      memset(scp, 0, sizeof(cm_scache_t));
      scp->magic = CM_SCACHE_MAGIC;
!     lock_InitializeMutex(&scp->mx, "cm_scache_t mutex");
      lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
  #ifdef USE_BPLUS
      lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
--- 314,320 ----
                  "invalid cm_scache_t address");
      memset(scp, 0, sizeof(cm_scache_t));
      scp->magic = CM_SCACHE_MAGIC;
!     lock_InitializeRWLock(&scp->rw, "cm_scache_t rw");
      lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
  #ifdef USE_BPLUS
      lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
***************
*** 376,382 ****
          cm_data.fakeSCache.linkCount = 1;
          cm_data.fakeSCache.refCount = 1;
      }
!     lock_InitializeMutex(&cm_data.fakeSCache.mx, "cm_scache_t mutex");
  }
  
  long
--- 370,376 ----
          cm_data.fakeSCache.linkCount = 1;
          cm_data.fakeSCache.refCount = 1;
      }
!     lock_InitializeRWLock(&cm_data.fakeSCache.rw, "cm_scache_t rw");
  }
  
  long
***************
*** 410,420 ****
              fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n");
              return -3;
          }
-         if (scp->volp && scp->volp->magic != CM_VOLUME_MAGIC) {
-             afsi_log("cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC");
-             fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n");
-             return -4;
-         }
          if (i > cm_data.currentSCaches ) {
              afsi_log("cm_ValidateSCache failure: LRU First queue loops");
              fprintf(stderr, "cm_ValidateSCache failure: LUR First queue loops\n");
--- 404,409 ----
***************
*** 444,454 ****
              fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n");
              return -7;
          }
-         if (scp->volp && scp->volp->magic != CM_VOLUME_MAGIC) {
-             afsi_log("cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC");
-             fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n");
-             return -8;
-         }
          if (i > cm_data.currentSCaches ) {
              afsi_log("cm_ValidateSCache failure: LRU Last queue loops");
              fprintf(stderr, "cm_ValidateSCache failure: LUR Last queue loops\n");
--- 433,438 ----
***************
*** 463,468 ****
--- 447,454 ----
  
      for ( i=0; i < cm_data.scacheHashTableSize; i++ ) {
          for ( scp = cm_data.scacheHashTablep[i]; scp; scp = scp->nextp ) {
+             afs_uint32 hash;
+             hash = CM_SCACHE_HASH(&scp->fid);
              if (scp->magic != CM_SCACHE_MAGIC) {
                  afsi_log("cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC");
                  fprintf(stderr, "cm_ValidateSCache failure: scp->magic != CM_SCACHE_MAGIC\n");
***************
*** 478,487 ****
                  fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n");
                  return -11;
              }
!             if (scp->volp && scp->volp->magic != CM_VOLUME_MAGIC) {
!                 afsi_log("cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC");
!                 fprintf(stderr, "cm_ValidateSCache failure: scp->volp->magic != CM_VOLUME_MAGIC\n");
!                 return -12;
              }
          }
      }
--- 464,473 ----
                  fprintf(stderr, "cm_ValidateSCache failure: scp->randomACLp->magic != CM_ACLENT_MAGIC\n");
                  return -11;
              }
!             if (hash != i) {
!                 afsi_log("cm_ValidateSCache failure: scp hash != hash index");
!                 fprintf(stderr, "cm_ValidateSCache failure: scp hash != hash index\n");
!                 return -13;
              }
          }
      }
***************
*** 512,520 ****
      lock_ObtainWrite(&cm_scacheLock);
      for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) {
          if (scp->cbServerp) {
!             if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
!                 if (scp->volp->cbExpiresRO == scp->cbExpires) {
!                     scp->volp->cbExpiresRO = now+1;
                  }
              }
              scp->cbExpires = now+1;
--- 498,509 ----
      lock_ObtainWrite(&cm_scacheLock);
      for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) {
          if (scp->cbServerp) {
!             if (scp->flags & CM_SCACHEFLAG_PURERO) {
!                 cm_volume_t *volp = cm_GetVolumeByFID(&scp->fid);
!                 if (volp) {
!                     if (volp->cbExpiresRO == scp->cbExpires)
!                         volp->cbExpiresRO = now+1;
!                     cm_PutVolume(volp);
                  }
              }
              scp->cbExpires = now+1;
***************
*** 533,541 ****
      for ( scp = cm_data.allSCachesp; scp;
            scp = scp->allNextp ) {
          if (scp->randomACLp) {
!             lock_ObtainMutex(&scp->mx);
              cm_FreeAllACLEnts(scp);
!             lock_ReleaseMutex(&scp->mx);
          }
  
          if (scp->cbServerp) {
--- 522,530 ----
      for ( scp = cm_data.allSCachesp; scp;
            scp = scp->allNextp ) {
          if (scp->randomACLp) {
!             lock_ObtainWrite(&scp->rw);
              cm_FreeAllACLEnts(scp);
!             lock_ReleaseWrite(&scp->rw);
          }
  
          if (scp->cbServerp) {
***************
*** 552,558 ****
          scp->dirDataVersion = -1;
          lock_FinalizeRWLock(&scp->dirlock);
  #endif
!         lock_FinalizeMutex(&scp->mx);
          lock_FinalizeRWLock(&scp->bufCreateLock);
      }
      lock_ReleaseWrite(&cm_scacheLock);
--- 541,547 ----
          scp->dirDataVersion = -1;
          lock_FinalizeRWLock(&scp->dirlock);
  #endif
!         lock_FinalizeRWLock(&scp->rw);
          lock_FinalizeRWLock(&scp->bufCreateLock);
      }
      lock_ReleaseWrite(&cm_scacheLock);
***************
*** 579,585 ****
  
              for ( scp = cm_data.allSCachesp; scp;
                    scp = scp->allNextp ) {
!                 lock_InitializeMutex(&scp->mx, "cm_scache_t mutex");
                  lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
  #ifdef USE_BPLUS
                  lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
--- 568,574 ----
  
              for ( scp = cm_data.allSCachesp; scp;
                    scp = scp->allNextp ) {
!                 lock_InitializeRWLock(&scp->rw, "cm_scache_t rw");
                  lock_InitializeRWLock(&scp->bufCreateLock, "cm_scache_t bufCreateLock");
  #ifdef USE_BPLUS
                  lock_InitializeRWLock(&scp->dirlock, "cm_scache_t dirlock");
***************
*** 627,642 ****
  	return NULL;
      }
  
!     lock_ObtainWrite(&cm_scacheLock);
      for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
          if (cm_FidCmp(fidp, &scp->fid) == 0) {
              cm_HoldSCacheNoLock(scp);
              cm_AdjustScacheLRU(scp);
              lock_ReleaseWrite(&cm_scacheLock);
              return scp;
          }
      }
!     lock_ReleaseWrite(&cm_scacheLock);
      return NULL;
  }
  
--- 616,632 ----
  	return NULL;
      }
  
!     lock_ObtainRead(&cm_scacheLock);
      for (scp=cm_data.scacheHashTablep[hash]; scp; scp=scp->nextp) {
          if (cm_FidCmp(fidp, &scp->fid) == 0) {
              cm_HoldSCacheNoLock(scp);
+             lock_ConvertRToW(&cm_scacheLock);
              cm_AdjustScacheLRU(scp);
              lock_ReleaseWrite(&cm_scacheLock);
              return scp;
          }
      }
!     lock_ReleaseRead(&cm_scacheLock);
      return NULL;
  }
  
***************
*** 741,752 ****
  	 * assume that no one else is using the one this is returned.
  	 */
  	lock_ReleaseWrite(&cm_scacheLock);
! 	lock_ObtainMutex(&scp->mx);
  	lock_ObtainWrite(&cm_scacheLock);
  #endif
          scp->fid = *fidp;
-         scp->volp = cm_data.rootSCachep->volp;
- 	cm_GetVolume(scp->volp);	/* grab an additional reference */
          scp->dotdotFid.cell=AFS_FAKE_ROOT_CELL_ID;
          scp->dotdotFid.volume=AFS_FAKE_ROOT_VOL_ID;
          scp->dotdotFid.unique=1;
--- 731,740 ----
  	 * assume that no one else is using the one this is returned.
  	 */
  	lock_ReleaseWrite(&cm_scacheLock);
! 	lock_ObtainWrite(&scp->rw);
  	lock_ObtainWrite(&cm_scacheLock);
  #endif
          scp->fid = *fidp;
          scp->dotdotFid.cell=AFS_FAKE_ROOT_CELL_ID;
          scp->dotdotFid.volume=AFS_FAKE_ROOT_VOL_ID;
          scp->dotdotFid.unique=1;
***************
*** 772,778 ****
          scp->bufDataVersionLow=cm_data.fakeDirVersion;
          scp->lockDataVersion=-1; /* no lock yet */
  #if not_too_dangerous
! 	lock_ReleaseMutex(&scp->mx);
  #endif
  	*outScpp = scp;
          lock_ReleaseWrite(&cm_scacheLock);
--- 760,766 ----
          scp->bufDataVersionLow=cm_data.fakeDirVersion;
          scp->lockDataVersion=-1; /* no lock yet */
  #if not_too_dangerous
! 	lock_ReleaseWrite(&scp->rw);
  #endif
  	*outScpp = scp;
          lock_ReleaseWrite(&cm_scacheLock);
***************
*** 792,798 ****
          if (!cellp) 
              return CM_ERROR_NOSUCHCELL;
  
!         code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, CM_GETVOL_FLAG_CREATE, &volp);
          if (code) 
              return code;
          lock_ObtainWrite(&cm_scacheLock);
--- 780,786 ----
          if (!cellp) 
              return CM_ERROR_NOSUCHCELL;
  
!         code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, CM_GETVOL_FLAG_CREATE, &volp);
          if (code) 
              return code;
          lock_ObtainWrite(&cm_scacheLock);
***************
*** 808,814 ****
  	    osi_Log1(afsd_logp,"cm_GetSCache (3) outScpp 0x%p", scp);
  #endif
              cm_HoldSCacheNoLock(scp);
-             osi_assertx(scp->volp == volp, "cm_scache_t volume has unexpected value");
              cm_AdjustScacheLRU(scp);
              lock_ReleaseWrite(&cm_scacheLock);
              if (volp)
--- 796,801 ----
***************
*** 838,870 ****
       * assume that no one else is using the one this is returned.
       */
      lock_ReleaseWrite(&cm_scacheLock);
!     lock_ObtainMutex(&scp->mx);
      lock_ObtainWrite(&cm_scacheLock);
  #endif
      scp->fid = *fidp;
-     scp->volp = volp;	/* a held reference */
- 
      if (!cm_freelanceEnabled || !isRoot) {
          /* if this scache entry represents a volume root then we need 
           * to copy the dotdotFipd from the volume structure where the 
           * "master" copy is stored (defect 11489)
           */
!         if (scp->fid.vnode == 1 && scp->fid.unique == 1) {
! 	    scp->dotdotFid = volp->dotdotFid;
!         }
! 	  
!         if (volp->ro.ID == fidp->volume)
  	    scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
!         else if (volp->bk.ID == fidp->volume)
  	    scp->flags |= CM_SCACHEFLAG_RO;
      }
      scp->nextp = cm_data.scacheHashTablep[hash];
      cm_data.scacheHashTablep[hash] = scp;
      scp->flags |= CM_SCACHEFLAG_INHASH;
      scp->refCount = 1;
      osi_Log1(afsd_logp,"cm_GetSCache sets refCount to 1 scp 0x%x", scp);
  #if not_too_dangerous
!     lock_ReleaseMutex(&scp->mx);
  #endif
  
      /* XXX - The following fields in the cm_scache are 
--- 825,861 ----
       * assume that no one else is using the one this is returned.
       */
      lock_ReleaseWrite(&cm_scacheLock);
!     lock_ObtainWrite(&scp->rw);
      lock_ObtainWrite(&cm_scacheLock);
  #endif
      scp->fid = *fidp;
      if (!cm_freelanceEnabled || !isRoot) {
          /* if this scache entry represents a volume root then we need 
           * to copy the dotdotFipd from the volume structure where the 
           * "master" copy is stored (defect 11489)
           */
!         if (volp->ro.ID == fidp->volume) {
  	    scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
!             if (scp->fid.vnode == 1 && scp->fid.unique == 1)
!                 scp->dotdotFid = volp->ro.dotdotFid;
!         } else if (volp->bk.ID == fidp->volume) {
  	    scp->flags |= CM_SCACHEFLAG_RO;
+             if (scp->fid.vnode == 1 && scp->fid.unique == 1)
+                 scp->dotdotFid = volp->bk.dotdotFid;
+         } else {
+             if (scp->fid.vnode == 1 && scp->fid.unique == 1)
+                 scp->dotdotFid = volp->rw.dotdotFid;
+         }
      }
+     if (volp)
+         cm_PutVolume(volp);
      scp->nextp = cm_data.scacheHashTablep[hash];
      cm_data.scacheHashTablep[hash] = scp;
      scp->flags |= CM_SCACHEFLAG_INHASH;
      scp->refCount = 1;
      osi_Log1(afsd_logp,"cm_GetSCache sets refCount to 1 scp 0x%x", scp);
  #if not_too_dangerous
!     lock_ReleaseWrite(&scp->rw);
  #endif
  
      /* XXX - The following fields in the cm_scache are 
***************
*** 1233,1241 ****
  		    lock_ReleaseMutex(&bufp->mx);
                  code = cm_GetCallback(scp, userp, reqp, (flags & CM_SCACHESYNC_FORCECB)?1:0);
                  if (bufLocked) {
!                     lock_ReleaseMutex(&scp->mx);
                      lock_ObtainMutex(&bufp->mx);
!                     lock_ObtainMutex(&scp->mx);
                  }
                  if (code) 
                      return code;
--- 1224,1232 ----
  		    lock_ReleaseMutex(&bufp->mx);
                  code = cm_GetCallback(scp, userp, reqp, (flags & CM_SCACHESYNC_FORCECB)?1:0);
                  if (bufLocked) {
!                     lock_ReleaseWrite(&scp->rw);
                      lock_ObtainMutex(&bufp->mx);
!                     lock_ObtainWrite(&scp->rw);
                  }
                  if (code) 
                      return code;
***************
*** 1260,1268 ****
                  if (bufLocked) lock_ReleaseMutex(&bufp->mx);
                  code = cm_GetAccessRights(scp, userp, reqp);
                  if (bufLocked) {
!                     lock_ReleaseMutex(&scp->mx);
                      lock_ObtainMutex(&bufp->mx);
!                     lock_ObtainMutex(&scp->mx);
                  }
                  if (code) 
                      return code;
--- 1251,1259 ----
                  if (bufLocked) lock_ReleaseMutex(&bufp->mx);
                  code = cm_GetAccessRights(scp, userp, reqp);
                  if (bufLocked) {
!                     lock_ReleaseWrite(&scp->rw);
                      lock_ObtainMutex(&bufp->mx);
!                     lock_ObtainWrite(&scp->rw);
                  }
                  if (code) 
                      return code;
***************
*** 1303,1312 ****
          do {
              if (bufLocked) 
                  lock_ReleaseMutex(&bufp->mx);
!             osi_SleepM((LONG_PTR) &scp->flags, &scp->mx);
              if (bufLocked) 
                  lock_ObtainMutex(&bufp->mx);
!             lock_ObtainMutex(&scp->mx);
          } while (!cm_SyncOpCheckContinue(scp, flags, bufp));
  
  	smb_UpdateServerPriority();
--- 1294,1303 ----
          do {
              if (bufLocked) 
                  lock_ReleaseMutex(&bufp->mx);
!             osi_SleepW((LONG_PTR) &scp->flags, &scp->rw);
              if (bufLocked) 
                  lock_ObtainMutex(&bufp->mx);
!             lock_ObtainWrite(&scp->rw);
          } while (!cm_SyncOpCheckContinue(scp, flags, bufp));
  
  	smb_UpdateServerPriority();
***************
*** 1394,1400 ****
      osi_queueData_t *qdp;
      cm_buf_t *tbufp;
  
!     lock_AssertMutex(&scp->mx);
  
      /* now, update the recorded state for RPC-type calls */
      if (flags & CM_SCACHESYNC_FETCHSTATUS)
--- 1385,1391 ----
      osi_queueData_t *qdp;
      cm_buf_t *tbufp;
  
!     lock_AssertWrite(&scp->rw);
  
      /* now, update the recorded state for RPC-type calls */
      if (flags & CM_SCACHESYNC_FETCHSTATUS)
***************
*** 1523,1530 ****
          statusp->SyncCounter = 0;
          statusp->dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32);
          statusp->errorCode = 0;
- 
-         buf_ForceDataVersion(scp, scp->dataVersion, cm_data.fakeDirVersion);
      }
  #endif /* AFS_FREELANCE_CLIENT */
  
--- 1514,1519 ----
***************
*** 1571,1577 ****
          if (scp->cbServerp) {
              struct cm_volume *volp = NULL;
  
!             cm_GetVolumeByID(cellp, scp->fid.volume, userp,
                                (cm_req_t *) NULL, CM_GETVOL_FLAG_CREATE, &volp);
              osi_Log2(afsd_logp, "old data from server %x volume %s",
                        scp->cbServerp->addr.sin_addr.s_addr,
--- 1560,1566 ----
          if (scp->cbServerp) {
              struct cm_volume *volp = NULL;
  
!             cm_FindVolumeByID(cellp, scp->fid.volume, userp,
                                (cm_req_t *) NULL, CM_GETVOL_FLAG_CREATE, &volp);
              osi_Log2(afsd_logp, "old data from server %x volume %s",
                        scp->cbServerp->addr.sin_addr.s_addr,
***************
*** 1579,1585 ****
              if (volp)
                  cm_PutVolume(volp);
          }
!         osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %I64d, RPC dv %I64d",
                    scp, scp->dataVersion, dataVersion);
          /* we have a number of data fetch/store operations running
           * concurrently, and we can tell which one executed last at the
--- 1568,1574 ----
              if (volp)
                  cm_PutVolume(volp);
          }
!         osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %d, RPC dv %d",
                    scp, scp->dataVersion, dataVersion);
          /* we have a number of data fetch/store operations running
           * concurrently, and we can tell which one executed last at the
***************
*** 1658,1665 ****
      }
  
      if (scp->dataVersion != 0 &&
!         (!(flags & CM_MERGEFLAG_DIROP) && dataVersion != scp->dataVersion ||
!          (flags & CM_MERGEFLAG_DIROP) && dataVersion - scp->dataVersion > 1)) {
          /* 
           * We now know that all of the data buffers that we have associated
           * with this scp are invalid.  Subsequent operations will go faster
--- 1647,1654 ----
      }
  
      if (scp->dataVersion != 0 &&
!         (!(flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA)) && dataVersion != scp->dataVersion ||
!          (flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA)) && dataVersion - scp->dataVersion > 1)) {
          /* 
           * We now know that all of the data buffers that we have associated
           * with this scp are invalid.  Subsequent operations will go faster
***************
*** 1667,1672 ****
--- 1656,1663 ----
           *
           * We do not remove directory buffers if the dataVersion delta is 1 because
           * those version numbers will be updated as part of the directory operation.
+          *
+          * We do not remove storedata buffers because they will still be valid.
           */
          int i, j;
          cm_buf_t **lbpp;
***************
*** 1724,1730 ****
       * the size of the file.
       */
      if (((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion > 1) || 
!          (!(flags & CM_MERGEFLAG_STOREDATA) && scp->dataVersion != dataVersion))
          scp->bufDataVersionLow = dataVersion;
      
      scp->dataVersion = dataVersion;
--- 1715,1722 ----
       * the size of the file.
       */
      if (((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion > 1) || 
!          (!(flags & CM_MERGEFLAG_STOREDATA) && scp->dataVersion != dataVersion) ||
!          scp->bufDataVersionLow == 0)
          scp->bufDataVersionLow = dataVersion;
      
      scp->dataVersion = dataVersion;
***************
*** 1740,1746 ****
   */
  void cm_DiscardSCache(cm_scache_t *scp)
  {
!     lock_AssertMutex(&scp->mx);
      if (scp->cbServerp) {
          cm_PutServer(scp->cbServerp);
  	scp->cbServerp = NULL;
--- 1732,1738 ----
   */
  void cm_DiscardSCache(cm_scache_t *scp)
  {
!     lock_AssertWrite(&scp->rw);
      if (scp->cbServerp) {
          cm_PutServer(scp->cbServerp);
  	scp->cbServerp = NULL;
***************
*** 1885,1893 ****
    
      for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp) 
      {
!         sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p type=%d dv=%I64d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n", 
                  cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, 
!                 scp->volp, scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, scp->flags,
                  (unsigned long)scp->cbExpires, scp->refCount);
          WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
      }
--- 1877,1885 ----
    
      for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp) 
      {
!         sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) type=%d dv=%I64d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n", 
                  cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, 
!                 scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, scp->flags,
                  (unsigned long)scp->cbExpires, scp->refCount);
          WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
      }
Index: openafs/src/WINNT/afsd/cm_scache.h
diff -c openafs/src/WINNT/afsd/cm_scache.h:1.21.2.22 openafs/src/WINNT/afsd/cm_scache.h:1.21.2.24
*** openafs/src/WINNT/afsd/cm_scache.h:1.21.2.22	Sun Feb 24 01:33:21 2008
--- openafs/src/WINNT/afsd/cm_scache.h	Thu Mar 13 00:39:17 2008
***************
*** 42,48 ****
      osi_queue_t q;              /* list of all locks [protected by
                                     cm_scacheLock] */
      osi_queue_t fileq;		/* per-file list of locks [protected
!                                    by scp->mx]*/
      
      cm_user_t *userp;           /* The user to which this lock belongs
                                     to [immutable; held] */
--- 42,48 ----
      osi_queue_t q;              /* list of all locks [protected by
                                     cm_scacheLock] */
      osi_queue_t fileq;		/* per-file list of locks [protected
!                                    by scp->rw]*/
      
      cm_user_t *userp;           /* The user to which this lock belongs
                                     to [immutable; held] */
***************
*** 93,102 ****
      struct cm_scache *nextp;		/* next in hash; cm_scacheLock */
      struct cm_scache *allNextp;         /* next in all scache list; cm_scacheLock */
      cm_fid_t fid;
!     afs_uint32 flags;			/* flags; locked by mx */
  
      /* synchronization stuff */
!     osi_mutex_t mx;			/* mutex for this structure */
      osi_rwlock_t bufCreateLock;		/* read-locked during buffer creation;
                                           * write-locked to prevent buffers from
  					 * being created during a truncate op, etc.
--- 93,102 ----
      struct cm_scache *nextp;		/* next in hash; cm_scacheLock */
      struct cm_scache *allNextp;         /* next in all scache list; cm_scacheLock */
      cm_fid_t fid;
!     afs_uint32 flags;			/* flags; locked by rw */
  
      /* synchronization stuff */
!     osi_rwlock_t rw;			/* rwlock for this structure */
      osi_rwlock_t bufCreateLock;		/* read-locked during buffer creation;
                                           * write-locked to prevent buffers from
  					 * being created during a truncate op, etc.
***************
*** 157,163 ****
      afs_int32    serverLock;    /* current lock we have acquired on
                                   * this file.  One of (-1), LockRead
                                   * or LockWrite. [protected by
!                                  * scp->mx].  In the future, this
                                   * should be replaced by a queue of
                                   * cm_server_lock_t objects which keep
                                   * track of lock type, the user for
--- 157,163 ----
      afs_int32    serverLock;    /* current lock we have acquired on
                                   * this file.  One of (-1), LockRead
                                   * or LockWrite. [protected by
!                                  * scp->rw].  In the future, this
                                   * should be replaced by a queue of
                                   * cm_server_lock_t objects which keep
                                   * track of lock type, the user for
***************
*** 190,198 ****
                                     have CM_FILELOCK_FLAG_CLIENTONLY
                                     set. */
  	
-     /* volume info */
-     struct cm_volume *volp;		/* volume info; held reference */
- 
      /* bulk stat progress */
      osi_hyper_t bulkStatProgress;	/* track bulk stats of large dirs */
  
--- 190,195 ----
Index: openafs/src/WINNT/afsd/cm_server.c
diff -c openafs/src/WINNT/afsd/cm_server.c:1.25.2.25 openafs/src/WINNT/afsd/cm_server.c:1.25.2.28
*** openafs/src/WINNT/afsd/cm_server.c:1.25.2.25	Fri Feb 22 19:17:35 2008
--- openafs/src/WINNT/afsd/cm_server.c	Thu Mar 13 00:39:17 2008
***************
*** 27,32 ****
--- 27,33 ----
  #include <rx/rx.h>
  
  osi_rwlock_t cm_serverLock;
+ osi_rwlock_t cm_syscfgLock;
  
  cm_server_t *cm_allServersp;
  afs_uint32   cm_numFileServers = 0;
***************
*** 37,49 ****
  {
      cm_server_t *tsp;
  
!     lock_ObtainWrite(&cm_serverLock);
      for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
          cm_GetServerNoLock(tsp);
  	cm_ForceNewConnections(tsp);
          cm_PutServerNoLock(tsp);
      }
!     lock_ReleaseWrite(&cm_serverLock);
  }
  
  void 
--- 38,50 ----
  {
      cm_server_t *tsp;
  
!     lock_ObtainRead(&cm_serverLock);
      for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
          cm_GetServerNoLock(tsp);
  	cm_ForceNewConnections(tsp);
          cm_PutServerNoLock(tsp);
      }
!     lock_ReleaseRead(&cm_serverLock);
  }
  
  void 
***************
*** 141,147 ****
                          cm_InitReq(&req);
  
                          lock_ReleaseMutex(&tsp->mx);
!                         code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                  &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                          lock_ObtainMutex(&tsp->mx);
                          if (code == 0) {
--- 142,148 ----
                          cm_InitReq(&req);
  
                          lock_ReleaseMutex(&tsp->mx);
!                         code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                  &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                          lock_ObtainMutex(&tsp->mx);
                          if (code == 0) {
***************
*** 178,184 ****
                          cm_InitReq(&req);
  
                          lock_ReleaseMutex(&tsp->mx);
!                         code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                  &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                          lock_ObtainMutex(&tsp->mx);
                          if (code == 0) {
--- 179,185 ----
                          cm_InitReq(&req);
  
                          lock_ReleaseMutex(&tsp->mx);
!                         code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                  &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                          lock_ObtainMutex(&tsp->mx);
                          if (code == 0) {
***************
*** 211,220 ****
      int isDown;
      int isFS;
  
!     lock_ObtainWrite(&cm_serverLock);
      for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
          cm_GetServerNoLock(tsp);
!         lock_ReleaseWrite(&cm_serverLock);
  
          /* now process the server */
          lock_ObtainMutex(&tsp->mx);
--- 212,221 ----
      int isDown;
      int isFS;
  
!     lock_ObtainRead(&cm_serverLock);
      for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
          cm_GetServerNoLock(tsp);
!         lock_ReleaseRead(&cm_serverLock);
  
          /* now process the server */
          lock_ObtainMutex(&tsp->mx);
***************
*** 249,258 ****
           */
          cm_GCConnections(tsp);
  
!         lock_ObtainWrite(&cm_serverLock);
          cm_PutServerNoLock(tsp);
      }
!     lock_ReleaseWrite(&cm_serverLock);
  }       
  #else /* MULTI_CHECKSERVERS */
  void cm_CheckServers(afs_uint32 flags, cm_cell_t *cellp)
--- 250,259 ----
           */
          cm_GCConnections(tsp);
  
!         lock_ObtainRead(&cm_serverLock);
          cm_PutServerNoLock(tsp);
      }
!     lock_ReleaseRead(&cm_serverLock);
  }       
  #else /* MULTI_CHECKSERVERS */
  void cm_CheckServers(afs_uint32 flags, cm_cell_t *cellp)
***************
*** 302,308 ****
      if ((flags & CM_FLAG_CHECKFILESERVERS) || 
          !(flags & (CM_FLAG_CHECKFILESERVERS|CM_FLAG_CHECKVLDBSERVERS)))
      {
!         lock_ObtainWrite(&cm_serverLock);
          nconns = 0;
          for (nconns=0, tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
              if (tsp->type != CM_SERVER_FILE || 
--- 303,309 ----
      if ((flags & CM_FLAG_CHECKFILESERVERS) || 
          !(flags & (CM_FLAG_CHECKFILESERVERS|CM_FLAG_CHECKVLDBSERVERS)))
      {
!         lock_ObtainRead(&cm_serverLock);
          nconns = 0;
          for (nconns=0, tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
              if (tsp->type != CM_SERVER_FILE || 
***************
*** 311,317 ****
                  continue;
  
              cm_GetServerNoLock(tsp);
!             lock_ReleaseWrite(&cm_serverLock);
  
              lock_ObtainMutex(&tsp->mx);
              isDown = tsp->flags & CM_SERVERFLAG_DOWN;
--- 312,318 ----
                  continue;
  
              cm_GetServerNoLock(tsp);
!             lock_ReleaseRead(&cm_serverLock);
  
              lock_ObtainMutex(&tsp->mx);
              isDown = tsp->flags & CM_SERVERFLAG_DOWN;
***************
*** 320,326 ****
                  !((isDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) ||
                     (!isDown && (flags & CM_FLAG_CHECKUPSERVERS)))) {
                  lock_ReleaseMutex(&tsp->mx);
!                 lock_ObtainWrite(&cm_serverLock);
                  continue;
              }
  
--- 321,328 ----
                  !((isDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) ||
                     (!isDown && (flags & CM_FLAG_CHECKUPSERVERS)))) {
                  lock_ReleaseMutex(&tsp->mx);
!                 lock_ObtainRead(&cm_serverLock);
!                 cm_PutServerNoLock(tsp);
                  continue;
              }
  
***************
*** 330,347 ****
              serversp[nconns] = tsp;
              code = cm_ConnByServer(tsp, cm_rootUserp, &conns[nconns]);
              if (code) {
! 	            lock_ObtainWrite(&cm_serverLock);
                  cm_PutServerNoLock(tsp);
                  continue;
              }
!             lock_ObtainWrite(&cm_serverLock);
! 			rxconns[nconns] = cm_GetRxConn(conns[nconns]);
              if (conntimer[nconns] = (isDown ? 1 : 0))
                  rx_SetConnDeadTime(rxconns[nconns], 10);
  
              nconns++;
          }
!         lock_ReleaseWrite(&cm_serverLock);
  
          if (nconns) {
              /* Perform the multi call */
--- 332,349 ----
              serversp[nconns] = tsp;
              code = cm_ConnByServer(tsp, cm_rootUserp, &conns[nconns]);
              if (code) {
!                 lock_ObtainRead(&cm_serverLock);
                  cm_PutServerNoLock(tsp);
                  continue;
              }
!             lock_ObtainRead(&cm_serverLock);
!             rxconns[nconns] = cm_GetRxConn(conns[nconns]);
              if (conntimer[nconns] = (isDown ? 1 : 0))
                  rx_SetConnDeadTime(rxconns[nconns], 10);
  
              nconns++;
          }
!         lock_ReleaseRead(&cm_serverLock);
  
          if (nconns) {
              /* Perform the multi call */
***************
*** 403,409 ****
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
--- 405,411 ----
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
***************
*** 441,447 ****
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
--- 443,449 ----
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
***************
*** 532,538 ****
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
--- 534,540 ----
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
***************
*** 570,576 ****
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
--- 572,578 ----
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
***************
*** 597,603 ****
      if ((flags & CM_FLAG_CHECKVLDBSERVERS) || 
          !(flags & (CM_FLAG_CHECKFILESERVERS|CM_FLAG_CHECKVLDBSERVERS)))
      {
!         lock_ObtainWrite(&cm_serverLock);
          nconns = 0;
          for (nconns=0, tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
              if (tsp->type != CM_SERVER_VLDB ||
--- 599,605 ----
      if ((flags & CM_FLAG_CHECKVLDBSERVERS) || 
          !(flags & (CM_FLAG_CHECKFILESERVERS|CM_FLAG_CHECKVLDBSERVERS)))
      {
!         lock_ObtainRead(&cm_serverLock);
          nconns = 0;
          for (nconns=0, tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
              if (tsp->type != CM_SERVER_VLDB ||
***************
*** 606,612 ****
                  continue;
  
              cm_GetServerNoLock(tsp);
!             lock_ReleaseWrite(&cm_serverLock);
  
              lock_ObtainMutex(&tsp->mx);
              isDown = tsp->flags & CM_SERVERFLAG_DOWN;
--- 608,614 ----
                  continue;
  
              cm_GetServerNoLock(tsp);
!             lock_ReleaseRead(&cm_serverLock);
  
              lock_ObtainMutex(&tsp->mx);
              isDown = tsp->flags & CM_SERVERFLAG_DOWN;
***************
*** 615,621 ****
                  !((isDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) ||
                     (!isDown && (flags & CM_FLAG_CHECKUPSERVERS)))) {
                  lock_ReleaseMutex(&tsp->mx);
!                 lock_ObtainWrite(&cm_serverLock);
                  continue;
              }
  
--- 617,624 ----
                  !((isDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) ||
                     (!isDown && (flags & CM_FLAG_CHECKUPSERVERS)))) {
                  lock_ReleaseMutex(&tsp->mx);
!                 lock_ObtainRead(&cm_serverLock);
!                 cm_PutServerNoLock(tsp);
                  continue;
              }
  
***************
*** 625,635 ****
              serversp[nconns] = tsp;
              code = cm_ConnByServer(tsp, cm_rootUserp, &conns[nconns]);
              if (code) {
! 	            lock_ObtainWrite(&cm_serverLock);
                  cm_PutServerNoLock(tsp);
                  continue;
              }
!             lock_ObtainWrite(&cm_serverLock);
              rxconns[nconns] = cm_GetRxConn(conns[nconns]);
              conntimer[nconns] = (isDown ? 1 : 0);
              if (isDown)
--- 628,638 ----
              serversp[nconns] = tsp;
              code = cm_ConnByServer(tsp, cm_rootUserp, &conns[nconns]);
              if (code) {
!                 lock_ObtainRead(&cm_serverLock);
                  cm_PutServerNoLock(tsp);
                  continue;
              }
!             lock_ObtainRead(&cm_serverLock);
              rxconns[nconns] = cm_GetRxConn(conns[nconns]);
              conntimer[nconns] = (isDown ? 1 : 0);
              if (isDown)
***************
*** 637,643 ****
  
              nconns++;
          }
!         lock_ReleaseWrite(&cm_serverLock);
  
          if (nconns) {
              /* Perform the multi call */
--- 640,646 ----
  
              nconns++;
          }
!         lock_ReleaseRead(&cm_serverLock);
  
          if (nconns) {
              /* Perform the multi call */
***************
*** 686,692 ****
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
--- 689,695 ----
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
***************
*** 724,730 ****
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
--- 727,733 ----
                                  cm_InitReq(&req);
  
                                  lock_ReleaseMutex(&tsp->mx);
!                                 code = cm_FindVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
                                                           &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
                                  lock_ObtainMutex(&tsp->mx);
                                  if (code == 0) {
***************
*** 763,794 ****
          
      if (osi_Once(&once)) {
          lock_InitializeRWLock(&cm_serverLock, "cm_serverLock");
          osi_EndOnce(&once);
      }
  }
  
  void cm_GetServer(cm_server_t *serverp)
  {
!     lock_ObtainWrite(&cm_serverLock);
!     serverp->refCount++;
!     lock_ReleaseWrite(&cm_serverLock);
  }
  
  void cm_GetServerNoLock(cm_server_t *serverp)
  {
!     serverp->refCount++;
  }
  
  void cm_PutServer(cm_server_t *serverp)
  {
!     lock_ObtainWrite(&cm_serverLock);
!     osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0");
!     lock_ReleaseWrite(&cm_serverLock);
  }
  
  void cm_PutServerNoLock(cm_server_t *serverp)
  {
!     osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0");
  }
  
  void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit)
--- 766,816 ----
          
      if (osi_Once(&once)) {
          lock_InitializeRWLock(&cm_serverLock, "cm_serverLock");
+         lock_InitializeRWLock(&cm_syscfgLock, "cm_syscfgLock");
          osi_EndOnce(&once);
      }
  }
  
+ /* Protected by cm_syscfgLock (rw) */
+ int cm_noIPAddr;         /* number of client network interfaces */
+ int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
+ int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
+ int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
+ int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
+ int cm_LanAdapterChangeDetected = 1;
+ 
+ void cm_SetLanAdapterChangeDetected(void)
+ {
+     lock_ObtainWrite(&cm_syscfgLock);
+     cm_LanAdapterChangeDetected = 1;
+     lock_ReleaseWrite(&cm_syscfgLock);
+ }
+ 
  void cm_GetServer(cm_server_t *serverp)
  {
!     lock_ObtainRead(&cm_serverLock);
!     InterlockedIncrement(&serverp->refCount);
!     lock_ReleaseRead(&cm_serverLock);
  }
  
  void cm_GetServerNoLock(cm_server_t *serverp)
  {
!     InterlockedIncrement(&serverp->refCount);
  }
  
  void cm_PutServer(cm_server_t *serverp)
  {
!     afs_int32 refCount;
!     lock_ObtainRead(&cm_serverLock);
!     refCount = InterlockedDecrement(&serverp->refCount);
!     osi_assertx(refCount >= 0, "cm_server_t refCount underflow");
!     lock_ReleaseRead(&cm_serverLock);
  }
  
  void cm_PutServerNoLock(cm_server_t *serverp)
  {
!     afs_int32 refCount = InterlockedDecrement(&serverp->refCount);
!     osi_assertx(refCount >= 0, "cm_server_t refCount underflow");
  }
  
  void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit)
***************
*** 817,835 ****
      unsigned long	myAddr, myNet, mySubnet;/* in host byte order */
      unsigned long	netMask;
      int 		i;
- 
-     int cm_noIPAddr;         /* number of client network interfaces */
-     int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
-     int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
-     int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
-     int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
      long code;
  
!     /* get network related info */
!     cm_noIPAddr = CM_MAXINTERFACE_ADDR;
!     code = syscfg_GetIFInfo(&cm_noIPAddr,
! 			    cm_IPAddr, cm_SubnetMask,
! 			    cm_NetMtu, cm_NetFlags);
  
      serverAddr = ntohl(serverp->addr.sin_addr.s_addr);
      serverp->ipRank  = CM_IPRANK_LOW;	/* default setings */
--- 839,861 ----
      unsigned long	myAddr, myNet, mySubnet;/* in host byte order */
      unsigned long	netMask;
      int 		i;
      long code;
+     int writeLock = 0;
  
!     lock_ObtainRead(&cm_syscfgLock);
!     if (cm_LanAdapterChangeDetected) {
!         lock_ConvertRToW(&cm_syscfgLock);
!         writeLock = 1;
!         if (cm_LanAdapterChangeDetected) {
!             /* get network related info */
!             cm_noIPAddr = CM_MAXINTERFACE_ADDR;
!             code = syscfg_GetIFInfo(&cm_noIPAddr,
!                                      cm_IPAddr, cm_SubnetMask,
!                                      cm_NetMtu, cm_NetFlags);
!             cm_LanAdapterChangeDetected = 0;
!         }
!         lock_ConvertWToR(&cm_syscfgLock);
!     }
  
      serverAddr = ntohl(serverp->addr.sin_addr.s_addr);
      serverp->ipRank  = CM_IPRANK_LOW;	/* default setings */
***************
*** 868,873 ****
--- 894,900 ----
  	/* random between 0..15*/
  	serverp->ipRank += min(serverp->ipRank, rand() % 0x000f);
      } /* and of for loop */
+     lock_ReleaseRead(&cm_syscfgLock);
  }
  
  cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp, afs_uint32 flags) {
***************
*** 932,938 ****
  
      osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
          
!     lock_ObtainWrite(&cm_serverLock);
      for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {
          if (tsp->type == type &&
              tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr) 
--- 959,965 ----
  
      osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
          
!     lock_ObtainRead(&cm_serverLock);
      for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {
          if (tsp->type == type &&
              tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr) 
***************
*** 944,950 ****
          cm_GetServerNoLock(tsp);
  
      /* drop big table lock */
!     lock_ReleaseWrite(&cm_serverLock);
  	
      /* return what we found */
      return tsp;
--- 971,977 ----
          cm_GetServerNoLock(tsp);
  
      /* drop big table lock */
!     lock_ReleaseRead(&cm_serverLock);
  	
      /* return what we found */
      return tsp;
***************
*** 1026,1032 ****
      int first = 1;
      cm_serverRef_t *tsrp;
  
!     lock_ObtainWrite(&cm_serverLock);
      for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
          if (first)
              first = 0;
--- 1053,1059 ----
      int first = 1;
      cm_serverRef_t *tsrp;
  
!     lock_ObtainRead(&cm_serverLock);
      for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
          if (first)
              first = 0;
***************
*** 1035,1047 ****
          sum ^= (LONG_PTR) tsrp->server;
      }
  
!     lock_ReleaseWrite(&cm_serverLock);
      return sum;
  }
  
  /*
  ** 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
  */
--- 1062,1074 ----
          sum ^= (LONG_PTR) tsrp->server;
      }
  
!     lock_ReleaseRead(&cm_serverLock);
      return sum;
  }
  
  /*
  ** Insert a server into the server list keeping the list sorted in 
! ** ascending order of ipRank. 
  ** 
  ** The refCount of the cm_serverRef_t is increased
  */
Index: openafs/src/WINNT/afsd/cm_server.h
diff -c openafs/src/WINNT/afsd/cm_server.h:1.13.2.11 openafs/src/WINNT/afsd/cm_server.h:1.13.2.13
*** openafs/src/WINNT/afsd/cm_server.h:1.13.2.11	Tue Feb  5 12:38:02 2008
--- openafs/src/WINNT/afsd/cm_server.h	Sat Mar  8 18:25:08 2008
***************
*** 36,42 ****
      afs_int32 waitCount;		/* by mx */
      afs_int32 capabilities;		/* by mx */
      struct cm_cell *cellp;		/* cell containing this server */
!     unsigned long refCount;		/* locked by cm_serverLock */
      osi_mutex_t mx;
      unsigned short ipRank;		/* server priority */
      cm_server_vols_t *  vols;           /* by mx */
--- 36,42 ----
      afs_int32 waitCount;		/* by mx */
      afs_int32 capabilities;		/* by mx */
      struct cm_cell *cellp;		/* cell containing this server */
!     afs_int32 refCount;		        /* Interlocked with cm_serverLock */
      osi_mutex_t mx;
      unsigned short ipRank;		/* server priority */
      cm_server_vols_t *  vols;           /* by mx */
***************
*** 49,55 ****
      struct cm_serverRef *next;      /* locked by cm_serverLock */
      struct cm_server *server;       /* locked by cm_serverLock */
      enum repstate status;           /* locked by cm_serverLock */
!     unsigned long refCount;         /* locked by cm_serverLock */
      afs_uint32 volID;               /* locked by cm_serverLock */
  } cm_serverRef_t;
  
--- 49,55 ----
      struct cm_serverRef *next;      /* locked by cm_serverLock */
      struct cm_server *server;       /* locked by cm_serverLock */
      enum repstate status;           /* locked by cm_serverLock */
!     afs_int32 refCount;             /* locked by cm_serverLock */
      afs_uint32 volID;               /* locked by cm_serverLock */
  } cm_serverRef_t;
  
***************
*** 100,105 ****
--- 100,107 ----
  
  extern osi_rwlock_t cm_serverLock;
  
+ extern osi_rwlock_t cm_syscfgLock;
+ 
  extern void cm_InitServer(void);
  
  extern void cm_CheckServers(afs_uint32 flags, struct cm_cell *cellp);
***************
*** 128,131 ****
--- 130,142 ----
  
  extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, int type);
  
+ extern void cm_SetLanAdapterChangeDetected(void);
+ 
+ /* Protected by cm_syscfgLock (rw) */
+ extern int cm_noIPAddr;         /* number of client network interfaces */
+ extern int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
+ extern int cm_SubnetMask[CM_MAXINTERFACE_ADDR];/* client's subnet mask in host order*/
+ extern int cm_NetMtu[CM_MAXINTERFACE_ADDR];    /* client's MTU sizes */
+ extern int cm_NetFlags[CM_MAXINTERFACE_ADDR];  /* network flags */
+ extern int cm_LanAdapterChangeDetected;
  #endif /*  __CM_SERVER_H_ENV__ */
Index: openafs/src/WINNT/afsd/cm_vnodeops.c
diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.64 openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.72
*** openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.64	Sat Feb 23 16:37:08 2008
--- openafs/src/WINNT/afsd/cm_vnodeops.c	Wed Mar 19 16:18:37 2008
***************
*** 262,268 ****
      if (openMode == 1 || openMode == 2 || trunc) 
  	rights |= PRSFS_WRITE;
          
!     lock_ObtainMutex(&scp->mx);
  
      code = cm_SyncOp(scp, NULL, userp, reqp, rights,
                        CM_SCACHESYNC_GETSTATUS
--- 262,268 ----
      if (openMode == 1 || openMode == 2 || trunc) 
  	rights |= PRSFS_WRITE;
          
!     lock_ObtainWrite(&scp->rw);
  
      code = cm_SyncOp(scp, NULL, userp, reqp, rights,
                        CM_SCACHESYNC_GETSTATUS
***************
*** 326,332 ****
  
   _done:
  
!     lock_ReleaseMutex(&scp->mx);
  
      return code;
  }
--- 326,332 ----
  
   _done:
  
!     lock_ReleaseWrite(&scp->rw);
  
      return code;
  }
***************
*** 348,354 ****
  
      rights = 0;
  
!     if (desiredAccess & AFS_ACCESS_READ)
          rights |= (scp->fileType == CM_SCACHETYPE_DIRECTORY ? PRSFS_LOOKUP : PRSFS_READ);
  
      /* We used to require PRSFS_WRITE if createDisp was 4
--- 348,354 ----
  
      rights = 0;
  
!     if (desiredAccess & (AFS_ACCESS_READ|AFS_ACCESS_EXECUTE))
          rights |= (scp->fileType == CM_SCACHETYPE_DIRECTORY ? PRSFS_LOOKUP : PRSFS_READ);
  
      /* We used to require PRSFS_WRITE if createDisp was 4
***************
*** 358,364 ****
      if (desiredAccess & AFS_ACCESS_WRITE)
          rights |= PRSFS_WRITE;
  
!     lock_ObtainMutex(&scp->mx);
  
      code = cm_SyncOp(scp, NULL, userp, reqp, rights,
                        CM_SCACHESYNC_GETSTATUS
--- 358,364 ----
      if (desiredAccess & AFS_ACCESS_WRITE)
          rights |= PRSFS_WRITE;
  
!     lock_ObtainWrite(&scp->rw);
  
      code = cm_SyncOp(scp, NULL, userp, reqp, rights,
                        CM_SCACHESYNC_GETSTATUS
***************
*** 440,446 ****
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK);
  
   _done:
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log3(afsd_logp,"cm_CheckNTOpen scp 0x%p ldp 0x%p code 0x%x", scp, *ldpp, code);
      return code;
--- 440,446 ----
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK);
  
   _done:
!     lock_ReleaseWrite(&scp->rw);
  
      osi_Log3(afsd_logp,"cm_CheckNTOpen scp 0x%p ldp 0x%p code 0x%x", scp, *ldpp, code);
      return code;
***************
*** 451,460 ****
  {
      osi_Log2(afsd_logp,"cm_CheckNTOpenDone scp 0x%p ldp 0x%p", scp, *ldpp);
      if (*ldpp) {
! 	lock_ObtainMutex(&scp->mx);
  	cm_Unlock(scp, (*ldpp)->sLockType, (*ldpp)->LOffset, (*ldpp)->LLength, 
  		  (*ldpp)->key, userp, reqp);
! 	lock_ReleaseMutex(&scp->mx);
  	free(*ldpp);
  	*ldpp = NULL;
      }
--- 451,460 ----
  {
      osi_Log2(afsd_logp,"cm_CheckNTOpenDone scp 0x%p ldp 0x%p", scp, *ldpp);
      if (*ldpp) {
! 	lock_ObtainWrite(&scp->rw);
  	cm_Unlock(scp, (*ldpp)->sLockType, (*ldpp)->LOffset, (*ldpp)->LLength, 
  		  (*ldpp)->key, userp, reqp);
! 	lock_ReleaseWrite(&scp->rw);
  	free(*ldpp);
  	*ldpp = NULL;
      }
***************
*** 483,495 ****
      unsigned short *hashTable;
      unsigned int i, idx;
      int BeyondPage = 0, HaveDot = 0, HaveDotDot = 0;
  
      /* First check permissions */
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, reqp, PRSFS_DELETE,
                        CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!     lock_ReleaseMutex(&scp->mx);
      if (code)
          return code;
  
--- 483,496 ----
      unsigned short *hashTable;
      unsigned int i, idx;
      int BeyondPage = 0, HaveDot = 0, HaveDotDot = 0;
+     int releaseLock = 0;
  
      /* First check permissions */
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, reqp, PRSFS_DELETE,
                        CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!     lock_ReleaseWrite(&scp->rw);
      if (code)
          return code;
  
***************
*** 504,517 ****
          return code;
  
      lock_ObtainMutex(&bufferp->mx);
!     lock_ObtainMutex(&scp->mx);
      while (1) {
          code = cm_SyncOp(scp, bufferp, userp, reqp, 0,
                            CM_SCACHESYNC_NEEDCALLBACK
                            | CM_SCACHESYNC_READ
                            | CM_SCACHESYNC_BUFLOCKED);
          if (code)
!             break;
  
          if (cm_HaveBuffer(scp, bufferp, 1))
              break;
--- 505,519 ----
          return code;
  
      lock_ObtainMutex(&bufferp->mx);
!     lock_ObtainWrite(&scp->rw);
!     releaseLock = 1;
      while (1) {
          code = cm_SyncOp(scp, bufferp, userp, reqp, 0,
                            CM_SCACHESYNC_NEEDCALLBACK
                            | CM_SCACHESYNC_READ
                            | CM_SCACHESYNC_BUFLOCKED);
          if (code)
!             goto done;
  
          if (cm_HaveBuffer(scp, bufferp, 1))
              break;
***************
*** 519,532 ****
          /* otherwise, load the buffer and try again */
          lock_ReleaseMutex(&bufferp->mx);
          code = cm_GetBuffer(scp, bufferp, NULL, userp, reqp);
!         lock_ReleaseMutex(&scp->mx);
          lock_ObtainMutex(&bufferp->mx);
!         lock_ObtainMutex(&scp->mx);
  	cm_SyncOpDone(scp, bufferp, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_READ | CM_SCACHESYNC_BUFLOCKED);
          if (code)
!             break;
      }
  
      /* We try to determine emptiness without looking beyond the first page,
       * and without assuming "." and ".." are present and are on the first
       * page (though these assumptions might, after all, be reasonable).
--- 521,537 ----
          /* otherwise, load the buffer and try again */
          lock_ReleaseMutex(&bufferp->mx);
          code = cm_GetBuffer(scp, bufferp, NULL, userp, reqp);
!         lock_ReleaseWrite(&scp->rw);
          lock_ObtainMutex(&bufferp->mx);
!         lock_ObtainWrite(&scp->rw);
  	cm_SyncOpDone(scp, bufferp, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_READ | CM_SCACHESYNC_BUFLOCKED);
          if (code)
!             goto done;
      }
  
+     lock_ReleaseWrite(&scp->rw);
+     releaseLock = 0;
+ 
      /* We try to determine emptiness without looking beyond the first page,
       * and without assuming "." and ".." are present and are on the first
       * page (though these assumptions might, after all, be reasonable).
***************
*** 558,564 ****
    done:   
      lock_ReleaseMutex(&bufferp->mx);
      buf_Release(bufferp);
!     lock_ReleaseMutex(&scp->mx);
      return code;
  }       
  
--- 563,570 ----
    done:   
      lock_ReleaseMutex(&bufferp->mx);
      buf_Release(bufferp);
!     if (releaseLock)
!         lock_ReleaseWrite(&scp->rw);
      return code;
  }       
  
***************
*** 591,600 ****
      int numDirChunks;	/* # of 32 byte dir chunks in this entry */
          
      /* get the directory size */
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, reqp, PRSFS_LOOKUP,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!     lock_ReleaseMutex(&scp->mx);
      if (code)
          return code;
          
--- 597,606 ----
      int numDirChunks;	/* # of 32 byte dir chunks in this entry */
          
      /* get the directory size */
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, reqp, PRSFS_LOOKUP,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!     lock_ReleaseWrite(&scp->rw);
      if (code)
          return code;
          
***************
*** 740,781 ****
                  break;
              }
  
- #ifdef AFSIFS
- 	    /* for the IFS version, we bulkstat the dirents because this
- 	       routine is used in place of smb_ReceiveCoreSearchDir.  our
- 	       other option is to modify smb_ReceiveCoreSearchDir itself, 
- 	       but this seems to be the proper use for cm_ApplyDir. */
-             lock_ObtainMutex(&scp->mx);
-             if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0
-                  && (scp->bulkStatProgress.QuadPart <= thyper.QuadPart))
-             {
-                 scp->flags |= CM_SCACHEFLAG_BULKSTATTING;
-                 code = cm_TryBulkStat(scp, &thyper, userp, reqp);
-                 scp->flags &= ~CM_SCACHEFLAG_BULKSTATTING;
-                 scp->bulkStatProgress = thyper;
-             }
-             lock_ReleaseMutex(&scp->mx);
- #endif
- 
              lock_ObtainMutex(&bufferp->mx);
              bufferOffset = thyper;
  
              /* now get the data in the cache */
              while (1) {
!                 lock_ObtainMutex(&scp->mx);
                  code = cm_SyncOp(scp, bufferp, userp, reqp,
                                    PRSFS_LOOKUP,
                                    CM_SCACHESYNC_NEEDCALLBACK
                                    | CM_SCACHESYNC_READ
                                    | CM_SCACHESYNC_BUFLOCKED);
                  if (code) {
!                     lock_ReleaseMutex(&scp->mx);
                      break;
                  }
  		cm_SyncOpDone(scp, bufferp, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_READ | CM_SCACHESYNC_BUFLOCKED);
                                  
                  if (cm_HaveBuffer(scp, bufferp, 1)) {
!                     lock_ReleaseMutex(&scp->mx);
                      break;
                  }
  
--- 746,770 ----
                  break;
              }
  
              lock_ObtainMutex(&bufferp->mx);
              bufferOffset = thyper;
  
              /* now get the data in the cache */
              while (1) {
!                 lock_ObtainWrite(&scp->rw);
                  code = cm_SyncOp(scp, bufferp, userp, reqp,
                                    PRSFS_LOOKUP,
                                    CM_SCACHESYNC_NEEDCALLBACK
                                    | CM_SCACHESYNC_READ
                                    | CM_SCACHESYNC_BUFLOCKED);
                  if (code) {
!                     lock_ReleaseWrite(&scp->rw);
                      break;
                  }
  		cm_SyncOpDone(scp, bufferp, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_READ | CM_SCACHESYNC_BUFLOCKED);
                                  
                  if (cm_HaveBuffer(scp, bufferp, 1)) {
!                     lock_ReleaseWrite(&scp->rw);
                      break;
                  }
  
***************
*** 783,789 ****
                  lock_ReleaseMutex(&bufferp->mx);
                  code = cm_GetBuffer(scp, bufferp, NULL, userp,
                                      reqp);
!                 lock_ReleaseMutex(&scp->mx);
                  lock_ObtainMutex(&bufferp->mx);
                  if (code) 
                      break;
--- 772,778 ----
                  lock_ReleaseMutex(&bufferp->mx);
                  code = cm_GetBuffer(scp, bufferp, NULL, userp,
                                      reqp);
!                 lock_ReleaseWrite(&scp->rw);
                  lock_ObtainMutex(&bufferp->mx);
                  if (code) 
                      break;
***************
*** 961,967 ****
  }       
  
  /* read the contents of a mount point into the appropriate string.
!  * called with locked scp, and returns with locked scp.
   */
  long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
  {
--- 950,956 ----
  }       
  
  /* read the contents of a mount point into the appropriate string.
!  * called with write locked scp, and returns with locked scp.
   */
  long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
  {
***************
*** 974,985 ****
          return 0;
          
      /* otherwise, we have to read it in */
!     lock_ReleaseMutex(&scp->mx);
  
      thyper.LowPart = thyper.HighPart = 0;
      code = buf_Get(scp, &thyper, &bufp);
  
!     lock_ObtainMutex(&scp->mx);
      if (code)
          return code;
  
--- 963,974 ----
          return 0;
          
      /* otherwise, we have to read it in */
!     lock_ReleaseWrite(&scp->rw);
  
      thyper.LowPart = thyper.HighPart = 0;
      code = buf_Get(scp, &thyper, &bufp);
  
!     lock_ObtainWrite(&scp->rw);
      if (code)
          return code;
  
***************
*** 1033,1039 ****
  
  
  /* called with a locked scp and chases the mount point, yielding outScpp.
!  * scp remains locked, just for simplicity of describing the interface.
   */
  long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp,
                           cm_req_t *reqp, cm_scache_t **outScpp)
--- 1022,1028 ----
  
  
  /* called with a locked scp and chases the mount point, yielding outScpp.
!  * scp remains write locked, just for simplicity of describing the interface.
   */
  long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp,
                           cm_req_t *reqp, cm_scache_t **outScpp)
***************
*** 1053,1061 ****
  
      if (scp->mountRootFid.cell != 0 && scp->mountRootGen >= cm_data.mountRootGen) {
          tfid = scp->mountRootFid;
!         lock_ReleaseMutex(&scp->mx);
          code = cm_GetSCache(&tfid, outScpp, userp, reqp);
!         lock_ObtainMutex(&scp->mx);
          return code;
      }
  
--- 1042,1050 ----
  
      if (scp->mountRootFid.cell != 0 && scp->mountRootGen >= cm_data.mountRootGen) {
          tfid = scp->mountRootFid;
!         lock_ReleaseWrite(&scp->rw);
          code = cm_GetSCache(&tfid, outScpp, userp, reqp);
!         lock_ObtainWrite(&scp->rw);
          return code;
      }
  
***************
*** 1075,1083 ****
          strncpy(cellNamep, mpNamep+1, cp - mpNamep - 1);
          strcpy(volNamep, cp+1);
          /* now look up the cell */
!         lock_ReleaseMutex(&scp->mx);
          cellp = cm_GetCell(cellNamep, CM_FLAG_CREATE);
!         lock_ObtainMutex(&scp->mx);
      }
      else {
          /* normal mt pt */
--- 1064,1072 ----
          strncpy(cellNamep, mpNamep+1, cp - mpNamep - 1);
          strcpy(volNamep, cp+1);
          /* now look up the cell */
!         lock_ReleaseWrite(&scp->rw);
          cellp = cm_GetCell(cellNamep, CM_FLAG_CREATE);
!         lock_ObtainWrite(&scp->rw);
      }
      else {
          /* normal mt pt */
***************
*** 1109,1137 ****
      }
  
      /* now we need to get the volume */
!     lock_ReleaseMutex(&scp->mx);
      if (cm_VolNameIsID(volNamep)) {
!         code = cm_GetVolumeByID(cellp, atoi(volNamep), userp, reqp, 
                                  CM_GETVOL_FLAG_CREATE, &volp);
      } else {
!         code = cm_GetVolumeByName(cellp, volNamep, userp, reqp, 
                                    CM_GETVOL_FLAG_CREATE, &volp);
      }
!     lock_ObtainMutex(&scp->mx);
          
      if (code == 0) {
          afs_uint32 cell, volume;
  
-         /* save the parent of the volume root for this is the 
-          * place where the volume is mounted and we must remember 
-          * this in the volume structure rather than just in the 
-          * scache entry lest the scache entry gets recycled 
-          * (defect 11489)
-          */
-         lock_ObtainMutex(&volp->mx);
-         volp->dotdotFid = dscp->fid;
-         lock_ReleaseMutex(&volp->mx);
- 
          cell = cellp->cellID;
          
          /* if the mt pt originates in a .backup volume (not a .readonly)
--- 1098,1116 ----
      }
  
      /* now we need to get the volume */
!     lock_ReleaseWrite(&scp->rw);
      if (cm_VolNameIsID(volNamep)) {
!         code = cm_FindVolumeByID(cellp, atoi(volNamep), userp, reqp, 
                                  CM_GETVOL_FLAG_CREATE, &volp);
      } else {
!         code = cm_FindVolumeByName(cellp, volNamep, userp, reqp, 
                                    CM_GETVOL_FLAG_CREATE, &volp);
      }
!     lock_ObtainWrite(&scp->rw);
          
      if (code == 0) {
          afs_uint32 cell, volume;
  
          cell = cellp->cellID;
          
          /* if the mt pt originates in a .backup volume (not a .readonly)
***************
*** 1156,1176 ****
                   volp->ro.ID != 0) {
              targetType = ROVOL;
          }
!         if (targetType == ROVOL)
              volume = volp->ro.ID;
!         else if (targetType == BACKVOL)
              volume = volp->bk.ID;
!         else
              volume = volp->rw.ID;
  
          /* the rest of the fid is a magic number */
          cm_SetFid(&scp->mountRootFid, cell, volume, 1, 1);
          scp->mountRootGen = cm_data.mountRootGen;
  
          tfid = scp->mountRootFid;
!         lock_ReleaseMutex(&scp->mx);
          code = cm_GetSCache(&tfid, outScpp, userp, reqp);
!         lock_ObtainMutex(&scp->mx);
      }
  
    done:
--- 1135,1165 ----
                   volp->ro.ID != 0) {
              targetType = ROVOL;
          }
!         if (targetType == ROVOL) {
              volume = volp->ro.ID;
!             lock_ObtainMutex(&volp->mx);
!             volp->ro.dotdotFid = dscp->fid;
!             lock_ReleaseMutex(&volp->mx);
!         } else if (targetType == BACKVOL) {
              volume = volp->bk.ID;
!             lock_ObtainMutex(&volp->mx);
!             volp->bk.dotdotFid = dscp->fid;
!             lock_ReleaseMutex(&volp->mx);
!         } else {
              volume = volp->rw.ID;
+             lock_ObtainMutex(&volp->mx);
+             volp->rw.dotdotFid = dscp->fid;
+             lock_ReleaseMutex(&volp->mx);
+         }
  
          /* the rest of the fid is a magic number */
          cm_SetFid(&scp->mountRootFid, cell, volume, 1, 1);
          scp->mountRootGen = cm_data.mountRootGen;
  
          tfid = scp->mountRootFid;
!         lock_ReleaseWrite(&scp->rw);
          code = cm_GetSCache(&tfid, outScpp, userp, reqp);
!         lock_ObtainWrite(&scp->rw);
      }
  
    done:
***************
*** 1341,1351 ****
      }       
      /* tscp is now held */
  
!     lock_ObtainMutex(&tscp->mx);
      code = cm_SyncOp(tscp, NULL, userp, reqp, 0,
                        CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) { 
!         lock_ReleaseMutex(&tscp->mx);
          cm_ReleaseSCache(tscp);
          return code;
      }
--- 1330,1340 ----
      }       
      /* tscp is now held */
  
!     lock_ObtainWrite(&tscp->rw);
      code = cm_SyncOp(tscp, NULL, userp, reqp, 0,
                        CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) { 
!         lock_ReleaseWrite(&tscp->rw);
          cm_ReleaseSCache(tscp);
          return code;
      }
***************
*** 1361,1367 ****
          if (code == 0)
              code = cm_FollowMountPoint(tscp, dscp, userp, reqp,
                                          &mountedScp);
!         lock_ReleaseMutex(&tscp->mx);
          cm_ReleaseSCache(tscp);
          if (code) {
              return code;
--- 1350,1356 ----
          if (code == 0)
              code = cm_FollowMountPoint(tscp, dscp, userp, reqp,
                                          &mountedScp);
!         lock_ReleaseWrite(&tscp->rw);
          cm_ReleaseSCache(tscp);
          if (code) {
              return code;
***************
*** 1369,1375 ****
          tscp = mountedScp;
      }
      else {
!         lock_ReleaseMutex(&tscp->mx);
      }
  
      /* copy back pointer */
--- 1358,1364 ----
          tscp = mountedScp;
      }
      else {
!         lock_ReleaseWrite(&tscp->rw);
      }
  
      /* copy back pointer */
***************
*** 1378,1387 ****
      /* insert scache in dnlc */
      if ( !dnlcHit && !(flags & CM_FLAG_NOMOUNTCHASE) && rock.ExactFound ) {
          /* lock the directory entry to prevent racing callback revokes */
!         lock_ObtainMutex(&dscp->mx);
          if ( dscp->cbServerp != NULL && dscp->cbExpires > 0 )
              cm_dnlcEnter(dscp, namep, tscp);
!         lock_ReleaseMutex(&dscp->mx);
      }
  
      /* and return */
--- 1367,1376 ----
      /* insert scache in dnlc */
      if ( !dnlcHit && !(flags & CM_FLAG_NOMOUNTCHASE) && rock.ExactFound ) {
          /* lock the directory entry to prevent racing callback revokes */
!         lock_ObtainRead(&dscp->rw);
          if ( dscp->cbServerp != NULL && dscp->cbExpires > 0 )
              cm_dnlcEnter(dscp, namep, tscp);
!         lock_ReleaseRead(&dscp->rw);
      }
  
      /* and return */
***************
*** 1404,1410 ****
      if (outp == NULL) 
          return 1;
  
!     if (index >= MAXNUMSYSNAMES)
          return -1;
  
      /* otherwise generate the properly expanded @sys name */
--- 1393,1399 ----
      if (outp == NULL) 
          return 1;
  
!     if (index >= cm_sysNameCount)
          return -1;
  
      /* otherwise generate the properly expanded @sys name */
***************
*** 1486,1495 ****
          volType = RWVOL;
  
      if (cm_VolNameIsID(volumeName)) {
!         code = cm_GetVolumeByID(cellp, atoi(volumeName), userp, reqp,
                                  CM_GETVOL_FLAG_CREATE, &volp);
      } else {
!         code = cm_GetVolumeByName(cellp, volumeName, userp, reqp,
                                    CM_GETVOL_FLAG_CREATE, &volp);
      }
  
--- 1475,1484 ----
          volType = RWVOL;
  
      if (cm_VolNameIsID(volumeName)) {
!         code = cm_FindVolumeByID(cellp, atoi(volumeName), userp, reqp,
                                  CM_GETVOL_FLAG_CREATE, &volp);
      } else {
!         code = cm_FindVolumeByName(cellp, volumeName, userp, reqp,
                                    CM_GETVOL_FLAG_CREATE, &volp);
      }
  
***************
*** 1619,1628 ****
      /* make sure we don't screw up the dir status during the merge */
      code = cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
  
!     lock_ObtainMutex(&dscp->mx);
      sflags = CM_SCACHESYNC_STOREDATA;
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, sflags);
!     lock_ReleaseMutex(&dscp->mx);
      if (code) {
          cm_EndDirOp(&dirop);
          return code;
--- 1608,1617 ----
      /* make sure we don't screw up the dir status during the merge */
      code = cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
  
!     lock_ObtainWrite(&dscp->rw);
      sflags = CM_SCACHESYNC_STOREDATA;
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, sflags);
!     lock_ReleaseWrite(&dscp->rw);
      if (code) {
          cm_EndDirOp(&dirop);
          return code;
***************
*** 1656,1662 ****
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&dscp->mx);
      cm_dnlcRemove(dscp, namep);
      cm_SyncOpDone(dscp, NULL, sflags);
      if (code == 0) {
--- 1645,1651 ----
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&dscp->rw);
      cm_dnlcRemove(dscp, namep);
      cm_SyncOpDone(dscp, NULL, sflags);
      if (code == 0) {
***************
*** 1668,1674 ****
  	 */
  	dscp->cbServerp = NULL;
      }
!     lock_ReleaseMutex(&dscp->mx);
  
      if (code == 0 && cm_CheckDirOpForSingleChange(&dirop)) {
          cm_DirDeleteEntry(&dirop, namep);
--- 1657,1663 ----
  	 */
  	dscp->cbServerp = NULL;
      }
!     lock_ReleaseWrite(&dscp->rw);
  
      if (code == 0 && cm_CheckDirOpForSingleChange(&dirop)) {
          cm_DirDeleteEntry(&dirop, namep);
***************
*** 1681,1688 ****
      return code;
  }
  
! /* called with a locked vnode, and fills in the link info.
!  * returns this the vnode still locked.
   */
  long cm_HandleLink(cm_scache_t *linkScp, cm_user_t *userp, cm_req_t *reqp)
  {
--- 1670,1677 ----
      return code;
  }
  
! /* called with a write locked vnode, and fills in the link info.
!  * returns this the vnode still write locked.
   */
  long cm_HandleLink(cm_scache_t *linkScp, cm_user_t *userp, cm_req_t *reqp)
  {
***************
*** 1691,1703 ****
      long temp;
      osi_hyper_t thyper;
  
!     lock_AssertMutex(&linkScp->mx);
      if (!linkScp->mountPointStringp[0]) {
          /* read the link data */
!         lock_ReleaseMutex(&linkScp->mx);
          thyper.LowPart = thyper.HighPart = 0;
          code = buf_Get(linkScp, &thyper, &bufp);
!         lock_ObtainMutex(&linkScp->mx);
          if (code) 
              return code;
          while (1) {
--- 1680,1692 ----
      long temp;
      osi_hyper_t thyper;
  
!     lock_AssertWrite(&linkScp->rw);
      if (!linkScp->mountPointStringp[0]) {
          /* read the link data */
!         lock_ReleaseWrite(&linkScp->rw);
          thyper.LowPart = thyper.HighPart = 0;
          code = buf_Get(linkScp, &thyper, &bufp);
!         lock_ObtainWrite(&linkScp->rw);
          if (code) 
              return code;
          while (1) {
***************
*** 1761,1767 ****
      *newRootScpp = NULL;
      *newSpaceBufferp = NULL;
  
!     lock_ObtainMutex(&linkScp->mx);
      code = cm_HandleLink(linkScp, userp, reqp);
      if (code)
          goto done;
--- 1750,1756 ----
      *newRootScpp = NULL;
      *newSpaceBufferp = NULL;
  
!     lock_ObtainWrite(&linkScp->rw);
      code = cm_HandleLink(linkScp, userp, reqp);
      if (code)
          goto done;
***************
*** 1771,1778 ****
       * being a little conservative here.
       */
      if (strlen(linkScp->mountPointStringp) + strlen(pathSuffixp) + 2
!          >= CM_UTILS_SPACESIZE)
!         return CM_ERROR_TOOBIG;
  
      tsp = cm_GetSpace();
      linkp = linkScp->mountPointStringp;
--- 1760,1769 ----
       * being a little conservative here.
       */
      if (strlen(linkScp->mountPointStringp) + strlen(pathSuffixp) + 2
! 		>= CM_UTILS_SPACESIZE) {
!         code = CM_ERROR_TOOBIG;
! 		goto done;
! 	}
  
      tsp = cm_GetSpace();
      linkp = linkScp->mountPointStringp;
***************
*** 1841,1847 ****
      }
  
    done:
!     lock_ReleaseMutex(&linkScp->mx);
      return code;
  }
  #ifdef DEBUG_REFCOUNT
--- 1832,1838 ----
      }
  
    done:
!     lock_ReleaseWrite(&linkScp->rw);
      return code;
  }
  #ifdef DEBUG_REFCOUNT
***************
*** 2003,2014 ****
                  /* now, if tscp is a symlink, we should follow
                   * it and assemble the path again.
                   */
!                 lock_ObtainMutex(&tscp->mx);
                  code = cm_SyncOp(tscp, NULL, userp, reqp, 0,
                                    CM_SCACHESYNC_GETSTATUS
                                    | CM_SCACHESYNC_NEEDCALLBACK);
                  if (code) {
!                     lock_ReleaseMutex(&tscp->mx);
                      cm_ReleaseSCache(tscp);
                      tscp = NULL;
                      if (dirScp) {
--- 1994,2005 ----
                  /* now, if tscp is a symlink, we should follow
                   * it and assemble the path again.
                   */
!                 lock_ObtainWrite(&tscp->rw);
                  code = cm_SyncOp(tscp, NULL, userp, reqp, 0,
                                    CM_SCACHESYNC_GETSTATUS
                                    | CM_SCACHESYNC_NEEDCALLBACK);
                  if (code) {
!                     lock_ReleaseWrite(&tscp->rw);
                      cm_ReleaseSCache(tscp);
                      tscp = NULL;
                      if (dirScp) {
***************
*** 2021,2027 ****
  
                  if (tscp->fileType == CM_SCACHETYPE_SYMLINK) {
                      /* this is a symlink; assemble a new buffer */
!                     lock_ReleaseMutex(&tscp->mx);
                      if (symlinkCount++ >= MAX_SYMLINK_COUNT) {
                          cm_ReleaseSCache(tscp);
                          tscp = NULL;
--- 2012,2018 ----
  
                  if (tscp->fileType == CM_SCACHETYPE_SYMLINK) {
                      /* this is a symlink; assemble a new buffer */
!                     lock_ReleaseWrite(&tscp->rw);
                      if (symlinkCount++ >= MAX_SYMLINK_COUNT) {
                          cm_ReleaseSCache(tscp);
                          tscp = NULL;
***************
*** 2100,2106 ****
                      }
                  } else {
                      /* not a symlink, we may be done */
!                     lock_ReleaseMutex(&tscp->mx);
                      if (tc == 0) {
                          if (phase == 1) {
                              phase = 2;
--- 2091,2097 ----
                      }
                  } else {
                      /* not a symlink, we may be done */
!                     lock_ReleaseWrite(&tscp->rw);
                      if (tc == 0) {
                          if (phase == 1) {
                              phase = 2;
***************
*** 2258,2275 ****
      cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique));
      tscp = cm_FindSCache(&tfid);
      if (tscp) {
!         if (lock_TryMutex(&tscp->mx)) {
              /* we have an entry that we can look at */
              if (!(tscp->flags & CM_SCACHEFLAG_EACCESS) && cm_HaveCallback(tscp)) {
                  /* we have a callback on it.  Don't bother
                   * fetching this stat entry, since we're happy
                   * with the info we have.
                   */
!                 lock_ReleaseMutex(&tscp->mx);
                  cm_ReleaseSCache(tscp);
                  return 0;
              }
!             lock_ReleaseMutex(&tscp->mx);
          }	/* got lock */
          cm_ReleaseSCache(tscp);
      }	/* found entry */
--- 2249,2266 ----
      cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique));
      tscp = cm_FindSCache(&tfid);
      if (tscp) {
!         if (lock_TryWrite(&tscp->rw)) {
              /* we have an entry that we can look at */
              if (!(tscp->flags & CM_SCACHEFLAG_EACCESS) && cm_HaveCallback(tscp)) {
                  /* we have a callback on it.  Don't bother
                   * fetching this stat entry, since we're happy
                   * with the info we have.
                   */
!                 lock_ReleaseWrite(&tscp->rw);
                  cm_ReleaseSCache(tscp);
                  return 0;
              }
!             lock_ReleaseWrite(&tscp->rw);
          }	/* got lock */
          cm_ReleaseSCache(tscp);
      }	/* found entry */
***************
*** 2295,2301 ****
      return 0;
  }       
  
! /* called with a locked scp and a pointer to a buffer.  Make bulk stat
   * calls on all undeleted files in the page of the directory specified.
   */
  afs_int32
--- 2286,2292 ----
      return 0;
  }       
  
! /* called with a write locked scp and a pointer to a buffer.  Make bulk stat
   * calls on all undeleted files in the page of the directory specified.
   */
  afs_int32
***************
*** 2328,2340 ****
      memset(&bb, 0, sizeof(bb));
      bb.bufOffset = *offsetp;
  
!     lock_ReleaseMutex(&dscp->mx);
      /* first, assemble the file IDs we need to stat */
      code = cm_ApplyDir(dscp, cm_TryBulkProc, (void *) &bb, offsetp, userp, reqp, NULL);
  
      /* if we failed, bail out early */
      if (code && code != CM_ERROR_STOPNOW) {
!         lock_ObtainMutex(&dscp->mx);
          return code;
      }
  
--- 2319,2331 ----
      memset(&bb, 0, sizeof(bb));
      bb.bufOffset = *offsetp;
  
!     lock_ReleaseWrite(&dscp->rw);
      /* first, assemble the file IDs we need to stat */
      code = cm_ApplyDir(dscp, cm_TryBulkProc, (void *) &bb, offsetp, userp, reqp, NULL);
  
      /* if we failed, bail out early */
      if (code && code != CM_ERROR_STOPNOW) {
!         lock_ObtainWrite(&dscp->rw);
          return code;
      }
  
***************
*** 2405,2411 ****
              /* otherwise, if this entry has no callback info, 
               * merge in this.
               */
!             lock_ObtainMutex(&scp->mx);
              /* now, we have to be extra paranoid on merging in this
               * information, since we didn't use cm_SyncOp before
               * starting the fetch to make sure that no bad races
--- 2396,2402 ----
              /* otherwise, if this entry has no callback info, 
               * merge in this.
               */
!             lock_ObtainWrite(&scp->rw);
              /* now, we have to be extra paranoid on merging in this
               * information, since we didn't use cm_SyncOp before
               * starting the fetch to make sure that no bad races
***************
*** 2426,2432 ****
                                              CM_CALLBACK_MAINTAINCOUNT);
                  cm_MergeStatus(dscp, scp, &bb.stats[j], &volSync, userp, 0);
              }       
!             lock_ReleaseMutex(&scp->mx);
              cm_ReleaseSCache(scp);
          } /* all files in the response */
          /* now tell it to drop the count,
--- 2417,2423 ----
                                              CM_CALLBACK_MAINTAINCOUNT);
                  cm_MergeStatus(dscp, scp, &bb.stats[j], &volSync, userp, 0);
              }       
!             lock_ReleaseWrite(&scp->rw);
              cm_ReleaseSCache(scp);
          } /* all files in the response */
          /* now tell it to drop the count,
***************
*** 2435,2441 ****
  
          filex += filesThisCall;
      }	/* while there are still more files to process */
!     lock_ObtainMutex(&dscp->mx);
  
      /* If we did the InlineBulk RPC pull out the return code and log it */
      if (inlinebulk) {
--- 2426,2432 ----
  
          filex += filesThisCall;
      }	/* while there are still more files to process */
!     lock_ObtainWrite(&dscp->rw);
  
      /* If we did the InlineBulk RPC pull out the return code and log it */
      if (inlinebulk) {
***************
*** 2502,2508 ****
      lock_ObtainWrite(&scp->bufCreateLock);
  
      /* verify that this is a file, not a dir or a symlink */
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
--- 2493,2499 ----
      lock_ObtainWrite(&scp->bufCreateLock);
  
      /* verify that this is a file, not a dir or a symlink */
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
***************
*** 2520,2528 ****
      else
          shrinking = 0;
  
!     lock_ReleaseMutex(&scp->mx);
  
!     /* can't hold scp->mx lock here, since we may wait for a storeback to
       * finish if the buffer package is cleaning a buffer by storing it to
       * the server.
       */
--- 2511,2519 ----
      else
          shrinking = 0;
  
!     lock_ReleaseWrite(&scp->rw);
  
!     /* can't hold scp->rw lock here, since we may wait for a storeback to
       * finish if the buffer package is cleaning a buffer by storing it to
       * the server.
       */
***************
*** 2530,2536 ****
          buf_Truncate(scp, userp, reqp, sizep);
  
      /* now ensure that file length is short enough, and update truncPos */
!     lock_ObtainMutex(&scp->mx);
  
      /* make sure we have a callback (so we have the right value for the
       * length), and wait for it to be safe to do a truncate.
--- 2521,2527 ----
          buf_Truncate(scp, userp, reqp, sizep);
  
      /* now ensure that file length is short enough, and update truncPos */
!     lock_ObtainWrite(&scp->rw);
  
      /* make sure we have a callback (so we have the right value for the
       * length), and wait for it to be safe to do a truncate.
***************
*** 2581,2587 ****
  		   | CM_SCACHESYNC_SETSTATUS | CM_SCACHESYNC_SETSIZE);
  
    done:
!     lock_ReleaseMutex(&scp->mx);
      lock_ReleaseWrite(&scp->bufCreateLock);
  
      return code;
--- 2572,2578 ----
  		   | CM_SCACHESYNC_SETSTATUS | CM_SCACHESYNC_SETSIZE);
  
    done:
!     lock_ReleaseWrite(&scp->rw);
      lock_ReleaseWrite(&scp->bufCreateLock);
  
      return code;
***************
*** 2603,2615 ****
      if (attrp->mask & CM_ATTRMASK_LENGTH)
          return cm_SetLength(scp, &attrp->length, userp, reqp);
  
!     lock_ObtainMutex(&scp->mx);
      /* otherwise, we have to make an RPC to get the status */
      code = cm_SyncOp(scp, NULL, userp, reqp, 0, CM_SCACHESYNC_STORESTATUS);
      if (code) {
! 	lock_ReleaseMutex(&scp->mx);
          return code;
      }
  
      /* make the attr structure */
      cm_StatusFromAttr(&afsInStatus, scp, attrp);
--- 2594,2607 ----
      if (attrp->mask & CM_ATTRMASK_LENGTH)
          return cm_SetLength(scp, &attrp->length, userp, reqp);
  
!     lock_ObtainWrite(&scp->rw);
      /* otherwise, we have to make an RPC to get the status */
      code = cm_SyncOp(scp, NULL, userp, reqp, 0, CM_SCACHESYNC_STORESTATUS);
      if (code) {
! 	lock_ReleaseWrite(&scp->rw);
          return code;
      }
+     lock_ConvertWToR(&scp->rw);
  
      /* make the attr structure */
      cm_StatusFromAttr(&afsInStatus, scp, attrp);
***************
*** 2617,2623 ****
      tfid.Volume = scp->fid.volume;
      tfid.Vnode = scp->fid.vnode;
      tfid.Unique = scp->fid.unique;
! 	lock_ReleaseMutex(&scp->mx);
  
      /* now make the RPC */
      osi_Log1(afsd_logp, "CALL StoreStatus scp 0x%p", scp);
--- 2609,2615 ----
      tfid.Volume = scp->fid.volume;
      tfid.Vnode = scp->fid.vnode;
      tfid.Unique = scp->fid.unique;
!     lock_ReleaseRead(&scp->rw);
  
      /* now make the RPC */
      osi_Log1(afsd_logp, "CALL StoreStatus scp 0x%p", scp);
***************
*** 2640,2646 ****
      else
          osi_Log0(afsd_logp, "CALL StoreStatus SUCCESS");
  
!     lock_ObtainMutex(&scp->mx);
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STORESTATUS);
      if (code == 0)
          cm_MergeStatus(NULL, scp, &afsOutStatus, &volSync, userp,
--- 2632,2638 ----
      else
          osi_Log0(afsd_logp, "CALL StoreStatus SUCCESS");
  
!     lock_ObtainWrite(&scp->rw);
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STORESTATUS);
      if (code == 0)
          cm_MergeStatus(NULL, scp, &afsOutStatus, &volSync, userp,
***************
*** 2651,2657 ****
       */
      if (afsInStatus.Mask & AFS_SETMODE) 
  	cm_FreeAllACLEnts(scp);
!     lock_ReleaseMutex(&scp->mx);
      return code;
  }       
  
--- 2643,2649 ----
       */
      if (afsInStatus.Mask & AFS_SETMODE) 
  	cm_FreeAllACLEnts(scp);
!     lock_ReleaseWrite(&scp->rw);
      return code;
  }       
  
***************
*** 2696,2704 ****
       * completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainMutex(&dscp->mx);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseMutex(&dscp->mx);
      if (code == 0) {
          cm_StartCallbackGrantingCall(NULL, &cbReq);
      } else {
--- 2688,2696 ----
       * completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainWrite(&dscp->rw);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseWrite(&dscp->rw);
      if (code == 0) {
          cm_StartCallbackGrantingCall(NULL, &cbReq);
      } else {
***************
*** 2742,2753 ****
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&dscp->mx);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseMutex(&dscp->mx);
  
      /* now try to create the file's entry, too, but be careful to 
       * make sure that we don't merge in old info.  Since we weren't locking
--- 2734,2745 ----
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&dscp->rw);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseWrite(&dscp->rw);
  
      /* now try to create the file's entry, too, but be careful to 
       * make sure that we don't merge in old info.  Since we weren't locking
***************
*** 2758,2764 ****
          cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique);
          code = cm_GetSCache(&newFid, &scp, userp, reqp);
          if (code == 0) {
!             lock_ObtainMutex(&scp->mx);
  	    scp->creator = userp;		/* remember who created it */
              if (!cm_HaveCallback(scp)) {
                  cm_MergeStatus(dscp, scp, &newFileStatus, &volSync,
--- 2750,2756 ----
          cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique);
          code = cm_GetSCache(&newFid, &scp, userp, reqp);
          if (code == 0) {
!             lock_ObtainWrite(&scp->rw);
  	    scp->creator = userp;		/* remember who created it */
              if (!cm_HaveCallback(scp)) {
                  cm_MergeStatus(dscp, scp, &newFileStatus, &volSync,
***************
*** 2767,2773 ****
                                              &newFileCallback, 0);
                  didEnd = 1;     
              }       
!             lock_ReleaseMutex(&scp->mx);
              *scpp = scp;
          }
      }
--- 2759,2765 ----
                                              &newFileCallback, 0);
                  didEnd = 1;     
              }       
!             lock_ReleaseWrite(&scp->rw);
              *scpp = scp;
          }
      }
***************
*** 2793,2799 ****
  
      code = buf_CleanVnode(scp, userp, reqp);
      if (code == 0) {
!         lock_ObtainMutex(&scp->mx);
  
          if (scp->mask & (CM_SCACHEMASK_TRUNCPOS
                            | CM_SCACHEMASK_CLIENTMODTIME
--- 2785,2791 ----
  
      code = buf_CleanVnode(scp, userp, reqp);
      if (code == 0) {
!         lock_ObtainWrite(&scp->rw);
  
          if (scp->mask & (CM_SCACHEMASK_TRUNCPOS
                            | CM_SCACHEMASK_CLIENTMODTIME
***************
*** 2805,2811 ****
  	    scp->flags &= ~(CM_SCACHEFLAG_OVERQUOTA | CM_SCACHEFLAG_OUTOFSPACE);
  	}
  
!         lock_ReleaseMutex(&scp->mx);
      }
      return code;
  }
--- 2797,2803 ----
  	    scp->flags &= ~(CM_SCACHEFLAG_OVERQUOTA | CM_SCACHEFLAG_OUTOFSPACE);
  	}
  
!         lock_ReleaseWrite(&scp->rw);
      }
      return code;
  }
***************
*** 2851,2859 ****
       * our call completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainMutex(&dscp->mx);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseMutex(&dscp->mx);
      if (code == 0) {
          cm_StartCallbackGrantingCall(NULL, &cbReq);
      } else {
--- 2843,2851 ----
       * our call completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainWrite(&dscp->rw);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseWrite(&dscp->rw);
      if (code == 0) {
          cm_StartCallbackGrantingCall(NULL, &cbReq);
      } else {
***************
*** 2897,2908 ****
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&dscp->mx);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseMutex(&dscp->mx);
  
      /* now try to create the new dir's entry, too, but be careful to 
       * make sure that we don't merge in old info.  Since we weren't locking
--- 2889,2900 ----
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&dscp->rw);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseWrite(&dscp->rw);
  
      /* now try to create the new dir's entry, too, but be careful to 
       * make sure that we don't merge in old info.  Since we weren't locking
***************
*** 2913,2919 ****
          cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique);
          code = cm_GetSCache(&newFid, &scp, userp, reqp);
          if (code == 0) {
!             lock_ObtainMutex(&scp->mx);
              if (!cm_HaveCallback(scp)) {
                  cm_MergeStatus(dscp, scp, &newDirStatus, &volSync,
                                  userp, 0);
--- 2905,2911 ----
          cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique);
          code = cm_GetSCache(&newFid, &scp, userp, reqp);
          if (code == 0) {
!             lock_ObtainWrite(&scp->rw);
              if (!cm_HaveCallback(scp)) {
                  cm_MergeStatus(dscp, scp, &newDirStatus, &volSync,
                                  userp, 0);
***************
*** 2921,2927 ****
                                              &newDirCallback, 0);
                  didEnd = 1;             
              }
!             lock_ReleaseMutex(&scp->mx);
              cm_ReleaseSCache(scp);
          }
      }
--- 2913,2919 ----
                                              &newDirCallback, 0);
                  didEnd = 1;             
              }
!             lock_ReleaseWrite(&scp->rw);
              cm_ReleaseSCache(scp);
          }
      }
***************
*** 2961,2969 ****
      }
  
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainMutex(&dscp->mx);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseMutex(&dscp->mx);
      if (code != 0)
          cm_EndDirOp(&dirop);
  
--- 2953,2961 ----
      }
  
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainWrite(&dscp->rw);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseWrite(&dscp->rw);
      if (code != 0)
          cm_EndDirOp(&dirop);
  
***************
*** 3004,3015 ****
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&dscp->mx);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseMutex(&dscp->mx);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&dirop)) {
--- 2996,3007 ----
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&dscp->rw);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseWrite(&dscp->rw);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&dirop)) {
***************
*** 3045,3053 ****
       * call completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainMutex(&dscp->mx);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseMutex(&dscp->mx);
      if (code != 0)
          cm_EndDirOp(&dirop);
      if (code) {
--- 3037,3045 ----
       * call completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainWrite(&dscp->rw);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseWrite(&dscp->rw);
      if (code != 0)
          cm_EndDirOp(&dirop);
      if (code) {
***************
*** 3086,3097 ****
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&dscp->mx);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseMutex(&dscp->mx);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&dirop)) {
--- 3078,3089 ----
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&dscp->rw);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseWrite(&dscp->rw);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&dirop)) {
***************
*** 3114,3125 ****
          cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique);
          code = cm_GetSCache(&newFid, &scp, userp, reqp);
          if (code == 0) {
!             lock_ObtainMutex(&scp->mx);
              if (!cm_HaveCallback(scp)) {
                  cm_MergeStatus(dscp, scp, &newLinkStatus, &volSync,
                                  userp, 0);
              }       
!             lock_ReleaseMutex(&scp->mx);
              cm_ReleaseSCache(scp);
          }
      }
--- 3106,3117 ----
          cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique);
          code = cm_GetSCache(&newFid, &scp, userp, reqp);
          if (code == 0) {
!             lock_ObtainWrite(&scp->rw);
              if (!cm_HaveCallback(scp)) {
                  cm_MergeStatus(dscp, scp, &newLinkStatus, &volSync,
                                  userp, 0);
              }       
!             lock_ReleaseWrite(&scp->rw);
              cm_ReleaseSCache(scp);
          }
      }
***************
*** 3145,3153 ****
       * call completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainMutex(&dscp->mx);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseMutex(&dscp->mx);
      if (code) {
          cm_EndDirOp(&dirop);
          return code;
--- 3137,3145 ----
       * call completes.
       */
      cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop);
!     lock_ObtainWrite(&dscp->rw);
      code = cm_SyncOp(dscp, NULL, userp, reqp, 0, CM_SCACHESYNC_STOREDATA);
!     lock_ReleaseWrite(&dscp->rw);
      if (code) {
          cm_EndDirOp(&dirop);
          return code;
***************
*** 3183,3195 ****
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&dscp->mx);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_dnlcRemove(dscp, namep); 
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseMutex(&dscp->mx);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&dirop)) {
--- 3175,3187 ----
          lock_ObtainWrite(&dirop.scp->dirlock);
          dirop.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&dscp->rw);
      cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
      if (code == 0) {
          cm_dnlcRemove(dscp, namep); 
          cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, CM_MERGEFLAG_DIROP);
      }
!     lock_ReleaseWrite(&dscp->rw);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&dirop)) {
***************
*** 3208,3214 ****
  long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp)
  {
      /* grab mutex on contents */
!     lock_ObtainMutex(&scp->mx);
  
      /* reset the prefetch info */
      scp->prefetch.base.LowPart = 0;		/* base */
--- 3200,3206 ----
  long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp)
  {
      /* grab mutex on contents */
!     lock_ObtainWrite(&scp->rw);
  
      /* reset the prefetch info */
      scp->prefetch.base.LowPart = 0;		/* base */
***************
*** 3217,3223 ****
      scp->prefetch.end.HighPart = 0;
  
      /* release mutex on contents */
!     lock_ReleaseMutex(&scp->mx);
  
      /* we're done */
      return 0;
--- 3209,3215 ----
      scp->prefetch.end.HighPart = 0;
  
      /* release mutex on contents */
!     lock_ReleaseWrite(&scp->rw);
  
      /* we're done */
      return 0;
***************
*** 3253,3264 ****
  
          oneDir = 1;
          cm_BeginDirOp(oldDscp, userp, reqp, CM_DIRLOCK_NONE, &oldDirOp);
!         lock_ObtainMutex(&oldDscp->mx);
          cm_dnlcRemove(oldDscp, oldNamep);
          cm_dnlcRemove(oldDscp, newNamep);
          code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0,
                            CM_SCACHESYNC_STOREDATA);
!         lock_ReleaseMutex(&oldDscp->mx);
          if (code != 0) {
              cm_EndDirOp(&oldDirOp);
          }
--- 3245,3256 ----
  
          oneDir = 1;
          cm_BeginDirOp(oldDscp, userp, reqp, CM_DIRLOCK_NONE, &oldDirOp);
!         lock_ObtainWrite(&oldDscp->rw);
          cm_dnlcRemove(oldDscp, oldNamep);
          cm_dnlcRemove(oldDscp, newNamep);
          code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0,
                            CM_SCACHESYNC_STOREDATA);
!         lock_ReleaseWrite(&oldDscp->rw);
          if (code != 0) {
              cm_EndDirOp(&oldDirOp);
          }
***************
*** 3279,3306 ****
  
          if (oldDscp->fid.vnode < newDscp->fid.vnode) {
              cm_BeginDirOp(oldDscp, userp, reqp, CM_DIRLOCK_NONE, &oldDirOp);
!             lock_ObtainMutex(&oldDscp->mx);
              cm_dnlcRemove(oldDscp, oldNamep);
              code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0,
                                CM_SCACHESYNC_STOREDATA);
!             lock_ReleaseMutex(&oldDscp->mx);
              if (code != 0)
                  cm_EndDirOp(&oldDirOp);
              if (code == 0) {
                  cm_BeginDirOp(newDscp, userp, reqp, CM_DIRLOCK_NONE, &newDirOp);
!                 lock_ObtainMutex(&newDscp->mx);
                  cm_dnlcRemove(newDscp, newNamep);
                  code = cm_SyncOp(newDscp, NULL, userp, reqp, 0,
                                    CM_SCACHESYNC_STOREDATA);
!                 lock_ReleaseMutex(&newDscp->mx);
                  if (code) {
                      cm_EndDirOp(&newDirOp);
  
                      /* cleanup first one */
!                     lock_ObtainMutex(&oldDscp->mx);
                      cm_SyncOpDone(oldDscp, NULL,
                                     CM_SCACHESYNC_STOREDATA);
!                     lock_ReleaseMutex(&oldDscp->mx);
                      cm_EndDirOp(&oldDirOp);
                  }       
              }
--- 3271,3298 ----
  
          if (oldDscp->fid.vnode < newDscp->fid.vnode) {
              cm_BeginDirOp(oldDscp, userp, reqp, CM_DIRLOCK_NONE, &oldDirOp);
!             lock_ObtainWrite(&oldDscp->rw);
              cm_dnlcRemove(oldDscp, oldNamep);
              code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0,
                                CM_SCACHESYNC_STOREDATA);
!             lock_ReleaseWrite(&oldDscp->rw);
              if (code != 0)
                  cm_EndDirOp(&oldDirOp);
              if (code == 0) {
                  cm_BeginDirOp(newDscp, userp, reqp, CM_DIRLOCK_NONE, &newDirOp);
!                 lock_ObtainWrite(&newDscp->rw);
                  cm_dnlcRemove(newDscp, newNamep);
                  code = cm_SyncOp(newDscp, NULL, userp, reqp, 0,
                                    CM_SCACHESYNC_STOREDATA);
!                 lock_ReleaseWrite(&newDscp->rw);
                  if (code) {
                      cm_EndDirOp(&newDirOp);
  
                      /* cleanup first one */
!                     lock_ObtainWrite(&oldDscp->rw);
                      cm_SyncOpDone(oldDscp, NULL,
                                     CM_SCACHESYNC_STOREDATA);
!                     lock_ReleaseWrite(&oldDscp->rw);
                      cm_EndDirOp(&oldDirOp);
                  }       
              }
***************
*** 3308,3335 ****
          else {
              /* lock the new vnode entry first */
              cm_BeginDirOp(newDscp, userp, reqp, CM_DIRLOCK_NONE, &newDirOp);
!             lock_ObtainMutex(&newDscp->mx);
              cm_dnlcRemove(newDscp, newNamep);
              code = cm_SyncOp(newDscp, NULL, userp, reqp, 0,
                                CM_SCACHESYNC_STOREDATA);
!             lock_ReleaseMutex(&newDscp->mx);
              if (code != 0)
                  cm_EndDirOp(&newDirOp);
              if (code == 0) {
                  cm_BeginDirOp(oldDscp, userp, reqp, CM_DIRLOCK_NONE, &oldDirOp);
!                 lock_ObtainMutex(&oldDscp->mx);
                  cm_dnlcRemove(oldDscp, oldNamep);
                  code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0,
                                    CM_SCACHESYNC_STOREDATA);
!                 lock_ReleaseMutex(&oldDscp->mx);
                  if (code != 0)
                      cm_EndDirOp(&oldDirOp);
                  if (code) {
                      /* cleanup first one */
!                     lock_ObtainMutex(&newDscp->mx);
                      cm_SyncOpDone(newDscp, NULL,
                                     CM_SCACHESYNC_STOREDATA);
!                     lock_ReleaseMutex(&newDscp->mx);
                      cm_EndDirOp(&newDirOp);
                  }       
              }
--- 3300,3327 ----
          else {
              /* lock the new vnode entry first */
              cm_BeginDirOp(newDscp, userp, reqp, CM_DIRLOCK_NONE, &newDirOp);
!             lock_ObtainWrite(&newDscp->rw);
              cm_dnlcRemove(newDscp, newNamep);
              code = cm_SyncOp(newDscp, NULL, userp, reqp, 0,
                                CM_SCACHESYNC_STOREDATA);
!             lock_ReleaseWrite(&newDscp->rw);
              if (code != 0)
                  cm_EndDirOp(&newDirOp);
              if (code == 0) {
                  cm_BeginDirOp(oldDscp, userp, reqp, CM_DIRLOCK_NONE, &oldDirOp);
!                 lock_ObtainWrite(&oldDscp->rw);
                  cm_dnlcRemove(oldDscp, oldNamep);
                  code = cm_SyncOp(oldDscp, NULL, userp, reqp, 0,
                                    CM_SCACHESYNC_STOREDATA);
!                 lock_ReleaseWrite(&oldDscp->rw);
                  if (code != 0)
                      cm_EndDirOp(&oldDirOp);
                  if (code) {
                      /* cleanup first one */
!                     lock_ObtainWrite(&newDscp->rw);
                      cm_SyncOpDone(newDscp, NULL,
                                     CM_SCACHESYNC_STOREDATA);
!                     lock_ReleaseWrite(&newDscp->rw);
                      cm_EndDirOp(&newDirOp);
                  }       
              }
***************
*** 3377,3389 ****
          lock_ObtainWrite(&oldDirOp.scp->dirlock);
          oldDirOp.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainMutex(&oldDscp->mx);
      cm_SyncOpDone(oldDscp, NULL, CM_SCACHESYNC_STOREDATA);
  
      if (code == 0)
          cm_MergeStatus(NULL, oldDscp, &updatedOldDirStatus, &volSync,
                          userp, CM_MERGEFLAG_DIROP);
!     lock_ReleaseMutex(&oldDscp->mx);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&oldDirOp)) {
--- 3369,3381 ----
          lock_ObtainWrite(&oldDirOp.scp->dirlock);
          oldDirOp.lockType = CM_DIRLOCK_WRITE;
      }
!     lock_ObtainWrite(&oldDscp->rw);
      cm_SyncOpDone(oldDscp, NULL, CM_SCACHESYNC_STOREDATA);
  
      if (code == 0)
          cm_MergeStatus(NULL, oldDscp, &updatedOldDirStatus, &volSync,
                          userp, CM_MERGEFLAG_DIROP);
!     lock_ReleaseWrite(&oldDscp->rw);
  
      if (code == 0) {
          if (cm_CheckDirOpForSingleChange(&oldDirOp)) {
***************
*** 3421,3432 ****
              lock_ObtainWrite(&newDirOp.scp->dirlock);
              newDirOp.lockType = CM_DIRLOCK_WRITE;
          }
!         lock_ObtainMutex(&newDscp->mx);
          cm_SyncOpDone(newDscp, NULL, CM_SCACHESYNC_STOREDATA);
          if (code == 0)
              cm_MergeStatus(NULL, newDscp, &updatedNewDirStatus, &volSync,
                              userp, CM_MERGEFLAG_DIROP);
!         lock_ReleaseMutex(&newDscp->mx);
  
          if (code == 0) {
              /* we only make the local change if we successfully made
--- 3413,3424 ----
              lock_ObtainWrite(&newDirOp.scp->dirlock);
              newDirOp.lockType = CM_DIRLOCK_WRITE;
          }
!         lock_ObtainWrite(&newDscp->rw);
          cm_SyncOpDone(newDscp, NULL, CM_SCACHESYNC_STOREDATA);
          if (code == 0)
              cm_MergeStatus(NULL, newDscp, &updatedNewDirStatus, &volSync,
                              userp, CM_MERGEFLAG_DIROP);
!         lock_ReleaseWrite(&newDscp->rw);
  
          if (code == 0) {
              /* we only make the local change if we successfully made
***************
*** 3776,3782 ****
      }
  }
  
! /* Called with scp->mx held.  Returns 0 if all is clear to read the
     specified range by the client identified by key.
   */
  long cm_LockCheckRead(cm_scache_t *scp, 
--- 3768,3774 ----
      }
  }
  
! /* Called with scp->rw held.  Returns 0 if all is clear to read the
     specified range by the client identified by key.
   */
  long cm_LockCheckRead(cm_scache_t *scp, 
***************
*** 3860,3866 ****
  #endif
  }
  
! /* Called with scp->mx held.  Returns 0 if all is clear to write the
     specified range by the client identified by key.
   */
  long cm_LockCheckWrite(cm_scache_t *scp,
--- 3852,3858 ----
  #endif
  }
  
! /* Called with scp->rw held.  Returns 0 if all is clear to write the
     specified range by the client identified by key.
   */
  long cm_LockCheckWrite(cm_scache_t *scp,
***************
*** 3955,3961 ****
      osi_QAdd(&cm_freeFileLocks, &l->q);
  }
  
! /* called with scp->mx held.  May release it during processing, but
     leaves it held on exit. */
  long cm_IntSetLock(cm_scache_t * scp, cm_user_t * userp, int lockType,
                     cm_req_t * reqp) {
--- 3947,3953 ----
      osi_QAdd(&cm_freeFileLocks, &l->q);
  }
  
! /* called with scp->rw held.  May release it during processing, but
     leaves it held on exit. */
  long cm_IntSetLock(cm_scache_t * scp, cm_user_t * userp, int lockType,
                     cm_req_t * reqp) {
***************
*** 3965,3970 ****
--- 3957,3963 ----
      cm_conn_t * connp;
      struct rx_connection * callp;
      AFSVolSync volSync;
+     afs_uint32 reqflags = reqp->flags;
  
      tfid.Volume = scp->fid.volume;
      tfid.Vnode = scp->fid.vnode;
***************
*** 3973,3979 ****
  
      osi_Log2(afsd_logp, "CALL SetLock scp 0x%p for lock %d", scp, lockType);
  
!     lock_ReleaseMutex(&scp->mx);
  
      do {
          code = cm_ConnFromFID(&cfid, userp, reqp, &connp);
--- 3966,3973 ----
  
      osi_Log2(afsd_logp, "CALL SetLock scp 0x%p for lock %d", scp, lockType);
  
!     reqp->flags |= CM_REQ_NORETRY;
!     lock_ReleaseWrite(&scp->rw);
  
      do {
          code = cm_ConnFromFID(&cfid, userp, reqp, &connp);
***************
*** 3995,4006 ****
          osi_Log0(afsd_logp, "CALL SetLock SUCCESS");
      }
  
!     lock_ObtainMutex(&scp->mx);
! 
      return code;
  }
  
! /* called with scp->mx held.  Releases it during processing */
  long cm_IntReleaseLock(cm_scache_t * scp, cm_user_t * userp,
                         cm_req_t * reqp) {
      long code = 0;
--- 3989,4000 ----
          osi_Log0(afsd_logp, "CALL SetLock SUCCESS");
      }
  
!     lock_ObtainWrite(&scp->rw);
!     reqp->flags = reqflags;
      return code;
  }
  
! /* called with scp->rw held.  Releases it during processing */
  long cm_IntReleaseLock(cm_scache_t * scp, cm_user_t * userp,
                         cm_req_t * reqp) {
      long code = 0;
***************
*** 4015,4021 ****
      tfid.Unique = scp->fid.unique;
      cfid = scp->fid;
  
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log1(afsd_logp, "CALL ReleaseLock scp 0x%p", scp);
  
--- 4009,4015 ----
      tfid.Unique = scp->fid.unique;
      cfid = scp->fid;
  
!     lock_ReleaseWrite(&scp->rw);
  
      osi_Log1(afsd_logp, "CALL ReleaseLock scp 0x%p", scp);
  
***************
*** 4038,4049 ****
          osi_Log0(afsd_logp,
                   "CALL ReleaseLock SUCCESS");
          
!     lock_ObtainMutex(&scp->mx);
  
      return code;
  }
  
! /* called with scp->mx held.  May release it during processing, but
     will exit with lock held.
  
     This will return:
--- 4032,4043 ----
          osi_Log0(afsd_logp,
                   "CALL ReleaseLock SUCCESS");
          
!     lock_ObtainWrite(&scp->rw);
  
      return code;
  }
  
! /* called with scp->rw held.  May release it during processing, but
     will exit with lock held.
  
     This will return:
***************
*** 4129,4135 ****
      return code;
  }
  
! /* called with scp->mx held */
  long cm_Lock(cm_scache_t *scp, unsigned char sLockType,
               LARGE_INTEGER LOffset, LARGE_INTEGER LLength,
               cm_key_t key,
--- 4123,4129 ----
      return code;
  }
  
! /* called with scp->rw held */
  long cm_Lock(cm_scache_t *scp, unsigned char sLockType,
               LARGE_INTEGER LOffset, LARGE_INTEGER LLength,
               cm_key_t key,
***************
*** 4496,4502 ****
  
  static int cm_KeyEquals(cm_key_t k1, cm_key_t k2, int flags);
  
! /* Called with scp->mx held */
  long cm_UnlockByKey(cm_scache_t * scp,
  		    cm_key_t key,
  		    int flags,
--- 4490,4496 ----
  
  static int cm_KeyEquals(cm_key_t k1, cm_key_t k2, int flags);
  
! /* Called with scp->rw held */
  long cm_UnlockByKey(cm_scache_t * scp,
  		    cm_key_t key,
  		    int flags,
***************
*** 4740,4749 ****
          return CM_ERROR_RANGE_NOT_LOCKED;
      }
  
-     lock_ReleaseRead(&cm_scacheLock);
- 
      /* discard lock record */
!     lock_ObtainWrite(&cm_scacheLock);
      if (scp->fileLocksT == q)
          scp->fileLocksT = osi_QPrev(q);
      osi_QRemoveHT(&scp->fileLocksH, &scp->fileLocksT, q);
--- 4734,4741 ----
          return CM_ERROR_RANGE_NOT_LOCKED;
      }
  
      /* discard lock record */
!     lock_ConvertRToW(&cm_scacheLock);
      if (scp->fileLocksT == q)
          scp->fileLocksT = osi_QPrev(q);
      osi_QRemoveHT(&scp->fileLocksH, &scp->fileLocksT, q);
***************
*** 4877,4883 ****
      return code;
  }
  
! /* called with scp->mx held */
  void cm_LockMarkSCacheLost(cm_scache_t * scp)
  {
      cm_file_lock_t *fileLock;
--- 4869,4875 ----
      return code;
  }
  
! /* called with scp->rw held */
  void cm_LockMarkSCacheLost(cm_scache_t * scp)
  {
      cm_file_lock_t *fileLock;
***************
*** 4980,4986 ****
                  osi_Log1(afsd_logp, "cm_CheckLocks Updating scp 0x%x", scp);
  
                  lock_ReleaseWrite(&cm_scacheLock);
!                 lock_ObtainMutex(&scp->mx);
  
                  /* did the lock change while we weren't holding the lock? */
                  if (!IS_LOCK_ACTIVE(fileLock))
--- 4972,4978 ----
                  osi_Log1(afsd_logp, "cm_CheckLocks Updating scp 0x%x", scp);
  
                  lock_ReleaseWrite(&cm_scacheLock);
!                 lock_ObtainWrite(&scp->rw);
  
                  /* did the lock change while we weren't holding the lock? */
                  if (!IS_LOCK_ACTIVE(fileLock))
***************
*** 4997,5003 ****
                      goto post_syncopdone;
                  }
  
!                 /* cm_SyncOp releases scp->mx during which the lock
                     may get released. */
                  if (!IS_LOCK_ACTIVE(fileLock))
                      goto pre_syncopdone;
--- 4989,4995 ----
                      goto post_syncopdone;
                  }
  
!                 /* cm_SyncOp releases scp->rw during which the lock
                     may get released. */
                  if (!IS_LOCK_ACTIVE(fileLock))
                      goto pre_syncopdone;
***************
*** 5017,5023 ****
                               scp,
                               (int) scp->serverLock);
  
!                     lock_ReleaseMutex(&scp->mx);
  
                      do {
                          code = cm_ConnFromFID(&cfid, userp,
--- 5009,5015 ----
                               scp,
                               (int) scp->serverLock);
  
!                     lock_ReleaseWrite(&scp->rw);
  
                      do {
                          code = cm_ConnFromFID(&cfid, userp,
***************
*** 5038,5044 ****
  
                      code = cm_MapRPCError(code, &req);
  
!                     lock_ObtainMutex(&scp->mx);
  
                      if (code) {
                          osi_Log1(afsd_logp, "CALL ExtendLock FAILURE, code 0x%x", code);
--- 5030,5036 ----
  
                      code = cm_MapRPCError(code, &req);
  
!                     lock_ObtainWrite(&scp->rw);
  
                      if (code) {
                          osi_Log1(afsd_logp, "CALL ExtendLock FAILURE, code 0x%x", code);
***************
*** 5098,5104 ****
                  cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK);
  
              post_syncopdone:
!                 lock_ReleaseMutex(&scp->mx);
  
                  lock_ObtainWrite(&cm_scacheLock);
  
--- 5090,5096 ----
                  cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK);
  
              post_syncopdone:
!                 lock_ReleaseWrite(&scp->rw);
  
                  lock_ObtainWrite(&cm_scacheLock);
  
***************
*** 5125,5131 ****
      osi_Log1(afsd_logp, "cm_CheckLocks completes lock check cycle %d", cm_lockRefreshCycle);
  }
  
! /* NOT called with scp->mx held. */
  long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead)
  {
      long code = 0;
--- 5117,5123 ----
      osi_Log1(afsd_logp, "cm_CheckLocks completes lock check cycle %d", cm_lockRefreshCycle);
  }
  
! /* NOT called with scp->rw held. */
  long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead)
  {
      long code = 0;
***************
*** 5178,5184 ****
      osi_assertx(scp != NULL, "null cm_scache_t");
  
      lock_ReleaseRead(&cm_scacheLock);
!     lock_ObtainMutex(&scp->mx);
  
      code = cm_LockCheckPerms(scp, oldFileLock->lockType,
                               oldFileLock->userp,
--- 5170,5176 ----
      osi_assertx(scp != NULL, "null cm_scache_t");
  
      lock_ReleaseRead(&cm_scacheLock);
!     lock_ObtainWrite(&scp->rw);
  
      code = cm_LockCheckPerms(scp, oldFileLock->lockType,
                               oldFileLock->userp,
***************
*** 5190,5196 ****
          }
          code = 0;
      } else if (code) {
!         lock_ReleaseMutex(&scp->mx);
          return code;
      }
  
--- 5182,5188 ----
          }
          code = 0;
      } else if (code) {
!         lock_ReleaseWrite(&scp->rw);
          return code;
      }
  
***************
*** 5213,5219 ****
          }
  
          lock_ReleaseWrite(&cm_scacheLock);
!         lock_ReleaseMutex(&scp->mx);
  
          return 0;
      }
--- 5205,5211 ----
          }
  
          lock_ReleaseWrite(&cm_scacheLock);
!         lock_ReleaseWrite(&scp->rw);
  
          return 0;
      }
***************
*** 5257,5263 ****
  
      if (code != 0) {
          lock_ReleaseWrite(&cm_scacheLock);
!         lock_ReleaseMutex(&scp->mx);
  
          goto handleCode;
      }
--- 5249,5255 ----
  
      if (code != 0) {
          lock_ReleaseWrite(&cm_scacheLock);
!         lock_ReleaseWrite(&scp->rw);
  
          goto handleCode;
      }
***************
*** 5306,5312 ****
          }
  
          lock_ReleaseWrite(&cm_scacheLock);
!         lock_ReleaseMutex(&scp->mx);
  
          return 0;
  
--- 5298,5304 ----
          }
  
          lock_ReleaseWrite(&cm_scacheLock);
!         lock_ReleaseWrite(&scp->rw);
  
          return 0;
  
***************
*** 5409,5415 ****
          osi_QRemoveHT(&scp->fileLocksH, &scp->fileLocksT, &oldFileLock->fileq);
  	lock_ReleaseWrite(&cm_scacheLock);
      }
!     lock_ReleaseMutex(&scp->mx);
  
    updateLock:
      lock_ObtainWrite(&cm_scacheLock);
--- 5401,5407 ----
          osi_QRemoveHT(&scp->fileLocksH, &scp->fileLocksT, &oldFileLock->fileq);
  	lock_ReleaseWrite(&cm_scacheLock);
      }
!     lock_ReleaseWrite(&scp->rw);
  
    updateLock:
      lock_ObtainWrite(&cm_scacheLock);
***************
*** 5465,5475 ****
      {
  	for ( scp = cm_data.scacheHashTablep[i]; scp; scp = scp->nextp ) {
  	    while (scp->fileLocksH != NULL) {
! 		lock_ObtainMutex(&scp->mx);
  		lock_ObtainWrite(&cm_scacheLock);
  		if (!scp->fileLocksH) {
  		    lock_ReleaseWrite(&cm_scacheLock);
! 		    lock_ReleaseMutex(&scp->mx);
  		    break;
  		}
  		fileLock = (cm_file_lock_t *)((char *) scp->fileLocksH - offsetof(cm_file_lock_t, fileq));
--- 5457,5467 ----
      {
  	for ( scp = cm_data.scacheHashTablep[i]; scp; scp = scp->nextp ) {
  	    while (scp->fileLocksH != NULL) {
! 		lock_ObtainWrite(&scp->rw);
  		lock_ObtainWrite(&cm_scacheLock);
  		if (!scp->fileLocksH) {
  		    lock_ReleaseWrite(&cm_scacheLock);
! 		    lock_ReleaseWrite(&scp->rw);
  		    break;
  		}
  		fileLock = (cm_file_lock_t *)((char *) scp->fileLocksH - offsetof(cm_file_lock_t, fileq));
***************
*** 5481,5487 ****
  		cm_UnlockByKey(scp, key, 0, userp, &req);
  		cm_ReleaseSCache(scp);
  		cm_ReleaseUser(userp);
! 		lock_ReleaseMutex(&scp->mx);
  	    }
  	}
      }
--- 5473,5479 ----
  		cm_UnlockByKey(scp, key, 0, userp, &req);
  		cm_ReleaseSCache(scp);
  		cm_ReleaseUser(userp);
! 		lock_ReleaseWrite(&scp->rw);
  	    }
  	}
      }
Index: openafs/src/WINNT/afsd/cm_vnodeops.h
diff -c openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.8 openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.9
*** openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.8	Sun Feb 17 00:59:30 2008
--- openafs/src/WINNT/afsd/cm_vnodeops.h	Sun Mar  9 11:25:01 2008
***************
*** 170,175 ****
--- 170,176 ----
  #define AFS_ACCESS_READ (FILE_GENERIC_READ & ~SYNCHRONIZE)
  #define AFS_ACCESS_WRITE ((FILE_GENERIC_WRITE & ~(READ_CONTROL | SYNCHRONIZE)) \
  				& ~FILE_WRITE_ATTRIBUTES)
+ #define AFS_ACCESS_EXECUTE (FILE_GENERIC_EXECUTE & ~SYNCHRONIZE)
  
  typedef struct cm_lock_data {
      cm_key_t key;
Index: openafs/src/WINNT/afsd/cm_volstat.c
diff -c openafs/src/WINNT/afsd/cm_volstat.c:1.1.2.4 openafs/src/WINNT/afsd/cm_volstat.c:1.1.2.6
*** openafs/src/WINNT/afsd/cm_volstat.c:1.1.2.4	Sat Dec 22 23:52:58 2007
--- openafs/src/WINNT/afsd/cm_volstat.c	Thu Mar 13 00:39:17 2008
***************
*** 298,303 ****
--- 298,304 ----
      afs_uint32  code = 0;
      cm_req_t    req;
      cm_scache_t *scp;
+     cm_volume_t *volp;
  
      if (cellID == NULL || volID == NULL)
          return CM_ERROR_INVAL;
***************
*** 311,321 ****
      if (code)
          goto done;
  
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL,cm_rootUserp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          goto done;
      }
--- 312,322 ----
      if (code)
          goto done;
  
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL,cm_rootUserp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          goto done;
      }
***************
*** 324,332 ****
  
      *cellID = scp->fid.cell;
      *volID  = scp->fid.volume;
!     *pstatus = cm_GetVolumeStatus(scp->volp, scp->fid.volume);
  
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
  
    done:
--- 325,338 ----
  
      *cellID = scp->fid.cell;
      *volID  = scp->fid.volume;
!     volp = cm_GetVolumeByFID(&scp->fid);
!     if (volp) {
!         *pstatus = cm_GetVolumeStatus(volp, scp->fid.volume);
!         cm_PutVolume(volp);
!     } else
!         *pstatus = vl_unknown;
  
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
  
    done:
***************
*** 355,365 ****
      if (code)
          goto done;
  
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, cm_rootUserp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          goto done;
      }
--- 361,371 ----
      if (code)
          goto done;
  
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, cm_rootUserp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          goto done;
      }
***************
*** 382,388 ****
          goto done;
      }
  
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
  
    done:
--- 388,394 ----
          goto done;
      }
  
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
  
    done:
Index: openafs/src/WINNT/afsd/cm_volume.c
diff -c openafs/src/WINNT/afsd/cm_volume.c:1.14.4.31 openafs/src/WINNT/afsd/cm_volume.c:1.14.4.36
*** openafs/src/WINNT/afsd/cm_volume.c:1.14.4.31	Mon Feb 25 14:40:13 2008
--- openafs/src/WINNT/afsd/cm_volume.c	Wed Mar 19 16:18:37 2008
***************
*** 528,533 ****
--- 528,559 ----
          rwNewstate = rwServers_alldown ? vl_alldown : vl_online;
          roNewstate = roServers_alldown ? vl_alldown : vl_online;
          bkNewstate = bkServers_alldown ? vl_alldown : vl_online;
+     } else if (code == CM_ERROR_NOSUCHVOLUME || code == VL_NOENT) {
+         /* this volume does not exist - we should discard it */
+         if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
+             cm_RemoveVolumeFromNameHashTable(volp);
+         if (volp->rw.flags & CM_VOLUMEFLAG_IN_HASH)
+             cm_RemoveVolumeFromIDHashTable(volp, RWVOL);
+         if (volp->ro.flags & CM_VOLUMEFLAG_IN_HASH)
+             cm_RemoveVolumeFromIDHashTable(volp, ROVOL);
+         if (volp->bk.flags & CM_VOLUMEFLAG_IN_HASH)
+             cm_RemoveVolumeFromIDHashTable(volp, BACKVOL);
+ 
+         /* Move to the end so it will be recycled first */
+         cm_MoveVolumeToLRULast(volp);
+ 
+         if (volp->rw.ID)
+             cm_VolumeStatusNotification(volp, volp->rw.ID, volp->rw.state, vl_alldown);
+         if (volp->ro.ID)
+             cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown);
+         if (volp->bk.ID)
+             cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown);
+ 
+         volp->rw.ID = volp->ro.ID = volp->bk.ID = 0;
+         cm_SetFid(&volp->rw.dotdotFid, 0, 0, 0, 0);
+         cm_SetFid(&volp->ro.dotdotFid, 0, 0, 0, 0);
+         cm_SetFid(&volp->bk.dotdotFid, 0, 0, 0, 0);
+         volp->namep[0] ='\0';
      } else {
          rwNewstate = roNewstate = bkNewstate = vl_alldown;
      }
***************
*** 551,567 ****
      return code;
  }
  
  void cm_GetVolume(cm_volume_t *volp)
  {
!     if (volp) {
! 	lock_ObtainWrite(&cm_volumeLock);
! 	volp->refCount++;
! 	lock_ReleaseWrite(&cm_volumeLock);
!     }
  }
  
  
! long cm_GetVolumeByID(cm_cell_t *cellp, afs_uint32 volumeID, cm_user_t *userp,
                        cm_req_t *reqp, afs_uint32 flags, cm_volume_t **outVolpp)
  {
      cm_volume_t *volp;
--- 577,627 ----
      return code;
  }
  
+ /* Requires read or write lock on cm_volumeLock */
  void cm_GetVolume(cm_volume_t *volp)
  {
!     InterlockedIncrement(&volp->refCount);
  }
  
+ cm_volume_t *cm_GetVolumeByFID(cm_fid_t *fidp)
+ {
+     cm_volume_t *volp;
+     afs_uint32 hash;
  
!     lock_ObtainRead(&cm_volumeLock);
!     hash = CM_VOLUME_ID_HASH(fidp->volume);
!     /* The volumeID can be any one of the three types.  So we must
!      * search the hash table for all three types until we find it.
!      * We will search in the order of RO, RW, BK.
!      */
!     for ( volp = cm_data.volumeROIDHashTablep[hash]; volp; volp = volp->ro.nextp) {
!         if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->ro.ID )
!             break;
!     }
!     if (!volp) {
!         /* try RW volumes */
!         for ( volp = cm_data.volumeRWIDHashTablep[hash]; volp; volp = volp->rw.nextp) {
!             if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->rw.ID )
!                 break;
!         }
!     }
!     if (!volp) {
!         /* try BK volumes */
!         for ( volp = cm_data.volumeBKIDHashTablep[hash]; volp; volp = volp->bk.nextp) {
!             if ( fidp->cell == volp->cellp->cellID && fidp->volume == volp->bk.ID )
!                 break;
!         }
!     }
! 
!     /* hold the volume if we found it */
!     if (volp) 
!         cm_GetVolume(volp);
!         
!     lock_ReleaseRead(&cm_volumeLock);
!     return volp;
! }
! 
! long cm_FindVolumeByID(cm_cell_t *cellp, afs_uint32 volumeID, cm_user_t *userp,
                        cm_req_t *reqp, afs_uint32 flags, cm_volume_t **outVolpp)
  {
      cm_volume_t *volp;
***************
*** 613,624 ****
      osi_assertx(volp == volp2, "unexpected cm_vol_t");
  #endif
  
-     lock_ReleaseRead(&cm_volumeLock);
- 
      /* hold the volume if we found it */
      if (volp) 
          cm_GetVolume(volp);
          
      /* return it held */
      if (volp) {
          lock_ObtainMutex(&volp->mx);
--- 673,684 ----
      osi_assertx(volp == volp2, "unexpected cm_vol_t");
  #endif
  
      /* hold the volume if we found it */
      if (volp) 
          cm_GetVolume(volp);
          
+     lock_ReleaseRead(&cm_volumeLock);
+ 
      /* return it held */
      if (volp) {
          lock_ObtainMutex(&volp->mx);
***************
*** 646,658 ****
          
      /* otherwise, we didn't find it so consult the VLDB */
      sprintf(volNameString, "%u", volumeID);
!     code = cm_GetVolumeByName(cellp, volNameString, userp, reqp,
  			      flags, outVolpp);
      return code;
  }
  
  
! long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep,
  			struct cm_user *userp, struct cm_req *reqp,
  			afs_uint32 flags, cm_volume_t **outVolpp)
  {
--- 706,718 ----
          
      /* otherwise, we didn't find it so consult the VLDB */
      sprintf(volNameString, "%u", volumeID);
!     code = cm_FindVolumeByName(cellp, volNameString, userp, reqp,
  			      flags, outVolpp);
      return code;
  }
  
  
! long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep,
  			struct cm_user *userp, struct cm_req *reqp,
  			afs_uint32 flags, cm_volume_t **outVolpp)
  {
***************
*** 752,762 ****
                  cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_unknown);
  
              volp->rw.ID = volp->ro.ID = volp->bk.ID = 0;
! 	    volp->dotdotFid.cell = 0;
! 	    volp->dotdotFid.volume = 0;
! 	    volp->dotdotFid.unique = 0;
! 	    volp->dotdotFid.vnode = 0;
!             volp->dotdotFid.hash = 0;
  	} else {
  	    volp = &cm_data.volumeBaseAddress[cm_data.currentVolumes++];
  	    memset(volp, 0, sizeof(cm_volume_t));
--- 812,820 ----
                  cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_unknown);
  
              volp->rw.ID = volp->ro.ID = volp->bk.ID = 0;
!             cm_SetFid(&volp->rw.dotdotFid, 0, 0, 0, 0);
!             cm_SetFid(&volp->ro.dotdotFid, 0, 0, 0, 0);
!             cm_SetFid(&volp->bk.dotdotFid, 0, 0, 0, 0);
  	} else {
  	    volp = &cm_data.volumeBaseAddress[cm_data.currentVolumes++];
  	    memset(volp, 0, sizeof(cm_volume_t));
***************
*** 781,793 ****
          lock_ReleaseWrite(&cm_volumeLock);
      }
      else {
!         lock_ReleaseRead(&cm_volumeLock);
!         if (volp) {
              cm_GetVolume(volp);
!             lock_ObtainMutex(&volp->mx);
!         } else {
              return CM_ERROR_NOSUCHVOLUME;
!         }
      }
  
      /* if we get here we are holding the mutex */
--- 839,852 ----
          lock_ReleaseWrite(&cm_volumeLock);
      }
      else {
!         if (volp)
              cm_GetVolume(volp);
!         lock_ReleaseRead(&cm_volumeLock);
!         
!         if (!volp)
              return CM_ERROR_NOSUCHVOLUME;
! 
!         lock_ObtainMutex(&volp->mx);
      }
  
      /* if we get here we are holding the mutex */
***************
*** 803,817 ****
          code = CM_ERROR_NOSUCHVOLUME;
  
      if (code == 0) {
! 		*outVolpp = volp;
  		
! 		if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
! 	        lock_ObtainWrite(&cm_volumeLock);
! 			cm_AdjustVolumeLRU(volp);
! 			lock_ReleaseWrite(&cm_volumeLock);
! 		}
      } else
! 		cm_PutVolume(volp);
  
      return code;
  }	
--- 862,876 ----
          code = CM_ERROR_NOSUCHVOLUME;
  
      if (code == 0) {
!         *outVolpp = volp;
  		
!         if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
!             lock_ObtainWrite(&cm_volumeLock);
!             cm_AdjustVolumeLRU(volp);
!             lock_ReleaseWrite(&cm_volumeLock);
!         }
      } else
!         cm_PutVolume(volp);
  
      return code;
  }	
***************
*** 869,881 ****
  #ifdef SEARCH_ALL_VOLUMES
      osi_assertx(volp == volp2, "unexpected cm_vol_t");
  #endif
- 
-     lock_ReleaseRead(&cm_volumeLock);
- 
      /* hold the volume if we found it */
      if (volp) 
  	cm_GetVolume(volp);
  
      /* update it */
      cm_data.mountRootGen = time(NULL);
      lock_ObtainMutex(&volp->mx);
--- 928,939 ----
  #ifdef SEARCH_ALL_VOLUMES
      osi_assertx(volp == volp2, "unexpected cm_vol_t");
  #endif
      /* hold the volume if we found it */
      if (volp) 
  	cm_GetVolume(volp);
  
+     lock_ReleaseRead(&cm_volumeLock);
+ 
      /* update it */
      cm_data.mountRootGen = time(NULL);
      lock_ObtainMutex(&volp->mx);
***************
*** 927,935 ****
  
  void cm_PutVolume(cm_volume_t *volp)
  {
!     lock_ObtainWrite(&cm_volumeLock);
!     osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0");
!     lock_ReleaseWrite(&cm_volumeLock);
  }
  
  /* return the read-only volume, if there is one, or the read-write volume if
--- 985,992 ----
  
  void cm_PutVolume(cm_volume_t *volp)
  {
!     afs_int32 refCount = InterlockedDecrement(&volp->refCount);
!     osi_assertx(refCount >= 0, "cm_volume_t refCount underflow has occurred");
  }
  
  /* return the read-only volume, if there is one, or the read-write volume if
***************
*** 953,975 ****
  {
      cm_volume_t *volp;
      cm_scache_t *scp;
  
      cm_data.mountRootGen = time(NULL);
  
      /* force a re-loading of volume data from the vldb */
!     lock_ObtainWrite(&cm_volumeLock);
      for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! 	volp->refCount++;
! 	lock_ReleaseWrite(&cm_volumeLock);
  
  	lock_ObtainMutex(&volp->mx);
  	volp->flags |= CM_VOLUMEFLAG_RESET;
  	lock_ReleaseMutex(&volp->mx);
  	
!         lock_ObtainWrite(&cm_volumeLock);
! 	osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0");
      }
!     lock_ReleaseWrite(&cm_volumeLock);
  
      /* force mount points to be re-evaluated so that 
       * if the volume location has changed we will pick 
--- 1010,1034 ----
  {
      cm_volume_t *volp;
      cm_scache_t *scp;
+     afs_int32 refCount;
  
      cm_data.mountRootGen = time(NULL);
  
      /* force a re-loading of volume data from the vldb */
!     lock_ObtainRead(&cm_volumeLock);
      for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! 	InterlockedIncrement(&volp->refCount);
! 	lock_ReleaseRead(&cm_volumeLock);
  
  	lock_ObtainMutex(&volp->mx);
  	volp->flags |= CM_VOLUMEFLAG_RESET;
  	lock_ReleaseMutex(&volp->mx);
  	
!         lock_ObtainRead(&cm_volumeLock);
!         refCount = InterlockedDecrement(&volp->refCount);
! 	osi_assertx(refCount >= 0, "cm_volume_t refCount underflow");
      }
!     lock_ReleaseRead(&cm_volumeLock);
  
      /* force mount points to be re-evaluated so that 
       * if the volume location has changed we will pick 
***************
*** 983,991 ****
               && !(scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID)
  #endif
               ) {
!             lock_ObtainMutex(&scp->mx);
              scp->mountPointStringp[0] = '\0';
!             lock_ReleaseMutex(&scp->mx);
          }
      }
  
--- 1042,1050 ----
               && !(scp->fid.cell == AFS_FAKE_ROOT_CELL_ID && scp->fid.volume == AFS_FAKE_ROOT_VOL_ID)
  #endif
               ) {
!             lock_ObtainWrite(&scp->rw);
              scp->mountPointStringp[0] = '\0';
!             lock_ReleaseWrite(&scp->rw);
          }
      }
  
***************
*** 1142,1159 ****
  void cm_CheckOfflineVolumes(void)
  {
      cm_volume_t *volp;
  
!     lock_ObtainWrite(&cm_volumeLock);
      for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
! 	volp->refCount++;
! 	lock_ReleaseWrite(&cm_volumeLock);
! 
!         cm_CheckOfflineVolume(volp, 0);
! 
! 	lock_ObtainWrite(&cm_volumeLock);
! 	osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0");
      }
!     lock_ReleaseWrite(&cm_volumeLock);
  }
  
  
--- 1201,1220 ----
  void cm_CheckOfflineVolumes(void)
  {
      cm_volume_t *volp;
+     afs_int32 refCount;
  
!     lock_ObtainRead(&cm_volumeLock);
      for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
!         if (volp->flags & CM_VOLUMEFLAG_IN_HASH) {
!             InterlockedIncrement(&volp->refCount);
!             lock_ReleaseRead(&cm_volumeLock);
!             cm_CheckOfflineVolume(volp, 0);
!             lock_ObtainRead(&cm_volumeLock);
!             refCount = InterlockedDecrement(&volp->refCount);
!             osi_assertx(refCount >= 0, "cm_volume_t refCount underflow");
!         }
      }
!     lock_ReleaseRead(&cm_volumeLock);
  }
  
  
***************
*** 1243,1256 ****
  {	
      int 		code;
      cm_volume_t*	volp;
  
      /* find volumes which might have RO copy on server*/
!     lock_ObtainWrite(&cm_volumeLock);
      for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp)
      {
  	code = 1 ;	/* assume that list is unchanged */
! 	volp->refCount++;
! 	lock_ReleaseWrite(&cm_volumeLock);
  	lock_ObtainMutex(&volp->mx);
  
  	if ((tsp->cellp==volp->cellp) && (volp->ro.serversp))
--- 1304,1318 ----
  {	
      int 		code;
      cm_volume_t*	volp;
+     afs_int32 refCount;
  
      /* find volumes which might have RO copy on server*/
!     lock_ObtainRead(&cm_volumeLock);
      for(volp = cm_data.allVolumesp; volp; volp=volp->allNextp)
      {
  	code = 1 ;	/* assume that list is unchanged */
! 	InterlockedIncrement(&volp->refCount);
! 	lock_ReleaseRead(&cm_volumeLock);
  	lock_ObtainMutex(&volp->mx);
  
  	if ((tsp->cellp==volp->cellp) && (volp->ro.serversp))
***************
*** 1261,1270 ****
  	    cm_RandomizeServer(&volp->ro.serversp);
  
  	lock_ReleaseMutex(&volp->mx);
! 	lock_ObtainWrite(&cm_volumeLock);
! 	osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0");
      }
!     lock_ReleaseWrite(&cm_volumeLock);
  }	
  
  /* dump all volumes that have reference count > 0 to a file. 
--- 1323,1333 ----
  	    cm_RandomizeServer(&volp->ro.serversp);
  
  	lock_ReleaseMutex(&volp->mx);
! 	lock_ObtainRead(&cm_volumeLock);
!         refCount = InterlockedDecrement(&volp->refCount);
! 	osi_assertx(refCount >= 0, "cm_volume_t refCount underflow");
      }
!     lock_ReleaseRead(&cm_volumeLock);
  }	
  
  /* dump all volumes that have reference count > 0 to a file. 
***************
*** 1287,1305 ****
    
      for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp)
      {
!         cm_scache_t *scp;
!         int scprefs = 0;
! 
!         for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp) 
!         {
!             if (scp->volp == volp)
!                 scprefs++;
!         }   
! 
!         sprintf(output, "%s - volp=0x%p cell=%s name=%s rwID=%u roID=%u bkID=%u flags=0x%x fid (cell=%d, volume=%d, vnode=%d, unique=%d) refCount=%u scpRefs=%u\r\n", 
                   cookie, volp, volp->cellp->name, volp->namep, volp->rw.ID, volp->ro.ID, volp->bk.ID, volp->flags, 
!                  volp->dotdotFid.cell, volp->dotdotFid.volume, volp->dotdotFid.vnode, volp->dotdotFid.unique,
!                  volp->refCount, scprefs);
          WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
      }
      sprintf(output, "%s - Done dumping volumes.\r\n", cookie);
--- 1350,1358 ----
    
      for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp)
      {
!         sprintf(output, "%s - volp=0x%p cell=%s name=%s rwID=%u roID=%u bkID=%u flags=0x%x refCount=%u\r\n", 
                   cookie, volp, volp->cellp->name, volp->namep, volp->rw.ID, volp->ro.ID, volp->bk.ID, volp->flags, 
!                  volp->refCount);
          WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
      }
      sprintf(output, "%s - Done dumping volumes.\r\n", cookie);
***************
*** 1495,1500 ****
--- 1548,1569 ----
  }
  
  /* must be called with cm_volumeLock write-locked! */
+ void cm_MoveVolumeToLRULast(cm_volume_t *volp)
+ {
+     if (volp == cm_data.volumeLRULastp)
+         return;
+ 
+     if (volp == cm_data.volumeLRUFirstp)
+         cm_data.volumeLRUFirstp = (cm_volume_t *) osi_QNext(&volp->q);
+     if (volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE)
+         osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
+     osi_QAddT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q);
+     volp->flags |= CM_VOLUMEFLAG_IN_LRU_QUEUE;
+     if (!cm_data.volumeLRULastp) 
+         cm_data.volumeLRULastp = volp;
+ }
+ 
+ /* must be called with cm_volumeLock write-locked! */
  void cm_RemoveVolumeFromLRU(cm_volume_t *volp)
  {
      if (volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) {
***************
*** 1577,1585 ****
  
              lock_ReleaseRead(&cm_volumeLock);
              if (cm_GetSCache(&fid, &scp, cm_rootUserp, &req) == 0) {
!                 lock_ObtainMutex(&scp->mx);
                  cm_GetCallback(scp, cm_rootUserp, &req, 1);
!                 lock_ReleaseMutex(&scp->mx);
                  cm_ReleaseSCache(scp);
              }
              lock_ObtainRead(&cm_volumeLock);
--- 1646,1654 ----
  
              lock_ReleaseRead(&cm_volumeLock);
              if (cm_GetSCache(&fid, &scp, cm_rootUserp, &req) == 0) {
!                 lock_ObtainWrite(&scp->rw);
                  cm_GetCallback(scp, cm_rootUserp, &req, 1);
!                 lock_ReleaseWrite(&scp->rw);
                  cm_ReleaseSCache(scp);
              }
              lock_ObtainRead(&cm_volumeLock);
Index: openafs/src/WINNT/afsd/cm_volume.h
diff -c openafs/src/WINNT/afsd/cm_volume.h:1.5.6.8 openafs/src/WINNT/afsd/cm_volume.h:1.5.6.12
*** openafs/src/WINNT/afsd/cm_volume.h:1.5.6.8	Thu Jan 24 10:31:13 2008
--- openafs/src/WINNT/afsd/cm_volume.h	Wed Mar 19 16:18:37 2008
***************
*** 15,22 ****
  #define CM_VOLUME_MAGIC    ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
  
  typedef struct cm_vol_state {
-     afs_uint32      ID;                 /* by mx */
      struct cm_volume *nextp;            /* volumeIDHashTable; by cm_volumeLock */
      cm_serverRef_t *serversp;           /* by mx */
      enum volstatus  state;              /* by mx */
      afs_uint32      flags;              /* by mx */
--- 15,23 ----
  #define CM_VOLUME_MAGIC    ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
  
  typedef struct cm_vol_state {
      struct cm_volume *nextp;            /* volumeIDHashTable; by cm_volumeLock */
+     afs_uint32      ID;                 /* by mx */
+     struct cm_fid dotdotFid;	        /* parent of volume root */
      cm_serverRef_t *serversp;           /* by mx */
      enum volstatus  state;              /* by mx */
      afs_uint32      flags;              /* by mx */
***************
*** 33,42 ****
      struct cm_vol_state rw;	        /* by cm_volumeLock */
      struct cm_vol_state ro;		/* by cm_volumeLock */
      struct cm_vol_state bk;		/* by cm_volumeLock */
-     struct cm_fid dotdotFid;	        /* parent of volume root */
      osi_mutex_t mx;
      afs_uint32 flags;			/* by mx */
!     afs_uint32 refCount;		/* by cm_volumeLock */
      time_t cbExpiresRO;                 /* latest RO expiration time; by cm_scacheLock */
  } cm_volume_t;
  
--- 34,42 ----
      struct cm_vol_state rw;	        /* by cm_volumeLock */
      struct cm_vol_state ro;		/* by cm_volumeLock */
      struct cm_vol_state bk;		/* by cm_volumeLock */
      osi_mutex_t mx;
      afs_uint32 flags;			/* by mx */
!     afs_int32 refCount;		        /* by Interlocked operations */
      time_t cbExpiresRO;                 /* latest RO expiration time; by cm_scacheLock */
  } cm_volume_t;
  
***************
*** 52,62 ****
  
  extern void cm_InitVolume(int newFile, long maxVols);
  
! extern long cm_GetVolumeByName(struct cm_cell *cellp, char *volNamep, 
                                 struct cm_user *userp, struct cm_req *reqp, 
                                 afs_uint32 flags, cm_volume_t **outVolpp);
  
! extern long cm_GetVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
                               cm_user_t *userp, cm_req_t *reqp, 
                               afs_uint32 flags, cm_volume_t **outVolpp);
  
--- 52,62 ----
  
  extern void cm_InitVolume(int newFile, long maxVols);
  
! extern long cm_FindVolumeByName(struct cm_cell *cellp, char *volNamep, 
                                 struct cm_user *userp, struct cm_req *reqp, 
                                 afs_uint32 flags, cm_volume_t **outVolpp);
  
! extern long cm_FindVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
                               cm_user_t *userp, cm_req_t *reqp, 
                               afs_uint32 flags, cm_volume_t **outVolpp);
  
***************
*** 77,82 ****
--- 77,84 ----
  
  extern void cm_GetVolume(cm_volume_t *volp);
  
+ extern cm_volume_t *cm_GetVolumeByFID(cm_fid_t *);
+ 
  extern void cm_PutVolume(cm_volume_t *volp);
  
  extern long cm_GetROVolumeID(cm_volume_t *volp);
***************
*** 108,113 ****
--- 110,117 ----
  
  extern void cm_AdjustVolumeLRU(cm_volume_t *volp);
  
+ extern void cm_MoveVolumeToLRULast(cm_volume_t *volp);
+ 
  extern void cm_RemoveVolumeFromLRU(cm_volume_t *volp);
  
  extern void cm_CheckOfflineVolumes(void);
***************
*** 121,124 ****
--- 125,130 ----
  extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
  
  extern void cm_VolumeRenewROCallbacks(void);
+ 
+ extern osi_rwlock_t cm_volumeLock;
  #endif /*  __CM_VOLUME_H_ENV__ */
Index: openafs/src/WINNT/afsd/fs.c
diff -c openafs/src/WINNT/afsd/fs.c:1.32.4.19 openafs/src/WINNT/afsd/fs.c:1.32.4.20
*** openafs/src/WINNT/afsd/fs.c:1.32.4.19	Fri Feb  8 21:32:19 2008
--- openafs/src/WINNT/afsd/fs.c	Wed Mar 19 09:24:00 2008
***************
*** 535,558 ****
      tp->nplus = tp->nminus = 0;
      tp->pluslist = tp->minuslist = 0;
      tp->dfs = 0;
!     sscanf(astr, "%d dfs:%d %s", &junk, &tp->dfs, tp->cell);
      return tp;
  }
  
  static struct Acl *
  ParseAcl (char *astr)
  {
!     int nplus, nminus, i, trights;
      char tname[MAXNAME];
!     struct AclEntry *first, *last, *tl;
      struct Acl *ta;
  
!     ta = (struct Acl *) malloc (sizeof (struct Acl));
!     assert(ta);
!     ta->dfs = 0;
!     sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell);
      astr = SkipLine(astr);
!     sscanf(astr, "%d", &ta->nminus);
      astr = SkipLine(astr);
  
      nplus = ta->nplus;
--- 535,570 ----
      tp->nplus = tp->nminus = 0;
      tp->pluslist = tp->minuslist = 0;
      tp->dfs = 0;
!     if (astr == NULL || sscanf(astr, "%d dfs:%d %s", &junk, &tp->dfs, tp->cell) <= 0) {
!         tp->dfs = 0;
!         tp->cell[0] = '\0';
!     }
      return tp;
  }
  
  static struct Acl *
  ParseAcl (char *astr)
  {
!     int nplus, nminus, i, trights, ret;
      char tname[MAXNAME];
!     struct AclEntry *first, *next, *last, *tl;
      struct Acl *ta;
  
!     ta = EmptyAcl(NULL);
!     if (astr == NULL || strlen(astr) == 0)
!         return ta;
! 
!     ret = sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell);
!     if (ret <= 0) {
!         free(ta);
!         return NULL;
!     }
      astr = SkipLine(astr);
!     ret = sscanf(astr, "%d", &ta->nminus);
!     if (ret <= 0) {
!         free(ta);
!         return NULL;
!     }
      astr = SkipLine(astr);
  
      nplus = ta->nplus;
***************
*** 561,570 ****
      last = 0;
      first = 0;
      for(i=0;i<nplus;i++) {
!         sscanf(astr, "%100s %d", tname, &trights);
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
!         assert(tl);
          if (!first) 
              first = tl;
          strcpy(tl->name, tname);
--- 573,585 ----
      last = 0;
      first = 0;
      for(i=0;i<nplus;i++) {
!         ret = sscanf(astr, "%100s %d", tname, &trights); 
!         if (ret <= 0)
!             goto nplus_err;
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
!         if (tl == NULL)
!             goto nplus_err;
          if (!first) 
              first = tl;
          strcpy(tl->name, tname);
***************
*** 579,588 ****
      last = 0;
      first = 0;
      for(i=0;i<nminus;i++) {
!         sscanf(astr, "%100s %d", tname, &trights);
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
!         assert(tl);
          if (!first) 
              first = tl;
          strcpy(tl->name, tname);
--- 594,606 ----
      last = 0;
      first = 0;
      for(i=0;i<nminus;i++) {
!         ret = sscanf(astr, "%100s %d", tname, &trights);
!         if (ret <= 0)
!             goto nminus_err;
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
!         if (tl == NULL)
!             goto nminus_err;
          if (!first) 
              first = tl;
          strcpy(tl->name, tname);
***************
*** 594,600 ****
--- 612,634 ----
      }
      ta->minuslist = first;
  
+   exit:
      return ta;
+ 
+   nminus_err:
+     for (;first; first = next) {
+         next = first->next;
+         free(first);
+     }   
+     first = ta->pluslist;
+ 
+   nplus_err:
+     for (;first; first = next) {
+         next = first->next;
+         free(first);
+     }   
+     free(ta);
+     return NULL;
  }
  
  static int
***************
*** 904,909 ****
--- 938,950 ----
          if (ta)
              ZapAcl(ta);
  	ta = ParseAcl(space);
+         if (!ta) {
+             fprintf(stderr,
+                     "fs: %s: invalid acl data returned from VIOCGETAL\n",
+                      ti->data);
+             error = 1;
+             continue;
+         }
  	if (!plusp && ta->dfs) {
  	    fprintf(stderr,
  		    "fs: %s: you may not use the -negative switch with DFS acl's.\n%s",
***************
*** 918,923 ****
--- 959,971 ----
              ta = EmptyAcl(space);
  	else 
              ta = ParseAcl(space);
+         if (!ta) {
+             fprintf(stderr,
+                     "fs: %s: invalid acl data returned from VIOCGETAL\n",
+                      ti->data);
+             error = 1;
+             continue;
+         }
  	CleanAcl(ta, ti->data);
  	for(ui=as->parms[1].items; ui; ui=ui->next->next) {
  	    enum rtype rtype;
***************
*** 1027,1032 ****
--- 1075,1086 ----
  	return 1;
      }
      fa = ParseAcl(space);
+     if (!fa) {
+         fprintf(stderr,
+                  "fs: %s: invalid acl data returned from VIOCGETAL\n",
+                  as->parms[0].items->data);
+         return 1;
+     }
      CleanAcl(fa, as->parms[0].items->data);
      for (ti=as->parms[1].items; ti;ti=ti->next) {
  	blob.out_size = MAXSIZE;
***************
*** 1044,1049 ****
--- 1098,1110 ----
              ta = EmptyAcl(space);
  	else 
              ta = ParseAcl(space);
+         if (!ta) {
+             fprintf(stderr,
+                     "fs: %s: invalid acl data returned from VIOCGETAL\n",
+                      ti->data);
+             error = 1;
+             continue;
+         }
  	CleanAcl(ta, ti->data);
  	if (ta->dfs != fa->dfs) {
  	    fprintf(stderr, 
***************
*** 1206,1212 ****
          if (ta)
              ZapAcl(ta);
  	ta = ParseAcl(space);
! 
  	if (ta->dfs) {
  	    fprintf(stderr,
  		    "%s: cleanacl is not supported for DFS access lists.\n",
--- 1267,1279 ----
          if (ta)
              ZapAcl(ta);
  	ta = ParseAcl(space);
!         if (!ta) {
!             fprintf(stderr,
!                     "fs: %s: invalid acl data returned from VIOCGETAL\n",
!                      ti->data);
!             error = 1;
!             continue;
!         }
  	if (ta->dfs) {
  	    fprintf(stderr,
  		    "%s: cleanacl is not supported for DFS access lists.\n",
***************
*** 1292,1297 ****
--- 1359,1371 ----
  	    continue;
  	}
  	ta = ParseAcl(space);
+         if (!ta) {
+             fprintf(stderr,
+                     "fs: %s: invalid acl data returned from VIOCGETAL\n",
+                      ti->data);
+             error = 1;
+             continue;
+         }
  	switch (ta->dfs) {
  	  case 0:
  	    printf("Access list for %s is\n", ti->data);
Index: openafs/src/WINNT/afsd/rawops.c
diff -c openafs/src/WINNT/afsd/rawops.c:1.2.4.4 openafs/src/WINNT/afsd/rawops.c:1.2.4.6
*** openafs/src/WINNT/afsd/rawops.c:1.2.4.4	Fri Feb 22 19:17:35 2008
--- openafs/src/WINNT/afsd/rawops.c	Wed Mar 19 11:36:27 2008
***************
*** 10,17 ****
  #include <osi.h>
  #include "afsd.h"
  
- #include "afsdifs.h"
- 
  #define CM_BUF_SIZE		4096
  long buf_bufferSize = CM_BUF_SIZE;
  
--- 10,15 ----
***************
*** 33,39 ****
  
      bufferp = NULL;
  
!     lock_ObtainMutex(&scp->mx);
  
      /* start by looking up the file's end */
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
--- 31,37 ----
  
      bufferp = NULL;
  
!     lock_ObtainWrite(&scp->rw);
  
      /* start by looking up the file's end */
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
***************
*** 82,92 ****
                  buf_Release(bufferp);
                  bufferp = NULL;
              }
!             lock_ReleaseMutex(&scp->mx);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
!             lock_ObtainMutex(&scp->mx);
              if (code) goto done;
              bufferOffset = thyper;
  
--- 80,90 ----
                  buf_Release(bufferp);
                  bufferp = NULL;
              }
!             lock_ReleaseWrite(&scp->rw);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
!             lock_ObtainWrite(&scp->rw);
              if (code) goto done;
              bufferOffset = thyper;
  
***************
*** 134,140 ****
      } /* while 1 */
  
    done:
!     lock_ReleaseMutex(&scp->mx);
      //lock_ReleaseMutex(&fidp->mx);
      if (bufferp) 
          buf_Release(bufferp);
--- 132,138 ----
      } /* while 1 */
  
    done:
!     lock_ReleaseWrite(&scp->rw);
      //lock_ReleaseMutex(&fidp->mx);
      if (bufferp) 
          buf_Release(bufferp);
***************
*** 169,175 ****
      bufferp = NULL;
      doWriteBack = 0;
  
!     lock_ObtainMutex(&scp->mx);
  
      /* start by looking up the file's end */
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
--- 167,173 ----
      bufferp = NULL;
      doWriteBack = 0;
  
!     lock_ObtainWrite(&scp->rw);
  
      /* start by looking up the file's end */
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
***************
*** 243,254 ****
                  buf_Release(bufferp);
                  bufferp = NULL;
              }	
!             lock_ReleaseMutex(&scp->mx);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
              lock_ObtainMutex(&bufferp->mx);
!             lock_ObtainMutex(&scp->mx);
              if (code) 
                  goto done;
  
--- 241,252 ----
                  buf_Release(bufferp);
                  bufferp = NULL;
              }	
!             lock_ReleaseWrite(&scp->rw);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
              lock_ObtainMutex(&bufferp->mx);
!             lock_ObtainWrite(&scp->rw);
              if (code) 
                  goto done;
  
***************
*** 298,306 ****
                  lock_ReleaseMutex(&bufferp->mx);
                  code = cm_GetBuffer(scp, bufferp, NULL, userp,
                                       &req);
!                 lock_ReleaseMutex(&scp->mx);
                  lock_ObtainMutex(&bufferp->mx);
!                 lock_ObtainMutex(&scp->mx);
                  if (code) 
                      break;
              }
--- 296,304 ----
                  lock_ReleaseMutex(&bufferp->mx);
                  code = cm_GetBuffer(scp, bufferp, NULL, userp,
                                       &req);
!                 lock_ReleaseWrite(&scp->rw);
                  lock_ObtainMutex(&bufferp->mx);
!                 lock_ObtainWrite(&scp->rw);
                  if (code) 
                      break;
              }
***************
*** 349,364 ****
      } /* while 1 */
  
    done:
!     lock_ReleaseMutex(&scp->mx);
      if (bufferp) {
          lock_ReleaseMutex(&bufferp->mx);
          buf_Release(bufferp);
      }
  
      if (code == 0 && doWriteBack) {
!         lock_ObtainMutex(&scp->mx);
          cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_ASYNCSTORE);
!         lock_ReleaseMutex(&scp->mx);
          cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart,
                              writeBackOffset.HighPart, cm_chunkSize, 0, userp);
      }   
--- 347,362 ----
      } /* while 1 */
  
    done:
!     lock_ReleaseWrite(&scp->rw);
      if (bufferp) {
          lock_ReleaseMutex(&bufferp->mx);
          buf_Release(bufferp);
      }
  
      if (code == 0 && doWriteBack) {
!         lock_ObtainWrite(&scp->rw);
          cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_ASYNCSTORE);
!         lock_ReleaseWrite(&scp->rw);
          cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart,
                              writeBackOffset.HighPart, cm_chunkSize, 0, userp);
      }   
Index: openafs/src/WINNT/afsd/smb.c
diff -c openafs/src/WINNT/afsd/smb.c:1.118.2.63 openafs/src/WINNT/afsd/smb.c:1.118.2.70
*** openafs/src/WINNT/afsd/smb.c:1.118.2.63	Mon Feb 25 00:36:46 2008
--- openafs/src/WINNT/afsd/smb.c	Sun Mar  9 11:25:01 2008
***************
*** 83,91 ****
  smb_packet_t *smb_packetFreeListp;
  smb_ncb_t *smb_ncbFreeListp;
  
! int smb_NumServerThreads;
  
! int numNCBs, numSessions, numVCs;
  
  int smb_maxVCPerServer;
  int smb_maxMpxRequests;
--- 83,91 ----
  smb_packet_t *smb_packetFreeListp;
  smb_ncb_t *smb_ncbFreeListp;
  
! afs_uint32 smb_NumServerThreads;
  
! afs_uint32 numNCBs, numSessions, numVCs;
  
  int smb_maxVCPerServer;
  int smb_maxMpxRequests;
***************
*** 246,252 ****
  	time_t now = osi_Time();
  
  	/* Give one priority boost for each 15 seconds */
! 	SetThreadPriority(GetCurrentThread(), (now - *tp) / 15);
      }
  }
  
--- 246,252 ----
  	time_t now = osi_Time();
  
  	/* Give one priority boost for each 15 seconds */
! 	SetThreadPriority(GetCurrentThread(), (int)((now - *tp) / 15));
      }
  }
  
***************
*** 1582,1590 ****
          fidp->vcp = NULL;
          scp = fidp->scp;    /* release after lock is released */
  	if (scp) {
! 	    lock_ObtainMutex(&scp->mx);
  	    scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
! 	    lock_ReleaseMutex(&scp->mx);
  	    osi_Log2(smb_logp,"smb_ReleaseFID fidp 0x%p scp 0x%p", fidp, scp);
  	    fidp->scp = NULL;
  	}
--- 1582,1590 ----
          fidp->vcp = NULL;
          scp = fidp->scp;    /* release after lock is released */
  	if (scp) {
! 	    lock_ObtainWrite(&scp->rw);
  	    scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
! 	    lock_ReleaseWrite(&scp->rw);
  	    osi_Log2(smb_logp,"smb_ReleaseFID fidp 0x%p scp 0x%p", fidp, scp);
  	    fidp->scp = NULL;
  	}
***************
*** 1828,1834 ****
          snprintf(pathstr, sizeof(pathstr)/sizeof(char),
                   "/" CM_PREFIX_VOL "%s", shareName);
          pathstr[sizeof(pathstr)/sizeof(char) - 1] = '\0';
!         len = strlen(pathstr) + 1;
  
          *pathNamep = malloc(len);
          if (*pathNamep) {
--- 1828,1834 ----
          snprintf(pathstr, sizeof(pathstr)/sizeof(char),
                   "/" CM_PREFIX_VOL "%s", shareName);
          pathstr[sizeof(pathstr)/sizeof(char) - 1] = '\0';
!         len = (DWORD)(strlen(pathstr) + 1);
  
          *pathNamep = malloc(len);
          if (*pathNamep) {
***************
*** 2057,2069 ****
  	      dsp->cookie, dsp, dsp->scp);
      dsp->flags |= SMB_DIRSEARCH_DELETE;
      if (dsp->scp != NULL) {
!         lock_ObtainMutex(&dsp->scp->mx);
          if (dsp->flags & SMB_DIRSEARCH_BULKST) {
              dsp->flags &= ~SMB_DIRSEARCH_BULKST;
              dsp->scp->flags &= ~CM_SCACHEFLAG_BULKSTATTING;
              dsp->scp->bulkStatProgress = hzero;
          }	
!         lock_ReleaseMutex(&dsp->scp->mx);
      }	
      lock_ReleaseMutex(&dsp->mx);
      lock_ReleaseWrite(&smb_globalLock);
--- 2057,2069 ----
  	      dsp->cookie, dsp, dsp->scp);
      dsp->flags |= SMB_DIRSEARCH_DELETE;
      if (dsp->scp != NULL) {
!         lock_ObtainWrite(&dsp->scp->rw);
          if (dsp->flags & SMB_DIRSEARCH_BULKST) {
              dsp->flags &= ~SMB_DIRSEARCH_BULKST;
              dsp->scp->flags &= ~CM_SCACHEFLAG_BULKSTATTING;
              dsp->scp->bulkStatProgress = hzero;
          }	
!         lock_ReleaseWrite(&dsp->scp->rw);
      }	
      lock_ReleaseMutex(&dsp->mx);
      lock_ReleaseWrite(&smb_globalLock);
***************
*** 2887,2893 ****
      else if (code == CM_ERROR_RANGE_NOT_LOCKED) {
  	NTStatus = 0xC000007EL;	/* Range Not Locked */
      } 
!     else {
          NTStatus = 0xC0982001L;	/* SMB non-specific error */
      }
  
--- 2887,2898 ----
      else if (code == CM_ERROR_RANGE_NOT_LOCKED) {
  	NTStatus = 0xC000007EL;	/* Range Not Locked */
      } 
!     else if (code == CM_ERROR_NOSUCHDEVICE) {
!         NTStatus = 0xC000000EL; /* No Such Device */
!     }
!     else if (code == CM_ERROR_LOCK_NOT_GRANTED) {
!         NTStatus = 0xC0000055L; /* Lock Not Granted */
!     } else {
          NTStatus = 0xC0982001L;	/* SMB non-specific error */
      }
  
***************
*** 3099,3104 ****
--- 3104,3110 ----
      unsigned short fd;
      unsigned pid;
      smb_fid_t *fidp;
+     smb_t *smbp = (smb_t*) inp;
      long code = 0;
      cm_user_t *userp = NULL;
      NCB *ncbp;
***************
*** 3154,3160 ****
      }
  
  
!     pid = ((smb_t *) inp)->pid;
      {
          LARGE_INTEGER LOffset, LLength;
          cm_key_t key;
--- 3160,3166 ----
      }
  
  
!     pid = smbp->pid;
      {
          LARGE_INTEGER LOffset, LLength;
          cm_key_t key;
***************
*** 3166,3174 ****
          LLength.HighPart = 0;
          LLength.LowPart = count;
  
!         lock_ObtainMutex(&fidp->scp->mx);
          code = cm_LockCheckRead(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseMutex(&fidp->scp->mx);
      }    
      if (code) {
          goto send1a;
--- 3172,3180 ----
          LLength.HighPart = 0;
          LLength.LowPart = count;
  
!         lock_ObtainWrite(&fidp->scp->rw);
          code = cm_LockCheckRead(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseWrite(&fidp->scp->rw);
      }    
      if (code) {
          goto send1a;
***************
*** 3676,3681 ****
--- 3682,3692 ----
                  if (wl->state == SMB_WAITINGLOCKSTATE_DONE)
                      continue;
  
+                 if (wl->state == SMB_WAITINGLOCKSTATE_CANCELLED) {
+                     code = CM_ERROR_LOCK_NOT_GRANTED;
+                     break;
+                 }
+ 
                  osi_assertx(wl->state != SMB_WAITINGLOCKSTATE_ERROR, "!SMB_WAITINGLOCKSTATE_ERROR");
                  
                  /* wl->state is either _DONE or _WAITING.  _ERROR
***************
*** 3694,3701 ****
              if (code == CM_ERROR_WOULDBLOCK) {
  
                  /* no progress */
!                 if (wlRequest->timeRemaining != 0xffffffff
!                      && (wlRequest->timeRemaining -= 1000) < 0)
                      goto endWait;
  
                  continue;
--- 3705,3712 ----
              if (code == CM_ERROR_WOULDBLOCK) {
  
                  /* no progress */
!                 if (wlRequest->msTimeout != 0xffffffff
!                      && ((osi_Time() - wlRequest->start_t) * 1000 > wlRequest->msTimeout))
                      goto endWait;
  
                  continue;
***************
*** 3715,3734 ****
  
                  cm_InitReq(&req);
  
!                 lock_ObtainMutex(&scp->mx);
  
                  for (wl = wlRequest->locks; wl; wl = wlNext) {
                      wlNext = (smb_waitingLock_t *) osi_QNext(&wl->q);
!                     
!                     cm_Unlock(scp, wlRequest->lockType, wl->LOffset, 
!                               wl->LLength, wl->key, NULL, &req);
  
                      osi_QRemove((osi_queue_t **) &wlRequest->locks, &wl->q);
  
                      free(wl);
                  }
                  
!                 lock_ReleaseMutex(&scp->mx);
  
              } else {
  
--- 3726,3746 ----
  
                  cm_InitReq(&req);
  
!                 lock_ObtainWrite(&scp->rw);
  
                  for (wl = wlRequest->locks; wl; wl = wlNext) {
                      wlNext = (smb_waitingLock_t *) osi_QNext(&wl->q);
!                 
!                     if (wl->state == SMB_WAITINGLOCKSTATE_DONE)
!                         cm_Unlock(scp, wlRequest->lockType, wl->LOffset, 
!                                   wl->LLength, wl->key, NULL, &req);
  
                      osi_QRemove((osi_queue_t **) &wlRequest->locks, &wl->q);
  
                      free(wl);
                  }
                  
!                 lock_ReleaseWrite(&scp->rw);
  
              } else {
  
***************
*** 4079,4089 ****
                  *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;
--- 4091,4101 ----
                  *dptr++ = SMB_ATTR_HIDDEN;
              continue;
          }
!         lock_ObtainWrite(&scp->rw);
          code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                            CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
          if (code) {	
!             lock_ReleaseWrite(&scp->rw);
              cm_ReleaseSCache(scp);
              if (patchp->flags & SMB_DIRLISTPATCH_DOTFILE)
                  *dptr++ = SMB_ATTR_HIDDEN;
***************
*** 4092,4097 ****
--- 4104,4110 ----
  
  	cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
+         lock_ConvertWToR(&scp->rw);
          attr = smb_Attributes(scp);
          /* check hidden attribute (the flag is only ON when dot file hiding is on ) */
          if (patchp->flags & SMB_DIRLISTPATCH_DOTFILE)
***************
*** 4114,4120 ****
          /* copy out file length */
          *((u_long *)dptr) = scp->length.LowPart;
          dptr += 4;
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
      }
          
--- 4127,4133 ----
          /* copy out file length */
          *((u_long *)dptr) = scp->length.LowPart;
          dptr += 4;
!         lock_ReleaseRead(&scp->rw);
          cm_ReleaseSCache(scp);
      }
          
***************
*** 4309,4322 ****
               * now.
               */
              cm_HoldSCache(scp);
!             lock_ObtainMutex(&scp->mx);
              if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0
                   && LargeIntegerGreaterOrEqualToZero(scp->bulkStatProgress)) {
                  scp->flags |= CM_SCACHEFLAG_BULKSTATTING;
                  dsp->flags |= SMB_DIRSEARCH_BULKST;
  		dsp->scp->bulkStatProgress = hzero;
              }
!             lock_ReleaseMutex(&scp->mx);
          }
      }
      lock_ReleaseMutex(&dsp->mx);
--- 4322,4335 ----
               * now.
               */
              cm_HoldSCache(scp);
!             lock_ObtainWrite(&scp->rw);
              if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0
                   && LargeIntegerGreaterOrEqualToZero(scp->bulkStatProgress)) {
                  scp->flags |= CM_SCACHEFLAG_BULKSTATTING;
                  dsp->flags |= SMB_DIRSEARCH_BULKST;
  		dsp->scp->bulkStatProgress = hzero;
              }
!             lock_ReleaseWrite(&scp->rw);
          }
      }
      lock_ReleaseMutex(&dsp->mx);
***************
*** 4334,4344 ****
      smb_SetSMBParm(outp, 0, 0);
  
      /* get the directory size */
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          cm_ReleaseUser(userp);
          smb_DeleteDirSearch(dsp);
--- 4347,4357 ----
      smb_SetSMBParm(outp, 0, 0);
  
      /* get the directory size */
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          cm_ReleaseUser(userp);
          smb_DeleteDirSearch(dsp);
***************
*** 4407,4413 ****
                  buf_Release(bufferp);
                  bufferp = NULL;
              }	
!             lock_ReleaseMutex(&scp->mx);
              code = buf_Get(scp, &thyper, &bufferp);
              lock_ObtainMutex(&dsp->mx);
  
--- 4420,4426 ----
                  buf_Release(bufferp);
                  bufferp = NULL;
              }	
!             lock_ReleaseWrite(&scp->rw);
              code = buf_Get(scp, &thyper, &bufferp);
              lock_ObtainMutex(&dsp->mx);
  
***************
*** 4416,4422 ****
               */
              if (starPattern) {
                  smb_ApplyDirListPatches(&dirListPatchesp, dsp->tidPath, dsp->relPath, userp, &req);
!                 lock_ObtainMutex(&scp->mx);
                  if ((dsp->flags & SMB_DIRSEARCH_BULKST) &&
                       LargeIntegerGreaterThanOrEqualTo(thyper, 
                                                        scp->bulkStatProgress)) {
--- 4429,4435 ----
               */
              if (starPattern) {
                  smb_ApplyDirListPatches(&dirListPatchesp, dsp->tidPath, dsp->relPath, userp, &req);
!                 lock_ObtainWrite(&scp->rw);
                  if ((dsp->flags & SMB_DIRSEARCH_BULKST) &&
                       LargeIntegerGreaterThanOrEqualTo(thyper, 
                                                        scp->bulkStatProgress)) {
***************
*** 4431,4437 ****
                          code = cm_TryBulkStat(scp, &thyper, userp, &req);
                  }
              } else {
!                 lock_ObtainMutex(&scp->mx);
              }
              lock_ReleaseMutex(&dsp->mx);
              if (code) {
--- 4444,4450 ----
                          code = cm_TryBulkStat(scp, &thyper, userp, &req);
                  }
              } else {
!                 lock_ObtainWrite(&scp->rw);
              }
              lock_ReleaseMutex(&dsp->mx);
              if (code) {
***************
*** 4623,4629 ****
      }		/* while copying data for dir listing */
  
      /* release the mutex */
!     lock_ReleaseMutex(&scp->mx);
      if (bufferp) {
  	buf_Release(bufferp);
  	bufferp = NULL;
--- 4636,4642 ----
      }		/* while copying data for dir listing */
  
      /* release the mutex */
!     lock_ReleaseWrite(&scp->rw);
      if (bufferp) {
  	buf_Release(bufferp);
  	bufferp = NULL;
***************
*** 4730,4741 ****
  #endif /* DFS_SUPPORT */
  
      /* now lock the vnode with a callback; returns with newScp locked */
!     lock_ObtainMutex(&newScp->mx);
      code = cm_SyncOp(newScp, NULL, userp, &req, PRSFS_LOOKUP,
                       CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) {
  	if (code != CM_ERROR_NOACCESS) {
! 	    lock_ReleaseMutex(&newScp->mx);
  	    cm_ReleaseSCache(newScp);
  	    cm_ReleaseUser(userp);
  	    return code;
--- 4743,4754 ----
  #endif /* DFS_SUPPORT */
  
      /* now lock the vnode with a callback; returns with newScp locked */
!     lock_ObtainWrite(&newScp->rw);
      code = cm_SyncOp(newScp, NULL, userp, &req, PRSFS_LOOKUP,
                       CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) {
  	if (code != CM_ERROR_NOACCESS) {
! 	    lock_ReleaseWrite(&newScp->rw);
  	    cm_ReleaseSCache(newScp);
  	    cm_ReleaseUser(userp);
  	    return code;
***************
*** 4749,4755 ****
      if (!(attrs & SMB_ATTR_DIRECTORY))
          code = CM_ERROR_NOTDIR;
  
!     lock_ReleaseMutex(&newScp->mx);
  
      cm_ReleaseSCache(newScp);
      cm_ReleaseUser(userp);
--- 4762,4768 ----
      if (!(attrs & SMB_ATTR_DIRECTORY))
          code = CM_ERROR_NOTDIR;
  
!     lock_ReleaseWrite(&newScp->rw);
  
      cm_ReleaseSCache(newScp);
      cm_ReleaseUser(userp);
***************
*** 4821,4831 ****
       * need the current status to determine what the new status is, in some
       * cases.
       */
!     lock_ObtainMutex(&newScp->mx);
      code = cm_SyncOp(newScp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) {
!         lock_ReleaseMutex(&newScp->mx);
          cm_ReleaseSCache(newScp);
          cm_ReleaseUser(userp);
          return code;
--- 4834,4844 ----
       * need the current status to determine what the new status is, in some
       * cases.
       */
!     lock_ObtainWrite(&newScp->rw);
      code = cm_SyncOp(newScp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) {
!         lock_ReleaseWrite(&newScp->rw);
          cm_ReleaseSCache(newScp);
          cm_ReleaseUser(userp);
          return code;
***************
*** 4835,4841 ****
  
      /* Check for RO volume */
      if (newScp->flags & CM_SCACHEFLAG_RO) {
!         lock_ReleaseMutex(&newScp->mx);
          cm_ReleaseSCache(newScp);
          cm_ReleaseUser(userp);
          return CM_ERROR_READONLY;
--- 4848,4854 ----
  
      /* Check for RO volume */
      if (newScp->flags & CM_SCACHEFLAG_RO) {
!         lock_ReleaseWrite(&newScp->rw);
          cm_ReleaseSCache(newScp);
          cm_ReleaseUser(userp);
          return CM_ERROR_READONLY;
***************
*** 4857,4863 ****
          attr.unixModeBits = newScp->unixModeBits | 0222;
          attr.mask |= CM_ATTRMASK_UNIXMODEBITS;
      }
!     lock_ReleaseMutex(&newScp->mx);
  
      /* now call setattr */
      if (attr.mask)
--- 4870,4876 ----
          attr.unixModeBits = newScp->unixModeBits | 0222;
          attr.mask |= CM_ATTRMASK_UNIXMODEBITS;
      }
!     lock_ReleaseWrite(&newScp->rw);
  
      /* now call setattr */
      if (attr.mask)
***************
*** 4988,4998 ****
  #endif /* DFS_SUPPORT */
  
      /* now lock the vnode with a callback; returns with newScp locked */
!     lock_ObtainMutex(&newScp->mx);
      code = cm_SyncOp(newScp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) {
!         lock_ReleaseMutex(&newScp->mx);
          cm_ReleaseSCache(newScp);
          cm_ReleaseUser(userp);
          return code;
--- 5001,5011 ----
  #endif /* DFS_SUPPORT */
  
      /* now lock the vnode with a callback; returns with newScp locked */
!     lock_ObtainWrite(&newScp->rw);
      code = cm_SyncOp(newScp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK);
      if (code) {
!         lock_ReleaseWrite(&newScp->rw);
          cm_ReleaseSCache(newScp);
          cm_ReleaseUser(userp);
          return code;
***************
*** 5029,5035 ****
      smb_SetSMBParm(outp, 8, 0);
      smb_SetSMBParm(outp, 9, 0);
      smb_SetSMBDataLength(outp, 0);
!     lock_ReleaseMutex(&newScp->mx);
  
      cm_ReleaseSCache(newScp);
      cm_ReleaseUser(userp);
--- 5042,5048 ----
      smb_SetSMBParm(outp, 8, 0);
      smb_SetSMBParm(outp, 9, 0);
      smb_SetSMBDataLength(outp, 0);
!     lock_ReleaseWrite(&newScp->rw);
  
      cm_ReleaseSCache(newScp);
      cm_ReleaseUser(userp);
***************
*** 5166,5174 ****
      /* save a pointer to the vnode */
      fidp->scp = scp;
      osi_Log2(smb_logp,"smb_ReceiveCoreOpen fidp 0x%p scp 0x%p", fidp, scp);
!     lock_ObtainMutex(&scp->mx);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseMutex(&scp->mx);
  
      /* and the user */
      cm_HoldUser(userp);
--- 5179,5187 ----
      /* save a pointer to the vnode */
      fidp->scp = scp;
      osi_Log2(smb_logp,"smb_ReceiveCoreOpen fidp 0x%p scp 0x%p", fidp, scp);
!     lock_ObtainWrite(&scp->rw);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseWrite(&scp->rw);
  
      /* and the user */
      cm_HoldUser(userp);
***************
*** 5183,5189 ****
          fidp->flags |= (SMB_FID_OPENREAD_LISTDIR | SMB_FID_OPENWRITE);
      lock_ReleaseMutex(&fidp->mx);
  
!     lock_ObtainMutex(&scp->mx);
      smb_SetSMBParm(outp, 0, fidp->fid);
      smb_SetSMBParm(outp, 1, smb_Attributes(scp));
      smb_DosUTimeFromUnixTime(&dosTime, scp->clientModTime);
--- 5196,5202 ----
          fidp->flags |= (SMB_FID_OPENREAD_LISTDIR | SMB_FID_OPENWRITE);
      lock_ReleaseMutex(&fidp->mx);
  
!     lock_ObtainRead(&scp->rw);
      smb_SetSMBParm(outp, 0, fidp->fid);
      smb_SetSMBParm(outp, 1, smb_Attributes(scp));
      smb_DosUTimeFromUnixTime(&dosTime, scp->clientModTime);
***************
*** 5194,5200 ****
      /* pass the open mode back; XXXX add access checks */
      smb_SetSMBParm(outp, 6, (share & 0xf));
      smb_SetSMBDataLength(outp, 0);
!     lock_ReleaseMutex(&scp->mx);
          
      /* notify open */
      cm_Open(scp, 0, userp);
--- 5207,5213 ----
      /* pass the open mode back; XXXX add access checks */
      smb_SetSMBParm(outp, 6, (share & 0xf));
      smb_SetSMBDataLength(outp, 0);
!     lock_ReleaseRead(&scp->rw);
          
      /* notify open */
      cm_Open(scp, 0, userp);
***************
*** 6000,6006 ****
      userp = smb_GetUserFromVCP(vcp, inp);
  
      lock_ObtainMutex(&fidp->mx);
!     if (fidp->flags & SMB_FID_OPENWRITE) {
  	cm_scache_t * scp = fidp->scp;
  	cm_HoldSCache(scp);
  	lock_ReleaseMutex(&fidp->mx);
--- 6013,6019 ----
      userp = smb_GetUserFromVCP(vcp, inp);
  
      lock_ObtainMutex(&fidp->mx);
!     if ((fidp->flags & SMB_FID_OPENWRITE) && smb_AsyncStore != 2) {
  	cm_scache_t * scp = fidp->scp;
  	cm_HoldSCache(scp);
  	lock_ReleaseMutex(&fidp->mx);
***************
*** 6135,6143 ****
              CompensateForSmbClientLastWriteTimeBugs(&dosTime);
              smb_UnixTimeFromDosUTime(&fidp->scp->clientModTime, dosTime);
          }
! 	lock_ReleaseMutex(&fidp->mx);
!         code = cm_FSync(scp, userp, &req);
! 	lock_ObtainMutex(&fidp->mx);
      }
      else 
          code = 0;
--- 6148,6158 ----
              CompensateForSmbClientLastWriteTimeBugs(&dosTime);
              smb_UnixTimeFromDosUTime(&fidp->scp->clientModTime, dosTime);
          }
!         if (smb_AsyncStore != 2) {
!             lock_ReleaseMutex(&fidp->mx);
!             code = cm_FSync(scp, userp, &req);
!             lock_ObtainMutex(&fidp->mx);
!         }
      }
      else 
          code = 0;
***************
*** 6153,6159 ****
  	/* CM_UNLOCK_BY_FID doesn't look at the process ID.  We pass
             in zero. */
          key = cm_GenerateKey(vcp->vcID, 0, fidp->fid);
!         lock_ObtainMutex(&scp->mx);
  
          tcode = cm_SyncOp(scp, NULL, userp, &req, 0,
                            CM_SCACHESYNC_NEEDCALLBACK
--- 6168,6174 ----
  	/* CM_UNLOCK_BY_FID doesn't look at the process ID.  We pass
             in zero. */
          key = cm_GenerateKey(vcp->vcID, 0, fidp->fid);
!         lock_ObtainWrite(&scp->rw);
  
          tcode = cm_SyncOp(scp, NULL, userp, &req, 0,
                            CM_SCACHESYNC_NEEDCALLBACK
***************
*** 6172,6178 ****
  
      post_syncopdone:
  
!         lock_ReleaseMutex(&scp->mx);
  	lock_ObtainMutex(&fidp->mx);
      }
  
--- 6187,6193 ----
  
      post_syncopdone:
  
!         lock_ReleaseWrite(&scp->rw);
  	lock_ObtainMutex(&fidp->mx);
      }
  
***************
*** 6245,6264 ****
  
      if (delscp) {
  	if (deleted) {
! 	    lock_ObtainMutex(&delscp->mx);
  	    if (deleted)
  		delscp->flags |= CM_SCACHEFLAG_DELETED;
! 	    lock_ReleaseMutex(&delscp->mx);
  	}
          cm_ReleaseSCache(delscp);
      }
  
      if (scp) {
! 	lock_ObtainMutex(&scp->mx);
          if (nullcreator && scp->creator == userp)
              scp->creator = NULL;
  	scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
! 	lock_ReleaseMutex(&scp->mx);
  	cm_ReleaseSCache(scp);
      }
  
--- 6260,6279 ----
  
      if (delscp) {
  	if (deleted) {
! 	    lock_ObtainWrite(&delscp->rw);
  	    if (deleted)
  		delscp->flags |= CM_SCACHEFLAG_DELETED;
! 	    lock_ReleaseWrite(&delscp->rw);
  	}
          cm_ReleaseSCache(delscp);
      }
  
      if (scp) {
! 	lock_ObtainWrite(&scp->rw);
          if (nullcreator && scp->creator == userp)
              scp->creator = NULL;
  	scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
! 	lock_ReleaseWrite(&scp->rw);
  	cm_ReleaseSCache(scp);
      }
  
***************
*** 6300,6309 ****
   * smb_ReadData -- common code for Read, Read And X, and Raw Read
   */
  #ifndef DJGPP
! long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
  	cm_user_t *userp, long *readp)
  #else /* DJGPP */
! long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
  	cm_user_t *userp, long *readp, int dosflag)
  #endif /* !DJGPP */
  {
--- 6315,6324 ----
   * smb_ReadData -- common code for Read, Read And X, and Raw Read
   */
  #ifndef DJGPP
! long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char *op,
  	cm_user_t *userp, long *readp)
  #else /* DJGPP */
! long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char *op,
  	cm_user_t *userp, long *readp, int dosflag)
  #endif /* !DJGPP */
  {
***************
*** 6315,6334 ****
      osi_hyper_t thyper;
      osi_hyper_t lastByte;
      osi_hyper_t bufferOffset;
!     long bufIndex, nbytes;
      int chunk;
      int sequential = (fidp->flags & SMB_FID_SEQUENTIAL);
      cm_req_t req;
  
      cm_InitReq(&req);
  
      bufferp = NULL;
      offset = *offsetp;
  
-     lock_ObtainMutex(&fidp->mx);
      scp = fidp->scp;
      cm_HoldSCache(scp);
!     lock_ObtainMutex(&scp->mx);
  
      if (offset.HighPart == 0) {
          chunk = offset.LowPart >> cm_logChunkSize;
--- 6330,6364 ----
      osi_hyper_t thyper;
      osi_hyper_t lastByte;
      osi_hyper_t bufferOffset;
!     long bufIndex;
!     afs_uint32 nbytes;
      int chunk;
      int sequential = (fidp->flags & SMB_FID_SEQUENTIAL);
      cm_req_t req;
  
+     osi_Log3(smb_logp, "smb_ReadData fid %d, off 0x%x, size 0x%x",
+               fidp->fid, offsetp->LowPart, count);
+ 
+     *readp = 0;
+ 
+     lock_ObtainMutex(&fidp->mx);
+     /* make sure we have a readable FD */
+     if (!(fidp->flags & SMB_FID_OPENREAD_LISTDIR)) {
+ 	osi_Log2(smb_logp, "smb_ReadData fid %d not OPENREAD_LISTDIR flags 0x%x",
+ 		  fidp->fid, fidp->flags);
+ 	lock_ReleaseMutex(&fidp->mx);
+         code = CM_ERROR_BADFDOP;
+         goto done2;
+     }
+     
      cm_InitReq(&req);
  
      bufferp = NULL;
      offset = *offsetp;
  
      scp = fidp->scp;
      cm_HoldSCache(scp);
!     lock_ObtainWrite(&scp->rw);
  
      if (offset.HighPart == 0) {
          chunk = offset.LowPart >> cm_logChunkSize;
***************
*** 6388,6398 ****
                  buf_Release(bufferp);
                  bufferp = NULL;
              }
!             lock_ReleaseMutex(&scp->mx);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
!             lock_ObtainMutex(&scp->mx);
              if (code) goto done;
              bufferOffset = thyper;
  
--- 6418,6428 ----
                  buf_Release(bufferp);
                  bufferp = NULL;
              }
!             lock_ReleaseWrite(&scp->rw);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
!             lock_ObtainWrite(&scp->rw);
              if (code) goto done;
              bufferOffset = thyper;
  
***************
*** 6445,6451 ****
      } /* while 1 */
  
    done:
!     lock_ReleaseMutex(&scp->mx);
      if (bufferp)
          buf_Release(bufferp);
  
--- 6475,6481 ----
      } /* while 1 */
  
    done:
!     lock_ReleaseWrite(&scp->rw);
      if (bufferp)
          buf_Release(bufferp);
  
***************
*** 6454,6459 ****
--- 6484,6492 ----
  
      cm_ReleaseSCache(scp);
  
+   done2:
+     osi_Log3(smb_logp, "smb_ReadData fid %d returns 0x%x read %d bytes",
+               fidp->fid, code, *readp);
      return code;
  }
  
***************
*** 6461,6477 ****
   * smb_WriteData -- common code for Write and Raw Write
   */
  #ifndef DJGPP
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
  	cm_user_t *userp, long *writtenp)
  #else /* DJGPP */
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
  	cm_user_t *userp, long *writtenp, int dosflag)
  #endif /* !DJGPP */
  {
      osi_hyper_t offset = *offsetp;
      long code = 0;
      long written = 0;
!     cm_scache_t *scp;
      osi_hyper_t fileLength;	/* file's length at start of write */
      osi_hyper_t minLength;	/* don't read past this */
      afs_uint32 nbytes;		/* # of bytes to transfer this iteration */
--- 6494,6510 ----
   * smb_WriteData -- common code for Write and Raw Write
   */
  #ifndef DJGPP
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char *op,
  	cm_user_t *userp, long *writtenp)
  #else /* DJGPP */
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char *op,
  	cm_user_t *userp, long *writtenp, int dosflag)
  #endif /* !DJGPP */
  {
      osi_hyper_t offset = *offsetp;
      long code = 0;
      long written = 0;
!     cm_scache_t *scp = NULL;
      osi_hyper_t fileLength;	/* file's length at start of write */
      osi_hyper_t minLength;	/* don't read past this */
      afs_uint32 nbytes;		/* # of bytes to transfer this iteration */
***************
*** 6489,6496 ****
  
      *writtenp = 0;
  
-     cm_InitReq(&req);
- 
      lock_ObtainMutex(&fidp->mx);
      /* make sure we have a writable FD */
      if (!(fidp->flags & SMB_FID_OPENWRITE)) {
--- 6522,6527 ----
***************
*** 6498,6511 ****
  		  fidp->fid, fidp->flags);
  	lock_ReleaseMutex(&fidp->mx);
          code = CM_ERROR_BADFDOP;
!         goto done;
      }
      
      scp = fidp->scp;
      cm_HoldSCache(scp);
      lock_ReleaseMutex(&fidp->mx);
  
!     lock_ObtainMutex(&scp->mx);
      /* start by looking up the file's end */
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK
--- 6529,6544 ----
  		  fidp->fid, fidp->flags);
  	lock_ReleaseMutex(&fidp->mx);
          code = CM_ERROR_BADFDOP;
!         goto done2;
      }
      
+     cm_InitReq(&req);
+ 
      scp = fidp->scp;
      cm_HoldSCache(scp);
      lock_ReleaseMutex(&fidp->mx);
  
!     lock_ObtainWrite(&scp->rw);
      /* start by looking up the file's end */
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK
***************
*** 6545,6553 ****
       * based upon cm_chunkSize but we desire cm_chunkSize to be large
       * so that we can read larger amounts of data at a time.
       */
!     if (smb_AsyncStore && 
!          (thyper.LowPart & ~(cm_data.buf_blockSize-1)) !=
!          (offset.LowPart & ~(cm_data.buf_blockSize-1))) {
          /* they're different */
          doWriteBack = 1;
          writeBackOffset.HighPart = offset.HighPart;
--- 6578,6586 ----
       * based upon cm_chunkSize but we desire cm_chunkSize to be large
       * so that we can read larger amounts of data at a time.
       */
!     if (smb_AsyncStore == 1 && 
!          (thyper.LowPart & ~(smb_AsyncStoreSize-1)) !=
!          (offset.LowPart & ~(smb_AsyncStoreSize-1))) {
          /* they're different */
          doWriteBack = 1;
          writeBackOffset.HighPart = offset.HighPart;
***************
*** 6580,6591 ****
                  buf_Release(bufferp);
                  bufferp = NULL;
              }	
!             lock_ReleaseMutex(&scp->mx);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
              lock_ObtainMutex(&bufferp->mx);
!             lock_ObtainMutex(&scp->mx);
              if (code) goto done;
  
              bufferOffset = thyper;
--- 6613,6624 ----
                  buf_Release(bufferp);
                  bufferp = NULL;
              }	
!             lock_ReleaseWrite(&scp->rw);
  
              code = buf_Get(scp, &thyper, &bufferp);
  
              lock_ObtainMutex(&bufferp->mx);
!             lock_ObtainWrite(&scp->rw);
              if (code) goto done;
  
              bufferOffset = thyper;
***************
*** 6624,6630 ****
                                                                                 ConvertLongToLargeInteger(count)),
                                                                 minLength))) {
                      if (count < cm_data.buf_blockSize
!                          && bufferp->dataVersion == -1)
                          memset(bufferp->datap, 0,
                                  cm_data.buf_blockSize);
                      bufferp->dataVersion = scp->dataVersion;
--- 6657,6663 ----
                                                                                 ConvertLongToLargeInteger(count)),
                                                                 minLength))) {
                      if (count < cm_data.buf_blockSize
!                          && bufferp->dataVersion == CM_BUF_VERSION_BAD)
                          memset(bufferp->datap, 0,
                                  cm_data.buf_blockSize);
                      bufferp->dataVersion = scp->dataVersion;
***************
*** 6636,6644 ****
                  lock_ReleaseMutex(&bufferp->mx);
                  code = cm_GetBuffer(scp, bufferp, NULL, userp,
                                       &req);
!                 lock_ReleaseMutex(&scp->mx);
                  lock_ObtainMutex(&bufferp->mx);
!                 lock_ObtainMutex(&scp->mx);
                  if (code) break;
              }
              if (code) {
--- 6669,6677 ----
                  lock_ReleaseMutex(&bufferp->mx);
                  code = cm_GetBuffer(scp, bufferp, NULL, userp,
                                       &req);
!                 lock_ReleaseWrite(&scp->rw);
                  lock_ObtainMutex(&bufferp->mx);
!                 lock_ObtainWrite(&scp->rw);
                  if (code) break;
              }
              if (code) {
***************
*** 6686,6692 ****
      } /* while 1 */
  
    done:
!     lock_ReleaseMutex(&scp->mx);
  
      if (bufferp) {
          lock_ReleaseMutex(&bufferp->mx);
--- 6719,6725 ----
      } /* while 1 */
  
    done:
!     lock_ReleaseWrite(&scp->rw);
  
      if (bufferp) {
          lock_ReleaseMutex(&bufferp->mx);
***************
*** 6703,6722 ****
      lock_ReleaseMutex(&fidp->mx);
  
      if (code == 0) {
!         if (smb_AsyncStore) {
              if (doWriteBack) {
                  long code2;
  
!                 lock_ObtainMutex(&scp->mx);
                  osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp ASYNCSTORE",
                            fidp->fid);
                  code2 = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_ASYNCSTORE);
                  osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp ASYNCSTORE returns 0x%x",
                            fidp->fid, code2);
!                 lock_ReleaseMutex(&scp->mx);
                  cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart,
                                      writeBackOffset.HighPart, 
!                                     *writtenp & ~(cm_data.blockSize-1), 0, userp);
                  /* cm_SyncOpDone is called at the completion of cm_BkgStore */
              }
          } else {
--- 6736,6755 ----
      lock_ReleaseMutex(&fidp->mx);
  
      if (code == 0) {
!         if (smb_AsyncStore > 0) {
              if (doWriteBack) {
                  long code2;
  
!                 lock_ObtainWrite(&scp->rw);
                  osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp ASYNCSTORE",
                            fidp->fid);
                  code2 = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_ASYNCSTORE);
                  osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp ASYNCSTORE returns 0x%x",
                            fidp->fid, code2);
!                 lock_ReleaseWrite(&scp->rw);
                  cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart,
                                      writeBackOffset.HighPart, 
!                                     smb_AsyncStoreSize, 0, userp);
                  /* cm_SyncOpDone is called at the completion of cm_BkgStore */
              }
          } else {
***************
*** 6726,6731 ****
--- 6759,6765 ----
  
      cm_ReleaseSCache(scp);
  
+   done2:
      osi_Log3(smb_logp, "smb_WriteData fid %d returns 0x%x written %d bytes",
                fidp->fid, code, *writtenp);
      return code;
***************
*** 6740,6745 ****
--- 6774,6780 ----
      long written = 0, total_written = 0;
      unsigned pid;
      smb_fid_t *fidp;
+     smb_t* smbp = (smb_t*) inp;
      long code = 0;
      cm_user_t *userp;
      cm_attr_t truncAttr;	/* attribute struct used for truncating file */
***************
*** 6787,6793 ****
          LARGE_INTEGER LOffset;
          LARGE_INTEGER LLength;
  
!         pid = ((smb_t *) inp)->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = offset.HighPart;
--- 6822,6828 ----
          LARGE_INTEGER LOffset;
          LARGE_INTEGER LLength;
  
!         pid = smbp->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = offset.HighPart;
***************
*** 6795,6803 ****
          LLength.HighPart = 0;
          LLength.LowPart = count;
  
!         lock_ObtainMutex(&fidp->scp->mx);
          code = cm_LockCheckWrite(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseMutex(&fidp->scp->mx);
  
          if (code) {
  	    osi_Log1(smb_logp, "smb_ReceiveCoreWrite lock check failure 0x%x", code);
--- 6830,6838 ----
          LLength.HighPart = 0;
          LLength.LowPart = count;
  
!         lock_ObtainWrite(&fidp->scp->rw);
          code = cm_LockCheckWrite(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseWrite(&fidp->scp->rw);
  
          if (code) {
  	    osi_Log1(smb_logp, "smb_ReceiveCoreWrite lock check failure 0x%x", code);
***************
*** 6961,6966 ****
--- 6996,7002 ----
      long totalCount;
      unsigned short fd;
      smb_fid_t *fidp;
+     smb_t *smbp = (smb_t*) inp;
      long code = 0;
      cm_user_t *userp;
      char *op;
***************
*** 7031,7037 ****
          LARGE_INTEGER LOffset;
          LARGE_INTEGER LLength;
  
!         pid = ((smb_t *) inp)->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = offset.HighPart;
--- 7067,7073 ----
          LARGE_INTEGER LOffset;
          LARGE_INTEGER LLength;
  
!         pid = smbp->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = offset.HighPart;
***************
*** 7039,7047 ****
          LLength.HighPart = 0;
          LLength.LowPart = count;
  
!         lock_ObtainMutex(&fidp->scp->mx);
          code = cm_LockCheckWrite(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseMutex(&fidp->scp->mx);
  
          if (code) {
              smb_ReleaseFID(fidp);
--- 7075,7083 ----
          LLength.HighPart = 0;
          LLength.LowPart = count;
  
!         lock_ObtainWrite(&fidp->scp->rw);
          code = cm_LockCheckWrite(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseWrite(&fidp->scp->rw);
  
          if (code) {
              smb_ReleaseFID(fidp);
***************
*** 7151,7156 ****
--- 7187,7193 ----
      unsigned short fd;
      unsigned pid;
      smb_fid_t *fidp;
+     smb_t *smbp = (smb_t*) inp;
      long code = 0;
      cm_user_t *userp;
      char *op;
***************
*** 7187,7193 ****
          LARGE_INTEGER LOffset, LLength;
          cm_key_t key;
  
!         pid = ((smb_t *) inp)->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = 0;
--- 7224,7230 ----
          LARGE_INTEGER LOffset, LLength;
          cm_key_t key;
  
!         pid = smbp->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = 0;
***************
*** 7195,7203 ****
          LLength.HighPart = 0;
          LLength.LowPart = count;
          
!         lock_ObtainMutex(&fidp->scp->mx);
          code = cm_LockCheckRead(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseMutex(&fidp->scp->mx);
      }
      if (code) {
          smb_ReleaseFID(fidp);
--- 7232,7240 ----
          LLength.HighPart = 0;
          LLength.LowPart = count;
          
!         lock_ObtainWrite(&fidp->scp->rw);
          code = cm_LockCheckRead(fidp->scp, LOffset, LLength, key);
!         lock_ReleaseWrite(&fidp->scp->rw);
      }
      if (code) {
          smb_ReleaseFID(fidp);
***************
*** 7543,7551 ****
  
      /* save a pointer to the vnode */
      fidp->scp = scp;
!     lock_ObtainMutex(&scp->mx);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseMutex(&scp->mx);
      
      /* and the user */
      fidp->userp = userp;
--- 7580,7588 ----
  
      /* save a pointer to the vnode */
      fidp->scp = scp;
!     lock_ObtainWrite(&scp->rw);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseWrite(&scp->rw);
      
      /* and the user */
      fidp->userp = userp;
***************
*** 7606,7612 ****
      scp = fidp->scp;
      cm_HoldSCache(scp);
      lock_ReleaseMutex(&fidp->mx);
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code == 0) {
--- 7643,7649 ----
      scp = fidp->scp;
      cm_HoldSCache(scp);
      lock_ReleaseMutex(&fidp->mx);
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code == 0) {
***************
*** 7629,7635 ****
          smb_SetSMBParm(outp, 1, (new_offset.LowPart>>16) & 0xffff);
          smb_SetSMBDataLength(outp, 0);
      }
!     lock_ReleaseMutex(&scp->mx);
      smb_ReleaseFID(fidp);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
--- 7666,7672 ----
          smb_SetSMBParm(outp, 1, (new_offset.LowPart>>16) & 0xffff);
          smb_SetSMBDataLength(outp, 0);
      }
!     lock_ReleaseWrite(&scp->rw);
      smb_ReleaseFID(fidp);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
***************
*** 8406,8412 ****
  {
      struct smb_packet *bufp;
      EVENT_HANDLE retHandle;
!     int i;
      char eventName[MAX_PATH];
  
      osi_assertx( idx < (sizeof(NCBs) / sizeof(NCBs[0])), "invalid index" );
--- 8443,8449 ----
  {
      struct smb_packet *bufp;
      EVENT_HANDLE retHandle;
!     afs_uint32 i;
      char eventName[MAX_PATH];
  
      osi_assertx( idx < (sizeof(NCBs) / sizeof(NCBs[0])), "invalid index" );
***************
*** 8440,8446 ****
      long code = 0;
      long len;
      long i;
!     int  session, thread;
      smb_vc_t *vcp = NULL;
      int flags = 0;
      char rname[NCBNAMSZ+1];
--- 8477,8483 ----
      long code = 0;
      long len;
      long i;
!     afs_uint32  session, thread;
      smb_vc_t *vcp = NULL;
      int flags = 0;
      char rname[NCBNAMSZ+1];
***************
*** 9632,9638 ****
      dos_ptr dos_ncb;
  #endif
      long code = 0;
!     int i;
      smb_vc_t *vcp;
  
      /*fprintf(stderr, "Entering smb_Shutdown\n");*/
--- 9669,9675 ----
      dos_ptr dos_ncb;
  #endif
      long code = 0;
!     afs_uint32 i;
      smb_vc_t *vcp;
  
      /*fprintf(stderr, "Entering smb_Shutdown\n");*/
***************
*** 9729,9737 ****
                  if (fidp->scp != NULL) {
                      scp = fidp->scp;
                      fidp->scp = NULL;
! 		    lock_ObtainMutex(&scp->mx);
  		    scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
! 		    lock_ReleaseMutex(&scp->mx);
  		    osi_Log2(smb_logp,"smb_Shutdown fidp 0x%p scp 0x%p", fidp, scp);
                      cm_ReleaseSCache(scp);
                  }
--- 9766,9774 ----
                  if (fidp->scp != NULL) {
                      scp = fidp->scp;
                      fidp->scp = NULL;
! 		    lock_ObtainWrite(&scp->rw);
  		    scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
! 		    lock_ReleaseWrite(&scp->rw);
  		    osi_Log2(smb_logp,"smb_Shutdown fidp 0x%p scp 0x%p", fidp, scp);
                      cm_ReleaseSCache(scp);
                  }
Index: openafs/src/WINNT/afsd/smb.h
diff -c openafs/src/WINNT/afsd/smb.h:1.41.2.26 openafs/src/WINNT/afsd/smb.h:1.41.2.27
*** openafs/src/WINNT/afsd/smb.h:1.41.2.26	Mon Feb 25 00:36:47 2008
--- openafs/src/WINNT/afsd/smb.h	Thu Feb 28 12:17:16 2008
***************
*** 495,503 ****
      int              state;
  } smb_waitingLock_t;
  
! #define SMB_WAITINGLOCKSTATE_WAITING 0
! #define SMB_WAITINGLOCKSTATE_DONE    1
! #define SMB_WAITINGLOCKSTATE_ERROR   2
  
  /* waiting lock request */
  typedef struct smb_waitingLockRequest {
--- 495,504 ----
      int              state;
  } smb_waitingLock_t;
  
! #define SMB_WAITINGLOCKSTATE_WAITING   0
! #define SMB_WAITINGLOCKSTATE_DONE      1
! #define SMB_WAITINGLOCKSTATE_ERROR     2
! #define SMB_WAITINGLOCKSTATE_CANCELLED 3
  
  /* waiting lock request */
  typedef struct smb_waitingLockRequest {
***************
*** 507,513 ****
      smb_packet_t *inp;
      smb_packet_t *outp;
      int           lockType;
!     time_t        timeRemaining;
      smb_waitingLock_t * locks;
  } smb_waitingLockRequest_t;
  
--- 508,515 ----
      smb_packet_t *inp;
      smb_packet_t *outp;
      int           lockType;
!     time_t        start_t;              /* osi_Time */
!     afs_uint32    msTimeout;            /* msecs, 0xFFFFFFFF = wait forever */
      smb_waitingLock_t * locks;
  } smb_waitingLockRequest_t;
  
***************
*** 729,746 ****
  extern int smb_SUser(cm_user_t *userp);
  
  #ifndef DJGPP
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
  	cm_user_t *userp, long *writtenp);
  #else /* DJGPP */
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count, char *op,
  	cm_user_t *userp, long *writtenp, int dosflag);
  #endif /* !DJGPP */
  
  #ifndef DJGPP
! extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count,
  	char *op, cm_user_t *userp, long *readp);
  #else /* DJGPP */
! extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, long count,
  	char *op, cm_user_t *userp, long *readp, int dosflag);
  #endif /* !DJGPP */
  
--- 731,748 ----
  extern int smb_SUser(cm_user_t *userp);
  
  #ifndef DJGPP
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char *op,
  	cm_user_t *userp, long *writtenp);
  #else /* DJGPP */
! long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char *op,
  	cm_user_t *userp, long *writtenp, int dosflag);
  #endif /* !DJGPP */
  
  #ifndef DJGPP
! extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count,
  	char *op, cm_user_t *userp, long *readp);
  #else /* DJGPP */
! extern long smb_ReadData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count,
  	char *op, cm_user_t *userp, long *readp, int dosflag);
  #endif /* !DJGPP */
  
Index: openafs/src/WINNT/afsd/smb3.c
diff -c openafs/src/WINNT/afsd/smb3.c:1.95.2.55 openafs/src/WINNT/afsd/smb3.c:1.95.2.58
*** openafs/src/WINNT/afsd/smb3.c:1.95.2.55	Fri Feb 22 19:17:35 2008
--- openafs/src/WINNT/afsd/smb3.c	Sun Mar  9 11:25:02 2008
***************
*** 75,84 ****
      if ( smb_ExecutableExtensions == NULL || name == NULL)
          return 0;
  
!     len = strlen(name);
  
      for ( i=0; smb_ExecutableExtensions[i]; i++) {
!         j = len - strlen(smb_ExecutableExtensions[i]);
          if (_stricmp(smb_ExecutableExtensions[i], &name[j]) == 0)
              return 1;
      }
--- 75,84 ----
      if ( smb_ExecutableExtensions == NULL || name == NULL)
          return 0;
  
!     len = (int)strlen(name);
  
      for ( i=0; smb_ExecutableExtensions[i]; i++) {
!         j = len - (int)strlen(smb_ExecutableExtensions[i]);
          if (_stricmp(smb_ExecutableExtensions[i], &name[j]) == 0)
              return 1;
      }
***************
*** 2421,2429 ****
      /* save a pointer to the vnode */
      osi_Log2(smb_logp,"smb_ReceiveTran2Open fidp 0x%p scp 0x%p", fidp, scp);
      fidp->scp = scp;
!     lock_ObtainMutex(&scp->mx);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseMutex(&scp->mx);
      
      /* and the user */
      fidp->userp = userp;
--- 2421,2429 ----
      /* save a pointer to the vnode */
      osi_Log2(smb_logp,"smb_ReceiveTran2Open fidp 0x%p scp 0x%p", fidp, scp);
      fidp->scp = scp;
!     lock_ObtainWrite(&scp->rw);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseWrite(&scp->rw);
      
      /* and the user */
      fidp->userp = userp;
***************
*** 2447,2453 ****
      /* copy out remainder of the parms */
      parmSlot = 0;
      outp->parmsp[parmSlot++] = fidp->fid;
!     lock_ObtainMutex(&scp->mx);
      if (extraInfo) {
          outp->parmsp[parmSlot++] = smb_Attributes(scp);
          smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime);
--- 2447,2453 ----
      /* copy out remainder of the parms */
      parmSlot = 0;
      outp->parmsp[parmSlot++] = fidp->fid;
!     lock_ObtainRead(&scp->rw);
      if (extraInfo) {
          outp->parmsp[parmSlot++] = smb_Attributes(scp);
          smb_SearchTimeFromUnixTime(&dosTime, scp->clientModTime);
***************
*** 2469,2475 ****
          outp->parmsp[parmSlot++] = 0; 
          outp->parmsp[parmSlot++] = 0; 
      }   
!     lock_ReleaseMutex(&scp->mx);
      outp->totalData = 0;		/* total # of data bytes */
      outp->totalParms = parmSlot * 2;	/* shorts are two bytes */
  
--- 2469,2475 ----
          outp->parmsp[parmSlot++] = 0; 
          outp->parmsp[parmSlot++] = 0; 
      }   
!     lock_ReleaseRead(&scp->rw);
      outp->totalData = 0;		/* total # of data bytes */
      outp->totalParms = parmSlot * 2;	/* shorts are two bytes */
  
***************
*** 2863,2869 ****
      }
  #endif /* DFS_SUPPORT */
  
!     lock_ObtainMutex(&scp->mx);
      scp_mx_held = 1;
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
--- 2863,2869 ----
      }
  #endif /* DFS_SUPPORT */
  
!     lock_ObtainWrite(&scp->rw);
      scp_mx_held = 1;
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
***************
*** 2871,2876 ****
--- 2871,2878 ----
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
          
+     lock_ConvertWToR(&scp->rw);
+ 
      /* now we have the status in the cache entry, and everything is locked.
       * Marshall the output data.
       */
***************
*** 2889,2895 ****
          goto done;
      }
      else if (infoLevel == SMB_QUERY_FILE_NAME_INFO) {
! 	len = strlen(lastComp);
  	qpi.u.QPfileNameInfo.fileNameLength = (len + 1) * 2;
          mbstowcs((unsigned short *)qpi.u.QPfileNameInfo.fileName, lastComp, len + 1);
  
--- 2891,2897 ----
          goto done;
      }
      else if (infoLevel == SMB_QUERY_FILE_NAME_INFO) {
! 	len = (unsigned int)strlen(lastComp);
  	qpi.u.QPfileNameInfo.fileNameLength = (len + 1) * 2;
          mbstowcs((unsigned short *)qpi.u.QPfileNameInfo.fileName, lastComp, len + 1);
  
***************
*** 2929,2935 ****
          qpi.u.QPfileStandardInfo.reserved = 0;
  
      	if (fidp) {
! 	    lock_ReleaseMutex(&scp->mx);
  	    scp_mx_held = 0;
  	    lock_ObtainMutex(&fidp->mx);
  	    delonclose = fidp->flags & SMB_FID_DELONCLOSE;
--- 2931,2937 ----
          qpi.u.QPfileStandardInfo.reserved = 0;
  
      	if (fidp) {
! 	    lock_ReleaseRead(&scp->rw);
  	    scp_mx_held = 0;
  	    lock_ObtainMutex(&fidp->mx);
  	    delonclose = fidp->flags & SMB_FID_DELONCLOSE;
***************
*** 2967,2973 ****
  	qpi.u.QPfileAllInfo.currentByteOffset.LowPart = 0;
  	qpi.u.QPfileAllInfo.mode = 0;
  	qpi.u.QPfileAllInfo.alignmentRequirement = 0;
! 	len = strlen(lastComp);
  	qpi.u.QPfileAllInfo.fileNameLength = (len + 1) * 2;
          mbstowcs((unsigned short *)qpi.u.QPfileAllInfo.fileName, lastComp, len + 1);
      }
--- 2969,2975 ----
  	qpi.u.QPfileAllInfo.currentByteOffset.LowPart = 0;
  	qpi.u.QPfileAllInfo.mode = 0;
  	qpi.u.QPfileAllInfo.alignmentRequirement = 0;
! 	len = (unsigned int)strlen(lastComp);
  	qpi.u.QPfileAllInfo.fileNameLength = (len + 1) * 2;
          mbstowcs((unsigned short *)qpi.u.QPfileAllInfo.fileName, lastComp, len + 1);
      }
***************
*** 2975,2981 ****
      /* send and free the packets */
    done:
      if (scp_mx_held)
! 	lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      if (code == 0) {
--- 2977,2983 ----
      /* send and free the packets */
    done:
      if (scp_mx_held)
! 	lock_ReleaseRead(&scp->rw);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      if (code == 0) {
***************
*** 3149,3167 ****
          /* lock the vnode with a callback; we need the current status
           * to determine what the new status is, in some cases.
           */
!         lock_ObtainMutex(&scp->mx);
          code = cm_SyncOp(scp, NULL, userp, &req, 0,
                            CM_SCACHESYNC_GETSTATUS
                           | CM_SCACHESYNC_NEEDCALLBACK);
          if (code) {
! 	    lock_ReleaseMutex(&scp->mx);
              goto done;
          }
  	cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
! 	lock_ReleaseMutex(&scp->mx);
  	lock_ObtainMutex(&fidp->mx);
! 	lock_ObtainMutex(&scp->mx);
  
          /* prepare for setattr call */
          attr.mask = CM_ATTRMASK_LENGTH;
--- 3151,3169 ----
          /* lock the vnode with a callback; we need the current status
           * to determine what the new status is, in some cases.
           */
!         lock_ObtainWrite(&scp->rw);
          code = cm_SyncOp(scp, NULL, userp, &req, 0,
                            CM_SCACHESYNC_GETSTATUS
                           | CM_SCACHESYNC_NEEDCALLBACK);
          if (code) {
! 	    lock_ReleaseWrite(&scp->rw);
              goto done;
          }
  	cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
! 	lock_ReleaseWrite(&scp->rw);
  	lock_ObtainMutex(&fidp->mx);
! 	lock_ObtainRead(&scp->rw);
  
          /* prepare for setattr call */
          attr.mask = CM_ATTRMASK_LENGTH;
***************
*** 3188,3194 ****
                  attr.unixModeBits = scp->unixModeBits | 0222;
              }
          }
!         lock_ReleaseMutex(&scp->mx);
  	lock_ReleaseMutex(&fidp->mx);
  
          /* call setattr */
--- 3190,3196 ----
                  attr.unixModeBits = scp->unixModeBits | 0222;
              }
          }
!         lock_ReleaseRead(&scp->rw);
  	lock_ReleaseMutex(&fidp->mx);
  
          /* call setattr */
***************
*** 3230,3235 ****
--- 3232,3238 ----
      cm_scache_t *scp;
      smb_tran2QFileInfo_t qfi;
      long code = 0;
+     int  readlock = 0;
      cm_req_t req;
  
      cm_InitReq(&req);
***************
*** 3288,3294 ****
      osi_Log2(smb_logp,"smb_ReleaseTran2QFileInfo fidp 0x%p scp 0x%p", fidp, scp);
      cm_HoldSCache(scp);
      lock_ReleaseMutex(&fidp->mx);
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
--- 3291,3297 ----
      osi_Log2(smb_logp,"smb_ReleaseTran2QFileInfo fidp 0x%p scp 0x%p", fidp, scp);
      cm_HoldSCache(scp);
      lock_ReleaseMutex(&fidp->mx);
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
***************
*** 3296,3301 ****
--- 3299,3307 ----
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
+     lock_ConvertWToR(&scp->rw);
+     readlock = 1;
+ 
      /* now we have the status in the cache entry, and everything is locked.
       * Marshall the output data.
       */
***************
*** 3325,3333 ****
          unsigned long len;
          char *name;
  
! 	lock_ReleaseMutex(&scp->mx);
  	lock_ObtainMutex(&fidp->mx);
! 	lock_ObtainMutex(&scp->mx);
          if (fidp->NTopen_wholepathp)
              name = fidp->NTopen_wholepathp;
          else
--- 3331,3339 ----
          unsigned long len;
          char *name;
  
! 	lock_ReleaseRead(&scp->rw);
  	lock_ObtainMutex(&fidp->mx);
! 	lock_ObtainRead(&scp->rw);
          if (fidp->NTopen_wholepathp)
              name = fidp->NTopen_wholepathp;
          else
***************
*** 3341,3347 ****
  
      /* send and free the packets */
    done:
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      smb_ReleaseFID(fidp);
--- 3347,3356 ----
  
      /* send and free the packets */
    done:
!     if (readlock)
!         lock_ReleaseRead(&scp->rw);
!     else
!         lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      smb_ReleaseFID(fidp);
***************
*** 3443,3462 ****
  	/* lock the vnode with a callback; we need the current status
           * to determine what the new status is, in some cases.
           */
!         lock_ObtainMutex(&scp->mx);
          code = cm_SyncOp(scp, NULL, userp, &req, 0,
                            CM_SCACHESYNC_GETSTATUS
                           | CM_SCACHESYNC_NEEDCALLBACK);
          if (code) {
! 	    lock_ReleaseMutex(&scp->mx);
              goto done;
  	}
  
  	cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
! 	lock_ReleaseMutex(&scp->mx);
  	lock_ObtainMutex(&fidp->mx);
! 	lock_ObtainMutex(&scp->mx);
  
          /* prepare for setattr call */
          attr.mask = 0;
--- 3452,3471 ----
  	/* lock the vnode with a callback; we need the current status
           * to determine what the new status is, in some cases.
           */
!         lock_ObtainWrite(&scp->rw);
          code = cm_SyncOp(scp, NULL, userp, &req, 0,
                            CM_SCACHESYNC_GETSTATUS
                           | CM_SCACHESYNC_NEEDCALLBACK);
          if (code) {
! 	    lock_ReleaseWrite(&scp->rw);
              goto done;
  	}
  
  	cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
! 	lock_ReleaseWrite(&scp->rw);
  	lock_ObtainMutex(&fidp->mx);
! 	lock_ObtainRead(&scp->rw);
  
          /* prepare for setattr call */
          attr.mask = 0;
***************
*** 3488,3494 ****
                  attr.unixModeBits = scp->unixModeBits | 0222;
              }
          }
!         lock_ReleaseMutex(&scp->mx);
  	lock_ReleaseMutex(&fidp->mx);
  
          /* call setattr */
--- 3497,3503 ----
                  attr.unixModeBits = scp->unixModeBits | 0222;
              }
          }
!         lock_ReleaseRead(&scp->rw);
  	lock_ReleaseMutex(&fidp->mx);
  
          /* call setattr */
***************
*** 3633,3640 ****
      osi_Log2(smb_logp,"ReceiveTran2GetDfsReferral [%d][%s]", 
               maxReferralLevel, osi_LogSaveString(smb_logp, requestFileName));
  
!     nbnLen = strlen(cm_NetbiosName);
!     reqLen = strlen(requestFileName);
  
      if (reqLen > nbnLen + 2 && requestFileName[0] == '\\' &&
          !_strnicmp(cm_NetbiosName,&requestFileName[1],nbnLen) &&
--- 3642,3649 ----
      osi_Log2(smb_logp,"ReceiveTran2GetDfsReferral [%d][%s]", 
               maxReferralLevel, osi_LogSaveString(smb_logp, requestFileName));
  
!     nbnLen = (int)strlen(cm_NetbiosName);
!     reqLen = (int)strlen(requestFileName);
  
      if (reqLen > nbnLen + 2 && requestFileName[0] == '\\' &&
          !_strnicmp(cm_NetbiosName,&requestFileName[1],nbnLen) &&
***************
*** 3711,3720 ****
                  /* scp should now be the DfsLink we are looking for */
                  if (scp) {
                      /* figure out how much of the input path was used */
!                     reqLen = nbnLen+2 + strlen(pathName) + 1 + strlen(lastComponent);
  
                      strcpy(referralPath, &scp->mountPointStringp[strlen("msdfs:")]);
!                     refLen = strlen(referralPath);
                      found = 1;
                  }
              } else {
--- 3720,3729 ----
                  /* scp should now be the DfsLink we are looking for */
                  if (scp) {
                      /* figure out how much of the input path was used */
!                     reqLen = (int)(nbnLen+2 + strlen(pathName) + 1 + strlen(lastComponent));
  
                      strcpy(referralPath, &scp->mountPointStringp[strlen("msdfs:")]);
!                     refLen = (int)strlen(referralPath);
                      found = 1;
                  }
              } else {
***************
*** 3798,3804 ****
      return 0;
  #else /* DFS_SUPPORT */
      osi_Log0(smb_logp,"ReceiveTran2GetDfsReferral - NOT_SUPPORTED"); 
!     return CM_ERROR_BADOP;
  #endif /* DFS_SUPPORT */
  }
  
--- 3807,3813 ----
      return 0;
  #else /* DFS_SUPPORT */
      osi_Log0(smb_logp,"ReceiveTran2GetDfsReferral - NOT_SUPPORTED"); 
!     return CM_ERROR_NOSUCHDEVICE;
  #endif /* DFS_SUPPORT */
  }
  
***************
*** 3843,3852 ****
      if (code == 0 && !(rights & PRSFS_READ))
          mustFake = 1;
      else if (code == -1) {
!         lock_ObtainMutex(&dscp->mx);
          code = cm_SyncOp(dscp, NULL, userp, reqp, PRSFS_READ,
                            CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!         lock_ReleaseMutex(&dscp->mx);
          if (code == CM_ERROR_NOACCESS) {
              mustFake = 1;
              code = 0;
--- 3852,3861 ----
      if (code == 0 && !(rights & PRSFS_READ))
          mustFake = 1;
      else if (code == -1) {
!         lock_ObtainWrite(&dscp->rw);
          code = cm_SyncOp(dscp, NULL, userp, reqp, PRSFS_READ,
                            CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
!         lock_ReleaseWrite(&dscp->rw);
          if (code == CM_ERROR_NOACCESS) {
              mustFake = 1;
              code = 0;
***************
*** 3866,3877 ****
          if (code) 
              continue;
  
!         lock_ObtainMutex(&scp->mx);
          if (mustFake == 0)
              code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                               CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
          if (mustFake || code) { 
!             lock_ReleaseMutex(&scp->mx);
  
              dptr = patchp->dptr;
  
--- 3875,3886 ----
          if (code) 
              continue;
  
!         lock_ObtainWrite(&scp->rw);
          if (mustFake == 0)
              code = cm_SyncOp(scp, NULL, userp, reqp, 0,
                               CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
          if (mustFake || code) { 
!             lock_ReleaseWrite(&scp->rw);
  
              dptr = patchp->dptr;
  
***************
*** 3985,3991 ****
          /* now watch for a symlink */
          code = 0;
          while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) {
!             lock_ReleaseMutex(&scp->mx);
              snprintf(path, AFSPATHMAX, "%s\\%s", relPathp ? relPathp : "", patchp->dep->name);
              reqp->relPathp = path;
              reqp->tidPathp = tidPathp;
--- 3994,4000 ----
          /* now watch for a symlink */
          code = 0;
          while (code == 0 && scp->fileType == CM_SCACHETYPE_SYMLINK) {
!             lock_ReleaseWrite(&scp->rw);
              snprintf(path, AFSPATHMAX, "%s\\%s", relPathp ? relPathp : "", patchp->dep->name);
              reqp->relPathp = path;
              reqp->tidPathp = tidPathp;
***************
*** 4001,4009 ****
                  cm_ReleaseSCache(scp);
                  scp = targetScp;
              }
!             lock_ObtainMutex(&scp->mx);
          }
  
          dptr = patchp->dptr;
  
          if (infoLevel >= SMB_FIND_FILE_DIRECTORY_INFO) {
--- 4010,4020 ----
                  cm_ReleaseSCache(scp);
                  scp = targetScp;
              }
!             lock_ObtainWrite(&scp->rw);
          }
  
+         lock_ConvertWToR(&scp->rw);
+ 
          dptr = patchp->dptr;
  
          if (infoLevel >= SMB_FIND_FILE_DIRECTORY_INFO) {
***************
*** 4105,4111 ****
              *dptr++ = (attr >> 8) & 0xff;
          }
  
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
      }
          
--- 4116,4122 ----
              *dptr++ = (attr >> 8) & 0xff;
          }
  
!         lock_ReleaseRead(&scp->rw);
          cm_ReleaseSCache(scp);
      }
          
***************
*** 4536,4542 ****
          ohbytes += 4;           /* EASIZE */
  
      /* add header to name & term. null */
!     onbytes = strlen(maskp);
      orbytes = ohbytes + onbytes + 1;
  
      /* now, we round up the record to a 4 byte alignment, and we make
--- 4547,4553 ----
          ohbytes += 4;           /* EASIZE */
  
      /* add header to name & term. null */
!     onbytes = (int)strlen(maskp);
      orbytes = ohbytes + onbytes + 1;
  
      /* now, we round up the record to a 4 byte alignment, and we make
***************
*** 4924,4936 ****
               * and so we do another hold now.
               */
              cm_HoldSCache(scp);
!             lock_ObtainMutex(&scp->mx);
              if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0 &&
                   LargeIntegerGreaterOrEqualToZero(scp->bulkStatProgress)) {
                  scp->flags |= CM_SCACHEFLAG_BULKSTATTING;
                  dsp->flags |= SMB_DIRSEARCH_BULKST;
              }
!             lock_ReleaseMutex(&scp->mx);
          } 
      }
      lock_ReleaseMutex(&dsp->mx);
--- 4935,4947 ----
               * and so we do another hold now.
               */
              cm_HoldSCache(scp);
!             lock_ObtainWrite(&scp->rw);
              if ((scp->flags & CM_SCACHEFLAG_BULKSTATTING) == 0 &&
                   LargeIntegerGreaterOrEqualToZero(scp->bulkStatProgress)) {
                  scp->flags |= CM_SCACHEFLAG_BULKSTATTING;
                  dsp->flags |= SMB_DIRSEARCH_BULKST;
              }
!             lock_ReleaseWrite(&scp->rw);
          } 
      }
      lock_ReleaseMutex(&dsp->mx);
***************
*** 4943,4953 ****
      }
  
      /* get the directory size */
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseMutex(&scp->mx);
          cm_ReleaseSCache(scp);
          cm_ReleaseUser(userp);
          smb_FreeTran2Packet(outp);
--- 4954,4964 ----
      }
  
      /* get the directory size */
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) {
!         lock_ReleaseWrite(&scp->rw);
          cm_ReleaseSCache(scp);
          cm_ReleaseUser(userp);
          smb_FreeTran2Packet(outp);
***************
*** 5029,5035 ****
                  buf_Release(bufferp);
                  bufferp = NULL;
              }       
!             lock_ReleaseMutex(&scp->mx);
              code = buf_Get(scp, &thyper, &bufferp);
              lock_ObtainMutex(&dsp->mx);
  
--- 5040,5046 ----
                  buf_Release(bufferp);
                  bufferp = NULL;
              }       
!             lock_ReleaseWrite(&scp->rw);
              code = buf_Get(scp, &thyper, &bufferp);
              lock_ObtainMutex(&dsp->mx);
  
***************
*** 5039,5045 ****
              if (starPattern) {
                  code2 = smb_ApplyV3DirListPatches(scp, &dirListPatchesp, dsp->tidPath, dsp->relPath, infoLevel, userp, &req);
                  
!                 lock_ObtainMutex(&scp->mx);
                  if ((dsp->flags & SMB_DIRSEARCH_BULKST) &&
                      LargeIntegerGreaterThanOrEqualTo(thyper, scp->bulkStatProgress)) {
                      /* Don't bulk stat if risking timeout */
--- 5050,5056 ----
              if (starPattern) {
                  code2 = smb_ApplyV3DirListPatches(scp, &dirListPatchesp, dsp->tidPath, dsp->relPath, infoLevel, userp, &req);
                  
!                 lock_ObtainWrite(&scp->rw);
                  if ((dsp->flags & SMB_DIRSEARCH_BULKST) &&
                      LargeIntegerGreaterThanOrEqualTo(thyper, scp->bulkStatProgress)) {
                      /* Don't bulk stat if risking timeout */
***************
*** 5052,5058 ****
                          code = cm_TryBulkStat(scp, &thyper, userp, &req);
                  }
              } else {
!                 lock_ObtainMutex(&scp->mx);
              }
              lock_ReleaseMutex(&dsp->mx);
              if (code) {
--- 5063,5069 ----
                          code = cm_TryBulkStat(scp, &thyper, userp, &req);
                  }
              } else {
!                 lock_ObtainWrite(&scp->rw);
              }
              lock_ReleaseMutex(&dsp->mx);
              if (code) {
***************
*** 5333,5339 ****
      }
  
      /* release the mutex */
!     lock_ReleaseMutex(&scp->mx);
      if (bufferp) {
          buf_Release(bufferp);
  	bufferp = NULL;
--- 5344,5350 ----
      }
  
      /* release the mutex */
!     lock_ReleaseWrite(&scp->rw);
      if (bufferp) {
          buf_Release(bufferp);
  	bufferp = NULL;
***************
*** 5698,5706 ****
      lock_ObtainMutex(&fidp->mx);
      /* save a pointer to the vnode */
      fidp->scp = scp;
!     lock_ObtainMutex(&scp->mx);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseMutex(&scp->mx);
      osi_Log2(smb_logp,"smb_ReceiveV3OpenX fidp 0x%p scp 0x%p", fidp, scp);
      /* also the user */
      fidp->userp = userp;
--- 5709,5717 ----
      lock_ObtainMutex(&fidp->mx);
      /* save a pointer to the vnode */
      fidp->scp = scp;
!     lock_ObtainWrite(&scp->rw);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseWrite(&scp->rw);
      osi_Log2(smb_logp,"smb_ReceiveV3OpenX fidp 0x%p scp 0x%p", fidp, scp);
      /* also the user */
      fidp->userp = userp;
***************
*** 5726,5732 ****
      /* copy out remainder of the parms */
      parmSlot = 2;
      smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++;
!     lock_ObtainMutex(&scp->mx);
      if (extraInfo) {
          smb_SetSMBParm(outp, parmSlot, smb_Attributes(scp)); parmSlot++;
          smb_DosUTimeFromUnixTime(&dosTime, scp->clientModTime);
--- 5737,5743 ----
      /* copy out remainder of the parms */
      parmSlot = 2;
      smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++;
!     lock_ObtainRead(&scp->rw);
      if (extraInfo) {
          smb_SetSMBParm(outp, parmSlot, smb_Attributes(scp)); parmSlot++;
          smb_DosUTimeFromUnixTime(&dosTime, scp->clientModTime);
***************
*** 5744,5750 ****
      smb_SetSMBParm(outp, parmSlot, scp->fid.vnode & 0xffff); parmSlot++;
      smb_SetSMBParm(outp, parmSlot, scp->fid.volume & 0xffff); parmSlot++;
      smb_SetSMBParm(outp, parmSlot, 0); parmSlot++;
!     lock_ReleaseMutex(&scp->mx);
      smb_SetSMBDataLength(outp, 0);
  
      osi_Log1(smb_logp, "SMB OpenX opening fid %d", fidp->fid);
--- 5755,5761 ----
      smb_SetSMBParm(outp, parmSlot, scp->fid.vnode & 0xffff); parmSlot++;
      smb_SetSMBParm(outp, parmSlot, scp->fid.volume & 0xffff); parmSlot++;
      smb_SetSMBParm(outp, parmSlot, 0); parmSlot++;
!     lock_ReleaseRead(&scp->rw);
      smb_SetSMBDataLength(outp, 0);
  
      osi_Log1(smb_logp, "SMB OpenX opening fid %d", fidp->fid);
***************
*** 5789,5795 ****
      cm_scache_t *scp;
      unsigned char LockType;
      unsigned short NumberOfUnlocks, NumberOfLocks;
!     long Timeout;
      char *op;
      char *op_locks;
      LARGE_INTEGER LOffset, LLength;
--- 5800,5806 ----
      cm_scache_t *scp;
      unsigned char LockType;
      unsigned short NumberOfUnlocks, NumberOfLocks;
!     afs_uint32 Timeout;
      char *op;
      char *op_locks;
      LARGE_INTEGER LOffset, LLength;
***************
*** 5833,5839 ****
      userp = smb_GetUserFromVCP(vcp, inp);
  
  
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK
  			 | CM_SCACHESYNC_GETSTATUS
--- 5844,5850 ----
      userp = smb_GetUserFromVCP(vcp, inp);
  
  
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK
  			 | CM_SCACHESYNC_GETSTATUS
***************
*** 5856,5873 ****
          LockType |= LOCKING_ANDX_SHARED_LOCK;
      }
  
!     if ((LockType & LOCKING_ANDX_CANCEL_LOCK) ||
!         (LockType & LOCKING_ANDX_CHANGE_LOCKTYPE)) {
! 
!         /* We don't support these requests.  Apparently, we can safely
!            not deal with them too. */
!         osi_Log1(smb_logp, "smb_ReceiveV3Locking received unsupported request [%s]",
!                  ((LockType & LOCKING_ANDX_CANCEL_LOCK)?
!                   "LOCKING_ANDX_CANCEL_LOCK":
!                   "LOCKING_ANDX_CHANGE_LOCKTYPE")); 
!         /* No need to call osi_LogSaveString since these are string
!            constants.*/
! 
          code = CM_ERROR_BADOP;
          goto done;
  
--- 5867,5875 ----
          LockType |= LOCKING_ANDX_SHARED_LOCK;
      }
  
!     if (LockType & LOCKING_ANDX_CHANGE_LOCKTYPE) {
!         /* AFS does not support atomic changes of lock types from read or write and vice-versa */
!         osi_Log0(smb_logp, "smb_ReceiveV3Locking received unsupported request [LOCKING_ANDX_CHANGE_LOCKTYPE]"); 
          code = CM_ERROR_BADOP;
          goto done;
  
***************
*** 5875,5880 ****
--- 5877,5911 ----
  
      op = smb_GetSMBData(inp, NULL);
  
+     if (LockType & LOCKING_ANDX_CANCEL_LOCK) {
+         /* Cancel outstanding lock requests */
+         smb_waitingLock_t * wl;
+ 
+         for (i=0; i<NumberOfLocks; i++) {
+             smb_GetLockParams(LockType, &op, &pid, &LOffset, &LLength);
+ 
+             key = cm_GenerateKey(vcp->vcID, pid, fidp->fid);
+ 
+             lock_ObtainWrite(&smb_globalLock);
+             for (wlRequest = smb_allWaitingLocks; wlRequest; wlRequest = (smb_waitingLockRequest_t *) osi_QNext(&wlRequest->q))
+             {
+                 for (wl = wlRequest->locks; wl; wl = (smb_waitingLock_t *) osi_QNext(&wl->q)) {
+                     if (wl->key == key && LargeIntegerEqualTo(wl->LOffset, LOffset) && 
+                         LargeIntegerEqualTo(wl->LLength, LLength)) {
+                         wl->state = SMB_WAITINGLOCKSTATE_CANCELLED;
+                         goto found_lock_request;
+                     }
+                 }
+             }
+           found_lock_request:
+             lock_ReleaseWrite(&smb_globalLock);
+         }
+         code = 0;
+         smb_SetSMBDataLength(outp, 0);
+         goto done;
+     }
+ 
+ 
      for (i=0; i<NumberOfUnlocks; i++) {
          smb_GetLockParams(LockType, &op, &pid, &LOffset, &LLength);
  
***************
*** 5925,5931 ****
                  wlRequest->inp = smb_CopyPacket(inp);
                  wlRequest->outp = smb_CopyPacket(outp);
                  wlRequest->lockType = LockType;
!                 wlRequest->timeRemaining = Timeout;
                  wlRequest->locks = NULL;
  
                  /* The waiting lock request needs to have enough
--- 5956,5963 ----
                  wlRequest->inp = smb_CopyPacket(inp);
                  wlRequest->outp = smb_CopyPacket(outp);
                  wlRequest->lockType = LockType;
!                 wlRequest->msTimeout = Timeout;
!                 wlRequest->start_t = osi_Time();
                  wlRequest->locks = NULL;
  
                  /* The waiting lock request needs to have enough
***************
*** 6045,6051 ****
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK);
  
    doneSync:
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      smb_ReleaseFID(fidp);
--- 6077,6083 ----
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_LOCK);
  
    doneSync:
!     lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      smb_ReleaseFID(fidp);
***************
*** 6062,6067 ****
--- 6094,6100 ----
      afs_uint32 searchTime;
      cm_user_t *userp;
      cm_req_t req;
+     int readlock = 0;
  
      cm_InitReq(&req);
  
***************
*** 6093,6099 ****
          
          
      /* otherwise, stat the file */
!     lock_ObtainMutex(&scp->mx);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
--- 6126,6132 ----
          
          
      /* otherwise, stat the file */
!     lock_ObtainWrite(&scp->rw);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                       CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
      if (code) 
***************
*** 6101,6106 ****
--- 6134,6141 ----
  
      cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
  
+     lock_ConvertWToR(&scp->rw);
+ 
      /* decode times.  We need a search time, but the response to this
       * call provides the date first, not the time, as returned in the
       * searchTime variable.  So we take the high-order bits first.
***************
*** 6127,6133 ****
      code = 0;
  
    done:
!     lock_ReleaseMutex(&scp->mx);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      smb_ReleaseFID(fidp);
--- 6162,6171 ----
      code = 0;
  
    done:
!     if (readlock) 
!         lock_ReleaseRead(&scp->rw);
!     else
!         lock_ReleaseWrite(&scp->rw);
      cm_ReleaseSCache(scp);
      cm_ReleaseUser(userp);
      smb_ReleaseFID(fidp);
***************
*** 6210,6215 ****
--- 6248,6254 ----
      unsigned short fd;
      unsigned pid;
      smb_fid_t *fidp;
+     smb_t *smbp = (smb_t*) inp;
      long code = 0;
      cm_user_t *userp;
      char *op;
***************
*** 6274,6280 ****
          LARGE_INTEGER LLength;
          cm_scache_t * scp;
  
!         pid = ((smb_t *) inp)->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = offset.HighPart;
--- 6313,6319 ----
          LARGE_INTEGER LLength;
          cm_scache_t * scp;
  
!         pid = smbp->pid;
          key = cm_GenerateKey(vcp->vcID, pid, fd);
  
          LOffset.HighPart = offset.HighPart;
***************
*** 6283,6291 ****
          LLength.LowPart = count;
  
          scp = fidp->scp;
!         lock_ObtainMutex(&scp->mx);
          code = cm_LockCheckWrite(scp, LOffset, LLength, key);
!         lock_ReleaseMutex(&scp->mx);
  
          if (code)
              goto done;
--- 6322,6330 ----
          LLength.LowPart = count;
  
          scp = fidp->scp;
!         lock_ObtainWrite(&scp->rw);
          code = cm_LockCheckWrite(scp, LOffset, LLength, key);
!         lock_ReleaseWrite(&scp->rw);
  
          if (code)
              goto done;
***************
*** 6325,6332 ****
          written = 0;
      }
  
-  done_writing:
-     
      /* slots 0 and 1 are reserved for request chaining and will be
         filled in when we return. */
      smb_SetSMBParm(outp, 2, total_written);
--- 6364,6369 ----
***************
*** 6350,6355 ****
--- 6387,6393 ----
      unsigned short fd;
      unsigned pid;
      smb_fid_t *fidp;
+     smb_t *smbp = (smb_t*) inp;
      long code = 0;
      cm_user_t *userp;
      cm_key_t key;
***************
*** 6396,6402 ****
          return CM_ERROR_NOSUCHFILE;
      }
  
!     pid = ((smb_t *) inp)->pid;
      key = cm_GenerateKey(vcp->vcID, pid, fd);
      {
          LARGE_INTEGER LOffset, LLength;
--- 6434,6440 ----
          return CM_ERROR_NOSUCHFILE;
      }
  
!     pid = smbp->pid;
      key = cm_GenerateKey(vcp->vcID, pid, fd);
      {
          LARGE_INTEGER LOffset, LLength;
***************
*** 6408,6416 ****
          LLength.LowPart = count;
  
          scp = fidp->scp;
!         lock_ObtainMutex(&scp->mx);
          code = cm_LockCheckRead(scp, LOffset, LLength, key);
!         lock_ReleaseMutex(&scp->mx);
      }
  
      if (code) {
--- 6446,6454 ----
          LLength.LowPart = count;
  
          scp = fidp->scp;
!         lock_ObtainWrite(&scp->rw);
          code = cm_LockCheckRead(scp, LOffset, LLength, key);
!         lock_ReleaseWrite(&scp->rw);
      }
  
      if (code) {
***************
*** 6712,6718 ****
      fidflags = 0;
      if (desiredAccess & DELETE)
          fidflags |= SMB_FID_OPENDELETE;
!     if (desiredAccess & AFS_ACCESS_READ)
          fidflags |= SMB_FID_OPENREAD_LISTDIR;
      if (desiredAccess & AFS_ACCESS_WRITE)
          fidflags |= SMB_FID_OPENWRITE;
--- 6750,6756 ----
      fidflags = 0;
      if (desiredAccess & DELETE)
          fidflags |= SMB_FID_OPENDELETE;
!     if (desiredAccess & (AFS_ACCESS_READ|AFS_ACCESS_EXECUTE))
          fidflags |= SMB_FID_OPENREAD_LISTDIR;
      if (desiredAccess & AFS_ACCESS_WRITE)
          fidflags |= SMB_FID_OPENWRITE;
***************
*** 7213,7219 ****
          LLength.LowPart = SMB_FID_QLOCK_LENGTH;
  
          /* If we are not opening the file for writing, then we don't
!            try to get an exclusive lock.  Noone else should be able to
             get an exclusive lock on the file anyway, although someone
             else can get a shared lock. */
          if ((fidflags & SMB_FID_SHARE_READ) ||
--- 7251,7257 ----
          LLength.LowPart = SMB_FID_QLOCK_LENGTH;
  
          /* If we are not opening the file for writing, then we don't
!            try to get an exclusive lock.  No one else should be able to
             get an exclusive lock on the file anyway, although someone
             else can get a shared lock. */
          if ((fidflags & SMB_FID_SHARE_READ) ||
***************
*** 7225,7233 ****
  
          key = cm_GenerateKey(vcp->vcID, SMB_FID_QLOCK_PID, fidp->fid);
          
!         lock_ObtainMutex(&scp->mx);
          code = cm_Lock(scp, sLockType, LOffset, LLength, key, 0, userp, &req, NULL);
!         lock_ReleaseMutex(&scp->mx);
  
          if (code) {
  	    if (ldp)
--- 7263,7271 ----
  
          key = cm_GenerateKey(vcp->vcID, SMB_FID_QLOCK_PID, fidp->fid);
          
!         lock_ObtainWrite(&scp->rw);
          code = cm_Lock(scp, sLockType, LOffset, LLength, key, 0, userp, &req, NULL);
!         lock_ReleaseWrite(&scp->rw);
  
          if (code) {
  	    if (ldp)
***************
*** 7251,7259 ****
      lock_ObtainMutex(&fidp->mx);
      /* save a pointer to the vnode */
      fidp->scp = scp;    /* Hold transfered to fidp->scp and no longer needed */
!     lock_ObtainMutex(&scp->mx);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseMutex(&scp->mx);
      osi_Log2(smb_logp,"smb_ReceiveNTCreateX fidp 0x%p scp 0x%p", fidp, scp);
  
      fidp->flags = fidflags;
--- 7289,7297 ----
      lock_ObtainMutex(&fidp->mx);
      /* save a pointer to the vnode */
      fidp->scp = scp;    /* Hold transfered to fidp->scp and no longer needed */
!     lock_ObtainWrite(&scp->rw);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseWrite(&scp->rw);
      osi_Log2(smb_logp,"smb_ReceiveNTCreateX fidp 0x%p scp 0x%p", fidp, scp);
  
      fidp->flags = fidflags;
***************
*** 7286,7292 ****
  
      /* out parms */
      parmSlot = 2;
!     lock_ObtainMutex(&scp->mx);
      smb_SetSMBParmByte(outp, parmSlot, 0);	/* oplock */
      smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++;
      smb_SetSMBParmLong(outp, parmSlot, openAction); parmSlot += 2;
--- 7324,7330 ----
  
      /* out parms */
      parmSlot = 2;
!     lock_ObtainRead(&scp->rw);
      smb_SetSMBParmByte(outp, parmSlot, 0);	/* oplock */
      smb_SetSMBParm(outp, parmSlot, fidp->fid); parmSlot++;
      smb_SetSMBParmLong(outp, parmSlot, openAction); parmSlot += 2;
***************
*** 7314,7320 ****
                             fidp->scp->length.LowPart, fidp->scp->length.HighPart, 
                             userp);
      }
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %s", fidp->fid,
                osi_LogSaveString(smb_logp, realPathp));
--- 7352,7358 ----
                             fidp->scp->length.LowPart, fidp->scp->length.HighPart, 
                             userp);
      }
!     lock_ReleaseRead(&scp->rw);
  
      osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %s", fidp->fid,
                osi_LogSaveString(smb_logp, realPathp));
***************
*** 7516,7522 ****
      fidflags = 0;
      if (desiredAccess & DELETE)
          fidflags |= SMB_FID_OPENDELETE;
!     if (desiredAccess & AFS_ACCESS_READ)
          fidflags |= SMB_FID_OPENREAD_LISTDIR;
      if (desiredAccess & AFS_ACCESS_WRITE)
          fidflags |= SMB_FID_OPENWRITE;
--- 7554,7560 ----
      fidflags = 0;
      if (desiredAccess & DELETE)
          fidflags |= SMB_FID_OPENDELETE;
!     if (desiredAccess & (AFS_ACCESS_READ|AFS_ACCESS_EXECUTE))
          fidflags |= SMB_FID_OPENREAD_LISTDIR;
      if (desiredAccess & AFS_ACCESS_WRITE)
          fidflags |= SMB_FID_OPENWRITE;
***************
*** 7893,7901 ****
  
          key = cm_GenerateKey(vcp->vcID, SMB_FID_QLOCK_PID, fidp->fid);
          
!         lock_ObtainMutex(&scp->mx);
          code = cm_Lock(scp, sLockType, LOffset, LLength, key, 0, userp, &req, NULL);
!         lock_ReleaseMutex(&scp->mx);
  
          if (code) {
  	    if (ldp)
--- 7931,7939 ----
  
          key = cm_GenerateKey(vcp->vcID, SMB_FID_QLOCK_PID, fidp->fid);
          
!         lock_ObtainWrite(&scp->rw);
          code = cm_Lock(scp, sLockType, LOffset, LLength, key, 0, userp, &req, NULL);
!         lock_ReleaseWrite(&scp->rw);
  
          if (code) {
  	    if (ldp)
***************
*** 7917,7925 ****
      lock_ObtainMutex(&fidp->mx);
      /* save a pointer to the vnode */
      fidp->scp = scp;
!     lock_ObtainMutex(&scp->mx);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseMutex(&scp->mx);
      osi_Log2(smb_logp,"smb_ReceiveNTTranCreate fidp 0x%p scp 0x%p", fidp, scp);
  
      fidp->flags = fidflags;
--- 7955,7963 ----
      lock_ObtainMutex(&fidp->mx);
      /* save a pointer to the vnode */
      fidp->scp = scp;
!     lock_ObtainWrite(&scp->rw);
      scp->flags |= CM_SCACHEFLAG_SMB_FID;
!     lock_ReleaseWrite(&scp->rw);
      osi_Log2(smb_logp,"smb_ReceiveNTTranCreate fidp 0x%p scp 0x%p", fidp, scp);
  
      fidp->flags = fidflags;
***************
*** 7976,7982 ****
          smb_SetSMBParmByte(outp, parmSlot, 0);	/* Setup Count */
          smb_SetSMBDataLength(outp, 70);
  
!         lock_ObtainMutex(&scp->mx);
          outData = smb_GetSMBData(outp, NULL);
          outData++;			/* round to get to parmOffset */
          *outData = 0; outData++;	/* oplock */
--- 8014,8020 ----
          smb_SetSMBParmByte(outp, parmSlot, 0);	/* Setup Count */
          smb_SetSMBDataLength(outp, 70);
  
!         lock_ObtainRead(&scp->rw);
          outData = smb_GetSMBData(outp, NULL);
          outData++;			/* round to get to parmOffset */
          *outData = 0; outData++;	/* oplock */
***************
*** 7998,8004 ****
  				scp->fileType == CM_SCACHETYPE_MOUNTPOINT ||
  				scp->fileType == CM_SCACHETYPE_INVALID) ? 1 : 0);
          outData += 2;	/* is a dir? */
-         lock_ReleaseMutex(&scp->mx);
      } else {
          /* out parms */
          parmOffset = 8*4 + 39;
--- 8036,8041 ----
***************
*** 8026,8032 ****
          smb_SetSMBParmByte(outp, parmSlot, 0);	/* Setup Count */
          smb_SetSMBDataLength(outp, 105);
          
!         lock_ObtainMutex(&scp->mx);
          outData = smb_GetSMBData(outp, NULL);
          outData++;			/* round to get to parmOffset */
          *outData = 0; outData++;	/* oplock */
--- 8063,8069 ----
          smb_SetSMBParmByte(outp, parmSlot, 0);	/* Setup Count */
          smb_SetSMBDataLength(outp, 105);
          
!         lock_ObtainRead(&scp->rw);
          outData = smb_GetSMBData(outp, NULL);
          outData++;			/* round to get to parmOffset */
          *outData = 0; outData++;	/* oplock */
***************
*** 8051,8060 ****
          memset(outData,0,24); outData += 24; /* Volume ID and file ID */
          *((ULONG *)outData) = 0x001f01ffL; outData += 4; /* Maxmimal access rights */
          *((ULONG *)outData) = 0; outData += 4; /* Guest Access rights */
-         lock_ReleaseMutex(&scp->mx);
      }
  
-     lock_ObtainMutex(&scp->mx);
      if ((fidp->flags & SMB_FID_EXECUTABLE) && 
           LargeIntegerGreaterThanZero(fidp->scp->length) && 
           !(scp->flags & CM_SCACHEFLAG_PREFETCHING)) {
--- 8088,8095 ----
***************
*** 8062,8068 ****
                             fidp->scp->length.LowPart, fidp->scp->length.HighPart, 
                             userp);
      }
!     lock_ReleaseMutex(&scp->mx);
  
      osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid);
  
--- 8097,8103 ----
                             fidp->scp->length.LowPart, fidp->scp->length.HighPart, 
                             userp);
      }
!     lock_ReleaseRead(&scp->rw);
  
      osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid);
  
***************
*** 8145,8156 ****
      if (filter & FILE_NOTIFY_CHANGE_STREAM_WRITE)
  	osi_Log0(smb_logp, "      Notify Change Stream Write");
  
!     lock_ObtainMutex(&scp->mx);
      if (watchtree)
          scp->flags |= CM_SCACHEFLAG_WATCHEDSUBTREE;
      else
          scp->flags |= CM_SCACHEFLAG_WATCHED;
!     lock_ReleaseMutex(&scp->mx);
      smb_ReleaseFID(fidp);
  
      outp->flags |= SMB_PACKETFLAG_NOSEND;
--- 8180,8191 ----
      if (filter & FILE_NOTIFY_CHANGE_STREAM_WRITE)
  	osi_Log0(smb_logp, "      Notify Change Stream Write");
  
!     lock_ObtainWrite(&scp->rw);
      if (watchtree)
          scp->flags |= CM_SCACHEFLAG_WATCHEDSUBTREE;
      else
          scp->flags |= CM_SCACHEFLAG_WATCHED;
!     lock_ReleaseWrite(&scp->rw);
      smb_ReleaseFID(fidp);
  
      outp->flags |= SMB_PACKETFLAG_NOSEND;
***************
*** 8268,8273 ****
--- 8303,8314 ----
  	break;
      case 6:
          return smb_ReceiveNTTranQuerySecurityDesc(vcp, inp, outp);
+     case 7:
+         osi_Log0(smb_logp, "SMB NT Transact Query Quota - not implemented");
+         break;
+     case 8:
+         osi_Log0(smb_logp, "SMB NT Transact Set Quota - not implemented");
+         break;
      }
      return CM_ERROR_INVAL;
  }
***************
*** 8392,8403 ****
              lastWatch->nextp = nextWatch;
  
          /* Turn off WATCHED flag in dscp */
!         lock_ObtainMutex(&dscp->mx);
          if (wtree)
              dscp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE;
          else
              dscp->flags &= ~CM_SCACHEFLAG_WATCHED;
!         lock_ReleaseMutex(&dscp->mx);
  
          /* Convert to response packet */
          ((smb_t *) watch)->reb = SMB_FLAGS_SERVER_TO_CLIENT;
--- 8433,8444 ----
              lastWatch->nextp = nextWatch;
  
          /* Turn off WATCHED flag in dscp */
!         lock_ObtainWrite(&dscp->rw);
          if (wtree)
              dscp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE;
          else
              dscp->flags &= ~CM_SCACHEFLAG_WATCHED;
!         lock_ReleaseWrite(&dscp->rw);
  
          /* Convert to response packet */
          ((smb_t *) watch)->reb = SMB_FLAGS_SERVER_TO_CLIENT;
***************
*** 8542,8553 ****
  
                  scp = fidp->scp;
  		osi_Log2(smb_logp,"smb_ReceiveNTCancel fidp 0x%p scp 0x%p", fidp, scp);
!                 lock_ObtainMutex(&scp->mx);
                  if (watchtree)
                      scp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE;
                  else
                      scp->flags &= ~CM_SCACHEFLAG_WATCHED;
!                 lock_ReleaseMutex(&scp->mx);
                  smb_ReleaseFID(fidp);
              } else {
                  osi_Log2(smb_logp,"NTCancel unable to resolve fid [%d] in vcp[%x]", fid,vcp);
--- 8583,8594 ----
  
                  scp = fidp->scp;
  		osi_Log2(smb_logp,"smb_ReceiveNTCancel fidp 0x%p scp 0x%p", fidp, scp);
!                 lock_ObtainWrite(&scp->rw);
                  if (watchtree)
                      scp->flags &= ~CM_SCACHEFLAG_WATCHEDSUBTREE;
                  else
                      scp->flags &= ~CM_SCACHEFLAG_WATCHED;
!                 lock_ReleaseWrite(&scp->rw);
                  smb_ReleaseFID(fidp);
              } else {
                  osi_Log2(smb_logp,"NTCancel unable to resolve fid [%d] in vcp[%x]", fid,vcp);
Index: openafs/src/WINNT/afsrdr/afsrdr.c
diff -c openafs/src/WINNT/afsrdr/afsrdr.c:1.3.4.2 openafs/src/WINNT/afsrdr/afsrdr.c:removed
*** openafs/src/WINNT/afsrdr/afsrdr.c:1.3.4.2	Thu Jul 20 17:46:21 2006
--- openafs/src/WINNT/afsrdr/afsrdr.c	Sat Mar 22 21:01:36 2008
***************
*** 1,2648 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- /* versioning history
-  * 
-  * 03-jun 2005 (eric williams) entered into versioning
-  */
- 
- /* developer: eric williams,
-  *  center for information technology integration,
-  *  university of michigan, ann arbor
-  *
-  * comments: nativeafs@citi.umich.edu
-  */
- 
- #define IRPMJFUNCDESC		/* pull in text strings of the names of irp codes */
- #define RPC_SRV			/* which half of the rpc library to use */
- 
- #include <ntifs.h>
- #include <ntdddisk.h>
- #include <strsafe.h>
- #include <ksdebug.h>
- #include "ifs_rpc.h"
- #include "afsrdr.h"
- #include "kif.h"
- 
- 
- /*** notes ***/
- /* flag pooltag Io(sp)(sp) to check queryinfo requests for buffer overrun */
- 
- NTKERNELAPI
- NTSTATUS
- IoAllocateDriverObjectExtension(
-     IN PDRIVER_OBJECT DriverObject,
-     IN PVOID ClientIdentificationAddress,
-     IN ULONG DriverObjectExtensionSize,
-     OUT PVOID *DriverObjectExtension
-     );
- 
- /*** local structs ***/
- /* represents a specific file */
- struct afs_fcb
- {
-     FSRTL_COMMON_FCB_HEADER;		/* needed to interface with cache manager, etc. */
-     SECTION_OBJECT_POINTERS sectionPtrs;
-     ERESOURCE _resource;		/* pointed to by fcb_header->Resource */
-     ERESOURCE _pagingIoResource;
-     unsigned long fid;			/* a courtesy from the userland daemon (a good hash function) */
-     UCHAR delPending;
-     struct afs_ccb *ccb_list;		/* list of open instances */
-     SHARE_ACCESS share_access;		/* common access control */
-     PFILE_LOCK lock;
- };
- typedef struct afs_fcb afs_fcb_t;
- 
- /* represents an open instance of a file */
- struct afs_ccb
- {
-     struct afs_ccb *next;		/* these are chained as siblings, non-circularly */
-     ULONG access;			/* how this instance is opened */
-     wchar_t *name;			/* ptr to name buffer */
-     UNICODE_STRING str;			/* full name struct, for notification fns */
-     FILE_OBJECT *fo;			/* can get parent fcb from this */
-     LARGE_INTEGER cookie;		/* on enum ops, where we are */
-     wchar_t *filter;			/* on enum ops, what we are filtering on */
-     PACCESS_TOKEN token;		/* security data of opening app */
-     ULONG attribs;			/* is dir, etc. */
- };
- typedef struct afs_ccb afs_ccb_t;
- 
- 
- /*** globals ***/
- /* use wisely -- should be set by each thread in an arbitrary context */
- /* here mostly as a development convenience */
- DEVICE_OBJECT *RdrDevice, *ComDevice;
- struct AfsRdrExtension *rdrExt;
- struct ComExtension *comExt;
- 
- 
- /*** error and return handling ***/
- /* current code is stable without, but these should wrap all operations */
- /*#define TRY					try{
- #define EXCEPT(x, y)		} except(EXCEPTION_EXECUTE_HANDLER) \
- 							{ \
- 							KdBreakPoint(); \
- 							rpt4(("exception", "occurred")); \
- 							Irp->IoStatus.Status = x; \
- 							Irp->IoStatus.Information = y; \
- 							}*/
- #define TRY
- #define EXCEPT(x, y)
- 
- #define STATUS(st, in)			Irp->IoStatus.Information = (in), Irp->IoStatus.Status = (st)
- #define SYNC_FAIL(st)  \
- 		{	\
- 		STATUS(st, 0); \
- 		COMPLETE_NO_BOOST; \
- 		return st; \
- 		}
- #define SYNC_FAIL2(st, in)  \
- 		{	\
- 		STATUS(st, in); \
- 		COMPLETE_NO_BOOST; \
- 		return st; \
- 		}
- #define SYNC_RET(st)  \
- 		{	\
- 		STATUS(st, 0); \
- 		COMPLETE; \
- 		return st; \
- 		}
- #define SYNC_RET2(st, in)  \
- 		{	\
- 		STATUS(st, in); \
- 		COMPLETE; \
- 		return st; \
- 		}
- #define SYNC_FAIL_RPC_TIMEOUT		SYNC_FAIL(STATUS_NETWORK_BUSY)
- 
- #define LOCK_FCB_LIST			FsRtlEnterFileSystem(); ExAcquireFastMutex(&rdrExt->fcbLock);
- #define UNLOCK_FCB_LIST			ExReleaseFastMutex(&rdrExt->fcbLock); FsRtlExitFileSystem();
- 
- #define LOCK_FCB			ExAcquireResourceExclusiveLite(fcb->Resource, TRUE)
- #define SLOCK_FCB			ExAcquireResourceSharedLite(fcb->Resource, TRUE)
- #define UNLOCK_FCB			if (fcb) ExReleaseResourceLite(fcb->Resource)
- 
- #define LOCK_PAGING_FCB			ExAcquireResourceExclusiveLite(fcb->PagingIoResource, TRUE)
- #define SLOCK_PAGING_FCB		ExAcquireResourceSharedLite(fcb->PagingIoResource, TRUE)
- #define UNLOCK_PAGING_FCB		if (fcb) ExReleaseResourceLite(fcb->PagingIoResource)
- 
- /*** constants ***/
- #define AFS_RDR_TAG			(0x73666440)//@dfs//0x482ac230//0x3029a4f2
- #define MAX_PATH			700
- #define AFS_FS_NAME			L"Andrew File System"
- 
- #define COMM_IOCTL			(void*)0x01
- #define COMM_DOWNCALL			(void*)0x02
- #define COMM_UPCALLHOOK			(void*)0x03
- 
- /* flag to use caching kernel service.  needs to handle cache invalidation in more places.  */
- #define EXPLICIT_CACHING
- 
- /* dates from afs are time_t style -- seconds since 1970 */		/* 11644505691.6384 */
- #define AfsTimeToWindowsTime(x)		(((x)+11644505692L)*10000000L)	/*(1970L-1601L)*365.242199*24L*3600L)*/
- #define WindowsTimeToAfsTime(x)		((x)/10000000L-11644505692L)	/*(1970L-1601L)*365.242199*24L*3600L)*/
- #define IsDeviceFile(fo)		(!fo->FsContext)
- 
- 
- /*** auxiliary functions ***/
- #define COMPLETE_NO_BOOST		IoCompleteRequest(Irp, IO_NO_INCREMENT)
- #define COMPLETE			IoCompleteRequest(Irp, IO_NETWORK_INCREMENT)
- 
- afs_fcb_t *FindFcb(FILE_OBJECT *fo)
- {
-     if (fo)
-         return fo->FsContext;
-     return NULL;
- }
- 
- void *AfsFindBuffer(IRP *Irp)
- {
-     void *outPtr;
-     if (Irp->MdlAddress)
-     {
-         outPtr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
-         if (outPtr)
-             return outPtr;
-     }
-     outPtr = Irp->AssociatedIrp.SystemBuffer;
-     return outPtr;
- }
- 
- /* we do Resource locking because we don't want to figure out when to pull MainResource */
- BOOLEAN lazyWriteLock(PVOID context, BOOLEAN wait)
- {
-     afs_fcb_t *fcb = context;
-     ASSERT(fcb);
-     return ExAcquireResourceExclusiveLite(fcb->Resource, wait);
- }
- 	
- void lazyWriteUnlock(PVOID context)
- {
-     afs_fcb_t *fcb = context;
-     ASSERT(fcb);
-     ExReleaseResourceLite(fcb->Resource);
- }
- 
- BOOLEAN readAheadLock(PVOID context, BOOLEAN wait)
- {
-     afs_fcb_t *fcb = context;
-     ASSERT(fcb);
-     return ExAcquireResourceSharedLite(fcb->Resource, wait);
- }
- 
- void readAheadUnlock(PVOID context)
- {
-     afs_fcb_t *fcb = context;
-     ASSERT(fcb);
-     ExReleaseResourceLite(fcb->Resource);
- }
- 
- afs_fcb_t *find_fcb(ULONG fid)
- {
-     afs_fcb_t compare, *compare_ptr, **fcbp;
- 
-     compare.fid = fid;
-     compare_ptr = &compare;
-     fcbp = RtlLookupElementGenericTable(&rdrExt->fcbTable, (void*)&compare_ptr);
- 
-     if (fcbp)
- 	return (*fcbp);
-     return NULL;
- }
- 
- 
- /**********************************************************
-  * AfsRdrCreate
-  * - handle open and create requests
-  * - on success
-  *  - FsContext of file object points to FCB
-  *  - FsContext2 of file object is usermode handle of file instance
-  * - beginning failure codes and conditions came from ifstest
-  **********************************************************/
- NTSTATUS AfsRdrCreate(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *_fcb)
- {
-     afs_fcb_t *pfcb, *fcb, **fcbp;
-     afs_ccb_t *ccb, *pccb, *curr_ccb;
-     ULONG len;
-     LONG x, y;
-     wchar_t *str, *ptr;
-     ULONG fid, access, granted, disp;
-     LARGE_INTEGER size, creation, accesst, change, written, zero, wait;
-     ULONG attribs;
-     ULONG share;
-     CC_FILE_SIZES sizes;
-     NTSTATUS status;
-     char created;
-     PACCESS_TOKEN acc_token;
- 
-     /* set rpc security context for current thread */
-     acc_token = SeQuerySubjectContextToken(&IrpSp->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext);
-     ASSERT(acc_token);
- 
-     wait.QuadPart = -1000;
-     while (rpc_set_context(acc_token) != 0)				/* if there are no open thread spots... */
-         KeDelayExecutionThread(KernelMode, FALSE, &wait);		/* ...wait */
- 
-     /* attempt to open afs volume directly */
-     if (IrpSp->FileObject->FileName.Length == 0)
- 	SYNC_FAIL(STATUS_SHARING_VIOLATION);
- 
-     if (IrpSp->FileObject->FileName.Length > MAX_PATH*sizeof(wchar_t))
- 	SYNC_FAIL(STATUS_OBJECT_NAME_INVALID);
- 
-     if (IrpSp->Parameters.Create.FileAttributes & FILE_ATTRIBUTE_TEMPORARY &&
- 	IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)
- 	SYNC_FAIL(STATUS_INVALID_PARAMETER);
- 
-     /* relative opens cannot start with \ */
-     if (IrpSp->FileObject->RelatedFileObject &&
- 	IrpSp->FileObject->FileName.Length &&
- 	IrpSp->FileObject->FileName.Buffer[0] == L'\\')
- 	SYNC_FAIL(STATUS_INVALID_PARAMETER);/*STATUS_OBJECT_PATH_SYNTAX_BAD);*/
- 
-     /* a create request can be relative to a prior file.  build filename here */
-     pccb = NULL;
-     if (IrpSp->FileObject->RelatedFileObject)
- 	pccb = IrpSp->FileObject->RelatedFileObject->FsContext2;
-     len = IrpSp->FileObject->FileName.Length + (pccb?wcslen(pccb->name):0)*sizeof(wchar_t) + 6;
-     str = ExAllocatePoolWithTag(NonPagedPool, len, AFS_RDR_TAG);
-     RtlZeroMemory(str, len);
-     if (pccb)
-     {
- 	StringCbCatN(str, len, IrpSp->FileObject->RelatedFileObject->FileName.Buffer, IrpSp->FileObject->RelatedFileObject->FileName.Length);
- 	StringCbCat(str, len, L"\\");
-     }
-     StringCbCatN(str, len, IrpSp->FileObject->FileName.Buffer, IrpSp->FileObject->FileName.Length);
- 
-     /* request to open hierarchical parent of specified path */
-     /* remove last path component */
-     if (IrpSp->Flags & SL_OPEN_TARGET_DIRECTORY)
-     {
- 	y = x = wcslen(str);
- 	if (x)
-             x--, y--;
- 	for (x; x >= 0; x--)
-         {
-             if (str[x] == L'\\')
-             {
-                 if (y == x && x != 0)
-                     str[x] = L'\0';
-                 else if (x != 0)
-                 {
-                     str[x] = L'\0';
-                     break;
-                 }
-                 else
-                 {
-                     str[x+1] = L'\0';
-                     break;
-                 }
-             }
-         }
-     }
- 
-     /* first two characters are \%01d . %d is number of path components immediately
-      * following that should not be returned in file name queries.
-      * EX: \3\mount\path\start\fname.ext is mapped to <driveletter>:\fname.ext 
-      */
-     if (wcslen(str) <= 2)
-     {
- 	ExFreePoolWithTag(str, AFS_RDR_TAG);
- 	SYNC_FAIL(STATUS_OBJECT_NAME_INVALID);
-     }
- 
-     fid = 0;
-     disp = (unsigned char)((IrpSp->Parameters.Create.Options >> 24) & 0xff);
-     access = IrpSp->Parameters.Create.SecurityContext->DesiredAccess;
-     share = IrpSp->Parameters.Create.ShareAccess;
-     size.QuadPart = 0;
-     created = 0;
- 
-   open:
- 	/* check for file existance.  we jump to creating it if needed */ 
-     if (disp == FILE_OPEN || disp == FILE_OPEN_IF || disp == FILE_OVERWRITE ||
-          disp == FILE_OVERWRITE_IF || disp == FILE_SUPERSEDE)
-     {
- 	/* chop our internal mount flagging from the beginning */
- 	status = uc_namei(str+2, &fid);
- 	if (status == IFSL_DOES_NOT_EXIST &&
-              (disp == FILE_OPEN_IF ||
-                disp == FILE_OVERWRITE_IF ||
-                disp == FILE_SUPERSEDE))
-             goto create;
- 
- 	if (status != IFSL_SUCCESS)
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             switch (status)
-             {
-             case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-             case IFSL_NO_ACCESS:		SYNC_FAIL(STATUS_ACCESS_DENIED);
-             case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-             case IFSL_DOES_NOT_EXIST:		SYNC_FAIL2(STATUS_OBJECT_NAME_NOT_FOUND, FILE_DOES_NOT_EXIST);
-             case IFSL_PATH_DOES_NOT_EXIST:	SYNC_FAIL2(STATUS_OBJECT_PATH_NOT_FOUND, FILE_DOES_NOT_EXIST);
-             default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-         }
- 
- 	/* make upcall to get ACL in afs.  we specify our requested level to 
-          * keep it from hitting the network on a public volume. 
-          */
- 	status = uc_check_access(fid, access, &granted);
- 	if (status != IFSL_SUCCESS)
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             switch (status)
-             {
-             case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-             case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-             default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-         }
- 
- 	/* make sure daemon approved access */
- 	if ((access & granted) != access)
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             SYNC_FAIL(STATUS_ACCESS_DENIED);
-         }
- 
- 	/* we depend on this information for caching, etc. */
- 	status = uc_stat(fid, &attribs, &size, &creation, &accesst, &change, &written);
- 	if (status != IFSL_SUCCESS)
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             switch (status)
-             {
-             case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-             case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-             default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-         }
- 
- 	/* afsd does not maintain instance-specific data, so we adjust here */
- 	if (granted & FILE_READ_DATA && !(granted & FILE_WRITE_DATA))
-             attribs |= FILE_ATTRIBUTE_READONLY;
- 
- 	if (IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE &&
-              !(attribs & FILE_ATTRIBUTE_DIRECTORY))
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             SYNC_FAIL(STATUS_NOT_A_DIRECTORY);
-         }
- 	if (IrpSp->Parameters.Create.Options & FILE_NON_DIRECTORY_FILE &&
-              attribs & FILE_ATTRIBUTE_DIRECTORY)
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             SYNC_FAIL(STATUS_FILE_IS_A_DIRECTORY);
-         }
- 
- 	/* check for previous open instance(s) of file.  it will be in the fcb chain.
- 	 * when we have this locked, we cannot make upcalls -- running at APC_LEVEL.
- 	 * lock here (not later) to prevent possible truncation races. 
- 	 */
- 	LOCK_FCB_LIST;
- 	fcb = find_fcb(fid);
- 	if (fcb)
-         {
-             LOCK_PAGING_FCB;
-             LOCK_FCB;
-         }
- 
- 	/* if we found it, check to make sure open disposition and sharing
-          * are not in conflict with previous opens.  then, make new file
- 	 * instance entry and, if necessary, file entry. 
-          */
- 	if (fcb)
-         {
-             /* file contents cannot be cached for a successful delete */
-             if (access & FILE_WRITE_DATA)
-                 if (!MmFlushImageSection(&(fcb->sectionPtrs), MmFlushForWrite))
-                 {
-                     UNLOCK_FCB;
-                     UNLOCK_PAGING_FCB;
-                     UNLOCK_FCB_LIST;
-                     ExFreePoolWithTag(str, AFS_RDR_TAG);
-                     SYNC_FAIL(STATUS_SHARING_VIOLATION);
-                 }
-             if (access & DELETE)
-                 if (!MmFlushImageSection(&(fcb->sectionPtrs), MmFlushForWrite))//Delete))
-                 {
-                     UNLOCK_FCB;
-                     UNLOCK_PAGING_FCB;
-                     UNLOCK_FCB_LIST;
-                     ExFreePoolWithTag(str, AFS_RDR_TAG);
-                     SYNC_FAIL(STATUS_SHARING_VIOLATION);
-                 }
- 
-             /* check common sharing flags, but do not change */
-             if (IoCheckShareAccess(access, share, IrpSp->FileObject, &fcb->share_access, FALSE) != STATUS_SUCCESS)
-             {
-                 rpt0(("create", "sharing violation for %ws", str));
-                 UNLOCK_FCB;
-                 UNLOCK_PAGING_FCB;
-                 UNLOCK_FCB_LIST;
-                 ExFreePoolWithTag(str, AFS_RDR_TAG);
-                 SYNC_FAIL(STATUS_SHARING_VIOLATION);
-             }
- 
-             zero.QuadPart = 0;
-             if (access & DELETE)
-                 if (!MmCanFileBeTruncated(&(fcb->sectionPtrs), &zero))
-                 {
-                     UNLOCK_FCB;
-                     UNLOCK_PAGING_FCB;
-                     UNLOCK_FCB_LIST;
-                     ExFreePoolWithTag(str, AFS_RDR_TAG);
-                     SYNC_FAIL(STATUS_SHARING_VIOLATION);
-                 }
-         }
- 
- 	/* do overwrite/supersede tasks */
- 	if (disp == FILE_OVERWRITE ||
-              disp == FILE_OVERWRITE_IF ||
-              disp == FILE_SUPERSEDE)
-         {
-             zero.QuadPart = 0;
-             if (fcb && !MmCanFileBeTruncated(&(fcb->sectionPtrs), &zero))
-             {
-                 UNLOCK_FCB;
-                 UNLOCK_PAGING_FCB;
-                 UNLOCK_FCB_LIST;
-                 ExFreePoolWithTag(str, AFS_RDR_TAG);
-                 SYNC_FAIL(STATUS_SHARING_VIOLATION);
-             }
-             if (size.QuadPart != 0)
-             {
-                 size.QuadPart = 0;
-                 status = uc_trunc(fid, size);
-                 if (status != IFSL_SUCCESS)
-                 {
-                     UNLOCK_FCB;
-                     UNLOCK_PAGING_FCB;
-                     UNLOCK_FCB_LIST;
-                     ExFreePoolWithTag(str, AFS_RDR_TAG);
-                     SYNC_FAIL(STATUS_ACCESS_DENIED);
-                 }
-                 if (fcb)
-                 {
-                     fcb->AllocationSize = fcb->FileSize = fcb->ValidDataLength = size;
- 		    curr_ccb = fcb->ccb_list;
- 		    while (curr_ccb && curr_ccb->fo)
- 			{
- 			if (CcIsFileCached(curr_ccb->fo))
- 			    {
- 			    CcSetFileSizes(curr_ccb->fo, (CC_FILE_SIZES*)&fcb->AllocationSize);
- 			    break;
- 			    }
- 			curr_ccb = curr_ccb->next;
- 			}
-                 }
-             }
-             if (Irp->Overlay.AllocationSize.QuadPart)
-             {
-                 status = uc_trunc(fid, Irp->Overlay.AllocationSize);
-                 size = Irp->Overlay.AllocationSize;
-                 if (status != IFSL_SUCCESS)
-                 {
-                     UNLOCK_FCB;
-                     UNLOCK_PAGING_FCB;
-                     UNLOCK_FCB_LIST;
-                     ExFreePoolWithTag(str, AFS_RDR_TAG);
-                     SYNC_FAIL(STATUS_DISK_FULL);
-                 }
-                 if (fcb)
-                 {
-                     fcb->AllocationSize = fcb->FileSize = fcb->ValidDataLength = size;
- 		    curr_ccb = fcb->ccb_list;
- 		    while (curr_ccb && curr_ccb->fo)
- 			{
- 			if (CcIsFileCached(curr_ccb->fo))
- 			    {
- 			    CcSetFileSizes(curr_ccb->fo, (CC_FILE_SIZES*)&fcb->AllocationSize);
- 			    break;
- 			    }
- 			curr_ccb = curr_ccb->next;
- 			}
-                 }
-             }
-         }
- 
- 	if (fcb)
-         {
-             /* make actual change in common sharing flags */
-             IoUpdateShareAccess(IrpSp->FileObject, &fcb->share_access);
-             goto makeccb;
-         }
- 
- 	goto makefcb;
-     }
- 
- 
-     /* if disposition was to create the file, or its non-existance necessitates this */
-   create:
-     if (disp == FILE_CREATE ||
-          status == IFSL_DOES_NOT_EXIST && (disp == FILE_OPEN_IF || disp == FILE_OVERWRITE_IF || disp == FILE_SUPERSEDE))
-     {       
- 	attribs = IrpSp->Parameters.Create.FileAttributes;
- 	if (IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)
-             attribs |= FILE_ATTRIBUTE_DIRECTORY;
- 	if (IrpSp->Parameters.Create.Options & FILE_NON_DIRECTORY_FILE)
-             attribs &= ~FILE_ATTRIBUTE_DIRECTORY;
- 	status = uc_create(str+2, attribs, Irp->Overlay.AllocationSize, access, &granted, &fid);
- 	if (status != IFSL_SUCCESS)
-         {
-             ExFreePoolWithTag(str, AFS_RDR_TAG);
-             switch (status)
-             {
-             case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-             case IFSL_NO_ACCESS:		SYNC_FAIL(STATUS_ACCESS_DENIED);
-             case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-             case IFSL_PATH_DOES_NOT_EXIST:	SYNC_FAIL2(STATUS_OBJECT_PATH_NOT_FOUND, FILE_DOES_NOT_EXIST);
-             case IFSL_OPEN_EXISTS:		SYNC_FAIL2(STATUS_OBJECT_NAME_COLLISION, FILE_EXISTS);
-             case IFSL_OVERQUOTA:		SYNC_FAIL(STATUS_DISK_FULL);//STATUS_QUOTA_EXCEEDED);
-             default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-         }
- 
- 	/* lock list like above.  check again just to make sure it isn't in the list.
-          * if it is, we should process like above.  depending on how we follow symlinks
-          * (same fid for multiple files), we cannot expect serialized create requests. 
-          */
- 	LOCK_FCB_LIST;
- 	fcb = find_fcb(fid);
- 	if (fcb)				/* none of these should happen */
- 		if (disp == FILE_CREATE)
- 			{
- 			UNLOCK_FCB_LIST;
- 			SYNC_FAIL2(STATUS_OBJECT_NAME_COLLISION, FILE_EXISTS);
- 			}
- 		else
- 			{
- 			fcb = NULL;
- 			UNLOCK_FCB_LIST;
- 			goto open;
- 			}
- 
- 	if (size.QuadPart != 0)
-         {
-             size.QuadPart = 0;
-             uc_trunc(fid, size);
-             if (status != IFSL_SUCCESS)
-             {
-                 UNLOCK_FCB_LIST;
-                 ExFreePoolWithTag(str, AFS_RDR_TAG);
-                 SYNC_FAIL(STATUS_DISK_FULL);
-             }
-         }
- 	if (Irp->Overlay.AllocationSize.QuadPart)
-         {
-             uc_trunc(fid, Irp->Overlay.AllocationSize);
-             size = Irp->Overlay.AllocationSize;
-             if (status != IFSL_SUCCESS)
-             {
-                 UNLOCK_FCB_LIST;
-                 ExFreePoolWithTag(str, AFS_RDR_TAG);
-                 SYNC_FAIL(STATUS_ACCESS_DENIED);
-             }
-         }
- 
- 	created = 1;
- 	goto makefcb;
-     }
- 
-     /* OS passed unexpected disposition */
-     ExFreePoolWithTag(str, AFS_RDR_TAG);
-     SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
- 
- 
-     /* allocate nonpaged struct to track this file and all open instances */
-   makefcb:
-     fcb = ExAllocateFromNPagedLookasideList(&rdrExt->fcbMemList);
-     ASSERT(fcb);
-     RtlZeroMemory(fcb, sizeof(afs_fcb_t));
- 
-     fcb->fid = fid;
-     /*fcb->refs = 0;*/
-     fcb->ccb_list = NULL;
-     fcb->IsFastIoPossible = FastIoIsPossible;
- 
-     ExInitializeResourceLite(&fcb->_resource);
-     ExInitializeResourceLite(&fcb->_pagingIoResource);
-     fcb->Resource = &fcb->_resource;
-     fcb->PagingIoResource = &fcb->_pagingIoResource;
-     LOCK_PAGING_FCB;
-     LOCK_FCB;
- 
-     fcb->sectionPtrs.DataSectionObject = NULL;
-     fcb->sectionPtrs.SharedCacheMap = NULL;
-     fcb->sectionPtrs.ImageSectionObject = NULL;
-     fcb->AllocationSize = fcb->FileSize = fcb->ValidDataLength = size;
- 
-     IoSetShareAccess(access, share, IrpSp->FileObject, &fcb->share_access);
-     fcb->lock = NULL;
- 
-     /* we store a pointer to the fcb.  the table would want to store a copy otherwise. */
-     fcbp = &fcb;
-     RtlInsertElementGenericTable(&rdrExt->fcbTable, fcbp, sizeof(fcbp), NULL);
- 
-     sizes.AllocationSize = sizes.FileSize = sizes.ValidDataLength = size;
-     rpt1(("create", "created size %d name %ws", size.LowPart, str));
- 
-     /* allocate nonpaged struct tracking information specific to (file, open instance) pair,
-      * and link from parent.  is put at head of parent's list. 
-      */
-   makeccb:
-     /* there are two different types of pending deletes.  we return different
-      * errors in places depending on a) delete specified on call to open,
-      * or b) file specifically deleted 
-      */
-     /* need to check for DELETE perms too? */
-     if (IrpSp->Parameters.Create.Options & FILE_DELETE_ON_CLOSE)
-         fcb->delPending = 2;
- 
-     ccb = ExAllocateFromNPagedLookasideList(&rdrExt->ccbMemList);
-     ccb->name = str;
-     ccb->access = granted;
-     ccb->fo = IrpSp->FileObject;
-     ccb->cookie.QuadPart = 0;
-     ccb->filter = NULL;
-     ccb->attribs = attribs;
- 
-     /* save security context information.  we never change this ccb attribute. */
-     ObReferenceObjectByPointer(acc_token, TOKEN_QUERY, NULL, KernelMode);
-     ccb->token = acc_token;	
-     /*ObOpenObjectByPointer(acc_token, OBJ_KERNEL_HANDLE, NULL, TOKEN_QUERY, NULL, KernelMode, &ccb->token);*/
- 
-     if (!fcb->ccb_list)
-     {
-         ccb->next = NULL;
-         fcb->ccb_list = ccb;
-     }
-     else
-     {
-         ccb->next = fcb->ccb_list;
-         fcb->ccb_list = ccb;
-     }
-     UNLOCK_FCB;
-     UNLOCK_PAGING_FCB;
-     UNLOCK_FCB_LIST;
- 
-     /* how we pack (what the cache manager needs): a) fscontext same for all open instances
-      * of a file, b) fscontext2 unique among each instance, c) private cache map pointer set
-      * by cache manager upon caching, d) so pointers are per-file, as in (a). 
-      */
-     IrpSp->FileObject->FsContext = fcb;
-     IrpSp->FileObject->FsContext2 = ccb;
-     IrpSp->FileObject->PrivateCacheMap = NULL;
-     IrpSp->FileObject->SectionObjectPointer = &(fcb->sectionPtrs);
- 
-     /* customize returns; semantics largely derived from output of ifstest.exe */
-     switch (disp)
-     {
-     case FILE_OPEN:
-         SYNC_FAIL2(STATUS_SUCCESS, FILE_OPENED);
- 
-     case FILE_OPEN_IF:
-         if (created) {
-             SYNC_FAIL2(STATUS_SUCCESS, FILE_CREATED);
-         } else {
-             SYNC_FAIL2(STATUS_SUCCESS, FILE_OPENED);
-         }
-     case FILE_OVERWRITE:
-         SYNC_FAIL2(STATUS_SUCCESS, FILE_OVERWRITTEN);
- 
-     case FILE_OVERWRITE_IF:
-         if (created) {
-             SYNC_FAIL2(STATUS_SUCCESS, FILE_CREATED);
-         } else {
-             SYNC_FAIL2(STATUS_SUCCESS, FILE_OVERWRITTEN);
-         }
-     case FILE_SUPERSEDE:
-         if (created) {
-             SYNC_FAIL2(STATUS_SUCCESS, FILE_CREATED);
-         } else {
-             SYNC_FAIL2(STATUS_SUCCESS, FILE_SUPERSEDED);
-         }
-     case FILE_CREATE:
-         SYNC_FAIL2(STATUS_SUCCESS, FILE_CREATED);
-     }
-     return 0;
- }
- 
- 
- /**********************************************************
-  * AfsRdrRead
-  * - handle reads
-  **********************************************************/
- NTSTATUS AfsRdrRead(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     struct ReadKOut *p;
-     void *ptr;
-     LARGE_INTEGER offset, curroff;
-     ULONG length, read;
-     void *outPtr;
-     NTSTATUS status;
-     afs_ccb_t *ccb;
-     MDL m;
-     ULONG currpos, ttlread, toread;
- 
-     ccb = IrpSp->FileObject->FsContext2;
-     if (IsDeviceFile(IrpSp->FileObject) || (ccb->attribs & FILE_ATTRIBUTE_DIRECTORY))
- 	SYNC_FAIL(STATUS_INVALID_DEVICE_REQUEST);
- 
- /* the second line enables read ahead and disables write behind.  since our data is
-  * already cached in userland, and there are read-ahead parameters there, these are
-  * not strictly necessary for decent performance.  also, writes-behind may happen on
-  * handles that do not have write access, because the i/o manager picks some handle,
-  * not necessarily the same one that writing was originally done with. */
- #ifdef EXPLICIT_CACHING
-     if (!IrpSp->FileObject->PrivateCacheMap)
-     {
-         CcInitializeCacheMap(IrpSp->FileObject, (CC_FILE_SIZES*)&fcb->AllocationSize, FALSE, &rdrExt->callbacks, IrpSp->FileObject->FsContext);//(PVOID)din->Context1);
-         CcSetAdditionalCacheAttributes(IrpSp->FileObject, FALSE, TRUE);
-         /* could do a call to CcSetReadAheadGranularity here */
-     }
- #endif
- 
-     if (!(ccb->access & FILE_READ_DATA) && !(Irp->Flags & IRP_PAGING_IO))
- 	SYNC_FAIL(STATUS_ACCESS_DENIED);
- 
-     if (!IrpSp->Parameters.Read.Length)
- 	SYNC_FAIL(STATUS_SUCCESS);
- 
-     offset = IrpSp->Parameters.Read.ByteOffset;
-     length = IrpSp->Parameters.Read.Length;
- 
-     FsRtlEnterFileSystem();
-     SLOCK_FCB;
-     if (!(Irp->Flags & IRP_PAGING_IO) && fcb->lock)
- 	{
- 	if (!FsRtlCheckLockForReadAccess(fcb->lock, Irp))
- 	    {
- 	    UNLOCK_FCB;
- 	    FsRtlExitFileSystem();
- 	    SYNC_FAIL(STATUS_FILE_LOCK_CONFLICT);
- 	    }
- 	}
- 
-     /* fast out for reads starting beyond eof */
-     if (offset.QuadPart > fcb->ValidDataLength.QuadPart)
- 	{
- 	UNLOCK_FCB;
- 	FsRtlExitFileSystem();
- 	SYNC_FAIL(STATUS_END_OF_FILE);
- 	}
- 
-     /* pre-truncate reads */
-     if (offset.QuadPart + length > fcb->ValidDataLength.QuadPart)
- 	length = (ULONG)(fcb->ValidDataLength.QuadPart - offset.QuadPart);
-     UNLOCK_FCB;
-     FsRtlExitFileSystem();
- 
-     outPtr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
-     if (!outPtr)
- 	SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
- #ifdef EXPLICIT_CACHING
- 	/* this block is used only when a) caching functionality is compiled in, 
- 	 * b) this is not a paging i/o request, and c) this is not a no_cache req. */
-     if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO)))
-     {
- 	FsRtlEnterFileSystem();
- 	SLOCK_PAGING_FCB;
- 	ttlread = 0;
- 	try
-         {
-             if (!CcCopyRead(IrpSp->FileObject, &offset, length, TRUE, outPtr, &Irp->IoStatus))
-             {
-                 UNLOCK_PAGING_FCB;
-                 FsRtlExitFileSystem();
-                 SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-             ttlread = Irp->IoStatus.Information;
-         }
- 	except (EXCEPTION_EXECUTE_HANDLER)
-         {
-             STATUS(STATUS_UNSUCCESSFUL, 0);
-         }
- 	/* update byteoffset when this is not a paging or async request */
- 	if (Irp->IoStatus.Status != STATUS_UNSUCCESSFUL && IoIsOperationSynchronous(Irp) && !(Irp->Flags & IRP_PAGING_IO))
- 	    IrpSp->FileObject->CurrentByteOffset.QuadPart = offset.QuadPart + ttlread;
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
- 	if (Irp->IoStatus.Status == STATUS_UNSUCCESSFUL)
-             SYNC_FAIL(STATUS_UNSUCCESSFUL);
-     }       
-     else    
- #endif
-     {
- 	FsRtlEnterFileSystem();
- 	SLOCK_FCB;
- 	for (currpos = ttlread = 0; ttlread < length; )
-         {
-             toread = length - currpos;
-             toread = (toread > TRANSFER_CHUNK_SIZE) ? TRANSFER_CHUNK_SIZE : toread;
-             curroff.QuadPart = offset.QuadPart + currpos;
-             status = uc_read(fcb->fid, curroff, toread, &read, outPtr);
- 
- 	    if (status == 0)
-             {
-                 ttlread += read;
-                 currpos += read;
-                 if (read < toread)
-                     goto end;
-                 continue;
-             }
-             UNLOCK_FCB;
-             FsRtlExitFileSystem();
-             switch (status)
-             {
-             case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-             case IFSL_IS_A_DIR:			SYNC_FAIL(STATUS_INVALID_DEVICE_REQUEST);
-             case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-             default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-         }
-       end:
- 	/* update byteoffset when this is not a paging or async request */
- 	if (IoIsOperationSynchronous(Irp) && !(Irp->Flags & IRP_PAGING_IO))
- 	    IrpSp->FileObject->CurrentByteOffset.QuadPart = offset.QuadPart + ttlread;
- 	UNLOCK_FCB;
- 	FsRtlExitFileSystem();
-     }
- 
-     if (ttlread == 0) {
- 	SYNC_FAIL2(STATUS_END_OF_FILE, ttlread);
-     } else {
-         SYNC_FAIL2(STATUS_SUCCESS, ttlread);
-     }
- }       
- 
- 
- 
- /**********************************************************
-  * AfsRdrWrite
-  * - handle writes
-  **********************************************************/
- NTSTATUS AfsRdrWrite(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     struct WriteKOut *p;
-     void *ptr, *outPtr;
-     ULONG length, written;
-     LARGE_INTEGER offset, end;
-     NTSTATUS status;
-     afs_ccb_t *ccb;
-     CC_FILE_SIZES sizes, oldSizes;
-     ULONG towrite, ttlwritten, currpos;
-     LARGE_INTEGER curroff;
-     BOOLEAN change, paging_lock;
- 
-     ccb = IrpSp->FileObject->FsContext2;
-     if (IsDeviceFile(IrpSp->FileObject) || (ccb->attribs & FILE_ATTRIBUTE_DIRECTORY))
- 	SYNC_FAIL(STATUS_INVALID_DEVICE_REQUEST);
- 
-     /* since we will be performing io on this instance, start caching (see above). */
- #ifdef EXPLICIT_CACHING
-     if (!IrpSp->FileObject->PrivateCacheMap)
-     {
- 	CcInitializeCacheMap(IrpSp->FileObject, (CC_FILE_SIZES*)&fcb->AllocationSize, FALSE, &rdrExt->callbacks, IrpSp->FileObject->FsContext);//(PVOID)din->Context1);
- 	CcSetAdditionalCacheAttributes(IrpSp->FileObject, FALSE, TRUE);
-     }
- #endif
- 
-     if (!(ccb->access & FILE_WRITE_DATA) && !(Irp->Flags & IRP_PAGING_IO))
- 	SYNC_FAIL(STATUS_ACCESS_DENIED);
- 
-     /* fast-out for zero-length i/o */
-     if (!IrpSp->Parameters.Write.Length)
- 	SYNC_FAIL(STATUS_SUCCESS);
- 
-     if (!(outPtr = AfsFindBuffer(Irp)))
- 	SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
-     FsRtlEnterFileSystem();
-     SLOCK_FCB;
- 
-     if (!(Irp->Flags & IRP_PAGING_IO) && fcb->lock)
- 	{
- 	if (!FsRtlCheckLockForWriteAccess(fcb->lock, Irp))
- 	    {
- 	    UNLOCK_FCB;
- 	    FsRtlExitFileSystem();
- 	    SYNC_FAIL(STATUS_FILE_LOCK_CONFLICT);
- 	    }
- 	}
- 
-     if (IrpSp->Parameters.Write.ByteOffset.HighPart == 0xffffffff &&
-          IrpSp->Parameters.Write.ByteOffset.LowPart == FILE_WRITE_TO_END_OF_FILE)
- 	offset.QuadPart = fcb->FileSize.QuadPart;
-     else
- 	offset = IrpSp->Parameters.Write.ByteOffset;
-     length = IrpSp->Parameters.Write.Length;
-     UNLOCK_FCB;
- 
- #ifdef EXPLICIT_CACHING
-     if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO)))
-     {
- 	/* extend file for cached writes */
- 	LOCK_PAGING_FCB;
- 	if (offset.QuadPart + length > fcb->FileSize.QuadPart)
-         {
-             end.QuadPart = offset.QuadPart + length;
-             fcb->AllocationSize = fcb->FileSize = fcb->ValidDataLength = end;
-             LOCK_FCB;
-             CcSetFileSizes(IrpSp->FileObject, (CC_FILE_SIZES*)&fcb->AllocationSize);
-             UNLOCK_FCB;
-             /*ret = *//*CcZeroData(IrpSp->FileObject, &oldSizes.FileSize, &end, FALSE);*/ /* should wait? */
-         }
- 	try
-         {
-             if (!CcCopyWrite(IrpSp->FileObject, &offset, length, TRUE, outPtr))
- 		{
- 		UNLOCK_PAGING_FCB;
- 		FsRtlExitFileSystem();
-                 SYNC_FAIL(STATUS_UNSUCCESSFUL);
- 		}
-         }
- 	except (EXCEPTION_EXECUTE_HANDLER)
-         {
-             STATUS(STATUS_UNSUCCESSFUL, 0);
-         }
- 
- 	ttlwritten = written = length;
- 	if (Irp->IoStatus.Status != STATUS_UNSUCCESSFUL && IoIsOperationSynchronous(Irp) && !(Irp->Flags & IRP_PAGING_IO))
- 	    IrpSp->FileObject->CurrentByteOffset.QuadPart = offset.QuadPart + ttlwritten;
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
- 	if (Irp->IoStatus.Status == STATUS_UNSUCCESSFUL)
-             SYNC_FAIL(STATUS_UNSUCCESSFUL);
-     }
-     else
- #endif
-     {
- 	while (1)
-         {
-             if (offset.QuadPart + length > fcb->FileSize.QuadPart)
-                 change = 1;
-             else
-                 change = 0;
-             if (change && !(Irp->Flags & IRP_PAGING_IO))
-                 paging_lock = 1;
-             else
-                 paging_lock = 0;
-             if (paging_lock)
-                 LOCK_PAGING_FCB;
-             LOCK_FCB;
-             if (change)
-             {
-                 if (Irp->Flags & IRP_PAGING_IO)
-                 {
-                     /* the input buffer and length is for a full page.  ignore this. */
-                     if (offset.QuadPart > fcb->FileSize.QuadPart)
-                     {
- 			/* paging lock cannot be held here, so no need to release */
-                         UNLOCK_FCB;
-                         FsRtlExitFileSystem();
-                         SYNC_FAIL2(STATUS_SUCCESS, length);
-                     }
-                     length = (ULONG)(fcb->FileSize.QuadPart - offset.QuadPart);
-                     break;
-                 }
-                 else
-                 {
-                     if (!change)
-                     {
- 			/* paging lock cannot be held here, so no need to release */
-                         UNLOCK_FCB;
-                         continue;
-                     }
-                     end.QuadPart = offset.QuadPart + length;
-                     fcb->AllocationSize = fcb->FileSize = fcb->ValidDataLength = end;
-                     CcSetFileSizes(IrpSp->FileObject, (CC_FILE_SIZES*)&fcb->AllocationSize);
-                     if (paging_lock)
-                         UNLOCK_PAGING_FCB;
-                     break;
-                 }
-             }
-             else
-             {
-                 if (paging_lock)
-                     UNLOCK_PAGING_FCB;
-                 break;
-             }
-         }
- 
- 	for (currpos = ttlwritten = 0; ttlwritten < length; )
-         {
-             towrite = length - currpos;
-             towrite = (towrite > TRANSFER_CHUNK_SIZE) ? TRANSFER_CHUNK_SIZE : towrite;
-             curroff.QuadPart = offset.QuadPart + currpos;
-             status = uc_write(fcb->fid, curroff, towrite, &written, outPtr);
-             if (status == 0)
-             {
-                 ttlwritten += written;
-                 currpos += written;
-                 if (written < towrite)
-                     goto end;
-                 continue;
-             }
-             UNLOCK_FCB;
-             FsRtlExitFileSystem();
-             switch (status)
-             {
-             case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-             case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-             case IFSL_OVERQUOTA:		SYNC_FAIL(STATUS_DISK_FULL);
-             default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-             }
-         }
-       end:
- 	if (IoIsOperationSynchronous(Irp) && !(Irp->Flags & IRP_PAGING_IO))
- 	    IrpSp->FileObject->CurrentByteOffset.QuadPart = offset.QuadPart + ttlwritten;
- 	UNLOCK_FCB;
- 	FsRtlExitFileSystem();
-     }
- 
-     /* if we failed a write, we would not be here.  so, we must
-      * tell the vmm that all data was written. */
-     if (Irp->Flags & IRP_PAGING_IO)
- 	SYNC_FAIL2(STATUS_SUCCESS, IrpSp->Parameters.Write.Length);
-     SYNC_FAIL2(STATUS_SUCCESS, ttlwritten);
- }
- 
- 
- static wchar_t *SEARCH_MATCH_ALL = L"**";
- 
- /**********************************************************
-  * AfsRdrDirCtrl
-  * - handle directory notification callbacks
-  * - handle directory enumeration
-  *
-  * TOD: This code must performing globbing - it does not currently do so.
-  **********************************************************/
- NTSTATUS AfsRdrDirCtrl(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     struct EnumDirKOut *p;
-     LARGE_INTEGER size, creation, access, change, written;
-     ULONG attribs, count;
-     char buf[2048];
-     afs_ccb_t *ccb;
-     void *outPtr, *info, *pre_adj_info;
-     FILE_BOTH_DIR_INFORMATION *info_both, *info_both_prev;
-     FILE_DIRECTORY_INFORMATION *info_dir, *info_dir_prev;
-     FILE_NAMES_INFORMATION *info_names, *info_names_prev;
-     int info_size;
-     readdir_data_t *ii;
-     ULONG x, buf_size;
-     LARGE_INTEGER last_cookie;
-     BOOLEAN overflow;
-     NTSTATUS status;
-     FILE_NOTIFY_INFORMATION *notify;
- 
-     if (IsDeviceFile(IrpSp->FileObject))
- 	SYNC_FAIL(STATUS_INVALID_DEVICE_REQUEST);
- 
-     if (IrpSp->MinorFunction == IRP_MN_NOTIFY_CHANGE_DIRECTORY)
-     {
- 	ccb = IrpSp->FileObject->FsContext2;
- 	ccb->str.Length =			wcslen(ccb->name)*sizeof(wchar_t);
- 	ccb->str.MaximumLength =	ccb->str.Length + sizeof(wchar_t);
- 	ccb->str.Buffer =			ccb->name;
- 
- 	FsRtlEnterFileSystem();
- 	LOCK_FCB;
- 	FsRtlNotifyFullChangeDirectory(rdrExt->notifyList, &rdrExt->listHead,
-                                         ccb,
-                                         (STRING*)&ccb->str,
-                                         IrpSp->Flags & SL_WATCH_TREE,
-                                         FALSE,
-                                         /*FILE_NOTIFY_CHANGE_FILE_NAME,*/IrpSp->Parameters.NotifyDirectory.CompletionFilter,
-                                         Irp, NULL, NULL);
- 	UNLOCK_FCB;     
- 	FsRtlExitFileSystem();
- 	/* do NOT complete request; that will be done by fsrtlnotify functions */
- 	return STATUS_PENDING;
-     }
- 
-     if (IrpSp->MinorFunction != IRP_MN_QUERY_DIRECTORY)
- 	SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
- 
-     if ( IrpSp->Parameters.QueryDirectory.FileInformationClass != FileBothDirectoryInformation &&
-          IrpSp->Parameters.QueryDirectory.FileInformationClass != FileDirectoryInformation &&
-          IrpSp->Parameters.QueryDirectory.FileInformationClass != FileNamesInformation)
-     {
- 	rpt0(("enum", "enum class %d not supported", IrpSp->Parameters.QueryDirectory.FileInformationClass));
- 	SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
-     }
- 
-     ccb = IrpSp->FileObject->FsContext2;
-  
-     if (!(outPtr = AfsFindBuffer(Irp)))
- 	SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
-     if (IrpSp->Flags & SL_INDEX_SPECIFIED)
-     {
- 	/* we were told where to start our search; afsd should scrub this input */
- 	ccb->cookie.QuadPart = IrpSp->Parameters.QueryDirectory.FileIndex;
- 	if (ccb->filter && ccb->filter != SEARCH_MATCH_ALL)
-             ExFreePoolWithTag(ccb->filter, AFS_RDR_TAG);
- 	ccb->filter = SEARCH_MATCH_ALL;
-     }
-     else if (IrpSp->Flags & SL_RESTART_SCAN ||
-               ((IrpSp->Flags & SL_RETURN_SINGLE_ENTRY) && ccb->cookie.QuadPart == 0))
-     {
- 	/* copy new filter string into nonpaged memory */
- 	ccb->cookie.QuadPart = 0;
- 	if (ccb->filter && ccb->filter != SEARCH_MATCH_ALL)
-             ExFreePoolWithTag(ccb->filter, AFS_RDR_TAG);
- 	if (IrpSp->Parameters.QueryDirectory.FileName)
- 	    {
- 	    buf_size = IrpSp->Parameters.QueryDirectory.FileName->Length+6;
- 	    ccb->filter = ExAllocatePoolWithTag(NonPagedPool, buf_size, AFS_RDR_TAG);
- 	    RtlCopyMemory(ccb->filter, IrpSp->Parameters.QueryDirectory.FileName->Buffer, buf_size);
- 	    ccb->filter[IrpSp->Parameters.QueryDirectory.FileName->Length / sizeof(WCHAR)] = L'\0';
- 	    }
- 	else
- 	    ccb->filter = SEARCH_MATCH_ALL;
-     }
- 
-     if (IrpSp->Flags & SL_RETURN_SINGLE_ENTRY)
- 	count = 1;
-     buf_size = 2040;
- 
-     status = uc_readdir(fcb->fid, ccb->cookie, ccb->filter, &count, buf, &buf_size);
- 
-     switch (status)
-     {
-     case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-     case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-     default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-     case 0: break;
-     }
- 
-     switch (IrpSp->Parameters.QueryDirectory.FileInformationClass)
-     {
-     case FileBothDirectoryInformation:
-         info_size = sizeof(FILE_BOTH_DIR_INFORMATION);
-         break;
-     case FileDirectoryInformation:
-         info_size = sizeof(FILE_DIRECTORY_INFORMATION);
-         break;
-     case FileNamesInformation:
-         info_size = sizeof(FILE_NAMES_INFORMATION);
-         break;
-     default:
-         SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
-     }
- 
-     info = (FILE_BOTH_DIR_INFORMATION *)outPtr;
-     ii = (readdir_data_t *)buf;
-     Irp->IoStatus.Information = 0;
-     if (!count)
-     {
- 	if (IrpSp->Flags & SL_RETURN_SINGLE_ENTRY && ccb->cookie.QuadPart == 0)
-             SYNC_FAIL(STATUS_NO_SUCH_FILE);
- 	SYNC_FAIL(STATUS_NO_MORE_FILES);
-     }
- 
-     info_both_prev = NULL;
-     info_dir_prev = NULL;
-     info_names_prev = NULL;
-     if (IrpSp->Flags & SL_RETURN_SINGLE_ENTRY)
-  	count = 1;
- 
-     for (x = 0; x < count; x++)
-     {
- 	pre_adj_info = info;
- 
- 	/* must explicitly align second and subsequent entries on 8-byte boundaries */
- 	if (((ULONG)info & 0x7) && x)
-             info = (void*)(((ULONG)info) + (8-((ULONG)info & 0x7)));
- 
- 	overflow = ((long)info + info_size + (long)ii->name_length >
-                      (long)outPtr + (long)IrpSp->Parameters.QueryDirectory.Length);
- 	if (overflow && x != 0)
-         {
-             ccb->cookie = ii->cookie;
-             SYNC_FAIL2(STATUS_SUCCESS, (long)pre_adj_info - (long)outPtr);
-         }
- 
- 	memset(info, 0, info_size);
- 	switch (IrpSp->Parameters.QueryDirectory.FileInformationClass)
-         {
-         case FileBothDirectoryInformation:
-             info_both = info;
-             if (info_both_prev)
-                 info_both_prev->NextEntryOffset = (char*)info_both - (char*)info_both_prev;
- 
-             info_both->NextEntryOffset = 0;
-             info_both->FileIndex = (ULONG)ii->cookie.QuadPart;
-             info_both->CreationTime.QuadPart = AfsTimeToWindowsTime(ii->creation.QuadPart);
-             info_both->LastAccessTime.QuadPart = AfsTimeToWindowsTime(ii->access.QuadPart);
-             info_both->LastWriteTime.QuadPart = AfsTimeToWindowsTime(ii->write.QuadPart);
-             info_both->ChangeTime.QuadPart = AfsTimeToWindowsTime(ii->change.QuadPart);
-             info_both->EndOfFile = info_both->AllocationSize = ii->size;
-             info_both->FileAttributes = ii->attribs;/*| FILE_ATTRIBUTE_READONLY*/;
-             info_both->EaSize = 0;
-             info_both->ShortNameLength = ii->short_name_length;
-             info_both->FileNameLength = ii->name_length;
-             RtlCopyMemory(info_both->ShortName, ii->short_name, ii->short_name_length*sizeof(WCHAR));
- 
-             if (overflow)
-             {
-                 Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW;
-                 info_both->FileNameLength = 0;
-                 info_both->FileName[0] = L'\0';
-                 goto done;
-             }
- 
-             RtlCopyMemory(info_both->FileName, ii->name, ii->name_length*sizeof(WCHAR));
-             info_both_prev = info_both;
-             break;
- 
-         case FileDirectoryInformation:
-             info_dir = info;
-             if (info_dir_prev)
-                 info_dir_prev->NextEntryOffset = (char*)info_dir - (char*)info_dir_prev;
- 
-             info_dir->NextEntryOffset = 0;
-             info_dir->FileIndex = (ULONG)ii->cookie.QuadPart;
-             info_dir->CreationTime.QuadPart = AfsTimeToWindowsTime(ii->creation.QuadPart);
-             info_dir->LastAccessTime.QuadPart = AfsTimeToWindowsTime(ii->access.QuadPart);
-             info_dir->LastWriteTime.QuadPart = AfsTimeToWindowsTime(ii->write.QuadPart);
-             info_dir->ChangeTime.QuadPart = AfsTimeToWindowsTime(ii->change.QuadPart);
-             info_dir->EndOfFile = info_dir->AllocationSize = ii->size;
-             info_dir->FileAttributes = ii->attribs /*| FILE_ATTRIBUTE_READONLY*/;
-             info_dir->FileNameLength = ii->name_length;
- 
-             if (overflow)
-             {
-                 Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW;
-                 info_dir->FileNameLength = 0;
-                 info_dir->FileName[0] = L'\0';
-                 goto done;
-             }
- 
-             RtlCopyMemory(info_dir->FileName, ii->name, ii->name_length*sizeof(WCHAR));
-             info_dir_prev = info_dir;
-             break;
- 
-         case FileNamesInformation:
-             info_names = info;
-             if (info_names_prev)
-                 info_names_prev->NextEntryOffset = (char*)info_names - (char*)info_names_prev;
- 
-             info_names->NextEntryOffset = 0;
-             info_names->FileIndex = (ULONG)ii->cookie.QuadPart;
-             info_names->FileNameLength = ii->name_length;
- 
-             if (overflow)
-             {
-                 Irp->IoStatus.Status = STATUS_BUFFER_OVERFLOW;
-                 info_names->FileNameLength = 0;
-                 info_names->FileName[0] = L'\0';
-                 goto done;
-             }
- 
-             RtlCopyMemory(info_names->FileName, ii->name, ii->name_length*sizeof(WCHAR));
-             info_names_prev = info_names;
-             break;
-         }
- 
- 	info = (void*)(((ULONG)info) + info_size + (ULONG)ii->name_length*sizeof(WCHAR));
- 	ii = (readdir_data_t *)(((unsigned char *)ii) + sizeof(readdir_data_t) + ii->name_length);
- 	last_cookie = ii->cookie;
-     }
- 
-     Irp->IoStatus.Status = STATUS_SUCCESS;
-   done:
-     ccb->cookie = last_cookie;
- 
-     SYNC_FAIL2(Irp->IoStatus.Status, (long)info - (long)outPtr);
- }
- 
- 
- 
- 
- /**********************************************************
-  * AfsRdrQueryInfo
-  * - handle stat calls
-  **********************************************************/
- NTSTATUS AfsRdrQueryInfo(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     FILE_BASIC_INFORMATION *infoBasic;
-     FILE_NAME_INFORMATION *infoName;
-     FILE_STANDARD_INFORMATION *infoStandard;
-     FILE_POSITION_INFORMATION *infoPosition;
-     FILE_ALL_INFORMATION *infoAll;
-     FILE_INTERNAL_INFORMATION *infoInternal;
-     LARGE_INTEGER size, creation, access, change, written;
-     ULONG attribs;
-     long count;
-     afs_ccb_t *ccb;
-     char *outPtr;
-     NTSTATUS status;
-     wchar_t *start;
- 
-     if (IsDeviceFile(IrpSp->FileObject))
- 	SYNC_FAIL(STATUS_UNSUCCESSFUL);				// what should happen?
- 
-     if (!(outPtr = AfsFindBuffer(Irp)))
- 	SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
-     ccb = IrpSp->FileObject->FsContext2;
- 
-     status = uc_stat(fcb->fid, &attribs, &size, &creation, &access, &change, &written);
-     switch (status)
-     {
-     case IFSL_RPC_TIMEOUT:		SYNC_FAIL_RPC_TIMEOUT;
-     case IFSL_BAD_INPUT:		SYNC_FAIL(STATUS_INVALID_PARAMETER);
-     default:				SYNC_FAIL(STATUS_UNSUCCESSFUL);
-     case 0: break;
-     }
- 
-     /* afsd does not maintain instance-specific data, so we adjust here */
-     if (ccb->access & FILE_READ_DATA && !(ccb->access & FILE_WRITE_DATA))
- 	attribs |= FILE_ATTRIBUTE_READONLY;
- 
-     (void*)infoBasic = (void*)infoName = (void*)infoPosition = (void*)infoStandard = (void*)infoInternal = NULL;
-     switch (IrpSp->Parameters.QueryFile.FileInformationClass)
-     {
-     case FileBasicInformation:
-         infoBasic = (FILE_BASIC_INFORMATION*)outPtr;
-         break;
-     case FileNameInformation:
-         infoName = (FILE_NAME_INFORMATION*)outPtr;
-         break;
-     case FileStandardInformation:
-         infoStandard = (FILE_STANDARD_INFORMATION*)outPtr;
-         break;
-     case FilePositionInformation:
-         infoPosition = (FILE_POSITION_INFORMATION*)outPtr;
-         break;
-     case FileAllInformation:
-         infoAll = (FILE_ALL_INFORMATION*)outPtr;
-         infoBasic = &infoAll->BasicInformation;
-         infoName = &infoAll->NameInformation;
-         infoStandard = &infoAll->StandardInformation;
-         infoPosition = &infoAll->PositionInformation;
-         break;
-     case FileInternalInformation:
-         infoInternal = (FILE_INTERNAL_INFORMATION*)outPtr;
-         break;
-     default:
-         STATUS(STATUS_NOT_IMPLEMENTED, 0);
-         break;
-     }
- 
-     if (infoBasic)
-     {
- 	memset(infoBasic, 0, sizeof(FILE_BASIC_INFORMATION));
- 	infoBasic->FileAttributes = attribs;
- 	infoBasic->CreationTime.QuadPart = AfsTimeToWindowsTime(creation.QuadPart);
- 	infoBasic->LastAccessTime.QuadPart = AfsTimeToWindowsTime(access.QuadPart);
- 	infoBasic->LastWriteTime.QuadPart = AfsTimeToWindowsTime(written.QuadPart);
- 	infoBasic->ChangeTime.QuadPart = AfsTimeToWindowsTime(change.QuadPart);
- 	STATUS(STATUS_SUCCESS, sizeof(FILE_BASIC_INFORMATION));
- 	//KdPrint(("query basicinfo %d,%d %x,%I64d,%I64d\n", fcb->fid, (ULONG)IrpSp->FileObject->FsContext2, infoBasic->FileAttributes, infoBasic->CreationTime.QuadPart, infoBasic->ChangeTime.QuadPart));
-     }
- 
-     if (infoName)
-     {
- 	memset(infoName, 0, sizeof(FILE_NAME_INFORMATION));
- 	start = ccb->name;
- 	count = (long)(*(start+1) - L'0');
- 	if (count > 9 || count < 0)
-             SYNC_FAIL(STATUS_OBJECT_NAME_INVALID);
- 	if (count || *start == L'0')
-         {
-             for ( ; count >= 0 && start; count--)
-                 start = wcschr(start+1, L'\\');
-             if (!start)
-                 SYNC_FAIL(STATUS_OBJECT_NAME_INVALID);
-         }
- 	infoName->FileNameLength = wcslen(start)*sizeof(WCHAR);
- 	if (((IrpSp->Parameters.QueryFile.FileInformationClass == FileAllInformation) ? sizeof(*infoAll) : sizeof(*infoName)) +
-              infoName->FileNameLength > IrpSp->Parameters.QueryFile.Length)
-         {
-             infoName->FileNameLength = 0;
-             infoName->FileName[0] = L'\0';
-             STATUS(STATUS_BUFFER_OVERFLOW, sizeof(FILE_NAME_INFORMATION));
-             //KdPrint(("query overflowing buffer %d\n", IrpSp->Parameters.QueryFile.Length));
-         }
- 	else
-         {   //TODO:check filename is correct/correct format
-             StringCbCopy(infoName->FileName, IrpSp->Parameters.QueryFile.Length - sizeof(*infoName), start);
-             STATUS(STATUS_SUCCESS, sizeof(FILE_NAME_INFORMATION) + (infoName->FileNameLength - sizeof(WCHAR)));
-         }
- 	//KdPrint(("query nameinfo %ws from %ws\n", infoName->FileName, ccb->name));
-     }
- 
-     if (infoStandard)
-     {
- 	memset(infoStandard, 0, sizeof(FILE_STANDARD_INFORMATION));
- 	infoStandard->AllocationSize.QuadPart = size.QuadPart;
- 	infoStandard->EndOfFile.QuadPart = size.QuadPart;
- 	infoStandard->NumberOfLinks = 1;
- 	infoStandard->DeletePending = (fcb->delPending == 1);
- 	infoStandard->Directory = (attribs & FILE_ATTRIBUTE_DIRECTORY)?TRUE:FALSE;	//TODO:check if flag is valid at this point
- 	STATUS(STATUS_SUCCESS, sizeof(FILE_STANDARD_INFORMATION));
- 	//KdPrint(("query stdinfo %d,%d %I64d,%s\n", fcb->fid, (ULONG)IrpSp->FileObject->FsContext2, infoStandard->EndOfFile.QuadPart, infoStandard->Directory?"dir":"file"));
- 	}
- 
-     if (infoPosition)
-     {
- 	infoPosition->CurrentByteOffset = IrpSp->FileObject->CurrentByteOffset;
- 	STATUS(STATUS_SUCCESS, sizeof(FILE_POSITION_INFORMATION));
- 	//KdPrint(("query position %d,%d %I64d\n", fcb, (ULONG)IrpSp->FileObject->FsContext2, infoPosition->CurrentByteOffset.QuadPart));
-     }
- 
-     if (IrpSp->Parameters.QueryFile.FileInformationClass == FileAllInformation)
-     {
- 	if (!infoName->FileNameLength)
-             STATUS(STATUS_BUFFER_OVERFLOW, sizeof(FILE_ALL_INFORMATION));
- 	else    
-             STATUS(STATUS_SUCCESS, sizeof(FILE_ALL_INFORMATION) + (infoName->FileNameLength - sizeof(WCHAR)));
- 	}
- 
-     if (infoInternal)
-     {
- 	infoInternal->IndexNumber.QuadPart = fcb->fid;
- 	STATUS(STATUS_SUCCESS, sizeof(FILE_INTERNAL_INFORMATION));
-     }
- 
-     status = Irp->IoStatus.Status;
-     COMPLETE;
-     return status;
- }
- 
- 
- 
- 
- /**********************************************************
-  * AfsRdrSetInfo
-  * - handle setting mod time
-  * - handle deleting
-  * - handle truncation/extension
-  * - handle renaming
-  **********************************************************/
- NTSTATUS AfsRdrSetInfo(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     struct SetInfoKOut *p;
-     afs_fcb_t *fcbt;
-     afs_ccb_t *ccb;
-     FILE_DISPOSITION_INFORMATION *infoDisp;
-     FILE_BASIC_INFORMATION *infoBasic;
-     FILE_END_OF_FILE_INFORMATION *infoLength;
-     FILE_RENAME_INFORMATION *infoRename;
-     FILE_POSITION_INFORMATION *infoPosition;
-     NTSTATUS ret;
-     wchar_t *buf, *part, *ptr;
-     ULONG size, new_fid;
-     NTSTATUS status;
- 
-     if ( IrpSp->FileObject->FileName.Length == 0)
-         SYNC_FAIL(STATUS_INVALID_DEVICE_REQUEST);
- 
-     ccb = IrpSp->FileObject->FsContext2;
-  
-     switch (IrpSp->Parameters.SetFile.FileInformationClass)
-     {
- 	/* delete disposition */
-     case FileDispositionInformation:
-         infoDisp = Irp->AssociatedIrp.SystemBuffer;
- 
-         FsRtlEnterFileSystem();
-         LOCK_FCB;
- 
-         if (infoDisp->DeleteFile)
-         {
-             if (!MmFlushImageSection(&(fcb->sectionPtrs), MmFlushForDelete))
- 		{
- 		UNLOCK_FCB;
- 		FsRtlExitFileSystem();
-                 SYNC_FAIL(STATUS_ACCESS_DENIED);
- 		}
-             fcb->delPending |= 0x1;
-         }
-         else
-             fcb->delPending &= ~0x1;
-         UNLOCK_FCB;
-         FsRtlExitFileSystem();
-         SYNC_RET(STATUS_SUCCESS);
- 
- 	/*case FileAllocationInformation:*/
-     case FileEndOfFileInformation:
-         /* ignore extensions caused by paging requests*/
-         if (Irp->Flags & IRP_PAGING_IO)
-             SYNC_FAIL(STATUS_SUCCESS);
- 
-         infoLength = Irp->AssociatedIrp.SystemBuffer;
- 
-         FsRtlEnterFileSystem();
-         LOCK_PAGING_FCB;
-         LOCK_FCB;
-         if (IrpSp->Parameters.SetFile.AdvanceOnly && (infoLength->EndOfFile.QuadPart > fcb->FileSize.QuadPart) ||
-              !IrpSp->Parameters.SetFile.AdvanceOnly && (infoLength->EndOfFile.QuadPart < fcb->FileSize.QuadPart))
-         {
-             status = uc_trunc(fcb->fid, infoLength->EndOfFile);
-             /* because it is not written to the server immediately, this error will not always happen */
-             if (status == IFSL_OVERQUOTA)
-             {
-                 UNLOCK_FCB;
-                 UNLOCK_PAGING_FCB;
-                 FsRtlExitFileSystem();
-                 SYNC_FAIL(STATUS_DISK_FULL);
-             }
-         }
-         fcb->FileSize = fcb->AllocationSize = fcb->ValidDataLength = infoLength->EndOfFile;
-         CcSetFileSizes(IrpSp->FileObject, (CC_FILE_SIZES*)&fcb->AllocationSize);
-         //CcPurgeCacheSection(IrpSp->FileObject->SectionObjectPointer, &fcb->AllocationSize, 0, FALSE);
-         UNLOCK_FCB;
-         UNLOCK_PAGING_FCB;
-         FsRtlExitFileSystem();
-         SYNC_FAIL(STATUS_SUCCESS);
- 
-     case FileBasicInformation:
-         infoBasic = Irp->AssociatedIrp.SystemBuffer;
-         status = uc_setinfo(fcb->fid, infoBasic->FileAttributes, infoBasic->CreationTime, infoBasic->LastAccessTime, infoBasic->ChangeTime, infoBasic->LastWriteTime);
-         SYNC_FAIL(STATUS_SUCCESS);
- 
-     case FileRenameInformation:
-         //KdPrint(("set rename %d\n", fcb->fid));
-         infoRename = Irp->AssociatedIrp.SystemBuffer;
-         new_fid = fcb->fid;
-         //rpt1(("setinfo", "rename %d,%d %d,%ws", ExtractFid(fcb), (ULONG)IrpSp->FileObject->FsContext2, infoRename->ReplaceIfExists, infoRename->FileName));
- 
-         if (IrpSp->Parameters.SetFile.FileObject)
-             fcbt = FindFcb(IrpSp->Parameters.SetFile.FileObject);			
- 
-         //null-terminate all strings into uc_rename?
- 
-         if (IrpSp->Parameters.SetFile.FileObject == NULL &&
-              infoRename->RootDirectory == NULL)
-         {
-             WCHAR fname[MAX_PATH];
-             StringCchCopyNW(fname, MAX_PATH-1, infoRename->FileName, infoRename->FileNameLength/sizeof(WCHAR));
-             uc_rename(fcb->fid, ccb->name+2, NULL, fname, &new_fid);
-             fcb->fid = new_fid;
-         }
-         else if (IrpSp->Parameters.SetFile.FileObject != NULL &&
-                   infoRename->RootDirectory == NULL)
-         {
-             WCHAR fname[300];
-             StringCchCopyNW(fname, 300-1, infoRename->FileName, infoRename->FileNameLength/sizeof(WCHAR));
-             uc_rename(fcb->fid, ccb->name+2, fcbt->ccb_list->name+2, fname, &new_fid);
-             fcb->fid = new_fid;
-         }
-         else
-         {
- 			/* FIXFIX: implement this case, although we have never seen it called */
- 			SYNC_RET(STATUS_UNSUCCESSFUL);
- 
- 			/*fcbt = FindFcb(IrpSp->Parameters.SetFile.FileObject);
-             p->CurrNameOff = 0;
-             StringCbCopyW(buf, size, fcb->name);
-             p->NewNameOff = wcslen(buf)+1;
-             StringCbCopyNW(buf + p->NewNameOff,
-             size - p->NewNameOff,
-             infoRename->FileName,
-             infoRename->FileNameLength*sizeof(wchar_t));
-             buf[p->NewNameOff+infoRename->FileNameLength] = L'\0';
-             p->NewDirOff = p->NewNameOff + wcslen(buf + p->NewNameOff)+1;
-             StringCbCopyW(buf + p->NewDirOff,
-             size - p->NewDirOff,
-             fcbt->name);*/
-         }
-         SYNC_RET(STATUS_SUCCESS);
-         break;
- 
-     case FilePositionInformation:
-         infoPosition = Irp->AssociatedIrp.SystemBuffer;
-         IrpSp->FileObject->CurrentByteOffset = infoPosition->CurrentByteOffset;
-         SYNC_FAIL(STATUS_SUCCESS);
- 
-     default:
-         KdPrint(("set unsupp %d type %d\n", fcb->fid, IrpSp->Parameters.SetFile.FileInformationClass));
-         SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
-     }
- 
-     SYNC_FAIL(STATUS_UNSUCCESSFUL);
- }       
- 
- long
- dc_break_callback(ULONG fid)
- {
-     afs_fcb_t *fcb;
-     int pos;
-     USHORT len;
-     UNICODE_STRING *s;
- 
-     LOCK_FCB_LIST;
-  
-     fcb = find_fcb(fid);
-     if (!fcb)
-     {
- 	UNLOCK_FCB_LIST;
- 	return 1;					/* we are done with this file */
-     }
- 
-     ASSERT(fcb->ccb_list);
- 
-     len = (wcslen(fcb->ccb_list->name) + 10) * sizeof(wchar_t);
-     s = ExAllocatePool(NonPagedPool, sizeof(UNICODE_STRING)+len+sizeof(wchar_t));
-     s->Length = len;
-     s->MaximumLength = len + sizeof(wchar_t);
-     s->Buffer = (PWSTR)(s+1);
- 
-     /* we are making a bogus change notification for now, because
-      * it does what we need.
-      */
-     StringCbCopyW((PWSTR)(s+1), len, fcb->ccb_list->name);
-     if (s->Buffer[wcslen(s->Buffer) - 1] != L'\\')
- 	StringCbCatW(s->Buffer, len, L"\\");
-     pos = wcslen(s->Buffer);
-     StringCbCatW(s->Buffer, len, L"jj");
- 
-     KdPrint(("break callback on %d %ws %ws\n", fid, fcb->ccb_list->name, fcb->ccb_list->name+pos));
- 
-     FsRtlNotifyFullReportChange(rdrExt->notifyList, &rdrExt->listHead,
-                                  (PSTRING)s, (USHORT)pos*sizeof(wchar_t), NULL, NULL,
-                                  FILE_NOTIFY_CHANGE_FILE_NAME/*FILE_NOTIFY_VALID_MASK/*FILE_NOTIFY_CHANGE_FILE_NAME*/, FILE_ACTION_ADDED, NULL);
- 
-     ExFreePool(s);
-     UNLOCK_FCB_LIST;
-     return 0;
- }
- 
- long
- dc_release_hooks(void)
- {
-     KeSetEvent(&comExt->cancelEvent, 0, FALSE);
-     return 0;
- }
- 
- /**********************************************************
-  * AfsRdrDeviceControl
-  * - handle communication requests from fs, etc.
-  * - handle ioctls
-  **********************************************************/
- NTSTATUS AfsRdrDeviceControl(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     struct KOutEntry *entry;
-     NTSTATUS ret;
-     struct CbKIn *kin;
-     USHORT offset;
-     UNICODE_STRING nm;
-     void *outPtr;
-     ULONG key, code, length;
-     LARGE_INTEGER wait;
- 
-     /* utility ioctls */
-     if (DeviceObject == ComDevice &&
-          IrpSp->FileObject->FsContext2 == COMM_IOCTL &&
-          IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFSRDR_IOCTL)
-     {
- 	outPtr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
- 	if (!outPtr)
-             SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
- 	wait.QuadPart = -1000;
- 	while (rpc_set_context(IrpSp->FileObject->FsContext) != 0)	/* if there are no open thread spots... */
- 	    KeDelayExecutionThread(KernelMode, FALSE, &wait);		/* ...wait */
- 	code = uc_ioctl_write(IrpSp->Parameters.DeviceIoControl.InputBufferLength,
-                               Irp->AssociatedIrp.SystemBuffer,
-                               (ULONG*)&key);
- 	length = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
- 	if (!code)		
-             code = uc_ioctl_read(key, &length, outPtr);
- 	rpc_remove_context();
- 
- 	switch (code)
-         {
-         case IFSL_SUCCESS:
-             STATUS(STATUS_SUCCESS, length);
-             break;
-         default:
-             STATUS(STATUS_UNSUCCESSFUL, 0);
-             break;
-         }
-     }
-     /* downcalls by afsd */
-     else if (DeviceObject == ComDevice &&
-               IrpSp->FileObject->FsContext2 == COMM_DOWNCALL &&
-               IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFSRDR_DOWNCALL)
-     {       
- 	outPtr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
- 	if (!outPtr)
-             SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
- 	wait.QuadPart = -1000;
- 	while (rpc_set_context(IrpSp->FileObject->FsContext) != 0)	/* if there are no open thread spots... */
- 	    KeDelayExecutionThread(KernelMode, FALSE, &wait);		/* ...wait */
- 	code = rpc_call(IrpSp->Parameters.DeviceIoControl.InputBufferLength,
-                          Irp->AssociatedIrp.SystemBuffer,
-                          IrpSp->Parameters.DeviceIoControl.OutputBufferLength,
-                          outPtr,
-                          &length);
- 	rpc_remove_context();
- 	switch (code)
-         {
-         case IFSL_SUCCESS:
-             STATUS(STATUS_SUCCESS, length);
-             break;
-         default:
-             STATUS(STATUS_UNSUCCESSFUL, 0);
-             break;
-         }
-     }
-     /* ioctl to get full file afs path (used by pioctl) */
-     else if (DeviceObject == RdrDevice &&
-               IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFSRDR_GET_PATH)
-     {       
- 	outPtr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
- 	if (!outPtr)
-             SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
- 	StringCbCopyW(outPtr, IrpSp->Parameters.DeviceIoControl.OutputBufferLength, fcb->ccb_list->name+2);
- 
- 	STATUS(STATUS_SUCCESS, (wcslen(outPtr)+1)*sizeof(wchar_t));
-     }
-     else
-     {
- 	rpt0(("devctl", "devctl %d rejected", IrpSp->Parameters.DeviceIoControl.IoControlCode));
- 	SYNC_FAIL(STATUS_INVALID_DEVICE_REQUEST);
-     }
- 
-     ret = Irp->IoStatus.Status;
-     COMPLETE;	/* complete with priority boost */
-     return ret;
- }
- 
- 
- 
- /**********************************************************
-  * AfsRdrCleanup
-  * - called when usermode handle count reaches zero
-  **********************************************************/
- NTSTATUS AfsRdrCleanup(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     NTSTATUS ret;
-     struct AfsRdrExtension *ext;
- 
- #if 0
-     try {
- #endif
-         if (IrpSp->FileObject->FileName.Length == 0)
-             SYNC_FAIL(STATUS_SUCCESS);
- 
-         ext = ((struct AfsRdrExtension*)RdrDevice->DeviceExtension);
- 
-         LOCK_FCB_LIST;
-         LOCK_PAGING_FCB;
-         LOCK_FCB;
- 
-         FsRtlNotifyCleanup(ext->notifyList, &ext->listHead, IrpSp->FileObject->FsContext2);
- 
- 	IoRemoveShareAccess(IrpSp->FileObject, &fcb->share_access);
- 
-         CcFlushCache(IrpSp->FileObject->SectionObjectPointer, NULL, 0, NULL);
- 
-         if (fcb->delPending)
- 	    {
- 	    if (!MmFlushImageSection(&(fcb->sectionPtrs), MmFlushForDelete))
- 		/* yes, moot at this point */
- 		STATUS(STATUS_ACCESS_DENIED, 0);
- 	    }
-         else
- 	    {
- 	    MmFlushImageSection(IrpSp->FileObject->SectionObjectPointer, MmFlushForWrite);
-             STATUS(STATUS_SUCCESS, 0);
- 	    }
- 
-         CcPurgeCacheSection(IrpSp->FileObject->SectionObjectPointer, NULL, 0, TRUE);
-         CcUninitializeCacheMap(IrpSp->FileObject, NULL, NULL);
- 
-         UNLOCK_FCB;
-         UNLOCK_PAGING_FCB;
-         UNLOCK_FCB_LIST;
- 
- #if 0
-     } except(EXCEPTION_EXECUTE_HANDLER)
-     {
- 	STATUS(STATUS_UNSUCCESSFUL, 0);
- 	ExReleaseResourceLite(&ext->fcbLock);
- 	FsRtlExitFileSystem();
-     }
- #endif
- 
-     ret = Irp->IoStatus.Status;
-     COMPLETE;
-     return ret;
- }
- 
- 
- /**********************************************************
-  * AfsRdrClose
-  * - handle actual unlinking
-  * - handle closing
-  **********************************************************/
- NTSTATUS AfsRdrClose(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     ULONG length;
-     wchar_t *name;
-     char kill;
-     KEVENT ev;
-     LARGE_INTEGER timeout;
-     afs_ccb_t *ccb, *curr;
- 
-     if (IrpSp->FileObject->FileName.Length == 0)
- 	SYNC_FAIL(STATUS_SUCCESS);
- 
-     ccb = IrpSp->FileObject->FsContext2;
-     LOCK_FCB_LIST;
- 
-     ObDereferenceObject(ccb->token);
- 
-     curr = fcb->ccb_list;
-     if (fcb->ccb_list == ccb)
- 	fcb->ccb_list = fcb->ccb_list->next;
-     else
- 	while (curr->next)
-         {
-             if (curr->next == ccb)
-             {
-                 curr->next = curr->next->next;
-                 break;
-             }
-             curr = curr->next;
-         }
- 
-     if (!fcb->ccb_list)
-     {
- 	uc_close(fcb->fid);
- 	if (fcb->delPending)
-         {
-             uc_unlink(ccb->name+2);
-         }
- 	if (fcb->lock)
- 	    FsRtlFreeFileLock(fcb->lock);
- 	ExDeleteResourceLite(&fcb->_resource);
- 	ExDeleteResourceLite(&fcb->_pagingIoResource);
- 	RtlDeleteElementGenericTable(&rdrExt->fcbTable, &fcb);
- 	ExFreeToNPagedLookasideList(&rdrExt->fcbMemList, fcb);
-     }
- 
-     ExFreePoolWithTag(ccb->name, AFS_RDR_TAG);
-     if (ccb->filter && ccb->filter != SEARCH_MATCH_ALL)
- 	ExFreePoolWithTag(ccb->filter, AFS_RDR_TAG);
-     ExFreeToNPagedLookasideList(&rdrExt->ccbMemList, ccb);
- 
-     UNLOCK_FCB_LIST;
- 
-     SYNC_FAIL(STATUS_SUCCESS);
- }
- 
- 
- /**********************************************************
-  * AfsRdrShutdown
-  * - should flush all data
-  **********************************************************/
- NTSTATUS AfsRdrShutdown(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp)
- {
-     STATUS(STATUS_SUCCESS, 0);
-     COMPLETE;
-     return 0;
- }
- 
- 
- /**********************************************************
-  * AfsRdrFlushFile
-  * - flushes specified file to userspace and then disk
-  **********************************************************/
- NTSTATUS AfsRdrFlushFile(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     NTSTATUS ret;
-     afs_ccb_t *ccb;
- 
-     if (IsDeviceFile(IrpSp->FileObject))
- 	SYNC_RET(STATUS_INVALID_DEVICE_REQUEST);
- 
-     ccb = IrpSp->FileObject->FsContext2;
- 
-     CcFlushCache(&fcb->sectionPtrs, NULL, 0, &Irp->IoStatus);
-     uc_flush(fcb->fid);
- 
-     ret = Irp->IoStatus.Status;
-     COMPLETE;
-     return ret;
- }
- 
- 
- /**********************************************************
-  * AfsRdrLockCtrl
-  * - should handle lock requests
-  **********************************************************/
- NTSTATUS AfsRdrLockCtrl(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp, afs_fcb_t *fcb)
- {
-     NTSTATUS ret;
- 
-     /* complete lock on control device object without processing, as directed */
-     if (IrpSp->FileObject->FileName.Length == 0)
-     {
- 	rpt0(("lock", "lock granted on root device obj"));
- 	SYNC_FAIL(STATUS_SUCCESS);
-     }
- 
-     switch (IrpSp->MinorFunction)
-     {
- 	case IRP_MN_LOCK:
- 	case IRP_MN_UNLOCK_ALL:
- 	case IRP_MN_UNLOCK_ALL_BY_KEY:
- 	case IRP_MN_UNLOCK_SINGLE:
- 	    FsRtlEnterFileSystem();
- 	    LOCK_PAGING_FCB;
- 	    LOCK_FCB;
- 	    if (!fcb->lock)
- 		{
- 		fcb->lock = FsRtlAllocateFileLock(NULL, NULL);
- 		}
- 	    UNLOCK_FCB;
- 	    UNLOCK_PAGING_FCB;
- 	    FsRtlExitFileSystem();
- 	    FsRtlProcessFileLock(fcb->lock, Irp, NULL);
- 	    fcb->IsFastIoPossible = fcb->lock->FastIoIsQuestionable ? FastIoIsQuestionable : FastIoIsPossible;
- 	    return STATUS_PENDING;
- 	default:
- 	    SYNC_FAIL2(STATUS_NOT_IMPLEMENTED, 0);
-     }
-     SYNC_FAIL2(/*STATUS_LOCK_NOT_GRANTED*//*STATUS_NOT_IMPLEMENTED*/STATUS_SUCCESS, 0);
- 
-     /*EXCEPT(STATUS_UNSUCCESSFUL, 0);*/
- }
- 
- 
- /**********************************************************
-  * AfsRdrQueryVol
-  * - handle volume information requests
-  **********************************************************/
- NTSTATUS AfsRdrQueryVol(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp)
- {
-     FILE_FS_ATTRIBUTE_INFORMATION *infoAttr;
-     FILE_FS_DEVICE_INFORMATION *infoDevice;
-     FILE_FS_SIZE_INFORMATION * infoSize;
-     FILE_FS_VOLUME_INFORMATION *infoVolume;
-     NTSTATUS ret;
- 
-     TRY
- 
-         switch (IrpSp->Parameters.QueryVolume.FsInformationClass)
- 	{
- 	case FileFsAttributeInformation:
-             infoAttr = (FILE_FS_ATTRIBUTE_INFORMATION*)Irp->AssociatedIrp.SystemBuffer;
-             memset(infoAttr, 0, sizeof(FILE_FS_ATTRIBUTE_INFORMATION));
-             infoAttr->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES | FILE_CASE_SENSITIVE_SEARCH;	//TODOTODO:?
-             infoAttr->MaximumComponentNameLength = 255;		// should this be 255?
-             ///RtlCopyMemory(infoAttr->FileSystemName, L"AFS", 2);
-             ///infoAttr->FileSystemNameLength = 2;
-             //StringCbCopyLen(infoAttr->FileSystemName, IrpSp->Parameters.QueryVolume.Length-sizeof(*infoAttr)-2, L"AFS", &infoAttr->FileSystemNameLength);
-             //IrpSp->Parameters.QueryVolume.Length = 0;
-             //Irp->IoStatus.Information = sizeof(*infoAttr) + (infoAttr->FileSystemNameLength - sizeof(WCHAR));
-             if (sizeof(*infoAttr) + wcslen(AFS_FS_NAME)*sizeof(wchar_t) > IrpSp->Parameters.QueryVolume.Length)
-             {
-                 infoAttr->FileSystemNameLength = 0;
-                 rpt0(("vol", "overflowing attr buffer %d", IrpSp->Parameters.QueryVolume.Length));
-                 SYNC_FAIL2(STATUS_BUFFER_OVERFLOW, sizeof(*infoAttr));
-             }
-             else
-             {
-                 infoAttr->FileSystemNameLength = wcslen(AFS_FS_NAME)*sizeof(wchar_t);
-                 StringCbCopyW(infoAttr->FileSystemName, IrpSp->Parameters.QueryVolume.Length - sizeof(*infoAttr) + sizeof(WCHAR), AFS_FS_NAME);
-                 SYNC_FAIL2(STATUS_SUCCESS, sizeof(*infoAttr) + (infoAttr->FileSystemNameLength - sizeof(WCHAR)));
-             }		
-             break;
- 
- 	case FileFsDeviceInformation:
-             infoDevice = (FILE_FS_DEVICE_INFORMATION*)Irp->AssociatedIrp.SystemBuffer;
-             memset(infoDevice, 0, sizeof(FILE_FS_DEVICE_INFORMATION));
-             infoDevice->DeviceType = FILE_DEVICE_DISK;//DeviceObject->DeviceType;// FILE_DEVICE_NETWORK_FILE_SYSTEM;
-             infoDevice->Characteristics = DeviceObject->Characteristics;//FILE_DEVICE_IS_MOUNTED /*| FILE_REMOTE_DEVICE*/;		// remote device?
-             IrpSp->Parameters.QueryVolume.Length = sizeof(*infoDevice);
-             SYNC_FAIL2(STATUS_SUCCESS, IrpSp->Parameters.QueryVolume.Length);
-             break;
- 
- 	case FileFsSizeInformation:
-             infoSize = (FILE_FS_SIZE_INFORMATION*)Irp->AssociatedIrp.SystemBuffer;
-             memset(infoSize, 0, sizeof(FILE_FS_SIZE_INFORMATION));
- 			/* this data needs to come from an upcall */
-             infoSize->TotalAllocationUnits.QuadPart =		0x00000000F0000000;
-             infoSize->AvailableAllocationUnits.QuadPart =	0x00000000E0000000;
-             infoSize->SectorsPerAllocationUnit = 1;
-             infoSize->BytesPerSector = 1;
-             IrpSp->Parameters.QueryVolume.Length = sizeof(*infoSize);
-             SYNC_FAIL2(STATUS_SUCCESS, IrpSp->Parameters.QueryVolume.Length);
-             break;
- 
- 	case FileFsVolumeInformation:
-             infoVolume = (FILE_FS_VOLUME_INFORMATION*)Irp->AssociatedIrp.SystemBuffer;
-             memset(infoVolume, 0, sizeof(FILE_FS_VOLUME_INFORMATION));
- 			/* this data needs to come from an upcall */
-             infoVolume->VolumeCreationTime.QuadPart = AfsTimeToWindowsTime(1080000000);
-             infoVolume->VolumeSerialNumber = 0x12345678;
-             infoVolume->SupportsObjects = FALSE;
-             //StringCbCopyLen(infoVolume->VolumeLabel, IrpSp->Parameters.QueryVolume.Length-sizeof(*infoVolume)-2, L"AfsRed", &infoVolume->VolumeLabelLength);
-             //IrpSp->Parameters.QueryVolume.Length = 0;
-             if (sizeof(*infoVolume) + 12 > IrpSp->Parameters.QueryVolume.Length)
-             {
-                 infoVolume->VolumeLabelLength = 0;
-                 SYNC_FAIL2(STATUS_BUFFER_OVERFLOW, sizeof(*infoVolume));
-             }
-             else
-             {
-                 infoVolume->VolumeLabelLength = 12;
-                 RtlCopyMemory(infoVolume->VolumeLabel, L"AfsRed", 12);
-                 SYNC_FAIL2(STATUS_SUCCESS, sizeof(*infoVolume) + (infoVolume->VolumeLabelLength - sizeof(WCHAR)));
-             }		
-             break;
- 	}
- 
-     EXCEPT(STATUS_UNSUCCESSFUL, 0);
- 
-     rpt0(("vol", "vol class %d unknown", IrpSp->Parameters.QueryVolume.FsInformationClass));
-     SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
- }
- 
- VOID AfsRdrUnload(DRIVER_OBJECT *DriverObject)
- {
-     UNICODE_STRING userModeName;
- 
-     FsRtlNotifyUninitializeSync(&rdrExt->notifyList);
- 
-     RtlInitUnicodeString(&userModeName, L"\\DosDevices\\afscom");
-     IoDeleteSymbolicLink(&userModeName);
- 
-     /*RtlInitUnicodeString(&userModeName, L"\\DosDevices\\T:");
-     IoDeleteSymbolicLink(&userModeName);*/
- 
-     ExDeleteNPagedLookasideList(&rdrExt->fcbMemList);
-     ExDeleteNPagedLookasideList(&rdrExt->ccbMemList);
- 
-     rpc_shutdown();
- 
-     IoDeleteDevice(ComDevice);
-     IoDeleteDevice(RdrDevice);
- 
-     KdPrint(("RdrUnload exiting.\n"));
- }
- 
- 
- // handles all non-handled irp's synchronously
- NTSTATUS AfsRdrNull(DEVICE_OBJECT *DeviceObject, IRP *Irp, IO_STACK_LOCATION *IrpSp)
- {
-     NTSTATUS ret;
- 
-     /*TRY
-     rpt0(("kunhand", IrpMjFuncDesc[IrpSp->MajorFunction]));*/
- 
-     SYNC_FAIL(STATUS_NOT_IMPLEMENTED);
- 
-     /*EXCEPT(STATUS_UNSUCCESSFUL, 0);
- 
-     ret = Irp->IoStatus.Status;
-     COMPLETE_NO_BOOST;
-     return ret;*/
- }
- 
- NTSTATUS ComDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp)
- {
-     IO_STACK_LOCATION *IrpSp, *IrpSpClient;
-     NTSTATUS ret;
-     struct ComExtension *ext;
-     void *ptr, *ptr2;
-     rpc_t find, *find_ptr;
-     LARGE_INTEGER timeout;
-     struct afsFcb *fcb;
-     rpc_t *rpc, **rpcp;
-     ULONG len;
-     ULONG code, read;
-     PACCESS_TOKEN acc_token;
-     PVOID waitPair[2];
- 
-     ext = (struct ComExtension *)DeviceObject->DeviceExtension;
-     IrpSp = IoGetCurrentIrpStackLocation(Irp);
- 
-     switch (IrpSp->MajorFunction)
-     {
-     case IRP_MJ_CREATE:
-         IrpSp->FileObject->FsContext = 0;
-         IrpSp->FileObject->FsContext2 = 0;
-         if (IrpSp->FileObject->FileName.Length)
-         {
-             /* ioctls come from fs, vos, bos, etc. using a pre-existing interface */
-             /* downcalls come from afsd, using a new interface */
-             /* upcall hooks come from afsd */
-             if (!wcscmp(IrpSp->FileObject->FileName.Buffer, L"\\ioctl"))
-                 IrpSp->FileObject->FsContext2 = COMM_IOCTL;
-             else if (!wcscmp(IrpSp->FileObject->FileName.Buffer, L"\\downcall"))
-                 IrpSp->FileObject->FsContext2 = COMM_DOWNCALL;
-             else if (!wcscmp(IrpSp->FileObject->FileName.Buffer, L"\\upcallhook"))
-                 IrpSp->FileObject->FsContext2 = COMM_UPCALLHOOK;
-         }
-         if (!IrpSp->FileObject->FsContext2)
-             SYNC_FAIL2(STATUS_INVALID_DEVICE_REQUEST, 0);
- 
-         acc_token = SeQuerySubjectContextToken(&IrpSp->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext);
-         ASSERT(acc_token);
-         /* SeQueryAuthenticationIdToken */
-         IrpSp->FileObject->FsContext = acc_token;
-         STATUS(STATUS_SUCCESS, FILE_OPENED);
-         break;
- 
-     case IRP_MJ_CLEANUP:
-         /* acc_token does not have to be released */
-     case IRP_MJ_CLOSE:
-         STATUS(STATUS_SUCCESS, 0);
-         break;
- 
-     case IRP_MJ_WRITE:
-         /* we only process MDL writes */
-         if (!Irp->MdlAddress ||
-              !(ptr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority)))	/* should be LowPagePriority */
-             SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
-         if (!IrpSp->FileObject->FsContext ||
-              !IrpSp->FileObject->FsContext2)
-             SYNC_FAIL(STATUS_INVALID_HANDLE);
- 
-         if (IrpSp->FileObject->FsContext2 == COMM_UPCALLHOOK)
-         {
-             rpc_recv(ptr, IrpSp->Parameters.Write.Length);
-             STATUS(STATUS_SUCCESS, IrpSp->Parameters.Write.Length);
-         }
-         else
-             STATUS(STATUS_INVALID_DEVICE_REQUEST, 0);
-         break;
-     case IRP_MJ_READ:
-         if (!Irp->MdlAddress || !(ptr = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority)))	// should be LowPagePriority
-             SYNC_FAIL(STATUS_INSUFFICIENT_RESOURCES);
- 
-         if (IrpSp->FileObject->FsContext2 == COMM_UPCALLHOOK)
-         {
- 	    KeClearEvent(&comExt->cancelEvent);
- 
-             timeout.QuadPart = -100000000L;
- 	    waitPair[0] = &comExt->outEvent;
- 	    waitPair[1] = &comExt->cancelEvent;
-             ret = KeWaitForMultipleObjects(2, waitPair, WaitAny, Executive, KernelMode, FALSE, &timeout, NULL);
- 
- 	    if (ret == STATUS_WAIT_1)
- 		SYNC_FAIL(STATUS_UNSUCCESSFUL);
- 
-             if (!rpc_send(ptr, IrpSp->Parameters.Read.Length, &read))
-             {
-                 KeClearEvent(&comExt->outEvent);
- 	        ret = KeWaitForMultipleObjects(2, waitPair, WaitAny, Executive, KernelMode, FALSE, &timeout, NULL);
-                 if (!rpc_send(ptr, IrpSp->Parameters.Read.Length, &read))
-                 {
-                     KeClearEvent(&comExt->outEvent);
-                     SYNC_FAIL(STATUS_UNSUCCESSFUL);
-                 }
-             }
-             SYNC_RET2(STATUS_SUCCESS, read);			/* complete with priority boost */
-         }
-         else
-             STATUS(STATUS_INVALID_DEVICE_REQUEST, 0);
-         break;
-     case IRP_MJ_DEVICE_CONTROL:
-         return AfsRdrDeviceControl(DeviceObject, Irp, IrpSp, NULL);
-     default:
-         STATUS(STATUS_INVALID_DEVICE_REQUEST, 0);
-         break;
-     }
- 
-     ret = Irp->IoStatus.Status;
-     COMPLETE;							/* complete with priority boost */
-     return ret;
- }
- 
- 
- /* handles all irp's for primary (fs) device */
- NTSTATUS Dispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp)
- {
-     IO_STACK_LOCATION *IrpSp;
-     NTSTATUS ret;
-     afs_fcb_t *fcb;
-     afs_ccb_t *ccb;
-     LARGE_INTEGER wait;
- 
-     if (DeviceObject->DeviceType == FILE_DEVICE_DATALINK)
- 	return ComDispatch(DeviceObject, Irp);
- 
-     IrpSp = IoGetCurrentIrpStackLocation(Irp);
- 
-     rpt4(("irp", "%s min %d on %d (%ws) %x %x", IrpMjFuncDesc[IrpSp->MajorFunction], IrpSp->MinorFunction, 0/*ExtractFid(IrpSp->FileObject->FsContext)*/, IrpSp->FileObject->FileName.Buffer, IrpSp->Flags, IrpSp->Parameters.Create.Options));
- 
-     fcb = IrpSp->FileObject->FsContext;
-     if (IrpSp->MajorFunction != IRP_MJ_CREATE)
- 	 ASSERT(fcb);
- 
-     if (IrpSp->FileObject && IrpSp->FileObject->FsContext2)
-     {
- 	ccb = IrpSp->FileObject->FsContext2;
- 	wait.QuadPart = -1000;
- 	while (rpc_set_context(ccb->token) != 0)			/* if there are no open thread spots... */
- 	    KeDelayExecutionThread(KernelMode, FALSE, &wait);		/* ...wait */
-     }
- 
-     switch (IrpSp->MajorFunction)
-     {
-     case IRP_MJ_CREATE:
-         ret = AfsRdrCreate(DeviceObject, Irp, IrpSp, NULL);			
-         break;
-     case IRP_MJ_DIRECTORY_CONTROL:
-         ret = AfsRdrDirCtrl(DeviceObject, Irp, IrpSp, fcb);			
-         break;
-     case IRP_MJ_READ:
-         ret = AfsRdrRead(DeviceObject, Irp, IrpSp, fcb);			
-         break;
-     case IRP_MJ_WRITE:
-         ret = AfsRdrWrite(DeviceObject, Irp, IrpSp, fcb);			        
-         break;
-     case IRP_MJ_CLOSE:
-         ret = AfsRdrClose(DeviceObject, Irp, IrpSp, fcb);		       
-         break;
-     case IRP_MJ_QUERY_INFORMATION:
-         ret = AfsRdrQueryInfo(DeviceObject, Irp, IrpSp, fcb);	       
-         break;
-     case IRP_MJ_DEVICE_CONTROL:
-         ret = AfsRdrDeviceControl(DeviceObject, Irp, IrpSp, fcb);	
-         break;
-     case IRP_MJ_CLEANUP:
-         ret = AfsRdrCleanup(DeviceObject, Irp, IrpSp, fcb);		       
-         break;
-     case IRP_MJ_LOCK_CONTROL:
-         ret = AfsRdrLockCtrl(DeviceObject, Irp, IrpSp, fcb);		
-         break;
-     case IRP_MJ_QUERY_VOLUME_INFORMATION:
-         ret = AfsRdrQueryVol(DeviceObject, Irp, IrpSp);				
-         break;
-     case IRP_MJ_SHUTDOWN:
-         ret = AfsRdrShutdown(DeviceObject, Irp, IrpSp);				
-         break;
-     case IRP_MJ_FILE_SYSTEM_CONTROL:
-         if (IrpSp->MinorFunction == IRP_MN_USER_FS_REQUEST &&
-              (IrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_REQUEST_OPLOCK_LEVEL_1 ||
-                IrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_REQUEST_OPLOCK_LEVEL_2 ||
-                IrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_REQUEST_BATCH_OPLOCK ||
-                IrpSp->Parameters.FileSystemControl.FsControlCode == FSCTL_REQUEST_FILTER_OPLOCK))
-             STATUS(STATUS_OPLOCK_NOT_GRANTED, 0);
-         else
-             STATUS(STATUS_INVALID_DEVICE_REQUEST/*STATUS_NOT_IMPLEMENTED*//*STATUS_INVALID_PARAMETER*/, 0);
- 		ret = Irp->IoStatus.Status;
-         goto complete;
-     case IRP_MJ_SET_INFORMATION:
-         ret = AfsRdrSetInfo(DeviceObject, Irp, IrpSp, fcb);			
-         break;
-     case IRP_MJ_FLUSH_BUFFERS:
-         ret = AfsRdrFlushFile(DeviceObject, Irp, IrpSp, fcb);		
-         break;
-     default:
-         ret = AfsRdrNull(DeviceObject, Irp, IrpSp);				       
-         break;
-     }
-     rpc_remove_context();
-     return ret;
- 
-   complete:
-     rpc_remove_context();
-     COMPLETE;
-     return ret;
- }
- 
- 
- BOOLEAN
- fastIoCheck (
-     IN struct _FILE_OBJECT *FileObject,
-     IN PLARGE_INTEGER FileOffset,
-     IN ULONG Length,
-     IN BOOLEAN Wait,
-     IN ULONG LockKey,
-     IN BOOLEAN CheckForReadOperation,
-     OUT PIO_STATUS_BLOCK IoStatus,
-     IN struct _DEVICE_OBJECT *DeviceObject
-     )
- {
- afs_fcb_t *fcb;
- LARGE_INTEGER temp;
- 
- fcb = FileObject->FsContext;
- ASSERT(fcb);
- 
- if (!fcb->lock)
-     return TRUE;
- 
- temp.QuadPart = Length;
- if (CheckForReadOperation)
-     return FsRtlFastCheckLockForRead(fcb->lock, FileOffset, &temp, LockKey, FileObject, IoGetCurrentProcess());
- return FsRtlFastCheckLockForWrite(fcb->lock, FileOffset, &temp, LockKey, FileObject, IoGetCurrentProcess());
- }
- 
- 
- BOOLEAN
- fastIoRead (
-     IN struct _FILE_OBJECT *FileObject,
-     IN PLARGE_INTEGER FileOffset,
-     IN ULONG Length,
-     IN BOOLEAN Wait,
-     IN ULONG LockKey,
-     OUT PVOID Buffer,
-     OUT PIO_STATUS_BLOCK IoStatus,
-     IN struct _DEVICE_OBJECT *DeviceObject
-     )
- {
-     BOOLEAN ret;
-     ULONG adj_len;
-     afs_fcb_t *fcb;
-     LARGE_INTEGER temp;
- 
-     fcb = FileObject->FsContext;
-     ASSERT(fcb);
- 
-     FsRtlEnterFileSystem();
-     LOCK_PAGING_FCB;
- 
-     if (fcb->lock)
-     {
- 	temp.QuadPart = Length;
- 	if (!FsRtlFastCheckLockForRead(fcb->lock, FileOffset, &temp, LockKey, FileObject, IoGetCurrentProcess()))
- 	{
- 	    UNLOCK_PAGING_FCB;
- 	    FsRtlExitFileSystem();
- 	    return FALSE;
- 	}
-     }
- 
-     adj_len = Length;
-     if (FileOffset->QuadPart > fcb->FileSize.QuadPart)
-     {
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
- 	IoStatus->Status = STATUS_END_OF_FILE;
- 	IoStatus->Information = 0;
- 	return TRUE;
-     }
-     if (FileOffset->QuadPart + Length > fcb->FileSize.QuadPart)
- 	adj_len = (ULONG)(fcb->FileSize.QuadPart - FileOffset->QuadPart);
- 
-     try
-     {
- 	ret = CcCopyRead(FileObject, FileOffset, adj_len, Wait, Buffer, IoStatus);
- 
- 	FileObject->CurrentByteOffset.QuadPart = FileOffset->QuadPart + IoStatus->Information;
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
-     }
-     except (EXCEPTION_EXECUTE_HANDLER)
-     {
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
- 	return FALSE;
-     }
-     return ret;
- }
- 
- BOOLEAN
- fastIoWrite (
-     IN struct _FILE_OBJECT *FileObject,
-     IN PLARGE_INTEGER FileOffset,
-     IN ULONG Length,
-     IN BOOLEAN Wait,
-     IN ULONG LockKey,
-     OUT PVOID Buffer,
-     OUT PIO_STATUS_BLOCK IoStatus,
-     IN struct _DEVICE_OBJECT *DeviceObject
-     )
- {
-     BOOLEAN ret;
-     LARGE_INTEGER adj_end;
-     afs_fcb_t *fcb;
-     LARGE_INTEGER temp;
- 
-     fcb = FileObject->FsContext;
-     ASSERT(fcb);
- 
-     FsRtlEnterFileSystem();
-     LOCK_PAGING_FCB;
- 
-     if (fcb->lock)
-     {
- 	temp.QuadPart = Length;
- 	if (!FsRtlFastCheckLockForWrite(fcb->lock, FileOffset, &temp, LockKey, FileObject, IoGetCurrentProcess()))
- 	{
- 	    UNLOCK_PAGING_FCB;
- 	    FsRtlExitFileSystem();
- 	    return FALSE;
- 	}
-     }
- 
- 
-     if (FileOffset->QuadPart + Length > fcb->FileSize.QuadPart)
-     {
- 	adj_end.QuadPart = FileOffset->QuadPart + Length;
- 	fcb->AllocationSize = fcb->FileSize = fcb->ValidDataLength = adj_end;
- 	LOCK_FCB;
- 	try
-         {
-             CcSetFileSizes(FileObject, (CC_FILE_SIZES*)&fcb->AllocationSize);
-         }
- 	except (EXCEPTION_EXECUTE_HANDLER)
-         {
-             UNLOCK_FCB;
-             UNLOCK_PAGING_FCB;
-             FsRtlExitFileSystem();
-             return FALSE;
-         }
- 	UNLOCK_FCB;
-     }
- 
-     try
-     {
- 	ret = CcCopyWrite(FileObject, FileOffset, Length, Wait, Buffer);
- 	IoStatus->Status = ret?STATUS_SUCCESS:STATUS_UNSUCCESSFUL;
- 	IoStatus->Information = ret?Length:0;
- 
- 	FileObject->CurrentByteOffset.QuadPart = FileOffset->QuadPart + IoStatus->Information;
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
-     }
-     except (EXCEPTION_EXECUTE_HANDLER)
-     {
- 	UNLOCK_PAGING_FCB;
- 	FsRtlExitFileSystem();
- 	return FALSE;
-     }
-     return ret;
- }
- 
- RTL_GENERIC_COMPARE_RESULTS FcbCompareRoutine(struct _RTL_GENERIC_TABLE *Table, PVOID FirstStruct, PVOID SecondStruct)
- {
-     afs_fcb_t *p1, *p2;
- 
-     p1 = (void*)*(afs_fcb_t**)FirstStruct;  p2 = (void*)*(afs_fcb_t**)SecondStruct;
-     if (p1->fid < p2->fid)
-         return GenericLessThan;
-     if (p1->fid > p2->fid)
-         return GenericGreaterThan;
-     return GenericEqual;
- }
- 
- RTL_GENERIC_COMPARE_RESULTS ReqCompareRoutine(struct _RTL_GENERIC_TABLE *Table, PVOID FirstStruct, PVOID SecondStruct)
- {
-     rpc_t *p1, *p2;
- 
-     p1 = *(rpc_t**)FirstStruct;  p2 = *(rpc_t**)SecondStruct;
-     if (p1->key < p2->key)
-         return GenericLessThan;
-     if (p1->key > p2->key)
-         return GenericGreaterThan;
-     return GenericEqual;
- }
- 
- PVOID AllocateRoutine(struct _RTL_GENERIC_TABLE *Table, CLONG  ByteSize)
- {
-     PVOID ret;
-     ret = ExAllocatePoolWithTag(NonPagedPool, ByteSize, AFS_RDR_TAG);
-     ASSERT(ret);
-     RtlZeroMemory(ret, ByteSize);
-     return ret;
- }
- 
- VOID FreeRoutine(struct _RTL_GENERIC_TABLE *Table, PVOID Buffer)
- {
-     ExFreePoolWithTag(Buffer, AFS_RDR_TAG);
- }
- 
- //KSPIN_LOCK rpc_lock;
- //KIRQL irql;
- FAST_MUTEX rpc_lock;
- 
- void ifs_lock_rpcs()
- {
-     ExAcquireFastMutex(&rpc_lock);
-     //KeAcquireSpinLock(&rpc_lock, &irql);
- }
- 
- void ifs_unlock_rpcs()
- {
-     ExReleaseFastMutex(&rpc_lock);
-     //KeReleaseSpinLock(&rpc_lock, irql);
- }
- 
- NTSTATUS DriverEntry(DRIVER_OBJECT *DriverObject, UNICODE_STRING *RegistryPath)
- {
-     NTSTATUS err;
-     UNICODE_STRING rdrName, comName, userModeName, userModeCom;
-     int x;
-     IO_STATUS_BLOCK status;
-     FAST_IO_DISPATCH *fastIoDispatch;
- 
-     //try {
-     RtlInitUnicodeString(&rdrName, L"\\Device\\afsrdr");
-     RtlInitUnicodeString(&comName, L"\\Device\\afscom");
- 
-     rpt0(("init", "kern initializing"));
-     //KeInitializeSpinLock(&rpc_lock);
-     ExInitializeFastMutex(&rpc_lock);
- 
-     IoAllocateDriverObjectExtension(DriverObject, (void *)0x394389f7, sizeof(FAST_IO_DISPATCH), &fastIoDispatch);
-     RtlZeroMemory(fastIoDispatch, sizeof(FAST_IO_DISPATCH));
-     fastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
-     fastIoDispatch->FastIoCheckIfPossible = fastIoCheck;
-     fastIoDispatch->FastIoRead = /*FsRtlCopyRead;*/fastIoRead;
-     fastIoDispatch->FastIoWrite = /*FsRtlCopyWrite;*/fastIoWrite;
-     DriverObject->FastIoDispatch = fastIoDispatch;
- 
-     for (x = 0; x < IRP_MJ_MAXIMUM_FUNCTION; x++)
- 	DriverObject->MajorFunction[x] = Dispatch;
-     DriverObject->DriverUnload = AfsRdrUnload;
- 
-     err = IoCreateDevice(DriverObject, sizeof(struct AfsRdrExtension)*2, &rdrName, FILE_DEVICE_NETWORK_FILE_SYSTEM, /*FILE_REMOTE_DEVICE*/0, FALSE, &RdrDevice);
-     if (!NT_SUCCESS(STATUS_SUCCESS))
- 	return STATUS_UNSUCCESSFUL;
-     err = IoCreateDevice(DriverObject, sizeof(struct ComExtension)*2, &comName, FILE_DEVICE_DATALINK, 0, FALSE, &ComDevice);
-     if (!NT_SUCCESS(STATUS_SUCCESS))
- 	return STATUS_UNSUCCESSFUL;
- 
-     RdrDevice->Flags |= DO_DIRECT_IO;
-     RdrDevice->StackSize = 5;					/* could this be zero? */
-     rdrExt = ((struct AfsRdrExtension*)RdrDevice->DeviceExtension);
-     RtlZeroMemory(rdrExt, sizeof(struct AfsRdrExtension));
- 
-     /* could raise exception */
-     FsRtlNotifyInitializeSync(&rdrExt->notifyList);
-     InitializeListHead(&rdrExt->listHead);
- 
-     rdrExt->callbacks.AcquireForLazyWrite = lazyWriteLock;
-     rdrExt->callbacks.ReleaseFromLazyWrite = lazyWriteUnlock;
-     rdrExt->callbacks.AcquireForReadAhead = readAheadLock;
-     rdrExt->callbacks.ReleaseFromReadAhead = readAheadUnlock;
-     ExInitializeNPagedLookasideList(&rdrExt->fcbMemList, NULL, NULL, 0, sizeof(afs_fcb_t), AFS_RDR_TAG, 0);
-     ExInitializeNPagedLookasideList(&rdrExt->ccbMemList, NULL, NULL, 0, sizeof(afs_ccb_t), AFS_RDR_TAG, 0);
-     ExInitializeFastMutex(&rdrExt->fcbLock);
-     RtlInitializeGenericTable(&rdrExt->fcbTable, FcbCompareRoutine, AllocateRoutine, FreeRoutine, NULL);
- 
- 
-     ComDevice->Flags |= DO_DIRECT_IO;
-     ComDevice->StackSize = 5;					// ??
-     comExt = ((struct ComExtension*)ComDevice->DeviceExtension);
-     RtlZeroMemory(comExt, sizeof(struct ComExtension));
- 
-     InitializeListHead(&comExt->outReqList);
-     KeInitializeSpinLock(&comExt->outLock);
-     ExInitializeFastMutex(&comExt->inLock);
-     KeInitializeEvent(&comExt->outEvent, SynchronizationEvent/*NotificationEvent*/, TRUE);
-     KeInitializeEvent(&comExt->cancelEvent, NotificationEvent, TRUE);
- 
-     comExt->rdr = rdrExt;
-     rdrExt->com = comExt;
- 
-     RtlInitUnicodeString(&userModeCom, L"\\DosDevices\\afscom");
-     err = IoCreateSymbolicLink(&userModeCom, &comName);
- 
-     /*RtlInitUnicodeString(&rdrName, L"\\Device\\afsrdr\\1\\CITI.UMICH.EDU");
-     RtlInitUnicodeString(&userModeName, L"\\DosDevices\\W:");
-     err = IoCreateSymbolicLink(&userModeName, &rdrName);*/
- 
-     /*} except(EXCEPTION_EXECUTE_HANDLER)
-     {
-     return -1;
-     }*/
- 
-     KdPrint(("DriverEntry exiting.\n"));
-     return STATUS_SUCCESS;
- }
--- 0 ----
Index: openafs/src/WINNT/afsrdr/afsrdr.h
diff -c openafs/src/WINNT/afsrdr/afsrdr.h:1.2 openafs/src/WINNT/afsrdr/afsrdr.h:removed
*** openafs/src/WINNT/afsrdr/afsrdr.h:1.2	Thu Aug  4 12:32:39 2005
--- openafs/src/WINNT/afsrdr/afsrdr.h	Sat Mar 22 21:01:36 2008
***************
*** 1,66 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- /* versioning history
-  * 
-  * 03-jun 2005 (eric williams) entered into versioning
-  */
- 
- #include <ntifs.h>
- 
- #define rpt0(args) 
- #define rpt1(args) 
- #define rpt2(args) 
- #define rpt3(args) 
- #define rpt4(args) 
- #define rpt5(args) 
- 
- struct AfsRdrExtension
- {
- struct ComExtension *com;
- PNOTIFY_SYNC notifyList;
- LIST_ENTRY listHead;
- NPAGED_LOOKASIDE_LIST fcbMemList;
- FAST_MUTEX fcbLock;
- NPAGED_LOOKASIDE_LIST ccbMemList;
- RTL_GENERIC_TABLE fcbTable;
- CACHE_MANAGER_CALLBACKS callbacks;
- };
- 
- struct ComExtension
- {
- struct AfsRdrExtension *rdr;
- LIST_ENTRY outReqList;
- KSPIN_LOCK outLock;
- FAST_MUTEX inLock;
- KEVENT outEvent, cancelEvent;
- };
- 
- extern struct AfsRdrExtension *rdrExt;
- extern struct ComExtension *comExt;
- 
- 
- void ifs_lock_rpcs();
- void ifs_unlock_rpcs();
--- 0 ----
Index: openafs/src/WINNT/afsrdr/afsrdr.rc
diff -c openafs/src/WINNT/afsrdr/afsrdr.rc:1.1 openafs/src/WINNT/afsrdr/afsrdr.rc:removed
*** openafs/src/WINNT/afsrdr/afsrdr.rc:1.1	Thu Aug  4 12:32:39 2005
--- openafs/src/WINNT/afsrdr/afsrdr.rc	Sat Mar 22 21:01:36 2008
***************
*** 1,59 ****
- /*
-  * Copyright 2000, International Business Machines Corporation and others.
-  * All Rights Reserved.
-  * 
-  * This software has been released under the terms of the IBM Public
-  * License.  For details, see the LICENSE file in the top-level source
-  * directory or online at http://www.openafs.org/dl/license10.html
-  */
- 
- /* Define VERSIONINFO resource */
- 
- #define  AFS_VERINFO_FILE_DESCRIPTION "AFS Network Redirector Driver"
- #define AFS_VERINFO_NAME "afsrdr"
- #define AFS_VERINFO_FILENAME "afsrdr.sys"
- 
- #include "..\afsd\AFS_component_version_number.h"
- 
- #include <winver.h>
- 
- 1 VERSIONINFO
-     FILEVERSION AFS_VERINFO_FILEVER
-     PRODUCTVERSION AFS_VERINFO_FILEVER
-     FILEOS VOS_NT
- #ifdef AFS_VERINFO_DLL
-     FILETYPE VFT_DLL
- #else
-     FILETYPE VFT_APP
- #endif
- BEGIN
-     BLOCK "StringFileInfo"
-     /* FileVersion must be specified or data won't appear on properties tab */
-     /* Internalname and originalfilename must be specified or explorer won't
-        show version and description */
-     BEGIN
-         BLOCK "000004E4"
-         BEGIN
-             VALUE "CompanyName",        "OpenAFS Project", "\0"
-             VALUE "LegalCopyright",     "Copyright \251 the Regents of the University of Michigan, 2005.", "\0"
-             VALUE "ProductName",        "OpenAFS for Windows", "\0"
-             VALUE "ProductVersion",     "1.0", "\0"
-             VALUE "FileVersion",        "1.0", "\0"
-             VALUE "FileDescription",    AFS_VERINFO_FILE_DESCRIPTION, "\0"
-             VALUE "Build",              AFS_VERINFO_BUILD, "\0"
-             VALUE "InternalName",       AFS_VERINFO_NAME, "\0"
-             VALUE "OriginalFilename",   AFS_VERINFO_FILENAME, "\0"
-         END
-     END
-     /* files in msi's are supposed to have language codes attached to them.
-        this is how they get populated automatically */
-     BLOCK "VarFileInfo"
-     BEGIN
- #ifdef AFS_VERINFO_LANG_CODE
-         VALUE "Translation", AFS_VERINFO_LANG_CODE, AFS_VERINFO_CHARSET
- #else
- /* default to 0, 1252 */
-         VALUE "Translation", 0, 0x4e4
- #endif
-     END
- END
--- 0 ----
Index: openafs/src/WINNT/afsrdr/ifs_rpc.c
diff -c openafs/src/WINNT/afsrdr/ifs_rpc.c:1.3.4.2 openafs/src/WINNT/afsrdr/ifs_rpc.c:removed
*** openafs/src/WINNT/afsrdr/ifs_rpc.c:1.3.4.2	Thu Jul 20 17:46:21 2006
--- openafs/src/WINNT/afsrdr/ifs_rpc.c	Sat Mar 22 21:01:37 2008
***************
*** 1,1294 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- /* versioning history
-  * 
-  * 03-jun 2005 (eric williams) entered into versioning
-  */
- 
- #ifdef RPC_KERN
- #include <ntifs.h>
- #include "ifs_rpc.h"
- #include "afsrdr.h"
- #else
- #include "ifs_rpc.h"
- #endif
- #include "kif.h"
- 
- /* general internal functions */
- rpc_t *rpc_create(int size_hint);
- void rpc_destroy(rpc_t *rpc);
- int rpc_marshal_long(rpc_t *rpc, ULONG data);
- int rpc_marshal_longlong(rpc_t *rpc, LARGE_INTEGER data);
- int rpc_marshal_wstr(rpc_t *rpc, WCHAR *str);
- int rpc_unmarshal_long(rpc_t *rpc, ULONG *data);
- int rpc_unmarshal_longlong(rpc_t *rpc, LARGE_INTEGER *data);
- int rpc_unmarshal_wstr(rpc_t *rpc, WCHAR *str);
- 
- /* kernel-queue specific internal functions */
- #ifdef RPC_KERN
- int rpc_queue(rpc_t *rpc);
- rpc_queue_bulk(rpc_t *rpc, char *out_bulk, ULONG out_len, char *in_bulk, ULONG in_len);
- rpc_cancel(rpc_t *rpc);
- rpc_send_reg(rpc_t *rpc, char *out_buf);
- rpc_queue_bulk_mdl(rpc_t *rpc, MDL *mdl);
- rpc_t *rpc_find(int id);
- rpc_t *rpc_upgrade(rpc_t *rpc, int old_status, int new_status);
- rpc_wait(rpc_t *rpc, BOOLEAN long_op);
- rpc_send_mdl(rpc_t *rpc, char *out_buf);
- #endif
- 
- 
- /****** rpc security kernel functions ******/
- /* before making an upcall from kernel code, set the security context by
-  * passing the access_token to rpc_set_context.  remove the context after all
-  * upcalls are done.  the rpc library automatically checks and sets this
-  * same context on the other end. */
- #ifdef RPC_KERN
- struct rpc_cred_map_entry
- {
-     void *token;
-     PETHREAD thread;
-     int refs;
- };
- 
- struct rpc_cred_map_entry cred_map[MAX_CRED_MAPS];
- rpc_t *rpc_list_head = NULL;
- long num_rpcs = 0;
- 
- rpc_set_context(void *context)
- {
-     int x, empty, ret;
-     PETHREAD thd;
- 
-     thd = PsGetCurrentThread();
-     empty = -1;
-     ret = 0;
- 
-     ifs_lock_rpcs();
-     for (x = 0; x < MAX_CRED_MAPS; x++)
-     {
-         if (cred_map[x].thread == NULL)
-             empty = x;
-         if (cred_map[x].thread == thd)
-         {
-             //////FIX///ASSERT(cred_map[x].token == context);
- 	    cred_map[x].refs++;
- 	    //cred_map[x].token = context;
-             goto done;
-         }
-     }
-     if (empty != -1)
-     {
-         cred_map[empty].thread = thd;
-         cred_map[empty].token = context;
- 	cred_map[empty].refs = 1;
-     }
-     else
-         ret = -1;
- 
-   done:
-     ifs_unlock_rpcs();
-     return ret;
- }
- 
- void *rpc_get_context()
- {
-     int x;
-     PETHREAD thd;
- 
-     thd = PsGetCurrentThread();
- 
-     // no lock
-     for (x = 0; x < MAX_CRED_MAPS; x++)
-         if (cred_map[x].thread == thd)
-             return cred_map[x].token;
-     // no unlock
-     return NULL;
- }
- 
- rpc_remove_context()
- {
-     int x;
-     PETHREAD thd;
- 
-     thd = PsGetCurrentThread();
-     ifs_lock_rpcs();
-     for (x = 0; x < MAX_CRED_MAPS; x++)
-         if (cred_map[x].thread == thd)
-         {
- 	    if (cred_map[x].refs > 1)
- 		{
- 	        cred_map[x].refs--;
- 		}
- 	    else
- 		{
- 		cred_map[x].token = NULL;
- 		cred_map[x].thread = NULL;
- 		}
- 	    ifs_unlock_rpcs();
-             return 0;
-         }
- 
-     ifs_unlock_rpcs();
-     return -1;
- }
- #endif
- 
- 
- /* rpc stubs in kernel */
- #ifdef RPC_KERN
- rpc_t *rpc_create(int size_hint)
- {
-     ULONG size;
-     rpc_t *rpc;
-     SECURITY_SUBJECT_CONTEXT subj_context;
-     PACCESS_TOKEN acc_token;
-     LUID auth_id;
-     LARGE_INTEGER user_id;
-     NTSTATUS status;
-     HANDLE token;
- 
-     /* get user's identification from auth token*/
-     token = rpc_get_context();
-     ASSERT(token);
-     status = SeQueryAuthenticationIdToken(token, &auth_id);
- 
-     user_id.LowPart = auth_id.LowPart;
-     user_id.HighPart = auth_id.HighPart;
- 
-     ifs_lock_rpcs();
- 
-     if (!(rpc = rpc_upgrade(NULL, 0, 1)))
-     {
-         size = sizeof(rpc_t) + 2*RPC_BUF_SIZE;
-         rpc = ExAllocatePoolWithTag(NonPagedPool, size, 0x1234);
-         if (!rpc)
-             return NULL;
- 	num_rpcs++;
-         memset(rpc, 0, size);
-         rpc->next = rpc_list_head;
-         rpc_list_head = rpc;
-         rpc_upgrade(rpc, 0, 1);
-     }
- 
-     rpc->out_buf = rpc->out_pos = (char*)(rpc+1);
-     rpc->in_buf = rpc->in_pos = ((char*)(rpc+1))+RPC_BUF_SIZE;
- 
-     rpc->key = rand() + 10;
-     rpc_marshal_long(rpc, rpc->key);
-     rpc->bulk_out_len = (ULONG*)rpc->out_pos;
-     rpc_marshal_long(rpc, 0);
- 
- #if 0
-     /* another way of obtaining credentials, with different effects */
-     SeCaptureSubjectContext(&subj_context);
-     acc_token = SeQuerySubjectContextToken(&subj_context);
-     status = SeQueryAuthenticationIdToken(acc_token, &auth_id);
- 
-     user_id.LowPart = auth_id.LowPart;
-     user_id.HighPart = auth_id.HighPart;
-     SeReleaseSubjectContext(&subj_context);
- #endif
- 
-     rpc_marshal_longlong(rpc, user_id);
- 
-     ifs_unlock_rpcs();
- 
-     return rpc;
- }
- 
- void rpc_destroy(rpc_t *rpc)
- {
-     rpc_t *curr;
-     int count;
- 
-     ifs_lock_rpcs();
- 
-     if (rpc_upgrade(rpc, -1, 0))
-         ;
- 
-     ifs_unlock_rpcs();
- }
- #endif
- 
- 
- /* rpc internal functions for usermode */
- #ifndef RPC_KERN
- rpc_t *rpc_create(int size_hint)
- {
-     ULONG size;
-     rpc_t *rpc;
- 
-     size = sizeof(rpc_t) + 2*RPC_BUF_SIZE;
-     rpc = malloc(size);
-     if (!rpc)
- 	osi_panic("ifs_rpc: alloc buffer", __FILE__, __LINE__);
-     memset(rpc, 0, size);
- 
-     rpc->out_buf = rpc->out_pos = (char*)(rpc+1);
-     rpc->in_buf = rpc->in_pos = ((char*)(rpc+1)) + RPC_BUF_SIZE;
- 
-     rpc->key = rand() + 10;
-     rpc_marshal_long(rpc, rpc->key);
- 
-     return rpc;
- }
- 
- void rpc_destroy(rpc_t *rpc)
- {
-     if (!rpc)
-         return;
- 
-     free(rpc);
- }
- 
- rpc_transact(rpc_t *rpc)
- {
-     ULONG header_len;
-     DWORD read = 0;
- 
-     if (!rpc)
-         return IFSL_GENERIC_FAILURE;
- 
-     header_len = rpc->out_pos - rpc->out_buf;
- 
-     read = RPC_BUF_SIZE;
-     return ifs_TransactRpc(rpc->out_buf, header_len, rpc->in_buf, &read);
- }
- #endif
- 
- 
- /* upcall stubs */
- #ifdef RPC_KERN
- long
- uc_namei(WCHAR *name, ULONG *fid)
- {
-     rpc_t *rpc;
-     ULONG status;
-     MDL *mdl;
- 
- 	/* consider putting namei cache here */
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_NAMEI);
-     rpc_marshal_long(rpc, wcslen(name));
- 
-     rpc_queue_bulk(rpc, (void*)name, (wcslen(name)+1)*sizeof(wchar_t), NULL, 0);
- 
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel namei"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, fid);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_check_access(ULONG fid, ULONG access, ULONG *granted)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_CHECK_ACCESS);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_long(rpc, access);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel access"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, granted);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_create(WCHAR *name, ULONG attribs, LARGE_INTEGER alloc, ULONG access, ULONG *granted, ULONG *fid)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_CREATE);
-     rpc_marshal_long(rpc, attribs);
-     rpc_marshal_longlong(rpc, alloc);
-     rpc_marshal_long(rpc, access);
- 
-     rpc_queue_bulk(rpc, (void*)name, (wcslen(name)+1)*sizeof(wchar_t), NULL, 0);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel create"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, granted);
-     rpc_unmarshal_long(rpc, fid);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_stat(ULONG fid, ULONG *attribs, LARGE_INTEGER *size, LARGE_INTEGER *creation, LARGE_INTEGER *access, LARGE_INTEGER *change, LARGE_INTEGER *written)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_STAT);
-     rpc_marshal_long(rpc, fid);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel stat"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, attribs);
-     rpc_unmarshal_longlong(rpc, size);
-     rpc_unmarshal_longlong(rpc, creation);
-     rpc_unmarshal_longlong(rpc, access);
-     rpc_unmarshal_longlong(rpc, change);
-     rpc_unmarshal_longlong(rpc, written);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_setinfo(ULONG fid, ULONG attribs, LARGE_INTEGER creation, LARGE_INTEGER access, LARGE_INTEGER change, LARGE_INTEGER written)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_SETINFO);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_long(rpc, attribs);
-     rpc_marshal_longlong(rpc, creation);
-     rpc_marshal_longlong(rpc, access);
-     rpc_marshal_longlong(rpc, change);
-     rpc_marshal_longlong(rpc, written);
- 
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel setinfo"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_trunc(ULONG fid, LARGE_INTEGER size)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_TRUNC);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_longlong(rpc, size);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel trunc"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_read(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *read, char *data)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_READ);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_longlong(rpc, offset);
-     rpc_marshal_long(rpc, length);
- 
-     rpc_queue_bulk(rpc, NULL, 0, data, length);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_LONG))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel read"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, read);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_write(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *written, char *data)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_WRITE);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_longlong(rpc, offset);
-     rpc_marshal_long(rpc, length);
- 
-     rpc_queue_bulk(rpc, data, length, NULL, 0);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_LONG))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel write"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, written);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_readdir(ULONG fid, LARGE_INTEGER cookie_in, WCHAR *filter, ULONG *count, char *data, ULONG *len)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_READDIR);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_longlong(rpc, cookie_in);
-     rpc_marshal_wstr(rpc, filter);
-     rpc_marshal_long(rpc, *len);
- 
-     rpc_queue_bulk(rpc, NULL, 0, data, *len);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel readdir"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, count);
-     rpc_unmarshal_long(rpc, len);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_close(ULONG fid)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_CLOSE);
-     rpc_marshal_long(rpc, fid);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_LONG))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel close"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_unlink(WCHAR *name)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_UNLINK);
-     rpc_marshal_wstr(rpc, name);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel unlink"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_ioctl_write(ULONG length, char *data, ULONG *key)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_IOCTL_WRITE);
-     rpc_marshal_long(rpc, length);
- 
-     rpc_queue_bulk(rpc, data, length, NULL, 0);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel ioctl write"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, key);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_ioctl_read(ULONG key, ULONG *length, char *data)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_IOCTL_READ);
-     rpc_marshal_long(rpc, key);
- 
-     rpc_queue_bulk(rpc, NULL, 0, data, *length);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel ioctl read"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, length);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_rename(ULONG fid, WCHAR *curr, WCHAR *new_dir, WCHAR *new_name, ULONG *new_fid)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
-     if (!rpc)
- 	return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_RENAME);
-     rpc_marshal_long(rpc, fid);
-     rpc_marshal_wstr(rpc, curr);
-     rpc_marshal_wstr(rpc, new_dir);
-     rpc_marshal_wstr(rpc, new_name);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_SHORT))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel rename"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
-     rpc_unmarshal_long(rpc, new_fid);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long
- uc_flush(ULONG fid)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
-     if (!rpc)
- 	return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_FLUSH);
-     rpc_marshal_long(rpc, fid);
- 
-     rpc_queue(rpc);
-     if (!rpc_wait(rpc, RPC_TIMEOUT_LONG))
-     {
-         rpc_cancel(rpc);
-         rpt0(("cancel", "cancel flush"));
-         return IFSL_RPC_TIMEOUT;
-     }
- 
-     rpc_unmarshal_long(rpc, &status);
- 
-     rpc_destroy(rpc);
-     return status;
- }
- #endif
- 
- 
- /* downcall stubs */
- #ifndef RPC_KERN
- long dc_break_callback(ULONG fid)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_BREAK_CALLBACK);
-     rpc_marshal_long(rpc, fid);
-     if (!rpc_transact(rpc))
-     {
-         rpc_destroy(rpc);
-         return IFSL_GENERIC_FAILURE;
-     }
-     rpc_unmarshal_long(rpc, &status);
-     rpc_destroy(rpc);
-     return status;
- }
- 
- long dc_release_hooks(void)
- {
-     rpc_t *rpc;
-     ULONG status;
- 
-     rpc = rpc_create(0);
- 	if (!rpc)
- 		return IFSL_MEMORY;
- 
-     rpc_marshal_long(rpc, RPC_RELEASE_HOOKS);
-     if (!rpc_transact(rpc))
-     {
-         rpc_destroy(rpc);
-         return IFSL_GENERIC_FAILURE;
-     }
-     rpc_unmarshal_long(rpc, &status);
-     rpc_destroy(rpc);
-     return status;
- }
- #endif
- 
- 
- /* rpc packing function */
- rpc_marshal_long(rpc_t *rpc, ULONG data)
- {
-     memcpy(rpc->out_pos, &data, sizeof(ULONG));
-     rpc->out_pos += sizeof(ULONG);
-     return 0;
- }
- 
- rpc_marshal_longlong(rpc_t *rpc, LARGE_INTEGER data)
- {
-     memcpy(rpc->out_pos, &data, sizeof(LARGE_INTEGER));
-     rpc->out_pos += sizeof(LARGE_INTEGER);
-     return 0;
- }
- 
- rpc_marshal_wstr(rpc_t *rpc, WCHAR *str)
- {
-     long len;
-     len = wcslen(str);
-     rpc_marshal_long(rpc, len);
-     memcpy(rpc->out_pos, str, len*sizeof(WCHAR));
-     rpc->out_pos += len*sizeof(WCHAR);
-     return 0;
- }
- 
- 
- rpc_unmarshal_long(rpc_t *rpc, ULONG *data)
- {
-     memcpy(data, rpc->in_pos, sizeof(ULONG));
-     rpc->in_pos += sizeof(ULONG);
-     return 0;
- }
- 
- rpc_unmarshal_longlong(rpc_t *rpc, LARGE_INTEGER *data)
- {
-     memcpy(data, rpc->in_pos, sizeof(LARGE_INTEGER));
-     rpc->in_pos += sizeof(LARGE_INTEGER);
-     return 0;
- }
- 
- rpc_unmarshal_wstr(rpc_t *rpc, WCHAR *str)//, int len)
- {
-     long len;
-     rpc_unmarshal_long(rpc, &len);
-     memcpy(str, rpc->in_pos, len*sizeof(WCHAR));
-     rpc->in_pos += len*sizeof(WCHAR);
-     str[len] = L'\0';
-     return 0;
- }
- 
- 
- /* kernel-queue management functions */
- #ifdef RPC_KERN
- rpc_t *rpc_find(int id)
- {
-     rpc_t *curr;
- 
-     curr = rpc_list_head;
-     while (curr)
-     {
-         /* dead rpc structs should not be returned */
-         if (curr->key == id && curr->status != 0)
-             return curr;
-         curr = curr->next;
-     }
-     return NULL;
- }
- 
- rpc_t *rpc_upgrade(rpc_t *rpc, int old_status, int new_status)
- {
-     rpc_t *curr;
- 
-     if (rpc)
-     {
-         ASSERT(!old_status || rpc_find(rpc->key));
-         if (old_status != -1 && rpc->status != old_status)
-             return NULL;
-         curr = rpc;
-     }
-     else
-     {
-         curr = rpc_list_head;
-         while (curr)
-         {
-             if (old_status == -1 || curr->status == old_status)
-                 break;
-             curr = curr->next;
-         }
-     }
- 
-     if (!curr)
-         return NULL;
- 
-     ASSERT(old_status == -1 || curr->status == old_status);
-     curr->status = new_status;
- 
-     return curr;
- }
- 
- rpc_queue(rpc_t *rpc)
- {
-     int ret;
- 
-     ifs_lock_rpcs();
- 
-     KeInitializeEvent(&rpc->ev, NotificationEvent, FALSE);
-     ret = (rpc_upgrade(rpc, 1, 2) != NULL);
-     KeSetEvent(&comExt->outEvent, 0, FALSE);
- 
-     ifs_unlock_rpcs();
- 
-     return ret;
- }
- 
- rpc_cancel(rpc_t *rpc)
- {
-     rpc_destroy(rpc);
- }
- 
- rpc_shutdown()
- {
-     rpc_t *curr, *next;
- 
-     ifs_lock_rpcs();
- 
-     curr = rpc_list_head;
-     while (curr)
-     {
-         next = curr->next;
-         ExFreePoolWithTag(curr, 0x1234);
- 	num_rpcs--;
-         curr = next;
-     }
-     rpc_list_head = NULL;
- 
-     ifs_unlock_rpcs();
- }
- 
- rpc_wait(rpc_t *rpc, BOOLEAN long_op)
- {
-     NTSTATUS ret;
-     LARGE_INTEGER timeout;
- 
-     if (long_op)
-         timeout.QuadPart = -600000000L;		/* 60 seconds 60L*10000000L */
-     else
-         timeout.QuadPart = -200000000L;		/* 20 seconds 20L*10000000L */
- 
-     do
-         ret = KeWaitForSingleObject(&rpc->ev, Executive, KernelMode, FALSE, &timeout);
-     while (ret != STATUS_SUCCESS && ret != STATUS_TIMEOUT);
- 
-     ifs_lock_rpcs();
-     if (rpc->status == 2 ||			/* still queued */
- 	rpc->status == 5)			/* send cancelled by library */
- 	{
- 	ifs_unlock_rpcs();
-         return 0;
- 	}
- 
-     ifs_unlock_rpcs();    
-     if (ret == STATUS_SUCCESS)
-         return 1;
-     return 0;
- }
- 
- rpc_queue_bulk(rpc_t *rpc, char *out_bulk, ULONG out_len, char *in_bulk, ULONG in_len)
- {
-     rpc->bulk_out = out_bulk;
-     *rpc->bulk_out_len = out_len;
-     rpc->bulk_in = in_bulk;
-     rpc->bulk_in_max = in_len;
-     return rpc_queue(rpc);
- }
- 
- rpc_get_len(rpc_t *rpc)
- {
-     if (*rpc->bulk_out_len != 0xFFFFFFFC)
-         return rpc->out_pos - rpc->out_buf + *rpc->bulk_out_len + sizeof(ULONG);
-     else
-         return rpc->out_pos - rpc->out_buf + sizeof(ULONG);
- }
- 
- rpc_send(char *out_buf, int out_len, int *out_written)
- {
-     rpc_t *rpc;
-     int ret, mdl;
-     ULONG header_len;
- 
-   restart:
- 
-     ifs_lock_rpcs();
-     rpc = rpc_upgrade(NULL, 2, 3);
- 
-     if (!rpc)
-     {
-         ifs_unlock_rpcs();
-         return 0;
-     }
- 
-     if (rpc_get_len(rpc) > out_len)
-     {
-         ifs_unlock_rpcs();
-         rpt0(("cancel", "cancel on send"));
-         rpc_upgrade(rpc, -1, 5);
-         KeSetEvent(&rpc->ev, IO_NETWORK_INCREMENT, FALSE);
-         goto restart;
-     }
- 
-     header_len = rpc->out_pos - rpc->out_buf;
-     RtlCopyMemory(out_buf, rpc->out_buf, header_len);
- 
-     if (*rpc->bulk_out_len && rpc->bulk_out)
-         RtlCopyMemory(out_buf + header_len, rpc->bulk_out, *rpc->bulk_out_len);
-     *out_written = header_len + *rpc->bulk_out_len;
- 
-     ifs_unlock_rpcs();
-     return (*out_written != 0);
- }
- #endif
- 
- 
- /* rpc library api */
- #ifdef RPC_KERN
- rpc_recv(char *in_buf, ULONG len)
- {
-     ULONG key, header_size;
-     char *alloc;
-     rpc_t *rpc;
- 
-     ifs_lock_rpcs();
- 
-     rpc = rpc_find(*(ULONG*)in_buf);
-     if (!rpc)				/* rpc was cancelled while waiting */
-     {
-         ifs_unlock_rpcs();
-         return -1;
-     }
- 
-     alloc = rpc->in_buf;
-     rpc->in_buf = rpc->in_pos = in_buf;
-     rpc_unmarshal_long(rpc, &key);
-     ASSERT(key == rpc->key);
-     rpc_unmarshal_long(rpc, &rpc->bulk_in_len);
- 
-     rpc->in_buf = rpc->in_pos = alloc;
-     header_size = len - rpc->bulk_in_len;
-     ASSERT(header_size < RPC_BUF_SIZE);
- 
-     RtlCopyMemory(rpc->in_buf, in_buf + 2*sizeof(ULONG), header_size - 2*sizeof(ULONG));
-     if (rpc->bulk_in_len && rpc->bulk_in)
-     {
-         ASSERT(rpc->bulk_in_len <= rpc->bulk_in_max);
-         RtlCopyMemory(rpc->bulk_in, in_buf + header_size, rpc->bulk_in_len);
-     }
- 
-     KeSetEvent(&rpc->ev, IO_NETWORK_INCREMENT, FALSE);		/* priority boost for waiting thread */
-     ifs_unlock_rpcs();
-     return 0;
- }
- 
- rpc_call(ULONG in_len, char *in_buf, ULONG out_max, char *out_buf, ULONG *out_len)
- {
-     long rpc_code;
-     ULONG status;
-     WCHAR name[1024];
-     ULONG key, fid;
-     LARGE_INTEGER user_id;
-     rpc_t rpc;
- 
-     rpc.in_buf = rpc.in_pos = in_buf;
-     rpc.out_buf = rpc.out_pos = out_buf;
- 
-     rpc_unmarshal_long(&rpc, &key);
-     rpc_unmarshal_long(&rpc, &rpc_code);
- 
-     switch (rpc_code)
-     {
-     case RPC_BREAK_CALLBACK:
-         rpc_unmarshal_long(&rpc, &fid);
-         status = dc_break_callback(fid);
-         rpc_marshal_long(&rpc, status);
-         break;
-     case RPC_RELEASE_HOOKS:
-         status = dc_release_hooks();
-         break;
-     }
-     *out_len = rpc.out_pos - rpc.out_buf;
-     return 0;
- }
- #endif
- 
- #ifndef RPC_KERN
- rpc_parse(rpc_t *rpc)
- {
-     long rpc_code;
-     ULONG status;
-     WCHAR name[1024];
-     ULONG key;
-     LARGE_INTEGER user_id;
- 
-     rpc_unmarshal_long(rpc, &key);
-     rpc_unmarshal_long(rpc, &rpc->bulk_in_len);
-     rpc_unmarshal_longlong(rpc, &user_id);
-     rpc_unmarshal_long(rpc, &rpc_code);
- 
-     ifs_ImpersonateClient(user_id);
- 
-     rpc_marshal_long(rpc, key);
-     rpc->bulk_out_len = (ULONG*)rpc->out_pos;
-     rpc_marshal_long(rpc, 0);
- 
-     switch (rpc_code)
-     {
-     case RPC_NAMEI:
-         {
-             ULONG fid, length;
-             char *data;
-             //rpc_unmarshal_wstr(rpc, name);
-             rpc_unmarshal_long(rpc, &length);
-             //data = *((char**)rpc->in_pos);
-             data = rpc->in_pos;
-             status = uc_namei((WCHAR*)data, &fid);
-             //status = uc_namei(name, &fid);
-             rpc_marshal_long(rpc, status);		
-             rpc_marshal_long(rpc, fid);		
-         }
-         break;
-     case RPC_CHECK_ACCESS:
-         {
-             ULONG fid, access, granted;
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_long(rpc, &access);
-             status = uc_check_access(fid, access, &granted);
-             rpc_marshal_long(rpc, status);		
-             rpc_marshal_long(rpc, granted);
-         }
-         break;
-     case RPC_CREATE:
-         {
-             LARGE_INTEGER alloc;
-             ULONG access, granted, fid, attribs;
-             char *data;
- 
-             rpc_unmarshal_long(rpc, &attribs);
-             rpc_unmarshal_longlong(rpc, &alloc);
-             rpc_unmarshal_long(rpc, &access);
-             //rpc_unmarshal_wstr(rpc, name);
-             data = rpc->in_pos;
-             status = uc_create((WCHAR*)data, attribs, alloc, access, &granted, &fid);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, granted);
-             rpc_marshal_long(rpc, fid);
-         }
-         break;
-     case RPC_STAT:
-         {
-             ULONG fid, attribs;
-             LARGE_INTEGER size, creation, access, change, written;
-             rpc_unmarshal_long(rpc, &fid);
-             status = uc_stat(fid, &attribs, &size, &creation, &access, &change, &written);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, attribs);
-             rpc_marshal_longlong(rpc, size);
-             rpc_marshal_longlong(rpc, creation);
-             rpc_marshal_longlong(rpc, access);
-             rpc_marshal_longlong(rpc, change);
-             rpc_marshal_longlong(rpc, written);
-         }
-         break;
-     case RPC_READ:
-         {
-             ULONG fid, length, read;
-             LARGE_INTEGER offset;
-             char *data, *save;
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_longlong(rpc, &offset);
-             rpc_unmarshal_long(rpc, &length);
-             save = rpc->out_pos;
-             rpc_marshal_long(rpc, 0);
-             rpc_marshal_long(rpc, 0);
-             data = rpc->out_pos;
-             rpc->out_pos = save;
-             status = uc_read(fid, offset, length, &read, data);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, read);
-             rpc->out_pos += read;
-             *rpc->bulk_out_len = read;
-         }
-         break;
-     case RPC_WRITE:
-         {
-             ULONG fid, length, written;
-             LARGE_INTEGER offset;
-             char *data;
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_longlong(rpc, &offset);
-             rpc_unmarshal_long(rpc, &length);
-             data = rpc->in_pos;
-             status = uc_write(fid, offset, length, &written, data);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, written);
-         }
-         break;
-     case RPC_TRUNC:
-         {
-             ULONG fid;
-             LARGE_INTEGER size;
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_longlong(rpc, &size);
-             status = uc_trunc(fid, size);
-             rpc_marshal_long(rpc, status);
-         }
-         break;
-     case RPC_SETINFO:
-         {
-             ULONG fid, attribs;
-             LARGE_INTEGER creation, access, change, written;
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_long(rpc, &attribs);
-             rpc_unmarshal_longlong(rpc, &creation);
-             rpc_unmarshal_longlong(rpc, &access);
-             rpc_unmarshal_longlong(rpc, &change);
-             rpc_unmarshal_longlong(rpc, &written);
-             status = uc_setinfo(fid, attribs, creation, access, change, written);
-             rpc_marshal_long(rpc, status);
-         }
-         break;
-     case RPC_READDIR:
-         {
-             ULONG fid, count, len;
-             LARGE_INTEGER cookie_in;
-             char *data, *save;
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_longlong(rpc, &cookie_in);
-             rpc_unmarshal_wstr(rpc, name);
-             rpc_unmarshal_long(rpc, &len);
-             save = rpc->out_pos;
-             rpc_marshal_long(rpc, 0);
-             rpc_marshal_long(rpc, 0);
-             rpc_marshal_long(rpc, 0);
-             data = rpc->out_pos;
-             rpc->out_pos = save;
-             status = uc_readdir(fid, cookie_in, name, &count, data, &len);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, count);
-             rpc_marshal_long(rpc, len);
-             rpc->out_pos += len;
-             *rpc->bulk_out_len = len;
-         }
-         break;
-     case RPC_CLOSE:
-         {
-             ULONG fid;
-             rpc_unmarshal_long(rpc, &fid);
-             status = uc_close(fid);
-             rpc_marshal_long(rpc, status);
-         }
-         break;
-     case RPC_UNLINK:
-         {
-             rpc_unmarshal_wstr(rpc, name);
-             status = uc_unlink(name);
-             rpc_marshal_long(rpc, status);
-         }
-         break;
-     case RPC_IOCTL_WRITE:
-         {
-             ULONG length, key;
-             rpc_unmarshal_long(rpc, &length);
-             status = uc_ioctl_write(length, rpc->in_pos, &key);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, key);
-         }
-         break;
-     case RPC_IOCTL_READ:
-         {
-             ULONG key, length;
-             char *save, *data;
-             rpc_unmarshal_long(rpc, &key);
-             save = rpc->out_pos;
-             rpc_marshal_long(rpc, 0);
-             rpc_marshal_long(rpc, 0);
-             data = rpc->out_pos;
-             rpc->out_pos = save;
-             status = uc_ioctl_read(key, &length, data);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, length);
-             rpc->out_pos += length;
-             *rpc->bulk_out_len = length;
-         }
-         break;
-     case RPC_RENAME:
-         {
-             ULONG fid, new_fid;
-             WCHAR curr[1024], new_dir[1024], new_name[1024];
-             rpc_unmarshal_long(rpc, &fid);
-             rpc_unmarshal_wstr(rpc, curr);
-             rpc_unmarshal_wstr(rpc, new_dir);
-             rpc_unmarshal_wstr(rpc, new_name);
-             status = uc_rename(fid, curr, new_dir, new_name, &new_fid);
-             rpc_marshal_long(rpc, status);
-             rpc_marshal_long(rpc, new_fid);
-         }
-         break;
-     case RPC_FLUSH:
-         {
-             ULONG fid;
-             rpc_unmarshal_long(rpc, &fid);
-             status = uc_flush(fid);
-             rpc_marshal_long(rpc, status);
-         }
-         break;
-     }
- }
- #endif
--- 0 ----
Index: openafs/src/WINNT/afsrdr/ifs_rpc.h
diff -c openafs/src/WINNT/afsrdr/ifs_rpc.h:1.3.4.1 openafs/src/WINNT/afsrdr/ifs_rpc.h:removed
*** openafs/src/WINNT/afsrdr/ifs_rpc.h:1.3.4.1	Thu Jul 20 17:46:21 2006
--- openafs/src/WINNT/afsrdr/ifs_rpc.h	Sat Mar 22 21:01:37 2008
***************
*** 1,119 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- /* versioning history
-  * 
-  * 03-jun 2005 (eric williams) entered into versioning
-  */
- 
- #ifdef RPC_KERN
- #include <ntifs.h>
- #include <stdlib.h>
- #else
- #include <osi.h>
- #include <windows.h>
- #include <winioctl.h>
- #endif
- 
- 
- /* maximum number of users, based on SID, that can access AFS at one time */
- #define MAX_AFS_USERS			256
- 
- /* maximum number of threads that can make simultaneous calls into afsrdr,
-    because we maintain a credential set for each thread in a single table. */
- #define MAX_CRED_MAPS			64
- 
- /* size if outgoing/incoming RPC buffer (for parameters only, not bulk data) */
- #define RPC_BUF_SIZE			2048
- 
- /* max. chunk size for RPC transfers */
- #define TRANSFER_CHUNK_SIZE	(1024*1024)
- 
- 
- /* upcalls */
- #define RPC_NAMEI		0x10
- #define RPC_CHECK_ACCESS	0x11
- #define RPC_CREATE		0x12
- #define RPC_STAT		0x13
- #define RPC_READ		0x14
- #define RPC_WRITE		0x15
- #define RPC_TRUNC		0x16
- #define RPC_SETINFO		0x17
- #define RPC_READDIR		0x18
- #define RPC_CLOSE		0x19
- #define RPC_UNLINK		0x1A
- #define RPC_IOCTL_WRITE		0x1B
- #define RPC_IOCTL_READ		0x1C
- #define RPC_RENAME		0x1D
- #define RPC_FLUSH		0x1E
- 
- 
- /* downcalls */
- #define RPC_BREAK_CALLBACK	0x80
- #define RPC_RELEASE_HOOKS	0x81
- 
- 
- /* internal module flags */
- #define RPC_TIMEOUT_SHORT	0
- #define RPC_TIMEOUT_LONG	1
- 
- 
- /* internal data struct for both client and server */
- struct rpc
- 	{
- #ifdef RPC_KERN
- 	struct rpc *next;
- 	int size;
- 	KEVENT ev;
- 	MDL *bulk_mdl;
- #endif
- 	char *bulk_out;
- 	ULONG *bulk_out_len;
- 	char *bulk_in;
- 	ULONG bulk_in_len, bulk_in_max;
- 	ULONG key;
- 	char *out_buf, *out_pos;
- 	char *in_buf, *in_pos;
- 	int status;
- 	};
- typedef struct rpc rpc_t;
- 
- 
- /* application interface into rpc library */
- #ifdef RPC_KERN
- rpc_call(ULONG in_len, char *in_buf, ULONG out_max, char *out_buf, ULONG *out_len);
- rpc_set_context(void *context);
- rpc_remove_context();
- rpc_get_len(rpc_t *rpc);
- rpc_send(char *out_buf, int out_len, int *out_written);
- rpc_recv(char *in_buf, ULONG len);
- rpc_shutdown();
- 
- #else
- 
- rpc_parse(rpc_t *rpc);
- #endif
- 
- 
--- 0 ----
Index: openafs/src/WINNT/afsrdr/kif.h
diff -c openafs/src/WINNT/afsrdr/kif.h:1.4.4.2 openafs/src/WINNT/afsrdr/kif.h:removed
*** openafs/src/WINNT/afsrdr/kif.h:1.4.4.2	Thu Jul 20 17:46:21 2006
--- openafs/src/WINNT/afsrdr/kif.h	Sat Mar 22 21:01:37 2008
***************
*** 1,113 ****
- /* copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express 
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,   
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
- 
- /* versioning history
-  * 
-  * 03-jun 2005 (eric williams) entered into versioning
-  */
- 
- 
- /* this is based on BUF_FILEHASH, but we were not getting unique hashes */
- #define FID_HASH_FN(fidp) \
-     ((((fidp)->vnode + \
-     ((fidp)->unique << 13) + ((fidp)->unique >> (32-13)) + \
-     (fidp)->volume + \
-     (fidp)->cell)))
- 
- 
- /* dirent information */
- struct readdir_data
- {
-     LARGE_INTEGER cookie;
-     long offset;
-     LARGE_INTEGER creation, access, write, change, size;
-     ULONG attribs, name_length;			/* chars */
-     CCHAR short_name_length;			/* chars */
-     WCHAR short_name[14];
-     WCHAR name[];
- };
- typedef struct readdir_data readdir_data_t;
- 
- 
- /* error codes */
- #define IFSL_SUCCESS_BASE			0x00000000
- #define IFSL_FAIL_BASE				0x80000000
- 
- #define IFSL_SUCCESS				(IFSL_SUCCESS_BASE + 0)
- #define IFSL_DOES_NOT_EXIST			(IFSL_FAIL_BASE + 1)
- #define IFSL_NOT_IMPLEMENTED			(IFSL_FAIL_BASE + 2)
- #define IFSL_END_OF_ENUM			(IFSL_SUCCESS_BASE + 3)
- #define IFSL_CANNOT_MAKE			(IFSL_FAIL_BASE + 4)
- #define IFSL_END_OF_FILE			(IFSL_SUCCESS_BASE + 5)
- #define IFSL_NO_ACCESS				(IFSL_FAIL_BASE + 6)
- #define IFSL_BUFFER_TOO_SMALL			(IFSL_FAIL_BASE + 7)
- #define IFSL_SHARING_VIOLATION			(IFSL_FAIL_BASE + 8)
- #define IFSL_BAD_INPUT				(IFSL_FAIL_BASE + 9)
- #define IFSL_GENERIC_FAILURE			(IFSL_FAIL_BASE + 10)
- #define IFSL_OPEN_CREATED			(IFSL_SUCCESS_BASE + 11)
- #define IFSL_OPEN_EXISTS			(IFSL_FAIL_BASE + 12)
- #define IFSL_OPEN_OPENED			(IFSL_SUCCESS_BASE + 13)
- #define IFSL_OPEN_OVERWRITTEN			(IFSL_SUCCESS_BASE + 14)
- #define IFSL_OPEN_SUPERSCEDED			(IFSL_SUCCESS_BASE + 15)
- #define IFSL_BADFILENAME			(IFSL_FAIL_BASE + 16)
- #define IFSL_READONLY				(IFSL_FAIL_BASE + 17)
- #define IFSL_IS_A_DIR				(IFSL_FAIL_BASE + 18)
- #define IFSL_PATH_DOES_NOT_EXIST		(IFSL_FAIL_BASE + 19)
- #define IFSL_IS_A_FILE				(IFSL_FAIL_BASE + 20)
- #define IFSL_NO_FILE				(IFSL_FAIL_BASE + 21)
- #define IFSL_NOT_EMPTY				(IFSL_FAIL_BASE + 22)
- #define IFSL_RPC_TIMEOUT			(IFSL_FAIL_BASE + 23)
- #define IFSL_OVERQUOTA				(IFSL_FAIL_BASE + 24)
- #define IFSL_MEMORY				(IFSL_FAIL_BASE + 25)
- #define IFSL_UNSPEC				(IFSL_FAIL_BASE + 26)
- 
- 
- /* ioctl codes */
- #define IOCTL_AFSRDR_IOCTL	CTL_CODE(IOCTL_DISK_BASE, 0x007, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
- #define IOCTL_AFSRDR_DOWNCALL	CTL_CODE(IOCTL_DISK_BASE, 0x008, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
- #define IOCTL_AFSRDR_GET_PATH	CTL_CODE(IOCTL_DISK_BASE, 0x009, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
- 
- 
- /* upcalls */
- long uc_namei(WCHAR *name, ULONG *fid);
- long uc_check_access(ULONG fid, ULONG access, ULONG *granted);
- long uc_create(WCHAR *str, ULONG attribs, LARGE_INTEGER alloc, ULONG access, ULONG *granted, ULONG *fid);
- long uc_stat(ULONG fid, ULONG *attribs, LARGE_INTEGER *size, LARGE_INTEGER *creation, LARGE_INTEGER *access, LARGE_INTEGER *change, LARGE_INTEGER *written);
- long uc_setinfo(ULONG fid, ULONG attribs, LARGE_INTEGER creation, LARGE_INTEGER access, LARGE_INTEGER change, LARGE_INTEGER written);
- long uc_trunc(ULONG fid, LARGE_INTEGER size);
- long uc_read(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *read, char *data);
- long uc_write(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *written, char *data);
- long uc_readdir(ULONG fid, LARGE_INTEGER cookie_in, WCHAR *filter, ULONG *count, char *data, ULONG_PTR *len);
- long uc_close(ULONG fid);
- long uc_unlink(WCHAR *name);
- long uc_ioctl_write(ULONG length, char *data, ULONG_PTR *key);
- long uc_ioctl_read(ULONG_PTR key, ULONG *length, char *data);
- long uc_rename(ULONG fid, WCHAR *curr, WCHAR *new_dir, WCHAR *new_name, ULONG *new_fid);
- long uc_flush(ULONG fid);
- 
- 
- /* downcalls */
- long dc_break_callback(ULONG fid);
- long dc_release_hooks(void);
--- 0 ----
Index: openafs/src/WINNT/afsrdr/makefile
diff -c openafs/src/WINNT/afsrdr/makefile:1.1 openafs/src/WINNT/afsrdr/makefile:removed
*** openafs/src/WINNT/afsrdr/makefile:1.1	Wed Jun 15 12:51:47 2005
--- openafs/src/WINNT/afsrdr/makefile	Sat Mar 22 21:01:37 2008
***************
*** 1 ****
- !INCLUDE $(NTMAKEENV)\makefile.def
--- 0 ----
Index: openafs/src/WINNT/afsrdr/sources
diff -c openafs/src/WINNT/afsrdr/sources:1.2 openafs/src/WINNT/afsrdr/sources:removed
*** openafs/src/WINNT/afsrdr/sources:1.2	Thu Aug  4 12:32:39 2005
--- openafs/src/WINNT/afsrdr/sources	Sat Mar 22 21:01:37 2008
***************
*** 1,31 ****
- #/* copyright (c) 2005
- # * the regents of the university of michigan
- # * all rights reserved
- # * 
- # * permission is granted to use, copy, create derivative works and
- # * redistribute this software and such derivative works for any purpose,
- # * so long as the name of the university of michigan is not used in
- # * any advertising or publicity pertaining to the use or distribution
- # * of this software without specific, written prior authorization.  if
- # * the above copyright notice or any other identification of the
- # * university of michigan is included in any copy of any portion of
- # * this software, then the disclaimer below must also be included.
- # * 
- # * this software is provided as is, without representation from the
- # * university of michigan as to its fitness for any purpose, and without
- # * warranty by the university of michigan of any kind, either express 
- # * or implied, including without limitation the implied warranties of
- # * merchantability and fitness for a particular purpose.  the regents
- # * of the university of michigan shall not be liable for any damages,   
- # * including special, indirect, incidental, or consequential damages, 
- # * with respect to any claim arising out or in connection with the use
- # * of the software, even if it has been or is hereafter advised of the
- # * possibility of such damages.
- # */
- 
- SOURCES= afsrdr.c ifs_rpc.c afsrdr.rc
- TARGETNAME=afsrdr
- TARGETPATH=obj
- TARGETTYPE=DRIVER
- DRIVERTYPE=FS
- C_DEFINES=-DUNICODE -DRPT_CLI -DRPC_KERN
--- 0 ----
Index: openafs/src/WINNT/aklog/aklog.c
diff -c openafs/src/WINNT/aklog/aklog.c:1.14.4.8 openafs/src/WINNT/aklog/aklog.c:1.14.4.10
*** openafs/src/WINNT/aklog/aklog.c:1.14.4.8	Sat Jan  5 12:01:24 2008
--- openafs/src/WINNT/aklog/aklog.c	Fri Mar 21 20:20:24 2008
***************
*** 194,208 ****
  
  static int usev5 = TRUE;   /* use kerberos 5? */
  static int use524 = FALSE;  /* use krb524? */
  static krb5_ccache _krb425_ccache;
  
  long GetLocalCell(struct afsconf_dir **pconfigdir, char *local_cell)
  {
      if (!(*pconfigdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH)))
      {
          fprintf(stderr, "%s: can't get afs configuration (afsconf_Open(%s))\n",
                   progname, AFSDIR_CLIENT_ETC_DIRPATH);
!         exit(AKLOG_AFS);
      }
  
      return afsconf_GetLocalCell(*pconfigdir, local_cell, MAXCELLCHARS);
--- 194,218 ----
  
  static int usev5 = TRUE;   /* use kerberos 5? */
  static int use524 = FALSE;  /* use krb524? */
+ static krb5_context context = 0;
  static krb5_ccache _krb425_ccache;
  
+ void akexit(int exit_code)
+ {
+     if (_krb425_ccache)
+         krb5_cc_close(context, _krb425_ccache);
+     if (context)
+         krb5_free_context(context);
+     exit(exit_code);
+ }
+ 
  long GetLocalCell(struct afsconf_dir **pconfigdir, char *local_cell)
  {
      if (!(*pconfigdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH)))
      {
          fprintf(stderr, "%s: can't get afs configuration (afsconf_Open(%s))\n",
                   progname, AFSDIR_CLIENT_ETC_DIRPATH);
!         akexit(AKLOG_AFS);
      }
  
      return afsconf_GetLocalCell(*pconfigdir, local_cell, MAXCELLCHARS);
***************
*** 398,403 ****
--- 408,414 ----
  int des_pcbc_init()
  {
      abort();
+     return 0;   /* avoid warning */
  }
  
  #ifdef HAVE_KRB4
***************
*** 430,435 ****
--- 441,451 ----
      krb5_error_code r;
      static krb5_principal client_principal = 0;
  
+     if (client_principal) {
+         krb5_free_principal(context, client_principal);
+         client_principal = 0;
+     }
+ 
      memset((char *)&increds, 0, sizeof(increds));
  
      if ((r = krb5_build_principal(context, &increds.server,
***************
*** 440,449 ****
          return((int)r);
      }
  
!     if (!_krb425_ccache)
!         krb5_cc_default(context, &_krb425_ccache);
!     if (!client_principal)
!         krb5_cc_get_principal(context, _krb425_ccache, &client_principal);
  
      increds.client = client_principal;
      increds.times.endtime = 0;
--- 456,471 ----
          return((int)r);
      }
  
!     if (!_krb425_ccache) {
!         if ((r = krb5_cc_default(context, &_krb425_ccache)))
!             return ((int)r);
!     }
!     if (!client_principal) {
!         if ((r = krb5_cc_get_principal(context, _krb425_ccache, &client_principal))) {
!             krb5_cc_close(context, _krb425_ccache);
!             return ((int)r);
!         }
!     }
  
      increds.client = client_principal;
      increds.times.endtime = 0;
***************
*** 451,462 ****
      increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC;
  
      r = krb5_get_credentials(context, 0, _krb425_ccache, &increds, creds);
!     if (r)
          return((int)r);
! 
      /* This requires krb524d to be running with the KDC */
      if (c != NULL)
          r = krb5_524_convert_creds(context, *creds, c);
      return((int)r);
  }
  
--- 473,485 ----
      increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC;
  
      r = krb5_get_credentials(context, 0, _krb425_ccache, &increds, creds);
!     if (r) {
          return((int)r);
!     }
      /* This requires krb524d to be running with the KDC */
      if (c != NULL)
          r = krb5_524_convert_creds(context, *creds, c);
+ 
      return((int)r);
  }
  
***************
*** 566,572 ****
      if (GetLocalCell(&configdir, local_cell))
      {
          fprintf(stderr, "%s: can't determine local cell.\n", progname);
!         exit(AKLOG_AFS);
      }
  
      if ((cell == NULL) || (cell[0] == 0))
--- 589,595 ----
      if (GetLocalCell(&configdir, local_cell))
      {
          fprintf(stderr, "%s: can't determine local cell.\n", progname);
!         akexit(AKLOG_AFS);
      }
  
      if ((cell == NULL) || (cell[0] == 0))
***************
*** 1046,1052 ****
              if (++symlinkcount > MAXSYMLINKS)
              {
                  fprintf(stderr, "%s: %s\n", progname, strerror(ELOOP));
!                 exit(AKLOG_BADPATH);
              }
              memset(tmpbuf, 0, sizeof(tmpbuf));
              if (elast_comp)
--- 1069,1075 ----
              if (++symlinkcount > MAXSYMLINKS)
              {
                  fprintf(stderr, "%s: %s\n", progname, strerror(ELOOP));
!                 akexit(AKLOG_BADPATH);
              }
              memset(tmpbuf, 0, sizeof(tmpbuf));
              if (elast_comp)
***************
*** 1116,1122 ****
              fprintf(stderr, "Unable to find current working directory:\n");
              fprintf(stderr, "%s\n", pathtocheck);
              fprintf(stderr, "Try an absolute pathname.\n");
!             exit(AKLOG_BADPATH);
          }
          else
          {
--- 1139,1145 ----
              fprintf(stderr, "Unable to find current working directory:\n");
              fprintf(stderr, "%s\n", pathtocheck);
              fprintf(stderr, "Try an absolute pathname.\n");
!             akexit(AKLOG_BADPATH);
          }
          else
          {
***************
*** 1217,1223 ****
      fprintf(stderr, "    No commandline arguments means ");
      fprintf(stderr, "authenticate to the local cell.\n");
      fprintf(stderr, "\n");
!     exit(AKLOG_USAGE);
  }
  
  void
--- 1240,1246 ----
      fprintf(stderr, "    No commandline arguments means ");
      fprintf(stderr, "authenticate to the local cell.\n");
      fprintf(stderr, "\n");
!     akexit(AKLOG_USAGE);
  }
  
  void
***************
*** 1233,1239 ****
          FreeLibrary(h);
      else {
          fprintf(stderr, "Kerberos for Windows library %s is not available.\n", KRB5LIB);
!         exit(AKLOG_KFW_NOT_INSTALLED);
      }
  }
  
--- 1256,1262 ----
          FreeLibrary(h);
      else {
          fprintf(stderr, "Kerberos for Windows library %s is not available.\n", KRB5LIB);
!         akexit(AKLOG_KFW_NOT_INSTALLED);
      }
  }
  
***************
*** 1246,1256 ****
          FreeLibrary(h);
      else {
          fprintf(stderr, "Kerberos for Windows library krbv4w32.dll is not available.\n");
!         exit(AKLOG_KFW_NOT_INSTALLED);
      }
  #else
      fprintf(stderr, "Kerberos v4 is not available in this build of aklog.\n");
!     exit(AKLOG_USAGE);
  #endif
  }
  
--- 1269,1279 ----
          FreeLibrary(h);
      else {
          fprintf(stderr, "Kerberos for Windows library krbv4w32.dll is not available.\n");
!         akexit(AKLOG_KFW_NOT_INSTALLED);
      }
  #else
      fprintf(stderr, "Kerberos v4 is not available in this build of aklog.\n");
!     akexit(AKLOG_USAGE);
  #endif
  }
  
***************
*** 1277,1284 ****
      linked_list paths;		/* List of paths to log to */
      ll_node *cur_node;
  
-     krb5_context context = 0;
- 
      memset(&cellinfo, 0, sizeof(cellinfo));
  
      memset(realm, 0, sizeof(realm));
--- 1300,1305 ----
***************
*** 1376,1389 ****
                  else
                  {
                      fprintf(stderr, "%s: failure copying cellinfo.\n", progname);
!                     exit(AKLOG_MISC);
                  }
              }
              else
              {
                  fprintf(stderr, "%s: failure adding cell to cells list.\n",
                           progname);
!                 exit(AKLOG_MISC);
              }
              memset(&cellinfo, 0, sizeof(cellinfo));
              cmode = FALSE;
--- 1397,1410 ----
                  else
                  {
                      fprintf(stderr, "%s: failure copying cellinfo.\n", progname);
!                     akexit(AKLOG_MISC);
                  }
              }
              else
              {
                  fprintf(stderr, "%s: failure adding cell to cells list.\n",
                           progname);
!                 akexit(AKLOG_MISC);
              }
              memset(&cellinfo, 0, sizeof(cellinfo));
              cmode = FALSE;
***************
*** 1402,1415 ****
                  {
                      fprintf(stderr, "%s: failure copying path name.\n",
                               progname);
!                     exit(AKLOG_MISC);
                  }
              }
              else
              {
                  fprintf(stderr, "%s: failure adding path to paths list.\n",
                           progname);
!                 exit(AKLOG_MISC);
              }
              pmode = FALSE;
              memset(path, 0, sizeof(path));
--- 1423,1436 ----
                  {
                      fprintf(stderr, "%s: failure copying path name.\n",
                               progname);
!                     akexit(AKLOG_MISC);
                  }
              }
              else
              {
                  fprintf(stderr, "%s: failure adding path to paths list.\n",
                           progname);
!                 akexit(AKLOG_MISC);
              }
              pmode = FALSE;
              memset(path, 0, sizeof(path));
***************
*** 1455,1462 ****
              status = AKLOG_SOMETHINGSWRONG;
      }       
  
!     if(usev5)
!         krb5_free_context(context);
! 
!     exit(status);
  }       
--- 1476,1480 ----
              status = AKLOG_SOMETHINGSWRONG;
      }       
  
!     akexit(status);
  }       
Index: openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc:1.5.6.3
*** openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:15 2006
--- openafs/src/WINNT/client_config/lang/de_DE/afs_config.rc	Mon Mar 10 14:18:13 2008
***************
*** 357,364 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL
--- 357,364 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/en_US/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/en_US/afs_config.rc:1.7.6.4 openafs/src/WINNT/client_config/lang/en_US/afs_config.rc:1.7.6.5
*** openafs/src/WINNT/client_config/lang/en_US/afs_config.rc:1.7.6.4	Fri Jul 27 11:41:53 2007
--- openafs/src/WINNT/client_config/lang/en_US/afs_config.rc	Mon Mar 10 14:18:14 2008
***************
*** 354,361 ****
  FONT 8, "MS Sans Serif"
  BEGIN
      EDITTEXT        IDC_PROBE,90,16,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,36,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,56,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,76,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,96,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,116,83,13,ES_AUTOHSCROLL
--- 354,361 ----
  FONT 8, "MS Sans Serif"
  BEGIN
      EDITTEXT        IDC_PROBE,90,16,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,36,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,56,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,76,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,96,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,116,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc:1.5.6.3
*** openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:15 2006
--- openafs/src/WINNT/client_config/lang/es_ES/afs_config.rc	Mon Mar 10 14:18:14 2008
***************
*** 356,363 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,113,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,113,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,113,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,113,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,112,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,112,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,112,140,83,13,ES_AUTOHSCROLL
--- 356,363 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,113,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,113,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,113,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,113,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,112,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,112,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,112,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc:1.5.6.3
*** openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:16 2006
--- openafs/src/WINNT/client_config/lang/ja_JP/afs_config.rc	Mon Mar 10 14:18:15 2008
***************
*** 354,361 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,128,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,128,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,128,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,128,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,128,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,128,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,128,140,83,13,ES_AUTOHSCROLL
--- 354,361 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,128,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,128,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,128,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,128,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,128,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,128,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,128,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc:1.5.6.3
*** openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:17 2006
--- openafs/src/WINNT/client_config/lang/ko_KR/afs_config.rc	Mon Mar 10 14:18:15 2008
***************
*** 349,356 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL
--- 349,356 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc:1.5.6.4
*** openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:17 2006
--- openafs/src/WINNT/client_config/lang/pt_BR/afs_config.rc	Wed Mar 12 01:47:38 2008
***************
*** 356,363 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,101,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,101,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,101,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,101,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,101,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,101,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,101,140,83,13,ES_AUTOHSCROLL
--- 356,363 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,101,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,101,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,101,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,101,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,101,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,101,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,101,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc:1.5.6.3
*** openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:17 2006
--- openafs/src/WINNT/client_config/lang/zh_CN/afs_config.rc	Mon Mar 10 14:18:15 2008
***************
*** 342,349 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL
--- 342,349 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,90,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,90,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,90,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,90,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,90,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,90,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,90,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc
diff -c openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc:1.5.6.2 openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc:1.5.6.3
*** openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc:1.5.6.2	Tue Dec 12 15:41:17 2006
--- openafs/src/WINNT/client_config/lang/zh_TW/afs_config.rc	Mon Mar 10 14:18:15 2008
***************
*** 344,351 ****
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,96,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,96,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,96,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,96,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,96,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,96,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,96,140,83,13,ES_AUTOHSCROLL
--- 344,351 ----
  BEGIN
      EDITTEXT        IDC_LAN_ADAPTER,96,20,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_PROBE,96,40,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_DAEMONS,96,60,32,13,ES_AUTOHSCROLL
!     EDITTEXT        IDC_THREADS,96,80,32,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_SYSNAME,96,100,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_MOUNTDIR,96,120,83,13,ES_AUTOHSCROLL
      EDITTEXT        IDC_ROOTVOLUME,96,140,83,13,ES_AUTOHSCROLL
Index: openafs/src/WINNT/client_exp/gui2fs.cpp
diff -c openafs/src/WINNT/client_exp/gui2fs.cpp:1.19.4.5 openafs/src/WINNT/client_exp/gui2fs.cpp:1.19.4.6
*** openafs/src/WINNT/client_exp/gui2fs.cpp:1.19.4.5	Fri Feb  8 21:32:24 2008
--- openafs/src/WINNT/client_exp/gui2fs.cpp	Wed Mar 19 09:24:05 2008
***************
*** 554,571 ****
      return tp;
  }
  
! struct Acl *ParseAcl(char *astr)
  {
!     int nplus, nminus, i, trights;
      char tname[MAXNAME];
!     struct AclEntry *first, *last, *tl;
      struct Acl *ta;
  
!     ta = (struct Acl *) malloc (sizeof (struct Acl));
!     ta->dfs = 0;
!     sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell);
      astr = SkipLine(astr);
!     sscanf(astr, "%d", &ta->nminus);
      astr = SkipLine(astr);
  
      nplus = ta->nplus;
--- 554,598 ----
      return tp;
  }
  
! struct Acl *EmptyAcl(char *astr)
  {
!     register struct Acl *tp;
!     int junk;
! 
!     tp = (struct Acl *)malloc(sizeof (struct Acl));
!     tp->nplus = tp->nminus = 0;
!     tp->pluslist = tp->minuslist = 0;
!     tp->dfs = 0;
!     if (astr == NULL || sscanf(astr, "%d dfs:%d %s", &junk, &tp->dfs, tp->cell) <= 0) {
!         tp->dfs = 0;
!         tp->cell[0] = '\0';
!     }
!     return tp;
! }
! 
! struct Acl *
! ParseAcl (char *astr)
! {
!     int nplus, nminus, i, trights, ret;
      char tname[MAXNAME];
!     struct AclEntry *first, *next, *last, *tl;
      struct Acl *ta;
  
!     ta = EmptyAcl(NULL);
!     if (astr == NULL || strlen(astr) == 0)
!         return ta;
! 
!     ret = sscanf(astr, "%d dfs:%d %s", &ta->nplus, &ta->dfs, ta->cell);
!     if (ret <= 0) {
!         free(ta);
!         return NULL;
!     }
      astr = SkipLine(astr);
!     ret = sscanf(astr, "%d", &ta->nminus);
!     if (ret <= 0) {
!         free(ta);
!         return NULL;
!     }
      astr = SkipLine(astr);
  
      nplus = ta->nplus;
***************
*** 573,611 ****
  
      last = 0;
      first = 0;
!     for(i = 0; i < nplus; i++) {
!         sscanf(astr, "%100s %d", tname, &trights);
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
!         if (!first)
! 			first = tl;
          strcpy(tl->name, tname);
          tl->rights = trights;
          tl->next = 0;
!         if (last)
! 			last->next = tl;
          last = tl;
      }
      ta->pluslist = first;
  
      last = 0;
      first = 0;
!     for(i=0; i < nminus; i++) {
!         sscanf(astr, "%100s %d", tname, &trights);
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
          if (!first) 
! 			first = tl;
          strcpy(tl->name, tname);
          tl->rights = trights;
          tl->next = 0;
          if (last) 
! 			last->next = tl;
          last = tl;
      }
      ta->minuslist = first;
  
      return ta;
  }
  
  /* clean up an access control list of its bad entries; return 1 if we made
--- 600,662 ----
  
      last = 0;
      first = 0;
!     for(i=0;i<nplus;i++) {
!         ret = sscanf(astr, "%100s %d", tname, &trights); 
!         if (ret <= 0)
!             goto nplus_err;
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
!         if (tl == NULL)
!             goto nplus_err;
!         if (!first) 
!             first = tl;
          strcpy(tl->name, tname);
          tl->rights = trights;
          tl->next = 0;
!         if (last) 
!             last->next = tl;
          last = tl;
      }
      ta->pluslist = first;
  
      last = 0;
      first = 0;
!     for(i=0;i<nminus;i++) {
!         ret = sscanf(astr, "%100s %d", tname, &trights);
!         if (ret <= 0)
!             goto nminus_err;
          astr = SkipLine(astr);
          tl = (struct AclEntry *) malloc(sizeof (struct AclEntry));
+         if (tl == NULL)
+             goto nminus_err;
          if (!first) 
!             first = tl;
          strcpy(tl->name, tname);
          tl->rights = trights;
          tl->next = 0;
          if (last) 
!             last->next = tl;
          last = tl;
      }
      ta->minuslist = first;
  
+   exit:
      return ta;
+ 
+   nminus_err:
+     for (;first; first = next) {
+         next = first->next;
+         free(first);
+     }   
+     first = ta->pluslist;
+ 
+   nplus_err:
+     for (;first; first = next) {
+         next = first->next;
+         free(first);
+     }   
+     free(ta);
+     return NULL;
  }
  
  /* clean up an access control list of its bad entries; return 1 if we made
***************
*** 678,683 ****
--- 729,738 ----
          }
  
          ta = ParseAcl(space);
+         if (ta == NULL) {
+             ShowMessageBox(IDS_INVALID_ACL_DATA, MB_ICONERROR, IDS_INVALID_ACL_DATA);
+             continue;
+         }
          if (ta->dfs) {
              ShowMessageBox(IDS_CLEANACL_NOT_SUPPORTED, MB_ICONERROR, IDS_CLEANACL_NOT_SUPPORTED, names[i]);
              continue;
***************
*** 728,733 ****
--- 783,792 ----
      }
  
      ta = ParseAcl(space);
+     if (ta == NULL) {
+         ShowMessageBox(IDS_INVALID_ACL_DATA, MB_ICONERROR, IDS_INVALID_ACL_DATA);
+         return FALSE;
+     }
      if (ta->dfs) {
          ShowMessageBox(IDS_DFSACL_ERROR, MB_ICONERROR, IDS_DFSACL_ERROR);
          return FALSE;
***************
*** 924,929 ****
--- 983,993 ----
      else 
          pToAcl = ParseAcl(space);
  
+     if (pToAcl == NULL) {
+         ShowMessageBox(IDS_INVALID_ACL_DATA, MB_ICONERROR, IDS_INVALID_ACL_DATA);
+         return FALSE;
+     }
+ 
      CleanAcl(pToAcl);
  
      if (pToAcl->dfs) {
Index: openafs/src/WINNT/client_exp/resource.h
diff -c openafs/src/WINNT/client_exp/resource.h:1.8.4.2 openafs/src/WINNT/client_exp/resource.h:1.8.4.3
*** openafs/src/WINNT/client_exp/resource.h:1.8.4.2	Sat Jan 12 18:31:24 2008
--- openafs/src/WINNT/client_exp/resource.h	Wed Mar 19 09:24:05 2008
***************
*** 74,79 ****
--- 74,80 ----
  #define IDS_ALL_SERVERS_RUNNING                65
  #define IDS_CHECK_VOLUMES_OK                   66
  #define IDS_CHECK_VOLUMES_ERROR                67
+ #define IDS_INVALID_ACL_DATA                   68
  
  #define IDS_ACL_ENTRY_NAME_IN_USE              80
  #define IDS_REALLY_DEL_MOUNT_POINTS            81
Index: openafs/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc
diff -c openafs/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc:1.10.4.2 openafs/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc:1.10.4.3
*** openafs/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc:1.10.4.2	Sat Jan 12 18:31:25 2008
--- openafs/src/WINNT/client_exp/lang/en_US/afs_shl_ext.rc	Wed Mar 19 09:24:06 2008
***************
*** 602,607 ****
--- 602,608 ----
      IDS_ALL_SERVERS_RUNNING "All servers are running."
      IDS_CHECK_VOLUMES_OK    "All volumeID/name mappings checked."
      IDS_CHECK_VOLUMES_ERROR "Error checking volumeID/name mappings:  %o"
+     IDS_INVALID_ACL_DATA    "Internal Error: Invalid ACL data was received."
  END
  
  STRINGTABLE DISCARDABLE 
Index: openafs/src/WINNT/client_osi/libosi.def
diff -c openafs/src/WINNT/client_osi/libosi.def:1.3.14.1 openafs/src/WINNT/client_osi/libosi.def:1.3.14.2
*** openafs/src/WINNT/client_osi/libosi.def:1.3.14.1	Thu Jun  1 11:39:55 2006
--- openafs/src/WINNT/client_osi/libosi.def	Wed Feb 27 12:06:44 2008
***************
*** 70,72 ****
--- 70,73 ----
  	osi_LogEvent		@63
          osi_HexifyString        @64
          osi_QRemoveHT           @65
+ 	lock_ConvertRToW	@66
Index: openafs/src/WINNT/client_osi/osibasel.c
diff -c openafs/src/WINNT/client_osi/osibasel.c:1.4.4.2 openafs/src/WINNT/client_osi/osibasel.c:1.4.4.3
*** openafs/src/WINNT/client_osi/osibasel.c:1.4.4.2	Mon Oct  2 22:48:23 2006
--- openafs/src/WINNT/client_osi/osibasel.c	Wed Feb 27 12:06:44 2008
***************
*** 19,24 ****
--- 19,25 ----
  
  /* atomicity-providing critical sections */
  CRITICAL_SECTION osi_baseAtomicCS[OSI_MUTEXHASHSIZE];
+ static long     atomicIndexCounter = 0;
  
  void osi_BaseInit(void)
  {
***************
*** 179,184 ****
--- 180,217 ----
  	}
  }
  
+ void lock_ConvertRToW(osi_rwlock_t *lockp)
+ {
+ 	long i;
+         CRITICAL_SECTION *csp;
+ 
+ 	if ((i = lockp->type) != 0) {
+ 	    if (i >= 0 && i < OSI_NLOCKTYPES)
+ 		(osi_lockOps[i]->ConvertRToWProc)(lockp);
+ 		return;
+ 	}
+ 
+ 	/* otherwise we're the fast base type */
+ 	csp = &osi_baseAtomicCS[lockp->atomicIndex];
+         EnterCriticalSection(csp);
+ 
+ 	osi_assertx(!(lockp->flags & OSI_LOCKFLAG_EXCL), "write lock held");
+         osi_assertx(lockp->readers > 0, "read lock not held");
+ 	
+         if (--lockp->readers == 0) {
+             /* convert read lock to write lock */
+             lockp->flags |= OSI_LOCKFLAG_EXCL;
+         } else {
+             lockp->waiters++;
+             osi_TWait(&lockp->d.turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, csp);
+             lockp->waiters--;
+             osi_assert(lockp->readers == 0 && (lockp->flags & OSI_LOCKFLAG_EXCL));
+ 	}
+ 
+         lockp->tid = thrd_Current();
+         LeaveCriticalSection(csp);
+ }
+ 
  void lock_ObtainMutex(struct osi_mutex *lockp)
  {
  	long i;
***************
*** 443,449 ****
  	mp->type = 0;
  	mp->flags = 0;
          mp->tid = 0;
! 	mp->atomicIndex = osi_MUTEXHASH(mp);
          osi_TInit(&mp->d.turn);
  	return;
  }
--- 476,482 ----
  	mp->type = 0;
  	mp->flags = 0;
          mp->tid = 0;
! 	mp->atomicIndex = (unsigned short)(InterlockedIncrement(&atomicIndexCounter) % OSI_MUTEXHASHSIZE);
          osi_TInit(&mp->d.turn);
  	return;
  }
***************
*** 463,469 ****
  	 */
  	mp->type = 0;
  	mp->flags = 0;
! 	mp->atomicIndex = osi_MUTEXHASH(mp);
  	mp->readers = 0;
          mp->tid = 0;
          osi_TInit(&mp->d.turn);
--- 496,502 ----
  	 */
  	mp->type = 0;
  	mp->flags = 0;
!         mp->atomicIndex = (unsigned short)(InterlockedIncrement(&atomicIndexCounter) % OSI_MUTEXHASHSIZE);
  	mp->readers = 0;
          mp->tid = 0;
          osi_TInit(&mp->d.turn);
Index: openafs/src/WINNT/client_osi/osibasel.h
diff -c openafs/src/WINNT/client_osi/osibasel.h:1.5.4.2 openafs/src/WINNT/client_osi/osibasel.h:1.5.4.3
*** openafs/src/WINNT/client_osi/osibasel.h:1.5.4.2	Sun Nov  4 19:18:37 2007
--- openafs/src/WINNT/client_osi/osibasel.h	Wed Feb 27 12:06:44 2008
***************
*** 109,114 ****
--- 109,116 ----
  
  extern void lock_ConvertWToR(struct osi_rwlock *);
  
+ extern void lock_ConvertRToW(struct osi_rwlock *);
+ 
  /* and stat functions */
  
  extern int lock_GetRWLockState(struct osi_rwlock *);
Index: openafs/src/WINNT/client_osi/osilog.h
diff -c openafs/src/WINNT/client_osi/osilog.h:1.7 openafs/src/WINNT/client_osi/osilog.h:1.7.4.1
*** openafs/src/WINNT/client_osi/osilog.h:1.7	Sat Nov  5 01:47:55 2005
--- openafs/src/WINNT/client_osi/osilog.h	Wed Feb 27 12:06:44 2008
***************
*** 1,4 ****
! /* 
   * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved
   *
   * (C) COPYRIGHT IBM CORPORATION 1987, 1988
--- 1,4 ----
! /*
   * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved
   *
   * (C) COPYRIGHT IBM CORPORATION 1987, 1988
***************
*** 86,97 ****
  extern char *osi_HexifyString(char *s);
  
  /* define macros */
! #define osi_Log0(l,f)		osi_LogAdd((l), (f), 0, 0, 0, 0)
! #define osi_Log1(l,f,a)		osi_LogAdd((l), (f), (size_t) (a), 0, 0, 0)
! #define osi_Log2(l,f,a,b)	osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), 0, 0)
! #define osi_Log3(l,f,a,b,c)	osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), (size_t) (c), 0)
! #define osi_Log4(l,f,a,b,c,d)	osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), (size_t) (c), (size_t) (d))
! #define osi_Log5(l,f,a,b,c,d,e)	osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), (size_t) (c), (size_t) (d), (size_t) (e))
  
  #ifdef DEBUG_VERBOSE
  #define DEBUG_EVENT1(a,b,c) {HANDLE h; char *ptbuf[1],buf[132];\
--- 86,97 ----
  extern char *osi_HexifyString(char *s);
  
  /* define macros */
! #define osi_Log0(l,f)		if ((l) && (l)->enabled) osi_LogAdd((l), (f), 0, 0, 0, 0)
! #define osi_Log1(l,f,a)		if ((l) && (l)->enabled) osi_LogAdd((l), (f), (size_t) (a), 0, 0, 0)
! #define osi_Log2(l,f,a,b)	if ((l) && (l)->enabled) osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), 0, 0)
! #define osi_Log3(l,f,a,b,c)	if ((l) && (l)->enabled) osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), (size_t) (c), 0)
! #define osi_Log4(l,f,a,b,c,d)	if ((l) && (l)->enabled) osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), (size_t) (c), (size_t) (d))
! #define osi_Log5(l,f,a,b,c,d,e)	if ((l) && (l)->enabled) osi_LogAdd((l), (f), (size_t) (a), (size_t) (b), (size_t) (c), (size_t) (d), (size_t) (e))
  
  #ifdef DEBUG_VERBOSE
  #define DEBUG_EVENT1(a,b,c) {HANDLE h; char *ptbuf[1],buf[132];\
Index: openafs/src/WINNT/client_osi/osiltype.h
diff -c openafs/src/WINNT/client_osi/osiltype.h:1.2 openafs/src/WINNT/client_osi/osiltype.h:1.2.4.1
*** openafs/src/WINNT/client_osi/osiltype.h:1.2	Sat Nov 19 09:30:38 2005
--- openafs/src/WINNT/client_osi/osiltype.h	Wed Feb 27 12:06:44 2008
***************
*** 35,40 ****
--- 35,41 ----
  	void (*FinalizeMutexProc)(struct osi_mutex *);
  	void (*FinalizeRWLockProc)(struct osi_rwlock *);
          void (*ConvertWToRProc)(struct osi_rwlock *);
+         void (*ConvertRToWProc)(struct osi_rwlock *);
          int (*GetRWLockState)(struct osi_rwlock *);
          int (*GetMutexState)(struct osi_mutex *);
  } osi_lockOps_t;
Index: openafs/src/WINNT/client_osi/osistatl.c
diff -c openafs/src/WINNT/client_osi/osistatl.c:1.3 openafs/src/WINNT/client_osi/osistatl.c:1.3.4.1
*** openafs/src/WINNT/client_osi/osistatl.c:1.3	Sun Nov 20 20:56:22 2005
--- openafs/src/WINNT/client_osi/osistatl.c	Wed Feb 27 12:06:44 2008
***************
*** 206,211 ****
--- 206,261 ----
  	}
  }
  
+ static void lock_ConvertRToWStat(osi_rwlock_t *lockp)
+ {
+ 	osi_activeInfo_t *ap;
+ 	osi_rwlockStat_t *realp;
+         CRITICAL_SECTION *csp;
+ 
+ 	realp = (osi_rwlockStat_t *)lockp->d.privateDatap;
+ 
+ 	/* otherwise we're the fast base type */
+ 	csp = &osi_statAtomicCS[lockp->atomicIndex];
+         EnterCriticalSection(csp);
+ 
+ 	osi_assert(lockp->flags & OSI_LOCKFLAG_EXCL);
+ 	ap = osi_FindActiveInfo(&realp->qi);
+ 	osi_assert(ap !=NULL);
+ 	osi_RemoveActiveInfo(&realp->qi, ap);
+         realp->readLockedCount++;
+         realp->readLockedTime = LargeIntegerAdd(realp->readLockedTime, ap->startTime);
+         osi_FreeActiveInfo(ap);
+         
+         if (--lockp->readers == 0) {
+             /* and obtain the write lock */
+             lockp->readers--;
+             lockp->flags |= OSI_LOCKFLAG_EXCL;
+         } else {
+             lockp->waiters++;
+             ap = osi_QueueActiveInfo(&realp->qi,
+                                      OSI_ACTIVEFLAGS_WRITER | OSI_ACTIVEFLAGS_WAITER);
+             osi_TWait(&realp->turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, csp);
+             lockp->waiters--;
+             osi_assert((lockp->flags & OSI_LOCKFLAG_EXCL) && lockp->readers == 0);
+ 
+             /*  we have some timer info about the last sleep operation
+              * that we should merge in under the spin lock.
+              */
+ 
+             /* remove from queue and turn time to incremental time */
+             osi_RemoveActiveInfo(&realp->qi, ap);
+ 		
+             /* add in increment to statistics */
+             realp->writeBlockedCount++;
+             realp->writeBlockedTime = LargeIntegerAdd(realp->writeBlockedTime,
+                                                    ap->startTime);
+             osi_FreeActiveInfo(ap);
+         }
+ 
+         osi_QueueActiveInfo(&realp->qi, OSI_ACTIVEFLAGS_WRITER);
+         LeaveCriticalSection(csp);
+ }
+ 
  static void lock_ReleaseWriteStat(osi_rwlock_t *lockp)
  {
  	osi_activeInfo_t *ap;
***************
*** 444,450 ****
  	return i;
  }
  
! static void osi_SleepRStat(long sleepVal, struct osi_rwlock *lockp)
  {
  	osi_rwlockStat_t *realp;
  	osi_activeInfo_t *ap;
--- 494,500 ----
  	return i;
  }
  
! static void osi_SleepRStat(LONG_PTR sleepVal, struct osi_rwlock *lockp)
  {
  	osi_rwlockStat_t *realp;
  	osi_activeInfo_t *ap;
***************
*** 474,480 ****
  	osi_SleepSpin(sleepVal, csp);
  }
  
! static void osi_SleepWStat(long sleepVal, struct osi_rwlock *lockp)
  {
  	osi_activeInfo_t *ap;
  	osi_rwlockStat_t *realp;
--- 524,530 ----
  	osi_SleepSpin(sleepVal, csp);
  }
  
! static void osi_SleepWStat(LONG_PTR sleepVal, struct osi_rwlock *lockp)
  {
  	osi_activeInfo_t *ap;
  	osi_rwlockStat_t *realp;
***************
*** 505,511 ****
  	osi_SleepSpin(sleepVal, csp);
  }
  
! static void osi_SleepMStat(long sleepVal, struct osi_mutex *lockp)
  {
  	osi_mutexStat_t *realp;
  	osi_activeInfo_t *ap;
--- 555,561 ----
  	osi_SleepSpin(sleepVal, csp);
  }
  
! static void osi_SleepMStat(LONG_PTR sleepVal, struct osi_mutex *lockp)
  {
  	osi_mutexStat_t *realp;
  	osi_activeInfo_t *ap;
***************
*** 740,745 ****
--- 790,796 ----
  	lock_FinalizeMutexStat,
  	lock_FinalizeRWLockStat,
          lock_ConvertWToRStat,
+         lock_ConvertRToWStat,
  	lock_GetRWLockStateStat,
          lock_GetMutexStateStat
  };
***************
*** 798,804 ****
  
  		memset((void *) parmsp, 0, sizeof(*parmsp));
  		backMutexp = mp->qi.backp;
! 		parmsp->idata[0] = backMutexp;
  		parmsp->idata[1] = (backMutexp->flags & OSI_LOCKFLAG_EXCL)? 1 : 0;
  		/* reader count [2] is 0 */
  		parmsp->idata[3] = (backMutexp->waiters > 0)? 1 : 0;
--- 849,855 ----
  
  		memset((void *) parmsp, 0, sizeof(*parmsp));
  		backMutexp = mp->qi.backp;
! 		parmsp->idata[0] = (LONG_PTR)backMutexp;
  		parmsp->idata[1] = (backMutexp->flags & OSI_LOCKFLAG_EXCL)? 1 : 0;
  		/* reader count [2] is 0 */
  		parmsp->idata[3] = (backMutexp->waiters > 0)? 1 : 0;
***************
*** 816,822 ****
  
  		memset((void *) parmsp, 0, sizeof(*parmsp));
                  backRWLockp = rwp->qi.backp;
! 		parmsp->idata[0] = backRWLockp;
  		parmsp->idata[1] = (backRWLockp->flags & OSI_LOCKFLAG_EXCL)? 1 : 0;
  		parmsp->idata[2] = backRWLockp->readers;
  		parmsp->idata[3] = (backRWLockp->waiters > 0)? 1 : 0;
--- 867,873 ----
  
  		memset((void *) parmsp, 0, sizeof(*parmsp));
                  backRWLockp = rwp->qi.backp;
! 		parmsp->idata[0] = (LONG_PTR)backRWLockp;
  		parmsp->idata[1] = (backRWLockp->flags & OSI_LOCKFLAG_EXCL)? 1 : 0;
  		parmsp->idata[2] = backRWLockp->readers;
  		parmsp->idata[3] = (backRWLockp->waiters > 0)? 1 : 0;
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.28 openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.29
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.28	Mon Feb 25 00:24:46 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm	Sat Mar  8 20:09:30 2008
***************
*** 57,63 ****
  
  <h1>OpenAFS for Windows</h1>
  
! <h2>Version 1.5.33</h2>
  
  <p class=MsoNormal>&nbsp; </p>
  
--- 57,63 ----
  
  <h1>OpenAFS for Windows</h1>
  
! <h2>Version 1.5.34</h2>
  
  <p class=MsoNormal>&nbsp; </p>
  
***************
*** 80,86 ****
  <span
  style='font-family:Symbol'>·<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span></span><a
! href="ReleaseNotes/relnotes-frames.htm">OpenAFS for Windows 1.5.33
  Release Notes</a></p>
  
  <p style='margin-left:36.0pt;text-indent:-18.0pt;'>
--- 80,86 ----
  <span
  style='font-family:Symbol'>·<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span></span><a
! href="ReleaseNotes/relnotes-frames.htm">OpenAFS for Windows 1.5.34
  Release Notes</a></p>
  
  <p style='margin-left:36.0pt;text-indent:-18.0pt;'>
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.28 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.29
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.28	Mon Feb 25 00:24:51 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm	Sat Mar  8 20:09:47 2008
***************
*** 18,24 ****
  .shape {behavior:url(#default#VML);}
  </style>
  <![endif]-->
! <title>OpenAFS for Windows 1.5.33 Release Notes</title>
  <!--[if gte mso 9]><xml>
   <o:DocumentProperties>
    <o:Revision>1</o:Revision>
--- 18,24 ----
  .shape {behavior:url(#default#VML);}
  </style>
  <![endif]-->
! <title>OpenAFS for Windows 1.5.34 Release Notes</title>
  <!--[if gte mso 9]><xml>
   <o:DocumentProperties>
    <o:Revision>1</o:Revision>
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes-frames.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes-frames.htm:1.1.4.30 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes-frames.htm:1.1.4.31
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes-frames.htm:1.1.4.30	Mon Feb 25 00:24:51 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes-frames.htm	Sat Mar  8 20:09:47 2008
***************
*** 9,15 ****
  <meta name=Generator content="Microsoft Word 12">
  <meta name=Originator content="Microsoft Word 12">
  <link rel=File-List href="relnotes-frames_files/filelist.xml">
! <title>OpenAFS for Windows 1.5.33 Release Notes</title>
  <link rel=themeData href="relnotes-frames_files/themedata.thmx">
  <link rel=colorSchemeMapping href="relnotes-frames_files/colorschememapping.xml">
  <!--[if gte mso 9]><xml>
--- 9,15 ----
  <meta name=Generator content="Microsoft Word 12">
  <meta name=Originator content="Microsoft Word 12">
  <link rel=File-List href="relnotes-frames_files/filelist.xml">
! <title>OpenAFS for Windows 1.5.34 Release Notes</title>
  <link rel=themeData href="relnotes-frames_files/themedata.thmx">
  <link rel=colorSchemeMapping href="relnotes-frames_files/colorschememapping.xml">
  <!--[if gte mso 9]><xml>
***************
*** 277,286 ****
  <![endif]-->
  </head>
  
! <frameset cols="30%,1*">
!  <frameset rows="16%,1*">
    <frame name=logo src=logo.htm>
!   <frame name=toc src=toc.htm>
   </frameset>
   <frame name=body src=relnotes.htm>
   <noframes>
--- 277,286 ----
  <![endif]-->
  </head>
  
! <frameset cols="30%,*">
!  <frameset rows="16%,*">
    <frame name=logo src=logo.htm>
!   <frame name=toc src=toc.htm target="body">
   </frameset>
   <frame name=body src=relnotes.htm>
   <noframes>
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes.htm:1.6.4.34 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes.htm:1.6.4.36
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes.htm:1.6.4.34	Mon Feb 25 00:24:51 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes.htm	Fri Mar 21 14:09:06 2008
***************
*** 10,15 ****
--- 10,16 ----
  <meta name=ProgId content=Word.Document>
  <meta name=Generator content="Microsoft Word 12">
  <meta name=Originator content="Microsoft Word 12">
+ <base target="_self">
  <link rel=File-List href="relnotes_files/filelist.xml">
  <link rel=Edit-Time-Data href="relnotes_files/editdata.mso">
  <!--[if !mso]>
***************
*** 20,26 ****
  .shape {behavior:url(#default#VML);}
  </style>
  <![endif]-->
! <title>OpenAFS for Windows 1.5.33 Release Notes</title>
  <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
   name="PostalCode"/>
  <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
--- 21,27 ----
  .shape {behavior:url(#default#VML);}
  </style>
  <![endif]-->
! <title>OpenAFS for Windows 1.5.34 Release Notes</title>
  <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
   name="PostalCode"/>
  <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
***************
*** 43,61 ****
   <o:DocumentProperties>
    <o:LastAuthor>Jeffrey Altman</o:LastAuthor>
    <o:Revision>4</o:Revision>
!   <o:TotalTime>1676</o:TotalTime>
    <o:Created>2006-11-29T17:26:00Z</o:Created>
    <o:LastSaved>2008-01-08T16:12:00Z</o:LastSaved>
    <o:Pages>35</o:Pages>
!   <o:Words>19109</o:Words>
!   <o:Characters>108922</o:Characters>
    <o:Company>Secure Endpoints Inc.</o:Company>
!   <o:Lines>907</o:Lines>
!   <o:Paragraphs>255</o:Paragraphs>
!   <o:CharactersWithSpaces>127776</o:CharactersWithSpaces>
    <o:Version>12.00</o:Version>
   </o:DocumentProperties>
  </xml><![endif]-->
  <link rel=themeData href="relnotes_files/themedata.thmx">
  <link rel=colorSchemeMapping href="relnotes_files/colorschememapping.xml">
  <!--[if gte mso 9]><xml>
--- 44,64 ----
   <o:DocumentProperties>
    <o:LastAuthor>Jeffrey Altman</o:LastAuthor>
    <o:Revision>4</o:Revision>
!   <o:TotalTime>1686</o:TotalTime>
    <o:Created>2006-11-29T17:26:00Z</o:Created>
    <o:LastSaved>2008-01-08T16:12:00Z</o:LastSaved>
    <o:Pages>35</o:Pages>
!   <o:Words>19451</o:Words>
!   <o:Characters>110874</o:Characters>
    <o:Company>Secure Endpoints Inc.</o:Company>
!   <o:Lines>923</o:Lines>
!   <o:Paragraphs>260</o:Paragraphs>
!   <o:CharactersWithSpaces>130065</o:CharactersWithSpaces>
    <o:Version>12.00</o:Version>
   </o:DocumentProperties>
  </xml><![endif]-->
+ <link rel=dataStoreItem href="relnotes_files/item0008.xml"
+ target="relnotes_files/props0009.xml">
  <link rel=themeData href="relnotes_files/themedata.thmx">
  <link rel=colorSchemeMapping href="relnotes_files/colorschememapping.xml">
  <!--[if gte mso 9]><xml>
***************
*** 113,123 ****
--- 116,136 ----
     QFormat="true" Name="heading 8"/>
    <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
     QFormat="true" Name="heading 9"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
+   <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
    <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
     QFormat="true" Name="caption"/>
    <w:LsdException Locked="false" QFormat="true" Name="Title"/>
    <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
    <w:LsdException Locked="false" QFormat="true" Name="Subtitle"/>
+   <w:LsdException Locked="false" Priority="99" Name="Hyperlink"/>
    <w:LsdException Locked="false" QFormat="true" Name="Strong"/>
    <w:LsdException Locked="false" QFormat="true" Name="Emphasis"/>
    <w:LsdException Locked="false" Priority="99" Name="No List"/>
***************
*** 267,272 ****
--- 280,292 ----
  	mso-font-pitch:variable;
  	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
  @font-face
+ 	{font-family:Cambria;
+ 	panose-1:2 4 5 3 5 4 6 3 2 4;
+ 	mso-font-charset:0;
+ 	mso-generic-font-family:roman;
+ 	mso-font-pitch:variable;
+ 	mso-font-signature:-1610611985 1073741899 0 0 159 0;}
+ @font-face
  	{font-family:Tahoma;
  	panose-1:2 11 6 4 3 5 4 4 2 4;
  	mso-font-charset:0;
***************
*** 433,438 ****
--- 453,459 ----
  	font-weight:bold;}
  p.MsoToc1, li.MsoToc1, div.MsoToc1
  	{mso-style-update:auto;
+ 	mso-style-priority:39;
  	mso-style-unhide:no;
  	margin-top:.1in;
  	margin-right:0in;
***************
*** 445,450 ****
--- 466,472 ----
  	mso-bidi-font-family:"Times New Roman";}
  p.MsoToc2, li.MsoToc2, div.MsoToc2
  	{mso-style-update:auto;
+ 	mso-style-priority:39;
  	mso-style-unhide:no;
  	margin-top:.1in;
  	margin-right:0in;
***************
*** 457,462 ****
--- 479,485 ----
  	mso-bidi-font-family:"Times New Roman";}
  p.MsoToc3, li.MsoToc3, div.MsoToc3
  	{mso-style-update:auto;
+ 	mso-style-priority:39;
  	mso-style-unhide:no;
  	margin-top:.1in;
  	margin-right:0in;
***************
*** 467,472 ****
--- 490,615 ----
  	font-family:"Thorndale","serif";
  	mso-fareast-font-family:"MS Mincho";
  	mso-bidi-font-family:"Times New Roman";}
+ p.MsoToc4, li.MsoToc4, div.MsoToc4
+ 	{mso-style-update:auto;
+ 	mso-style-priority:39;
+ 	mso-style-next:Normal;
+ 	margin-top:0in;
+ 	margin-right:0in;
+ 	margin-bottom:5.0pt;
+ 	margin-left:33.0pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan;
+ 	font-size:11.0pt;
+ 	font-family:"Calibri","sans-serif";
+ 	mso-ascii-font-family:Calibri;
+ 	mso-ascii-theme-font:minor-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:minor-fareast;
+ 	mso-hansi-font-family:Calibri;
+ 	mso-hansi-theme-font:minor-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:minor-bidi;}
+ p.MsoToc5, li.MsoToc5, div.MsoToc5
+ 	{mso-style-update:auto;
+ 	mso-style-priority:39;
+ 	mso-style-next:Normal;
+ 	margin-top:0in;
+ 	margin-right:0in;
+ 	margin-bottom:5.0pt;
+ 	margin-left:44.0pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan;
+ 	font-size:11.0pt;
+ 	font-family:"Calibri","sans-serif";
+ 	mso-ascii-font-family:Calibri;
+ 	mso-ascii-theme-font:minor-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:minor-fareast;
+ 	mso-hansi-font-family:Calibri;
+ 	mso-hansi-theme-font:minor-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:minor-bidi;}
+ p.MsoToc6, li.MsoToc6, div.MsoToc6
+ 	{mso-style-update:auto;
+ 	mso-style-priority:39;
+ 	mso-style-next:Normal;
+ 	margin-top:0in;
+ 	margin-right:0in;
+ 	margin-bottom:5.0pt;
+ 	margin-left:55.0pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan;
+ 	font-size:11.0pt;
+ 	font-family:"Calibri","sans-serif";
+ 	mso-ascii-font-family:Calibri;
+ 	mso-ascii-theme-font:minor-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:minor-fareast;
+ 	mso-hansi-font-family:Calibri;
+ 	mso-hansi-theme-font:minor-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:minor-bidi;}
+ p.MsoToc7, li.MsoToc7, div.MsoToc7
+ 	{mso-style-update:auto;
+ 	mso-style-priority:39;
+ 	mso-style-next:Normal;
+ 	margin-top:0in;
+ 	margin-right:0in;
+ 	margin-bottom:5.0pt;
+ 	margin-left:66.0pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan;
+ 	font-size:11.0pt;
+ 	font-family:"Calibri","sans-serif";
+ 	mso-ascii-font-family:Calibri;
+ 	mso-ascii-theme-font:minor-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:minor-fareast;
+ 	mso-hansi-font-family:Calibri;
+ 	mso-hansi-theme-font:minor-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:minor-bidi;}
+ p.MsoToc8, li.MsoToc8, div.MsoToc8
+ 	{mso-style-update:auto;
+ 	mso-style-priority:39;
+ 	mso-style-next:Normal;
+ 	margin-top:0in;
+ 	margin-right:0in;
+ 	margin-bottom:5.0pt;
+ 	margin-left:77.0pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan;
+ 	font-size:11.0pt;
+ 	font-family:"Calibri","sans-serif";
+ 	mso-ascii-font-family:Calibri;
+ 	mso-ascii-theme-font:minor-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:minor-fareast;
+ 	mso-hansi-font-family:Calibri;
+ 	mso-hansi-theme-font:minor-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:minor-bidi;}
+ p.MsoToc9, li.MsoToc9, div.MsoToc9
+ 	{mso-style-update:auto;
+ 	mso-style-priority:39;
+ 	mso-style-next:Normal;
+ 	margin-top:0in;
+ 	margin-right:0in;
+ 	margin-bottom:5.0pt;
+ 	margin-left:88.0pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan;
+ 	font-size:11.0pt;
+ 	font-family:"Calibri","sans-serif";
+ 	mso-ascii-font-family:Calibri;
+ 	mso-ascii-theme-font:minor-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:minor-fareast;
+ 	mso-hansi-font-family:Calibri;
+ 	mso-hansi-theme-font:minor-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:minor-bidi;}
  p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
  	{mso-style-unhide:no;
  	mso-style-link:"Footnote Text Char";
***************
*** 584,590 ****
  	mso-bidi-font-family:"Times New Roman";
  	font-style:italic;}
  a:link, span.MsoHyperlink
! 	{mso-style-unhide:no;
  	color:navy;
  	text-decoration:underline;
  	text-underline:single;}
--- 727,734 ----
  	mso-bidi-font-family:"Times New Roman";
  	font-style:italic;}
  a:link, span.MsoHyperlink
! 	{mso-style-priority:99;
! 	mso-style-unhide:no;
  	color:navy;
  	text-decoration:underline;
  	text-underline:single;}
***************
*** 623,628 ****
--- 767,800 ----
  	font-size:8.0pt;
  	font-family:"Tahoma","sans-serif";
  	mso-fareast-font-family:"MS Mincho";}
+ p.MsoTocHeading, li.MsoTocHeading, div.MsoTocHeading
+ 	{mso-style-noshow:yes;
+ 	mso-style-priority:39;
+ 	mso-style-qformat:yes;
+ 	mso-style-parent:"Heading 1";
+ 	mso-style-next:Normal;
+ 	margin-top:24.0pt;
+ 	margin-right:0in;
+ 	margin-bottom:0in;
+ 	margin-left:0in;
+ 	margin-bottom:.0001pt;
+ 	line-height:115%;
+ 	mso-pagination:widow-orphan lines-together;
+ 	page-break-after:avoid;
+ 	font-size:14.0pt;
+ 	font-family:"Cambria","serif";
+ 	mso-ascii-font-family:Cambria;
+ 	mso-ascii-theme-font:major-latin;
+ 	mso-fareast-font-family:"Times New Roman";
+ 	mso-fareast-theme-font:major-fareast;
+ 	mso-hansi-font-family:Cambria;
+ 	mso-hansi-theme-font:major-latin;
+ 	mso-bidi-font-family:"Times New Roman";
+ 	mso-bidi-theme-font:major-bidi;
+ 	color:#365F91;
+ 	mso-themecolor:accent1;
+ 	mso-themeshade:191;
+ 	font-weight:bold;}
  span.Heading1Char
  	{mso-style-name:"Heading 1 Char";
  	mso-style-unhide:no;
***************
*** 839,844 ****
--- 1011,1028 ----
  	mso-themecolor:accent1;
  	letter-spacing:.75pt;
  	font-style:italic;}
+ span.BalloonTextChar
+ 	{mso-style-name:"Balloon Text Char";
+ 	mso-style-unhide:no;
+ 	mso-style-locked:yes;
+ 	mso-style-link:"Balloon Text";
+ 	mso-ansi-font-size:8.0pt;
+ 	mso-bidi-font-size:8.0pt;
+ 	font-family:"Tahoma","sans-serif";
+ 	mso-ascii-font-family:Tahoma;
+ 	mso-fareast-font-family:"MS Mincho";
+ 	mso-hansi-font-family:Tahoma;
+ 	mso-bidi-font-family:Tahoma;}
  p.heading, li.heading, div.heading
  	{mso-style-name:heading;
  	mso-style-unhide:no;
***************
*** 992,1009 ****
  	font-family:"Thorndale","serif";
  	mso-ascii-font-family:Thorndale;
  	mso-hansi-font-family:Thorndale;}
- span.BalloonTextChar
- 	{mso-style-name:"Balloon Text Char";
- 	mso-style-unhide:no;
- 	mso-style-locked:yes;
- 	mso-style-link:"Balloon Text";
- 	mso-ansi-font-size:8.0pt;
- 	mso-bidi-font-size:8.0pt;
- 	font-family:"Tahoma","sans-serif";
- 	mso-ascii-font-family:Tahoma;
- 	mso-fareast-font-family:"MS Mincho";
- 	mso-hansi-font-family:Tahoma;
- 	mso-bidi-font-family:Tahoma;}
  .MsoChpDefault
  	{mso-style-type:export-only;
  	mso-default-props:yes;
--- 1176,1181 ----
***************
*** 1020,1027 ****
  	{page:Section1;}
   /* List Definitions */
   @list l0
! 	{mso-list-id:956333548;
! 	mso-list-template-ids:-1864719568;}
  @list l0:level1
  	{mso-level-number-format:bullet;
  	mso-level-text:\F0B7;
--- 1192,1199 ----
  	{page:Section1;}
   /* List Definitions */
   @list l0
! 	{mso-list-id:558320498;
! 	mso-list-template-ids:-1221952136;}
  @list l0:level1
  	{mso-level-number-format:bullet;
  	mso-level-text:\F0B7;
***************
*** 1098,1104 ****
  	font-family:"Times New Roman","serif";}
  </style>
  <![endif]--><!--[if gte mso 9]><xml>
!  <o:shapedefaults v:ext="edit" spidmax="8194"/>
  </xml><![endif]--><!--[if gte mso 9]><xml>
   <o:shapelayout v:ext="edit">
    <o:idmap v:ext="edit" data="1"/>
--- 1270,1276 ----
  	font-family:"Times New Roman","serif";}
  </style>
  <![endif]--><!--[if gte mso 9]><xml>
!  <o:shapedefaults v:ext="edit" spidmax="2050"/>
  </xml><![endif]--><!--[if gte mso 9]><xml>
   <o:shapelayout v:ext="edit">
    <o:idmap v:ext="edit" data="1"/>
***************
*** 1110,1129 ****
  
  <div class=Section1>
  
! <p class=MsoTitle>OpenAFS for Windows 1.5.33<br>
  Release Notes</p>
  
  <p class=MsoBodyText>The Andrew File System (AFS) is a location-independent
  file system that uses a local cache to increase its performance.&nbsp; An AFS
! client accesses files anonymously or via a Kerberos authentication.&nbsp; The global
! AFS is partitioned into cells.&nbsp; The AFS cell is a collection of AFS
  volumes that are administered by a common entity.&nbsp;&nbsp; AFS cells can be
  administered by a department even when the Kerberos realm used for local
  authentication is managed by a much larger organization.&nbsp; AFS clients and
  servers take advantage of Kerberos cross realm authentication to enable
  authenticated access by entities located outside the local realm.&nbsp;
! Authorization is enforced by the use of directory level access control lists
! which can consist of individual or group identities.&nbsp; </p>
  
  <p class=MsoBodyText>The AFS volume is a tree of files and
  sub-directories.&nbsp; AFS volumes are created by administrators and are joined
--- 1282,1301 ----
  
  <div class=Section1>
  
! <p class=MsoTitle>OpenAFS for Windows 1.5.34<br>
  Release Notes</p>
  
  <p class=MsoBodyText>The Andrew File System (AFS) is a location-independent
  file system that uses a local cache to increase its performance.&nbsp; An AFS
! client accesses files anonymously or via a Kerberos authentication.&nbsp; The
! global AFS is partitioned into cells.&nbsp; The AFS cell is a collection of AFS
  volumes that are administered by a common entity.&nbsp;&nbsp; AFS cells can be
  administered by a department even when the Kerberos realm used for local
  authentication is managed by a much larger organization.&nbsp; AFS clients and
  servers take advantage of Kerberos cross realm authentication to enable
  authenticated access by entities located outside the local realm.&nbsp;
! Authorization is enforced by the use of directory level access control lists which
! can consist of individual or group identities.&nbsp; </p>
  
  <p class=MsoBodyText>The AFS volume is a tree of files and
  sub-directories.&nbsp; AFS volumes are created by administrators and are joined
***************
*** 1131,1138 ****
  created, users can create files and directories as well as mount points and
  symlinks within the volume without regard for the physical location of the
  volume.&nbsp; Administrators can move the volume to another server as necessary
! without the need to notify users.&nbsp;&nbsp; In fact, the volume move can
! occur while files in the volume are in use.&nbsp; </p>
  
  <p class=MsoBodyText>AFS volumes can be replicated to read-only
  copies.&nbsp;&nbsp; When accessing files from a read-only replica, clients will
--- 1303,1310 ----
  created, users can create files and directories as well as mount points and
  symlinks within the volume without regard for the physical location of the
  volume.&nbsp; Administrators can move the volume to another server as necessary
! without the need to notify users.&nbsp;&nbsp; In fact, the volume move can occur
! while files in the volume are in use.&nbsp; </p>
  
  <p class=MsoBodyText>AFS volumes can be replicated to read-only
  copies.&nbsp;&nbsp; When accessing files from a read-only replica, clients will
***************
*** 1150,1156 ****
  logon and for that principal to be used to obtain AFS tokens for one or more
  cells.&nbsp;&nbsp; Although OAFW is implemented as a locally installed SMB to
  AFS gateway, OAFW maintains the portability of file paths by its use of the <a
! href="file:///\\AFS">\\AFS</a> UNC server name.</p>
  
  <p class=MsoBodyText>OpenAFS is the product of an open source development
  effort begun on October 31 2000.&nbsp; OpenAFS is maintained and developed by a
--- 1322,1330 ----
  logon and for that principal to be used to obtain AFS tokens for one or more
  cells.&nbsp;&nbsp; Although OAFW is implemented as a locally installed SMB to
  AFS gateway, OAFW maintains the portability of file paths by its use of the <a
! href="file:///\\AFS"><span class=Heading1Char><span style='font-size:14.0pt;
! text-decoration:none;text-underline:none'>\\AFS</span></span></a> UNC server
! name.</p>
  
  <p class=MsoBodyText>OpenAFS is the product of an open source development
  effort begun on October 31 2000.&nbsp; OpenAFS is maintained and developed by a
***************
*** 1158,1202 ****
  use OpenAFS as part of your computing infrastructure please contribute to its
  continued growth.</p>
  
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417109">1. Installer
! Options<span style='color:windowtext;display:none;mso-hide:all;text-decoration:
! none;text-underline:none'>. 1</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417110">2. System
! Requirements<span style='color:windowtext;display:none;mso-hide:all;text-decoration:
! none;text-underline:none'>. 2</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417111">3.
! Operational Notes<span style='color:windowtext;display:none;mso-hide:all;
! text-decoration:none;text-underline:none'>. 2</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc190064072">4. How to
! Debug Problems with OpenAFS for Windows<span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'> 11</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417113">5. Reporting
! Bugs<span style='color:windowtext;display:none;mso-hide:all;text-decoration:
! none;text-underline:none'> 13</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417114">6. How to
! Contribute to the Development of OpenAFS for Windows<span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'>. 14</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417115">7. MSI
! Deployment Guide<span style='color:windowtext;display:none;mso-hide:all;
! text-decoration:none;text-underline:none'>. 15</span></a></span></p>
! 
! <p class=MsoToc1><span class=MsoHyperlink><a href="#_Toc115417116">Appendix A:
! Registry Values<span style='color:windowtext;display:none;mso-hide:all;
! text-decoration:none;text-underline:none'>. 26</span></a></span></p>
! 
! <h1><a name="_Toc191662062"></a><a name="_Toc152605032"></a><a
! name="_Toc115416098"></a><a name="_Toc139993082"></a><a name="_Toc126872163"></a><a
! name="_Toc115417109"></a><a name="_Toc115417037"></a><span style='mso-bookmark:
! _Toc191662062'><span style='mso-bookmark:_Toc152605032'><span style='mso-bookmark:
! _Toc115416098'><span style='mso-fareast-font-family:"Times New Roman"'>1.
! Installer Options</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h1>
  
  <p class=MsoNormal>It can be installed either as a new installation or an
  upgrade from previous versions of OpenAFS for Windows or IBM AFS for
--- 1332,1420 ----
  use OpenAFS as part of your computing infrastructure please contribute to its
  continued growth.</p>
  
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_1._Installer_Options"><span style='mso-bookmark:_Toc193871617'><span
! style='mso-bookmark:_Toc193871372'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>1.
! Installer Options</span></span></span><span style='mso-bookmark:_Toc193871372'></span><span
! style='mso-bookmark:_Toc193871617'></span><span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'>. 1</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871372"></a><a name="_Toc193871617"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_2._System_Requirements"><span style='mso-bookmark:_Toc193871618'><span
! style='mso-bookmark:_Toc193871373'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>2. System
! Requirements</span></span></span><span style='mso-bookmark:_Toc193871373'></span><span
! style='mso-bookmark:_Toc193871618'></span><span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'>. 2</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871373"></a><a name="_Toc193871618"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_3._Operational_Notes"><span style='mso-bookmark:_Toc193871619'><span
! style='mso-bookmark:_Toc193871374'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>3.
! Operational Notes</span></span></span><span style='mso-bookmark:_Toc193871374'></span><span
! style='mso-bookmark:_Toc193871619'></span><span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'>. 2</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871374"></a><a name="_Toc193871619"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_4._How_to"><span style='mso-bookmark:_Toc193871620'><span
! style='mso-bookmark:_Toc193871375'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>4. How to
! Debug Problems with OpenAFS for Windows</span></span></span><span
! style='mso-bookmark:_Toc193871375'></span><span style='mso-bookmark:_Toc193871620'></span><span
! style='color:windowtext;display:none;mso-hide:all;text-decoration:none;
! text-underline:none'> 11</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871375"></a><a name="_Toc193871620"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_Toc139993143"><span style='mso-bookmark:_Toc193871621'><span
! style='mso-bookmark:_Toc193871376'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>5.
! Reporting Bugs</span></span></span><span style='mso-bookmark:_Toc193871376'></span><span
! style='mso-bookmark:_Toc193871621'></span><span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'> 13</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871376"></a><a name="_Toc193871621"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_6._How_to"><span style='mso-bookmark:_Toc193871622'><span
! style='mso-bookmark:_Toc193871377'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>6. How to
! Contribute to the Development of OpenAFS for Windows</span></span></span><span
! style='mso-bookmark:_Toc193871377'></span><span style='mso-bookmark:_Toc193871622'></span><span
! style='color:windowtext;display:none;mso-hide:all;text-decoration:none;
! text-underline:none'>. 14</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871377"></a><a name="_Toc193871622"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_7._MSI_Deployment"><span style='mso-bookmark:_Toc193871623'><span
! style='mso-bookmark:_Toc193871378'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>7. MSI
! Deployment Guide</span></span></span><span style='mso-bookmark:_Toc193871378'></span><span
! style='mso-bookmark:_Toc193871623'></span><span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'>. 15</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871378"></a><a name="_Toc193871623"></a><![endif]></span></span></p>
! 
! <p class=MsoToc1><span class=Heading1Char><span style='font-size:14.0pt'><a
! href="#_Appendix_A:_Registry"><span style='mso-bookmark:_Toc193871624'><span
! style='mso-bookmark:_Toc193871379'><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>Appendix
! A: Registry Values</span></span></span><span style='mso-bookmark:_Toc193871379'></span><span
! style='mso-bookmark:_Toc193871624'></span><span style='color:windowtext;
! display:none;mso-hide:all;text-decoration:none;text-underline:none'>. 26</span></a><![if !supportNestedAnchors]><a
! name="_Toc193871379"></a><a name="_Toc193871624"></a><![endif]></span></span></p>
! 
! <h1><a name="_Toc193871625"></a><a name="_Toc193871380"></a><a
! name="_Toc191662062"></a><a name="_Toc152605032"></a><a name="_Toc115416098"></a><a
! name="_Toc139993082"></a><a name="_Toc126872163"></a><a name="_Toc115417109"></a><a
! name="_Toc115417037"></a><a name="_1._Installer_Options"></a><span
! style='mso-bookmark:_Toc193871625'><span style='mso-bookmark:_Toc193871380'><span
! style='mso-bookmark:_Toc191662062'><span style='mso-bookmark:_Toc152605032'><span
! style='mso-bookmark:_Toc115416098'><span style='mso-fareast-font-family:"Times New Roman"'>1.
! Installer Options</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
  <p class=MsoNormal>It can be installed either as a new installation or an
  upgrade from previous versions of OpenAFS for Windows or IBM AFS for
***************
*** 1211,1232 ****
  style='font-size:9.0pt'>2.</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>a Windows Installer package (.msi) that is built using WiX and can be
  customized for organizations via the use of MSI Transforms (see <a
! href="#_MSI_Deployment_Guide">MSI Deployment Guide</a>)</p>
  
! <h1><a name="_Toc191662063"></a><a name="_Toc152605033"></a><a
! name="_Toc115416099"></a><a name="_Toc139993083"></a><a name="_Toc126872164"></a><a
! name="_Toc115417110"></a><a name="_Toc115417038"></a><span style='mso-bookmark:
! _Toc191662063'><span style='mso-bookmark:_Toc152605033'><span style='mso-bookmark:
! _Toc115416099'><span style='mso-fareast-font-family:"Times New Roman"'>2.
! System Requirements</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h1>
  
! <h2><a name="_Toc191662064"></a><a name="_Toc152605034"></a><a
! name="_Toc115416100"></a><a name="_Toc139993084"></a><a name="_Toc126872165"></a><a
! name="_Toc115417039"></a><span style='mso-bookmark:_Toc191662064'><span
! style='mso-bookmark:_Toc152605034'><span style='mso-bookmark:_Toc115416100'><span
! style='mso-fareast-font-family:"Times New Roman"'>2.1 Supported Operating
! Systems</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
--- 1429,1455 ----
  style='font-size:9.0pt'>2.</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>a Windows Installer package (.msi) that is built using WiX and can be
  customized for organizations via the use of MSI Transforms (see <a
! href="#_MSI_Deployment_Guide"><span class=Heading1Char><span style='font-size:
! 14.0pt;text-decoration:none;text-underline:none'>MSI Deployment Guide</span></span></a>)</p>
  
! <h1><a name="_Toc193871626"></a><a name="_Toc193871381"></a><a
! name="_Toc191662063"></a><a name="_Toc152605033"></a><a name="_Toc115416099"></a><a
! name="_Toc139993083"></a><a name="_Toc126872164"></a><a name="_Toc115417110"></a><a
! name="_Toc115417038"></a><a name="_2._System_Requirements"></a><span
! style='mso-bookmark:_Toc193871626'><span style='mso-bookmark:_Toc193871381'><span
! style='mso-bookmark:_Toc191662063'><span style='mso-bookmark:_Toc152605033'><span
! style='mso-bookmark:_Toc115416099'><span style='mso-fareast-font-family:"Times New Roman"'>2.
! System Requirements</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <h2><a name="_Toc193871627"></a><a name="_Toc193871382"></a><a
! name="_Toc191662064"></a><a name="_Toc152605034"></a><a name="_Toc115416100"></a><a
! name="_Toc139993084"></a><a name="_Toc126872165"></a><a name="_Toc115417039"></a><span
! style='mso-bookmark:_Toc193871627'><span style='mso-bookmark:_Toc193871382'><span
! style='mso-bookmark:_Toc191662064'><span style='mso-bookmark:_Toc152605034'><span
! style='mso-bookmark:_Toc115416100'><span style='mso-fareast-font-family:"Times New Roman"'>2.1
! Supported Operating Systems</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
***************
*** 1273,1283 ****
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Microsoft
  Windows 2008 Server (32-bit and 64-bit Intel)</p>
  
! <h3><a name="_Toc191662065"></a><a name="_Toc152605035"></a><a
! name="_Toc115416101"></a><a name="_Toc139993085"></a><a name="_Toc126872166"></a><span
! style='mso-bookmark:_Toc191662065'><span style='mso-bookmark:_Toc152605035'><span
! style='mso-bookmark:_Toc115416101'><span style='mso-fareast-font-family:"Times New Roman"'>2.1.1
! Unsupported Operating Systems</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
--- 1496,1508 ----
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Microsoft
  Windows 2008 Server (32-bit and 64-bit Intel)</p>
  
! <h3><a name="_Toc193871628"></a><a name="_Toc193871383"></a><a
! name="_Toc191662065"></a><a name="_Toc152605035"></a><a name="_Toc115416101"></a><a
! name="_Toc139993085"></a><a name="_Toc126872166"></a><span style='mso-bookmark:
! _Toc193871628'><span style='mso-bookmark:_Toc193871383'><span style='mso-bookmark:
! _Toc191662065'><span style='mso-bookmark:_Toc152605035'><span style='mso-bookmark:
! _Toc115416101'><span style='mso-fareast-font-family:"Times New Roman"'>2.1.1
! Unsupported Operating Systems</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
***************
*** 1310,1388 ****
  with support for Win9x is 1.2.2b.&nbsp; The last version with support for
  Windows NT 4.0 is 1.2.10.</p>
  
! <h2><a name="_Toc191662066"></a><a name="_Toc152605036"></a><a
! name="_Toc115416102"></a><a name="_Toc139993086"></a><a name="_Toc126872167"></a><a
! name="_Toc115417040"></a><span style='mso-bookmark:_Toc191662066'><span
! style='mso-bookmark:_Toc152605036'><span style='mso-bookmark:_Toc115416102'><span
! style='mso-fareast-font-family:"Times New Roman"'>2.2 Disk Space</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Up to 60mb required for the OpenAFS binaries plus 100MB for
  the default AFSCache file.&nbsp;&nbsp; (The size of the AFSCache file may be
  adjusted via the Registry after installation.)</p>
  
! <h2><a name="_Toc191662067"></a><a name="_Toc152605037"></a><a
! name="_Toc115416103"></a><a name="_Toc139993087"></a><a name="_Toc126872168"></a><a
! name="_Toc115417041"></a><span style='mso-bookmark:_Toc191662067'><span
! style='mso-bookmark:_Toc152605037'><span style='mso-bookmark:_Toc115416103'><span
! style='mso-fareast-font-family:"Times New Roman"'>2.3 Additional Software</span></span></span></span><span
  style='mso-bookmark:_Toc191662067'><span style='mso-bookmark:_Toc152605037'><span
! style='mso-fareast-font-family:"Times New Roman"'> Packages</span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal><a href="http://web.mit.edu/kerberos/dist/index.html">MIT
! Kerberos for Windows</a> 2.6.x or 3.x.x if Kerberos v5 authentication support
! is desired.<span style='mso-spacerun:yes'>  </span>The recommended release is
! version 3.2.2.<span style='mso-spacerun:yes'>  </span></p>
! 
! <h1><a name="_Toc191662068"></a><a name="_Toc152605038"></a><a
! name="_Toc115416104"></a><a name="_Toc139993088"></a><a name="_Toc126872169"></a><a
! name="_Toc115417111"></a><a name="_Toc115417042"></a><span style='mso-bookmark:
! _Toc191662068'><span style='mso-bookmark:_Toc152605038'><span style='mso-bookmark:
! _Toc115416104'><span style='mso-fareast-font-family:"Times New Roman"'>3.
! Operational Notes</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h1>
  
! <h2><a name="_Toc191662069"></a><a name="_Toc152605039"></a><a
! name="_Toc115416105"></a><a name="_Toc139993089"></a><a name="_Toc126872170"></a><a
! name="_Toc115417043"></a><span style='mso-bookmark:_Toc191662069'><span
! style='mso-bookmark:_Toc152605039'><span style='mso-bookmark:_Toc115416105'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.1. Requirements for
! Kerberos v5 Authentication</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The Kerberos v4 infrastructure on which the OpenAFS 1.2
  series is reliant is no longer secure.&nbsp; Cross-realm Kerberos is very
  important in the AFS context and most sites have or are migrating to Kerberos
  v5 environments.&nbsp; The OpenAFS 1.4 series (and later) integrates with <a
! href="http://web.mit.edu/kerberos/">MIT Kerberos for Windows</a> 2.6.5 and
! above to support Kerberos v5 authentication including automatic renewal of AFS
! tokens and single sign-on via the Microsoft Windows Kerberos Logon
! Service.<span style='mso-spacerun:yes'>   </span></p>
  
  <p class=MsoNormal>The recommended version of <a
! href="http://web.mit.edu/kerberos/">MIT Kerberos for Windows</a> is 3.2.2.<span
! style='mso-spacerun:yes'>  </span>KFW 3.2.2 includes Network Identity Manager
! 1.3.1 which integrates with the <a href="#_3.1.3._Network_Identity">AFS
! Provider</a> installed as part of OpenAFS for Windows.<span
! style='mso-spacerun:yes'>  </span></p>
  
  <p class=MsoNormal>When KFW is installed, the OpenAFS for Windows client will
  obtain Kerberos v5 tickets and use them as tokens without modification.&nbsp;
  The OpenAFS client requires that all of the AFS Servers with which it
  communicates support the use of Kerberos v5 tickets as tokens. If Kerberos v5
  based tokens are presented to an AFS server that does not support them, the
! server will be unable to communicate with the client when tokens are present.
! Kerberos v5 based tokens are supported by OpenAFS release 1.2.8 or later.<span
  style='mso-spacerun:yes'>  </span>IBM Transarc servers do not support Kerberos
  v5.</p>
  
! <h3><a name="_Toc191662070"></a><a name="_Toc152605040"></a><a
! name="_Toc115416106"></a><a name="_Toc139993090"></a><a name="_Toc126872171"></a><span
! style='mso-bookmark:_Toc191662070'><span style='mso-bookmark:_Toc152605040'><span
! style='mso-bookmark:_Toc115416106'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.1.
! Active Directory</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>Microsoft Windows Active Directory can be used as a Kerberos
  v5 KDC in conjunction with OpenAFS.<span style='mso-spacerun:yes'> 
--- 1535,1633 ----
  with support for Win9x is 1.2.2b.&nbsp; The last version with support for
  Windows NT 4.0 is 1.2.10.</p>
  
! <h2><a name="_Toc193871629"></a><a name="_Toc193871384"></a><a
! name="_Toc191662066"></a><a name="_Toc152605036"></a><a name="_Toc115416102"></a><a
! name="_Toc139993086"></a><a name="_Toc126872167"></a><a name="_Toc115417040"></a><span
! style='mso-bookmark:_Toc193871629'><span style='mso-bookmark:_Toc193871384'><span
! style='mso-bookmark:_Toc191662066'><span style='mso-bookmark:_Toc152605036'><span
! style='mso-bookmark:_Toc115416102'><span style='mso-fareast-font-family:"Times New Roman"'>2.2
! Disk Space</span></span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Up to 60mb required for the OpenAFS binaries plus 100MB for
  the default AFSCache file.&nbsp;&nbsp; (The size of the AFSCache file may be
  adjusted via the Registry after installation.)</p>
  
! <h2><a name="_Toc193871630"></a><a name="_Toc193871385"></a><a
! name="_Toc191662067"></a><a name="_Toc152605037"></a><a name="_Toc115416103"></a><a
! name="_Toc139993087"></a><a name="_Toc126872168"></a><a name="_Toc115417041"></a><span
! style='mso-bookmark:_Toc193871630'><span style='mso-bookmark:_Toc193871385'><span
  style='mso-bookmark:_Toc191662067'><span style='mso-bookmark:_Toc152605037'><span
! style='mso-bookmark:_Toc115416103'><span style='mso-fareast-font-family:"Times New Roman"'>2.3
! Additional Software</span></span></span></span></span></span><span
! style='mso-bookmark:_Toc193871630'><span style='mso-bookmark:_Toc193871385'><span
! style='mso-bookmark:_Toc191662067'><span style='mso-bookmark:_Toc152605037'><span
! style='mso-fareast-font-family:"Times New Roman"'> Packages</span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal><a href="http://web.mit.edu/kerberos/dist/index.html"><span
! style='mso-bookmark:_Toc193871631'><span style='mso-bookmark:_Toc193871386'><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>MIT Kerberos for Windows</span></span></span></span><span
! style='mso-bookmark:_Toc193871386'></span><span style='mso-bookmark:_Toc193871631'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871386"></a><a name="_Toc193871631"></a><![endif]> 2.6.x or 3.x.x
! if Kerberos v5 authentication support is desired.<span
! style='mso-spacerun:yes'>  </span>The recommended release is version
! 3.2.2.<span style='mso-spacerun:yes'>  </span></p>
! 
! <h1><a name="_Toc193871632"></a><a name="_Toc193871387"></a><a
! name="_Toc191662068"></a><a name="_Toc152605038"></a><a name="_Toc115416104"></a><a
! name="_Toc139993088"></a><a name="_Toc126872169"></a><a name="_Toc115417111"></a><a
! name="_Toc115417042"></a><a name="_3._Operational_Notes"></a><span
! style='mso-bookmark:_Toc193871632'><span style='mso-bookmark:_Toc193871387'><span
! style='mso-bookmark:_Toc191662068'><span style='mso-bookmark:_Toc152605038'><span
! style='mso-bookmark:_Toc115416104'><span style='mso-fareast-font-family:"Times New Roman"'>3.
! Operational Notes</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <h2><a name="_Toc193871633"></a><a name="_Toc193871388"></a><a
! name="_Toc191662069"></a><a name="_Toc152605039"></a><a name="_Toc115416105"></a><a
! name="_Toc139993089"></a><a name="_Toc126872170"></a><a name="_Toc115417043"></a><span
! style='mso-bookmark:_Toc193871633'><span style='mso-bookmark:_Toc193871388'><span
! style='mso-bookmark:_Toc191662069'><span style='mso-bookmark:_Toc152605039'><span
! style='mso-bookmark:_Toc115416105'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.
! Requirements for Kerberos v5 Authentication</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The Kerberos v4 infrastructure on which the OpenAFS 1.2
  series is reliant is no longer secure.&nbsp; Cross-realm Kerberos is very
  important in the AFS context and most sites have or are migrating to Kerberos
  v5 environments.&nbsp; The OpenAFS 1.4 series (and later) integrates with <a
! href="http://web.mit.edu/kerberos/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MIT Kerberos
! for Windows</span></span></a> 2.6.5 and above to support Kerberos v5
! authentication including automatic renewal of AFS tokens and single sign-on via
! the Microsoft Windows Kerberos Logon Service.<span style='mso-spacerun:yes'>  
! </span></p>
  
  <p class=MsoNormal>The recommended version of <a
! href="http://web.mit.edu/kerberos/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MIT Kerberos
! for Windows</span></span></a> is 3.2.2.<span style='mso-spacerun:yes'> 
! </span>KFW 3.2.2 includes Network Identity Manager 1.3.1 which integrates with
! the <a href="#_3.1.3._Network_Identity"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>AFS Provider</span></span></a>
! installed as part of OpenAFS for Windows.<span style='mso-spacerun:yes'> 
! </span></p>
  
  <p class=MsoNormal>When KFW is installed, the OpenAFS for Windows client will
  obtain Kerberos v5 tickets and use them as tokens without modification.&nbsp;
  The OpenAFS client requires that all of the AFS Servers with which it
  communicates support the use of Kerberos v5 tickets as tokens. If Kerberos v5
  based tokens are presented to an AFS server that does not support them, the
! server will be unable to communicate with the client when tokens are present. Kerberos
! v5 based tokens are supported by OpenAFS release 1.2.8 or later.<span
  style='mso-spacerun:yes'>  </span>IBM Transarc servers do not support Kerberos
  v5.</p>
  
! <h3><a name="_Toc193871634"></a><a name="_Toc193871389"></a><a
! name="_Toc191662070"></a><a name="_Toc152605040"></a><a name="_Toc115416106"></a><a
! name="_Toc139993090"></a><a name="_Toc126872171"></a><span style='mso-bookmark:
! _Toc193871634'><span style='mso-bookmark:_Toc193871389'><span style='mso-bookmark:
! _Toc191662070'><span style='mso-bookmark:_Toc152605040'><span style='mso-bookmark:
! _Toc115416106'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.1.
! Active Directory</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>Microsoft Windows Active Directory can be used as a Kerberos
  v5 KDC in conjunction with OpenAFS.<span style='mso-spacerun:yes'> 
***************
*** 1391,1426 ****
  tickets issued by Active Directory can be quite large when compared to tickets
  issued by a traditional KDC due to the incorporation of authorization data (the
  Microsoft PAC).&nbsp; If the issued tickets are larger than 344 bytes, the
! OpenAFS 1.2 servers will be unable to process them and will issue a RXKADBADTICKET
! error.<span style='mso-spacerun:yes'>  </span>OpenAFS 1.4 (and beyond) servers
! can support the largest tickets that Active Directory can issue.&nbsp; Second,
! the Kerberos v5 tickets issued by Windows 2003 Active Directory are encrypted
! with the DES-CBC-MD5 encryption type (enctype).&nbsp; OpenAFS 1.2 servers only
! support the DES-CBC-CRC enctype.<span style='mso-spacerun:yes'>  </span>As a
! result, OpenAFS 1.2 servers cannot process the resulting Kerberos v5
! tokens.<span style='mso-spacerun:yes'>  </span>Windows 2000 Active Directory
! issues tickets with the DES-CBC-CRC enctype.</p>
  
  <p class=MsoNormal>Microsoft has documented in <a
! href="http://support.microsoft.com/kb/832572/">Knowledge Base article 832572</a>
! a new NO_AUTH_REQUIRED flag that can be set on the account mapped to the AFS
! service principal.<span style='mso-spacerun:yes'>  </span>When this flag is
! set, the PAC authorization data will not be included in the ticket.<span
! style='mso-spacerun:yes'>  </span>Setting this flag is recommended for all
! accounts that are associated with non-Windows services and that do not
! understand the authorization data stored in the <st1:place w:st="on">PAC.</st1:place><span
  style='mso-spacerun:yes'>  </span>This flag cannot be used if AFS service
  tickets are obtained via cross-realm using an Active Directory user principal.</p>
  
  <p class=MsoNormal>Note that an Active Directory computer object cannot be used
  for the afs service principal.</p>
  
! <h3><a name="_Toc191662071"></a><a name="_Toc152605041"></a><a
! name="_Toc115416107"></a><a name="_Toc139993091"></a><a name="_Toc126872172"></a><span
! style='mso-bookmark:_Toc191662071'><span style='mso-bookmark:_Toc152605041'><span
! style='mso-bookmark:_Toc115416107'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.2.
! Using the krb524 service</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>Some organizations have AFS cell names and Kerberos realm
  names which differ by more then just lower and upper case and rely on a
--- 1636,1676 ----
  tickets issued by Active Directory can be quite large when compared to tickets
  issued by a traditional KDC due to the incorporation of authorization data (the
  Microsoft PAC).&nbsp; If the issued tickets are larger than 344 bytes, the
! OpenAFS 1.2 servers will be unable to process them and will issue a
! RXKADBADTICKET error.<span style='mso-spacerun:yes'>  </span>OpenAFS 1.4 (and
! beyond) servers can support the largest tickets that Active Directory can
! issue.&nbsp; Second, the Kerberos v5 tickets issued by Windows 2003 Active
! Directory are encrypted with the DES-CBC-MD5 encryption type (enctype).&nbsp;
! OpenAFS 1.2 servers only support the DES-CBC-CRC enctype.<span
! style='mso-spacerun:yes'>  </span>As a result, OpenAFS 1.2 servers cannot
! process the resulting Kerberos v5 tokens.<span style='mso-spacerun:yes'> 
! </span>Windows 2000 Active Directory issues tickets with the DES-CBC-CRC
! enctype.</p>
  
  <p class=MsoNormal>Microsoft has documented in <a
! href="http://support.microsoft.com/kb/832572/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Knowledge
! Base article 832572</span></span></a> a new NO_AUTH_REQUIRED flag that can be
! set on the account mapped to the AFS service principal.<span
! style='mso-spacerun:yes'>  </span>When this flag is set, the PAC authorization
! data will not be included in the ticket.<span style='mso-spacerun:yes'> 
! </span>Setting this flag is recommended for all accounts that are associated
! with non-Windows services and that do not understand the authorization data
! stored in the <st1:place w:st="on">PAC.</st1:place><span
  style='mso-spacerun:yes'>  </span>This flag cannot be used if AFS service
  tickets are obtained via cross-realm using an Active Directory user principal.</p>
  
  <p class=MsoNormal>Note that an Active Directory computer object cannot be used
  for the afs service principal.</p>
  
! <h3><a name="_Toc193871635"></a><a name="_Toc193871390"></a><a
! name="_Toc191662071"></a><a name="_Toc152605041"></a><a name="_Toc115416107"></a><a
! name="_Toc139993091"></a><a name="_Toc126872172"></a><span style='mso-bookmark:
! _Toc193871635'><span style='mso-bookmark:_Toc193871390'><span style='mso-bookmark:
! _Toc191662071'><span style='mso-bookmark:_Toc152605041'><span style='mso-bookmark:
! _Toc115416107'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.2.
! Using the krb524 service</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>Some organizations have AFS cell names and Kerberos realm
  names which differ by more then just lower and upper case and rely on a
***************
*** 1444,1476 ****
  is a win in all situations except when the cell name does not match the realm
  name and the principal names placed into the ACL’s are not the principal names
  from the Kerberos v5 ticket.&nbsp; To support this transition, OpenAFS for
! Windows 1.4 adds a new registry value, <i><a href="#_Value___:_Use524">Use524</a></i>,
! to force the use of krb524d.&nbsp; However, the availability of this option
! should only be used by individuals until such time as their organizations can
! provide a more permanent solution.</p>
  
  <p class=MsoNormal>Note that the OpenAFS 1.4.x servers permit the use of a
  secondary realm name that can be treated as equivalent to the cell name for
  authentication. </p>
  
! <h3><a name="_Toc191662072"></a><a name="_Toc152605042"></a><a
! name="_3.1.3._Network_Identity"></a><span style='mso-bookmark:_Toc191662072'><span
  style='mso-bookmark:_Toc152605042'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.3.
! Network Identity Manager P</span></span></span><span style='mso-bookmark:_Toc191662072'><span
! style='mso-fareast-font-family:"Times New Roman"'>rovider</span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>As of release 1.5.9, OpenAFS for Windows includes a Network Identity
! Manager Provider for obtaining AFS tokens.<span style='mso-spacerun:yes'> 
! </span>This plug-in is a contribution from <a
! href="https://www.secure-endpoints.com/">Secure Endpoints Inc.</a><span
! style='mso-spacerun:yes'>  </span>Network Identity Manager is a multiple
! identity credential management tool that ships with <a
! href="http://web.mit.edu/kerberos/">MIT Kerberos for Windows</a> version 3.0
! and above.<span style='mso-spacerun:yes'>  </span>The OpenAFS plug-in requires <a
! href="http://web.mit.edu/kerberos/">MIT Kerberos for Windows</a> version 3.1 or
! above.<span style='mso-spacerun:yes'>  </span>Version 3.2.2 is recommended for
! the best user experience.</p>
  
  <p class=MsoNormal align=center style='text-align:center'><span
  style='mso-no-proof:yes'><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
--- 1694,1736 ----
  is a win in all situations except when the cell name does not match the realm
  name and the principal names placed into the ACL’s are not the principal names
  from the Kerberos v5 ticket.&nbsp; To support this transition, OpenAFS for
! Windows 1.4 adds a new registry value, <i><a href="#_Value___:_Use524"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Use524</span></span></a></i>, to force the use of
! krb524d.&nbsp; However, the availability of this option should only be used by
! individuals until such time as their organizations can provide a more permanent
! solution.</p>
  
  <p class=MsoNormal>Note that the OpenAFS 1.4.x servers permit the use of a
  secondary realm name that can be treated as equivalent to the cell name for
  authentication. </p>
  
! <h3><a name="_Toc193871636"></a><a name="_Toc193871391"></a><a
! name="_Toc191662072"></a><a name="_Toc152605042"></a><a
! name="_3.1.3._Network_Identity"></a><span style='mso-bookmark:_Toc193871636'><span
! style='mso-bookmark:_Toc193871391'><span style='mso-bookmark:_Toc191662072'><span
  style='mso-bookmark:_Toc152605042'><span style='mso-fareast-font-family:"Times New Roman"'>3.1.3.
! Network Identity Manager P</span></span></span></span></span><span
! style='mso-bookmark:_Toc193871636'><span style='mso-bookmark:_Toc193871391'><span
! style='mso-bookmark:_Toc191662072'><span style='mso-fareast-font-family:"Times New Roman"'>rovider</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>As of release 1.5.9, OpenAFS for Windows includes a Network
! Identity Manager Provider for obtaining AFS tokens.<span
! style='mso-spacerun:yes'>  </span>This plug-in is a contribution from <a
! href="https://www.secure-endpoints.com/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Secure
! Endpoints Inc.</span></span></a><span style='mso-spacerun:yes'>  </span>Network
! Identity Manager is a multiple identity credential management tool that ships
! with <a href="http://web.mit.edu/kerberos/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MIT Kerberos
! for Windows</span></span></a> version 3.0 and above.<span
! style='mso-spacerun:yes'>  </span>The OpenAFS plug-in requires <a
! href="http://web.mit.edu/kerberos/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MIT Kerberos
! for Windows</span></span></a> version 3.1 or above.<span
! style='mso-spacerun:yes'>  </span>Version 3.2.2 is recommended for the best
! user experience.</p>
  
  <p class=MsoNormal align=center style='text-align:center'><span
  style='mso-no-proof:yes'><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
***************
*** 1503,1511 ****
  <p class=MsoNormal>The Network Identity Manager replaces the former KFW ticket
  manager, Leash”, and when combined with the OpenAFS Provider, it is intended to
  be used as a replacement for the AFS System Tray Tool (afscreds.exe).<span
! style='mso-spacerun:yes'>  </span>Unlike both Leash and the AFS System Tray
! Tool, Network Identity Manager with the OpenAFS Provider can easily manage AFS
! tokens for multiple cells from one or more Kerberos v5 identities.</p>
  
  <p class=MsoNormal align=center style='text-align:center'><span
  style='mso-no-proof:yes'><!--[if gte vml 1]><v:shape id="Picture_x0020_2"
--- 1763,1771 ----
  <p class=MsoNormal>The Network Identity Manager replaces the former KFW ticket
  manager, Leash”, and when combined with the OpenAFS Provider, it is intended to
  be used as a replacement for the AFS System Tray Tool (afscreds.exe).<span
! style='mso-spacerun:yes'>  </span>Unlike both Leash and the AFS System Tray Tool,
! Network Identity Manager with the OpenAFS Provider can easily manage AFS tokens
! for multiple cells from one or more Kerberos v5 identities.</p>
  
  <p class=MsoNormal align=center style='text-align:center'><span
  style='mso-no-proof:yes'><!--[if gte vml 1]><v:shape id="Picture_x0020_2"
***************
*** 1518,1526 ****
  <p class=MsoNormal>The AFS configuration panel for each Kerberos v5 identity is
  used to configure which cells credentials should be obtained for and how they
  should be obtained.<span style='mso-spacerun:yes'>  </span>If the cell to realm
! mapping cannot be automatically determined, it can be explicitly
! specified.<span style='mso-spacerun:yes'>  </span>If the cell does not support
! Kerberos v5 tickets as tokens, then a krb524 service can be configured.</p>
  
  <p class=MsoNormal align=center style='text-align:center'><span
  style='mso-no-proof:yes'><!--[if gte vml 1]><v:shape id="Picture_x0020_3"
--- 1778,1786 ----
  <p class=MsoNormal>The AFS configuration panel for each Kerberos v5 identity is
  used to configure which cells credentials should be obtained for and how they
  should be obtained.<span style='mso-spacerun:yes'>  </span>If the cell to realm
! mapping cannot be automatically determined, it can be explicitly specified.<span
! style='mso-spacerun:yes'>  </span>If the cell does not support Kerberos v5
! tickets as tokens, then a krb524 service can be configured.</p>
  
  <p class=MsoNormal align=center style='text-align:center'><span
  style='mso-no-proof:yes'><!--[if gte vml 1]><v:shape id="Picture_x0020_3"
***************
*** 1533,1551 ****
  <p class=MsoNormal>The OpenAFS Provider configuration panel can be used to
  check the status of the AFS Client Service and its version.<span
  style='mso-spacerun:yes'>  </span>An optional checkbox is provided that will
! prevent the AFS System Tray Tool from being started by Windows after login.<span
! style='mso-spacerun:yes'>   </span>A shortcut to the OpenAFS Control Panel is
! also provided.</p>
! 
! <h2><a name="_Toc191662073"></a><a name="_Toc152605043"></a><a
! name="_Toc115416108"></a><a name="_Toc139993092"></a><a name="_Toc126872173"></a><a
! name="_Toc115417044"></a><span style='mso-bookmark:_Toc191662073'><span
! style='mso-bookmark:_Toc152605043'><span style='mso-bookmark:_Toc115416108'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.2. Use of the Microsoft
! Loopback Adapter</span></span></span></span><span style='mso-bookmark:_Toc191662073'><span
! style='mso-bookmark:_Toc152605043'><span style='mso-fareast-font-family:"Times New Roman"'>
! by the AFS Client Service</span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>By itself the OpenAFS Client Service does not provide robust
  behavior in a plug-n-play network environment.&nbsp; Changes to the number of
--- 1793,1813 ----
  <p class=MsoNormal>The OpenAFS Provider configuration panel can be used to
  check the status of the AFS Client Service and its version.<span
  style='mso-spacerun:yes'>  </span>An optional checkbox is provided that will
! prevent the AFS System Tray Tool from being started by Windows after
! login.<span style='mso-spacerun:yes'>   </span>A shortcut to the OpenAFS
! Control Panel is also provided.</p>
! 
! <h2><a name="_Toc193871637"></a><a name="_Toc193871392"></a><a
! name="_Toc191662073"></a><a name="_Toc152605043"></a><a name="_Toc115416108"></a><a
! name="_Toc139993092"></a><a name="_Toc126872173"></a><a name="_Toc115417044"></a><span
! style='mso-bookmark:_Toc193871637'><span style='mso-bookmark:_Toc193871392'><span
! style='mso-bookmark:_Toc191662073'><span style='mso-bookmark:_Toc152605043'><span
! style='mso-bookmark:_Toc115416108'><span style='mso-fareast-font-family:"Times New Roman"'>3.2.
! Use of the Microsoft Loopback Adapter</span></span></span></span></span></span><span
! style='mso-bookmark:_Toc193871637'><span style='mso-bookmark:_Toc193871392'><span
! style='mso-bookmark:_Toc191662073'><span style='mso-bookmark:_Toc152605043'><span
! style='mso-fareast-font-family:"Times New Roman"'> by the AFS Client Service</span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>By itself the OpenAFS Client Service does not provide robust
  behavior in a plug-n-play network environment.&nbsp; Changes to the number of
***************
*** 1601,1612 ****
  the AFS Client Service is simply &quot;AFS&quot; and portable UNC paths of the
  form \\AFS\cellname\path can now be used on all machines.</p>
  
! <h2><a name="_Toc191662074"></a><a name="_Toc152605044"></a><a
! name="_Toc115416109"></a><a name="_Toc139993093"></a><a name="_Toc126872174"></a><a
! name="_Toc115417045"></a><span style='mso-bookmark:_Toc191662074'><span
! style='mso-bookmark:_Toc152605044'><span style='mso-bookmark:_Toc115416109'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.3. Using Freelance (Dynamic
! Root) Mode to Improve Mobility</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Traditionally, when the OpenAFS Client Service starts it
--- 1863,1875 ----
  the AFS Client Service is simply &quot;AFS&quot; and portable UNC paths of the
  form \\AFS\cellname\path can now be used on all machines.</p>
  
! <h2><a name="_Toc193871638"></a><a name="_Toc193871393"></a><a
! name="_Toc191662074"></a><a name="_Toc152605044"></a><a name="_Toc115416109"></a><a
! name="_Toc139993093"></a><a name="_Toc126872174"></a><a name="_Toc115417045"></a><span
! style='mso-bookmark:_Toc193871638'><span style='mso-bookmark:_Toc193871393'><span
! style='mso-bookmark:_Toc191662074'><span style='mso-bookmark:_Toc152605044'><span
! style='mso-bookmark:_Toc115416109'><span style='mso-fareast-font-family:"Times New Roman"'>3.3.
! Using Freelance (Dynamic Root) Mode to Improve Mobility</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Traditionally, when the OpenAFS Client Service starts it
***************
*** 1637,1643 ****
  preserved in the registry at key:</p>
  
  <p class=preformattedtext style='margin-left:35.45pt'><a
! href="#_Regkey:_[HKLMSOFTWAREOpenAFSClie">HKLM\SOFTWARE\OpenAFS\Client\Freelance</a></p>
  
  <p class=MsoNormal>Additional mount points may be manually created using the
  &quot;fs mkmount&quot; command.&nbsp; Mount points may be removed using the
--- 1900,1910 ----
  preserved in the registry at key:</p>
  
  <p class=preformattedtext style='margin-left:35.45pt'><a
! href="#_Regkey:_[HKLMSOFTWAREOpenAFSClie"><span style='mso-bookmark:_Toc193871639'><span
! style='mso-bookmark:_Toc193871394'><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>HKLM\SOFTWARE\OpenAFS\Client\Freelance</span></span></span></span><span
! style='mso-bookmark:_Toc193871394'></span><span style='mso-bookmark:_Toc193871639'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871394"></a><a name="_Toc193871639"></a><![endif]></p>
  
  <p class=MsoNormal>Additional mount points may be manually created using the
  &quot;fs mkmount&quot; command.&nbsp; Mount points may be removed using the
***************
*** 1661,1668 ****
  <p class=preformattedtext style='margin-left:35.45pt'>&gt;symlink make
  \\afs\link \\afs\athena.mit.edu\user\j\a\jaltman</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;symlink list
! \\afs\link</p>
  
  <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '\\afs\link' is a
  symlink to 'athena.mit.edu\user\j\a\jaltman'</p>
--- 1928,1934 ----
  <p class=preformattedtext style='margin-left:35.45pt'>&gt;symlink make
  \\afs\link \\afs\athena.mit.edu\user\j\a\jaltman</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;symlink list \\afs\link</p>
  
  <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '\\afs\link' is a
  symlink to 'athena.mit.edu\user\j\a\jaltman'</p>
***************
*** 1672,1700 ****
  <p class=MsoNormal>The symlinks are stored in the registry at:</p>
  
  <p class=preformattedtext style='margin-left:35.45pt'><a
! href="#_Regkey:_[HKLMSOFTWAREOpenAFSClie_1">HKLM\SOFTWARE\OpenAFS\Client\Freelance\Symlinks</a>&nbsp;</p>
! 
! <h2><a name="_Toc191662075"></a><a name="_Toc152605045"></a><a
! name="_Toc115416110"></a><a name="_Toc139993094"></a><a name="_Toc126872175"></a><a
! name="_Toc115417046"></a><span style='mso-bookmark:_Toc191662075'><span
! style='mso-bookmark:_Toc152605045'><span style='mso-bookmark:_Toc115416110'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.4. Locating AFS Volume
! Database Servers</span></span></span></span><span style='mso-bookmark:_Toc191662075'><span
! style='mso-bookmark:_Toc152605045'><span style='mso-fareast-font-family:"Times New Roman"'>
! via DNS</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'>
! <o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS for Windows client will use DNS AFSDB records to
  discover the location of AFS Volume Database servers when entries for the cell
! are not present in the client's CellServDB file
! (\%PROGRAMFILES%\OpenAFS\Client\CellServDB).</p>
  
! <h2><a name="_Toc191662076"></a><a name="_Toc152605046"></a><a
! name="_Toc115416111"></a><a name="_Toc139993095"></a><a name="_Toc126872176"></a><a
! name="_Toc115417047"></a><span style='mso-bookmark:_Toc191662076'><span
! style='mso-bookmark:_Toc152605046'><span style='mso-bookmark:_Toc115416111'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.5. Obtaining AFS Tokens as
! a Integrated Part of Windows Logon</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS for Windows installs a WinLogon Network Provider to
--- 1938,1972 ----
  <p class=MsoNormal>The symlinks are stored in the registry at:</p>
  
  <p class=preformattedtext style='margin-left:35.45pt'><a
! href="#_Regkey:_[HKLMSOFTWAREOpenAFSClie_1"><span style='mso-bookmark:_Toc193871640'><span
! style='mso-bookmark:_Toc193871395'><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>HKLM\SOFTWARE\OpenAFS\Client\Freelance\Symlinks</span></span></span></span><span
! style='mso-bookmark:_Toc193871395'></span><span style='mso-bookmark:_Toc193871640'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871395"></a><a name="_Toc193871640"></a><![endif]>&nbsp;</p>
! 
! <h2><a name="_Toc193871641"></a><a name="_Toc193871396"></a><a
! name="_Toc191662075"></a><a name="_Toc152605045"></a><a name="_Toc115416110"></a><a
! name="_Toc139993094"></a><a name="_Toc126872175"></a><a name="_Toc115417046"></a><span
! style='mso-bookmark:_Toc193871641'><span style='mso-bookmark:_Toc193871396'><span
! style='mso-bookmark:_Toc191662075'><span style='mso-bookmark:_Toc152605045'><span
! style='mso-bookmark:_Toc115416110'><span style='mso-fareast-font-family:"Times New Roman"'>3.4.
! Locating AFS Volume Database Servers</span></span></span></span></span></span><span
! style='mso-bookmark:_Toc193871641'><span style='mso-bookmark:_Toc193871396'><span
! style='mso-bookmark:_Toc191662075'><span style='mso-bookmark:_Toc152605045'><span
! style='mso-fareast-font-family:"Times New Roman"'> via DNS</span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS for Windows client will use DNS AFSDB records to
  discover the location of AFS Volume Database servers when entries for the cell
! are not present in the client's CellServDB file (\%PROGRAMFILES%\OpenAFS\Client\CellServDB).</p>
  
! <h2><a name="_Toc193871642"></a><a name="_Toc193871397"></a><a
! name="_Toc191662076"></a><a name="_Toc152605046"></a><a name="_Toc115416111"></a><a
! name="_Toc139993095"></a><a name="_Toc126872176"></a><a name="_Toc115417047"></a><span
! style='mso-bookmark:_Toc193871642'><span style='mso-bookmark:_Toc193871397'><span
! style='mso-bookmark:_Toc191662076'><span style='mso-bookmark:_Toc152605046'><span
! style='mso-bookmark:_Toc115416111'><span style='mso-fareast-font-family:"Times New Roman"'>3.5.
! Obtaining AFS Tokens as a Integrated Part of Windows Logon</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS for Windows installs a WinLogon Network Provider to
***************
*** 1704,1710 ****
  if the Windows username is &quot;jaltman&quot; and the default cell is
  &quot;athena.mit.edu&quot;, then Integrated Logon can be successfully used if
  the windows password matches the password assigned to the Kerberos principal
! &quot;<a href="mailto:jaltman@ATHENA.MIT.EDU">jaltman@ATHENA.MIT.EDU</a>&quot;.&nbsp;
  The realm “ATHENA.MIT.EDU” is obtained by performing a domain name to realm
  mapping on the hostname of one of the cell's Volume Database servers.</p>
  
--- 1976,1983 ----
  if the Windows username is &quot;jaltman&quot; and the default cell is
  &quot;athena.mit.edu&quot;, then Integrated Logon can be successfully used if
  the windows password matches the password assigned to the Kerberos principal
! &quot;<a href="mailto:jaltman@ATHENA.MIT.EDU"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>jaltman@ATHENA.MIT.EDU</span></span></a>&quot;.&nbsp;
  The realm “ATHENA.MIT.EDU” is obtained by performing a domain name to realm
  mapping on the hostname of one of the cell's Volume Database servers.</p>
  
***************
*** 1715,1723 ****
  
  <p class=MsoNormal>When KFW is configured, Integrated Logon will use it to
  obtain tokens. Use of KFW for Integrated Logon can be disabled via the <a
! href="#_Value:_EnableKFW">EnableKFW</a> registry value.<span
! style='mso-spacerun:yes'>  </span>Use of the krb524 service can be configured
! via the <a href="#_Value:_Use524">Use524</a> registry value.</p>
  
  <p class=MsoNormal>Integrated Logon will not transfer Kerberos v5 tickets into
  the user’s logon session credential cache. KFW 3.1 and above provides that
--- 1988,1999 ----
  
  <p class=MsoNormal>When KFW is configured, Integrated Logon will use it to
  obtain tokens. Use of KFW for Integrated Logon can be disabled via the <a
! href="#_Value:_EnableKFW"><span class=Heading1Char><span style='font-size:14.0pt;
! text-decoration:none;text-underline:none'>EnableKFW</span></span></a> registry
! value.<span style='mso-spacerun:yes'>  </span>Use of the krb524 service can be
! configured via the <a href="#_Value:_Use524"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Use524</span></span></a>
! registry value.</p>
  
  <p class=MsoNormal>Integrated Logon will not transfer Kerberos v5 tickets into
  the user’s logon session credential cache. KFW 3.1 and above provides that
***************
*** 1728,1751 ****
  Kerberos KDC is inaccessible at logon time.</p>
  
  <p class=MsoNormal>Integrated Logon supports the ability to obtain tokens for
! multiple cells.&nbsp; For further information on how to configure this feature
! read about the <a href="#_Value:_TheseCells">TheseCells</a> value.</p>
  
  <p class=MsoToc2 style='margin-left:0in;tab-stops:right dotted 431.5pt'>Integrated
  Logon can be configured based upon the domain of the Windows account used to
  login to the machine.<span style='mso-spacerun:yes'>  </span>See <span
! class=MsoHyperlink><span style='mso-no-proof:yes'><a
! href="relnotes.htm#_Toc187554205">A.2.1 Domain specific configuration keys for
! the Network Provider</a>.</span></span><span style='mso-fareast-font-family:
! "Times New Roman";mso-no-proof:yes'><o:p></o:p></span></p>
! 
! <h2><a name="_Toc191662077"></a><a name="_Toc152605047"></a><a
! name="_Toc115416112"></a><a name="_Toc139993096"></a><a name="_Toc126872177"></a><a
! name="_Toc115417048"></a><span style='mso-bookmark:_Toc191662077'><span
! style='mso-bookmark:_Toc152605047'><span style='mso-bookmark:_Toc115416112'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.6. AFS System Tray Command
! Line Options</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal><span style='color:red'>The AFS System Tray Tool
  (afscreds.exe) has been deprecated in favor of Network Identity Manager.<span
--- 2004,2031 ----
  Kerberos KDC is inaccessible at logon time.</p>
  
  <p class=MsoNormal>Integrated Logon supports the ability to obtain tokens for
! multiple cells.&nbsp; For further information on how to configure this feature read
! about the <a href="#_Value:_TheseCells"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>TheseCells</span></span></a>
! value.</p>
  
  <p class=MsoToc2 style='margin-left:0in;tab-stops:right dotted 431.5pt'>Integrated
  Logon can be configured based upon the domain of the Windows account used to
  login to the machine.<span style='mso-spacerun:yes'>  </span>See <span
! class=Heading1Char><span style='font-size:14.0pt;mso-no-proof:yes'><a
! href="relnotes.htm#_Toc187554205"><span style='color:#365F91;mso-themecolor:
! accent1;mso-themeshade:191;text-decoration:none;text-underline:none'>A.2.1
! Domain specific configuration keys for the Network Provider</span></a>.</span></span><span
! style='mso-fareast-font-family:"Times New Roman";mso-no-proof:yes'><o:p></o:p></span></p>
! 
! <h2><a name="_Toc193871643"></a><a name="_Toc193871398"></a><a
! name="_Toc191662077"></a><a name="_Toc152605047"></a><a name="_Toc115416112"></a><a
! name="_Toc139993096"></a><a name="_Toc126872177"></a><a name="_Toc115417048"></a><span
! style='mso-bookmark:_Toc193871643'><span style='mso-bookmark:_Toc193871398'><span
! style='mso-bookmark:_Toc191662077'><span style='mso-bookmark:_Toc152605047'><span
! style='mso-bookmark:_Toc115416112'><span style='mso-fareast-font-family:"Times New Roman"'>3.6.
! AFS System Tray Command Line Options</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal><span style='color:red'>The AFS System Tray Tool
  (afscreds.exe) has been deprecated in favor of Network Identity Manager.<span
***************
*** 1796,1811 ****
  installers to use “-A -N -M -Q” as startup options.&nbsp; Currently, there is
  no user interface to change this selection after install time although these
  options may be altered via the registry on either per machine or per user
! basis.&nbsp; See <a href="#_Value___:_AfscredsShortcutParams">AfscredsShortcutParams</a>
! in <a href="#_Appendix_A:_Registry_Values">Appendix A</a>.</p>
! 
! <h2><a name="_Toc191662078"></a><a name="_Toc152605048"></a><a
! name="_Toc115416113"></a><a name="_Toc139993097"></a><a name="_Toc126872178"></a><a
! name="_Toc115417049"></a><span style='mso-bookmark:_Toc191662078'><span
! style='mso-bookmark:_Toc152605048'><span style='mso-bookmark:_Toc115416113'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.7. The “AFS Client Admins”
! Authorization Group</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS for Windows client supports a local Windows
  authorization group named &quot;AFS Client Admins&quot;.&nbsp; This group is
--- 2076,2095 ----
  installers to use “-A -N -M -Q” as startup options.&nbsp; Currently, there is
  no user interface to change this selection after install time although these
  options may be altered via the registry on either per machine or per user
! basis.&nbsp; See <a href="#_Value___:_AfscredsShortcutParams"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>AfscredsShortcutParams</span></span></a> in <a
! href="#_Appendix_A:_Registry_Values"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Appendix A</span></span></a>.</p>
! 
! <h2><a name="_Toc193871644"></a><a name="_Toc193871399"></a><a
! name="_Toc191662078"></a><a name="_Toc152605048"></a><a name="_Toc115416113"></a><a
! name="_Toc139993097"></a><a name="_Toc126872178"></a><a name="_Toc115417049"></a><span
! style='mso-bookmark:_Toc193871644'><span style='mso-bookmark:_Toc193871399'><span
! style='mso-bookmark:_Toc191662078'><span style='mso-bookmark:_Toc152605048'><span
! style='mso-bookmark:_Toc115416113'><span style='mso-fareast-font-family:"Times New Roman"'>3.7.
! The “AFS Client Admins” Authorization Group</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS for Windows client supports a local Windows
  authorization group named &quot;AFS Client Admins&quot;.&nbsp; This group is
***************
*** 1865,1873 ****
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>minidump</p>
  
! <p class=MsoNormal>The creation or removal of mount points and symlinks in the Freelance
! “root.afs” volume are also restricted to members of the “AFS Client Admins”
! group.</p>
  
  <p class=MsoNormal>The initial membership of the &quot;AFS Client Admins&quot;
  group when created by the installer is equivalent to the local
--- 2149,2157 ----
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>minidump</p>
  
! <p class=MsoNormal>The creation or removal of mount points and symlinks in the
! Freelance “root.afs” volume are also restricted to members of the “AFS Client
! Admins” group.</p>
  
  <p class=MsoNormal>The initial membership of the &quot;AFS Client Admins&quot;
  group when created by the installer is equivalent to the local
***************
*** 1875,1894 ****
  &quot;Administrators&quot; group after the creation of the &quot;AFS Client
  Admin&quot; group, that user will not be an AFS Client Administrator.&nbsp;
  Only users that are members of the &quot;AFS Client Admins&quot; group are AFS
! Client Administrators.&nbsp; The local &quot;SYSTEM&quot; account is an implicit
! member of the &quot;AFS Client Admins&quot; group.</p>
  
  <p class=MsoNormal>Setting the default sysname for a machine should be done via
! the <a href="#_Value_:_SysName">registry</a> and not via &quot;fs
! sysname&quot;.</p>
! 
! <h2><a name="_Toc191662079"></a><a name="_Toc152605049"></a><a
! name="_Toc115416114"></a><a name="_Toc139993098"></a><a name="_Toc126872179"></a><a
! name="_Toc115417050"></a><span style='mso-bookmark:_Toc191662079'><span
! style='mso-bookmark:_Toc152605049'><span style='mso-bookmark:_Toc115416114'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.8. OpenAFS support for UNC
! paths</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'>
! <o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS client supports UNC paths everywhere.&nbsp; UNC
  paths provide a canonical name for resources stored within AFS.&nbsp; UNC paths
--- 2159,2180 ----
  &quot;Administrators&quot; group after the creation of the &quot;AFS Client
  Admin&quot; group, that user will not be an AFS Client Administrator.&nbsp;
  Only users that are members of the &quot;AFS Client Admins&quot; group are AFS
! Client Administrators.&nbsp; The local &quot;SYSTEM&quot; account is an
! implicit member of the &quot;AFS Client Admins&quot; group.</p>
  
  <p class=MsoNormal>Setting the default sysname for a machine should be done via
! the <a href="#_Value_:_SysName"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>registry</span></span></a>
! and not via &quot;fs sysname&quot;.</p>
! 
! <h2><a name="_Toc193871645"></a><a name="_Toc193871400"></a><a
! name="_Toc191662079"></a><a name="_Toc152605049"></a><a name="_Toc115416114"></a><a
! name="_Toc139993098"></a><a name="_Toc126872179"></a><a name="_Toc115417050"></a><span
! style='mso-bookmark:_Toc193871645'><span style='mso-bookmark:_Toc193871400'><span
! style='mso-bookmark:_Toc191662079'><span style='mso-bookmark:_Toc152605049'><span
! style='mso-bookmark:_Toc115416114'><span style='mso-fareast-font-family:"Times New Roman"'>3.8.
! OpenAFS support for UNC paths</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS client supports UNC paths everywhere.&nbsp; UNC
  paths provide a canonical name for resources stored within AFS.&nbsp; UNC paths
***************
*** 1902,1921 ****
  as the current directory.&nbsp; JPSoftware added special recognition for
  OpenAFS to its command shells, 4NT 7.0 and Take Command 7.0.&nbsp; AFS paths
  can be entered in UNIX notation (e.g., <a
! href="file:///\\afs\openafs.org\software">/afs/openafs.org/software</a>), space
! utilization reports the output of the volume status for the specified path, and
! many AFS specific functions and variables have been added to the command
! language.</p>
! 
! <p class=MsoNormal>JPSoftware's web site is <span class=MsoHyperlink><a
! href="http://www.jpsoft.com/">http://www.jpsoft.com</a></span>.</p>
! 
! <h2><a name="_Toc191662080"></a><a name="_Toc152605050"></a><a
! name="_Toc115416115"></a><a name="_Toc139993099"></a><a name="_Toc126872180"></a><a
! name="_Toc115417051"></a><span style='mso-bookmark:_Toc191662080'><span
! style='mso-bookmark:_Toc152605050'><span style='mso-bookmark:_Toc115416115'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.9. aklog.exe</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client ships with its own version of aklog.exe
  which should be used in preference to those obtained by other sources.&nbsp;
--- 2188,2212 ----
  as the current directory.&nbsp; JPSoftware added special recognition for
  OpenAFS to its command shells, 4NT 7.0 and Take Command 7.0.&nbsp; AFS paths
  can be entered in UNIX notation (e.g., <a
! href="file:///\\afs\openafs.org\software"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>/afs/openafs.org/software</span></span></a>),
! space utilization reports the output of the volume status for the specified
! path, and many AFS specific functions and variables have been added to the
! command language.</p>
! 
! <p class=MsoNormal>JPSoftware's web site is <span class=Heading1Char><span
! style='font-size:14.0pt'><a href="http://www.jpsoft.com/"><span
! style='color:#365F91;mso-themecolor:accent1;mso-themeshade:191;text-decoration:
! none;text-underline:none'>http://www.jpsoft.com</span></a></span></span>.</p>
! 
! <h2><a name="_Toc193871646"></a><a name="_Toc193871401"></a><a
! name="_Toc191662080"></a><a name="_Toc152605050"></a><a name="_Toc115416115"></a><a
! name="_Toc139993099"></a><a name="_Toc126872180"></a><a name="_Toc115417051"></a><span
! style='mso-bookmark:_Toc193871646'><span style='mso-bookmark:_Toc193871401'><span
! style='mso-bookmark:_Toc191662080'><span style='mso-bookmark:_Toc152605050'><span
! style='mso-bookmark:_Toc115416115'><span style='mso-fareast-font-family:"Times New Roman"'>3.9.
! aklog.exe</span></span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client ships with its own version of aklog.exe
  which should be used in preference to those obtained by other sources.&nbsp;
***************
*** 1954,1966 ****
  <p class=preformattedtext>&nbsp;&nbsp; -m = use krb524d to convert Kerberos V
  tickets to Kerberos IV</p>
  
! <h2><a name="_Toc191662081"></a><a name="_Toc152605051"></a><a
! name="_Toc115416116"></a><a name="_Toc139993100"></a><a name="_Toc126872181"></a><a
! name="_Toc115417052"></a><span style='mso-bookmark:_Toc191662081'><span
! style='mso-bookmark:_Toc152605051'><span style='mso-bookmark:_Toc115416116'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.10. OpenAFS Servers on
! Windows are Unsupported</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The AFS Server functionality provided as part of the OpenAFS
  install package might work but should be considered highly experimental.&nbsp;
--- 2245,2258 ----
  <p class=preformattedtext>&nbsp;&nbsp; -m = use krb524d to convert Kerberos V
  tickets to Kerberos IV</p>
  
! <h2><a name="_Toc193871647"></a><a name="_Toc193871402"></a><a
! name="_Toc191662081"></a><a name="_Toc152605051"></a><a name="_Toc115416116"></a><a
! name="_Toc139993100"></a><a name="_Toc126872181"></a><a name="_Toc115417052"></a><span
! style='mso-bookmark:_Toc193871647'><span style='mso-bookmark:_Toc193871402'><span
! style='mso-bookmark:_Toc191662081'><span style='mso-bookmark:_Toc152605051'><span
! style='mso-bookmark:_Toc115416116'><span style='mso-fareast-font-family:"Times New Roman"'>3.10.
! OpenAFS Servers on Windows are Unsupported</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The AFS Server functionality provided as part of the OpenAFS
  install package might work but should be considered highly experimental.&nbsp;
***************
*** 1968,1978 ****
  lost should not be stored in an OpenAFS Server on Windows.</p>
  
  <p class=MsoNormal>Known issues include lack of support for power management
! and dynamic network configuration.<span style='mso-spacerun:yes'> 
! </span>Salvager is also known to crash.</p>
  
! <h3><a name="_Toc191662082"><span style='mso-fareast-font-family:"Times New Roman"'>3.10.1.
! OpenAFS Server Installation</span></a><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>When the OpenAFS Server is installed, the TransarcAFSServer
--- 2260,2272 ----
  lost should not be stored in an OpenAFS Server on Windows.</p>
  
  <p class=MsoNormal>Known issues include lack of support for power management
! and dynamic network configuration.<span style='mso-spacerun:yes'>  </span>Salvager
! is also known to crash.</p>
  
! <h3><a name="_Toc193871648"></a><a name="_Toc193871403"></a><a
! name="_Toc191662082"><span style='mso-bookmark:_Toc193871403'><span
! style='mso-bookmark:_Toc193871648'><span style='mso-fareast-font-family:"Times New Roman"'>3.10.1.
! OpenAFS Server Installation</span></span></span></a><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>When the OpenAFS Server is installed, the TransarcAFSServer
***************
*** 1982,1998 ****
  former AFS Server Configuration wizard makes assumptions that no longer hold
  true and it has therefore been disabled.<span style='mso-spacerun:yes'> 
  </span>However, following the instructions for installing the AFS Servers on
! UNIX it is possible to properly configure the AFS Servers on Microsoft Windows.<span
! style='mso-spacerun:yes'>  </span>The AFS Server binaries, configuration files,
! and log files are installed under %Program Files%\OpenAFS\Server.<span
! style='mso-spacerun:yes'>   </span><span style='color:red'><a
! href="http://www.openafs.org/no-more-des.html"><span style='color:red'>kaserver
! has been deprecated and its use is strongly discouraged.</span></a></span><span
! style='mso-spacerun:yes'>  </span>Instead, Active Directory or some other
! Kerberos v5 KDC should be used in its place.</p>
! 
! <h3><a name="_Toc191662083"><span style='mso-fareast-font-family:"Times New Roman"'>3.10.2.
! Using the AFS Client Service when the Server is installed</span></a><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>A few notes on the usage of the AFS Client Service if it is
--- 2276,2296 ----
  former AFS Server Configuration wizard makes assumptions that no longer hold
  true and it has therefore been disabled.<span style='mso-spacerun:yes'> 
  </span>However, following the instructions for installing the AFS Servers on
! UNIX it is possible to properly configure the AFS Servers on Microsoft
! Windows.<span style='mso-spacerun:yes'>  </span>The AFS Server binaries,
! configuration files, and log files are installed under %Program
! Files%\OpenAFS\Server.<span style='mso-spacerun:yes'>   </span><span
! style='color:red'><a href="http://www.openafs.org/no-more-des.html"><span
! class=Heading1Char><span style='font-size:14.0pt;color:red;text-decoration:
! none;text-underline:none'>kaserver has been deprecated and its use is strongly
! discouraged.</span></span></a></span><span style='mso-spacerun:yes'> 
! </span>Instead, Active Directory or some other Kerberos v5 KDC should be used
! in its place.</p>
! 
! <h3><a name="_Toc193871649"></a><a name="_Toc193871404"></a><a
! name="_Toc191662083"><span style='mso-bookmark:_Toc193871404'><span
! style='mso-bookmark:_Toc193871649'><span style='mso-fareast-font-family:"Times New Roman"'>3.10.2.
! Using the AFS Client Service when the Server is installed</span></span></span></a><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <p class=MsoNormal>A few notes on the usage of the AFS Client Service if it is
***************
*** 2010,2018 ****
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>The
  AFS Server and related tools only support the built in kaserver (Kerberos
! IV).&nbsp; If kaserver is being used, <a href="http://web.mit.edu/kerberos/">MIT
! Kerberos for Windows</a> should not be installed or must be disabled via the <a
! href="#_Toc126872361">EnableKFW</a> registry value.</p>
  
  <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
--- 2308,2319 ----
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>The
  AFS Server and related tools only support the built in kaserver (Kerberos
! IV).&nbsp; If kaserver is being used, <a href="http://web.mit.edu/kerberos/"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>MIT Kerberos for Windows</span></span></a> should not be
! installed or must be disabled via the <a href="#_Toc126872361"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>EnableKFW</span></span></a> registry value.</p>
  
  <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
***************
*** 2023,2038 ****
  not be shutdown or suspended unexpectedly.<span style='mso-spacerun:yes'>  
  </span>An inadvertent shutdown will corrupt volume data.</p>
  
! <h2><a name="_Toc191662084"></a><a name="_Toc152605052"></a><a
! name="_Toc115416117"></a><a name="_Toc139993101"></a><a name="_Toc126872182"></a><a
! name="_Toc115417053"></a><span style='mso-bookmark:_Toc191662084'><span
! style='mso-bookmark:_Toc152605052'><span style='mso-bookmark:_Toc115416117'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.11. OpenAFS Debugging
! Symbol files</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>The OpenAFS for Windows installers include Debugging Symbol
! files which should be installed if you are experiencing problems and need to send
  crash reports.&nbsp; This is true for both the release and the debug versions
  of the installers.&nbsp; The difference between the release and debug versions
  are:</p>
--- 2324,2340 ----
  not be shutdown or suspended unexpectedly.<span style='mso-spacerun:yes'>  
  </span>An inadvertent shutdown will corrupt volume data.</p>
  
! <h2><a name="_Toc193871650"></a><a name="_Toc193871405"></a><a
! name="_Toc191662084"></a><a name="_Toc152605052"></a><a name="_Toc115416117"></a><a
! name="_Toc139993101"></a><a name="_Toc126872182"></a><a name="_Toc115417053"></a><span
! style='mso-bookmark:_Toc193871650'><span style='mso-bookmark:_Toc193871405'><span
! style='mso-bookmark:_Toc191662084'><span style='mso-bookmark:_Toc152605052'><span
! style='mso-bookmark:_Toc115416117'><span style='mso-fareast-font-family:"Times New Roman"'>3.11.
! OpenAFS Debugging Symbol files</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>The OpenAFS for Windows installers include Debugging Symbol files
! which should be installed if you are experiencing problems and need to send
  crash reports.&nbsp; This is true for both the release and the debug versions
  of the installers.&nbsp; The difference between the release and debug versions
  are:</p>
***************
*** 2060,2086 ****
  or not additional debug statements were compiled into the binaries (release:
  no, debug: yes)</p>
  
! <h2><a name="_Toc191662085"></a><a name="_Toc152605053"></a><a
! name="_Toc115416118"></a><a name="_Toc139993102"></a><a name="_Toc126872183"></a><a
! name="_Toc115417054"></a><span style='mso-bookmark:_Toc191662085'><span
! style='mso-bookmark:_Toc152605053'><span style='mso-bookmark:_Toc115416118'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.12. </span></span></span></span><span
  style='mso-bookmark:_Toc191662085'><span style='mso-bookmark:_Toc152605053'><span
! style='mso-fareast-font-family:"Times New Roman"'>Large File (64-bit) Support</span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>As of release 1.5.3, OpenAFS for Windows supports files
  larger than 2GB.&nbsp; The maximum file size is now 16777216 terabytes when the
  AFS File Server supports large files.&nbsp;&nbsp; If the AFS File Server does
  not support 64-bit file sizes, then the maximum file size remains 2GB.</p>
  
! <h2><a name="_Toc191662086"></a><a name="_Toc152605054"></a><a
! name="_Toc115416119"></a><a name="_Toc139993103"></a><a name="_Toc126872184"></a><a
! name="_Toc115417055"></a><span style='mso-bookmark:_Toc191662086'><span
! style='mso-bookmark:_Toc152605054'><span style='mso-bookmark:_Toc115416119'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.13. Encrypted AFS Network
! Communication</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS for Windows installer by default activates a
  weak form of encrypted data transfer between the AFS client and the AFS
--- 2362,2392 ----
  or not additional debug statements were compiled into the binaries (release:
  no, debug: yes)</p>
  
! <h2><a name="_Toc193871651"></a><a name="_Toc193871406"></a><a
! name="_Toc191662085"></a><a name="_Toc152605053"></a><a name="_Toc115416118"></a><a
! name="_Toc139993102"></a><a name="_Toc126872183"></a><a name="_Toc115417054"></a><span
! style='mso-bookmark:_Toc193871651'><span style='mso-bookmark:_Toc193871406'><span
  style='mso-bookmark:_Toc191662085'><span style='mso-bookmark:_Toc152605053'><span
! style='mso-bookmark:_Toc115416118'><span style='mso-fareast-font-family:"Times New Roman"'>3.12.
! </span></span></span></span></span></span><span style='mso-bookmark:_Toc193871651'><span
! style='mso-bookmark:_Toc193871406'><span style='mso-bookmark:_Toc191662085'><span
! style='mso-bookmark:_Toc152605053'><span style='mso-fareast-font-family:"Times New Roman"'>Large
! File (64-bit) Support</span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>As of release 1.5.3, OpenAFS for Windows supports files
  larger than 2GB.&nbsp; The maximum file size is now 16777216 terabytes when the
  AFS File Server supports large files.&nbsp;&nbsp; If the AFS File Server does
  not support 64-bit file sizes, then the maximum file size remains 2GB.</p>
  
! <h2><a name="_Toc193871652"></a><a name="_Toc193871407"></a><a
! name="_Toc191662086"></a><a name="_Toc152605054"></a><a name="_Toc115416119"></a><a
! name="_Toc139993103"></a><a name="_Toc126872184"></a><a name="_Toc115417055"></a><span
! style='mso-bookmark:_Toc193871652'><span style='mso-bookmark:_Toc193871407'><span
! style='mso-bookmark:_Toc191662086'><span style='mso-bookmark:_Toc152605054'><span
! style='mso-bookmark:_Toc115416119'><span style='mso-fareast-font-family:"Times New Roman"'>3.13.
! Encrypted AFS Network Communication</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS for Windows installer by default activates a
  weak form of encrypted data transfer between the AFS client and the AFS
***************
*** 2089,2101 ****
  command.&nbsp; Transitions between “crypt” and “non-crypt” modes are logged to
  the Windows Application Event Log. </p>
  
! <h2><a name="_Toc191662087"></a><a name="_Toc152605055"></a><a
! name="_Toc115416120"></a><a name="_Toc139993104"></a><a name="_Toc126872185"></a><a
! name="_Toc115417056"></a><span style='mso-bookmark:_Toc191662087'><span
! style='mso-bookmark:_Toc152605055'><span style='mso-bookmark:_Toc115416120'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.14. Authenticated Access to
! the OpenAFS Client Service</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS authenticates SMB connections using either NTLM or
  GSS SPNEGO (NTLM).&nbsp; In previous versions of OpenAFS, the SMB connections
--- 2395,2408 ----
  command.&nbsp; Transitions between “crypt” and “non-crypt” modes are logged to
  the Windows Application Event Log. </p>
  
! <h2><a name="_Toc193871653"></a><a name="_Toc193871408"></a><a
! name="_Toc191662087"></a><a name="_Toc152605055"></a><a name="_Toc115416120"></a><a
! name="_Toc139993104"></a><a name="_Toc126872185"></a><a name="_Toc115417056"></a><span
! style='mso-bookmark:_Toc193871653'><span style='mso-bookmark:_Toc193871408'><span
! style='mso-bookmark:_Toc191662087'><span style='mso-bookmark:_Toc152605055'><span
! style='mso-bookmark:_Toc115416120'><span style='mso-fareast-font-family:"Times New Roman"'>3.14.
! Authenticated Access to the OpenAFS Client Service</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS authenticates SMB connections using either NTLM or
  GSS SPNEGO (NTLM).&nbsp; In previous versions of OpenAFS, the SMB connections
***************
*** 2105,2132 ****
  
  <p class=MsoNormal>When GSS SPNEGO attempts a Kerberos v5 authentication, the
  Windows SMB client will attempt to retrieve service tickets for
! &quot;cifs/afs@REALM&quot; (if the loopback adapter is in use) or &quot;cifs/machine-afs@REALM&quot;
! (if the loopback adapter is not being used).&nbsp; It is extremely important
! that this service principal not exist in the KDC database as the Kerberos
! authentication must fail allowing automatic fallback to NTLM.&nbsp; When NTLM
! is used a special local authentication mode will be used that does not require
! access to the user's password.&nbsp; Instead, Windows will internally recognize
! the request as coming from a local logon session.</p>
! 
! <h2><a name="_Toc191662088"></a><a name="_Toc152605056"></a><a
! name="_Toc115416121"></a><a name="_Toc139993105"></a><a name="_Toc126872186"></a><a
! name="_Toc115417057"></a><span style='mso-bookmark:_Toc191662088'><span
! style='mso-bookmark:_Toc152605056'><span style='mso-bookmark:_Toc115416121'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.15. No More INI Files</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Previous AFS clients for Windows stored configuration data
  in Windows .INI files. &nbsp;&nbsp;The OpenAFS client does not use Windows .INI
  files for the storage of configuration data.&nbsp;&nbsp; All settings are
! stored in the registry (see <a href="#_Appendix_A:_Registry_Values">Appendix A</a>).&nbsp;
! The CellServDB file is now stored in either the %ALLUSERSPROFILE%\Application
! Data\OpenAFS\Client directory or the %PROGRAMFILES%\OpenAFS\Client
! directory.&nbsp;&nbsp; The <i><a href="#_Value___:_CellServDBDir">CellServDBDir</a></i>
  registry value or the AFSCONF environment variable can be used to specify an
  alternative location.</p>
  
--- 2412,2445 ----
  
  <p class=MsoNormal>When GSS SPNEGO attempts a Kerberos v5 authentication, the
  Windows SMB client will attempt to retrieve service tickets for
! &quot;cifs/afs@REALM&quot; (if the loopback adapter is in use) or
! &quot;cifs/machine-afs@REALM&quot; (if the loopback adapter is not being
! used).&nbsp; It is extremely important that this service principal not exist in
! the KDC database as the Kerberos authentication must fail allowing automatic
! fallback to NTLM.&nbsp; When NTLM is used a special local authentication mode
! will be used that does not require access to the user's password.&nbsp;
! Instead, Windows will internally recognize the request as coming from a local
! logon session.</p>
! 
! <h2><a name="_Toc193871654"></a><a name="_Toc193871409"></a><a
! name="_Toc191662088"></a><a name="_Toc152605056"></a><a name="_Toc115416121"></a><a
! name="_Toc139993105"></a><a name="_Toc126872186"></a><a name="_Toc115417057"></a><span
! style='mso-bookmark:_Toc193871654'><span style='mso-bookmark:_Toc193871409'><span
! style='mso-bookmark:_Toc191662088'><span style='mso-bookmark:_Toc152605056'><span
! style='mso-bookmark:_Toc115416121'><span style='mso-fareast-font-family:"Times New Roman"'>3.15.
! No More INI Files</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Previous AFS clients for Windows stored configuration data
  in Windows .INI files. &nbsp;&nbsp;The OpenAFS client does not use Windows .INI
  files for the storage of configuration data.&nbsp;&nbsp; All settings are
! stored in the registry (see <a href="#_Appendix_A:_Registry_Values"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Appendix A</span></span></a>).&nbsp; The CellServDB file
! is now stored in either the %ALLUSERSPROFILE%\Application Data\OpenAFS\Client
! directory or the %PROGRAMFILES%\OpenAFS\Client directory.&nbsp;&nbsp; The <i><a
! href="#_Value___:_CellServDBDir"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>CellServDBDir</span></span></a></i>
  registry value or the AFSCONF environment variable can be used to specify an
  alternative location.</p>
  
***************
*** 2136,2148 ****
  “afs_freelance.ini” file to the Windows registry.&nbsp;&nbsp; OpenAFS will not
  process the contents of the “afsddbmt.ini”.</p>
  
! <h2><a name="_Toc191662089"></a><a name="_Toc152605057"></a><a
! name="_Toc115416122"></a><a name="_Toc139993106"></a><a name="_Toc126872187"></a><a
! name="_Toc115417058"></a><span style='mso-bookmark:_Toc191662089'><span
! style='mso-bookmark:_Toc152605057'><span style='mso-bookmark:_Toc115416122'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.16. Microsoft Windows
! Internet Connection Firewall</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client is compatible with the Internet
  Connection Firewall that debuted with Windows XP SP2 and Windows 2003
--- 2449,2462 ----
  “afs_freelance.ini” file to the Windows registry.&nbsp;&nbsp; OpenAFS will not
  process the contents of the “afsddbmt.ini”.</p>
  
! <h2><a name="_Toc193871655"></a><a name="_Toc193871410"></a><a
! name="_Toc191662089"></a><a name="_Toc152605057"></a><a name="_Toc115416122"></a><a
! name="_Toc139993106"></a><a name="_Toc126872187"></a><a name="_Toc115417058"></a><span
! style='mso-bookmark:_Toc193871655'><span style='mso-bookmark:_Toc193871410'><span
! style='mso-bookmark:_Toc191662089'><span style='mso-bookmark:_Toc152605057'><span
! style='mso-bookmark:_Toc115416122'><span style='mso-fareast-font-family:"Times New Roman"'>3.16.
! Microsoft Windows Internet Connection Firewall</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client is compatible with the Internet
  Connection Firewall that debuted with Windows XP SP2 and Windows 2003
***************
*** 2152,2186 ****
  to allow SMB authentication to be performed across the Microsoft Loopback
  Adapter.</p>
  
! <h2><a name="_Toc191662090"></a><a name="_Toc152605058"></a><a
! name="_Toc115416123"></a><a name="_Toc139993107"></a><a name="_Toc126872188"></a><a
! name="_Toc115417059"></a><span style='mso-bookmark:_Toc191662090'><span
! style='mso-bookmark:_Toc152605058'><span style='mso-bookmark:_Toc115416123'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.17. Browsing AFS from the
! Explorer Shell and Office</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client Service implements the CIFS Remote Admin
  Protocol which allows Explorer to browse server and share information. This
  significantly enhances the interoperability of AFS volumes within the Explorer
  Shell and Microsoft Office applications.</p>
  
! <h2><a name="_Toc191662091"></a><a name="_Toc152605059"></a><a
! name="_Toc115416124"></a><a name="_Toc139993108"></a><a name="_Toc126872189"></a><a
! name="_Toc115417060"></a><span style='mso-bookmark:_Toc191662091'><span
! style='mso-bookmark:_Toc152605059'><span style='mso-bookmark:_Toc115416124'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.18. </span></span><st1:place
! w:st="on"><st1:PlaceName w:st="on"><span style='mso-fareast-font-family:"Times New Roman"'>Byte</span></st1:PlaceName><span
   style='mso-fareast-font-family:"Times New Roman"'> <st1:PlaceType w:st="on">Range</st1:PlaceType></span></st1:place><span
! style='mso-fareast-font-family:"Times New Roman"'> Locking</span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Many applications on Windows (e.g. Microsoft Office) require
  the use of byte range locks applied to a file either to protect against
  simultaneous file access or as a signaling mechanism.&nbsp;&nbsp; OpenAFS for
  Windows release 1.5 (or greater) implements byte range locking within the
! CIFS-AFS gateway server.&nbsp;&nbsp; This support for byte range locking obtains
! AFS’ advisory file server locks to simulate Microsoft Windows mandatory
  locks.&nbsp;&nbsp; When an application opens a file, a lock will be obtained
  from AFS indicating that the file is in use.&nbsp; If the lock is a write lock,
  access to the file will be restricted to other applications running on the same
--- 2466,2503 ----
  to allow SMB authentication to be performed across the Microsoft Loopback
  Adapter.</p>
  
! <h2><a name="_Toc193871656"></a><a name="_Toc193871411"></a><a
! name="_Toc191662090"></a><a name="_Toc152605058"></a><a name="_Toc115416123"></a><a
! name="_Toc139993107"></a><a name="_Toc126872188"></a><a name="_Toc115417059"></a><span
! style='mso-bookmark:_Toc193871656'><span style='mso-bookmark:_Toc193871411'><span
! style='mso-bookmark:_Toc191662090'><span style='mso-bookmark:_Toc152605058'><span
! style='mso-bookmark:_Toc115416123'><span style='mso-fareast-font-family:"Times New Roman"'>3.17.
! Browsing AFS from the Explorer Shell and Office</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client Service implements the CIFS Remote Admin
  Protocol which allows Explorer to browse server and share information. This
  significantly enhances the interoperability of AFS volumes within the Explorer
  Shell and Microsoft Office applications.</p>
  
! <h2><a name="_Toc193871657"></a><a name="_Toc193871412"></a><a
! name="_Toc191662091"></a><a name="_Toc152605059"></a><a name="_Toc115416124"></a><a
! name="_Toc139993108"></a><a name="_Toc126872189"></a><a name="_Toc115417060"></a><span
! style='mso-bookmark:_Toc193871657'><span style='mso-bookmark:_Toc193871412'><span
! style='mso-bookmark:_Toc191662091'><span style='mso-bookmark:_Toc152605059'><span
! style='mso-bookmark:_Toc115416124'><span style='mso-fareast-font-family:"Times New Roman"'>3.18.
! </span></span><st1:place w:st="on"><st1:PlaceName w:st="on"><span
!   style='mso-fareast-font-family:"Times New Roman"'>Byte</span></st1:PlaceName><span
   style='mso-fareast-font-family:"Times New Roman"'> <st1:PlaceType w:st="on">Range</st1:PlaceType></span></st1:place><span
! style='mso-fareast-font-family:"Times New Roman"'> Locking</span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>Many applications on Windows (e.g. Microsoft Office) require
  the use of byte range locks applied to a file either to protect against
  simultaneous file access or as a signaling mechanism.&nbsp;&nbsp; OpenAFS for
  Windows release 1.5 (or greater) implements byte range locking within the
! CIFS-AFS gateway server.&nbsp;&nbsp; This support for byte range locking
! obtains AFS’ advisory file server locks to simulate Microsoft Windows mandatory
  locks.&nbsp;&nbsp; When an application opens a file, a lock will be obtained
  from AFS indicating that the file is in use.&nbsp; If the lock is a write lock,
  access to the file will be restricted to other applications running on the same
***************
*** 2266,2280 ****
  
  <p class=MsoNormal>If you wish to disable the acquisition of locks from the
  file server, this can be performed using the <a
! href="#_Value:_EnableServerLocks">EnableServerLocks</a> registry value.</p>
! 
! <h2><a name="_Toc191662092"></a><a name="_Toc152605060"></a><a
! name="_Toc115416125"></a><a name="_Toc139993109"></a><a name="_Toc126872190"></a><a
! name="_Toc115417061"></a><span style='mso-bookmark:_Toc191662092'><span
! style='mso-bookmark:_Toc152605060'><span style='mso-bookmark:_Toc115416125'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.19. Automatic Discarding of
! AFS Tokens at Logoff</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client will automatically forget a user's tokens
  upon Logoff unless the user's profile was loaded from an AFS volume.&nbsp; In
--- 2583,2600 ----
  
  <p class=MsoNormal>If you wish to disable the acquisition of locks from the
  file server, this can be performed using the <a
! href="#_Value:_EnableServerLocks"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>EnableServerLocks</span></span></a>
! registry value.</p>
! 
! <h2><a name="_Toc193871658"></a><a name="_Toc193871413"></a><a
! name="_Toc191662092"></a><a name="_Toc152605060"></a><a name="_Toc115416125"></a><a
! name="_Toc139993109"></a><a name="_Toc126872190"></a><a name="_Toc115417061"></a><span
! style='mso-bookmark:_Toc193871658'><span style='mso-bookmark:_Toc193871413'><span
! style='mso-bookmark:_Toc191662092'><span style='mso-bookmark:_Toc152605060'><span
! style='mso-bookmark:_Toc115416125'><span style='mso-fareast-font-family:"Times New Roman"'>3.19.
! Automatic Discarding of AFS Tokens at Logoff</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client will automatically forget a user's tokens
  upon Logoff unless the user's profile was loaded from an AFS volume.&nbsp; In
***************
*** 2285,2300 ****
  accounts and NT4 accounts.</p>
  
  <p class=MsoNormal>If there is a need to disable this functionality, the <a
! href="#_Value_:_LogoffPreserveTokens">LogoffPreserveTokens</a> registry value
! can be used. (see <a href="#_Appendix_A:_Registry_Values">Appendix A</a>.)</p>
! 
! <h2><a name="_Toc191662093"></a><a name="_Toc152605061"></a><a
! name="_Toc115416126"></a><a name="_Toc139993110"></a><a name="_Toc126872191"></a><a
! name="_Toc115417062"></a><span style='mso-bookmark:_Toc191662093'><span
! style='mso-bookmark:_Toc152605061'><span style='mso-bookmark:_Toc115416126'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.20. Windows Terminal Server
! installations</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>When installing the NSIS (.exe) installer under Terminal
  Server, you must execute it from within the Add/Remove Programs Control
--- 2605,2624 ----
  accounts and NT4 accounts.</p>
  
  <p class=MsoNormal>If there is a need to disable this functionality, the <a
! href="#_Value_:_LogoffPreserveTokens"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>LogoffPreserveTokens</span></span></a>
! registry value can be used. (see <a href="#_Appendix_A:_Registry_Values"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Appendix A</span></span></a>.)</p>
! 
! <h2><a name="_Toc193871659"></a><a name="_Toc193871414"></a><a
! name="_Toc191662093"></a><a name="_Toc152605061"></a><a name="_Toc115416126"></a><a
! name="_Toc139993110"></a><a name="_Toc126872191"></a><a name="_Toc115417062"></a><span
! style='mso-bookmark:_Toc193871659'><span style='mso-bookmark:_Toc193871414'><span
! style='mso-bookmark:_Toc191662093'><span style='mso-bookmark:_Toc152605061'><span
! style='mso-bookmark:_Toc115416126'><span style='mso-fareast-font-family:"Times New Roman"'>3.20.
! Windows Terminal Server installations</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>When installing the NSIS (.exe) installer under Terminal
  Server, you must execute it from within the Add/Remove Programs Control
***************
*** 2302,2312 ****
  The AFS Server should not be installed on a machine with Terminal Server
  installed.</p>
  
! <h2><a name="_Toc191662094"></a><a name="_Toc152605062"></a><a
! name="_Toc115416127"></a><a name="_Toc139993111"></a><a name="_Toc126872192"></a><a
! name="_Toc115417063"></a><span style='mso-bookmark:_Toc191662094'><span
! style='mso-bookmark:_Toc152605062'><span style='mso-bookmark:_Toc115416127'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.21. Hidden Dot Files</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>AFS is a UNIX native file system.&nbsp; The OpenAFS client
--- 2626,2638 ----
  The AFS Server should not be installed on a machine with Terminal Server
  installed.</p>
  
! <h2><a name="_Toc193871660"></a><a name="_Toc193871415"></a><a
! name="_Toc191662094"></a><a name="_Toc152605062"></a><a name="_Toc115416127"></a><a
! name="_Toc139993111"></a><a name="_Toc126872192"></a><a name="_Toc115417063"></a><span
! style='mso-bookmark:_Toc193871660'><span style='mso-bookmark:_Toc193871415'><span
! style='mso-bookmark:_Toc191662094'><span style='mso-bookmark:_Toc152605062'><span
! style='mso-bookmark:_Toc115416127'><span style='mso-fareast-font-family:"Times New Roman"'>3.21.
! Hidden Dot Files</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>AFS is a UNIX native file system.&nbsp; The OpenAFS client
***************
*** 2314,2326 ****
  and directory names beginning with a &quot;.&quot; are automatically given the
  Hidden attribute so they will not normally be displayed.<span
  style='mso-spacerun:yes'>  </span>This behavior can be altered via the <a
! href="#_Value:_HideDotFiles">HideDotFiles</a> registry value.</p>
! 
! <h2><a name="_Toc191662095"></a><a name="_Toc152605063"></a><a
! name="_Toc115416128"></a><a name="_Toc139993112"></a><a name="_Toc126872193"></a><a
! name="_Toc115417064"></a><span style='mso-bookmark:_Toc191662095'><span
! style='mso-bookmark:_Toc152605063'><span style='mso-bookmark:_Toc115416128'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.22. Status Cache Limits</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The Status Cache (AFS Configuration Control Panel: Advanced
--- 2640,2656 ----
  and directory names beginning with a &quot;.&quot; are automatically given the
  Hidden attribute so they will not normally be displayed.<span
  style='mso-spacerun:yes'>  </span>This behavior can be altered via the <a
! href="#_Value:_HideDotFiles"><span class=Heading1Char><span style='font-size:
! 14.0pt;text-decoration:none;text-underline:none'>HideDotFiles</span></span></a>
! registry value.</p>
! 
! <h2><a name="_Toc193871661"></a><a name="_Toc193871416"></a><a
! name="_Toc191662095"></a><a name="_Toc152605063"></a><a name="_Toc115416128"></a><a
! name="_Toc139993112"></a><a name="_Toc126872193"></a><a name="_Toc115417064"></a><span
! style='mso-bookmark:_Toc193871661'><span style='mso-bookmark:_Toc193871416'><span
! style='mso-bookmark:_Toc191662095'><span style='mso-bookmark:_Toc152605063'><span
! style='mso-bookmark:_Toc115416128'><span style='mso-fareast-font-family:"Times New Roman"'>3.22.
! Status Cache Limits</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The Status Cache (AFS Configuration Control Panel: Advanced
***************
*** 2329,2351 ****
  system.&nbsp; When the maximum number of entries are allocated, entries will
  begin to be reused according to a least recently used (LRU) algorithm.&nbsp; If
  the number of files or directories being accessed repeatedly by your
! applications is greater then the maximum number of entries, your host will
! begin to experience thrashing of the Status Cache and all requests will result
! in network operations.</p>
  
  <p class=MsoNormal>If you are experiencing poor performance try increasing the
  maximum number of Status Cache entries.&nbsp; Each entry requires approximately
  1.2K.&nbsp; The default number of Status Cache entries is 10,000.<span
  style='mso-spacerun:yes'>  </span>This can be adjusted using the <a
! href="#_Value:_Stats">Stats</a> registry value.</p>
! 
! <h2><a name="_Toc191662096"></a><a name="_Toc152605064"></a><a
! name="_Toc115416129"></a><a name="_Toc139993113"></a><a name="_Toc126872194"></a><a
! name="_Toc115417065"></a><span style='mso-bookmark:_Toc191662096'><span
! style='mso-bookmark:_Toc152605064'><span style='mso-bookmark:_Toc115416129'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.23. NETBIOS over TCP/IP
! must be enabled</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>&quot;Netbios over TCP/IP&quot; must be active on the
  machine in order for communication with the AFS Client Service to
--- 2659,2684 ----
  system.&nbsp; When the maximum number of entries are allocated, entries will
  begin to be reused according to a least recently used (LRU) algorithm.&nbsp; If
  the number of files or directories being accessed repeatedly by your
! applications is greater then the maximum number of entries, your host will begin
! to experience thrashing of the Status Cache and all requests will result in
! network operations.</p>
  
  <p class=MsoNormal>If you are experiencing poor performance try increasing the
  maximum number of Status Cache entries.&nbsp; Each entry requires approximately
  1.2K.&nbsp; The default number of Status Cache entries is 10,000.<span
  style='mso-spacerun:yes'>  </span>This can be adjusted using the <a
! href="#_Value:_Stats"><span class=Heading1Char><span style='font-size:14.0pt;
! text-decoration:none;text-underline:none'>Stats</span></span></a> registry
! value.</p>
! 
! <h2><a name="_Toc193871662"></a><a name="_Toc193871417"></a><a
! name="_Toc191662096"></a><a name="_Toc152605064"></a><a name="_Toc115416129"></a><a
! name="_Toc139993113"></a><a name="_Toc126872194"></a><a name="_Toc115417065"></a><span
! style='mso-bookmark:_Toc193871662'><span style='mso-bookmark:_Toc193871417'><span
! style='mso-bookmark:_Toc191662096'><span style='mso-bookmark:_Toc152605064'><span
! style='mso-bookmark:_Toc115416129'><span style='mso-fareast-font-family:"Times New Roman"'>3.23.
! NETBIOS over TCP/IP must be enabled</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>&quot;Netbios over TCP/IP&quot; must be active on the
  machine in order for communication with the AFS Client Service to
***************
*** 2354,2366 ****
  style='mso-spacerun:yes'>  </span>If you are using the Microsoft Loopback
  Adapter, configure the “Netbios over TCP/IP” setting for the adapter.</p>
  
! <h2><a name="_Toc191662097"></a><a name="_Toc152605065"></a><a
! name="_Toc115416130"></a><a name="_Toc139993114"></a><a name="_Toc126872195"></a><a
! name="_Toc115417066"></a><span style='mso-bookmark:_Toc191662097'><span
! style='mso-bookmark:_Toc152605065'><span style='mso-bookmark:_Toc115416130'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.24. OpenAFS binaries are
! digitally signed</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client Service and related binaries distributed
  by OpenAFS.org are digitally signed by &quot;Secure Endpoints Inc.&quot;.&nbsp;
--- 2687,2700 ----
  style='mso-spacerun:yes'>  </span>If you are using the Microsoft Loopback
  Adapter, configure the “Netbios over TCP/IP” setting for the adapter.</p>
  
! <h2><a name="_Toc193871663"></a><a name="_Toc193871418"></a><a
! name="_Toc191662097"></a><a name="_Toc152605065"></a><a name="_Toc115416130"></a><a
! name="_Toc139993114"></a><a name="_Toc126872195"></a><a name="_Toc115417066"></a><span
! style='mso-bookmark:_Toc193871663'><span style='mso-bookmark:_Toc193871418'><span
! style='mso-bookmark:_Toc191662097'><span style='mso-bookmark:_Toc152605065'><span
! style='mso-bookmark:_Toc115416130'><span style='mso-fareast-font-family:"Times New Roman"'>3.24.
! OpenAFS binaries are digitally signed</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client Service and related binaries distributed
  by OpenAFS.org are digitally signed by &quot;Secure Endpoints Inc.&quot;.&nbsp;
***************
*** 2372,2404 ****
  wasted tracking down problems caused by the mixture of files from different
  releases.&nbsp; </p>
  
! <p class=MsoNormal><a href="#_Appendix_A:_Registry_Values">Appendix A</a>
! documents the &quot;<a href="#_Value___:_VerifyServiceSignature">VerifyServiceSignature</a>&quot;
  registry value which can be used to disable the signature check.&nbsp; The file
  version check cannot be disabled.</p>
  
! <h2><a name="_Toc191662098"></a><a name="_Toc152605066"></a><a
! name="_Toc115416131"></a><a name="_Toc139993115"></a><a name="_Toc126872196"></a><a
! name="_Toc115417067"></a><span style='mso-bookmark:_Toc191662098'><span
! style='mso-bookmark:_Toc152605066'><span style='mso-bookmark:_Toc115416131'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.25. Maximum Size of the
! AFSCache File</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The maximum cache size on 32-bit Windows is approximately
  1.3GB.&nbsp; This is the largest contiguous block of memory in the 2GB process
  address space which can be used for constructing a memory mapped file.&nbsp;
! Due to fragmentation of the process space caused by the loading of libraries
! required by the digital signature verification code, any attempt to specify a
! cache size greater then 700MB will result in the automatic disabling of the
! signature check.<span style='mso-spacerun:yes'>  </span>Significantly larger
! cache sizes can be used on 64-bit Windows.</p>
! 
! <h2><a name="_Toc191662099"></a><a name="_Toc152605067"></a><a
! name="_Toc115416132"></a><a name="_Toc139993116"></a><a name="_Toc126872197"></a><a
! name="_Toc115417068"></a><span style='mso-bookmark:_Toc191662099'><span
! style='mso-bookmark:_Toc152605067'><span style='mso-bookmark:_Toc115416132'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.26. Filename Character Sets</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS for Windows implements an SMB server which is used
--- 2706,2747 ----
  wasted tracking down problems caused by the mixture of files from different
  releases.&nbsp; </p>
  
! <p class=MsoNormal><a href="#_Appendix_A:_Registry_Values"><span
! style='mso-bookmark:_Toc193871664'><span style='mso-bookmark:_Toc193871419'><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Appendix A</span></span></span></span><span
! style='mso-bookmark:_Toc193871419'></span><span style='mso-bookmark:_Toc193871664'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871419"></a><a name="_Toc193871664"></a><![endif]> documents the
! &quot;<a href="#_Value___:_VerifyServiceSignature"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>VerifyServiceSignature</span></span></a>&quot;
  registry value which can be used to disable the signature check.&nbsp; The file
  version check cannot be disabled.</p>
  
! <h2><a name="_Toc193871665"></a><a name="_Toc193871420"></a><a
! name="_Toc191662098"></a><a name="_Toc152605066"></a><a name="_Toc115416131"></a><a
! name="_Toc139993115"></a><a name="_Toc126872196"></a><a name="_Toc115417067"></a><span
! style='mso-bookmark:_Toc193871665'><span style='mso-bookmark:_Toc193871420'><span
! style='mso-bookmark:_Toc191662098'><span style='mso-bookmark:_Toc152605066'><span
! style='mso-bookmark:_Toc115416131'><span style='mso-fareast-font-family:"Times New Roman"'>3.25.
! Maximum Size of the AFSCache File</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The maximum cache size on 32-bit Windows is approximately
  1.3GB.&nbsp; This is the largest contiguous block of memory in the 2GB process
  address space which can be used for constructing a memory mapped file.&nbsp;
! Due to fragmentation of the process space caused by the loading of libraries required
! by the digital signature verification code, any attempt to specify a cache size
! greater then 700MB will result in the automatic disabling of the signature
! check.<span style='mso-spacerun:yes'>  </span>Significantly larger cache sizes
! can be used on 64-bit Windows.</p>
! 
! <h2><a name="_Toc193871666"></a><a name="_Toc193871421"></a><a
! name="_Toc191662099"></a><a name="_Toc152605067"></a><a name="_Toc115416132"></a><a
! name="_Toc139993116"></a><a name="_Toc126872197"></a><a name="_Toc115417068"></a><span
! style='mso-bookmark:_Toc193871666'><span style='mso-bookmark:_Toc193871421'><span
! style='mso-bookmark:_Toc191662099'><span style='mso-bookmark:_Toc152605067'><span
! style='mso-bookmark:_Toc115416132'><span style='mso-fareast-font-family:"Times New Roman"'>3.26.
! Filename Character Sets</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS for Windows implements an SMB server which is used
***************
*** 2493,2512 ****
  <p class=preformattedtext>&nbsp;</p>
  
  <p class=MsoNormal>The OpenAFS Client provides an optional registry value, <i><a
! href="#_Value___:_StoreAnsiFilenames">StoreAnsiFilenames</a></i>, that can be
! set to instruct OpenAFS to store filenames using the ANSI Code Page instead of
! the OEM Code Page.&nbsp; The ANSI Code Page is a compatible superset of
! Latin-1.&nbsp; This setting is not the default setting because making this
  change would prevent OpenAFS for Windows from being able to access filenames
  containing the above characters which were created without this setting.</p>
  
! <h2><a name="_Toc191662100"></a><a name="_Toc152605068"></a><a
! name="_Toc115416133"></a><a name="_Toc139993117"></a><a name="_Toc126872198"></a><a
! name="_Toc115417069"></a><span style='mso-bookmark:_Toc191662100'><span
! style='mso-bookmark:_Toc152605068'><span style='mso-bookmark:_Toc115416133'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.27. Known Character Set
! Issues with Roaming Profiles</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>There is a known issue with storing Windows Roaming Profiles
  when the profile contains either directories or files with names which cannot
--- 2836,2857 ----
  <p class=preformattedtext>&nbsp;</p>
  
  <p class=MsoNormal>The OpenAFS Client provides an optional registry value, <i><a
! href="#_Value___:_StoreAnsiFilenames"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>StoreAnsiFilenames</span></span></a></i>,
! that can be set to instruct OpenAFS to store filenames using the ANSI Code Page
! instead of the OEM Code Page.&nbsp; The ANSI Code Page is a compatible superset
! of Latin-1.&nbsp; This setting is not the default setting because making this
  change would prevent OpenAFS for Windows from being able to access filenames
  containing the above characters which were created without this setting.</p>
  
! <h2><a name="_Toc193871667"></a><a name="_Toc193871422"></a><a
! name="_Toc191662100"></a><a name="_Toc152605068"></a><a name="_Toc115416133"></a><a
! name="_Toc139993117"></a><a name="_Toc126872198"></a><a name="_Toc115417069"></a><span
! style='mso-bookmark:_Toc193871667'><span style='mso-bookmark:_Toc193871422'><span
! style='mso-bookmark:_Toc191662100'><span style='mso-bookmark:_Toc152605068'><span
! style='mso-bookmark:_Toc115416133'><span style='mso-fareast-font-family:"Times New Roman"'>3.27.
! Known Character Set Issues with Roaming Profiles</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>There is a known issue with storing Windows Roaming Profiles
  when the profile contains either directories or files with names which cannot
***************
*** 2517,2527 ****
  (assigned by group policy) which rename all files to use only the supported
  characters for the locale.</p>
  
! <h2><a name="_Toc191662101"></a><a name="_Toc152605069"></a><a
! name="_Toc115416134"></a><a name="_Toc139993118"></a><a name="_Toc126872199"></a><a
! name="_Toc115417070"></a><span style='mso-bookmark:_Toc191662101'><span
! style='mso-bookmark:_Toc152605069'><span style='mso-bookmark:_Toc115416134'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.28. The AFSCache File</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The AFS Cache file is stored by default at %TEMP%\AFSCache
--- 2862,2874 ----
  (assigned by group policy) which rename all files to use only the supported
  characters for the locale.</p>
  
! <h2><a name="_Toc193871668"></a><a name="_Toc193871423"></a><a
! name="_Toc191662101"></a><a name="_Toc152605069"></a><a name="_Toc115416134"></a><a
! name="_Toc139993118"></a><a name="_Toc126872199"></a><a name="_Toc115417070"></a><span
! style='mso-bookmark:_Toc193871668'><span style='mso-bookmark:_Toc193871423'><span
! style='mso-bookmark:_Toc191662101'><span style='mso-bookmark:_Toc152605069'><span
! style='mso-bookmark:_Toc115416134'><span style='mso-fareast-font-family:"Times New Roman"'>3.28.
! The AFSCache File</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The AFS Cache file is stored by default at %TEMP%\AFSCache
***************
*** 2538,2549 ****
  gains can be achieved by defragmenting the AFSCache file with Sysinternal's
  Contig utility while the AFS Client Service is stopped.</p>
  
! <h2><a name="_Toc191662102"></a><a name="_Toc152605070"></a><a
! name="_Toc115416135"></a><a name="_Toc139993119"></a><a name="_Toc126872200"></a><a
! name="_Toc115417071"></a><span style='mso-bookmark:_Toc191662102'><span
! style='mso-bookmark:_Toc152605070'><span style='mso-bookmark:_Toc115416135'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.29. Restricting OpenAFS
! Client Service Start and Stop</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>A new command line tool, afsdacl.exe, can be used to
--- 2885,2897 ----
  gains can be achieved by defragmenting the AFSCache file with Sysinternal's
  Contig utility while the AFS Client Service is stopped.</p>
  
! <h2><a name="_Toc193871669"></a><a name="_Toc193871424"></a><a
! name="_Toc191662102"></a><a name="_Toc152605070"></a><a name="_Toc115416135"></a><a
! name="_Toc139993119"></a><a name="_Toc126872200"></a><a name="_Toc115417071"></a><span
! style='mso-bookmark:_Toc193871669'><span style='mso-bookmark:_Toc193871424'><span
! style='mso-bookmark:_Toc191662102'><span style='mso-bookmark:_Toc152605070'><span
! style='mso-bookmark:_Toc115416135'><span style='mso-fareast-font-family:"Times New Roman"'>3.29.
! Restricting OpenAFS Client Service Start and Stop</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>A new command line tool, afsdacl.exe, can be used to
***************
*** 2569,2601 ****
  <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  &nbsp;&nbsp;-show&nbsp; : Show current DACL (SDSF)</p>
  
! <h2><a name="_Toc191662103"></a><a name="_Toc152605071"></a><a
! name="_Toc115416136"></a><a name="_Toc139993120"></a><a name="_Toc126872201"></a><a
! name="_Toc115417072"></a><span style='mso-bookmark:_Toc191662103'><span
! style='mso-bookmark:_Toc152605071'><span style='mso-bookmark:_Toc115416136'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.30. The @sys Name List</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The default @sys name list in the OpenAFS Client is set to
  &quot;x86_win32 i386_w2k i386_nt40&quot; for 32-bit x86 systems.&nbsp; The
  default is &quot;amd64_win64&quot; for amd 64-bit versions of Windows.</p>
  
! <h2><a name="_Toc191662104"></a><a name="_Toc152605072"></a><a
! name="_Toc115416137"></a><a name="_Toc139993121"></a><a name="_Toc126872202"></a><a
! name="_Toc115417073"></a><span style='mso-bookmark:_Toc191662104'><span
! style='mso-bookmark:_Toc152605072'><span style='mso-bookmark:_Toc115416137'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.31. Symlinks to AFS UNC
! paths</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>In OpenAFS, symlinks to AFS UNC paths, \\AFS[\all]\..., are
! treated the same as symlinks to /afs/...&nbsp; However, please use /afs/... as
! the Windows UNC form will not work on UNIX client.</p>
  
! <h2><a name="_Toc191662105"></a><a name="_Toc152605073"></a><a
! name="_Toc115416138"></a><a name="_Toc139993122"></a><a name="_Toc126872203"></a><a
! name="_Toc115417074"></a><span style='mso-bookmark:_Toc191662105'><span
! style='mso-bookmark:_Toc152605073'><span style='mso-bookmark:_Toc115416138'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.32. Cache Manager Debugging</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client implements the Cache Manager Debugging
--- 2917,2955 ----
  <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  &nbsp;&nbsp;-show&nbsp; : Show current DACL (SDSF)</p>
  
! <h2><a name="_Toc193871670"></a><a name="_Toc193871425"></a><a
! name="_Toc191662103"></a><a name="_Toc152605071"></a><a name="_Toc115416136"></a><a
! name="_Toc139993120"></a><a name="_Toc126872201"></a><a name="_Toc115417072"></a><span
! style='mso-bookmark:_Toc193871670'><span style='mso-bookmark:_Toc193871425'><span
! style='mso-bookmark:_Toc191662103'><span style='mso-bookmark:_Toc152605071'><span
! style='mso-bookmark:_Toc115416136'><span style='mso-fareast-font-family:"Times New Roman"'>3.30.
! The @sys Name List</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The default @sys name list in the OpenAFS Client is set to
  &quot;x86_win32 i386_w2k i386_nt40&quot; for 32-bit x86 systems.&nbsp; The
  default is &quot;amd64_win64&quot; for amd 64-bit versions of Windows.</p>
  
! <h2><a name="_Toc193871671"></a><a name="_Toc193871426"></a><a
! name="_Toc191662104"></a><a name="_Toc152605072"></a><a name="_Toc115416137"></a><a
! name="_Toc139993121"></a><a name="_Toc126872202"></a><a name="_Toc115417073"></a><span
! style='mso-bookmark:_Toc193871671'><span style='mso-bookmark:_Toc193871426'><span
! style='mso-bookmark:_Toc191662104'><span style='mso-bookmark:_Toc152605072'><span
! style='mso-bookmark:_Toc115416137'><span style='mso-fareast-font-family:"Times New Roman"'>3.31.
! Symlinks to AFS UNC paths</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>In OpenAFS, symlinks to AFS UNC paths, \\AFS[\all]\..., are
! treated the same as symlinks to /afs/...&nbsp; However, please use /afs/... as the
! Windows UNC form will not work on UNIX client.</p>
  
! <h2><a name="_Toc193871672"></a><a name="_Toc193871427"></a><a
! name="_Toc191662105"></a><a name="_Toc152605073"></a><a name="_Toc115416138"></a><a
! name="_Toc139993122"></a><a name="_Toc126872203"></a><a name="_Toc115417074"></a><span
! style='mso-bookmark:_Toc193871672'><span style='mso-bookmark:_Toc193871427'><span
! style='mso-bookmark:_Toc191662105'><span style='mso-bookmark:_Toc152605073'><span
! style='mso-bookmark:_Toc115416138'><span style='mso-fareast-font-family:"Times New Roman"'>3.32.
! Cache Manager Debugging</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client implements the Cache Manager Debugging
***************
*** 2616,2630 ****
  entries with positive reference counts</p>
  
  <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-callbacks<span style='mso-spacerun:yes'>   </span>print only cache
! entries with callbacks</p>
  
  <p class=preformattedtext><span style='mso-spacerun:yes'>      
  </span>-ctime<span style='mso-spacerun:yes'>       </span>print human readable
  expiration time</p>
  
! <p class=preformattedtext><span style='mso-spacerun:yes'>       </span>-addrs<span
! style='mso-spacerun:yes'>       </span>print only host interfaces</p>
  
  <p class=preformattedtext><span style='mso-spacerun:yes'>      
  </span>-cache<span style='mso-spacerun:yes'>       </span>print only cache
--- 2970,2985 ----
  entries with positive reference counts</p>
  
  <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-callbacks<span style='mso-spacerun:yes'>   </span>print only cache entries
! with callbacks</p>
  
  <p class=preformattedtext><span style='mso-spacerun:yes'>      
  </span>-ctime<span style='mso-spacerun:yes'>       </span>print human readable
  expiration time</p>
  
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-addrs<span style='mso-spacerun:yes'>       </span>print only host
! interfaces</p>
  
  <p class=preformattedtext><span style='mso-spacerun:yes'>      
  </span>-cache<span style='mso-spacerun:yes'>       </span>print only cache
***************
*** 2634,2672 ****
  </span>-cellservdb<span style='mso-spacerun:yes'>  </span>print only cellservdb
  info</p>
  
! <h2><a name="_Toc191662106"></a><a name="_Toc152605074"></a><a
! name="_Toc115416139"></a><a name="_Toc139993123"></a><a name="_Toc126872204"></a><a
! name="_Toc115417075"></a><span style='mso-bookmark:_Toc191662106'><span
! style='mso-bookmark:_Toc152605074'><span style='mso-bookmark:_Toc115416139'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.33. Windows Logon Caching
! vs. Kerberos Logons</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>If you are a site which utilizes MIT/Heimdal Kerberos
  principals to logon to Windows via a cross-realm relationship with a
  multi-domain Windows forest, you must enable Windows logon caching unless the
  workstation is Windows Vista.</p>
  
! <h2><a name="_Toc191662107"></a><a name="_Toc152605075"></a><a
! name="_Toc115416140"></a><a name="_Toc139993124"></a><a name="_Toc126872205"></a><a
! name="_Toc115417076"></a><span style='mso-bookmark:_Toc191662107'><span
! style='mso-bookmark:_Toc152605075'><span style='mso-bookmark:_Toc115416140'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.34. Initial Server
! Preferences</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>VLDB and File Server Preferences can now be provided initial
  values using registry keys.&nbsp; This is useful for managed machines in a
  Windows domain which are centrally located (e.g., in a computing lab.)&nbsp;
! See <a href="#_Appendix_A:_Registry_Values">Appendix A</a> for details on the
! &quot;<a href="#_Regkey:_[HKLMSOFTWAREOpenAFSClie_2">Server Preferences</a>&quot;
! keys.</p>
! 
! <h2><a name="_Toc191662108"></a><a name="_Toc152605076"></a><a
! name="_Toc115416141"></a><a name="_Toc139993125"></a><a name="_Toc126872206"></a><a
! name="_Toc115417077"></a><span style='mso-bookmark:_Toc191662108'><span
! style='mso-bookmark:_Toc152605076'><span style='mso-bookmark:_Toc115416141'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.35. File Timestamps</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client reports timestamps on files stored in AFS
--- 2989,3033 ----
  </span>-cellservdb<span style='mso-spacerun:yes'>  </span>print only cellservdb
  info</p>
  
! <h2><a name="_Toc193871673"></a><a name="_Toc193871428"></a><a
! name="_Toc191662106"></a><a name="_Toc152605074"></a><a name="_Toc115416139"></a><a
! name="_Toc139993123"></a><a name="_Toc126872204"></a><a name="_Toc115417075"></a><span
! style='mso-bookmark:_Toc193871673'><span style='mso-bookmark:_Toc193871428'><span
! style='mso-bookmark:_Toc191662106'><span style='mso-bookmark:_Toc152605074'><span
! style='mso-bookmark:_Toc115416139'><span style='mso-fareast-font-family:"Times New Roman"'>3.33.
! Windows Logon Caching vs. Kerberos Logons</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>If you are a site which utilizes MIT/Heimdal Kerberos
  principals to logon to Windows via a cross-realm relationship with a
  multi-domain Windows forest, you must enable Windows logon caching unless the
  workstation is Windows Vista.</p>
  
! <h2><a name="_Toc193871674"></a><a name="_Toc193871429"></a><a
! name="_Toc191662107"></a><a name="_Toc152605075"></a><a name="_Toc115416140"></a><a
! name="_Toc139993124"></a><a name="_Toc126872205"></a><a name="_Toc115417076"></a><span
! style='mso-bookmark:_Toc193871674'><span style='mso-bookmark:_Toc193871429'><span
! style='mso-bookmark:_Toc191662107'><span style='mso-bookmark:_Toc152605075'><span
! style='mso-bookmark:_Toc115416140'><span style='mso-fareast-font-family:"Times New Roman"'>3.34.
! Initial Server Preferences</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>VLDB and File Server Preferences can now be provided initial
  values using registry keys.&nbsp; This is useful for managed machines in a
  Windows domain which are centrally located (e.g., in a computing lab.)&nbsp;
! See <a href="#_Appendix_A:_Registry_Values"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Appendix A</span></span></a>
! for details on the &quot;<a href="#_Regkey:_[HKLMSOFTWAREOpenAFSClie_2"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Server Preferences</span></span></a>&quot; keys.</p>
! 
! <h2><a name="_Toc193871675"></a><a name="_Toc193871430"></a><a
! name="_Toc191662108"></a><a name="_Toc152605076"></a><a name="_Toc115416141"></a><a
! name="_Toc139993125"></a><a name="_Toc126872206"></a><a name="_Toc115417077"></a><span
! style='mso-bookmark:_Toc193871675'><span style='mso-bookmark:_Toc193871430'><span
! style='mso-bookmark:_Toc191662108'><span style='mso-bookmark:_Toc152605076'><span
! style='mso-bookmark:_Toc115416141'><span style='mso-fareast-font-family:"Times New Roman"'>3.35.
! File Timestamps</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client reports timestamps on files stored in AFS
***************
*** 2687,2699 ****
  timestamp from the Windows explorer.&nbsp; During DST, these two times will no
  longer agree even though they are in fact representing the same moment in time.</p>
  
! <h2><a name="_Toc191662109"></a><a name="_Toc152605077"></a><a
! name="_Toc115416142"></a><a name="_Toc139993126"></a><a name="_Toc126872207"></a><a
! name="_Toc115417078"></a><span style='mso-bookmark:_Toc191662109'><span
! style='mso-bookmark:_Toc152605077'><span style='mso-bookmark:_Toc115416142'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.36. Windows RPC client
! support must be installed</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'> <o:p></o:p></span></h2>
  
  <p class=MsoNormal>If the installer refuses to install and complains about an
  RPC configuration error, check to ensure that the following registry entries
--- 3048,3061 ----
  timestamp from the Windows explorer.&nbsp; During DST, these two times will no
  longer agree even though they are in fact representing the same moment in time.</p>
  
! <h2><a name="_Toc193871676"></a><a name="_Toc193871431"></a><a
! name="_Toc191662109"></a><a name="_Toc152605077"></a><a name="_Toc115416142"></a><a
! name="_Toc139993126"></a><a name="_Toc126872207"></a><a name="_Toc115417078"></a><span
! style='mso-bookmark:_Toc193871676'><span style='mso-bookmark:_Toc193871431'><span
! style='mso-bookmark:_Toc191662109'><span style='mso-bookmark:_Toc152605077'><span
! style='mso-bookmark:_Toc115416142'><span style='mso-fareast-font-family:"Times New Roman"'>3.36.
! Windows RPC client support must be installed</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
  <p class=MsoNormal>If the installer refuses to install and complains about an
  RPC configuration error, check to ensure that the following registry entries
***************
*** 2705,2723 ****
  <p class=preformattedtext>&nbsp;&nbsp; HKLM
  &quot;SOFTWARE\Microsoft\RPC\ClientProtocols&quot; &quot;ncacn_ip_tcp&quot;</p>
  
! <p class=preformattedtext>&nbsp;&nbsp; HKLM &quot;SOFTWARE\Microsoft\RPC\ClientProtocols&quot;
! &quot;ncadg_ip_udp&quot;</p>
  
  <p class=preformattedtext>&nbsp;&nbsp; HKLM
  &quot;SOFTWARE\Microsoft\RPC\ClientProtocols&quot; &quot;ncacn_http&quot;</p>
  
! <h2><a name="_Toc191662110"></a><a name="_Toc152605078"></a><a
! name="_Toc115416143"></a><a name="_Toc139993127"></a><a name="_Toc126872208"></a><a
! name="_Toc115417079"></a><span style='mso-bookmark:_Toc191662110'><span
! style='mso-bookmark:_Toc152605078'><span style='mso-bookmark:_Toc115416143'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.37. Generating Minidumps of
! the OpenAFS Client Service</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS 1.4 added a new command, &quot;fs
  minidump&quot;.&nbsp; This command can be used at any time to generate a mini
--- 3067,3086 ----
  <p class=preformattedtext>&nbsp;&nbsp; HKLM
  &quot;SOFTWARE\Microsoft\RPC\ClientProtocols&quot; &quot;ncacn_ip_tcp&quot;</p>
  
! <p class=preformattedtext>&nbsp;&nbsp; HKLM
! &quot;SOFTWARE\Microsoft\RPC\ClientProtocols&quot; &quot;ncadg_ip_udp&quot;</p>
  
  <p class=preformattedtext>&nbsp;&nbsp; HKLM
  &quot;SOFTWARE\Microsoft\RPC\ClientProtocols&quot; &quot;ncacn_http&quot;</p>
  
! <h2><a name="_Toc193871677"></a><a name="_Toc193871432"></a><a
! name="_Toc191662110"></a><a name="_Toc152605078"></a><a name="_Toc115416143"></a><a
! name="_Toc139993127"></a><a name="_Toc126872208"></a><a name="_Toc115417079"></a><span
! style='mso-bookmark:_Toc193871677'><span style='mso-bookmark:_Toc193871432'><span
! style='mso-bookmark:_Toc191662110'><span style='mso-bookmark:_Toc152605078'><span
! style='mso-bookmark:_Toc115416143'><span style='mso-fareast-font-family:"Times New Roman"'>3.37.
! Generating Minidumps of the OpenAFS Client Service</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>OpenAFS 1.4 added a new command, &quot;fs
  minidump&quot;.&nbsp; This command can be used at any time to generate a mini
***************
*** 2725,2747 ****
  process.&nbsp;&nbsp; This output can be very helpful when debugging the AFS
  Client Service when it is unresponsive to SMB/CIFS requests.</p>
  
! <h2><a name="_Toc191662111"></a><a name="_Toc152605079"></a><a
! name="_Toc115416144"></a><a name="_Toc139993128"></a><a name="_Toc126872209"></a><a
! name="_Toc115417080"></a><span style='mso-bookmark:_Toc191662111'><span
! style='mso-bookmark:_Toc152605079'><span style='mso-bookmark:_Toc115416144'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.38. AFS Client Universally
! Unique Identifiers (UUIDs) vs. System Cloning</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client implements Universally Unique Identifiers
! (UUIDs).&nbsp; They are used to provide the AFS file server with a method of
! identifying the client that is independent of IP address.&nbsp; This permits
! the AFS file server to track mobile clients or those behind Network Address
! Translators when they move from address to address or port to port. Tracking
! the client improves client performance by permitting callback state to be maintained
! across location changes. The UUID is generated when the AFSCache file is
! created and is maintained as long as the contents of the AFSCache file are
! valid.&nbsp; The UUID is stored in the AFSCache file.&nbsp;</p>
  
  <p class=MsoNormal>When cloning machines that have Windows AFS client installed
  it is necessary to generate a new UUID for each client. This will be done
--- 3088,3111 ----
  process.&nbsp;&nbsp; This output can be very helpful when debugging the AFS
  Client Service when it is unresponsive to SMB/CIFS requests.</p>
  
! <h2><a name="_Toc193871678"></a><a name="_Toc193871433"></a><a
! name="_Toc191662111"></a><a name="_Toc152605079"></a><a name="_Toc115416144"></a><a
! name="_Toc139993128"></a><a name="_Toc126872209"></a><a name="_Toc115417080"></a><span
! style='mso-bookmark:_Toc193871678'><span style='mso-bookmark:_Toc193871433'><span
! style='mso-bookmark:_Toc191662111'><span style='mso-bookmark:_Toc152605079'><span
! style='mso-bookmark:_Toc115416144'><span style='mso-fareast-font-family:"Times New Roman"'>3.38.
! AFS Client Universally Unique Identifiers (UUIDs) vs. System Cloning</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoNormal>The OpenAFS Client implements Universally Unique Identifiers
! (UUIDs).&nbsp; They are used to provide the AFS file server with a method of identifying
! the client that is independent of IP address.&nbsp; This permits the AFS file
! server to track mobile clients or those behind Network Address Translators when
! they move from address to address or port to port. Tracking the client improves
! client performance by permitting callback state to be maintained across
! location changes. The UUID is generated when the AFSCache file is created and
! is maintained as long as the contents of the AFSCache file are valid.&nbsp; The
! UUID is stored in the AFSCache file.&nbsp;</p>
  
  <p class=MsoNormal>When cloning machines that have Windows AFS client installed
  it is necessary to generate a new UUID for each client. This will be done
***************
*** 2753,2761 ****
  they will also put a tremendous strain on the AFS file servers.</b></p>
  
  <p class=MsoNormal>For lab environments that wish to erase all cached data on
! each restart, the <a href="#_Toc170268938">NonPersistentCaching</a> option will
! disable the use of the persistent cache file. As a side effect, a new UUID will
! be generated for the AFS client service on each restart.</p>
  
  <p class=MsoNormal>When a Windows system is cloned, the Microsoft Loopback
  Adapter will be disabled in the cloned system.<span style='mso-spacerun:yes'> 
--- 3117,3126 ----
  they will also put a tremendous strain on the AFS file servers.</b></p>
  
  <p class=MsoNormal>For lab environments that wish to erase all cached data on
! each restart, the <a href="#_Toc170268938"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>NonPersistentCaching</span></span></a>
! option will disable the use of the persistent cache file. As a side effect, a
! new UUID will be generated for the AFS client service on each restart.</p>
  
  <p class=MsoNormal>When a Windows system is cloned, the Microsoft Loopback
  Adapter will be disabled in the cloned system.<span style='mso-spacerun:yes'> 
***************
*** 2767,2776 ****
  installer by performing an administrative install via <i style='mso-bidi-font-style:
  normal'>msiexec.exe /a</i>.</p>
  
! <h2><a name="_Toc191662112"></a><a name="_Toc152605080"></a><a
! name="_Toc139993129"><span style='mso-bookmark:_Toc152605080'><span
! style='mso-bookmark:_Toc191662112'><span style='mso-fareast-font-family:"Times New Roman"'>3.39.
! Delayed Write Errors with Microsoft Office Applications</span></span></span></a><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>Microsoft Office makes heavy use of asynchronous
--- 3132,3143 ----
  installer by performing an administrative install via <i style='mso-bidi-font-style:
  normal'>msiexec.exe /a</i>.</p>
  
! <h2><a name="_Toc193871679"></a><a name="_Toc193871434"></a><a
! name="_Toc139993129"></a><a name="_Toc152605080"></a><a name="_Toc191662112"><span
! style='mso-bookmark:_Toc152605080'><span style='mso-bookmark:_Toc139993129'><span
! style='mso-bookmark:_Toc193871434'><span style='mso-bookmark:_Toc193871679'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.39. Delayed Write Errors
! with Microsoft Office Applications</span></span></span></span></span></a><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>Microsoft Office makes heavy use of asynchronous
***************
*** 2788,2832 ****
  with the explorer shell does not use asynchronous i/o. </p>
  
  <p class=MsoBodyText>The CIFS session timeout defaults to 45 seconds and can be
! increased by modifying the <a href="#_Value:_ConnDeadTimeout">registry</a>. </p>
  
  <p class=MsoBodyText>Beginning with the 1.5.33 release, the performance
  characteristics of SMB Write Data operations can be adjusted.<span
! style='mso-spacerun:yes'>  </span>In prior releases all writes were performed
! using a restricted asynchronous store model in which only one asynchronous
! store operation per file can be performed at a time.<span
! style='mso-spacerun:yes'>  </span>The reason for this restriction is limit the
! amount of data the cache manager will accept without it having been written to
! the file server.<span style='mso-spacerun:yes'>  </span>If too much unwritten
! data is accepted, the file close operation will block until all of the
! unwritten data is output and this could trigger a CIFS client disconnect.<span
! style='mso-spacerun:yes'>  </span></p>
! 
! <p class=MsoBodyText>Prior to 1.5.33 the size of the asynchronous store was always
! equal to the chunk size which was often too large for low bandwidth connections.<span
! style='mso-spacerun:yes'>  </span>The asynchronous store size now defaults to
! 32KB and is configurable using the <a href="#_Value:_SMBAsyncStoreSize">SMBAsyncStoreSize</a>
! registry value.<span style='mso-spacerun:yes'>  </span>Asynchronous store
! operations can also be disabled using the <a href="#_Value:_EnableSMBAsyncStore">EnableSMBAsyncStore</a>
! registry value in which case all writes received by the cache manager block
! until the Rx StoreData operation completes.</p>
! 
! <h2><a name="_Toc191662113"></a><a name="_Toc152605081"></a><a
! name="_Toc139993130"><span style='mso-bookmark:_Toc152605081'><span
! style='mso-bookmark:_Toc191662113'><span style='mso-fareast-font-family:"Times New Roman"'>3.40.
! Global Drives (aka </span></span></span></a><st1:Street w:st="on"><st1:address
!  w:st="on"><span style='mso-bookmark:_Toc191662113'><span style='mso-bookmark:
!   _Toc152605081'><span style='mso-fareast-font-family:"Times New Roman"'>Service
!   Drive</span></span></span></st1:address></st1:Street><span style='mso-bookmark:
! _Toc191662113'><span style='mso-bookmark:_Toc152605081'><span style='mso-fareast-font-family:
! "Times New Roman"'> Letters) are no longer supported by Microsoft</span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>The Global DriveAuto-mount feature has been deprecated due
  to the following Microsoft KB article.</p>
  
  <p class=MsoBodyText style='text-indent:35.45pt'><a
! href="http://msdn.microsoft.com/library/en-us/dllproc/base/services_and_redirected_drives.asp">http://msdn.microsoft.com/library/en-us/dllproc/base/services_and_redirected_drives.asp</a></p>
  
  <p class=MsoBodyText>It says that services mounting drive letters are no longer
  supported by Microsoft and may act unpredictably.&nbsp; The experience other
--- 3155,3214 ----
  with the explorer shell does not use asynchronous i/o. </p>
  
  <p class=MsoBodyText>The CIFS session timeout defaults to 45 seconds and can be
! increased by modifying the <a href="#_Value:_ConnDeadTimeout"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>registry</span></span></a>. </p>
  
  <p class=MsoBodyText>Beginning with the 1.5.33 release, the performance
  characteristics of SMB Write Data operations can be adjusted.<span
! style='mso-spacerun:yes'>  </span>In prior releases all writes were performed using
! a restricted asynchronous store model in which only one asynchronous store
! operation per file can be performed at a time.<span style='mso-spacerun:yes'> 
! </span>The reason for this restriction is limit the amount of data the cache
! manager will accept without it having been written to the file server.<span
! style='mso-spacerun:yes'>  </span>If too much unwritten data is accepted, the
! file close operation will block until all of the unwritten data is output and
! this could trigger a CIFS client disconnect.<span style='mso-spacerun:yes'> 
! </span></p>
! 
! <p class=MsoBodyText>Prior to 1.5.33 the size of the asynchronous store was
! always equal to the chunk size which was often too large for low bandwidth
! connections.<span style='mso-spacerun:yes'>  </span>The asynchronous store size
! now defaults to 32KB and is configurable using the <a
! href="#_Value:_SMBAsyncStoreSize"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>SMBAsyncStoreSize</span></span></a>
! registry value.<span style='mso-spacerun:yes'>  </span>Asynchronous store operations
! can also be disabled using the <a href="#_Value:_EnableSMBAsyncStore"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>EnableSMBAsyncStore</span></span></a> registry value in
! which case all writes received by the cache manager block until the Rx
! StoreData operation completes.</p>
! 
! <h2><a name="_Toc193871680"></a><a name="_Toc193871435"></a><a
! name="_Toc191662113"></a><a name="_Toc152605081"></a><a name="_Toc139993130"><span
! style='mso-bookmark:_Toc152605081'><span style='mso-bookmark:_Toc191662113'><span
! style='mso-bookmark:_Toc193871435'><span style='mso-bookmark:_Toc193871680'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.40. Global Drives (aka </span></span></span></span></span></a><st1:Street
! w:st="on"><st1:address w:st="on"><span style='mso-bookmark:_Toc193871680'><span
!   style='mso-bookmark:_Toc193871435'><span style='mso-bookmark:_Toc191662113'><span
!   style='mso-bookmark:_Toc152605081'><span style='mso-fareast-font-family:"Times New Roman"'>Service
!   Drive</span></span></span></span></span></st1:address></st1:Street><span
! style='mso-bookmark:_Toc193871680'><span style='mso-bookmark:_Toc193871435'><span
! style='mso-bookmark:_Toc191662113'><span style='mso-bookmark:_Toc152605081'><span
! style='mso-fareast-font-family:"Times New Roman"'> Letters) are no longer
! supported by Microsoft</span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>The Global DriveAuto-mount feature has been deprecated due
  to the following Microsoft KB article.</p>
  
  <p class=MsoBodyText style='text-indent:35.45pt'><a
! href="http://msdn.microsoft.com/library/en-us/dllproc/base/services_and_redirected_drives.asp"><span
! style='mso-bookmark:_Toc193871681'><span style='mso-bookmark:_Toc193871436'><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>http://msdn.microsoft.com/library/en-us/dllproc/base/services_and_redirected_drives.asp</span></span></span></span><span
! style='mso-bookmark:_Toc193871436'></span><span style='mso-bookmark:_Toc193871681'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871436"></a><a name="_Toc193871681"></a><![endif]></p>
  
  <p class=MsoBodyText>It says that services mounting drive letters are no longer
  supported by Microsoft and may act unpredictably.&nbsp; The experience other
***************
*** 2838,2847 ****
  applications should be modified to use of \\AFS\&lt;cellname&gt;\&lt;path&gt;
  instead of drive letters.</p>
  
! <h2><a name="_Toc191662114"></a><a name="_Toc152605082"></a><a
! name="_Toc139993131"><span style='mso-bookmark:_Toc152605082'><span
! style='mso-bookmark:_Toc191662114'><span style='mso-fareast-font-family:"Times New Roman"'>3.41.
! 64-bit Microsoft Windows Installations</span></span></span></a><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>Although 64-bit Windows platforms support both 64-bit and
--- 3220,3231 ----
  applications should be modified to use of \\AFS\&lt;cellname&gt;\&lt;path&gt;
  instead of drive letters.</p>
  
! <h2><a name="_Toc193871682"></a><a name="_Toc193871437"></a><a
! name="_Toc139993131"></a><a name="_Toc152605082"></a><a name="_Toc191662114"><span
! style='mso-bookmark:_Toc152605082'><span style='mso-bookmark:_Toc139993131'><span
! style='mso-bookmark:_Toc193871437'><span style='mso-bookmark:_Toc193871682'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.41. 64-bit Microsoft
! Windows Installations</span></span></span></span></span></a><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>Although 64-bit Windows platforms support both 64-bit and
***************
*** 2857,2868 ****
  Without this restriction the AFS Cache File can become arbitrarily large
  limited only by available disk space.</p>
  
! <h2><a name="_Toc191662115"></a><a name="_Toc152605083"></a><a
! name="_Toc139993132"><span style='mso-bookmark:_Toc152605083'><span
! style='mso-bookmark:_Toc191662115'><span style='mso-fareast-font-family:"Times New Roman"'>3.42.
! Known Issues with Microsoft Windows </span></span></span></a><st1:place w:st="on"><span
   style='mso-bookmark:_Toc191662115'><span style='mso-bookmark:_Toc152605083'><span
!  style='mso-fareast-font-family:"Times New Roman"'>Vista</span></span></span></st1:place><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>OpenAFS for Windows works with Microsoft Windows Vista
--- 3241,3255 ----
  Without this restriction the AFS Cache File can become arbitrarily large
  limited only by available disk space.</p>
  
! <h2><a name="_Toc193871683"></a><a name="_Toc193871438"></a><a
! name="_Toc191662115"></a><a name="_Toc152605083"></a><a name="_Toc139993132"><span
! style='mso-bookmark:_Toc152605083'><span style='mso-bookmark:_Toc191662115'><span
! style='mso-bookmark:_Toc193871438'><span style='mso-bookmark:_Toc193871683'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.42. Known Issues with
! Microsoft Windows </span></span></span></span></span></a><st1:place w:st="on"><span
!  style='mso-bookmark:_Toc193871683'><span style='mso-bookmark:_Toc193871438'><span
   style='mso-bookmark:_Toc191662115'><span style='mso-bookmark:_Toc152605083'><span
!  style='mso-fareast-font-family:"Times New Roman"'>Vista</span></span></span></span></span></st1:place><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
  <p class=MsoBodyText>OpenAFS for Windows works with Microsoft Windows Vista
***************
*** 2884,2919 ****
  other tools will report that the AFS Client Service may not have been started.</p>
  
  <p class=MsoBodyText>Windows Vista implements <a
! href="http://www.microsoft.com/technet/windowsvista/library/0d75f774-8514-4c9e-ac08-4c21f5c6c2d9.mspx">User
! Account Control</a> (UAC), a new security feature that implements least user
! privilege.<span style='mso-spacerun:yes'>  </span>With UAC, applications only
! run with the minimum required privileges.<span style='mso-spacerun:yes'> 
! </span>Even Administrator accounts run applications without the “Administrator”
! access control credentials.<span style='mso-spacerun:yes'>  </span>One side
! effect of this is that existing applications that mix user and system
! configuration capabilities must be re-written to separate those functions that
! require “Administrator” privileges into a separate process space.<span
! style='mso-spacerun:yes'>  </span>Future updates to OpenAFS will incorporate
! the necessary privilege separation, until that time some functions such as the
! Start and Stop Service features of the AFS System Tray tool and the AFS Control
! Panel will not work unless they are “Run as Administrator”.<span
! style='mso-spacerun:yes'>  </span>When a <st1:place w:st="on">Vista</st1:place>
! user account that is a member of the “Administrators” group is used to access
! the AFS Control Panel (afs_config.exe), the process must be “Run as Administrator”.<span
  style='mso-spacerun:yes'>   </span>Otherwise, attempts to modify the OpenAFS
  configuration will appear to succeed but in reality will have failed due to <st1:place
  w:st="on">Vista</st1:place>’s system file and registry virtualization feature.</p>
  
  <p class=MsoBodyText>The help files provided with OpenAFS are in .HLP format. <a
! href="http://support.microsoft.com/kb/917607">Windows Vista does not include a
! help engine for this format.</a> </p>
! 
! <h2><a name="_Toc115416145"></a><a name="_Toc191662116"></a><a
! name="_Toc139993133"></a><a name="_Toc126872210"></a><a name="_Toc115417081"></a><span
! style='mso-bookmark:_Toc115416145'><span style='mso-bookmark:_Toc191662116'><span
! style='mso-fareast-font-family:"Times New Roman"'>3.43. New AFS Share Name
! Syntax Provides Direct Access to Volumes</span></span></span><span
! style='mso-bookmark:_Toc115416145'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
  <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'>Starting with the
  1.5.21 release of OpenAFS for Windows, the following syntax can be used to
--- 3271,3311 ----
  other tools will report that the AFS Client Service may not have been started.</p>
  
  <p class=MsoBodyText>Windows Vista implements <a
! href="http://www.microsoft.com/technet/windowsvista/library/0d75f774-8514-4c9e-ac08-4c21f5c6c2d9.mspx"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>User Account Control</span></span></a> (UAC), a new
! security feature that implements least user privilege.<span
! style='mso-spacerun:yes'>  </span>With UAC, applications only run with the
! minimum required privileges.<span style='mso-spacerun:yes'>  </span>Even
! Administrator accounts run applications without the “Administrator” access
! control credentials.<span style='mso-spacerun:yes'>  </span>One side effect of
! this is that existing applications that mix user and system configuration
! capabilities must be re-written to separate those functions that require “Administrator”
! privileges into a separate process space.<span style='mso-spacerun:yes'> 
! </span>Future updates to OpenAFS will incorporate the necessary privilege
! separation, until that time some functions such as the Start and Stop Service
! features of the AFS System Tray tool and the AFS Control Panel will not work
! unless they are “Run as Administrator”.<span style='mso-spacerun:yes'> 
! </span>When a <st1:place w:st="on">Vista</st1:place> user account that is a
! member of the “Administrators” group is used to access the AFS Control Panel
! (afs_config.exe), the process must be “Run as Administrator”.<span
  style='mso-spacerun:yes'>   </span>Otherwise, attempts to modify the OpenAFS
  configuration will appear to succeed but in reality will have failed due to <st1:place
  w:st="on">Vista</st1:place>’s system file and registry virtualization feature.</p>
  
  <p class=MsoBodyText>The help files provided with OpenAFS are in .HLP format. <a
! href="http://support.microsoft.com/kb/917607"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Windows Vista
! does not include a help engine for this format.</span></span></a> </p>
! 
! <h2><a name="_Toc115416145"></a><a name="_Toc193871684"></a><a
! name="_Toc193871439"></a><a name="_Toc191662116"></a><a name="_Toc139993133"></a><a
! name="_Toc126872210"></a><a name="_Toc115417081"></a><span style='mso-bookmark:
! _Toc115416145'><span style='mso-bookmark:_Toc193871684'><span style='mso-bookmark:
! _Toc193871439'><span style='mso-bookmark:_Toc191662116'><span style='mso-fareast-font-family:
! "Times New Roman"'>3.43. New AFS Share Name Syntax Provides Direct Access to
! Volumes</span></span></span></span></span><span style='mso-bookmark:_Toc115416145'><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
  <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'>Starting with the
  1.5.21 release of OpenAFS for Windows, the following syntax can be used to
***************
*** 2939,2948 ****
  <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'><span
  style='mso-tab-count:1'>            </span>\\AFS\athena.mit.edu# 537235559\</span></p>
  
! <h2><span style='mso-bookmark:_Toc115416145'><a name="_Toc191662117"><span
! style='mso-fareast-font-family:"Times New Roman"'>3.44. Differences between
! Windows and UNIX “fs examine”</span></a></span><span style='mso-bookmark:_Toc115416145'><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
  <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'>The OpenAFS for
  Windows version of “fs examine” provide two additional lines of output when
--- 3331,3341 ----
  <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'><span
  style='mso-tab-count:1'>            </span>\\AFS\athena.mit.edu# 537235559\</span></p>
  
! <h2><span style='mso-bookmark:_Toc115416145'><a name="_Toc193871685"></a><a
! name="_Toc193871440"></a><a name="_Toc191662117"><span style='mso-bookmark:
! _Toc193871440'><span style='mso-bookmark:_Toc193871685'><span style='mso-fareast-font-family:
! "Times New Roman"'>3.44. Differences between Windows and UNIX “fs examine”</span></span></span></a></span><span
! style='mso-bookmark:_Toc115416145'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
  <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'>The OpenAFS for
  Windows version of “fs examine” provide two additional lines of output when
***************
*** 2962,3424 ****
  style='mso-bookmark:_Toc115416145'>Volume is online <b style='mso-bidi-font-weight:
  normal'><o:p></o:p></b></span></pre>
  
! <h2><span style='mso-bookmark:_Toc115416145'><a name="_Toc191662118"><span
! style='mso-fareast-font-family:"Times New Roman"'>3.45. Literal evaluation of
! AFS objects via fs commands</span></a></span><span style='mso-bookmark:_Toc115416145'><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
! <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'>Beginning with
! the 1.5.31 release, the fs commands <i style='mso-bidi-font-style:normal'>examine</i>,
! <i style='mso-bidi-font-style:normal'>flush</i>, <i style='mso-bidi-font-style:
  normal'>whereis</i>, and <i style='mso-bidi-font-style:normal'>whichcell</i>
  provide a new command-line parameter, <i style='mso-bidi-font-style:normal'>-literal</i>.<span
  style='mso-spacerun:yes'>  </span>When specified, if the evaluated object is a
  symlink or a mountpoint the resulting output will describe the specified object
  and not the object that is the target of the symlink or mountpoint.</span></p>
  
! <h2><span style='mso-bookmark:_Toc115416145'><a name="_Toc191662119"><span
! style='mso-fareast-font-family:"Times New Roman"'>3.46. Out of Quota errors</span></a></span><span
  style='mso-bookmark:_Toc115416145'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
! <p class=MsoBodyText><span style='mso-bookmark:_Toc115416145'>Prior to the
! 1.5.31 release, out of quota errors were reported to the calling application as
! an out of space error.<span style='mso-spacerun:yes'>  </span>As of 1.5.31, an
! out of space error will indicate that the partition on which the volume is
! located is in fact out of space.<span style='mso-spacerun:yes'>  </span>Whereas
! an out of quota error indicates that the user does not have permission to
! allocate additional space.</span></p>
! 
! <h1><span style='mso-bookmark:_Toc115416145'><a name="_Toc191662120"><span
! style='mso-fareast-font-family:"Times New Roman"'>4. How to Debug Problems with
! OpenAFS for Windows</span></a></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
! 
! <p class=MsoNormal>OpenAFS for Windows provides a wide range of tools to assist
! you in debugging problems.&nbsp; The techniques available to you are varied
! because of the wide range of issues that have been discovered over the years.</p>
! 
! <h2><a name="_Toc191662121"></a><a name="_Toc139993134"></a><a
! name="_Toc126872211"></a><a name="_Toc115417082"></a><span style='mso-bookmark:
! _Toc191662121'><span style='mso-fareast-font-family:"Times New Roman"'>4.1.
! pioctl debugging (</span></span><a href="#_Value:_IoctlDebug"><span
! style='mso-bookmark:_Toc191662121'><span style='mso-fareast-font-family:"Times New Roman"'>IoctlDebug</span></span><span
! style='mso-bookmark:_Toc191662121'></span></a><span style='mso-bookmark:_Toc191662121'><span
! style='mso-fareast-font-family:"Times New Roman"'> registry key)</span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>pioctl (path-based ioctl) calls are used by various tools to
! communicate with the AFS Client Service.&nbsp; Some of the operations performed
! include:</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  tokens&nbsp; (tokens.exe, aklog.exe, afscreds.exe)</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  ACLs </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  cache parameters</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flushing
  files or volumes</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  server preferences</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>querying
  path location</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>checking
  the status of servers and volumes</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  the sysname list</p>
  
! <p class=MsoNormal>pioctl calls are implemented by writing to a special UNC
! path that is processed by the AFS Client Service.&nbsp;&nbsp; If there is a failure
! to communicate with the AFS Client Service via SMB/CIFS, it will be impossible
! to perform any of the above operations.&nbsp;&nbsp; </p>
! 
! <p class=MsoNormal>To assist in debugging these problems, the registry value:</p>
! 
! <p class=preformattedtext>&nbsp; [HKLM\SOFTWARE\OpenAFS\Client]</p>
! 
! <p class=preformattedtext>&nbsp; REG_DWORD:&nbsp; IoctlDebug&nbsp;&nbsp; = 0x01</p>
! 
! <p class=MsoNormal>should be set.&nbsp; Then any of the commands that perform
! pioctl calls should be executed from the command prompt.&nbsp; With this key
! set the pioctl library will generate debugging output to stderr.&nbsp; The
! output will contain the Win32 API calls executed along with their most
! important parameters and their return code.&nbsp;&nbsp; The MSDN Library and
! the Microsoft KnowledgeBase can be used as a reference to help you determine
! the configuration probem with your system.</p>
! 
! <h2><a name="_Toc191662122"></a><a name="_Toc139993135"></a><a
! name="_Toc126872212"></a><a name="_Toc115417083"></a><span style='mso-bookmark:
! _Toc191662122'><span style='mso-fareast-font-family:"Times New Roman"'>4.2.
! afsd_service initialization log (%WinDir%\TEMP\afsd_init.log)</span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>Every time the AFS Client Service starts it appends data
! about its progress and configuration to a file.&nbsp; This file provides
! information crucial to determining why the service cannot start when there are
! problems.&nbsp; When the process terminates due to a panic condition it will
! write to this file the source code file and line number of the error.&nbsp; In
! many cases the panic condition is due to a misconfiguration of the
! machine.&nbsp; In other cases it might be due to a programming error in the software.&nbsp;
! A quick review of the location in the source code will quickly reveal the
! reason for the termination.</p>
  
! <p class=MsoNormal>The <i><a href="#_Value___:_MaxLogSize">MaxLogSize</a></i>
  registry value determines the maximum size of the %WINDIR%\TEMP\afsd_init.log
  file.&nbsp; If the file is larger than this value when OpenAFS Client Service
  starts, the file will be reset to 0 bytes.&nbsp; If value is set to 0, the file
  will be allowed to grow indefinitely.</p>
  
! <h2><a name="_Toc191662123"></a><a name="_Toc139993136"></a><a
! name="_Toc126872213"></a><a name="_Toc115417084"></a><span style='mso-bookmark:
! _Toc191662123'><span style='mso-fareast-font-family:"Times New Roman"'>4.3.
  afsd_service debug logs (fs trace {-on, -off, -dump}
! -&gt;%WinDir%\TEMP\afsd.log)</span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>When attempting to debug the behavior of the SMB/CIFS Server
! and the Cache Manager it is often useful to examine a log of the operations
! being performed.&nbsp; While running the AFS Client Service keeps an in memory
! log of many of its actions.&nbsp;&nbsp; The default number of actions preserved
! at any one time is 5000.&nbsp; This can be adjusted with the <a
! href="#_Value_:_TraceBufferSize">registry value</a>:</p>
  
! <p class=preformattedtext>&nbsp;
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
  
! <p class=preformattedtext>&nbsp; REG_DWORD&nbsp; TraceBufferSize </p>
  
! <p class=MsoNormal>A restart of the service is necessary when adjusting this
! value.&nbsp;&nbsp; Execute &quot;fs trace -on&quot; to clear to the log and
! &quot;fs trace -dump&quot; to output the contents of the log to the file.</p>
! 
! <h2><a name="_Toc191662124"></a><a name="_Toc139993137"></a><a
! name="_Toc126872214"></a><a name="_Toc115417085"></a><span style='mso-bookmark:
! _Toc191662124'><span style='mso-fareast-font-family:"Times New Roman"'>4.4.
! Using SysInternal’s DbgView and ProcMon or FileMon Tools</span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>An alternatve option to the use of &quot;fs trace
! -dump&quot; to capture internal OpenAFS Client Service events is to use a tool
! such as Sysinternal's DbgView to capture real-time debugging output.&nbsp; When
! the OpenAFS Client Service starts and Bit 2 of the <a
! href="#_Value__:_TraceOption">TraceOption</a> value in the registry is set, all
! trace log events are output using the Windows Debug Monitor interface
! (OutputDebugString).&nbsp; </p>
  
! <p class=preformattedtext>&nbsp;
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
  
! <p class=preformattedtext style='text-indent:12.0pt'>REG_DWORD&nbsp;&nbsp;
  TraceOption = 0x04</p>
  
! <p class=MsoNormal>Use “fs trace –on” and “fs trace –off” to toggle the
! generation of log messages. </p>
  
! <p class=MsoNormal><a name="_Toc115416150"></a><a name="_Toc126872215"></a><a
! name="_Toc115417086"></a><span style='mso-bookmark:_Toc115416150'>Sysinternal’s
! ProcMon or FileMon utilities can be use to monitor the file operations
  requested by applications and their success or failure.&nbsp;&nbsp; </span></p>
  
! <p class=MsoNormal><span style='mso-bookmark:_Toc115416150'>In FileMon, use the
! Volumes menu to restrict monitoring to <i>Network</i> volumes only in order to
! reduce the output to just the CIFS requests.&nbsp; Turn on the <i>Advanced
! Output</i> option in order to log with finer granularity.</span></p>
! 
! <p class=MsoNormal>In ProcMon, set a filter to include only events on file
! paths that refer to the AFS name space. Be sure to include both the UNC path as
! well as any drive letters mapped to AFS. </p>
! 
! <p class=MsoNormal>Turn on the <i>Clock Time</i> and <i>Show Milliseconds</i>
! options in both tools to make it easier to synchronize the application requests
! and the resulting OpenAFS Client Service operations.&nbsp;&nbsp; The captured
! data can be stored to files for inclusion in <a href="#_5._Reporting_Bugs:">bug
! reports</a>.</p>
! 
! <h2><a name="_Toc191662125"><span style='mso-fareast-font-family:"Times New Roman"'>4.5.
! Microsoft MiniDumps <br>
! (fs minidump -&gt; %WinDir%\TEMP\afsd.dmp)</span></a><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>If the AFS Client Service become unresponsive to any form of
! communication there may be a serious error that can only be debugged by someone
! with access to the source code and a debugger.&nbsp;&nbsp; The &quot;fs
! minidump&quot; command can be used to force the generation of a MiniDump file
! containing the state of all of the threads in the AFS Client Service process.</p>
! 
! <p class=MsoNormal>The <a href="#_Toc190064189">MiniDumpType</a> registry value
! can be used to adjust the scope of the process information included within the
! dump file.</p>
! 
! <h2><a name="_Toc191662126"></a><a name="_Toc139993139"></a><a
! name="_Toc126872216"></a><a name="_Toc115417087"></a><span style='mso-bookmark:
! _Toc191662126'><span style='mso-fareast-font-family:"Times New Roman"'>4.6.
! Single Sign-on (Integrated Logon) debugging</span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>If you are having trouble with the Integrated Logon
! operations it is often useful to be able to obtain a log of what it is
! attempting to do.&nbsp;&nbsp; Setting Bit 0 of the <a
! href="#_Value__:_TraceOption">TraceOption</a> registry value:</p>
! 
! <p class=preformattedtext>&nbsp; [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
! 
! <p class=preformattedtext>&nbsp; REG_DWORD&nbsp;&nbsp; TraceOption = 0x01</p>
! 
! <p class=MsoNormal>will instruct the Integrated Logon Network Provider and
! Event Handlers to log information to the Windows Event Log: Application under
! the name “AFS Logon&quot;.</p>
! 
! <h2><a name="_Toc191662127"></a><a name="_Toc139993140"></a><a
! name="_Toc126872217"></a><a name="_Toc115417088"></a><span style='mso-bookmark:
! _Toc191662127'><span style='mso-fareast-font-family:"Times New Roman"'>4.7. RX
! (AFS RPC) debugging (rxdebug)</span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>The rxdebug.exe tool can be used to query a variety of
! information about the AFS services installed on a given machine.&nbsp; The port
! for the AFS Cache Manager is 7001.&nbsp; </p>
  
! <p class=preformattedtext>Usage: rxdebug -servers &lt;server machine&gt; [-port
! &lt;IP port&gt;] [-nodally] </p>
  
! <p class=preformattedtext style='margin-left:35.45pt;text-indent:35.45pt'>&nbsp;&nbsp;
  [-allconnections] [-rxstats] [-onlyserver] [-onlyclient] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt'>&nbsp;&nbsp; [-onlyport
! &lt;show only &lt;port&gt;&gt;] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt'>&nbsp;&nbsp; [-onlyhost
! &lt;show only &lt;host&gt;&gt;] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt'>&nbsp;&nbsp; [-onlyauth
! &lt;show only &lt;auth level&gt;&gt;] [-version] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt'>&nbsp;&nbsp; [-noconns]
! [-peers] [-help]</p>
  
! <p class=preformattedtext>Where:
  -nodally&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; don't show dallying
  conns</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -allconnections&nbsp; don't filter out uninteresting connections</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -rxstats&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show Rx statistics</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -onlyserver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; only show server conns</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -onlyclient&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; only show client conns</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show AFS version id</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -noconns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show no connections</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -peers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show peers</p>
  
! <h2><a name="_Toc191662128"></a><a name="_Toc139993141"></a><a
! name="_Toc126872218"></a><a name="_Toc115417089"></a><span style='mso-bookmark:
! _Toc191662128'><span style='mso-fareast-font-family:"Times New Roman"'>4.8.
! Cache Manager debugging (cmdebug)</span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>The cmdebug.exe tool can be used to query the state of the
! AFS Cache Manager on a given machine.</p>
! 
! <p class=preformattedtext>Usage: cmdebug -servers &lt;server machine&gt; [-port
! &lt;IP port&gt;] [-long] [-refcounts] </p>
! 
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>[-callbacks] [-ctime] [-addrs] [-cache] [-cellservdb] [-help]</p>
! 
! <p class=preformattedtext>Where: -long<span style='mso-spacerun:yes'>       
! </span>print all info</p>
! 
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-refcounts<span style='mso-spacerun:yes'>   </span>print only cache
! entries with positive reference counts</p>
! 
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-callbacks<span style='mso-spacerun:yes'>   </span>print only cache
! entries with callbacks</p>
  
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-ctime<span style='mso-spacerun:yes'>       </span>print human readable
! expiration time</p>
  
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-addrs<span style='mso-spacerun:yes'>       </span>print only host
! interfaces</p>
! 
! <p class=preformattedtext><span style='mso-spacerun:yes'>      
! </span>-cache<span style='mso-spacerun:yes'>       </span>print only cache
! configuration</p>
  
! <p class=preformattedtext><span style='mso-spacerun:yes'>       </span><span
! lang=FR style='mso-ansi-language:FR'>-cellservdb<span
! style='mso-spacerun:yes'>  </span>print only cellservdb info<o:p></o:p></span></p>
! 
! <h2><a name="_Toc191662129"></a><a name="_Toc139993142"></a><a
! name="_Toc126872219"></a><a name="_Toc115417090"></a><span style='mso-bookmark:
! _Toc191662129'><span style='mso-fareast-font-family:"Times New Roman"'>4.9.
! Persistent Cache consistency check</span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>The persistent cache is stored in a Hidden System file at
  %WinDir%\TEMP\AFSCache.&nbsp; If there is a problem with the persistent cache
  that prevent the AFS Client Service from being able to start a validation check
  on the file can be performed.</p>
  
! <p class=preformattedtext>&nbsp; afsd_service.exe --validate-cache
! &lt;cache-path&gt;</p>
  
! <h2><a name="_Toc191662130"><span style='mso-fareast-font-family:"Times New Roman"'>4.10.
! Token Acquisition Debugging</span></a><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>If you are having trouble obtaining tokens with the Network
! Identity Manager AFS credential provider, it is recommended that you verify
! your ability to obtain tokens using the command-line tools <i style='mso-bidi-font-style:
! normal'>klog.exe</i> (if you are using kaserver) or <i style='mso-bidi-font-style:
! normal'>kinit.exe</i> and <i style='mso-bidi-font-style:normal'>aklog.exe</i>
! (if you are using Kerberos v5.)<span style='mso-spacerun:yes'>  </span>The
! aklog.exe <i style='mso-bidi-font-style:normal'>–d</i> option will be quite
! helpful in diagnosing Kerberos v5 related problems. </p>
! 
! <h1><a name="_Toc191662131"></a><a name="_Toc139993143"></a><a
! name="_Toc126872220"></a><a name="_Toc115417113"></a><a name="_Toc115417091"></a><a
! name="_5._Reporting_Bugs"></a><span style='mso-bookmark:_Toc191662131'><span
! style='mso-fareast-font-family:"Times New Roman"'>5. Reporting Bugs</span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <p class=MsoNormal>Bug reports should be sent to <a
! href="mailto:openafs-bugs@openafs.org?subject=Bug%20Report">openafs-bugs@openafs.org</a>.&nbsp;
! Please include as much information as possible about the issue.&nbsp; If you
! are reporting a crash, please install the debugging symbols by re-running the
  installer.&nbsp; If a dump file is available for the problem,
  %WINDIR%\TEMP\afsd.dmp, include it along with the AFS Client Trace file&nbsp;
  %WINDIR%\TEMP\afsd.log.&nbsp; The AFS Client startup log is
  %WINDIR%\TEMP\afsd_init.log.&nbsp; Send the last continuous block of&nbsp; log
  information from this file.</p>
  
! <p class=MsoNormal>Configuring DrWatson to generate dump files for crashes:</p>
  
! <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Run
  drwtsn32.exe to configure or to identify where the log and the crash dump files
  are created: </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>click
  Start &gt; Run...&nbsp; </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type
  drwtsn32 &lt;enter&gt;. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Select
  either a Crash Dump Type: Mini or Full. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Clear
  Dump Symbol Table</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Clear
  Append to Existing Log file. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Check
  Dump All Thread Contexts.</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Check
  Create Crash Dump File</p>
  
! <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Next
  run the monitoring module of Dr. Watson: </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>click
  Start &gt; Run...</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type
  drwatson &lt;enter&gt;. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Once
  a crash happens, Dr. Watson generates a dump file and a report in the log file,
  including the address of the crash and the stack dump.</p>
  
! <p class=MsoNormal>Once you have the Dr. Watson's logfile and minidump, zip
! them and attach them to your e-mail.</p>
! 
! <p class=MsoNormal>When reporting a error, please be sure to include the
! version of OpenAFS.</p>
! 
! <h1><a name="_Toc191662132"></a><a name="_Toc152605095"></a><a
! name="_Toc115416156"></a><a name="_Toc139993144"></a><a name="_Toc126872221"></a><a
! name="_Toc115417114"></a><a name="_Toc115417092"></a><span style='mso-bookmark:
! _Toc191662132'><span style='mso-bookmark:_Toc152605095'><span style='mso-bookmark:
! _Toc115416156'><span style='mso-fareast-font-family:"Times New Roman"'>6. How
! to Contribute to the Development of OpenAFS for Windows</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <p class=MsoNormal>Contributions to the development of OpenAFS for Windows are
! continuously needed.&nbsp; Contributions may take many forms including cash
! donations, support contracts, donated developer time, and even donated tech
! writer time.</p>
! 
! <h2><a name="_Toc191662133"></a><a name="_Toc152605096"></a><a
! name="_Toc115416157"></a><a name="_Toc139993145"></a><a name="_Toc126872222"></a><a
! name="_Toc115417093"></a><span style='mso-bookmark:_Toc191662133'><span
! style='mso-bookmark:_Toc152605096'><span style='mso-bookmark:_Toc115416157'><span
! style='mso-fareast-font-family:"Times New Roman"'>6.1. The USENIX OpenAFS Fund</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
! <p class=MsoBodyText><a href="http://www.usenix.org/">USENIX</a>, a 501c3
  non-profit corporation, has formed the USENIX OpenAFS Fund in order to accept
  tax deductible donations on behalf of the OpenAFS Elders. The donated funds
  will be allocated by the OpenAFS Elders to fund OpenAFS development,
--- 3355,3953 ----
  style='mso-bookmark:_Toc115416145'>Volume is online <b style='mso-bidi-font-weight:
  normal'><o:p></o:p></b></span></pre>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc115416145'><a name="_Toc193871686"></a><a
! name="_Toc193871441"></a><a name="_Toc191662118"><span style='mso-bookmark:
! _Toc193871441'><span style='mso-bookmark:_Toc193871686'><span style='mso-fareast-font-family:
! "Times New Roman"'>3.45. Literal evaluation of AFS objects via fs commands</span></span></span></a></span><span
! style='mso-bookmark:_Toc115416145'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc115416145'>Beginning with the 1.5.31 release, the fs
! commands <i style='mso-bidi-font-style:normal'>examine</i>, <i
! style='mso-bidi-font-style:normal'>flush</i>, <i style='mso-bidi-font-style:
  normal'>whereis</i>, and <i style='mso-bidi-font-style:normal'>whichcell</i>
  provide a new command-line parameter, <i style='mso-bidi-font-style:normal'>-literal</i>.<span
  style='mso-spacerun:yes'>  </span>When specified, if the evaluated object is a
  symlink or a mountpoint the resulting output will describe the specified object
  and not the object that is the target of the symlink or mountpoint.</span></p>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc115416145'><a name="_Toc193871687"></a><a
! name="_Toc193871442"></a><a name="_Toc191662119"><span style='mso-bookmark:
! _Toc193871442'><span style='mso-bookmark:_Toc193871687'><span style='mso-fareast-font-family:
! "Times New Roman"'>3.46. Out of Quota errors</span></span></span></a></span><span
  style='mso-bookmark:_Toc115416145'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc115416145'>Prior to the 1.5.31 release, out of quota
! errors were reported to the calling application as an out of space error.<span
! style='mso-spacerun:yes'>  </span>As of 1.5.31, an out of space error will
! indicate that the partition on which the volume is located is in fact out of
! space.<span style='mso-spacerun:yes'>  </span>Whereas an out of quota error
! indicates that the user does not have permission to allocate additional space.</span></p>
! 
! <h1 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc115416145'><a name="_Toc193871688"></a><a
! name="_Toc193871443"></a><a name="_Toc191662120"></a><a name="_4._How_to"></a><span
! style='mso-bookmark:_Toc193871688'><span style='mso-bookmark:_Toc193871443'><span
! style='mso-bookmark:_Toc191662120'><span style='mso-fareast-font-family:"Times New Roman"'>4.
! How to Debug Problems with OpenAFS for Windows</span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>OpenAFS
! for Windows provides a wide range of tools to assist you in debugging
! problems.&nbsp; The techniques available to you are varied because of the wide
! range of issues that have been discovered over the years.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871689"></a><a name="_Toc193871444"></a><a name="_Toc191662121"></a><a
! name="_Toc139993134"></a><a name="_Toc126872211"></a><a name="_Toc115417082"></a><span
! style='mso-bookmark:_Toc193871689'><span style='mso-bookmark:_Toc193871444'><span
! style='mso-bookmark:_Toc191662121'><span style='mso-fareast-font-family:"Times New Roman"'>4.1.
! pioctl debugging (</span></span></span></span><a href="#_Value:_IoctlDebug"><span
! style='mso-bookmark:_Toc193871689'><span style='mso-bookmark:_Toc193871444'><span
! style='mso-bookmark:_Toc191662121'><span class=Heading1Char><span
! style='mso-fareast-font-family:"Times New Roman";font-weight:normal;text-decoration:
! none;text-underline:none'>IoctlDebug</span></span></span></span></span><span
! style='mso-bookmark:_Toc193871689'><span style='mso-bookmark:_Toc193871444'><span
! style='mso-bookmark:_Toc191662121'></span></span></span></a><span
! style='mso-bookmark:_Toc193871689'><span style='mso-bookmark:_Toc193871444'><span
! style='mso-bookmark:_Toc191662121'><span style='mso-fareast-font-family:"Times New Roman"'>
! registry key)</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>pioctl
! (path-based ioctl) calls are used by various tools to communicate with the AFS
! Client Service.&nbsp; Some of the operations performed include:</p>
! 
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  tokens&nbsp; (tokens.exe, aklog.exe, afscreds.exe)</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  ACLs </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  cache parameters</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flushing
  files or volumes</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  server preferences</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>querying
  path location</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>checking
  the status of servers and volumes</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setting/querying
  the sysname list</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>pioctl
! calls are implemented by writing to a special UNC path that is processed by the
! AFS Client Service.&nbsp;&nbsp; If there is a failure to communicate with the
! AFS Client Service via SMB/CIFS, it will be impossible to perform any of the
! above operations.&nbsp;&nbsp; </p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To
! assist in debugging these problems, the registry value:</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! [HKLM\SOFTWARE\OpenAFS\Client]</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! REG_DWORD:&nbsp; IoctlDebug&nbsp;&nbsp; = 0x01</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>should
! be set.&nbsp; Then any of the commands that perform pioctl calls should be
! executed from the command prompt.&nbsp; With this key set the pioctl library
! will generate debugging output to stderr.&nbsp; The output will contain the
! Win32 API calls executed along with their most important parameters and their return
! code.&nbsp;&nbsp; The MSDN Library and the Microsoft KnowledgeBase can be used
! as a reference to help you determine the configuration probem with your system.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871690"></a><a name="_Toc193871445"></a><a name="_Toc191662122"></a><a
! name="_Toc139993135"></a><a name="_Toc126872212"></a><a name="_Toc115417083"></a><span
! style='mso-bookmark:_Toc193871690'><span style='mso-bookmark:_Toc193871445'><span
! style='mso-bookmark:_Toc191662122'><span style='mso-fareast-font-family:"Times New Roman"'>4.2.
! afsd_service initialization log (%WinDir%\TEMP\afsd_init.log)</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Every
! time the AFS Client Service starts it appends data about its progress and
! configuration to a file.&nbsp; This file provides information crucial to
! determining why the service cannot start when there are problems.&nbsp; When
! the process terminates due to a panic condition it will write to this file the
! source code file and line number of the error.&nbsp; In many cases the panic
! condition is due to a misconfiguration of the machine.&nbsp; In other cases it
! might be due to a programming error in the software.&nbsp; A quick review of
! the location in the source code will quickly reveal the reason for the
! termination.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! <i><a href="#_Value___:_MaxLogSize"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MaxLogSize</span></span></a></i>
  registry value determines the maximum size of the %WINDIR%\TEMP\afsd_init.log
  file.&nbsp; If the file is larger than this value when OpenAFS Client Service
  starts, the file will be reset to 0 bytes.&nbsp; If value is set to 0, the file
  will be allowed to grow indefinitely.</p>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871691"></a><a name="_Toc193871446"></a><a name="_Toc191662123"></a><a
! name="_Toc139993136"></a><a name="_Toc126872213"></a><a name="_Toc115417084"></a><span
! style='mso-bookmark:_Toc193871691'><span style='mso-bookmark:_Toc193871446'><span
! style='mso-bookmark:_Toc191662123'><span style='mso-fareast-font-family:"Times New Roman"'>4.3.
  afsd_service debug logs (fs trace {-on, -off, -dump}
! -&gt;%WinDir%\TEMP\afsd.log)</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>When
! attempting to debug the behavior of the SMB/CIFS Server and the Cache Manager
! it is often useful to examine a log of the operations being performed.&nbsp;
! While running the AFS Client Service keeps an in memory log of many of its
! actions.&nbsp;&nbsp; The default number of actions preserved at any one time is
! 5000.&nbsp; This can be adjusted with the <a href="#_Value_:_TraceBufferSize"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>registry value</span></span></a>:</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! REG_DWORD&nbsp; TraceBufferSize </p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A
! restart of the service is necessary when adjusting this value.&nbsp;&nbsp; Execute
! &quot;fs trace -on&quot; to clear to the log and &quot;fs trace -dump&quot; to
! output the contents of the log to the file.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871692"></a><a name="_Toc193871447"></a><a name="_Toc191662124"></a><a
! name="_Toc139993137"></a><a name="_Toc126872214"></a><a name="_Toc115417085"></a><span
! style='mso-bookmark:_Toc193871692'><span style='mso-bookmark:_Toc193871447'><span
! style='mso-bookmark:_Toc191662124'><span style='mso-fareast-font-family:"Times New Roman"'>4.4.
! Using SysInternal’s Debug Viewer, Process Monitor and Process Explorer Tools</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>An
! alternatve option to the use of &quot;fs trace -dump&quot; to capture internal
! OpenAFS Client Service events is to use a tool such as Sysinternal's <a
! href="http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Debug Viewer</span></span></a> to capture real-time
! debugging output.&nbsp; When the OpenAFS Client Service starts and Bit 2 of the
! <a href="#_Value__:_TraceOption"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>TraceOption</span></span></a>
! value in the registry is set, all trace log events are output using the Windows
! Debug Monitor interface (OutputDebugString).&nbsp; </p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
  
! <p class=preformattedtext style='text-indent:12.0pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>REG_DWORD&nbsp;&nbsp;
  TraceOption = 0x04</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Use
! “fs trace –on” and “fs trace –off” to toggle the generation of log messages. </p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc115416150"></a><a name="_Toc126872215"></a><a name="_Toc115417086"></a><span
! style='mso-bookmark:_Toc115416150'>Sysinternal’s </span><a
! href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx"><span
! style='mso-bookmark:_Toc115416150'><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Process
! Monitor</span></span></span><span style='mso-bookmark:_Toc115416150'></span></a><span
! style='mso-bookmark:_Toc115416150'> can be use to monitor the file operations
  requested by applications and their success or failure.&nbsp;&nbsp; </span></p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>In
! Process Monitor, set a filter to include only events on file paths that refer
! to the AFS name space. Be sure to include both the UNC path as well as any
! drive letters mapped to AFS. </p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Turn
! on the <i>Clock Time</i> and <i>Show Milliseconds</i> options in both tools to
! make it easier to synchronize the application requests and the resulting
! OpenAFS Client Service operations.&nbsp;&nbsp; The captured data can be stored
! to files for inclusion in <a href="#_5._Reporting_Bugs:"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>bug reports</span></span></a>.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Sysinternal's
! <a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Process Explorer</span></span></a> is a replacement for
! the Windows Task Manager and so much more.&nbsp; Process Explorer can be
! configured to use the DbgHelp.dll from &quot;<a
! href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Microsoft Debugging Tools for Windows</span></span></a>&quot;
! as well as the debug symbols shipped as an optional component of the OpenAFS
! for Windows installer.&nbsp; (Options-&gt;Configure Symbols)&nbsp;&nbsp; Once
! configured the &quot;Threads&quot; tab of the process properties dialog will
! permit the viewing of a fully documented stack for each displayed thread.&nbsp;
! Hint: If there is a deadlock in the cache manager, two or more of the threads
! will be stuck in a call to osi_TWait().</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871693"></a><a name="_Toc193871448"></a><a name="_Toc191662125"><span
! style='mso-bookmark:_Toc193871448'><span style='mso-bookmark:_Toc193871693'><span
! style='mso-fareast-font-family:"Times New Roman"'>4.5. Microsoft MiniDumps <br>
! (fs minidump -&gt; %WinDir%\TEMP\afsd.dmp)</span></span></span></a><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! the AFS Client Service become unresponsive to any form of communication there
! may be a serious error that can only be debugged by someone with access to the
! source code and a debugger.&nbsp;&nbsp; The &quot;fs minidump&quot; command can
! be used to force the generation of a MiniDump file containing the state of all
! of the threads in the AFS Client Service process.&nbsp; The most accurate
! MiniDump files will be produced after installing &quot;<a
! href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>Microsoft Debugging Tools for Windows</span></span></a>&quot;.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! <a href="#_Toc190064189"><span class=Heading1Char><span style='font-size:14.0pt;
! text-decoration:none;text-underline:none'>MiniDumpType</span></span></a>
! registry value can be used to adjust the scope of the process information
! included within the dump file.&nbsp; By default the MiniDump only contains the
! stacks of all threads and the values of all global variables.&nbsp; A much more
! useful MiniDump is one that contains the contents of the heap.&nbsp; Be warned,
! a MiniDump with heap will be as large as the cache file.&nbsp; In addition, it
! will include all of the data stored within the cache.&nbsp; If there are
! privacy concerns, do not produce a MiniDump with heap.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871694"></a><a name="_Toc193871449"></a><a name="_Toc191662126"></a><a
! name="_Toc139993139"></a><a name="_Toc126872216"></a><a name="_Toc115417087"></a><span
! style='mso-bookmark:_Toc193871694'><span style='mso-bookmark:_Toc193871449'><span
! style='mso-bookmark:_Toc191662126'><span style='mso-fareast-font-family:"Times New Roman"'>4.6.
! Single Sign-on (Integrated Logon) debugging</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! you are having trouble with the Integrated Logon operations it is often useful
! to be able to obtain a log of what it is attempting to do.&nbsp;&nbsp; Setting
! Bit 0 of the <a href="#_Value__:_TraceOption"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>TraceOption</span></span></a>
! registry value:</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! REG_DWORD&nbsp;&nbsp; TraceOption = 0x01</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>will
! instruct the Integrated Logon Network Provider and Event Handlers to log
! information to the Windows Event Log: Application under the name “AFS
! Logon&quot;.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871695"></a><a name="_Toc193871450"></a><a name="_Toc191662127"></a><a
! name="_Toc139993140"></a><a name="_Toc126872217"></a><a name="_Toc115417088"></a><span
! style='mso-bookmark:_Toc193871695'><span style='mso-bookmark:_Toc193871450'><span
! style='mso-bookmark:_Toc191662127'><span style='mso-fareast-font-family:"Times New Roman"'>4.7.
! RX (AFS RPC) debugging (rxdebug)</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! rxdebug.exe tool can be used to query a variety of information about the AFS
! services installed on a given machine.&nbsp; The port for the AFS Cache Manager
! is 7001.&nbsp; </p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Usage:
! rxdebug -servers &lt;server machine&gt; [-port &lt;IP port&gt;] [-nodally] </p>
! 
! <p class=preformattedtext style='margin-left:35.45pt;text-indent:35.45pt;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;
  [-allconnections] [-rxstats] [-onlyserver] [-onlyclient] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;
! [-onlyport &lt;show only &lt;port&gt;&gt;] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;
! [-onlyhost &lt;show only &lt;host&gt;&gt;] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;
! [-onlyauth &lt;show only &lt;auth level&gt;&gt;] [-version] </p>
  
! <p class=preformattedtext style='margin-left:70.9pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;
! [-noconns] [-peers] [-help]</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Where:
  -nodally&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; don't show dallying
  conns</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -allconnections&nbsp; don't filter out uninteresting connections</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -rxstats&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show Rx statistics</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -onlyserver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; only show server conns</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -onlyclient&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; only show client conns</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show AFS version id</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -noconns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show no connections</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -peers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show peers</p>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871696"></a><a name="_Toc193871451"></a><a name="_Toc191662128"></a><a
! name="_Toc139993141"></a><a name="_Toc126872218"></a><a name="_Toc115417089"></a><span
! style='mso-bookmark:_Toc193871696'><span style='mso-bookmark:_Toc193871451'><span
! style='mso-bookmark:_Toc191662128'><span style='mso-fareast-font-family:"Times New Roman"'>4.8.
! Cache Manager debugging (cmdebug)</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! cmdebug.exe tool can be used to query the state of the AFS Cache Manager on a
! given machine.</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Usage:
! cmdebug -servers &lt;server machine&gt; [-port &lt;IP port&gt;] [-long]
! [-refcounts] </p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span>[-callbacks] [-ctime] [-addrs] [-cache]
! [-cellservdb] [-help]</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Where:
! -long<span style='mso-spacerun:yes'>        </span>print all info</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span>-refcounts<span
! style='mso-spacerun:yes'>   </span>print only cache entries with positive
! reference counts</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span>-callbacks<span
! style='mso-spacerun:yes'>   </span>print only cache entries with callbacks</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span>-ctime<span
! style='mso-spacerun:yes'>       </span>print human readable expiration time</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span>-addrs<span
! style='mso-spacerun:yes'>       </span>print only host interfaces</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span>-cache<span
! style='mso-spacerun:yes'>       </span>print only cache configuration</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-spacerun:yes'>       </span><span lang=FR style='mso-ansi-language:
! FR'>-cellservdb<span style='mso-spacerun:yes'>  </span>print only cellservdb
! info<o:p></o:p></span></p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871697"></a><a name="_Toc193871452"></a><a name="_Toc191662129"></a><a
! name="_Toc139993142"></a><a name="_Toc126872219"></a><a name="_Toc115417090"></a><span
! style='mso-bookmark:_Toc193871697'><span style='mso-bookmark:_Toc193871452'><span
! style='mso-bookmark:_Toc191662129'><span style='mso-fareast-font-family:"Times New Roman"'>4.9.
! Persistent Cache consistency check</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! persistent cache is stored in a Hidden System file at
  %WinDir%\TEMP\AFSCache.&nbsp; If there is a problem with the persistent cache
  that prevent the AFS Client Service from being able to start a validation check
  on the file can be performed.</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! afsd_service.exe --validate-cache &lt;cache-path&gt;</p>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871698"></a><a name="_Toc193871453"></a><a name="_Toc191662130"><span
! style='mso-bookmark:_Toc193871453'><span style='mso-bookmark:_Toc193871698'><span
! style='mso-fareast-font-family:"Times New Roman"'>4.10. Token Acquisition
! Debugging</span></span></span></a><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! you are having trouble obtaining tokens with the Network Identity Manager AFS
! credential provider, it is recommended that you verify your ability to obtain
! tokens using the command-line tools <i style='mso-bidi-font-style:normal'>klog.exe</i>
! (if you are using kaserver) or <i style='mso-bidi-font-style:normal'>kinit.exe</i>
! and <i style='mso-bidi-font-style:normal'>aklog.exe</i> (if you are using
! Kerberos v5.)<span style='mso-spacerun:yes'>  </span>The aklog.exe <i
! style='mso-bidi-font-style:normal'>–d</i> option will be quite helpful in
! diagnosing Kerberos v5 related problems. </p>
! 
! <h1 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871699"></a><a name="_Toc193871454"></a><a name="_Toc191662131"></a><a
! name="_Toc139993143"></a><a name="_Toc126872220"></a><a name="_Toc115417113"></a><a
! name="_Toc115417091"></a><a name="_5._Reporting_Bugs"></a><span
! style='mso-bookmark:_Toc193871699'><span style='mso-bookmark:_Toc193871454'><span
! style='mso-bookmark:_Toc191662131'><span style='mso-fareast-font-family:"Times New Roman"'>5.
! Reporting Bugs</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h1>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Bug
! reports should be sent to <a
! href="mailto:openafs-bugs@openafs.org?subject=Bug%20Report"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>openafs-bugs@openafs.org</span></span></a>.&nbsp; Please
! include as much information as possible about the issue.&nbsp; If you are
! reporting a crash, please install the debugging symbols by re-running the
  installer.&nbsp; If a dump file is available for the problem,
  %WINDIR%\TEMP\afsd.dmp, include it along with the AFS Client Trace file&nbsp;
  %WINDIR%\TEMP\afsd.log.&nbsp; The AFS Client startup log is
  %WINDIR%\TEMP\afsd_init.log.&nbsp; Send the last continuous block of&nbsp; log
  information from this file.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Configuring
! DrWatson to generate dump files for crashes:</p>
  
! <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Run
  drwtsn32.exe to configure or to identify where the log and the crash dump files
  are created: </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>click
  Start &gt; Run...&nbsp; </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type
  drwtsn32 &lt;enter&gt;. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Select
  either a Crash Dump Type: Mini or Full. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Clear
  Dump Symbol Table</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Clear
  Append to Existing Log file. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Check
  Dump All Thread Contexts.</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Check
  Create Crash Dump File</p>
  
! <p class=MsoNormal style='margin-left:14.15pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Next
  run the monitoring module of Dr. Watson: </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>click
  Start &gt; Run...</p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type
  drwatson &lt;enter&gt;. </p>
  
! <p class=MsoNormal style='margin-left:49.6pt;text-indent:-14.15pt;tab-stops:
! 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
  style='font-size:9.0pt;font-family:Symbol'>·</span><span style='font-size:7.0pt;
  font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Once
  a crash happens, Dr. Watson generates a dump file and a report in the log file,
  including the address of the crash and the stack dump.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Once
! you have the Dr. Watson's logfile and minidump, zip them and attach them to
! your e-mail.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>When
! reporting a error, please be sure to include the version of OpenAFS.</p>
! 
! <h1 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871700"></a><a name="_Toc193871455"></a><a name="_Toc191662132"></a><a
! name="_Toc152605095"></a><a name="_Toc115416156"></a><a name="_Toc139993144"></a><a
! name="_Toc126872221"></a><a name="_Toc115417114"></a><a name="_Toc115417092"></a><a
! name="_6._How_to"></a><span style='mso-bookmark:_Toc193871700'><span
! style='mso-bookmark:_Toc193871455'><span style='mso-bookmark:_Toc191662132'><span
! style='mso-bookmark:_Toc152605095'><span style='mso-bookmark:_Toc115416156'><span
! style='mso-fareast-font-family:"Times New Roman"'>6. How to Contribute to the
! Development of OpenAFS for Windows</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Contributions
! to the development of OpenAFS for Windows are continuously needed.&nbsp;
! Contributions may take many forms including cash donations, support contracts,
! donated developer time, and even donated tech writer time.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871701"></a><a name="_Toc193871456"></a><a name="_Toc191662133"></a><a
! name="_Toc152605096"></a><a name="_Toc115416157"></a><a name="_Toc139993145"></a><a
! name="_Toc126872222"></a><a name="_Toc115417093"></a><span style='mso-bookmark:
! _Toc193871701'><span style='mso-bookmark:_Toc193871456'><span style='mso-bookmark:
! _Toc191662133'><span style='mso-bookmark:_Toc152605096'><span style='mso-bookmark:
! _Toc115416157'><span style='mso-fareast-font-family:"Times New Roman"'>6.1. The
! USENIX OpenAFS Fund</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! href="http://www.usenix.org/"><span style='mso-bookmark:_Toc193871702'><span
! style='mso-bookmark:_Toc193871457'><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>USENIX</span></span></span></span><span
! style='mso-bookmark:_Toc193871457'></span><span style='mso-bookmark:_Toc193871702'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871457"></a><a name="_Toc193871702"></a><![endif]>, a 501c3
  non-profit corporation, has formed the USENIX OpenAFS Fund in order to accept
  tax deductible donations on behalf of the OpenAFS Elders. The donated funds
  will be allocated by the OpenAFS Elders to fund OpenAFS development,
***************
*** 3444,3719 ****
  
  </div>
  
! <p class=MsoBodyText>Donations can be made by sending a check, drawn on a U.S.
! bank, made out to the USENIX OpenAFS Fund or by making a <a
! href="https://db.usenix.org/cgi-bin/openafs/openafs.cgi">donation online</a>.</p>
! 
! <h2><a name="_Toc191662134"></a><a name="_Toc152605097"></a><a
! name="_Toc115417094"></a><a name="_Toc139993146"></a><a name="_Toc126872223"></a><span
! style='mso-bookmark:_Toc191662134'><span style='mso-bookmark:_Toc152605097'><span
! style='mso-bookmark:_Toc115417094'><span style='mso-fareast-font-family:"Times New Roman"'>6.2.
! Secure Endpoints Inc.</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'> <o:p></o:p></span></h2>
! 
! <p class=MsoBodyText><a href="http://www.secure-endpoints.com/">Secure
! Endpoints Inc.</a> provides development and support services for OpenAFS for
! Windows and <a href="http://web.mit.edu/kerberos/">MIT Kerberos for Windows</a>.
! &nbsp;Donations provided to Secure Endpoints Inc. for the development of
! OpenAFS are used to cover the OpenAFS gatekeeper responsibilities; providing
! support to the OpenAFS community via the OpenAFS mailing lists; and furthering
! development of desired features that are either too small to be financed by
! development contracts.</p>
! 
! <p class=MsoBodyText>Secure Endpoints Inc. accepts software development
! agreements from organizations who wish to fund a well-defined set of bug fixes
! or new features. </p>
! 
! <p class=MsoBodyText>Secure Endpoints Inc. provides contract based support for
! the OpenAFS for Windows and the <a href="http://web.mit.edu/kerberos/">MIT
! Kerberos for Windows</a> products. </p>
! 
! <h2><a name="_Toc191662135"></a><a name="_Toc152605098"></a><a
! name="_Toc115417096"></a><a name="_Toc139993147"></a><a name="_Toc126872224"></a><a
! name="_Toc139993148"></a><a name="_Toc126872225"></a><span style='mso-bookmark:
! _Toc191662135'><span style='mso-bookmark:_Toc152605098'><span style='mso-bookmark:
! _Toc115417096'><span style='mso-fareast-font-family:"Times New Roman"'>6.3.
! Direct contributions of code and/or documentation</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
! <p class=MsoBodyText>Organizations that use OpenAFS in house and have
! development staffs are encouraged to contribute any code modifications they
! make to OpenAFS.org via <u><span style='color:blue'>openafs-bugs@openafs.org</span></u>.
! &nbsp;Contributions of documentation are highly desired. </p>
! 
! <h2><a name="_Toc191662136"></a><a name="_Toc152605099"></a><a
! name="_Toc115417097"></a><a name="_Toc139993149"></a><a name="_Toc126872226"></a><span
! style='mso-bookmark:_Toc191662136'><span style='mso-bookmark:_Toc152605099'><span
! style='mso-bookmark:_Toc115417097'><span style='mso-fareast-font-family:"Times New Roman"'>6.4.
! OpenAFS for Windows Mailing Lists</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>If you wish to participate in OpenAFS for Windows
! development please join the <i><a
! href="mailto:openafs-win32-devel@openafs.org?subject=OpenAFS%20for%20Windows%20Development%20Contribution">openafs-win32-devel@openafs.org</a></i>
! mailing list.</p>
  
! <p class=MsoNormal style='margin-left:35.45pt'><span class=MsoHyperlink>https://lists.openafs.org/mailman/listinfo/openafs-win32-devel</span></p>
  
! <p class=MsoNormal>User questions should be sent to the <a
! href="mailto:openafs-info@openafs.org?subject=OpenAFS%20for%20Windows%20User%20Question">openafs-info@openafs.org</a>
! mailing list.&nbsp; </p>
! 
! <p class=MsoNormal style='margin-left:35.45pt'><span class=MsoHyperlink>https://lists.openafs.org/mailman/listinfo/openafs-info</span></p>
! 
! <p class=MsoNormal>You must join the mailing lists if you wish to post to the
! list without incurring a moderation delay.</p>
! 
! <h1><a name="_Toc191662137"></a><a name="_Toc152605100"></a><a
! name="_Toc139993150"></a><a name="_Toc126872227"></a><a name="_Toc115417115"></a><a
! name="_Toc115417098"></a><a name="_Toc115416158"></a><a
! name="_MSI_Deployment_Guide"></a><span style='mso-bookmark:_Toc191662137'><span
! style='mso-bookmark:_Toc152605100'><span style='mso-fareast-font-family:"Times New Roman"'>7.
! MSI Deployment Guide</span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h1>
  
! <i><span style='font-size:16.0pt;font-family:"Albany","sans-serif";mso-fareast-font-family:
  "Times New Roman";mso-bidi-font-family:"Times New Roman";mso-ansi-language:
  EN-US;mso-fareast-language:JA;mso-bidi-language:AR-SA'><br clear=all
  style='page-break-before:always'>
! </span></i>
  
! <h2><a name="_Toc191662138"></a><a name="_Toc152605101"></a><a
! name="_Toc115416159"></a><a name="_Toc139993151"></a><a name="_Toc126872228"></a><a
! name="_Toc115417099"></a><span style='mso-bookmark:_Toc191662138'><span
! style='mso-bookmark:_Toc152605101'><span style='mso-bookmark:_Toc115416159'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.1. Introduction</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>A MSI installer option is available for those who wish to
! use Windows Installer for installing OpenAFS and for organizations that wish to
! deploy OpenAFS through Group Policy.&nbsp; The first version of OpenAFS for
! Windows available as an MSI was 1.3.65.</p>
! 
! <p class=MsoNormal>This document provides a guide for authoring transforms used
! to customize the MSI package for a particular organization.&nbsp; Although many
! settings can be deployed via transforms, in an Active Directory environment it
! is advisable to deploy registry settings&nbsp;&nbsp;&nbsp; and configuration
! files through group policy and/or startup scripts so that machines where
! OpenAFS for Windows is already installed will pick up these customizations.</p>
! 
! <h3><a name="_Toc191662139"></a><a name="_Toc152605102"></a><a
! name="_Toc115416160"></a><a name="_Toc139993152"></a><a name="_Toc126872229"></a><span
! style='mso-bookmark:_Toc191662139'><span style='mso-bookmark:_Toc152605102'><span
! style='mso-bookmark:_Toc115416160'><span style='mso-fareast-font-family:"Times New Roman"'>7.1.1
! Requirements</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>The information in this document applies to MSI packages
! distributed with OpenAFS for Windows releases from 1.3.65 and onwards or MSI
! packages built from corresponding source releases. &nbsp;Not all releases
! support all the configuration options documented here.</p>
! 
! <p class=MsoNormal>Authoring a &quot;Windows Installer&quot; transform requires
! additional software for editing the MSI database tables and generating the
! transform from the modified MSI package.&nbsp; ORCA.EXE and MSITRAN.EXE which
! are included in the Windows Platform SDK (&quot;Windows Installer&quot; SDK)
! can be used for this purpose.</p>
! 
! <p class=MsoNormal>For reference, the schema for the MSI package is based on
! SCHEMA.MSI distributed with the Platform SDK.</p>
! 
! <p class=MsoNormal>For general information about &quot;Windows Installer&quot;,
! refer to:</p>
! 
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; <a
! href="http://msdn.microsoft.com/library/en-us/msi/setup/windows_installer_start_page.asp">http://msdn.microsoft.com/library/en-us/msi/setup/windows_installer_start_page.asp</a></p>
! 
! <p class=MsoNormal>For general information about authoring MSI transforms,
! refer to:</p>
! 
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; <a
! href="http://msdn.microsoft.com/library/en-us/msi/setup/transforms.asp">http://msdn.microsoft.com/library/en-us/msi/setup/transforms.asp</a></p>
! 
! <p class=MsoNormal>The remainder of this document assumes some familiarity with
! authoring transforms.&nbsp; While the MSDN documentation for Windows Installer
! is a bit dense, the guide on MSI transforms found at the second link above is recommended
! reading.&nbsp; MSDN also includes a step-by-step example for creating a
! transform at:</p>
! 
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; <a
! href="http://msdn.microsoft.com/library/en-us/msi/setup/a_customization_transform_example.asp">http://msdn.microsoft.com/library/en-us/msi/setup/a_customization_transform_example.asp</a></p>
! 
! <h3><a name="_Toc191662140"></a><a name="_Toc152605103"></a><a
! name="_Toc115416161"></a><a name="_Toc139993153"></a><a name="_Toc126872230"></a><span
! style='mso-bookmark:_Toc191662140'><span style='mso-bookmark:_Toc152605103'><span
! style='mso-bookmark:_Toc115416161'><span style='mso-fareast-font-family:"Times New Roman"'>7.1.2
! Authoring a Transform</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>Transforms describe a set of modifications to be performed
! on an existing MSI for the purpose of customizing it.&nbsp; This is ordinarily
! done by making a copy of the MSI to be customized, modifying the copy and then
! using the old and the new MSI to generate a transform.&nbsp; For example:</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in'>1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>copy openafs.msi openafs-modified.msi</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>(edit the openafs-modified.msi to include the necessary changes)</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in'>3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>msitran -g openafs.msi openafs-modified.msi openafs-transform.mst</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in'>4.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>(generates openafs-transform.mst, which is the transform)</p>
  
! <p class=MsoNormal>Transforms have an extension of .mst.&nbsp; 'msitran' is a
! tool distributed as part of the &quot;Windows Installer&quot; SDK (part of the
! Windows Platform SDK).</p>
  
! <p class=MsoNormal>You can test a transform by:</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in'>1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>copy openafs.msi openafs-test.msi</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>msitran -a openafs-transform.mst openafs-test.msi</p>
  
! <p class=MsoNormal>and then checking the resulting openafs-test.msi to see if
! all changes you have made above to openafs-modified.msi is present in
! openafs-test.msi.&nbsp; 'msitran' will complain if some modification in the
! transform can not be successfully applied.</p>
! 
! <p class=MsoNormal>As mentioned above, you can use a tool like ORCA.EXE to edit
! the MSI databases directly when editing openafs-modified.msi.&nbsp; More
! details are given below.</p>
! 
! <h2><a name="_Toc191662141"></a><a name="_Toc152605104"></a><a
! name="_Toc115416162"></a><a name="_Toc139993154"></a><a name="_Toc126872231"></a><a
! name="_Toc115417100"></a><span style='mso-bookmark:_Toc191662141'><span
! style='mso-bookmark:_Toc152605104'><span style='mso-bookmark:_Toc115416162'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.2. Configuration Options</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>The logic necessary to implement many of the settings
! described in <a href="#_Appendix_A:_Registry_Values">Appendix A</a> are present
! in the MSI.&nbsp; Most of these can be controlled by setting the corresponding
! properties to the desired value.&nbsp; Some settings may require modifying
! existing registry entries (though not recommended) or adding new resources
! (like files or registry keys).&nbsp; Instructions for performing these tasks
! are below.</p>
! 
! <h3><a name="_Toc191662142"></a><a name="_Toc152605105"></a><a
! name="_Toc115416163"></a><a name="_Toc139993155"></a><a name="_Toc126872232"></a><span
! style='mso-bookmark:_Toc191662142'><span style='mso-bookmark:_Toc152605105'><span
! style='mso-bookmark:_Toc115416163'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1
! Configurable Properties</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>Most configurable properties correspond to registry keys or
! values.&nbsp; Due to the logic invoked based on the existence of these registry
! keys or values, they are only set if the associated property is defined to have
! a non null value.&nbsp; If the associated property is not defined in the MSI,
! the registry key or value will not be touched.&nbsp; By default, the MSI does
! not contain these properties and hence will not set the registry keys.&nbsp;
! You will need to add properties as needed to the MSI.</p>
! 
! <p class=MsoNormal>When one of the configurable properties is set, the
! installer will use the property value to set the corresponding setting in the
! HKEY_LOCAL_MACHINE registry hive.&nbsp; The HKEY_CURRENT_USER hive is not
! touched by the installer.</p>
! 
! <p class=MsoNormal>For each property, the associated registry setting is
! referenced by the same text used in <a href="#_Appendix_A:_Registry_Values">Appendix
! A</a>.</p>
! 
! <p class=MsoNormal>Strings are quoted using single quotes (e.g. 'a string'). An
! empty string is denoted as ''.&nbsp; Note that you can't author null values
! into the 'Property' table.</p>
! 
! <p class=MsoNormal>Numeric values should be authored as decimal strings.</p>
! 
! <h4><a name="_Toc191662143"></a><a name="_Toc152605106"></a><a
! name="_Toc115416164"></a><a name="_Toc139993156"></a><a name="_Toc126872233"></a><span
! style='mso-bookmark:_Toc191662143'><span style='mso-bookmark:_Toc152605106'><span
! style='mso-bookmark:_Toc115416164'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.1
  Setting Properties</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=MsoNormal>In order to set a property,</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in'><span style='font-size:9.0pt'>1.</span><span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Open the MSI in ORCA.EXE</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in'><span style='font-size:9.0pt'>2.</span><span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Select the 'Property' table from the list of tables on the left.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in'><span style='font-size:9.0pt'>3.</span><span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
! </span>Find the property in the list of properties on the right, double click
! the value and type the new value.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in'><span style='font-size:9.0pt'>4.</span><span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>If the property does not exist in the property list, right click the
  list and select 'Add Row', type the property name and the desired value.</p>
  
! <h4><a name="_Toc191662144"></a><a name="_Toc152605107"></a><a
! name="_Toc115416165"></a><a name="_Toc139993157"></a><a name="_Toc126872234"></a><span
! style='mso-bookmark:_Toc191662144'><span style='mso-bookmark:_Toc152605107'><span
! style='mso-bookmark:_Toc115416165'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.2
  OpenAFS for Windows Properties</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h4>
  
--- 3973,4331 ----
  
  </div>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Donations
! can be made by sending a check, drawn on a U.S. bank, made out to the USENIX
! OpenAFS Fund or by making a <a
! href="https://db.usenix.org/cgi-bin/openafs/openafs.cgi"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>donation online</span></span></a>.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871703"></a><a name="_Toc193871458"></a><a name="_Toc191662134"></a><a
! name="_Toc152605097"></a><a name="_Toc115417094"></a><a name="_Toc139993146"></a><a
! name="_Toc126872223"></a><span style='mso-bookmark:_Toc193871703'><span
! style='mso-bookmark:_Toc193871458'><span style='mso-bookmark:_Toc191662134'><span
! style='mso-bookmark:_Toc152605097'><span style='mso-bookmark:_Toc115417094'><span
! style='mso-fareast-font-family:"Times New Roman"'>6.2. Secure Endpoints Inc.</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! href="http://www.secure-endpoints.com/"><span style='mso-bookmark:_Toc193871704'><span
! style='mso-bookmark:_Toc193871459'><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Secure
! Endpoints Inc.</span></span></span></span><span style='mso-bookmark:_Toc193871459'></span><span
! style='mso-bookmark:_Toc193871704'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871459"></a><a name="_Toc193871704"></a><![endif]> provides
! development and support services for OpenAFS for Windows and <a
! href="http://web.mit.edu/kerberos/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MIT Kerberos
! for Windows</span></span></a>. &nbsp;Donations provided to Secure Endpoints
! Inc. for the development of OpenAFS are used to cover the OpenAFS gatekeeper
! responsibilities; providing support to the OpenAFS community via the OpenAFS
! mailing lists; and furthering development of desired features that are either
! too small to be financed by development contracts.</p>
! 
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Secure
! Endpoints Inc. accepts software development agreements from organizations who
! wish to fund a well-defined set of bug fixes or new features. </p>
! 
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Secure
! Endpoints Inc. provides contract based support for the OpenAFS for Windows and
! the <a href="http://web.mit.edu/kerberos/"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>MIT Kerberos
! for Windows</span></span></a> products. </p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871705"></a><a name="_Toc193871460"></a><a name="_Toc191662135"></a><a
! name="_Toc152605098"></a><a name="_Toc115417096"></a><a name="_Toc139993147"></a><a
! name="_Toc126872224"></a><a name="_Toc139993148"></a><a name="_Toc126872225"></a><span
! style='mso-bookmark:_Toc193871705'><span style='mso-bookmark:_Toc193871460'><span
! style='mso-bookmark:_Toc191662135'><span style='mso-bookmark:_Toc152605098'><span
! style='mso-bookmark:_Toc115417096'><span style='mso-fareast-font-family:"Times New Roman"'>6.3.
! Direct contributions of code and/or documentation</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'> <o:p></o:p></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Organizations
! that use OpenAFS in house and have development staffs are encouraged to
! contribute any code modifications they make to OpenAFS.org via <u><span
! style='color:blue'>openafs-bugs@openafs.org</span></u>. &nbsp;Contributions of
! documentation are highly desired. </p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871706"></a><a name="_Toc193871461"></a><a name="_Toc191662136"></a><a
! name="_Toc152605099"></a><a name="_Toc115417097"></a><a name="_Toc139993149"></a><a
! name="_Toc126872226"></a><span style='mso-bookmark:_Toc193871706'><span
! style='mso-bookmark:_Toc193871461'><span style='mso-bookmark:_Toc191662136'><span
! style='mso-bookmark:_Toc152605099'><span style='mso-bookmark:_Toc115417097'><span
! style='mso-fareast-font-family:"Times New Roman"'>6.4. OpenAFS for Windows Mailing
! Lists</span></span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! you wish to participate in OpenAFS for Windows development please join the <i><a
! href="mailto:openafs-win32-devel@openafs.org?subject=OpenAFS%20for%20Windows%20Development%20Contribution"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>openafs-win32-devel@openafs.org</span></span></a></i>
! mailing list.</p>
  
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871707"></a><a name="_Toc193871462"><span style='mso-bookmark:
! _Toc193871707'><span class=Heading1Char><span style='font-size:14.0pt'>https://lists.openafs.org/mailman/listinfo/openafs-win32-devel</span></span></span></a></p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>User
! questions should be sent to the <a
! href="mailto:openafs-info@openafs.org?subject=OpenAFS%20for%20Windows%20User%20Question"><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>openafs-info@openafs.org</span></span></a> mailing
! list.&nbsp; </p>
! 
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871708"></a><a name="_Toc193871463"><span style='mso-bookmark:
! _Toc193871708'><span class=Heading1Char><span style='font-size:14.0pt'>https://lists.openafs.org/mailman/listinfo/openafs-info</span></span></span></a></p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>You
! must join the mailing lists if you wish to post to the list without incurring a
! moderation delay.</p>
! 
! <h1 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871709"></a><a name="_Toc193871464"></a><a name="_Toc191662137"></a><a
! name="_Toc152605100"></a><a name="_Toc139993150"></a><a name="_Toc126872227"></a><a
! name="_Toc115417115"></a><a name="_Toc115417098"></a><a name="_Toc115416158"></a><a
! name="_MSI_Deployment_Guide"></a><a name="_7._MSI_Deployment"></a><span
! style='mso-bookmark:_Toc193871709'><span style='mso-bookmark:_Toc193871464'><span
! style='mso-bookmark:_Toc191662137'><span style='mso-bookmark:_Toc152605100'><span
! style='mso-fareast-font-family:"Times New Roman"'>7. MSI Deployment Guide</span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <b><span style='font-size:16.0pt;font-family:"Albany","sans-serif";mso-fareast-font-family:
  "Times New Roman";mso-bidi-font-family:"Times New Roman";mso-ansi-language:
  EN-US;mso-fareast-language:JA;mso-bidi-language:AR-SA'><br clear=all
  style='page-break-before:always'>
! </span></b>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871710"></a><a name="_Toc193871465"></a><a name="_Toc191662138"></a><a
! name="_Toc152605101"></a><a name="_Toc115416159"></a><a name="_Toc139993151"></a><a
! name="_Toc126872228"></a><a name="_Toc115417099"></a><span style='mso-bookmark:
! _Toc193871710'><span style='mso-bookmark:_Toc193871465'><span style='mso-bookmark:
! _Toc191662138'><span style='mso-bookmark:_Toc152605101'><span style='mso-bookmark:
! _Toc115416159'><span style='mso-fareast-font-family:"Times New Roman"'>7.1.
! Introduction</span></span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A
! MSI installer option is available for those who wish to use Windows Installer
! for installing OpenAFS and for organizations that wish to deploy OpenAFS
! through Group Policy.&nbsp; The first version of OpenAFS for Windows available
! as an MSI was 1.3.65.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>This
! document provides a guide for authoring transforms used to customize the MSI
! package for a particular organization.&nbsp; Although many settings can be
! deployed via transforms, in an Active Directory environment it is advisable to
! deploy registry settings&nbsp;&nbsp;&nbsp; and configuration files through
! group policy and/or startup scripts so that machines where OpenAFS for Windows
! is already installed will pick up these customizations.</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871711"></a><a name="_Toc193871466"></a><a name="_Toc191662139"></a><a
! name="_Toc152605102"></a><a name="_Toc115416160"></a><a name="_Toc139993152"></a><a
! name="_Toc126872229"></a><span style='mso-bookmark:_Toc193871711'><span
! style='mso-bookmark:_Toc193871466'><span style='mso-bookmark:_Toc191662139'><span
! style='mso-bookmark:_Toc152605102'><span style='mso-bookmark:_Toc115416160'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.1.1 Requirements</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! information in this document applies to MSI packages distributed with OpenAFS
! for Windows releases from 1.3.65 and onwards or MSI packages built from
! corresponding source releases. &nbsp;Not all releases support all the
! configuration options documented here.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Authoring
! a &quot;Windows Installer&quot; transform requires additional software for
! editing the MSI database tables and generating the transform from the modified
! MSI package.&nbsp; ORCA.EXE and MSITRAN.EXE which are included in the Windows
! Platform SDK (&quot;Windows Installer&quot; SDK) can be used for this purpose.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>For
! reference, the schema for the MSI package is based on SCHEMA.MSI distributed
! with the Platform SDK.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>For
! general information about &quot;Windows Installer&quot;, refer to:</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! <a
! href="http://msdn.microsoft.com/library/en-us/msi/setup/windows_installer_start_page.asp"><span
! style='mso-bookmark:_Toc193871712'><span style='mso-bookmark:_Toc193871467'><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>http://msdn.microsoft.com/library/en-us/msi/setup/windows_installer_start_page.asp</span></span></span></span><span
! style='mso-bookmark:_Toc193871467'></span><span style='mso-bookmark:_Toc193871712'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871467"></a><a name="_Toc193871712"></a><![endif]></p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>For
! general information about authoring MSI transforms, refer to:</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! <a href="http://msdn.microsoft.com/library/en-us/msi/setup/transforms.asp"><span
! style='mso-bookmark:_Toc193871713'><span style='mso-bookmark:_Toc193871468'><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>http://msdn.microsoft.com/library/en-us/msi/setup/transforms.asp</span></span></span></span><span
! style='mso-bookmark:_Toc193871468'></span><span style='mso-bookmark:_Toc193871713'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871468"></a><a name="_Toc193871713"></a><![endif]></p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! remainder of this document assumes some familiarity with authoring
! transforms.&nbsp; While the MSDN documentation for Windows Installer is a bit
! dense, the guide on MSI transforms found at the second link above is
! recommended reading.&nbsp; MSDN also includes a step-by-step example for
! creating a transform at:</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! <a
! href="http://msdn.microsoft.com/library/en-us/msi/setup/a_customization_transform_example.asp"><span
! style='mso-bookmark:_Toc193871714'><span style='mso-bookmark:_Toc193871469'><span
! class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
! text-underline:none'>http://msdn.microsoft.com/library/en-us/msi/setup/a_customization_transform_example.asp</span></span></span></span><span
! style='mso-bookmark:_Toc193871469'></span><span style='mso-bookmark:_Toc193871714'></span></a><![if !supportNestedAnchors]><a
! name="_Toc193871469"></a><a name="_Toc193871714"></a><![endif]></p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871715"></a><a name="_Toc193871470"></a><a name="_Toc191662140"></a><a
! name="_Toc152605103"></a><a name="_Toc115416161"></a><a name="_Toc139993153"></a><a
! name="_Toc126872230"></a><span style='mso-bookmark:_Toc193871715'><span
! style='mso-bookmark:_Toc193871470'><span style='mso-bookmark:_Toc191662140'><span
! style='mso-bookmark:_Toc152605103'><span style='mso-bookmark:_Toc115416161'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.1.2 Authoring a Transform</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Transforms
! describe a set of modifications to be performed on an existing MSI for the
! purpose of customizing it.&nbsp; This is ordinarily done by making a copy of
! the MSI to be customized, modifying the copy and then using the old and the new
! MSI to generate a transform.&nbsp; For example:</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>copy openafs.msi openafs-modified.msi</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>(edit the openafs-modified.msi to include the necessary changes)</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>msitran -g openafs.msi openafs-modified.msi openafs-transform.mst</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>(generates openafs-transform.mst, which is the transform)</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Transforms
! have an extension of .mst.&nbsp; 'msitran' is a tool distributed as part of the
! &quot;Windows Installer&quot; SDK (part of the Windows Platform SDK).</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>You
! can test a transform by:</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>copy openafs.msi openafs-test.msi</p>
  
! <p class=preformattedtext style='margin-left:.5in;text-indent:-.25in;
! tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;
  </span>msitran -a openafs-transform.mst openafs-test.msi</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>and
! then checking the resulting openafs-test.msi to see if all changes you have
! made above to openafs-modified.msi is present in openafs-test.msi.&nbsp;
! 'msitran' will complain if some modification in the transform can not be
! successfully applied.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>As
! mentioned above, you can use a tool like ORCA.EXE to edit the MSI databases
! directly when editing openafs-modified.msi.&nbsp; More details are given below.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871716"></a><a name="_Toc193871471"></a><a name="_Toc191662141"></a><a
! name="_Toc152605104"></a><a name="_Toc115416162"></a><a name="_Toc139993154"></a><a
! name="_Toc126872231"></a><a name="_Toc115417100"></a><span style='mso-bookmark:
! _Toc193871716'><span style='mso-bookmark:_Toc193871471'><span style='mso-bookmark:
! _Toc191662141'><span style='mso-bookmark:_Toc152605104'><span style='mso-bookmark:
! _Toc115416162'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.
! Configuration Options</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! logic necessary to implement many of the settings described in <a
! href="#_Appendix_A:_Registry_Values"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Appendix A</span></span></a>
! are present in the MSI.&nbsp; Most of these can be controlled by setting the
! corresponding properties to the desired value.&nbsp; Some settings may require
! modifying existing registry entries (though not recommended) or adding new
! resources (like files or registry keys).&nbsp; Instructions for performing
! these tasks are below.</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871717"></a><a name="_Toc193871472"></a><a name="_Toc191662142"></a><a
! name="_Toc152605105"></a><a name="_Toc115416163"></a><a name="_Toc139993155"></a><a
! name="_Toc126872232"></a><span style='mso-bookmark:_Toc193871717'><span
! style='mso-bookmark:_Toc193871472'><span style='mso-bookmark:_Toc191662142'><span
! style='mso-bookmark:_Toc152605105'><span style='mso-bookmark:_Toc115416163'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.2.1 Configurable Properties</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Most
! configurable properties correspond to registry keys or values.&nbsp; Due to the
! logic invoked based on the existence of these registry keys or values, they are
! only set if the associated property is defined to have a non null value.&nbsp;
! If the associated property is not defined in the MSI, the registry key or value
! will not be touched.&nbsp; By default, the MSI does not contain these
! properties and hence will not set the registry keys.&nbsp; You will need to add
! properties as needed to the MSI.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>When
! one of the configurable properties is set, the installer will use the property
! value to set the corresponding setting in the HKEY_LOCAL_MACHINE registry
! hive.&nbsp; The HKEY_CURRENT_USER hive is not touched by the installer.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>For
! each property, the associated registry setting is referenced by the same text
! used in <a href="#_Appendix_A:_Registry_Values"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Appendix A</span></span></a>.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Strings
! are quoted using single quotes (e.g. 'a string'). An empty string is denoted as
! ''.&nbsp; Note that you can't author null values into the 'Property' table.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Numeric
! values should be authored as decimal strings.</p>
! 
! <h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662143"></a><a name="_Toc152605106"></a><a name="_Toc115416164"></a><a
! name="_Toc139993156"></a><a name="_Toc126872233"></a><span style='mso-bookmark:
! _Toc191662143'><span style='mso-bookmark:_Toc152605106'><span style='mso-bookmark:
! _Toc115416164'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.1
  Setting Properties</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>In
! order to set a property,</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='font-size:9.0pt'>1.</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Open the MSI in ORCA.EXE</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='font-size:9.0pt'>2.</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Select the 'Property' table from the list of tables on the left.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='font-size:9.0pt'>3.</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
! </span>Find the property in the list of properties on the right, double click the
! value and type the new value.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='font-size:9.0pt'>4.</span><span style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>If the property does not exist in the property list, right click the
  list and select 'Add Row', type the property name and the desired value.</p>
  
! <h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662144"></a><a name="_Toc152605107"></a><a name="_Toc115416165"></a><a
! name="_Toc139993157"></a><a name="_Toc126872234"></a><span style='mso-bookmark:
! _Toc191662144'><span style='mso-bookmark:_Toc152605107'><span style='mso-bookmark:
! _Toc115416165'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.2
  OpenAFS for Windows Properties</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h4>
  
***************
*** 3722,3875 ****
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662145"></a><a name="_Toc152605108"></a><a
!   name="_(Service_parameters):"></a><a name="_Toc115416166"></a><a
!   name="_Toc126872235"></a><a name="_Toc139993158"></a><span style='mso-bookmark:
!   _Toc191662145'><span style='mso-bookmark:_Toc152605108'><span
!   style='mso-fareast-font-family:"Times New Roman"'>(Service parameters):</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=listcontents style='margin-left:0in'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:1'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662146"></a><a name="_Toc152605109"></a><a
!   name="_(Network_provider):"></a><a name="_Toc115416167"></a><a
!   name="_Toc126872236"></a><a name="_Toc139993159"></a><span style='mso-bookmark:
!   _Toc191662146'><span style='mso-bookmark:_Toc152605109'><span
!   style='mso-fareast-font-family:"Times New Roman"'>(Network provider):</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=listcontents style='margin-left:0in'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:2;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662147"></a><a name="_Toc152605110"></a><a
!   name="_(OpenAFS_Client):"></a><a name="_Toc115416168"></a><a
!   name="_Toc126872237"></a><a name="_Toc139993160"></a><span style='mso-bookmark:
!   _Toc191662147'><span style='mso-bookmark:_Toc152605110'><span
!   style='mso-fareast-font-family:"Times New Roman"'>(OpenAFS Client):</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=listcontents style='margin-left:0in'>[HKLM\SOFTWARE\OpenAFS\Client]</p>
    </td>
   </tr>
  </table>
  
! <h5><a name="_Toc191662148"></a><a name="_Toc152605111"></a><a
! name="_Toc115416169"></a><a name="_Toc139993161"></a><a name="_Toc126872238"></a><span
! style='mso-bookmark:_Toc191662148'><span style='mso-bookmark:_Toc152605111'><span
! style='mso-bookmark:_Toc115416169'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.2.1
  Registry Properties</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h5>
  
! <p class=MsoNormal>These properties are used to set the values of registry
! entries associated with OpenAFS for Windows.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662149"></a><a name="_Toc152605112"></a><a
!   name="_Toc115416170"></a><a name="_Toc126872239"></a><a name="_Toc139993162"></a><span
    style='mso-bookmark:_Toc191662149'><span style='mso-bookmark:_Toc152605112'><span
    style='mso-bookmark:_Toc115416170'><span style='mso-fareast-font-family:"Times New Roman"'>AFSCACHEPATH</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_CachePath">CachePath</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string .</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:1'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662150"></a><a name="_Toc152605113"></a><a
!   name="_Toc115416171"></a><a name="_Toc126872240"></a><a name="_Toc139993163"></a><span
    style='mso-bookmark:_Toc191662150'><span style='mso-bookmark:_Toc152605113'><span
    style='mso-bookmark:_Toc115416171'><span style='mso-fareast-font-family:"Times New Roman"'>AFSCACHESIZE</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_CacheSize">CacheSize</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : numeric</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:2'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662151"></a><a name="_Toc152605114"></a><a
!   name="_Toc115416172"></a><a name="_Toc126872241"></a><a name="_Toc139993164"></a><span
    style='mso-bookmark:_Toc191662151'><span style='mso-bookmark:_Toc152605114'><span
    style='mso-bookmark:_Toc115416172'><span style='mso-fareast-font-family:"Times New Roman"'>AFSCELLNAME</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_Cell">Cell</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:3'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662152"></a><a name="_Toc152605115"></a><a
!   name="_Toc115416173"></a><a name="_Toc126872242"></a><a name="_Toc139993165"></a><span
    style='mso-bookmark:_Toc191662152'><span style='mso-bookmark:_Toc152605115'><span
    style='mso-bookmark:_Toc115416173'><span style='mso-fareast-font-family:"Times New Roman"'>FREELANCEMODE</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_FreelanceClient">FreelanceClient</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:4'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662153"></a><a name="_Toc152605116"></a><a
!   name="_Toc115416174"></a><a name="_Toc126872243"></a><a name="_Toc139993166"></a><span
    style='mso-bookmark:_Toc191662153'><span style='mso-bookmark:_Toc152605116'><span
    style='mso-bookmark:_Toc115416174'><span style='mso-fareast-font-family:"Times New Roman"'>HIDEDOTFILES</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_HideDotFiles">HideDotFiles</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:5'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662154"></a><a name="_Toc152605117"></a><a
!   name="_Toc115416175"></a><a name="_Toc126872244"></a><a name="_Toc139993167"></a><span
    style='mso-bookmark:_Toc191662154'><span style='mso-bookmark:_Toc152605117'><span
    style='mso-bookmark:_Toc115416175'><span style='mso-fareast-font-family:"Times New Roman"'>LOGONOPTIONS</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Network_provider):">(Network provider)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_LogonOptions">LogonOptions</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '0', '1' or '3'</p>
!   <p class=MsoNormal>See <a href="#_Appendix_A:_Registry_Values">Appendix A</a>
!   <a href="#_A.2.1_Domain_specific_configuration">section 2.1 (Domain specific
!   configuration keys for Network Provider)</a> for more details.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:6'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662155"></a><a name="_Toc152605118"></a><a
!   name="_Toc115416176"></a><a name="_Toc126872245"></a><a name="_Toc139993168"></a><span
    style='mso-bookmark:_Toc191662155'><span style='mso-bookmark:_Toc152605118'><span
    style='mso-bookmark:_Toc115416176'><span style='mso-fareast-font-family:"Times New Roman"'>MOUNTROOT</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_Mountroot">Mountroot</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:7'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662156"></a><a name="_Toc152605119"></a><a
!   name="_Toc115416177"></a><a name="_Toc126872246"></a><a name="_Toc139993169"></a><span
    style='mso-bookmark:_Toc191662156'><span style='mso-bookmark:_Toc152605119'><span
    style='mso-bookmark:_Toc115416177'><span style='mso-fareast-font-family:"Times New Roman"'>NETBIOSNAME</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_NetbiosName">NetbiosName</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string (at most 15
    characters)</p>
    </td>
--- 4334,4520 ----
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662145"></a><a name="_Toc152605108"></a><a
!   name="_Toc139993158"></a><a name="_Toc126872235"></a><a name="_Toc115416166"></a><a
!   name="_(Service_parameters):"></a><span style='mso-bookmark:_Toc191662145'><span
!   style='mso-bookmark:_Toc152605108'><span style='mso-fareast-font-family:"Times New Roman"'>(Service
!   parameters):</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=listcontents style='margin-left:0in'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:1'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662146"></a><a name="_Toc152605109"></a><a
!   name="_Toc139993159"></a><a name="_Toc126872236"></a><a name="_Toc115416167"></a><a
!   name="_(Network_provider):"></a><span style='mso-bookmark:_Toc191662146'><span
!   style='mso-bookmark:_Toc152605109'><span style='mso-fareast-font-family:"Times New Roman"'>(Network
!   provider):</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=listcontents style='margin-left:0in'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:2;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662147"></a><a name="_Toc152605110"></a><a
!   name="_Toc139993160"></a><a name="_Toc126872237"></a><a name="_Toc115416168"></a><a
!   name="_(OpenAFS_Client):"></a><span style='mso-bookmark:_Toc191662147'><span
!   style='mso-bookmark:_Toc152605110'><span style='mso-fareast-font-family:"Times New Roman"'>(OpenAFS
!   Client):</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=listcontents style='margin-left:0in'>[HKLM\SOFTWARE\OpenAFS\Client]</p>
    </td>
   </tr>
  </table>
  
! <h5 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662148"></a><a name="_Toc152605111"></a><a name="_Toc115416169"></a><a
! name="_Toc139993161"></a><a name="_Toc126872238"></a><span style='mso-bookmark:
! _Toc191662148'><span style='mso-bookmark:_Toc152605111'><span style='mso-bookmark:
! _Toc115416169'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.2.1
  Registry Properties</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h5>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>These
! properties are used to set the values of registry entries associated with
! OpenAFS for Windows.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662149"></a><a name="_Toc152605112"></a><a
!   name="_Toc115416170"></a><a name="_Toc139993162"></a><a name="_Toc126872239"></a><span
    style='mso-bookmark:_Toc191662149'><span style='mso-bookmark:_Toc152605112'><span
    style='mso-bookmark:_Toc115416170'><span style='mso-fareast-font-family:"Times New Roman"'>AFSCACHEPATH</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_CachePath"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>CachePath</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string .</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:1'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662150"></a><a name="_Toc152605113"></a><a
!   name="_Toc115416171"></a><a name="_Toc139993163"></a><a name="_Toc126872240"></a><span
    style='mso-bookmark:_Toc191662150'><span style='mso-bookmark:_Toc152605113'><span
    style='mso-bookmark:_Toc115416171'><span style='mso-fareast-font-family:"Times New Roman"'>AFSCACHESIZE</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_CacheSize"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>CacheSize</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : numeric</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:2'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662151"></a><a name="_Toc152605114"></a><a
!   name="_Toc115416172"></a><a name="_Toc139993164"></a><a name="_Toc126872241"></a><span
    style='mso-bookmark:_Toc191662151'><span style='mso-bookmark:_Toc152605114'><span
    style='mso-bookmark:_Toc115416172'><span style='mso-fareast-font-family:"Times New Roman"'>AFSCELLNAME</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_Cell"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>Cell</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:3'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662152"></a><a name="_Toc152605115"></a><a
!   name="_Toc115416173"></a><a name="_Toc139993165"></a><a name="_Toc126872242"></a><span
    style='mso-bookmark:_Toc191662152'><span style='mso-bookmark:_Toc152605115'><span
    style='mso-bookmark:_Toc115416173'><span style='mso-fareast-font-family:"Times New Roman"'>FREELANCEMODE</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_FreelanceClient"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>FreelanceClient</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:4'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662153"></a><a name="_Toc152605116"></a><a
!   name="_Toc115416174"></a><a name="_Toc139993166"></a><a name="_Toc126872243"></a><span
    style='mso-bookmark:_Toc191662153'><span style='mso-bookmark:_Toc152605116'><span
    style='mso-bookmark:_Toc115416174'><span style='mso-fareast-font-family:"Times New Roman"'>HIDEDOTFILES</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_HideDotFiles"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>HideDotFiles</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:5'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662154"></a><a name="_Toc152605117"></a><a
!   name="_Toc115416175"></a><a name="_Toc139993167"></a><a name="_Toc126872244"></a><span
    style='mso-bookmark:_Toc191662154'><span style='mso-bookmark:_Toc152605117'><span
    style='mso-bookmark:_Toc115416175'><span style='mso-fareast-font-family:"Times New Roman"'>LOGONOPTIONS</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Network_provider):"><span class=Heading1Char><span style='font-size:
!   14.0pt;text-decoration:none;text-underline:none'>(Network provider)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_LogonOptions"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>LogonOptions</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '0', '1' or '3'</p>
!   <p class=MsoNormal>See <a href="#_Appendix_A:_Registry_Values"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>Appendix A</span></span></a> <a
!   href="#_A.2.1_Domain_specific_configuration"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>section 2.1
!   (Domain specific configuration keys for Network Provider)</span></span></a>
!   for more details.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:6'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662155"></a><a name="_Toc152605118"></a><a
!   name="_Toc115416176"></a><a name="_Toc139993168"></a><a name="_Toc126872245"></a><span
    style='mso-bookmark:_Toc191662155'><span style='mso-bookmark:_Toc152605118'><span
    style='mso-bookmark:_Toc115416176'><span style='mso-fareast-font-family:"Times New Roman"'>MOUNTROOT</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_Mountroot"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>Mountroot</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:7'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662156"></a><a name="_Toc152605119"></a><a
!   name="_Toc115416177"></a><a name="_Toc139993169"></a><a name="_Toc126872246"></a><span
    style='mso-bookmark:_Toc191662156'><span style='mso-bookmark:_Toc152605119'><span
    style='mso-bookmark:_Toc115416177'><span style='mso-fareast-font-family:"Times New Roman"'>NETBIOSNAME</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_NetbiosName"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>NetbiosName</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : string (at most 15
    characters)</p>
    </td>
***************
*** 3877,3980 ****
   <tr style='mso-yfti-irow:8'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662157"></a><a name="_Toc152605120"></a><a
!   name="_Toc115416178"></a><a name="_Toc126872247"></a><a name="_Toc139993170"></a><span
    style='mso-bookmark:_Toc191662157'><span style='mso-bookmark:_Toc152605120'><span
    style='mso-bookmark:_Toc115416178'><span style='mso-fareast-font-family:"Times New Roman"'>NOFINDLANABYNAME</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_NoFindLanaByName">NoFindLanaByName</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:9'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662158"></a><a name="_Toc152605121"></a><a
!   name="_Toc115416179"></a><a name="_Toc126872248"></a><a name="_Toc139993171"></a><span
    style='mso-bookmark:_Toc191662158'><span style='mso-bookmark:_Toc152605121'><span
    style='mso-bookmark:_Toc115416179'><span style='mso-fareast-font-family:"Times New Roman"'>RXMAXMTU</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_RxMaxMTU">RxMaxMTU</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : numeric</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:10'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662159"></a><a name="_Toc152605122"></a><a
!   name="_Toc115416180"></a><a name="_Toc126872249"></a><a name="_Toc139993172"></a><span
    style='mso-bookmark:_Toc191662159'><span style='mso-bookmark:_Toc152605122'><span
    style='mso-bookmark:_Toc115416180'><span style='mso-fareast-font-family:"Times New Roman"'>SECURITYLEVEL</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_SecurityLevel">SecurityLevel</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:11'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662160"></a><a name="_Toc152605123"></a><a
!   name="_Toc115416181"></a><a name="_Toc126872250"></a><a name="_Toc139993173"></a><span
    style='mso-bookmark:_Toc191662160'><span style='mso-bookmark:_Toc152605123'><span
    style='mso-bookmark:_Toc115416181'><span style='mso-fareast-font-family:"Times New Roman"'>SMBAUTHTYPE</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_smbAuthType">SMBAuthType</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '0','1' or '2'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:12'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662161"></a><a name="_Toc152605124"></a><a
!   name="_Toc115416182"></a><a name="_Toc126872251"></a><a name="_Toc139993174"></a><span
    style='mso-bookmark:_Toc191662161'><span style='mso-bookmark:_Toc152605124'><span
    style='mso-bookmark:_Toc115416182'><span style='mso-fareast-font-family:"Times New Roman"'>STOREANSIFILENAMES</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(OpenAFS_Client):">(OpenAFS Client)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_StoreAnsiFilenames">StoreAnsiFilenames</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '0' or '1'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:13;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662162"></a><a name="_Toc152605125"></a><a
!   name="_Toc115416183"></a><a name="_Toc126872252"></a><a name="_Toc139993175"></a><span
    style='mso-bookmark:_Toc191662162'><span style='mso-bookmark:_Toc152605125'><span
    style='mso-bookmark:_Toc115416183'><span style='mso-fareast-font-family:"Times New Roman"'>USEDNS</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):">(Service parameters)</a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_UseDNS">UseDNS</a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
  </table>
  
! <h5><a name="_Toc191662163"></a><a name="_Toc152605126"></a><a
! name="_Toc139993176"></a><a name="_Toc126872253"></a><a name="_Toc115416184"></a><a
  name="_7.2.1.2.2_AFSCreds.exe_Properties"></a><span style='mso-bookmark:_Toc191662163'><span
  style='mso-bookmark:_Toc152605126'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.2.2
  AFSCreds.exe Properties</span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h5>
  
! <p class=MsoNormal>These properties are combined to add a command line option
! to the shortcut that will be created in the Start:Programs:OpenAFS and
! Start:Programs:Startup folders (see CREDSSTARTUP). &nbsp;The method of
! specifying the option was chosen for easy integration with the Windows
! Installer user interface.&nbsp; Although other methods can be used to specify
! options to AFSCREDS.EXE, it is advised that they be avoided as transforms
! including such options may not apply to future releases of OpenAFS.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662164"></a><a name="_Toc152605127"></a><a
!   name="_Toc115416185"></a><a name="_Toc126872254"></a><a name="_Toc139993177"></a><span
    style='mso-bookmark:_Toc191662164'><span style='mso-bookmark:_Toc152605127'><span
    style='mso-bookmark:_Toc115416185'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSSTARTUP</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
--- 4522,4650 ----
   <tr style='mso-yfti-irow:8'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662157"></a><a name="_Toc152605120"></a><a
!   name="_Toc115416178"></a><a name="_Toc139993170"></a><a name="_Toc126872247"></a><span
    style='mso-bookmark:_Toc191662157'><span style='mso-bookmark:_Toc152605120'><span
    style='mso-bookmark:_Toc115416178'><span style='mso-fareast-font-family:"Times New Roman"'>NOFINDLANABYNAME</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_NoFindLanaByName"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>NoFindLanaByName</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:9'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662158"></a><a name="_Toc152605121"></a><a
!   name="_Toc115416179"></a><a name="_Toc139993171"></a><a name="_Toc126872248"></a><span
    style='mso-bookmark:_Toc191662158'><span style='mso-bookmark:_Toc152605121'><span
    style='mso-bookmark:_Toc115416179'><span style='mso-fareast-font-family:"Times New Roman"'>RXMAXMTU</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_RxMaxMTU"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>RxMaxMTU</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : numeric</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:10'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662159"></a><a name="_Toc152605122"></a><a
!   name="_Toc115416180"></a><a name="_Toc139993172"></a><a name="_Toc126872249"></a><span
    style='mso-bookmark:_Toc191662159'><span style='mso-bookmark:_Toc152605122'><span
    style='mso-bookmark:_Toc115416180'><span style='mso-fareast-font-family:"Times New Roman"'>SECURITYLEVEL</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_SecurityLevel"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>SecurityLevel</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:11'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662160"></a><a name="_Toc152605123"></a><a
!   name="_Toc115416181"></a><a name="_Toc139993173"></a><a name="_Toc126872250"></a><span
    style='mso-bookmark:_Toc191662160'><span style='mso-bookmark:_Toc152605123'><span
    style='mso-bookmark:_Toc115416181'><span style='mso-fareast-font-family:"Times New Roman"'>SMBAUTHTYPE</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_smbAuthType"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>SMBAuthType</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '0','1' or '2'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:12'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662161"></a><a name="_Toc152605124"></a><a
!   name="_Toc115416182"></a><a name="_Toc139993174"></a><a name="_Toc126872251"></a><span
    style='mso-bookmark:_Toc191662161'><span style='mso-bookmark:_Toc152605124'><span
    style='mso-bookmark:_Toc115416182'><span style='mso-fareast-font-family:"Times New Roman"'>STOREANSIFILENAMES</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(OpenAFS_Client):"><span class=Heading1Char><span style='font-size:
!   14.0pt;text-decoration:none;text-underline:none'>(OpenAFS Client)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value___:_StoreAnsiFilenames"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>StoreAnsiFilenames</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '0' or '1'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:13;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662162"></a><a name="_Toc152605125"></a><a
!   name="_Toc115416183"></a><a name="_Toc139993175"></a><a name="_Toc126872252"></a><span
    style='mso-bookmark:_Toc191662162'><span style='mso-bookmark:_Toc152605125'><span
    style='mso-bookmark:_Toc115416183'><span style='mso-fareast-font-family:"Times New Roman"'>USEDNS</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
    <p class=MsoList>Registry key&nbsp;&nbsp;&nbsp; : <a
!   href="#_(Service_parameters):"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>(Service
!   parameters)</span></span></a></p>
!   <p class=MsoList>Registry value : <a href="#_Value_:_UseDNS"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>UseDNS</span></span></a></p>
    <p class=MsoList>Valid values&nbsp;&nbsp;&nbsp; : '1' or '0'</p>
    </td>
   </tr>
  </table>
  
! <h5 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662163"></a><a name="_Toc152605126"></a><a name="_Toc139993176"></a><a
! name="_Toc126872253"></a><a name="_Toc115416184"></a><a
  name="_7.2.1.2.2_AFSCreds.exe_Properties"></a><span style='mso-bookmark:_Toc191662163'><span
  style='mso-bookmark:_Toc152605126'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.1.2.2
  AFSCreds.exe Properties</span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h5>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>These
! properties are combined to add a command line option to the shortcut that will
! be created in the Start:Programs:OpenAFS and Start:Programs:Startup folders
! (see CREDSSTARTUP). &nbsp;The method of specifying the option was chosen for
! easy integration with the Windows Installer user interface.&nbsp; Although other
! methods can be used to specify options to AFSCREDS.EXE, it is advised that they
! be avoided as transforms including such options may not apply to future
! releases of OpenAFS.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662164"></a><a name="_Toc152605127"></a><a
!   name="_Toc115416185"></a><a name="_Toc139993177"></a><a name="_Toc126872254"></a><span
    style='mso-bookmark:_Toc191662164'><span style='mso-bookmark:_Toc152605127'><span
    style='mso-bookmark:_Toc115416185'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSSTARTUP</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
***************
*** 3988,3994 ****
   <tr style='mso-yfti-irow:1'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662165"></a><a name="_Toc152605128"></a><a
!   name="_Toc115416186"></a><a name="_Toc126872255"></a><a name="_Toc139993178"></a><span
    style='mso-bookmark:_Toc191662165'><span style='mso-bookmark:_Toc152605128'><span
    style='mso-bookmark:_Toc115416186'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSAUTOINIT</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
--- 4658,4664 ----
   <tr style='mso-yfti-irow:1'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662165"></a><a name="_Toc152605128"></a><a
!   name="_Toc115416186"></a><a name="_Toc139993178"></a><a name="_Toc126872255"></a><span
    style='mso-bookmark:_Toc191662165'><span style='mso-bookmark:_Toc152605128'><span
    style='mso-bookmark:_Toc115416186'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSAUTOINIT</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
***************
*** 3999,4005 ****
   <tr style='mso-yfti-irow:2'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662166"></a><a name="_Toc152605129"></a><a
!   name="_Toc115416187"></a><a name="_Toc126872256"></a><a name="_Toc139993179"></a><span
    style='mso-bookmark:_Toc191662166'><span style='mso-bookmark:_Toc152605129'><span
    style='mso-bookmark:_Toc115416187'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSIPCHDET</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
--- 4669,4675 ----
   <tr style='mso-yfti-irow:2'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662166"></a><a name="_Toc152605129"></a><a
!   name="_Toc115416187"></a><a name="_Toc139993179"></a><a name="_Toc126872256"></a><span
    style='mso-bookmark:_Toc191662166'><span style='mso-bookmark:_Toc152605129'><span
    style='mso-bookmark:_Toc115416187'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSIPCHDET</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
***************
*** 4010,4016 ****
   <tr style='mso-yfti-irow:3'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662167"></a><a name="_Toc152605130"></a><a
!   name="_Toc115416188"></a><a name="_Toc126872257"></a><a name="_Toc139993180"></a><span
    style='mso-bookmark:_Toc191662167'><span style='mso-bookmark:_Toc152605130'><span
    style='mso-bookmark:_Toc115416188'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSQUIET</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
--- 4680,4686 ----
   <tr style='mso-yfti-irow:3'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662167"></a><a name="_Toc152605130"></a><a
!   name="_Toc115416188"></a><a name="_Toc139993180"></a><a name="_Toc126872257"></a><span
    style='mso-bookmark:_Toc191662167'><span style='mso-bookmark:_Toc152605130'><span
    style='mso-bookmark:_Toc115416188'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSQUIET</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
***************
*** 4021,4027 ****
   <tr style='mso-yfti-irow:4'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662168"></a><a name="_Toc152605131"></a><a
!   name="_Toc115416189"></a><a name="_Toc126872258"></a><a name="_Toc139993181"></a><span
    style='mso-bookmark:_Toc191662168'><span style='mso-bookmark:_Toc152605131'><span
    style='mso-bookmark:_Toc115416189'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSRENEWDRMAP</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
--- 4691,4697 ----
   <tr style='mso-yfti-irow:4'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662168"></a><a name="_Toc152605131"></a><a
!   name="_Toc115416189"></a><a name="_Toc139993181"></a><a name="_Toc126872258"></a><span
    style='mso-bookmark:_Toc191662168'><span style='mso-bookmark:_Toc152605131'><span
    style='mso-bookmark:_Toc115416189'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSRENEWDRMAP</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
***************
*** 4032,4038 ****
   <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662169"></a><a name="_Toc152605132"></a><a
!   name="_Toc115416190"></a><a name="_Toc126872259"></a><a name="_Toc139993182"></a><span
    style='mso-bookmark:_Toc191662169'><span style='mso-bookmark:_Toc152605132'><span
    style='mso-bookmark:_Toc115416190'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSSHOW</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
--- 4702,4708 ----
   <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h6><a name="_Toc191662169"></a><a name="_Toc152605132"></a><a
!   name="_Toc115416190"></a><a name="_Toc139993182"></a><a name="_Toc126872259"></a><span
    style='mso-bookmark:_Toc191662169'><span style='mso-bookmark:_Toc152605132'><span
    style='mso-bookmark:_Toc115416190'><span style='mso-fareast-font-family:"Times New Roman"'>CREDSSHOW</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h6>
***************
*** 4043,4128 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662170"></a><a name="_Toc152605133"></a><a
! name="_Toc115416191"></a><a name="_Toc139993183"></a><a name="_Toc126872260"></a><span
! style='mso-bookmark:_Toc191662170'><span style='mso-bookmark:_Toc152605133'><span
! style='mso-bookmark:_Toc115416191'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.2
! Existing Registry Entries</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>You can change existing registry values subject to the
! restrictions mentioned in the Windows Platform SDK.&nbsp; Pay special attention
! to component key paths and try to only change the 'Value' column in the
! 'Registry' table.&nbsp; If you want to add additional registry keys please
! refer to section 3 (Additional resources).</p>
! 
! <h3><a name="_Toc191662171"></a><a name="_Toc152605134"></a><a
! name="_Toc115416192"></a><a name="_Toc139993184"></a><a name="_Toc126872261"></a><span
! style='mso-bookmark:_Toc191662171'><span style='mso-bookmark:_Toc152605134'><span
! style='mso-bookmark:_Toc115416192'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.3
! Replacing Configuration Files</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>The OpenAFS configuration files (CellServDB) can be replaced
! by your own configuration files.&nbsp; These files are contained in separate
! MSI components so that you can disable them individually.</p>
! 
! <p class=MsoNormal>The recommended method for replacing these files is to first
! disable the components containing the configuration files that you want to
! replace, and then add new components for the replacement files.&nbsp; This is
! outlined below (assuming you are using ORCA.EXE to author the transform).</p>
! 
! <p class=MsoNormal>Note that transforms are not a good way to add a new file as
! an embedded stream.&nbsp; The method outlined here places the file in the same
! directory as the MSI for deployment.</p>
  
! <p class=MsoNormal>The walkthrough below is to add a custom 'CellServDB' file.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in'>1.<span style='font-size:7.0pt;
! font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Disable
! the component that contains the configuration file that you want to replace.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in'>1.1.<span style='font-size:7.0pt;
! font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Locate and select
! the 'Component' table in the 'Tables' list.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in'>1.2.<span style='font-size:7.0pt;
! font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>In the Component
! table, locate the component you need to change ( Ctrl-F invokes the 'Find'
! dialog).&nbsp; The component names are listed below in section <a
! href="#_2.3.1_Components_for_Configuration_">7.2.3.1</a>.&nbsp; For this
! example, the component name is 'elf_CellServDB'.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in'>1.3.<span style='font-size:7.0pt;
! font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Go to the
! 'Condition' column of the component.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in'>1.4.<span style='font-size:7.0pt;
! font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Enter a condition
! that evaluates to false. I.e. 'DONOTINSTALL'. (Note that an undefined property
! always evaluates to false).</p>
  
! <p class=MsoNormal>Note that you can also use this step to disable other
! configuration files without providing replacements.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Add a new component containing the new configuration file.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>2.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'Component' table in the 'Tables' list.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>2.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  'Tables'-&gt;'Add Row' (Ctrl-R).</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>2.3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Enter
  the following :</p>
  
--- 4713,4812 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871718"></a><a name="_Toc193871473"></a><a name="_Toc191662170"></a><a
! name="_Toc152605133"></a><a name="_Toc115416191"></a><a name="_Toc139993183"></a><a
! name="_Toc126872260"></a><span style='mso-bookmark:_Toc193871718'><span
! style='mso-bookmark:_Toc193871473'><span style='mso-bookmark:_Toc191662170'><span
! style='mso-bookmark:_Toc152605133'><span style='mso-bookmark:_Toc115416191'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.2.2 Existing Registry
! Entries</span></span></span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>You
! can change existing registry values subject to the restrictions mentioned in
! the Windows Platform SDK.&nbsp; Pay special attention to component key paths
! and try to only change the 'Value' column in the 'Registry' table.&nbsp; If you
! want to add additional registry keys please refer to section 3 (Additional
! resources).</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871719"></a><a name="_Toc193871474"></a><a name="_Toc191662171"></a><a
! name="_Toc152605134"></a><a name="_Toc115416192"></a><a name="_Toc139993184"></a><a
! name="_Toc126872261"></a><span style='mso-bookmark:_Toc193871719'><span
! style='mso-bookmark:_Toc193871474'><span style='mso-bookmark:_Toc191662171'><span
! style='mso-bookmark:_Toc152605134'><span style='mso-bookmark:_Toc115416192'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.2.3 Replacing Configuration
! Files</span></span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! OpenAFS configuration files (CellServDB) can be replaced by your own
! configuration files.&nbsp; These files are contained in separate MSI components
! so that you can disable them individually.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! recommended method for replacing these files is to first disable the components
! containing the configuration files that you want to replace, and then add new
! components for the replacement files.&nbsp; This is outlined below (assuming
! you are using ORCA.EXE to author the transform).</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Note
! that transforms are not a good way to add a new file as an embedded
! stream.&nbsp; The method outlined here places the file in the same directory as
! the MSI for deployment.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! walkthrough below is to add a custom 'CellServDB' file.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.<span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
! </span>Disable the component that contains the configuration file that you want
! to replace.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.1.<span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Locate
! and select the 'Component' table in the 'Tables' list.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.2.<span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>In
! the Component table, locate the component you need to change ( Ctrl-F invokes
! the 'Find' dialog).&nbsp; The component names are listed below in section <a
! href="#_2.3.1_Components_for_Configuration_"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>7.2.3.1</span></span></a>.&nbsp;
! For this example, the component name is 'elf_CellServDB'.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.3.<span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Go
! to the 'Condition' column of the component.</p>
  
  <p class=MsoNormal style='margin-top:4.3pt;margin-right:0in;margin-bottom:4.3pt;
! margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.4.<span
! style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Enter
! a condition that evaluates to false. I.e. 'DONOTINSTALL'. (Note that an
! undefined property always evaluates to false).</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Note
! that you can also use this step to disable other configuration files without
! providing replacements.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Add a new component containing the new configuration file.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'Component' table in the 'Tables' list.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  'Tables'-&gt;'Add Row' (Ctrl-R).</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Enter
  the following :</p>
  
***************
*** 4196,4224 ****
   </tr>
  </table>
  
! <p class=MsoNormal style='margin-left:35.45pt'>Note that the ComponentId is an
! uppercase GUID.&nbsp; You can generate one using GUIDGEN.EXE or UUIDGEN.EXE,
! both of which are included in the Platform SDK.</p>
  
! <p class=MsoNormal style='margin-left:35.45pt'>The Attributes value of 144 is a
! sum of msidbComponentAttributesPermanent (16) and
  msidbComponentAttributesNeverOverwrite (128).&nbsp; This ensures that local
  modifications are not overwritten or lost during an installation or
! uninstallation.&nbsp; These are the same settings used on the default configuration
! files.</p>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  'fil_my_CellServDB' is a key into the 'File' table which we will fill later.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in'>3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Add a new feature to hold the new component.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>3.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'Feature' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>3.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a new row (Ctrl-R or 'Tables'-&gt;'Add Row') with the following values:</p>
  
--- 4880,4908 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Note
! that the ComponentId is an uppercase GUID.&nbsp; You can generate one using
! GUIDGEN.EXE or UUIDGEN.EXE, both of which are included in the Platform SDK.</p>
  
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! Attributes value of 144 is a sum of msidbComponentAttributesPermanent (16) and
  msidbComponentAttributesNeverOverwrite (128).&nbsp; This ensures that local
  modifications are not overwritten or lost during an installation or
! uninstallation.&nbsp; These are the same settings used on the default
! configuration files.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  'fil_my_CellServDB' is a key into the 'File' table which we will fill later.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Add a new feature to hold the new component.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'Feature' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a new row (Ctrl-R or 'Tables'-&gt;'Add Row') with the following values:</p>
  
***************
*** 4314,4342 ****
   </tr>
  </table>
  
! <p class=MsoNormal style='margin-left:35.45pt'>It is important to create the
! new feature under the 'feaClient' feature, which will ensure that the
! configuration file will be installed when the client binaries are installed.</p>
! 
! <p class=MsoNormal style='margin-left:35.45pt'>Setting 'Display' to 0 will hide
! this feature from the feature selection dialog during an interactive
! installation.&nbsp; A value of 30 for 'Level' allows this feature to be
! installed by default (on a 'Typical' installation).</p>
! 
! <p class=MsoNormal style='margin-left:35.45pt'>The 'Attributes' value is
! msidbFeatureAttributesDisallowAdvertise (8), which is set on all features in
! the OpenAFS MSI.&nbsp; The OpenAFS MSI is not designed for an advertised
! installation.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in'>4.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Join the component and the feature.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>4.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'FeatureComponents' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>4.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a new row with the following values:</p>
  
--- 4998,5027 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>It
! is important to create the new feature under the 'feaClient' feature, which
! will ensure that the configuration file will be installed when the client
! binaries are installed.</p>
! 
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Setting
! 'Display' to 0 will hide this feature from the feature selection dialog during
! an interactive installation.&nbsp; A value of 30 for 'Level' allows this
! feature to be installed by default (on a 'Typical' installation).</p>
! 
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! 'Attributes' value is msidbFeatureAttributesDisallowAdvertise (8), which is set
! on all features in the OpenAFS MSI.&nbsp; The OpenAFS MSI is not designed for
! an advertised installation.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Join the component and the feature.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'FeatureComponents' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>4.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a new row with the following values:</p>
  
***************
*** 4366,4380 ****
   </tr>
  </table>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in'>5.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Add an entry to the 'File' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>5.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'File' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>5.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a new row with the following values:</p>
  
--- 5051,5065 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Add an entry to the 'File' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'File' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>5.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a new row with the following values:</p>
  
***************
*** 4448,4475 ****
   </tr>
  </table>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  &nbsp;&nbsp;&nbsp; (leave other fields blank)</p>
  
! <p class=MsoNormal style='margin-left:35.45pt'>The 'Attributes' value is
! msidbFileAttributesNonCompressed (8192).&nbsp; This is because we will be placing
! this file in the same directory as the MSI instead of embedding the file in
! it.&nbsp; Transforms do not support updating compressed sources or adding new
! cabinet streams.</p>
! 
! <p class=MsoNormal style='margin-left:35.45pt'>Finally, the 'Sequence' value of
! 1000 will be used later to distinguish the file as being in a separate source
! location than the other files in the MSI.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in'>6.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Set a media source for the file.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>6.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'Media' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in'>6.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a row with the following values :</p>
  
--- 5133,5160 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  &nbsp;&nbsp;&nbsp; (leave other fields blank)</p>
  
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! 'Attributes' value is msidbFileAttributesNonCompressed (8192).&nbsp; This is
! because we will be placing this file in the same directory as the MSI instead
! of embedding the file in it.&nbsp; Transforms do not support updating
! compressed sources or adding new cabinet streams.</p>
! 
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Finally,
! the 'Sequence' value of 1000 will be used later to distinguish the file as
! being in a separate source location than the other files in the MSI.</p>
  
! <p class=MsoNormal style='margin-left:.25in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Set a media source for the file.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6.1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Select
  the 'Media' table.</p>
  
! <p class=MsoNormal style='margin-left:.55in;text-indent:-.3in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>6.2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp; </span>Add
  a row with the following values :</p>
  
***************
*** 4499,4539 ****
   </tr>
  </table>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  &nbsp;&nbsp;&nbsp; (leave other fields blank)</p>
  
! <p class=MsoNormal style='margin-left:35.45pt'>The sequence number of 1000
! designates this as the media source for the newly added file.</p>
! 
! <h4><a name="_Toc191662172"></a><a name="_Toc152605135"></a><a
! name="_Toc139993185"></a><a name="_Toc126872262"></a><a name="_Toc115416193"></a><a
  name="_2.3.1_Components_for_Configuration_"></a><span style='mso-bookmark:_Toc191662172'><span
  style='mso-bookmark:_Toc152605135'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.3.1
  Components for Configuration Files</span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=preformattedtext style='text-indent:35.45pt'>CellServDB:
  'cpf_CellServDB' (ID {D5BA4C15-DBEC-4292-91FC-B54C30F24F2A})</p>
  
! <h3><a name="_Toc191662173"></a><a name="_Toc152605136"></a><a
! name="_Toc115416194"></a><a name="_Toc139993186"></a><a name="_Toc126872263"></a><span
! style='mso-bookmark:_Toc191662173'><span style='mso-bookmark:_Toc152605136'><span
! style='mso-bookmark:_Toc115416194'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.4
! Adding Domain Specific Registry Keys</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>Following is an example for adding domain specific registry
! keys.</p>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; Refer to <a
! href="#_Appendix_A:_Registry_Values">Appendix A</a> section 2.1 for more
! information.</p>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; Columns that are unspecified should be
! left empty.</p>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; We create a new feature and component to
! hold the new registry keys.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
--- 5184,5230 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  &nbsp;&nbsp;&nbsp; (leave other fields blank)</p>
  
! <p class=MsoNormal style='margin-left:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! sequence number of 1000 designates this as the media source for the newly added
! file.</p>
! 
! <h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662172"></a><a name="_Toc152605135"></a><a name="_Toc139993185"></a><a
! name="_Toc126872262"></a><a name="_Toc115416193"></a><a
  name="_2.3.1_Components_for_Configuration_"></a><span style='mso-bookmark:_Toc191662172'><span
  style='mso-bookmark:_Toc152605135'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.3.1
  Components for Configuration Files</span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=preformattedtext style='text-indent:35.45pt;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>CellServDB:
  'cpf_CellServDB' (ID {D5BA4C15-DBEC-4292-91FC-B54C30F24F2A})</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871720"></a><a name="_Toc193871475"></a><a name="_Toc191662173"></a><a
! name="_Toc152605136"></a><a name="_Toc115416194"></a><a name="_Toc139993186"></a><a
! name="_Toc126872263"></a><span style='mso-bookmark:_Toc193871720'><span
! style='mso-bookmark:_Toc193871475'><span style='mso-bookmark:_Toc191662173'><span
! style='mso-bookmark:_Toc152605136'><span style='mso-bookmark:_Toc115416194'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.2.4 Adding Domain Specific
! Registry Keys</span></span></span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Following
! is an example for adding domain specific registry keys.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! Refer to <a href="#_Appendix_A:_Registry_Values"><span class=Heading1Char><span
! style='font-size:14.0pt;text-decoration:none;text-underline:none'>Appendix A</span></span></a>
! section 2.1 for more information.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! Columns that are unspecified should be left empty.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! We create a new feature and component to hold the new registry keys.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
***************
*** 4553,4559 ****
    Parent : 'feaClient'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Display&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Level&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 30<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Attributes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 10</p>
--- 5244,5251 ----
    Parent : 'feaClient'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Display&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Level&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 30<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Attributes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 10</p>
***************
*** 4574,4581 ****
    ComponentId&nbsp; : '{4E3FCBF4-8BE7-40B2-A108-C47CF743C627}'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 'TARGETDIR'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Attributes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 4<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    KeyPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 'reg_domkey0'</p>
    </td>
--- 5266,5273 ----
    ComponentId&nbsp; : '{4E3FCBF4-8BE7-40B2-A108-C47CF743C627}'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Directory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 'TARGETDIR'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attributes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   : 4<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    KeyPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 'reg_domkey0'</p>
    </td>
***************
*** 4615,4622 ****
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    :
    'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Component&nbsp;&nbsp;&nbsp;&nbsp;
!   : 'rcm_DomainKeys'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:8'>
--- 5307,5314 ----
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    :
    'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Component&nbsp;&nbsp;&nbsp;&nbsp; : 'rcm_DomainKeys'</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:8'>
***************
*** 4633,4639 ****
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    :
    'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : '*'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Component&nbsp;&nbsp;&nbsp;&nbsp; : 'rcm_DomainKeys'</p>
--- 5325,5332 ----
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    :
    'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : '*'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Component&nbsp;&nbsp;&nbsp;&nbsp; : 'rcm_DomainKeys'</p>
***************
*** 4651,4657 ****
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   : 'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\ATHENA.MIT.EDU'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : '*'<br>
--- 5344,5351 ----
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   :
!   'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\ATHENA.MIT.EDU'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : '*'<br>
***************
*** 4666,4677 ****
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'reg_domkey3'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   :
!   'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\ATHENA.MIT.EDU'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 'LogonOptions'<br>
--- 5360,5371 ----
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'reg_domkey3'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   : 'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\ATHENA.MIT.EDU'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 'LogonOptions'<br>
***************
*** 4715,4721 ****
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   : 'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\LOCALHOST'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 'LogonOptions'<br>
--- 5409,5416 ----
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   :
!   'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\LOCALHOST'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 'LogonOptions'<br>
***************
*** 4733,4744 ****
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'reg_domkey6'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   :
!   'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\LOCALHOST'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 'FailLoginsSilently'<br>
--- 5428,5439 ----
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'reg_domkey6'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   : 'SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\LOCALHOST'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 'FailLoginsSilently'<br>
***************
*** 4751,4778 ****
   </tr>
  </table>
  
! <p class=MsoNormal>&nbsp;</p>
  
! <p class=MsoNormal>The example adds domain specific keys for 'ATHENA.MIT.EDU'
! (enable integrated logon) and 'LOCALHOST' (disable integrated logon and fail
! logins silently).</p>
! 
! <h3><a name="_Toc191662174"></a><a name="_Toc152605137"></a><a
! name="_Toc115416195"></a><a name="_Toc139993187"></a><a name="_Toc126872264"></a><span
! style='mso-bookmark:_Toc191662174'><span style='mso-bookmark:_Toc152605137'><span
! style='mso-bookmark:_Toc115416195'><span style='mso-fareast-font-family:"Times New Roman"'>7.2.5
! Adding Site Specific Freelance Registry Keys</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal>Following is an example for adding site specific Freelance
! registry keys to pre-populate the Mountpoints and Symlinks in the fake root.afs
! volume.</p>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; Columns that are unspecified should be
! left empty.</p>
  
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; We create a new feature and component to
! hold the new registry keys.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
--- 5446,5476 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! example adds domain specific keys for 'ATHENA.MIT.EDU' (enable integrated
! logon) and 'LOCALHOST' (disable integrated logon and fail logins silently).</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871721"></a><a name="_Toc193871476"></a><a name="_Toc191662174"></a><a
! name="_Toc152605137"></a><a name="_Toc115416195"></a><a name="_Toc139993187"></a><a
! name="_Toc126872264"></a><span style='mso-bookmark:_Toc193871721'><span
! style='mso-bookmark:_Toc193871476'><span style='mso-bookmark:_Toc191662174'><span
! style='mso-bookmark:_Toc152605137'><span style='mso-bookmark:_Toc115416195'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.2.5 Adding Site Specific
! Freelance Registry Keys</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Following
! is an example for adding site specific Freelance registry keys to pre-populate
! the Mountpoints and Symlinks in the fake root.afs volume.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! Columns that are unspecified should be left empty.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! We create a new feature and component to hold the new registry keys.</p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
   style='mso-cellspacing:2.2pt;mso-yfti-tbllook:1184;mso-padding-alt:0in 0in 0in 0in'>
***************
*** 4786,4793 ****
    <p class=MsoNormal>&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new row)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Feature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
!   'feaFreelanceKeys'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Feature
    Parent : 'feaClient'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
--- 5484,5490 ----
    <p class=MsoNormal>&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new row)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Feature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 'feaFreelanceKeys'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Feature
    Parent : 'feaClient'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
***************
*** 4828,4835 ****
   </tr>
   <tr style='mso-yfti-irow:5'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
!   <p class=MsoNormal>&nbsp;&nbsp;&nbsp;
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (new row)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Feature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'feaFreelanceKeys'<br>
--- 5525,5532 ----
   </tr>
   <tr style='mso-yfti-irow:5'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
!   <p class=MsoNormal>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   (new row)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Feature&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'feaFreelanceKeys'<br>
***************
*** 4887,4894 ****
    <p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    (new row)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
!   'reg_freekey2'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
--- 5584,5590 ----
    <p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    (new row)<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 'reg_freekey2'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
***************
*** 4939,4946 ****
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : '0'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   &nbsp;&nbsp; : 'athena:athena.mit.edu.'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Component&nbsp;&nbsp;&nbsp;&nbsp; : 'rcm_FreelanceKeys'</p>
    </td>
--- 5635,5642 ----
    Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : '0'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
!   : 'athena:athena.mit.edu.'<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Component&nbsp;&nbsp;&nbsp;&nbsp; : 'rcm_FreelanceKeys'</p>
    </td>
***************
*** 4952,4958 ****
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'reg_freekey5'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
--- 5648,5655 ----
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Registry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :
    'reg_freekey5'<br>
!   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
!   Root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    : 2<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    Key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
***************
*** 4969,5095 ****
   </tr>
  </table>
  
! <p class=MsoNormal>The example adds a read-only mountpoint to the
! athena.mit.edu cell's root.afs volume as well as a read-write mountpoint.&nbsp;
! Aliases are also provided using symlinks.</p>
! 
! <h2><a name="_Toc191662175"></a><a name="_Toc152605138"></a><a
! name="_Ref115275867"></a><a name="_Toc139993188"></a><a name="_Toc126872265"></a><a
! name="_Toc115417101"></a><a name="_Toc115416196"></a><span style='mso-bookmark:
! _Toc191662175'><span style='mso-bookmark:_Toc152605138'><span style='mso-bookmark:
! _Ref115275867'><span style='mso-fareast-font-family:"Times New Roman"'>7.3
! Additional Resources</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal>If you want to add registry keys or files you need to create
! new components and features for those.&nbsp; Refer to the Windows Platform SDK
! for details.</p>
! 
! <p class=MsoNormal>It is beyond the scope of this document to provide a
! comprehensive overview of how to add new resources through a transform.&nbsp;
! Please refer to the &quot;Windows Installer&quot; documentation for details.&nbsp;
! The relevant section is at :</p>
! 
! <p class=MsoNormal>http://msdn.microsoft.com/library/en-us/msi/setup/using_transforms_to_add_resources.asp</p>
! 
! <p class=MsoNormal>A sample walkthrough of adding a new configuration file is
! in section 2.3.</p>
! 
! <p class=MsoNormal>Add new features under the 'feaClient' or 'feaServer' as appropriate
! and set the 'Level' column for those features to equal the 'Level' for their
! parent features for consistency.&nbsp; Note that none of the features in the
! OpenAFS for Windows MSI package are designed to be installed to run from
! 'source' or 'advertised'.&nbsp; It is recommended that you set
! 'msidbFeatureAttributesFavorLocal' (0), 'msidbFeatureAttributesFollowParent'
! (2) and 'msidbFeatureAttributesDisallowAdvertise' (8) attributes for new
! features.</p>
! 
! <p class=MsoNormal>If you are creating new components, retain the same
! component GUID when creating new transforms against new releases of the OpenAFS
! MSI package.</p>
! 
! <p class=MsoNormal>After making the adjustments to the MSI database using
! ORCA.EXE you can generate a transform with MSITRAN.EXE as follows :</p>
! 
! <p class=MsoNormal>(Modified MSI package is 'openafs-en_US_new.msi' and the
! original MSI package is 'openafs-en_US.msi'.&nbsp; Generates transform
! 'openafs-transform.mst')</p>
! 
! <p class=MsoNormal>&nbsp;&nbsp;&nbsp; &gt; msitran.exe -g openafs-en_US.msi
! openafs-en_US_new.msi openafs-transform.mst</p>
! 
! <p class=MsoNormal>See the Platform SDK documentation for information on command
! line options for MSITRAN.EXE.</p>
! 
! <h2><a name="_Toc191662176"></a><a name="_Toc152605139"></a><a
! name="_Toc115416197"></a><a name="_Toc139993189"></a><a name="_Toc126872266"></a><a
! name="_Toc115417102"></a><span style='mso-bookmark:_Toc191662176'><span
! style='mso-bookmark:_Toc152605139'><span style='mso-bookmark:_Toc115416197'><span
! style='mso-fareast-font-family:"Times New Roman"'>7.4. Upgrades</span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal>The MSI package is designed to uninstall previous versions
! of OpenAFS for Windows during installation.&nbsp; Note that it doesn't directly
! upgrade an existing installation.&nbsp; This is intentional and ensures that
! development releases which do not have strictly increasing version numbers are
! properly upgraded.</p>
  
! <p class=MsoNormal>Versions of OpenAFS that are upgraded by the MSI package
! are:</p>
  
! <p class=MsoNormal style='margin-left:.5in;text-indent:-.25in'>1)<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>OpenAFS MSI package<br>
  Upgrade code {6823EEDD-84FC-4204-ABB3-A80D25779833}<br>
  Up to current release</p>
  
! <p class=MsoNormal style='margin-left:.5in;text-indent:-.25in'>2)<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>MIT's Transarc AFS MSI package<br>
  Upgrade code {5332B94F-DE38-4927-9EAB-51F4A64193A7}<br>
  Up to version 3.6.2</p>
  
! <p class=MsoNormal style='margin-left:.5in;text-indent:-.25in'>3)<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>OpenAFS NSIS package<br>
  All versions</p>
  
! <p class=MsoNormal>Note that versions of the OpenAFS NSIS package prior to
! 1.3.65 had a bug where it couldn't be uninstalled properly in unattended
! mode.&nbsp; Therefore the MSI package will not try to uninstall an OpenAFS NSIS
! package if running unattended.&nbsp; This means that group policy based
! deployments will fail on machines that have the OpenAFS NSIS package installed.</p>
! 
! <p class=MsoNormal>If you have used a different MSI package to install OpenAFS
! and wish to upgrade it you can author rows into the 'Upgrade' table as
! described in the Platform SDK.</p>
! 
! <p class=MsoNormal>When performing an upgrade with msiexec.exe execute the MSI
! with the repair options &quot;vomus&quot;.</p>
! 
! <h1><a name="_Toc191662177"></a><a name="_Toc152605140"></a><a
! name="_Toc139993190"></a><a name="_Toc126872267"></a><a name="_Toc115417116"></a><a
! name="_Toc115417103"></a><a name="_Toc115416198"></a><a
! name="_Appendix_A:_Registry_Values"></a><span style='mso-bookmark:_Toc191662177'><span
! style='mso-bookmark:_Toc152605140'><span style='mso-fareast-font-family:"Times New Roman"'>Appendix
! A: Registry Values</span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h1>
  
! <h2><a name="_Toc191662178"></a><a name="_Toc152605141"></a><a
! name="_Toc115416199"></a><a name="_Toc139993191"></a><a name="_Toc126872268"></a><a
! name="_Toc115417104"></a><span style='mso-bookmark:_Toc191662178'><span
! style='mso-bookmark:_Toc152605141'><span style='mso-bookmark:_Toc115416199'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.1. Service parameters</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoBodyText>The service parameters primarily affect the behavior of
! the AFS client service (afsd_service.exe).</p>
! 
! <h3><a name="_Toc191662179"></a><a name="_Toc152605142"></a><a
! name="_Toc115416200"></a><a name="_Toc139993192"></a><a name="_Toc126872269"></a><span
! style='mso-bookmark:_Toc191662179'><span style='mso-bookmark:_Toc152605142'><span
! style='mso-bookmark:_Toc115416200'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 5666,5813 ----
   </tr>
  </table>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! example adds a read-only mountpoint to the athena.mit.edu cell's root.afs
! volume as well as a read-write mountpoint.&nbsp; Aliases are also provided
! using symlinks.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871722"></a><a name="_Toc193871477"></a><a name="_Toc191662175"></a><a
! name="_Toc152605138"></a><a name="_Ref115275867"></a><a name="_Toc139993188"></a><a
! name="_Toc126872265"></a><a name="_Toc115417101"></a><a name="_Toc115416196"></a><span
! style='mso-bookmark:_Toc193871722'><span style='mso-bookmark:_Toc193871477'><span
! style='mso-bookmark:_Toc191662175'><span style='mso-bookmark:_Toc152605138'><span
! style='mso-bookmark:_Ref115275867'><span style='mso-fareast-font-family:"Times New Roman"'>7.3
! Additional Resources</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! you want to add registry keys or files you need to create new components and
! features for those.&nbsp; Refer to the Windows Platform SDK for details.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>It
! is beyond the scope of this document to provide a comprehensive overview of how
! to add new resources through a transform.&nbsp; Please refer to the
! &quot;Windows Installer&quot; documentation for details.&nbsp; The relevant
! section is at :</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>http://msdn.microsoft.com/library/en-us/msi/setup/using_transforms_to_add_resources.asp</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>A
! sample walkthrough of adding a new configuration file is in section 2.3.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Add
! new features under the 'feaClient' or 'feaServer' as appropriate and set the
! 'Level' column for those features to equal the 'Level' for their parent
! features for consistency.&nbsp; Note that none of the features in the OpenAFS
! for Windows MSI package are designed to be installed to run from 'source' or
! 'advertised'.&nbsp; It is recommended that you set 'msidbFeatureAttributesFavorLocal'
! (0), 'msidbFeatureAttributesFollowParent' (2) and
! 'msidbFeatureAttributesDisallowAdvertise' (8) attributes for new features.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! you are creating new components, retain the same component GUID when creating
! new transforms against new releases of the OpenAFS MSI package.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>After
! making the adjustments to the MSI database using ORCA.EXE you can generate a
! transform with MSITRAN.EXE as follows :</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>(Modified
! MSI package is 'openafs-en_US_new.msi' and the original MSI package is
! 'openafs-en_US.msi'.&nbsp; Generates transform 'openafs-transform.mst')</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;
! &gt; msitran.exe -g openafs-en_US.msi openafs-en_US_new.msi
! openafs-transform.mst</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>See
! the Platform SDK documentation for information on command line options for
! MSITRAN.EXE.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871723"></a><a name="_Toc193871478"></a><a name="_Toc191662176"></a><a
! name="_Toc152605139"></a><a name="_Toc115416197"></a><a name="_Toc139993189"></a><a
! name="_Toc126872266"></a><a name="_Toc115417102"></a><span style='mso-bookmark:
! _Toc193871723'><span style='mso-bookmark:_Toc193871478'><span style='mso-bookmark:
! _Toc191662176'><span style='mso-bookmark:_Toc152605139'><span style='mso-bookmark:
! _Toc115416197'><span style='mso-fareast-font-family:"Times New Roman"'>7.4.
! Upgrades</span></span></span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! MSI package is designed to uninstall previous versions of OpenAFS for Windows
! during installation.&nbsp; Note that it doesn't directly upgrade an existing
! installation.&nbsp; This is intentional and ensures that development releases
! which do not have strictly increasing version numbers are properly upgraded.</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Versions
! of OpenAFS that are upgraded by the MSI package are:</p>
  
! <p class=MsoNormal style='margin-left:.5in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1)<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>OpenAFS MSI package<br>
  Upgrade code {6823EEDD-84FC-4204-ABB3-A80D25779833}<br>
  Up to current release</p>
  
! <p class=MsoNormal style='margin-left:.5in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2)<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>MIT's Transarc AFS MSI package<br>
  Upgrade code {5332B94F-DE38-4927-9EAB-51F4A64193A7}<br>
  Up to version 3.6.2</p>
  
! <p class=MsoNormal style='margin-left:.5in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3)<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>OpenAFS NSIS package<br>
  All versions</p>
  
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Note
! that versions of the OpenAFS NSIS package prior to 1.3.65 had a bug where it
! couldn't be uninstalled properly in unattended mode.&nbsp; Therefore the MSI
! package will not try to uninstall an OpenAFS NSIS package if running
! unattended.&nbsp; This means that group policy based deployments will fail on
! machines that have the OpenAFS NSIS package installed.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! you have used a different MSI package to install OpenAFS and wish to upgrade it
! you can author rows into the 'Upgrade' table as described in the Platform SDK.</p>
! 
! <p class=MsoNormal style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>When
! performing an upgrade with msiexec.exe execute the MSI with the repair options
! &quot;vomus&quot;.</p>
! 
! <h1 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871724"></a><a name="_Toc193871479"></a><a name="_Toc191662177"></a><a
! name="_Toc152605140"></a><a name="_Toc139993190"></a><a name="_Toc126872267"></a><a
! name="_Toc115417116"></a><a name="_Toc115417103"></a><a name="_Toc115416198"></a><a
! name="_Appendix_A:_Registry_Values"></a><a name="_Appendix_A:_Registry"></a><span
! style='mso-bookmark:_Toc193871724'><span style='mso-bookmark:_Toc193871479'><span
! style='mso-bookmark:_Toc191662177'><span style='mso-bookmark:_Toc152605140'><span
! style='mso-fareast-font-family:"Times New Roman"'>Appendix A: Registry Values</span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h1>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871725"></a><a name="_Toc193871480"></a><a name="_Toc191662178"></a><a
! name="_Toc152605141"></a><a name="_Toc115416199"></a><a name="_Toc139993191"></a><a
! name="_Toc126872268"></a><a name="_Toc115417104"></a><span style='mso-bookmark:
! _Toc193871725'><span style='mso-bookmark:_Toc193871480'><span style='mso-bookmark:
! _Toc191662178'><span style='mso-bookmark:_Toc152605141'><span style='mso-bookmark:
! _Toc115416199'><span style='mso-fareast-font-family:"Times New Roman"'>A.1.
! Service parameters</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! service parameters primarily affect the behavior of the AFS client service
! (afsd_service.exe).</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871726"></a><a name="_Toc193871481"></a><a name="_Toc191662179"></a><a
! name="_Toc152605142"></a><a name="_Toc115416200"></a><a name="_Toc139993192"></a><a
! name="_Toc126872269"></a><span style='mso-bookmark:_Toc193871726'><span
! style='mso-bookmark:_Toc193871481'><span style='mso-bookmark:_Toc191662179'><span
! style='mso-bookmark:_Toc152605142'><span style='mso-bookmark:_Toc115416200'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 5098,5104 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.25pt'>
    <h5><a name="_Toc191662180"></a><a name="_Toc152605143"></a><a
!   name="_Toc115416201"></a><a name="_Toc126872270"></a><a name="_Toc139993193"></a><span
    style='mso-bookmark:_Toc191662180'><span style='mso-bookmark:_Toc152605143'><span
    style='mso-bookmark:_Toc115416201'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LANadapter</span></span></span></span><span style='mso-fareast-font-family:
--- 5816,5822 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.25pt'>
    <h5><a name="_Toc191662180"></a><a name="_Toc152605143"></a><a
!   name="_Toc115416201"></a><a name="_Toc139993193"></a><a name="_Toc126872270"></a><span
    style='mso-bookmark:_Toc191662180'><span style='mso-bookmark:_Toc152605143'><span
    style='mso-bookmark:_Toc115416201'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LANadapter</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5119,5129 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662181"></a><a name="_Toc152605144"></a><a
!   name="_Value___:_CacheSize"></a><a name="_Toc115416202"></a><a
!   name="_Toc126872271"></a><a name="_Toc139993194"></a><span style='mso-bookmark:
!   _Toc191662181'><span style='mso-bookmark:_Toc152605144'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: CacheSize</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
    Default: 98304 (CM_CONFIGDEFAULT_CACHESIZE)<br>
    Variable: cm_initParams.cacheSize</p>
--- 5837,5846 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662181"></a><a name="_Toc152605144"></a><a
!   name="_Toc139993194"></a><a name="_Toc126872271"></a><a name="_Toc115416202"></a><a
!   name="_Value___:_CacheSize"></a><span style='mso-bookmark:_Toc191662181'><span
!   style='mso-bookmark:_Toc152605144'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   CacheSize</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
    Default: 98304 (CM_CONFIGDEFAULT_CACHESIZE)<br>
    Variable: cm_initParams.cacheSize</p>
***************
*** 5134,5140 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662182"></a><a name="_Toc152605145"></a><a
!   name="_Toc115416203"></a><a name="_Toc126872272"></a><a name="_Toc139993195"></a><span
    style='mso-bookmark:_Toc191662182'><span style='mso-bookmark:_Toc152605145'><span
    style='mso-bookmark:_Toc115416203'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ChunkSize</span></span></span></span><span style='mso-fareast-font-family:
--- 5851,5857 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662182"></a><a name="_Toc152605145"></a><a
!   name="_Toc115416203"></a><a name="_Toc139993195"></a><a name="_Toc126872272"></a><span
    style='mso-bookmark:_Toc191662182'><span style='mso-bookmark:_Toc152605145'><span
    style='mso-bookmark:_Toc115416203'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ChunkSize</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5150,5161 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662183"></a><a name="_Toc152605146"></a><a
!   name="_Toc115416204"></a><a name="_Toc126872273"></a><a name="_Toc139993196"></a><span
    style='mso-bookmark:_Toc191662183'><span style='mso-bookmark:_Toc152605146'><span
    style='mso-bookmark:_Toc115416204'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Daemons</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
!   Default: 2 (CM_CONFIGDEFAULT_DAEMONS)<br>
    Variable: numBkgD</p>
    <p class=MsoBodyText>Number of background daemons (number of threads of
    cm_BkgDaemon). (see cm_BkgDaemon in cm_daemon.c)</p>
--- 5867,5878 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662183"></a><a name="_Toc152605146"></a><a
!   name="_Toc115416204"></a><a name="_Toc139993196"></a><a name="_Toc126872273"></a><span
    style='mso-bookmark:_Toc191662183'><span style='mso-bookmark:_Toc152605146'><span
    style='mso-bookmark:_Toc115416204'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Daemons</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
!   Default: 4 (CM_CONFIGDEFAULT_DAEMONS)<br>
    Variable: numBkgD</p>
    <p class=MsoBodyText>Number of background daemons (number of threads of
    cm_BkgDaemon). (see cm_BkgDaemon in cm_daemon.c)</p>
***************
*** 5165,5171 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662184"></a><a name="_Toc152605147"></a><a
!   name="_Toc115416205"></a><a name="_Toc126872274"></a><a name="_Toc139993197"></a><span
    style='mso-bookmark:_Toc191662184'><span style='mso-bookmark:_Toc152605147'><span
    style='mso-bookmark:_Toc115416205'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ServerThreads</span></span></span></span><span style='mso-fareast-font-family:
--- 5882,5888 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662184"></a><a name="_Toc152605147"></a><a
!   name="_Toc115416205"></a><a name="_Toc139993197"></a><a name="_Toc126872274"></a><span
    style='mso-bookmark:_Toc191662184'><span style='mso-bookmark:_Toc152605147'><span
    style='mso-bookmark:_Toc115416205'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ServerThreads</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5181,5188 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662185"></a><a name="_Toc152605148"></a><a
!   name="_Toc115416206"></a><a name="_Toc126872275"></a><a name="_Toc139993198"></a><a
!   name="_Value:_Stats"></a><span style='mso-bookmark:_Toc191662185'><span
    style='mso-bookmark:_Toc152605148'><span style='mso-bookmark:_Toc115416206'><span
    style='mso-fareast-font-family:"Times New Roman"'>Value: Stats</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
--- 5898,5905 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662185"></a><a name="_Toc152605148"></a><a
!   name="_Toc115416206"></a><a name="_Value:_Stats"></a><a name="_Toc139993198"></a><a
!   name="_Toc126872275"></a><span style='mso-bookmark:_Toc191662185'><span
    style='mso-bookmark:_Toc152605148'><span style='mso-bookmark:_Toc115416206'><span
    style='mso-fareast-font-family:"Times New Roman"'>Value: Stats</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
***************
*** 5192,5206 ****
    <p class=MsoBodyText>Cache configuration.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:6;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662186"></a><a name="_Toc152605149"></a><a
!   name="_Value_:_LogoffPreserveTokens"></a><a name="_Toc115416207"></a><a
!   name="_Toc126872276"></a><a name="_Toc139993199"></a><span style='mso-bookmark:
!   _Toc191662186'><span style='mso-bookmark:_Toc152605149'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: LogoffPreserveTokens</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default : 0</p>
    <p class=MsoBodyText>If enabled (set to 1), the Logoff Event handler will not
--- 5909,5946 ----
    <p class=MsoBodyText>Cache configuration.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:6;height:79.25pt'>
!   <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
!   height:79.25pt'>
!   <h5><span style='mso-fareast-font-family:"Times New Roman"'>Value: Volumes<o:p></o:p></span></h5>
!   <p class=MsoBodyText>Type: DWORD<br>
!   Default: <span style='mso-spacerun:yes'> </span>3333 (CM_CONFIGDEFAULT_STATS/3)<br>
!   Variable: cm_initParams.nVolumes</p>
!   <h5><span style='font-weight:normal;mso-bidi-font-weight:bold'>Cache
!   configuration.<o:p></o:p></span></h5>
!   </td>
!  </tr>
!  <tr style='mso-yfti-irow:7;height:79.25pt'>
!   <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
!   height:79.25pt'>
!   <h5><span style='mso-fareast-font-family:"Times New Roman"'>Value: Cells<o:p></o:p></span></h5>
!   <p class=MsoBodyText>Type: DWORD<br>
!   Default: 1024 (CM_CONFIGDEFAULT_CELLS)<br>
!   Variable: cm_initParams.nCells</p>
!   <h5><span style='font-weight:normal;mso-bidi-font-weight:bold'>Cache
!   configuration.</span><span style='mso-fareast-font-family:"Times New Roman";
!   font-weight:normal;mso-bidi-font-weight:bold'><o:p></o:p></span></h5>
!   </td>
!  </tr>
!  <tr style='mso-yfti-irow:8;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662186"></a><a name="_Toc152605149"></a><a
!   name="_Toc139993199"></a><a name="_Toc126872276"></a><a name="_Toc115416207"></a><a
!   name="_Value_:_LogoffPreserveTokens"></a><span style='mso-bookmark:_Toc191662186'><span
!   style='mso-bookmark:_Toc152605149'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   LogoffPreserveTokens</span></span></span><span style='mso-fareast-font-family:
!   "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default : 0</p>
    <p class=MsoBodyText>If enabled (set to 1), the Logoff Event handler will not
***************
*** 5208,5218 ****
    outside of AFS.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:7;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662187"></a><a name="_Toc152605150"></a><a
!   name="_Toc115416208"></a><a name="_Toc126872277"></a><a name="_Toc139993200"></a><span
    style='mso-bookmark:_Toc191662187'><span style='mso-bookmark:_Toc152605150'><span
    style='mso-bookmark:_Toc115416208'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    RootVolume</span></span></span></span><span style='mso-fareast-font-family:
--- 5948,5958 ----
    outside of AFS.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:9;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662187"></a><a name="_Toc152605150"></a><a
!   name="_Toc115416208"></a><a name="_Toc139993200"></a><a name="_Toc126872277"></a><span
    style='mso-bookmark:_Toc191662187'><span style='mso-bookmark:_Toc152605150'><span
    style='mso-bookmark:_Toc115416208'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    RootVolume</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5223,5237 ****
    <p class=MsoBodyText>Root volume name.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:8;height:145.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.25pt'>
    <h5><a name="_Toc191662188"></a><a name="_Toc152605151"></a><a
!   name="_Value_:_Mountroot"></a><a name="_Toc115416209"></a><a
!   name="_Toc126872278"></a><a name="_Toc139993201"></a><span style='mso-bookmark:
!   _Toc191662188'><span style='mso-bookmark:_Toc152605151'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: MountRoot</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &quot;/afs&quot;<br>
    Variable: cm_mountRoot</p>
--- 5963,5976 ----
    <p class=MsoBodyText>Root volume name.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:10;height:145.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.25pt'>
    <h5><a name="_Toc191662188"></a><a name="_Toc152605151"></a><a
!   name="_Toc139993201"></a><a name="_Toc126872278"></a><a name="_Toc115416209"></a><a
!   name="_Value_:_Mountroot"></a><span style='mso-bookmark:_Toc191662188'><span
!   style='mso-bookmark:_Toc152605151'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   MountRoot</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &quot;/afs&quot;<br>
    Variable: cm_mountRoot</p>
***************
*** 5241,5259 ****
    /afs/athena.mit.edu/foo/bar/baz and cm_mountRoot is &quot;/afs&quot;, then
    the path is interpreted as \\afs\all\athena.mit.edu\foo\bar\baz.&nbsp; If a
    path does not start with with cm_mountRoot, the path is assumed to be
!   relative and suffixed to the reference directory (i.e. directory where the symlink
!   exists)</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:9;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662189"></a><a name="_Toc152605152"></a><a
!   name="_Value_:_CachePath"></a><a name="_Toc115416210"></a><a
!   name="_Toc126872279"></a><a name="_Toc139993202"></a><span style='mso-bookmark:
!   _Toc191662189'><span style='mso-bookmark:_Toc152605152'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: CachePath</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ or REG_EXPAND_SZ<br>
    Default: &quot;%TEMP%\AFSCache&quot;<br>
    Variable: cm_CachePath</p>
--- 5980,5997 ----
    /afs/athena.mit.edu/foo/bar/baz and cm_mountRoot is &quot;/afs&quot;, then
    the path is interpreted as \\afs\all\athena.mit.edu\foo\bar\baz.&nbsp; If a
    path does not start with with cm_mountRoot, the path is assumed to be
!   relative and suffixed to the reference directory (i.e. directory where the
!   symlink exists)</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:11;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662189"></a><a name="_Toc152605152"></a><a
!   name="_Toc139993202"></a><a name="_Toc126872279"></a><a name="_Toc115416210"></a><a
!   name="_Value_:_CachePath"></a><span style='mso-bookmark:_Toc191662189'><span
!   style='mso-bookmark:_Toc152605152'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   CachePath</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ or REG_EXPAND_SZ<br>
    Default: &quot;%TEMP%\AFSCache&quot;<br>
    Variable: cm_CachePath</p>
***************
*** 5262,5272 ****
    are HIDDEN and SYSTEM.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:10;height:119.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:119.0pt'>
    <h5><a name="_Toc191662190"></a><a name="_Toc152605153"></a><a
!   name="_Toc115416211"></a><a name="_Toc126872280"></a><a name="_Toc139993203"></a><span
    style='mso-bookmark:_Toc191662190'><span style='mso-bookmark:_Toc152605153'><span
    style='mso-bookmark:_Toc115416211'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    NonPersistentCaching</span></span></span></span><span style='mso-fareast-font-family:
--- 6000,6010 ----
    are HIDDEN and SYSTEM.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:12;height:119.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:119.0pt'>
    <h5><a name="_Toc191662190"></a><a name="_Toc152605153"></a><a
!   name="_Toc115416211"></a><a name="_Toc139993203"></a><a name="_Toc126872280"></a><span
    style='mso-bookmark:_Toc191662190'><span style='mso-bookmark:_Toc152605153'><span
    style='mso-bookmark:_Toc115416211'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    NonPersistentCaching</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5280,5290 ****
    maintain a single UUID for the AFS client service across restarts.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:11;height:125.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:125.5pt'>
    <h5><a name="_Toc191662191"></a><a name="_Toc152605154"></a><a
!   name="_Toc115416212"></a><a name="_Toc126872281"></a><a name="_Toc139993204"></a><span
    style='mso-bookmark:_Toc191662191'><span style='mso-bookmark:_Toc152605154'><span
    style='mso-bookmark:_Toc115416212'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ValidateCache</span></span></span></span><span style='mso-fareast-font-family:
--- 6018,6028 ----
    maintain a single UUID for the AFS client service across restarts.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:13;height:125.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:125.5pt'>
    <h5><a name="_Toc191662191"></a><a name="_Toc152605154"></a><a
!   name="_Toc115416212"></a><a name="_Toc139993204"></a><a name="_Toc126872281"></a><span
    style='mso-bookmark:_Toc191662191'><span style='mso-bookmark:_Toc152605154'><span
    style='mso-bookmark:_Toc115416212'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ValidateCache</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5299,5309 ****
    2 - Validation is performed at shutdown</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:12;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662192"></a><a name="_Toc152605155"></a><a
!   name="_Toc115416213"></a><a name="_Toc126872282"></a><a name="_Toc139993205"></a><span
    style='mso-bookmark:_Toc191662192'><span style='mso-bookmark:_Toc152605155'><span
    style='mso-bookmark:_Toc115416213'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    TrapOnPanic</span></span></span></span><span style='mso-fareast-font-family:
--- 6037,6047 ----
    2 - Validation is performed at shutdown</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:14;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662192"></a><a name="_Toc152605155"></a><a
!   name="_Toc115416213"></a><a name="_Toc139993205"></a><a name="_Toc126872282"></a><span
    style='mso-bookmark:_Toc191662192'><span style='mso-bookmark:_Toc152605155'><span
    style='mso-bookmark:_Toc115416213'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    TrapOnPanic</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5315,5329 ****
    (breakpoint: _asm int 3).</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:13;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662193"></a><a name="_Toc152605156"></a><a
!   name="_Value___:_NetbiosName"></a><a name="_Toc115416214"></a><a
!   name="_Toc126872283"></a><a name="_Toc139993206"></a><span style='mso-bookmark:
!   _Toc191662193'><span style='mso-bookmark:_Toc152605156'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: NetbiosName</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_EXPAND_SZ<br>
    Default: &quot;AFS&quot;<br>
    Variable: cm_NetbiosName</p>
--- 6053,6066 ----
    (breakpoint: _asm int 3).</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:15;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662193"></a><a name="_Toc152605156"></a><a
!   name="_Toc139993206"></a><a name="_Toc126872283"></a><a name="_Toc115416214"></a><a
!   name="_Value___:_NetbiosName"></a><span style='mso-bookmark:_Toc191662193'><span
!   style='mso-bookmark:_Toc152605156'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   NetbiosName</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_EXPAND_SZ<br>
    Default: &quot;AFS&quot;<br>
    Variable: cm_NetbiosName</p>
***************
*** 5332,5342 ****
    &quot;%COMPUTERNAME%-AFS&quot;.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:14;height:152.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:152.0pt'>
    <h5><a name="_Toc191662194"></a><a name="_Toc152605157"></a><a
!   name="_Toc115416215"></a><a name="_Toc126872284"></a><a name="_Toc139993207"></a><span
    style='mso-bookmark:_Toc191662194'><span style='mso-bookmark:_Toc152605157'><span
    style='mso-bookmark:_Toc115416215'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    IsGateway</span></span></span></span><span style='mso-fareast-font-family:
--- 6069,6079 ----
    &quot;%COMPUTERNAME%-AFS&quot;.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:16;height:152.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:152.0pt'>
    <h5><a name="_Toc191662194"></a><a name="_Toc152605157"></a><a
!   name="_Toc115416215"></a><a name="_Toc139993207"></a><a name="_Toc126872284"></a><span
    style='mso-bookmark:_Toc191662194'><span style='mso-bookmark:_Toc152605157'><span
    style='mso-bookmark:_Toc115416215'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    IsGateway</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5354,5364 ****
    the &quot;NetbiosName&quot; registry value.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:15;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662195"></a><a name="_Toc152605158"></a><a
!   name="_Toc115416216"></a><a name="_Toc126872285"></a><a name="_Toc139993208"></a><span
    style='mso-bookmark:_Toc191662195'><span style='mso-bookmark:_Toc152605158'><span
    style='mso-bookmark:_Toc115416216'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ReportSessionStartups</span></span></span></span><span style='mso-fareast-font-family:
--- 6091,6101 ----
    the &quot;NetbiosName&quot; registry value.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:17;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662195"></a><a name="_Toc152605158"></a><a
!   name="_Toc115416216"></a><a name="_Toc139993208"></a><a name="_Toc126872285"></a><span
    style='mso-bookmark:_Toc191662195'><span style='mso-bookmark:_Toc152605158'><span
    style='mso-bookmark:_Toc115416216'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ReportSessionStartups</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5371,5400 ****
    mappings or various error types to be logged.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:16;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662196"></a><a name="_Toc152605159"></a><a
!   name="_Value_:_TraceBufferSize"></a><a name="_Toc115416217"></a><a
!   name="_Toc126872286"></a><a name="_Toc139993209"></a><span style='mso-bookmark:
!   _Toc191662196'><span style='mso-bookmark:_Toc152605159'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: TraceBufferSize</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
!   Default: 5000 (CM_CONFIGDEFAULT_TRACEBUFSIZE)<br>
    Variable: traceBufSize</p>
    <p class=MsoBodyText>Number of entries to keep in trace log.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:17;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662197"></a><a name="_Toc152605160"></a><a
!   name="_Value_:_SysName"></a><a name="_Toc115416218"></a><a
!   name="_Toc126872287"></a><a name="_Toc139993210"></a><span style='mso-bookmark:
!   _Toc191662197'><span style='mso-bookmark:_Toc152605160'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: SysName</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &quot;x86_win32 i386_w2k i386_nt40&quot; (X86) <br>
    “amd64_win64 x86_win32 i386_w2k” (AMD64)<br>
--- 6108,6136 ----
    mappings or various error types to be logged.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:18;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662196"></a><a name="_Toc152605159"></a><a
!   name="_Toc139993209"></a><a name="_Toc126872286"></a><a name="_Toc115416217"></a><a
!   name="_Value_:_TraceBufferSize"></a><span style='mso-bookmark:_Toc191662196'><span
!   style='mso-bookmark:_Toc152605159'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   TraceBufferSize</span></span></span><span style='mso-fareast-font-family:
!   "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
!   Default: 10000 (CM_CONFIGDEFAULT_TRACEBUFSIZE)<br>
    Variable: traceBufSize</p>
    <p class=MsoBodyText>Number of entries to keep in trace log.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:19;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662197"></a><a name="_Toc152605160"></a><a
!   name="_Toc139993210"></a><a name="_Toc126872287"></a><a name="_Toc115416218"></a><a
!   name="_Value_:_SysName"></a><span style='mso-bookmark:_Toc191662197'><span
!   style='mso-bookmark:_Toc152605160'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   SysName</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &quot;x86_win32 i386_w2k i386_nt40&quot; (X86) <br>
    “amd64_win64 x86_win32 i386_w2k” (AMD64)<br>
***************
*** 5404,5462 ****
    for @sys in order of preference separated by whitespace.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:18;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662198"></a><a name="_Toc152605161"></a><a
!   name="_Value_:_SecurityLevel"></a><a name="_Toc115416219"></a><a
!   name="_Toc126872288"></a><a name="_Toc139993211"></a><span style='mso-bookmark:
!   _Toc191662198'><span style='mso-bookmark:_Toc152605161'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: SecurityLevel</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default: 0<br>
    Variable: cryptall</p>
    <p class=MsoBodyText>Enables encryption on RX calls.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:19;height:112.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:112.25pt'>
    <h5><a name="_Toc191662199"></a><a name="_Toc152605162"></a><a
!   name="_Value_:_UseDNS"></a><a name="_Toc115416220"></a><a name="_Toc126872289"></a><a
!   name="_Toc139993212"></a><span style='mso-bookmark:_Toc191662199'><span
    style='mso-bookmark:_Toc152605162'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    UseDNS</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default: 1<br>
    Variable: cm_dnsEnabled</p>
    <p class=MsoBodyText>Enables resolving volservers using AFSDB DNS queries.</p>
!   <p class=MsoBodyText>As of 1.3.60, this value is ignored as the DNS query support
!   utilizes the Win32 DNSQuery API which is available on Win2000 and above.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:20;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662200"></a><a name="_Toc152605163"></a><a
!   name="_Value_:_FreelanceClient"></a><a name="_Toc115416221"></a><a
!   name="_Toc126872290"></a><a name="_Toc139993213"></a><span style='mso-bookmark:
!   _Toc191662200'><span style='mso-bookmark:_Toc152605163'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: FreelanceClient</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default: 0<br>
    Variable: cm_freelanceEnabled</p>
    <p class=MsoBodyText>Enables freelance client.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:21;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662201"></a><a name="_Toc152605164"></a><a
!   name="_Value_:_HideDotFiles"></a><a name="_Toc115416222"></a><a
!   name="_Toc126872291"></a><a name="_Toc139993214"></a><a
!   name="_Value:_HideDotFiles"></a><span style='mso-bookmark:_Toc191662201'><span
    style='mso-bookmark:_Toc152605164'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    HideDotFiles</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
--- 6140,6198 ----
    for @sys in order of preference separated by whitespace.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:20;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662198"></a><a name="_Toc152605161"></a><a
!   name="_Toc139993211"></a><a name="_Toc126872288"></a><a name="_Toc115416219"></a><a
!   name="_Value_:_SecurityLevel"></a><span style='mso-bookmark:_Toc191662198'><span
!   style='mso-bookmark:_Toc152605161'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   SecurityLevel</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default: 0<br>
    Variable: cryptall</p>
    <p class=MsoBodyText>Enables encryption on RX calls.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:21;height:112.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:112.25pt'>
    <h5><a name="_Toc191662199"></a><a name="_Toc152605162"></a><a
!   name="_Toc139993212"></a><a name="_Toc126872289"></a><a name="_Toc115416220"></a><a
!   name="_Value_:_UseDNS"></a><span style='mso-bookmark:_Toc191662199'><span
    style='mso-bookmark:_Toc152605162'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    UseDNS</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default: 1<br>
    Variable: cm_dnsEnabled</p>
    <p class=MsoBodyText>Enables resolving volservers using AFSDB DNS queries.</p>
!   <p class=MsoBodyText>As of 1.3.60, this value is ignored as the DNS query
!   support utilizes the Win32 DNSQuery API which is available on Win2000 and
!   above.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:22;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662200"></a><a name="_Toc152605163"></a><a
!   name="_Toc139993213"></a><a name="_Toc126872290"></a><a name="_Toc115416221"></a><a
!   name="_Value_:_FreelanceClient"></a><span style='mso-bookmark:_Toc191662200'><span
!   style='mso-bookmark:_Toc152605163'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   FreelanceClient</span></span></span><span style='mso-fareast-font-family:
!   "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
    Default: 0<br>
    Variable: cm_freelanceEnabled</p>
    <p class=MsoBodyText>Enables freelance client.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:23;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662201"></a><a name="_Toc152605164"></a><a
!   name="_Value:_HideDotFiles"></a><a name="_Toc139993214"></a><a
!   name="_Toc126872291"></a><a name="_Toc115416222"></a><a
!   name="_Value_:_HideDotFiles"></a><span style='mso-bookmark:_Toc191662201'><span
    style='mso-bookmark:_Toc152605164'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    HideDotFiles</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {1,0}<br>
***************
*** 5467,5477 ****
    (excluding &quot;.&quot; and &quot;..&quot;).</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:22;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662202"></a><a name="_Toc152605165"></a><a
!   name="_Toc115416223"></a><a name="_Toc126872292"></a><a name="_Toc139993215"></a><span
    style='mso-bookmark:_Toc191662202'><span style='mso-bookmark:_Toc152605165'><span
    style='mso-bookmark:_Toc115416223'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MaxMpxRequests</span></span></span></span><span style='mso-fareast-font-family:
--- 6203,6213 ----
    (excluding &quot;.&quot; and &quot;..&quot;).</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:24;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662202"></a><a name="_Toc152605165"></a><a
!   name="_Toc115416223"></a><a name="_Toc139993215"></a><a name="_Toc126872292"></a><span
    style='mso-bookmark:_Toc191662202'><span style='mso-bookmark:_Toc152605165'><span
    style='mso-bookmark:_Toc115416223'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MaxMpxRequests</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5483,5493 ****
    made.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:23;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662203"></a><a name="_Toc152605166"></a><a
!   name="_Toc115416224"></a><a name="_Toc126872293"></a><a name="_Toc139993216"></a><span
    style='mso-bookmark:_Toc191662203'><span style='mso-bookmark:_Toc152605166'><span
    style='mso-bookmark:_Toc115416224'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MaxVCPerServer</span></span></span></span><span style='mso-fareast-font-family:
--- 6219,6229 ----
    made.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:25;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662203"></a><a name="_Toc152605166"></a><a
!   name="_Toc115416224"></a><a name="_Toc139993216"></a><a name="_Toc126872293"></a><span
    style='mso-bookmark:_Toc191662203'><span style='mso-bookmark:_Toc152605166'><span
    style='mso-bookmark:_Toc115416224'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MaxVCPerServer</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5498,5509 ****
    <p class=MsoBodyText>Maximum number of SMB virtual circuits.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:24;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662204"></a><a name="_Toc152605167"></a><a
!   name="_Value_:_Cell"></a><a name="_Toc115416225"></a><a name="_Toc126872294"></a><a
!   name="_Toc139993217"></a><span style='mso-bookmark:_Toc191662204'><span
    style='mso-bookmark:_Toc152605167'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Cell</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
--- 6234,6245 ----
    <p class=MsoBodyText>Maximum number of SMB virtual circuits.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:26;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662204"></a><a name="_Toc152605167"></a><a
!   name="_Toc139993217"></a><a name="_Toc126872294"></a><a name="_Toc115416225"></a><a
!   name="_Value_:_Cell"></a><span style='mso-bookmark:_Toc191662204'><span
    style='mso-bookmark:_Toc152605167'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Cell</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
***************
*** 5513,5577 ****
    be mounted in \\afs\all).</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:25;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
!   <h5><a name="_Toc191662205"></a><a name="_Toc152605168"></a><a
!   name="_Toc115416226"></a><a name="_Toc126872295"></a><a name="_Toc139993218"></a><span
!   style='mso-bookmark:_Toc191662205'><span style='mso-bookmark:_Toc152605168'><span
!   style='mso-bookmark:_Toc115416226'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   RxNoJumbo</span></span></span></span><span style='mso-fareast-font-family:
!   "Times New Roman"'><o:p></o:p></span></h5>
!   <p class=MsoBodyText>Type: DWORD {0,1}<br>
!   Default: 0<br>
!   Variable: rx_nojumbo</p>
!   <p class=MsoBodyText>If enabled, does not send or indicate that we are able
!   to send or receive RX jumbograms.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:26;height:124.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:124.75pt'>
!   <h5><a name="_Toc191662206"></a><a name="_Toc152605169"></a><a
!   name="_Value_:_RxMaxMTU"></a><a name="_Toc115416227"></a><a
!   name="_Toc126872296"></a><a name="_Toc139993219"></a><span style='mso-bookmark:
!   _Toc191662206'><span style='mso-bookmark:_Toc152605169'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: RxMaxMTU</span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
!   <p class=MsoBodyText>Type: DWORD<br>
!   Default: -1<br>
!   Variable: rx_mtu</p>
!   <p class=MsoBodyText>If set to anything other than -1, uses that value as the
!   maximum MTU supported by the RX interface.</p>
!   <p class=MsoBodyText>In order to enable OpenAFS to operate across the Cisco
!   IPSec VPN client, this value must be set to 1264 or smaller.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:27;height:151.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:151.75pt'>
    <h5><a name="_Toc191662207"></a><a name="_Toc152605170"></a><a
!   name="_Value:_ConnDeadTimeout"></a><a name="_Toc115416228"></a><a
!   name="_Toc126872297"></a><a name="_Toc139993220"></a><span style='mso-bookmark:
!   _Toc191662207'><span style='mso-bookmark:_Toc152605170'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: ConnDeadTimeout</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
    Default: 60 (seconds)<br>
    Variable: ConnDeadtimeout</p>
    <p class=MsoBodyText>The Connection Dead Time is enforced to be at a minimum
!   15 seconds longer than the minimum SMB timeout as specified by [HKLM\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters]
    SessTimeout</p>
    <p class=MsoBodyText>If the minimum SMB timeout is not specified the value is
    45 seconds.&nbsp; See <a
!   href="http://support.microsoft.com/support/kb/articles/Q102/0/67.asp">http://support.microsoft.com:80/support/kb/articles/Q102/0/67.asp</a></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:28;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662208"></a><a name="_Toc152605171"></a><a
!   name="_Toc115416229"></a><a name="_Toc126872298"></a><a name="_Toc139993221"></a><span
    style='mso-bookmark:_Toc191662208'><span style='mso-bookmark:_Toc152605171'><span
    style='mso-bookmark:_Toc115416229'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    HardDeadTimeout</span></span></span></span><span style='mso-fareast-font-family:
--- 6249,6363 ----
    be mounted in \\afs\all).</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:27;height:79.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
!   <h5><a name="_Toc115416226"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   RxEnablePeerStats</span></a></h5>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>Type: DWORD {0,
!   1}<br>
!   Default: 1<br>
!   Variable: rx_enable_peer_stats</span></p>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>When set to 1,
!   the Rx library collects peer statistics.</span></p>
!   <p><span style='mso-bookmark:_Toc115416226'>&nbsp;</span></p>
    </td>
+   <span style='mso-bookmark:_Toc115416226'></span>
   </tr>
!  <tr style='mso-yfti-irow:28;height:79.25pt'>
!   <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
!   height:79.25pt'>
!   <h5><span style='mso-bookmark:_Toc115416226'><span style='mso-fareast-font-family:
!   "Times New Roman"'>Value: Rx</span>EnableProcessStats</span><span
!   style='mso-bookmark:_Toc115416226'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h5>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>Type: DWORD {0,
!   1}<br>
!   Default: 1<br>
!   Variable: rx_extra_process_stats</span></p>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>When set to 1,
!   the Rx library collects process statistics.</span></p>
!   <p class=MsoNormal style='margin:0in;margin-bottom:.0001pt'><span
!   style='mso-bookmark:_Toc115416226'><span style='font-size:10.0pt;font-family:
!   "Times New Roman","serif";mso-fareast-font-family:"Times New Roman"'>&nbsp;<o:p></o:p></span></span></p>
!   </td>
!   <span style='mso-bookmark:_Toc115416226'></span>
!  </tr>
!  <tr style='mso-yfti-irow:29;height:124.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:124.75pt'>
!   <h5><span style='mso-bookmark:_Toc115416226'><span style='mso-fareast-font-family:
!   "Times New Roman"'>Value: RxExtraPackets<o:p></o:p></span></span></h5>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>Type: DWORD <br>
!   Default: 120<br>
!   Variable: rx_extraPackets</span></p>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>When set, this
!   number of extra Rx packets are allocated at startup.</span></p>
!   </td>
!   <span style='mso-bookmark:_Toc115416226'></span>
!  </tr>
!  <tr style='mso-yfti-irow:30;height:124.75pt'>
!   <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
!   height:124.75pt'>
!   <h5><span style='mso-bookmark:_Toc115416226'><a name="_Toc191662206"></a><a
!   name="_Toc152605169"></a><a name="_Toc139993219"></a><a name="_Toc126872296"></a><a
!   name="_Toc115416227"></a><a name="_Value_:_RxMaxMTU"></a><span
!   style='mso-bookmark:_Toc191662206'><span style='mso-bookmark:_Toc152605169'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: RxMaxMTU</span></span></span></span><span
!   style='mso-bookmark:_Toc115416226'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h5>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>Type: DWORD<br>
!   Default: 0<br>
!   Variable: rx_mtu</span></p>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>If set to
!   anything other than 0, that value is used as the maximum send and receive MTU
!   supported by the RX interface.</span></p>
!   <p class=MsoBodyText><span style='mso-bookmark:_Toc115416226'>In order to
!   enable OpenAFS to operate across releases of the Cisco IPSec VPN client prior
!   than 5.0, this value must be set to 1264 or smaller.</span></p>
!   </td>
!   <span style='mso-bookmark:_Toc115416226'></span>
!  </tr>
!  <tr style='mso-yfti-irow:31;height:101.65pt'>
!   <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
!   height:101.65pt'>
!   <h5><span style='mso-bookmark:_Toc115416226'><a name="_Toc139993218"></a><a
!   name="_Toc126872295"></a><a name="_Toc152605168"></a><a name="_Toc191662205"></a><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: RxNoJumbo</span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
!   <p class=MsoBodyText>Type: DWORD {0,1}<br>
!   Default: 0<br>
!   Variable: rx_nojumbo</p>
!   <p class=MsoBodyText>If enabled, does not send or indicate that we are able
!   to send or receive RX jumbograms.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:32;height:151.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:151.75pt'>
    <h5><a name="_Toc191662207"></a><a name="_Toc152605170"></a><a
!   name="_Toc139993220"></a><a name="_Toc126872297"></a><a name="_Toc115416228"></a><a
!   name="_Value:_ConnDeadTimeout"></a><span style='mso-bookmark:_Toc191662207'><span
!   style='mso-bookmark:_Toc152605170'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   ConnDeadTimeout</span></span></span><span style='mso-fareast-font-family:
!   "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
    Default: 60 (seconds)<br>
    Variable: ConnDeadtimeout</p>
    <p class=MsoBodyText>The Connection Dead Time is enforced to be at a minimum
!   15 seconds longer than the minimum SMB timeout as specified by
!   [HKLM\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters]
    SessTimeout</p>
    <p class=MsoBodyText>If the minimum SMB timeout is not specified the value is
    45 seconds.&nbsp; See <a
!   href="http://support.microsoft.com/support/kb/articles/Q102/0/67.asp"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>http://support.microsoft.com:80/support/kb/articles/Q102/0/67.asp</span></span></a></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:33;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662208"></a><a name="_Toc152605171"></a><a
!   name="_Toc115416229"></a><a name="_Toc139993221"></a><a name="_Toc126872298"></a><span
    style='mso-bookmark:_Toc191662208'><span style='mso-bookmark:_Toc152605171'><span
    style='mso-bookmark:_Toc115416229'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    HardDeadTimeout</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5583,5601 ****
    ConnDeadTimeout.&nbsp; The provides an opportunity for at least one retry.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:29;height:158.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:158.5pt'>
    <h5><a name="_Toc191662209"></a><a name="_Toc152605172"></a><a
!   name="_Value__:_TraceOption"></a><a name="_Toc115416230"></a><a
!   name="_Toc126872299"></a><a name="_Toc139993222"></a><span style='mso-bookmark:
!   _Toc191662209'><span style='mso-bookmark:_Toc152605172'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: TraceOption</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0-15}<br>
    Default: 0</p>
!   <p class=MsoBodyText>Enables logging of debug output to the Windows Event
!   Log.</p>
    <p class=MsoBodyText>Bit 0 enables logging of &quot;Logon Events&quot;
    processed by the Network Provider and Winlogon Event Notification
    Handler.&nbsp; </p>
--- 6369,6385 ----
    ConnDeadTimeout.&nbsp; The provides an opportunity for at least one retry.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:34;height:158.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:158.5pt'>
    <h5><a name="_Toc191662209"></a><a name="_Toc152605172"></a><a
!   name="_Toc139993222"></a><a name="_Toc126872299"></a><a name="_Toc115416230"></a><a
!   name="_Value__:_TraceOption"></a><span style='mso-bookmark:_Toc191662209'><span
!   style='mso-bookmark:_Toc152605172'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   TraceOption</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0-15}<br>
    Default: 0</p>
!   <p class=MsoBodyText>Enables logging of debug output to the Windows Event Log.</p>
    <p class=MsoBodyText>Bit 0 enables logging of &quot;Logon Events&quot;
    processed by the Network Provider and Winlogon Event Notification
    Handler.&nbsp; </p>
***************
*** 5606,5616 ****
    <p class=MsoBodyText>Bit 3 enables &quot;fs trace&quot; logging on startup.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:30;height:98.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:98.5pt'>
    <h5><a name="_Toc191662210"></a><a name="_Toc152605173"></a><a
!   name="_Toc115416231"></a><a name="_Toc126872300"></a><a name="_Toc139993223"></a><span
    style='mso-bookmark:_Toc191662210'><span style='mso-bookmark:_Toc152605173'><span
    style='mso-bookmark:_Toc115416231'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    AllSubmount</span></span></span></span><span style='mso-fareast-font-family:
--- 6390,6400 ----
    <p class=MsoBodyText>Bit 3 enables &quot;fs trace&quot; logging on startup.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:35;height:98.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:98.5pt'>
    <h5><a name="_Toc191662210"></a><a name="_Toc152605173"></a><a
!   name="_Toc115416231"></a><a name="_Toc139993223"></a><a name="_Toc126872300"></a><span
    style='mso-bookmark:_Toc191662210'><span style='mso-bookmark:_Toc152605173'><span
    style='mso-bookmark:_Toc115416231'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    AllSubmount</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5623,5648 ****
    allows the read-write versions of root.afs to be hidden.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:31;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662211"></a><a name="_Toc152605174"></a><a
!   name="_Value___:_NoFindLanaByName"></a><a name="_Toc115416232"></a><a
!   name="_Toc126872301"></a><a name="_Toc139993224"></a><span style='mso-bookmark:
!   _Toc191662211'><span style='mso-bookmark:_Toc152605174'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: NoFindLanaByName</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0, 1}<br>
    Default: 0</p>
    <p class=MsoBodyText>Disables the attempt to identity the network adapter to
    use by looking for an adapter with a display name of &quot;AFS&quot;.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:32;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662212"></a><a name="_Toc152605175"></a><a
!   name="_Toc115416233"></a><a name="_Toc126872302"></a><a name="_Toc139993225"></a><span
    style='mso-bookmark:_Toc191662212'><span style='mso-bookmark:_Toc152605175'><span
    style='mso-bookmark:_Toc115416233'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MaxCPUs</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
--- 6407,6432 ----
    allows the read-write versions of root.afs to be hidden.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:36;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662211"></a><a name="_Toc152605174"></a><a
!   name="_Toc139993224"></a><a name="_Toc126872301"></a><a name="_Toc115416232"></a><a
!   name="_Value___:_NoFindLanaByName"></a><span style='mso-bookmark:_Toc191662211'><span
!   style='mso-bookmark:_Toc152605174'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   NoFindLanaByName</span></span></span><span style='mso-fareast-font-family:
!   "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0, 1}<br>
    Default: 0</p>
    <p class=MsoBodyText>Disables the attempt to identity the network adapter to
    use by looking for an adapter with a display name of &quot;AFS&quot;.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:37;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662212"></a><a name="_Toc152605175"></a><a
!   name="_Toc115416233"></a><a name="_Toc139993225"></a><a name="_Toc126872302"></a><span
    style='mso-bookmark:_Toc191662212'><span style='mso-bookmark:_Toc152605175'><span
    style='mso-bookmark:_Toc115416233'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MaxCPUs</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
***************
*** 5654,5701 ****
    greater number installed in the machine.&nbsp; </p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:33;height:151.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:151.75pt'>
    <h5><a name="_Toc191662213"></a><a name="_Toc152605176"></a><a
!   name="_Value___:_smbAuthType"></a><a name="_Toc115416234"></a><a
!   name="_Toc126872303"></a><a name="_Toc139993226"></a><span style='mso-bookmark:
!   _Toc191662213'><span style='mso-bookmark:_Toc152605176'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: smbAuthType</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0..2}<br>
    Default: 2</p>
!   <p class=MsoBodyText>If this value is specified, it defines the type of SMB authentication
!   which must be present in order for the Windows SMB client to connect to the
!   AFS Client Service's SMB server.&nbsp; The values are:</p>
    <p class=MsoBodyText>0 = No authentication required<br>
    1 = NTLM authentication required<br>
    2 = Extended (GSS SPNEGO) authentication required<br>
    The default is Extended authentication</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:34;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662214"></a><a name="_Toc152605177"></a><a
!   name="_Value___:_MaxLogSize"></a><a name="_Toc115416235"></a><a
!   name="_Toc126872304"></a><a name="_Toc139993227"></a><span style='mso-bookmark:
!   _Toc191662214'><span style='mso-bookmark:_Toc152605177'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: MaxLogSize</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0 .. MAXDWORD}<br>
    Default: 100K</p>
!   <p class=MsoBodyText>This entry determines the maximum size of the
!   %WINDIR%\TEMP\afsd_init.log file.&nbsp; If the file is larger than this value
!   when afsd_service.exe starts the file will be reset to 0 bytes.&nbsp; If this
!   value is 0, it means the file should be allowed to grow indefinitely.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:35;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662215"></a><a name="_Toc152605178"></a><a
!   name="_Toc115416236"></a><a name="_Toc126872305"></a><a name="_Toc139993228"></a><span
    style='mso-bookmark:_Toc191662215'><span style='mso-bookmark:_Toc152605178'><span
    style='mso-bookmark:_Toc115416236'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    FlushOnHibernate</span></span></span></span><span style='mso-fareast-font-family:
--- 6438,6483 ----
    greater number installed in the machine.&nbsp; </p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:38;height:151.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:151.75pt'>
    <h5><a name="_Toc191662213"></a><a name="_Toc152605176"></a><a
!   name="_Toc139993226"></a><a name="_Toc126872303"></a><a name="_Toc115416234"></a><a
!   name="_Value___:_smbAuthType"></a><span style='mso-bookmark:_Toc191662213'><span
!   style='mso-bookmark:_Toc152605176'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   smbAuthType</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0..2}<br>
    Default: 2</p>
!   <p class=MsoBodyText>If this value is specified, it defines the type of SMB
!   authentication which must be present in order for the Windows SMB client to
!   connect to the AFS Client Service's SMB server.&nbsp; The values are:</p>
    <p class=MsoBodyText>0 = No authentication required<br>
    1 = NTLM authentication required<br>
    2 = Extended (GSS SPNEGO) authentication required<br>
    The default is Extended authentication</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:39;height:92.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662214"></a><a name="_Toc152605177"></a><a
!   name="_Toc139993227"></a><a name="_Toc126872304"></a><a name="_Toc115416235"></a><a
!   name="_Value___:_MaxLogSize"></a><span style='mso-bookmark:_Toc191662214'><span
!   style='mso-bookmark:_Toc152605177'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   MaxLogSize</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0 .. MAXDWORD}<br>
    Default: 100K</p>
!   <p class=MsoBodyText>This entry determines the maximum size of the %WINDIR%\TEMP\afsd_init.log
!   file.&nbsp; If the file is larger than this value when afsd_service.exe
!   starts the file will be reset to 0 bytes.&nbsp; If this value is 0, it means
!   the file should be allowed to grow indefinitely.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:40;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662215"></a><a name="_Toc152605178"></a><a
!   name="_Toc115416236"></a><a name="_Toc139993228"></a><a name="_Toc126872305"></a><span
    style='mso-bookmark:_Toc191662215'><span style='mso-bookmark:_Toc152605178'><span
    style='mso-bookmark:_Toc115416236'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    FlushOnHibernate</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 5706,5712 ****
    hibernate or stand-by.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:36;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662216"></a><a name="_Toc152605179"><span
--- 6488,6494 ----
    hibernate or stand-by.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:41;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662216"></a><a name="_Toc152605179"><span
***************
*** 5720,5726 ****
    marked as “down”.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:37;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662217"></a><a name="_Toc152605180"><span
--- 6502,6508 ----
    marked as “down”.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:42;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662217"></a><a name="_Toc152605180"><span
***************
*** 5733,5739 ****
    probes servers that are marked as “up”.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:38;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662218"></a><a name="_Toc152605181"><span
--- 6515,6521 ----
    probes servers that are marked as “up”.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:43;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662218"></a><a name="_Toc152605181"><span
***************
*** 5747,5753 ****
    existing volume database information.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:39;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662219"></a><a name="_Toc152605182"><span
--- 6529,6535 ----
    existing volume database information.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:44;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662219"></a><a name="_Toc152605182"><span
***************
*** 5761,5767 ****
    invalidation.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:40;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662220"></a><a name="_Toc152605183"><span
--- 6543,6549 ----
    invalidation.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:45;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662220"></a><a name="_Toc152605183"><span
***************
*** 5775,5781 ****
    locks.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:41;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662221"></a><a name="_Toc152605184"><span
--- 6557,6563 ----
    locks.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:46;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662221"></a><a name="_Toc152605184"><span
***************
*** 5789,5795 ****
    tokens.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:42;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662222"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6571,6577 ----
    tokens.<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:47;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662222"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5803,5809 ****
    determined to be busy have their state reset to online.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:43;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662223"></a><a name="_Toc152605185"><span
--- 6585,6591 ----
    determined to be busy have their state reset to online.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:48;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662223"></a><a name="_Toc152605185"><span
***************
*** 5819,5825 ****
    configured.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:44;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662224"></a><a name="_Toc152605186"></a><a
--- 6601,6607 ----
    configured.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:49;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662224"></a><a name="_Toc152605186"></a><a
***************
*** 5829,5836 ****
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0, 1, 2}<br>
    Default: 1</p>
!   <p class=MsoBodyText>Determines whether or not the AFS file server is
!   contacted for </p>
    <p class=MsoBodyText><span style='mso-fareast-font-family:"Times New Roman"'>0:
    never obtain server locks<o:p></o:p></span></p>
    <p class=MsoBodyText><span style='mso-fareast-font-family:"Times New Roman"'>1:
--- 6611,6618 ----
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0, 1, 2}<br>
    Default: 1</p>
!   <p class=MsoBodyText>Determines whether or not the AFS file server is contacted
!   for </p>
    <p class=MsoBodyText><span style='mso-fareast-font-family:"Times New Roman"'>0:
    never obtain server locks<o:p></o:p></span></p>
    <p class=MsoBodyText><span style='mso-fareast-font-family:"Times New Roman"'>1:
***************
*** 5839,5845 ****
    always obtain server locks<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:45;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662225"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6621,6627 ----
    always obtain server locks<o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:50;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662225"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5856,5862 ****
    without complaint.<span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:46;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662226"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6638,6644 ----
    without complaint.<span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:51;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662226"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5871,5877 ****
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:47;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662227"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6653,6659 ----
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:52;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662227"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5886,5892 ****
    fully cached prior to a machine losing its connection with the file server.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:48;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662228"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6668,6674 ----
    fully cached prior to a machine losing its connection with the file server.</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:53;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662228"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5902,5908 ****
    <p class=MsoNormal>1: treat offline .readonly content as valid</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:49;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662229"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6684,6690 ----
    <p class=MsoNormal>1: treat offline .readonly content as valid</p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:54;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662229"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5912,5925 ****
    <p class=MsoNormal>Determines whether or not the AFS Cache Manager will give
    up all callbacks prior to the service being suspended or shutdown.<span
    style='mso-spacerun:yes'>  </span>Doing so will have significant performance
!   benefits for the file servers.<span style='mso-spacerun:yes'>  </span>However,
!   file servers older than 1.4.6 can become unstable if the GiveUpAllCallBacks
!   RPC is executed.</p>
    <p class=MsoNormal>0: do not perform GiveUpAllCallBacks RPCs</p>
    <p class=MsoNormal>1: perform GiveUpAllCallBacks RPCs </p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:50;mso-yfti-lastrow:yes;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662230"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
--- 6694,6707 ----
    <p class=MsoNormal>Determines whether or not the AFS Cache Manager will give
    up all callbacks prior to the service being suspended or shutdown.<span
    style='mso-spacerun:yes'>  </span>Doing so will have significant performance
!   benefits for the file servers.<span style='mso-spacerun:yes'> 
!   </span>However, file servers older than 1.4.6 can become unstable if the
!   GiveUpAllCallBacks RPC is executed.</p>
    <p class=MsoNormal>0: do not perform GiveUpAllCallBacks RPCs</p>
    <p class=MsoNormal>1: perform GiveUpAllCallBacks RPCs </p>
    </td>
   </tr>
!  <tr style='mso-yfti-irow:55;mso-yfti-lastrow:yes;height:65.75pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662230"><span style='mso-fareast-font-family:"Times New Roman"'>Value:
***************
*** 5937,5947 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662231"></a><a name="_Toc152605187"></a><a
! name="_Toc115416237"></a><a name="_Toc139993229"></a><a name="_Toc126872306"></a><span
! style='mso-bookmark:_Toc191662231'><span style='mso-bookmark:_Toc152605187'><span
! style='mso-bookmark:_Toc115416237'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters\GlobalAutoMapper]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 6719,6732 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871727"></a><a name="_Toc193871482"></a><a name="_Toc191662231"></a><a
! name="_Toc152605187"></a><a name="_Toc115416237"></a><a name="_Toc139993229"></a><a
! name="_Toc126872306"></a><span style='mso-bookmark:_Toc193871727'><span
! style='mso-bookmark:_Toc193871482'><span style='mso-bookmark:_Toc191662231'><span
! style='mso-bookmark:_Toc152605187'><span style='mso-bookmark:_Toc115416237'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters\GlobalAutoMapper]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 5951,5975 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.0pt'>
    <h5><a name="_Toc191662232"></a><a name="_Toc152605188"></a><a
!   name="_Toc115416238"></a><a name="_Toc126872307"></a><a name="_Toc139993230"></a><span
    style='mso-bookmark:_Toc191662232'><span style='mso-bookmark:_Toc152605188'><span
    style='mso-bookmark:_Toc115416238'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &lt;Drive Letter:&gt; for example &quot;G:&quot;</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ</p>
!   <p class=MsoBodyText>Specifies the submount name to be mapped by afsd_service.exe
!   at startup to the provided drive letter.</p>
    <p class=MsoBodyText><b style='mso-bidi-font-weight:normal'><i
    style='mso-bidi-font-style:normal'>This option is deprecated.<o:p></o:p></i></b></p>
    </td>
   </tr>
  </table>
  
! <h3><a name="_Toc191662233"></a><a name="_Toc152605189"></a><a
! name="_Toc115416239"></a><a name="_Toc139993231"></a><a name="_Toc126872308"></a><span
! style='mso-bookmark:_Toc191662233'><span style='mso-bookmark:_Toc152605189'><span
! style='mso-bookmark:_Toc115416239'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 6736,6763 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.0pt'>
    <h5><a name="_Toc191662232"></a><a name="_Toc152605188"></a><a
!   name="_Toc115416238"></a><a name="_Toc139993230"></a><a name="_Toc126872307"></a><span
    style='mso-bookmark:_Toc191662232'><span style='mso-bookmark:_Toc152605188'><span
    style='mso-bookmark:_Toc115416238'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &lt;Drive Letter:&gt; for example &quot;G:&quot;</span></span></span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ</p>
!   <p class=MsoBodyText>Specifies the submount name to be mapped by
!   afsd_service.exe at startup to the provided drive letter.</p>
    <p class=MsoBodyText><b style='mso-bidi-font-weight:normal'><i
    style='mso-bidi-font-style:normal'>This option is deprecated.<o:p></o:p></i></b></p>
    </td>
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871728"></a><a name="_Toc193871483"></a><a name="_Toc191662233"></a><a
! name="_Toc152605189"></a><a name="_Toc115416239"></a><a name="_Toc139993231"></a><a
! name="_Toc126872308"></a><span style='mso-bookmark:_Toc193871728'><span
! style='mso-bookmark:_Toc193871483'><span style='mso-bookmark:_Toc191662233'><span
! style='mso-bookmark:_Toc152605189'><span style='mso-bookmark:_Toc115416239'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 5978,5988 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662234"></a><a name="_Toc152605190"></a><a
!   name="_Value___:_CellServDBDir"></a><a name="_Toc115416240"></a><a
!   name="_Toc126872309"></a><a name="_Toc139993232"></a><span style='mso-bookmark:
!   _Toc191662234'><span style='mso-bookmark:_Toc152605190'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: CellServDBDir</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &lt;not defined&gt;</p>
    <p class=MsoBodyText>Specifies the directory containing the CellServDB
--- 6766,6775 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662234"></a><a name="_Toc152605190"></a><a
!   name="_Toc139993232"></a><a name="_Toc126872309"></a><a name="_Toc115416240"></a><a
!   name="_Value___:_CellServDBDir"></a><span style='mso-bookmark:_Toc191662234'><span
!   style='mso-bookmark:_Toc152605190'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   CellServDBDir</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &lt;not defined&gt;</p>
    <p class=MsoBodyText>Specifies the directory containing the CellServDB
***************
*** 5995,6025 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.25pt'>
    <h5><a name="_Toc191662235"></a><a name="_Toc152605191"></a><a
!   name="_Value___:_VerifyServiceSignature"></a><a name="_Toc115416241"></a><a
!   name="_Toc126872310"></a><a name="_Toc139993233"></a><span style='mso-bookmark:
!   _Toc191662235'><span style='mso-bookmark:_Toc152605191'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value:
    VerifyServiceSignature</span></span></span><span style='mso-fareast-font-family:
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
    Default: 0x1</p>
!   <p class=MsoBodyText>This value can be used to disable the runtime verification
!   of the digital signatures applied to afsd_service.exe and the OpenAFS DLLs it
!   loads.&nbsp; This test is performed to verify that&nbsp;&nbsp; the DLLs which
!   are loaded by afsd_service.exe are from the same distribution as
!   afsd_service.exe.&nbsp; This is to prevent random errors caused when DLLs
!   from one distribution of AFS are loaded by another one.&nbsp; This is not a
!   security test.&nbsp; The reason for disabling this test is to free up
!   additional memory which can be used for a large cache size.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:2;height:105.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662236"></a><a name="_Toc152605192"></a><a
!   name="_Value___:_IoctlDebug"></a><a name="_Toc115416242"></a><a
!   name="_Toc126872311"></a><a name="_Toc139993234"></a><a
!   name="_Value:_IoctlDebug"></a><span style='mso-bookmark:_Toc191662236'><span
    style='mso-bookmark:_Toc152605192'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    IoctlDebug</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
--- 6782,6812 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.25pt'>
    <h5><a name="_Toc191662235"></a><a name="_Toc152605191"></a><a
!   name="_Toc139993233"></a><a name="_Toc126872310"></a><a name="_Toc115416241"></a><a
!   name="_Value___:_VerifyServiceSignature"></a><span style='mso-bookmark:_Toc191662235'><span
!   style='mso-bookmark:_Toc152605191'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    VerifyServiceSignature</span></span></span><span style='mso-fareast-font-family:
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
    Default: 0x1</p>
!   <p class=MsoBodyText>This value can be used to disable the runtime
!   verification of the digital signatures applied to afsd_service.exe and the
!   OpenAFS DLLs it loads.&nbsp; This test is performed to verify
!   that&nbsp;&nbsp; the DLLs which are loaded by afsd_service.exe are from the
!   same distribution as afsd_service.exe.&nbsp; This is to prevent random errors
!   caused when DLLs from one distribution of AFS are loaded by another
!   one.&nbsp; This is not a security test.&nbsp; The reason for disabling this
!   test is to free up additional memory which can be used for a large cache
!   size.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:2;height:105.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662236"></a><a name="_Toc152605192"></a><a
!   name="_Value:_IoctlDebug"></a><a name="_Toc139993234"></a><a
!   name="_Toc126872311"></a><a name="_Toc115416242"></a><a
!   name="_Value___:_IoctlDebug"></a><span style='mso-bookmark:_Toc191662236'><span
    style='mso-bookmark:_Toc152605192'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    IoctlDebug</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
***************
*** 6035,6041 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:330.75pt'>
    <h5><a name="_Toc191662237"></a><a name="_Toc152605193"></a><a
!   name="_Toc115416243"></a><a name="_Toc126872312"></a><a name="_Toc139993235"></a><span
    style='mso-bookmark:_Toc191662237'><span style='mso-bookmark:_Toc152605193'><span
    style='mso-bookmark:_Toc115416243'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MiniDumpType</span></span></span></span><span style='mso-fareast-font-family:
--- 6822,6828 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:330.75pt'>
    <h5><a name="_Toc191662237"></a><a name="_Toc152605193"></a><a
!   name="_Toc115416243"></a><a name="_Toc139993235"></a><a name="_Toc126872312"></a><span
    style='mso-bookmark:_Toc191662237'><span style='mso-bookmark:_Toc152605193'><span
    style='mso-bookmark:_Toc115416243'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    MiniDumpType</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6047,6054 ****
    initiated is dump file is generated with the &quot;fs.exe minidump&quot;
    command.</p>
    <p class=MsoBodyText>Valid values are dependent on the version of DbgHelp.dll
!   installed on the machine.&nbsp; See the Microsoft Developer Library for
!   further information.</p>
    <p class=MsoBodyText>MiniDumpNormal = 0x00000000,<br>
    MiniDumpWithDataSegs = 0x00000001,<br>
    MiniDumpWithFullMemory = 0x00000002,<br>
--- 6834,6846 ----
    initiated is dump file is generated with the &quot;fs.exe minidump&quot;
    command.</p>
    <p class=MsoBodyText>Valid values are dependent on the version of DbgHelp.dll
!   installed on the machine.&nbsp; The best version to use is not the version
!   that comes with the operating system but the version that is included in the
!   most recent release of &quot;<a
!   href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx"><span
!   class=Heading1Char><span style='font-size:14.0pt;text-decoration:none;
!   text-underline:none'>Microsoft Debugging Tools for Windows</span></span></a>&quot;.&nbsp;
!   See the Microsoft Developer Library for further information.</p>
    <p class=MsoBodyText>MiniDumpNormal = 0x00000000,<br>
    MiniDumpWithDataSegs = 0x00000001,<br>
    MiniDumpWithFullMemory = 0x00000002,<br>
***************
*** 6069,6077 ****
   <tr style='mso-yfti-irow:4;height:138.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:138.25pt'>
!   <h5><a name="_Toc191662238"></a><a name="_Value___:_StoreAnsiFilenames"></a><a
!   name="_Toc115416244"></a><a name="_Toc126872313"></a><a name="_Toc139993236"></a><a
!   name="_Value:_EnableSMBAsyncStore"></a><span style='mso-bookmark:_Toc191662238'><span
    style='mso-fareast-font-family:"Times New Roman"'>Value: EnableSMBAsyncStore</span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
--- 6861,6869 ----
   <tr style='mso-yfti-irow:4;height:138.25pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:138.25pt'>
!   <h5><a name="_Toc191662238"></a><a name="_Value:_EnableSMBAsyncStore"></a><a
!   name="_Toc139993236"></a><a name="_Toc126872313"></a><a name="_Toc115416244"></a><a
!   name="_Value___:_StoreAnsiFilenames"></a><span style='mso-bookmark:_Toc191662238'><span
    style='mso-fareast-font-family:"Times New Roman"'>Value: EnableSMBAsyncStore</span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
***************
*** 6087,6100 ****
    style='mso-bookmark:_Toc191662239'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    SMBAsyncStoreSize</span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
!   Default: 32<o:p></o:p></p>
    <p class=MsoBodyText>This value determines the size of SMB Asynchronous Store
    operations.&nbsp;This value can be used to increase the write performance on
    higher speed networks by increasing the value.<span
    style='mso-spacerun:yes'>  </span>The value must be a multiple of the cache
!   buffer block size and cannot be larger than the cache manager chunk size.<span
!   style='mso-spacerun:yes'>  </span>The specified value will be adjusted to
!   enforce its compliance with these restrictions.<o:p></o:p></p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes;height:138.25pt'>
--- 6879,6892 ----
    style='mso-bookmark:_Toc191662239'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    SMBAsyncStoreSize</span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_DWORD<br>
!   Default: 32</p>
    <p class=MsoBodyText>This value determines the size of SMB Asynchronous Store
    operations.&nbsp;This value can be used to increase the write performance on
    higher speed networks by increasing the value.<span
    style='mso-spacerun:yes'>  </span>The value must be a multiple of the cache
!   buffer block size and cannot be larger than the cache manager chunk
!   size.<span style='mso-spacerun:yes'>  </span>The specified value will be
!   adjusted to enforce its compliance with these restrictions.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes;height:138.25pt'>
***************
*** 6107,6132 ****
    <p class=MsoBodyText>Type: REG_DWORD<br>
    Default: 0x0</p>
    <p class=MsoBodyText>This value can be used to force the AFS Client Service
!   to store filenames using the Windows system's ANSI character set instead of the
!   OEM Code Page character set which has traditionally been used by SMB file
    systems.&nbsp; </p>
!   <h3><a name="_Toc191662241"><span style='font-size:12.0pt;font-family:"Thorndale","serif";
!   font-weight:normal;mso-bidi-font-weight:bold'>Note: The use of ANSI
!   characters will render access to files with 8-bit OEM file names inaccessible
!   from Windows.&nbsp; This option is of use primarily when you wish to allow
!   file names produced on Windows to be accessible from Latin-1 UNIX systems and
!   vice versa.</span></a><span style='font-size:12.0pt;font-family:"Thorndale","serif";
!   mso-fareast-font-family:"Times New Roman";font-weight:normal;mso-bidi-font-weight:
!   bold'><o:p></o:p></span></h3>
    </td>
   </tr>
  </table>
  
! <h3><a name="_Toc191662242"></a><a name="_Toc152605195"></a><a
! name="_Toc115416245"></a><a name="_Toc139993237"></a><a name="_Toc126872314"></a><span
! style='mso-bookmark:_Toc191662242'><span style='mso-bookmark:_Toc152605195'><span
! style='mso-bookmark:_Toc115416245'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\CSCPolicy]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 6899,6929 ----
    <p class=MsoBodyText>Type: REG_DWORD<br>
    Default: 0x0</p>
    <p class=MsoBodyText>This value can be used to force the AFS Client Service
!   to store filenames using the Windows system's ANSI character set instead of
!   the OEM Code Page character set which has traditionally been used by SMB file
    systems.&nbsp; </p>
!   <h3><a name="_Toc193871729"></a><a name="_Toc193871484"></a><a
!   name="_Toc191662241"><span style='mso-bookmark:_Toc193871484'><span
!   style='mso-bookmark:_Toc193871729'><span style='font-size:12.0pt;font-family:
!   "Thorndale","serif";font-weight:normal;mso-bidi-font-weight:bold'>Note: The
!   use of ANSI characters will render access to files with 8-bit OEM file names
!   inaccessible from Windows.&nbsp; This option is of use primarily when you
!   wish to allow file names produced on Windows to be accessible from Latin-1
!   UNIX systems and vice versa.</span></span></span></a><span style='font-size:
!   12.0pt;font-family:"Thorndale","serif";mso-fareast-font-family:"Times New Roman";
!   font-weight:normal;mso-bidi-font-weight:bold'><o:p></o:p></span></h3>
    </td>
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871730"></a><a name="_Toc193871485"></a><a name="_Toc191662242"></a><a
! name="_Toc152605195"></a><a name="_Toc115416245"></a><a name="_Toc139993237"></a><a
! name="_Toc126872314"></a><span style='mso-bookmark:_Toc193871730'><span
! style='mso-bookmark:_Toc193871485'><span style='mso-bookmark:_Toc191662242'><span
! style='mso-bookmark:_Toc152605195'><span style='mso-bookmark:_Toc115416245'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\CSCPolicy]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6136,6142 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:112.0pt'>
    <h5><a name="_Toc191662243"></a><a name="_Toc152605196"></a><a
!   name="_Toc115416246"></a><a name="_Toc126872315"></a><a name="_Toc139993238"></a><span
    style='mso-bookmark:_Toc191662243'><span style='mso-bookmark:_Toc152605196'><span
    style='mso-bookmark:_Toc115416246'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;smb/cifs share name&quot;</span></span></span></span><span
--- 6933,6939 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:112.0pt'>
    <h5><a name="_Toc191662243"></a><a name="_Toc152605196"></a><a
!   name="_Toc115416246"></a><a name="_Toc139993238"></a><a name="_Toc126872315"></a><span
    style='mso-bookmark:_Toc191662243'><span style='mso-bookmark:_Toc152605196'><span
    style='mso-bookmark:_Toc115416246'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;smb/cifs share name&quot;</span></span></span></span><span
***************
*** 6152,6162 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662244"></a><a name="_Toc152605197"></a><a
! name="_Toc139993239"></a><a name="_Toc126872316"></a><a name="_Toc115416247"></a><a
! name="_Regkey:_[HKLM\SOFTWARE\OpenAFS\Clie"></a><span style='mso-bookmark:_Toc191662244'><span
! style='mso-bookmark:_Toc152605197'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Freelance]</span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 6949,6962 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871731"></a><a name="_Toc193871486"></a><a name="_Toc191662244"></a><a
! name="_Toc152605197"></a><a name="_Toc139993239"></a><a name="_Toc126872316"></a><a
! name="_Toc115416247"></a><a name="_Regkey:_[HKLM\SOFTWARE\OpenAFS\Clie"></a><span
! style='mso-bookmark:_Toc193871731'><span style='mso-bookmark:_Toc193871486'><span
! style='mso-bookmark:_Toc191662244'><span style='mso-bookmark:_Toc152605197'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Freelance]</span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6166,6172 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:138.5pt'>
    <h5><a name="_Toc191662245"></a><a name="_Toc152605198"></a><a
!   name="_Toc115416248"></a><a name="_Toc126872317"></a><a name="_Toc139993240"></a><span
    style='mso-bookmark:_Toc191662245'><span style='mso-bookmark:_Toc152605198'><span
    style='mso-bookmark:_Toc115416248'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;numeric value&quot;</span></span></span></span><span style='mso-fareast-font-family:
--- 6966,6972 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:138.5pt'>
    <h5><a name="_Toc191662245"></a><a name="_Toc152605198"></a><a
!   name="_Toc115416248"></a><a name="_Toc139993240"></a><a name="_Toc126872317"></a><span
    style='mso-bookmark:_Toc191662245'><span style='mso-bookmark:_Toc152605198'><span
    style='mso-bookmark:_Toc115416248'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;numeric value&quot;</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6183,6194 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662246"></a><a name="_Toc152605199"></a><a
! name="_Toc139993241"></a><a name="_Toc126872318"></a><a name="_Toc115416249"></a><a
! name="_Regkey:_[HKLM\SOFTWARE\OpenAFS\Clie_1"></a><span style='mso-bookmark:
! _Toc191662246'><span style='mso-bookmark:_Toc152605199'><span style='mso-fareast-font-family:
! "Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Freelance\Symlinks]</span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 6983,6996 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871732"></a><a name="_Toc193871487"></a><a name="_Toc191662246"></a><a
! name="_Toc152605199"></a><a name="_Toc139993241"></a><a name="_Toc126872318"></a><a
! name="_Toc115416249"></a><a name="_Regkey:_[HKLM\SOFTWARE\OpenAFS\Clie_1"></a><span
! style='mso-bookmark:_Toc193871732'><span style='mso-bookmark:_Toc193871487'><span
! style='mso-bookmark:_Toc191662246'><span style='mso-bookmark:_Toc152605199'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Freelance\Symlinks]</span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6198,6213 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.0pt'>
    <h5><a name="_Toc191662247"></a><a name="_Toc152605200"></a><a
!   name="_Toc115416250"></a><a name="_Toc126872319"></a><a name="_Toc139993242"></a><span
    style='mso-bookmark:_Toc191662247'><span style='mso-bookmark:_Toc152605200'><span
    style='mso-bookmark:_Toc115416250'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;numeric value&quot;</span></span></span></span><span style='mso-fareast-font-family:
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &lt;none&gt;</p>
!   <p class=MsoBodyText>This key is used to store a dot terminated symlink strings
!   for use in constructing the fake root.afs volume when Freelance (dynamic
!   roots) mode is activated.</p>
    <p class=MsoBodyText>&quot;linkname:destination-path.&quot;</p>
    <p class=MsoBodyText>&quot;athena:athena.mit.edu.&quot;</p>
    <p class=MsoBodyText>&quot;home:athena.mit.edu\user\j\a\jaltman.&quot;</p>
--- 7000,7015 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:145.0pt'>
    <h5><a name="_Toc191662247"></a><a name="_Toc152605200"></a><a
!   name="_Toc115416250"></a><a name="_Toc139993242"></a><a name="_Toc126872319"></a><span
    style='mso-bookmark:_Toc191662247'><span style='mso-bookmark:_Toc152605200'><span
    style='mso-bookmark:_Toc115416250'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;numeric value&quot;</span></span></span></span><span style='mso-fareast-font-family:
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &lt;none&gt;</p>
!   <p class=MsoBodyText>This key is used to store a dot terminated symlink
!   strings for use in constructing the fake root.afs volume when Freelance
!   (dynamic roots) mode is activated.</p>
    <p class=MsoBodyText>&quot;linkname:destination-path.&quot;</p>
    <p class=MsoBodyText>&quot;athena:athena.mit.edu.&quot;</p>
    <p class=MsoBodyText>&quot;home:athena.mit.edu\user\j\a\jaltman.&quot;</p>
***************
*** 6216,6241 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662248"></a><a name="_Toc152605201"></a><a
! name="_Toc115416251"></a><a name="_Toc139993243"></a><a name="_Toc126872320"></a><span
! style='mso-bookmark:_Toc191662248'><span style='mso-bookmark:_Toc152605201'><span
! style='mso-bookmark:_Toc115416251'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Realms]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>The Realms key is used to provide initialization data to
! be used when new identities are added to the Network Identity Manager.<span
  style='mso-spacerun:yes'>  </span>The AFS Provider will search for a subkey
  that matches the realm of the identity.<span style='mso-spacerun:yes'> 
  </span>If such a key exists, its values will be used to populate the AFS
  configuration for the identity.</p>
  
! <h3><a name="_Toc191662249"><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
  [HKLM\SOFTWARE\OpenAFS\Client\Realms\<i style='mso-bidi-font-style:normal'>”Realm
! Name”</i>]</span></a><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>In addition to the optional values, this key contains one
! subkey for each cell that is to be added to the AFS Provider configuration.<span
  style='mso-spacerun:yes'>  </span></p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7018,7051 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871733"></a><a name="_Toc193871488"></a><a name="_Toc191662248"></a><a
! name="_Toc152605201"></a><a name="_Toc115416251"></a><a name="_Toc139993243"></a><a
! name="_Toc126872320"></a><span style='mso-bookmark:_Toc193871733'><span
! style='mso-bookmark:_Toc193871488'><span style='mso-bookmark:_Toc191662248'><span
! style='mso-bookmark:_Toc152605201'><span style='mso-bookmark:_Toc115416251'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Realms]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! Realms key is used to provide initialization data to be used when new
! identities are added to the Network Identity Manager.<span
  style='mso-spacerun:yes'>  </span>The AFS Provider will search for a subkey
  that matches the realm of the identity.<span style='mso-spacerun:yes'> 
  </span>If such a key exists, its values will be used to populate the AFS
  configuration for the identity.</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871734"></a><a name="_Toc193871489"></a><a name="_Toc191662249"><span
! style='mso-bookmark:_Toc193871489'><span style='mso-bookmark:_Toc193871734'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
  [HKLM\SOFTWARE\OpenAFS\Client\Realms\<i style='mso-bidi-font-style:normal'>”Realm
! Name”</i>]</span></span></span></a><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>In
! addition to the optional values, this key contains one subkey for each cell
! that is to be added to the AFS Provider configuration.<span
  style='mso-spacerun:yes'>  </span></p>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6245,6251 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:103.7pt'>
    <h5><a name="_Toc191662250"></a><a name="_Toc152605202"></a><a
!   name="_Toc115416252"></a><a name="_Toc126872321"></a><a name="_Toc139993244"></a><span
    style='mso-bookmark:_Toc191662250'><span style='mso-bookmark:_Toc152605202'><span
    style='mso-bookmark:_Toc115416252'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    </span></span></span></span><span style='mso-bookmark:_Toc191662250'><span
--- 7055,7061 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:103.7pt'>
    <h5><a name="_Toc191662250"></a><a name="_Toc152605202"></a><a
!   name="_Toc115416252"></a><a name="_Toc139993244"></a><a name="_Toc126872321"></a><span
    style='mso-bookmark:_Toc191662250'><span style='mso-bookmark:_Toc152605202'><span
    style='mso-bookmark:_Toc115416252'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    </span></span></span></span><span style='mso-bookmark:_Toc191662250'><span
***************
*** 6263,6275 ****
   </tr>
  </table>
  
! <h3><a name="_Toc152605203"></a><a name="_Toc191662251"></a><a
! name="_Toc139993245"></a><a name="_Toc126872322"></a><a name="_Toc115416253"></a><a
! name="_Regkey:_[HKLM\SOFTWARE\OpenAFS\Clie_2"></a><span style='mso-bookmark:
! _Toc152605203'><span style='mso-bookmark:_Toc191662251'><span style='mso-fareast-font-family:
! "Times New Roman"'>Regkey:<br>
  [HKLM\SOFTWARE\OpenAFS\Client\Realms\<i style='mso-bidi-font-style:normal'>”Realm
! Name”</i>\<i style='mso-bidi-font-style:normal'>”Cell Name”</i>]</span></span></span><span
  style='mso-bookmark:_Toc152605203'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7073,7087 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc152605203"></a><a name="_Toc193871735"></a><a name="_Toc193871490"></a><a
! name="_Toc191662251"></a><a name="_Toc139993245"></a><a name="_Toc126872322"></a><a
! name="_Toc115416253"></a><a name="_Regkey:_[HKLM\SOFTWARE\OpenAFS\Clie_2"></a><span
! style='mso-bookmark:_Toc152605203'><span style='mso-bookmark:_Toc193871735'><span
! style='mso-bookmark:_Toc193871490'><span style='mso-bookmark:_Toc191662251'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
  [HKLM\SOFTWARE\OpenAFS\Client\Realms\<i style='mso-bidi-font-style:normal'>”Realm
! Name”</i>\<i style='mso-bidi-font-style:normal'>”Cell Name”</i>]</span></span></span></span></span><span
  style='mso-bookmark:_Toc152605203'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6319,6327 ****
   </tr>
  </table>
  
! <h3><span style='mso-bookmark:_Toc152605203'><a name="_Toc191662254"><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Submounts]</span></a></span><span
  style='mso-bookmark:_Toc152605203'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7131,7142 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc152605203'><a name="_Toc193871736"></a><a
! name="_Toc193871491"></a><a name="_Toc191662254"><span style='mso-bookmark:
! _Toc193871491'><span style='mso-bookmark:_Toc193871736'><span style='mso-fareast-font-family:
! "Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Submounts]</span></span></span></a></span><span
  style='mso-bookmark:_Toc152605203'><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6353,6361 ****
   </tr>
  </table>
  
! <h3><span style='mso-bookmark:_Toc152605203'><a name="_Toc191662256"><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Server Preferences\VLDB]</span></a></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7168,7179 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span
! style='mso-bookmark:_Toc152605203'><a name="_Toc193871737"></a><a
! name="_Toc193871492"></a><a name="_Toc191662256"><span style='mso-bookmark:
! _Toc193871492'><span style='mso-bookmark:_Toc193871737'><span style='mso-fareast-font-family:
! "Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Server Preferences\VLDB]</span></span></span></a></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6365,6371 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662257"></a><a name="_Toc152605204"></a><a
!   name="_Toc115416254"></a><a name="_Toc126872323"></a><a name="_Toc139993246"></a><span
    style='mso-bookmark:_Toc191662257'><span style='mso-bookmark:_Toc152605204'><span
    style='mso-bookmark:_Toc115416254'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;hostname or ip address&quot;</span></span></span></span><span
--- 7183,7189 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662257"></a><a name="_Toc152605204"></a><a
!   name="_Toc115416254"></a><a name="_Toc139993246"></a><a name="_Toc126872323"></a><span
    style='mso-bookmark:_Toc191662257'><span style='mso-bookmark:_Toc152605204'><span
    style='mso-bookmark:_Toc115416254'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;hostname or ip address&quot;</span></span></span></span><span
***************
*** 6381,6391 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662258"></a><a name="_Toc152605205"></a><a
! name="_Toc115416255"></a><a name="_Toc139993247"></a><a name="_Toc126872324"></a><span
! style='mso-bookmark:_Toc191662258'><span style='mso-bookmark:_Toc152605205'><span
! style='mso-bookmark:_Toc115416255'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Server Preferences\File]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7199,7212 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871738"></a><a name="_Toc193871493"></a><a name="_Toc191662258"></a><a
! name="_Toc152605205"></a><a name="_Toc115416255"></a><a name="_Toc139993247"></a><a
! name="_Toc126872324"></a><span style='mso-bookmark:_Toc193871738'><span
! style='mso-bookmark:_Toc193871493'><span style='mso-bookmark:_Toc191662258'><span
! style='mso-bookmark:_Toc152605205'><span style='mso-bookmark:_Toc115416255'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SOFTWARE\OpenAFS\Client\Server Preferences\File]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6395,6401 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662259"></a><a name="_Toc152605206"></a><a
!   name="_Toc115416256"></a><a name="_Toc126872325"></a><a name="_Toc139993248"></a><span
    style='mso-bookmark:_Toc191662259'><span style='mso-bookmark:_Toc152605206'><span
    style='mso-bookmark:_Toc115416256'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;hostname or ip address&quot;</span></span></span></span><span
--- 7216,7222 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662259"></a><a name="_Toc152605206"></a><a
!   name="_Toc115416256"></a><a name="_Toc139993248"></a><a name="_Toc126872325"></a><span
    style='mso-bookmark:_Toc191662259'><span style='mso-bookmark:_Toc152605206'><span
    style='mso-bookmark:_Toc115416256'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;hostname or ip address&quot;</span></span></span></span><span
***************
*** 6405,6431 ****
    <p class=MsoBodyText>This key is used to specify a default set of File server
    preferences. For each entry the value name will be either the IP address of a
    server or a fully qualified domain name.&nbsp; The value will be the
!   ranking.&nbsp; The ranking will be adjusted by a random value between 0 and 256
!   prior to the preference being set.</p>
    </td>
   </tr>
  </table>
  
! <h2><a name="_Toc191662260"></a><a name="_Toc152605207"></a><a
! name="_Toc115416257"></a><a name="_Toc139993249"></a><a name="_Toc126872326"></a><a
! name="_Toc115417105"></a><span style='mso-bookmark:_Toc191662260'><span
! style='mso-bookmark:_Toc152605207'><span style='mso-bookmark:_Toc115416257'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.2. Integrated Logon Network
! provider parameters</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoBodyText>Affects the network provider (afslogon.dll).</p>
  
! <h3><a name="_Toc191662261"></a><a name="_Toc152605208"></a><a
! name="_Toc115416258"></a><a name="_Toc139993250"></a><a name="_Toc126872327"></a><span
! style='mso-bookmark:_Toc191662261'><span style='mso-bookmark:_Toc152605208'><span
! style='mso-bookmark:_Toc115416258'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7226,7258 ----
    <p class=MsoBodyText>This key is used to specify a default set of File server
    preferences. For each entry the value name will be either the IP address of a
    server or a fully qualified domain name.&nbsp; The value will be the
!   ranking.&nbsp; The ranking will be adjusted by a random value between 0 and
!   256 prior to the preference being set.</p>
    </td>
   </tr>
  </table>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871739"></a><a name="_Toc193871494"></a><a name="_Toc191662260"></a><a
! name="_Toc152605207"></a><a name="_Toc115416257"></a><a name="_Toc139993249"></a><a
! name="_Toc126872326"></a><a name="_Toc115417105"></a><span style='mso-bookmark:
! _Toc193871739'><span style='mso-bookmark:_Toc193871494'><span style='mso-bookmark:
! _Toc191662260'><span style='mso-bookmark:_Toc152605207'><span style='mso-bookmark:
! _Toc115416257'><span style='mso-fareast-font-family:"Times New Roman"'>A.2.
! Integrated Logon Network provider parameters</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Affects
! the network provider (afslogon.dll).</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871740"></a><a name="_Toc193871495"></a><a name="_Toc191662261"></a><a
! name="_Toc152605208"></a><a name="_Toc115416258"></a><a name="_Toc139993250"></a><a
! name="_Toc126872327"></a><span style='mso-bookmark:_Toc193871740'><span
! style='mso-bookmark:_Toc193871495'><span style='mso-bookmark:_Toc191662261'><span
! style='mso-bookmark:_Toc152605208'><span style='mso-bookmark:_Toc115416258'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6435,6441 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662262"></a><a name="_Toc152605209"></a><a
!   name="_Toc115416259"></a><a name="_Toc126872328"></a><a name="_Toc139993251"></a><span
    style='mso-bookmark:_Toc191662262'><span style='mso-bookmark:_Toc152605209'><span
    style='mso-bookmark:_Toc115416259'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    FailLoginsSilently</span></span></span></span><span style='mso-fareast-font-family:
--- 7262,7268 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662262"></a><a name="_Toc152605209"></a><a
!   name="_Toc115416259"></a><a name="_Toc139993251"></a><a name="_Toc126872328"></a><span
    style='mso-bookmark:_Toc191662262'><span style='mso-bookmark:_Toc152605209'><span
    style='mso-bookmark:_Toc115416259'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    FailLoginsSilently</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6447,6457 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662263"></a><a name="_Toc152605210"></a><a
! name="_Toc115416260"></a><a name="_Toc139993252"></a><a name="_Toc126872329"></a><span
! style='mso-bookmark:_Toc191662263'><span style='mso-bookmark:_Toc152605210'><span
! style='mso-bookmark:_Toc115416260'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7274,7287 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871741"></a><a name="_Toc193871496"></a><a name="_Toc191662263"></a><a
! name="_Toc152605210"></a><a name="_Toc115416260"></a><a name="_Toc139993252"></a><a
! name="_Toc126872329"></a><span style='mso-bookmark:_Toc193871741'><span
! style='mso-bookmark:_Toc193871496'><span style='mso-bookmark:_Toc191662263'><span
! style='mso-bookmark:_Toc152605210'><span style='mso-bookmark:_Toc115416260'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6460,6466 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662264"></a><a name="_Toc152605211"></a><a
!   name="_Toc115416261"></a><a name="_Toc126872330"></a><a name="_Toc139993253"></a><span
    style='mso-bookmark:_Toc191662264'><span style='mso-bookmark:_Toc152605211'><span
    style='mso-bookmark:_Toc115416261'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    NoWarnings</span></span></span></span><span style='mso-fareast-font-family:
--- 7290,7296 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662264"></a><a name="_Toc152605211"></a><a
!   name="_Toc115416261"></a><a name="_Toc139993253"></a><a name="_Toc126872330"></a><span
    style='mso-bookmark:_Toc191662264'><span style='mso-bookmark:_Toc152605211'><span
    style='mso-bookmark:_Toc115416261'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    NoWarnings</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6474,6480 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662265"></a><a name="_Toc152605212"></a><a
!   name="_Toc115416262"></a><a name="_Toc126872331"></a><a name="_Toc139993254"></a><span
    style='mso-bookmark:_Toc191662265'><span style='mso-bookmark:_Toc152605212'><span
    style='mso-bookmark:_Toc115416262'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    AuthentProviderPath</span></span></span></span><span style='mso-fareast-font-family:
--- 7304,7310 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662265"></a><a name="_Toc152605212"></a><a
!   name="_Toc115416262"></a><a name="_Toc139993254"></a><a name="_Toc126872331"></a><span
    style='mso-bookmark:_Toc191662265'><span style='mso-bookmark:_Toc152605212'><span
    style='mso-bookmark:_Toc115416262'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    AuthentProviderPath</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6489,6495 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662266"></a><a name="_Toc152605213"></a><a
!   name="_Toc115416263"></a><a name="_Toc126872332"></a><a name="_Toc139993255"></a><span
    style='mso-bookmark:_Toc191662266'><span style='mso-bookmark:_Toc152605213'><span
    style='mso-bookmark:_Toc115416263'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Class</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
--- 7319,7325 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662266"></a><a name="_Toc152605213"></a><a
!   name="_Toc115416263"></a><a name="_Toc139993255"></a><a name="_Toc126872332"></a><span
    style='mso-bookmark:_Toc191662266'><span style='mso-bookmark:_Toc152605213'><span
    style='mso-bookmark:_Toc115416263'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Class</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
***************
*** 6502,6508 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662267"></a><a name="_Toc152605214"></a><a
!   name="_Toc115416264"></a><a name="_Toc126872333"></a><a name="_Toc139993256"></a><span
    style='mso-bookmark:_Toc191662267'><span style='mso-bookmark:_Toc152605214'><span
    style='mso-bookmark:_Toc115416264'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    DependOnGroup</span></span></span></span><span style='mso-fareast-font-family:
--- 7332,7338 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662267"></a><a name="_Toc152605214"></a><a
!   name="_Toc115416264"></a><a name="_Toc139993256"></a><a name="_Toc126872333"></a><span
    style='mso-bookmark:_Toc191662267'><span style='mso-bookmark:_Toc152605214'><span
    style='mso-bookmark:_Toc115416264'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    DependOnGroup</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6519,6525 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662268"></a><a name="_Toc152605215"></a><a
!   name="_Toc115416265"></a><a name="_Toc126872334"></a><a name="_Toc139993257"></a><span
    style='mso-bookmark:_Toc191662268'><span style='mso-bookmark:_Toc152605215'><span
    style='mso-bookmark:_Toc115416265'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    DependOnService</span></span></span></span><span style='mso-fareast-font-family:
--- 7349,7355 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662268"></a><a name="_Toc152605215"></a><a
!   name="_Toc115416265"></a><a name="_Toc139993257"></a><a name="_Toc126872334"></a><span
    style='mso-bookmark:_Toc191662268'><span style='mso-bookmark:_Toc152605215'><span
    style='mso-bookmark:_Toc115416265'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    DependOnService</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6535,6541 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662269"></a><a name="_Toc152605216"></a><a
!   name="_Toc115416266"></a><a name="_Toc126872335"></a><a name="_Toc139993258"></a><span
    style='mso-bookmark:_Toc191662269'><span style='mso-bookmark:_Toc152605216'><span
    style='mso-bookmark:_Toc115416266'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Name</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
--- 7365,7371 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662269"></a><a name="_Toc152605216"></a><a
!   name="_Toc115416266"></a><a name="_Toc139993258"></a><a name="_Toc126872335"></a><span
    style='mso-bookmark:_Toc191662269'><span style='mso-bookmark:_Toc152605216'><span
    style='mso-bookmark:_Toc115416266'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Name</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
***************
*** 6548,6554 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662270"></a><a name="_Toc152605217"></a><a
!   name="_Toc115416267"></a><a name="_Toc126872336"></a><a name="_Toc139993259"></a><span
    style='mso-bookmark:_Toc191662270'><span style='mso-bookmark:_Toc152605217'><span
    style='mso-bookmark:_Toc115416267'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ProviderPath</span></span></span></span><span style='mso-fareast-font-family:
--- 7378,7384 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:65.75pt'>
    <h5><a name="_Toc191662270"></a><a name="_Toc152605217"></a><a
!   name="_Toc115416267"></a><a name="_Toc139993259"></a><a name="_Toc126872336"></a><span
    style='mso-bookmark:_Toc191662270'><span style='mso-bookmark:_Toc152605217'><span
    style='mso-bookmark:_Toc115416267'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ProviderPath</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6560,6649 ****
   </tr>
  </table>
  
! <h2><a name="_Toc191662271"></a><a name="_Toc152605218"></a><a
! name="_Toc139993260"></a><a name="_Toc126872337"></a><a name="_Toc115417106"></a><a
! name="_Toc115416268"></a><a name="_A.2.1_Domain_specific_configuration"></a><span
! style='mso-bookmark:_Toc191662271'><span style='mso-bookmark:_Toc152605218'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.2.1 Domain specific
! configuration keys for the Network Provider</span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoBodyText>The network provider can be configured to have different
! behavior depending on the domain that the user logs into.&nbsp; These settings
! are only relevant when using integrated login.&nbsp; A domain refers to an
! Active Directory (AD) domain, a trusted Kerberos (non-AD) realm or the local
! machine (i.e. local account logins).&nbsp; The domain name that is used for
! selecting the domain would be the domain that is passed into the NPLogonNotify
! function of the network provider.</p>
! 
! <p class=MsoBodyText>Domain specific registry keys are:</p>
! 
! <h3><a name="_Toc191662272"></a><a name="_Toc152605219"></a><a
! name="_Toc115416269"></a><a name="_Toc139993261"></a><a name="_Toc126872338"></a><span
! style='mso-bookmark:_Toc191662272'><span style='mso-bookmark:_Toc152605219'><span
! style='mso-bookmark:_Toc115416269'><span style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>&nbsp; (NP key)</p>
  
! <h3><a name="_Toc191662273"></a><a name="_Toc152605220"></a><a
! name="_Toc115416270"></a><a name="_Toc139993262"></a><a name="_Toc126872339"></a><span
! style='mso-bookmark:_Toc191662273'><span style='mso-bookmark:_Toc152605220'><span
! style='mso-bookmark:_Toc115416270'><span style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>&nbsp; (Domains key)</p>
  
! <h3><a name="_Toc191662274"></a><a name="_Toc152605221"></a><a
! name="_Toc115416271"></a><a name="_Toc139993263"></a><a name="_Toc126872340"></a><span
! style='mso-bookmark:_Toc191662274'><span style='mso-bookmark:_Toc152605221'><span
! style='mso-bookmark:_Toc115416271'><span style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\&quot;domain
! name&quot;]</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>&nbsp; (Specific domain key. One per domain.)</p>
  
! <h3><a name="_Toc191662275"></a><a name="_Toc152605222"></a><a
! name="_Toc115416272"></a><a name="_Toc139993264"></a><a name="_Toc126872341"></a><span
! style='mso-bookmark:_Toc191662275'><span style='mso-bookmark:_Toc152605222'><span
! style='mso-bookmark:_Toc115416272'><span style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\LOCALHOST]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>&nbsp; (Localhost key)</p>
  
! <h3><a name="_Toc191662276"></a><a name="_Toc152605223"></a><a
! name="_Toc115416273"></a><a name="_Toc139993265"></a><a name="_Toc126872342"></a><span
! style='mso-bookmark:_Toc191662276'><span style='mso-bookmark:_Toc152605223'><span
! style='mso-bookmark:_Toc115416273'><span style='mso-fareast-font-family:"Times New Roman"'>Example:</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=preformattedtext>&nbsp;HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider</p>
! 
! <p class=preformattedtext>&nbsp; |</p>
! 
! <p class=preformattedtext>&nbsp; +- Domain</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp; +-AD1.EXAMPLE.COM</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp; +-AD2.EXAMPLE.NET</p>
  
! <p class=preformattedtext>&nbsp;&nbsp;&nbsp;&nbsp; +-LOCALHOST</p>
! 
! <p class=MsoBodyText>Each of the domain specific keys can have the set of
! values described in 2.1.1.&nbsp; The effective values are chosen as described
! in 2.1.2.</p>
! 
! <h3><a name="_Toc191662277"></a><a name="_Toc152605224"></a><a
! name="_Toc115416274"></a><a name="_Toc139993266"></a><a name="_Toc126872343"></a><span
! style='mso-bookmark:_Toc191662277'><span style='mso-bookmark:_Toc152605224'><span
! style='mso-bookmark:_Toc115416274'><span style='mso-fareast-font-family:"Times New Roman"'>A.2.1.1
! Domain specific configuration values</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <h4><a name="_Toc191662278"></a><a name="_Toc152605225"></a><a
! name="_Toc115416275"></a><a name="_Toc139993267"></a><a name="_Toc126872344"></a><span
! style='mso-bookmark:_Toc191662278'><span style='mso-bookmark:_Toc152605225'><span
! style='mso-bookmark:_Toc115416275'><span style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]<br>
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain]<br>
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\&quot;domain
  name&quot;]<br>
--- 7390,7511 ----
   </tr>
  </table>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871742"></a><a name="_Toc193871497"></a><a name="_Toc191662271"></a><a
! name="_Toc152605218"></a><a name="_Toc139993260"></a><a name="_Toc126872337"></a><a
! name="_Toc115417106"></a><a name="_Toc115416268"></a><a
! name="_A.2.1_Domain_specific_configuration"></a><span style='mso-bookmark:_Toc193871742'><span
! style='mso-bookmark:_Toc193871497'><span style='mso-bookmark:_Toc191662271'><span
! style='mso-bookmark:_Toc152605218'><span style='mso-fareast-font-family:"Times New Roman"'>A.2.1
! Domain specific configuration keys for the Network Provider</span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
! 
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>The
! network provider can be configured to have different behavior depending on the
! domain that the user logs into.&nbsp; These settings are only relevant when
! using integrated login.&nbsp; A domain refers to an Active Directory (AD)
! domain, a trusted Kerberos (non-AD) realm or the local machine (i.e. local
! account logins).&nbsp; The domain name that is used for selecting the domain
! would be the domain that is passed into the NPLogonNotify function of the
! network provider.</p>
! 
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Domain
! specific registry keys are:</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871743"></a><a name="_Toc193871498"></a><a name="_Toc191662272"></a><a
! name="_Toc152605219"></a><a name="_Toc115416269"></a><a name="_Toc139993261"></a><a
! name="_Toc126872338"></a><span style='mso-bookmark:_Toc193871743'><span
! style='mso-bookmark:_Toc193871498'><span style='mso-bookmark:_Toc191662272'><span
! style='mso-bookmark:_Toc152605219'><span style='mso-bookmark:_Toc115416269'><span
! style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! (NP key)</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871744"></a><a name="_Toc193871499"></a><a name="_Toc191662273"></a><a
! name="_Toc152605220"></a><a name="_Toc115416270"></a><a name="_Toc139993262"></a><a
! name="_Toc126872339"></a><span style='mso-bookmark:_Toc193871744'><span
! style='mso-bookmark:_Toc193871499'><span style='mso-bookmark:_Toc191662273'><span
! style='mso-bookmark:_Toc152605220'><span style='mso-bookmark:_Toc115416270'><span
! style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! (Domains key)</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871745"></a><a name="_Toc193871500"></a><a name="_Toc191662274"></a><a
! name="_Toc152605221"></a><a name="_Toc115416271"></a><a name="_Toc139993263"></a><a
! name="_Toc126872340"></a><span style='mso-bookmark:_Toc193871745'><span
! style='mso-bookmark:_Toc193871500'><span style='mso-bookmark:_Toc191662274'><span
! style='mso-bookmark:_Toc152605221'><span style='mso-bookmark:_Toc115416271'><span
! style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\&quot;domain
! name&quot;]</span></span></span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! (Specific domain key. One per domain.)</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871746"></a><a name="_Toc193871501"></a><a name="_Toc191662275"></a><a
! name="_Toc152605222"></a><a name="_Toc115416272"></a><a name="_Toc139993264"></a><a
! name="_Toc126872341"></a><span style='mso-bookmark:_Toc193871746'><span
! style='mso-bookmark:_Toc193871501'><span style='mso-bookmark:_Toc191662275'><span
! style='mso-bookmark:_Toc152605222'><span style='mso-bookmark:_Toc115416272'><span
! style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\LOCALHOST]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! (Localhost key)</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871747"></a><a name="_Toc193871502"></a><a name="_Toc191662276"></a><a
! name="_Toc152605223"></a><a name="_Toc115416273"></a><a name="_Toc139993265"></a><a
! name="_Toc126872342"></a><span style='mso-bookmark:_Toc193871747'><span
! style='mso-bookmark:_Toc193871502'><span style='mso-bookmark:_Toc191662276'><span
! style='mso-bookmark:_Toc152605223'><span style='mso-bookmark:_Toc115416273'><span
! style='mso-fareast-font-family:"Times New Roman"'>Example:</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! |</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;
! +- Domain</p>
  
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;
! +-AD1.EXAMPLE.COM</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;
! +-AD2.EXAMPLE.NET</p>
! 
! <p class=preformattedtext style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;&nbsp;&nbsp;&nbsp;
! +-LOCALHOST</p>
! 
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Each
! of the domain specific keys can have the set of values described in
! 2.1.1.&nbsp; The effective values are chosen as described in 2.1.2.</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871748"></a><a name="_Toc193871503"></a><a name="_Toc191662277"></a><a
! name="_Toc152605224"></a><a name="_Toc115416274"></a><a name="_Toc139993266"></a><a
! name="_Toc126872343"></a><span style='mso-bookmark:_Toc193871748'><span
! style='mso-bookmark:_Toc193871503'><span style='mso-bookmark:_Toc191662277'><span
! style='mso-bookmark:_Toc152605224'><span style='mso-bookmark:_Toc115416274'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.2.1.1 Domain specific
! configuration values</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662278"></a><a name="_Toc152605225"></a><a name="_Toc115416275"></a><a
! name="_Toc139993267"></a><a name="_Toc126872344"></a><span style='mso-bookmark:
! _Toc191662278'><span style='mso-bookmark:_Toc152605225'><span style='mso-bookmark:
! _Toc115416275'><span style='mso-fareast-font-family:"Times New Roman"'>[HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider]<br>
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain]<br>
  [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider\Domain\&quot;domain
  name&quot;]<br>
***************
*** 6656,6666 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:191.0pt'>
    <h5><a name="_Toc191662279"></a><a name="_Toc152605226"></a><a
!   name="_Value___:_LogonOptions"></a><a name="_Toc115416276"></a><a
!   name="_Toc126872345"></a><a name="_Toc139993268"></a><span style='mso-bookmark:
!   _Toc191662279'><span style='mso-bookmark:_Toc152605226'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: LogonOptions</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
    Default: 0x01</p>
    <p class=MsoBodyText>NSIS/WiX: depends on user configuration</p>
--- 7518,7527 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:191.0pt'>
    <h5><a name="_Toc191662279"></a><a name="_Toc152605226"></a><a
!   name="_Toc139993268"></a><a name="_Toc126872345"></a><a name="_Toc115416276"></a><a
!   name="_Value___:_LogonOptions"></a><span style='mso-bookmark:_Toc191662279'><span
!   style='mso-bookmark:_Toc152605226'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   LogonOptions</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD<br>
    Default: 0x01</p>
    <p class=MsoBodyText>NSIS/WiX: depends on user configuration</p>
***************
*** 6680,6686 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662280"></a><a name="_Toc152605227"></a><a
!   name="_Toc115416277"></a><a name="_Toc126872346"></a><a name="_Toc139993269"></a><span
    style='mso-bookmark:_Toc191662280'><span style='mso-bookmark:_Toc152605227'><span
    style='mso-bookmark:_Toc115416277'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    FailLoginsSilentl</span></span></span></span><span style='mso-fareast-font-family:
--- 7541,7547 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662280"></a><a name="_Toc152605227"></a><a
!   name="_Toc115416277"></a><a name="_Toc139993269"></a><a name="_Toc126872346"></a><span
    style='mso-bookmark:_Toc191662280'><span style='mso-bookmark:_Toc152605227'><span
    style='mso-bookmark:_Toc115416277'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    FailLoginsSilentl</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6696,6702 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:139.0pt'>
    <h5><a name="_Toc191662281"></a><a name="_Toc152605228"></a><a
!   name="_Toc115416278"></a><a name="_Toc126872347"></a><a name="_Toc139993270"></a><span
    style='mso-bookmark:_Toc191662281'><span style='mso-bookmark:_Toc152605228'><span
    style='mso-bookmark:_Toc115416278'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LogonScript</span></span></span></span><span style='mso-fareast-font-family:
--- 7557,7563 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:139.0pt'>
    <h5><a name="_Toc191662281"></a><a name="_Toc152605228"></a><a
!   name="_Toc115416278"></a><a name="_Toc139993270"></a><a name="_Toc126872347"></a><span
    style='mso-bookmark:_Toc191662281'><span style='mso-bookmark:_Toc152605228'><span
    style='mso-bookmark:_Toc115416278'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LogonScript</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6717,6723 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662282"></a><a name="_Toc152605229"></a><a
!   name="_Toc115416279"></a><a name="_Toc126872348"></a><a name="_Toc139993271"></a><span
    style='mso-bookmark:_Toc191662282'><span style='mso-bookmark:_Toc152605229'><span
    style='mso-bookmark:_Toc115416279'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LoginRetryInterval</span></span></span></span><span style='mso-fareast-font-family:
--- 7578,7584 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:105.5pt'>
    <h5><a name="_Toc191662282"></a><a name="_Toc152605229"></a><a
!   name="_Toc115416279"></a><a name="_Toc139993271"></a><a name="_Toc126872348"></a><span
    style='mso-bookmark:_Toc191662282'><span style='mso-bookmark:_Toc152605229'><span
    style='mso-bookmark:_Toc115416279'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LoginRetryInterval</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6735,6741 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662283"></a><a name="_Toc152605230"></a><a
!   name="_Toc115416280"></a><a name="_Toc126872349"></a><a name="_Toc139993272"></a><span
    style='mso-bookmark:_Toc191662283'><span style='mso-bookmark:_Toc152605230'><span
    style='mso-bookmark:_Toc115416280'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LoginSleepInterval</span></span></span></span><span style='mso-fareast-font-family:
--- 7596,7602 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:79.25pt'>
    <h5><a name="_Toc191662283"></a><a name="_Toc152605230"></a><a
!   name="_Toc115416280"></a><a name="_Toc139993272"></a><a name="_Toc126872349"></a><span
    style='mso-bookmark:_Toc191662283'><span style='mso-bookmark:_Toc152605230'><span
    style='mso-bookmark:_Toc115416280'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    LoginSleepInterval</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6756,6774 ****
    NSIS: &lt;not set&gt;</p>
    <p class=MsoBodyText>When Kerberos v5 is being used, Realm specifies the
    Kerberos v5 realm that should be appended to the first component of the
!   Domain logon username to construct the Kerberos v5 principal for which AFS
!   tokens should be obtained.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662285"></a><a name="_Toc152605231"></a><a
!   name="_Value:_TheseCells"></a><a name="_Toc115416281"></a><a
!   name="_Toc126872350"></a><a name="_Toc139993273"></a><span style='mso-bookmark:
!   _Toc191662285'><span style='mso-bookmark:_Toc152605231'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value: TheseCells</span></span></span><span
!   style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_MULTI_SZ<br>
    NSIS: &lt;not set&gt;</p>
    <p class=MsoBodyText>When Kerberos v5 is being used, TheseCells provides a
--- 7617,7634 ----
    NSIS: &lt;not set&gt;</p>
    <p class=MsoBodyText>When Kerberos v5 is being used, Realm specifies the
    Kerberos v5 realm that should be appended to the first component of the
!   Domain logon username to construct the Kerberos v5 principal for which AFS tokens
!   should be obtained.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:6;mso-yfti-lastrow:yes;height:78.5pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:78.5pt'>
    <h5><a name="_Toc191662285"></a><a name="_Toc152605231"></a><a
!   name="_Toc139993273"></a><a name="_Toc126872350"></a><a name="_Toc115416281"></a><a
!   name="_Value:_TheseCells"></a><span style='mso-bookmark:_Toc191662285'><span
!   style='mso-bookmark:_Toc152605231'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
!   TheseCells</span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_MULTI_SZ<br>
    NSIS: &lt;not set&gt;</p>
    <p class=MsoBodyText>When Kerberos v5 is being used, TheseCells provides a
***************
*** 6778,6872 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662286"></a><a name="_Toc152605232"></a><a
! name="_Toc115416282"></a><a name="_Toc139993274"></a><a name="_Toc126872351"></a><span
! style='mso-bookmark:_Toc191662286'><span style='mso-bookmark:_Toc152605232'><span
! style='mso-bookmark:_Toc115416282'><span style='mso-fareast-font-family:"Times New Roman"'>A.2.1.2
! Selection of effective values for domain specific configuration</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>During login to domain X, where X is the domain passed
! into NPLogonNotify as lpAuthentInfo-&gt;LogonDomainName or the string
! 'LOCALHOST' if lpAuthentInfo-&gt;LogonDomainName equals the name of the
! computer, the following keys will be looked up.</p>
  
! <p class=MsoBodyText style='margin-left:.5in;text-indent:-.25in'>1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>NP key.
  (&quot;HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider&quot;)</p>
  
! <p class=MsoBodyText style='margin-left:.5in;text-indent:-.25in'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Domains key. (NP key\&quot;Domain&quot;)</p>
  
! <p class=MsoBodyText style='margin-left:.5in;text-indent:-.25in'>3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Specific domain key. (Domains key\X)</p>
  
! <p class=MsoBodyText>If the specific domain key does not exist, then the domains
! key will be ignored.&nbsp; All the configuration information in this case will
! come from the NP key.</p>
! 
! <p class=MsoBodyText>If the specific domain key exists, then for each of the
! values metioned in (2), they will be looked up in the specific domain key,
! domains key and the NP key successively until the value is found. The first
! instance of the value found this way will be the effective for the login
! session.&nbsp; If no such instance can be found, the default will be
! used.&nbsp; To re-iterate, a value in a more specific key supercedes a value in
! a less specific key.&nbsp; The exceptions to this rule are stated below.</p>
! 
! <h3><a name="_Toc191662287"></a><a name="_Toc152605233"></a><a
! name="_Toc115416283"></a><a name="_Toc139993275"></a><a name="_Toc126872352"></a><span
! style='mso-bookmark:_Toc191662287'><span style='mso-bookmark:_Toc152605233'><span
! style='mso-bookmark:_Toc115416283'><span style='mso-fareast-font-family:"Times New Roman"'>A.2.1.3
! Exceptions to A.2.1.2</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText>To retain backwards compatibility, the following
! exceptions are made to 2.1.2.</p>
  
! <h4><a name="_Toc191662288"></a><a name="_Toc152605234"></a><a
! name="_Toc115416284"></a><a name="_Toc139993276"></a><a name="_Toc126872353"></a><span
! style='mso-bookmark:_Toc191662288'><span style='mso-bookmark:_Toc152605234'><span
! style='mso-bookmark:_Toc115416284'><span style='mso-fareast-font-family:"Times New Roman"'>2.1.3.1
  'FailLoginsSilently'</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=MsoBodyText>Historically, the 'FailLoginsSilently' value was in
  HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters key and not
  in the NP key.&nbsp; Therefore, for backwards compatibility, the value in the
  Parameters key will supercede all instances of this value in other keys.&nbsp;
  In the absence of this value in the Parameters key, normal scope rules apply.</p>
  
! <h4><a name="_Toc191662289"></a><a name="_Toc152605235"></a><a
! name="_Toc115416285"></a><a name="_Toc139993277"></a><a name="_Toc126872354"></a><span
! style='mso-bookmark:_Toc191662289'><span style='mso-bookmark:_Toc152605235'><span
! style='mso-bookmark:_Toc115416285'><span style='mso-fareast-font-family:"Times New Roman"'>2.1.3.2
  'LogonScript'</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=MsoBodyText>If a 'LogonScript' is not specified in the specific domain
! key nor in the domains key, the value in the NP key will only be checked if the
! effective 'LogonOptions' specify a high security integrated login.&nbsp; If a
! logon script is specified in the specific domain key or the domains key, it
! will be used regardless of the high security setting.&nbsp; Please be aware of
! this when setting this value.</p>
! 
! <h2><a name="_Toc191662290"></a><a name="_Toc152605236"></a><a
! name="_Toc115416286"></a><a name="_Toc139993278"></a><a name="_Toc126872355"></a><a
! name="_Toc115417107"></a><span style='mso-bookmark:_Toc191662290'><span
! style='mso-bookmark:_Toc152605236'><span style='mso-bookmark:_Toc115416286'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.3. AFS Credentials System
! Tray Tool parameters</span></span></span></span><span style='mso-fareast-font-family:
! "Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoBodyText>Affects the behavior of afscreds.exe</p>
  
! <h3><a name="_Toc191662291"></a><a name="_Toc152605237"></a><a
! name="_Toc115416287"></a><a name="_Toc139993279"></a><a name="_Toc126872356"></a><span
! style='mso-bookmark:_Toc191662291'><span style='mso-bookmark:_Toc152605237'><span
! style='mso-bookmark:_Toc115416287'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7638,7750 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871749"></a><a name="_Toc193871504"></a><a name="_Toc191662286"></a><a
! name="_Toc152605232"></a><a name="_Toc115416282"></a><a name="_Toc139993274"></a><a
! name="_Toc126872351"></a><span style='mso-bookmark:_Toc193871749'><span
! style='mso-bookmark:_Toc193871504'><span style='mso-bookmark:_Toc191662286'><span
! style='mso-bookmark:_Toc152605232'><span style='mso-bookmark:_Toc115416282'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.2.1.2 Selection of
! effective values for domain specific configuration</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>During
! login to domain X, where X is the domain passed into NPLogonNotify as
! lpAuthentInfo-&gt;LogonDomainName or the string 'LOCALHOST' if
! lpAuthentInfo-&gt;LogonDomainName equals the name of the computer, the
! following keys will be looked up.</p>
  
! <p class=MsoBodyText style='margin-left:.5in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>1.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>NP key.
  (&quot;HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\NetworkProvider&quot;)</p>
  
! <p class=MsoBodyText style='margin-left:.5in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>2.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Domains key. (NP key\&quot;Domain&quot;)</p>
  
! <p class=MsoBodyText style='margin-left:.5in;text-indent:-.25in;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>3.<span
  style='font-size:7.0pt;font-family:"Times New Roman","serif"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  </span>Specific domain key. (Domains key\X)</p>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! the specific domain key does not exist, then the domains key will be
! ignored.&nbsp; All the configuration information in this case will come from
! the NP key.</p>
! 
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! the specific domain key exists, then for each of the values metioned in (2),
! they will be looked up in the specific domain key, domains key and the NP key
! successively until the value is found. The first instance of the value found
! this way will be the effective for the login session.&nbsp; If no such instance
! can be found, the default will be used.&nbsp; To re-iterate, a value in a more
! specific key supercedes a value in a less specific key.&nbsp; The exceptions to
! this rule are stated below.</p>
! 
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871750"></a><a name="_Toc193871505"></a><a name="_Toc191662287"></a><a
! name="_Toc152605233"></a><a name="_Toc115416283"></a><a name="_Toc139993275"></a><a
! name="_Toc126872352"></a><span style='mso-bookmark:_Toc193871750'><span
! style='mso-bookmark:_Toc193871505'><span style='mso-bookmark:_Toc191662287'><span
! style='mso-bookmark:_Toc152605233'><span style='mso-bookmark:_Toc115416283'><span
! style='mso-fareast-font-family:"Times New Roman"'>A.2.1.3 Exceptions to A.2.1.2</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>To
! retain backwards compatibility, the following exceptions are made to 2.1.2.</p>
  
! <h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662288"></a><a name="_Toc152605234"></a><a name="_Toc115416284"></a><a
! name="_Toc139993276"></a><a name="_Toc126872353"></a><span style='mso-bookmark:
! _Toc191662288'><span style='mso-bookmark:_Toc152605234'><span style='mso-bookmark:
! _Toc115416284'><span style='mso-fareast-font-family:"Times New Roman"'>2.1.3.1
  'FailLoginsSilently'</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Historically,
! the 'FailLoginsSilently' value was in
  HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters key and not
  in the NP key.&nbsp; Therefore, for backwards compatibility, the value in the
  Parameters key will supercede all instances of this value in other keys.&nbsp;
  In the absence of this value in the Parameters key, normal scope rules apply.</p>
  
! <h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc191662289"></a><a name="_Toc152605235"></a><a name="_Toc115416285"></a><a
! name="_Toc139993277"></a><a name="_Toc126872354"></a><span style='mso-bookmark:
! _Toc191662289'><span style='mso-bookmark:_Toc152605235'><span style='mso-bookmark:
! _Toc115416285'><span style='mso-fareast-font-family:"Times New Roman"'>2.1.3.2
  'LogonScript'</span></span></span></span><span style='mso-fareast-font-family:
  "Times New Roman"'><o:p></o:p></span></h4>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>If
! a 'LogonScript' is not specified in the specific domain key nor in the domains
! key, the value in the NP key will only be checked if the effective
! 'LogonOptions' specify a high security integrated login.&nbsp; If a logon
! script is specified in the specific domain key or the domains key, it will be
! used regardless of the high security setting.&nbsp; Please be aware of this
! when setting this value.</p>
! 
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871751"></a><a name="_Toc193871506"></a><a name="_Toc191662290"></a><a
! name="_Toc152605236"></a><a name="_Toc115416286"></a><a name="_Toc139993278"></a><a
! name="_Toc126872355"></a><a name="_Toc115417107"></a><span style='mso-bookmark:
! _Toc193871751'><span style='mso-bookmark:_Toc193871506'><span style='mso-bookmark:
! _Toc191662290'><span style='mso-bookmark:_Toc152605236'><span style='mso-bookmark:
! _Toc115416286'><span style='mso-fareast-font-family:"Times New Roman"'>A.3. AFS
! Credentials System Tray Tool parameters</span></span></span></span></span></span><span
! style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h2>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>Affects
! the behavior of afscreds.exe</p>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871752"></a><a name="_Toc193871507"></a><a name="_Toc191662291"></a><a
! name="_Toc152605237"></a><a name="_Toc115416287"></a><a name="_Toc139993279"></a><a
! name="_Toc126872356"></a><span style='mso-bookmark:_Toc193871752'><span
! style='mso-bookmark:_Toc193871507'><span style='mso-bookmark:_Toc191662291'><span
! style='mso-bookmark:_Toc152605237'><span style='mso-bookmark:_Toc115416287'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKLM\SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6875,6881 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662292"></a><a name="_Toc152605238"></a><a
!   name="_Toc115416288"></a><a name="_Toc126872357"></a><a name="_Toc139993280"></a><span
    style='mso-bookmark:_Toc191662292'><span style='mso-bookmark:_Toc152605238'><span
    style='mso-bookmark:_Toc115416288'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Gateway</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
--- 7753,7759 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662292"></a><a name="_Toc152605238"></a><a
!   name="_Toc115416288"></a><a name="_Toc139993280"></a><a name="_Toc126872357"></a><span
    style='mso-bookmark:_Toc191662292'><span style='mso-bookmark:_Toc152605238'><span
    style='mso-bookmark:_Toc115416288'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Gateway</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
***************
*** 6890,6914 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662293"></a><a name="_Toc152605239"></a><a
!   name="_Toc115416289"></a><a name="_Toc126872358"></a><a name="_Toc139993281"></a><span
    style='mso-bookmark:_Toc191662293'><span style='mso-bookmark:_Toc152605239'><span
    style='mso-bookmark:_Toc115416289'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Cell</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &lt;none&gt;<br>
    Variable: IsServiceConfigured()</p>
!   <p class=MsoBodyText>The value Cell is used to determine if the AFS Client
!   Service has been properly configured or not.</p>
    </td>
   </tr>
  </table>
  
! <h3><a name="_Toc191662294"></a><a name="_Toc152605240"></a><a
! name="_Toc115416290"></a><a name="_Toc139993282"></a><a name="_Toc126872359"></a><span
! style='mso-bookmark:_Toc191662294'><span style='mso-bookmark:_Toc152605240'><span
! style='mso-bookmark:_Toc115416290'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
  [HKLM\SOFTWARE\OpenAFS\Client]<br>
! [HKCU\SOFTWARE\OpenAFS\Client]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7768,7795 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662293"></a><a name="_Toc152605239"></a><a
!   name="_Toc115416289"></a><a name="_Toc139993281"></a><a name="_Toc126872358"></a><span
    style='mso-bookmark:_Toc191662293'><span style='mso-bookmark:_Toc152605239'><span
    style='mso-bookmark:_Toc115416289'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Cell</span></span></span></span><span style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
    Default: &lt;none&gt;<br>
    Variable: IsServiceConfigured()</p>
!   <p class=MsoBodyText>The value Cell is used to determine if the AFS Client Service
!   has been properly configured or not.</p>
    </td>
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871753"></a><a name="_Toc193871508"></a><a name="_Toc191662294"></a><a
! name="_Toc152605240"></a><a name="_Toc115416290"></a><a name="_Toc139993282"></a><a
! name="_Toc126872359"></a><span style='mso-bookmark:_Toc193871753'><span
! style='mso-bookmark:_Toc193871508'><span style='mso-bookmark:_Toc191662294'><span
! style='mso-bookmark:_Toc152605240'><span style='mso-bookmark:_Toc115416290'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
  [HKLM\SOFTWARE\OpenAFS\Client]<br>
! [HKCU\SOFTWARE\OpenAFS\Client]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 6917,6923 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:157.5pt'>
    <h5><a name="_Toc191662295"></a><a name="_Toc152605241"></a><a
!   name="_Toc115416291"></a><a name="_Toc126872360"></a><a name="_Toc139993283"></a><span
    style='mso-bookmark:_Toc191662295'><span style='mso-bookmark:_Toc152605241'><span
    style='mso-bookmark:_Toc115416291'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ShowTrayIcon</span></span></span></span><span style='mso-fareast-font-family:
--- 7798,7804 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:157.5pt'>
    <h5><a name="_Toc191662295"></a><a name="_Toc152605241"></a><a
!   name="_Toc115416291"></a><a name="_Toc139993283"></a><a name="_Toc126872360"></a><span
    style='mso-bookmark:_Toc191662295'><span style='mso-bookmark:_Toc152605241'><span
    style='mso-bookmark:_Toc115416291'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    ShowTrayIcon</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6925,6933 ****
    <p class=MsoBodyText>Type: DWORD {0, 1}<br>
    Default: 1<br>
    Function: InitApp(), Main_OnCheckTerminate()</p>
!   <p class=MsoBodyText>This value is used to determine whether or not a shortcut
!   should be maintained in the user's Start Menu-&gt;Programs-&gt;Startup
!   folder. </p>
    <p class=MsoBodyText>This value used to be stored at
    [HKLM\Software\TransarcCorporation\AFS Client\AfsCreds].</p>
    <p class=MsoBodyText>The current user value is checked first; if it does not
--- 7806,7814 ----
    <p class=MsoBodyText>Type: DWORD {0, 1}<br>
    Default: 1<br>
    Function: InitApp(), Main_OnCheckTerminate()</p>
!   <p class=MsoBodyText>This value is used to determine whether or not a
!   shortcut should be maintained in the user's Start
!   Menu-&gt;Programs-&gt;Startup folder. </p>
    <p class=MsoBodyText>This value used to be stored at
    [HKLM\Software\TransarcCorporation\AFS Client\AfsCreds].</p>
    <p class=MsoBodyText>The current user value is checked first; if it does not
***************
*** 6938,6945 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:119.0pt'>
    <h5><a name="_Toc191662296"></a><a name="_Toc152605242"></a><a
!   name="_Toc115416292"></a><a name="_Toc126872361"></a><a name="_Toc139993284"></a><a
!   name=EnableKFW></a><a name="_Value:_EnableKFW"></a><span style='mso-bookmark:
    _Toc191662296'><span style='mso-bookmark:_Toc152605242'><span
    style='mso-bookmark:_Toc115416292'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    EnableKFW</span></span></span></span><span style='mso-fareast-font-family:
--- 7819,7826 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:119.0pt'>
    <h5><a name="_Toc191662296"></a><a name="_Toc152605242"></a><a
!   name="_Toc115416292"></a><a name="_Value:_EnableKFW"></a><a name=EnableKFW></a><a
!   name="_Toc139993284"></a><a name="_Toc126872361"></a><span style='mso-bookmark:
    _Toc191662296'><span style='mso-bookmark:_Toc152605242'><span
    style='mso-bookmark:_Toc115416292'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    EnableKFW</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 6967,6984 ****
    Kerberos v4 names by the AFS servers before they can be looked up in the
    Protection database.&nbsp; The mapping algorithm used permits collisions to
    occur.&nbsp; Both of the Kerberos v5 names, &quot;<a
!   href="mailto:user.admin@REALM">user.admin@REALM</a>&quot; and &quot;<a
!   href="mailto:user/admin@REALM">user/admin@REALM</a>&quot; are interpreted as
!   the same user identity within the cell.&nbsp; To enable both names to be sent
!   to the server by AFSCreds or Integrated Logon, set this value to 1.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:3;height:119.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:119.0pt'>
!   <h5><a name="_Toc191662298"></a><a name="_Value___:_Use524"></a><a
!   name="_Toc126872362"></a><a name="_Toc139993285"></a><a name=Use524></a><a
!   name="_Value:_Use524"></a><span style='mso-bookmark:_Toc191662298'><span
    style='mso-fareast-font-family:"Times New Roman"'>Value: Use524</span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0, 1}<br>
--- 7848,7868 ----
    Kerberos v4 names by the AFS servers before they can be looked up in the
    Protection database.&nbsp; The mapping algorithm used permits collisions to
    occur.&nbsp; Both of the Kerberos v5 names, &quot;<a
!   href="mailto:user.admin@REALM"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>user.admin@REALM</span></span></a>&quot;
!   and &quot;<a href="mailto:user/admin@REALM"><span class=Heading1Char><span
!   style='font-size:14.0pt;text-decoration:none;text-underline:none'>user/admin@REALM</span></span></a>&quot;
!   are interpreted as the same user identity within the cell.&nbsp; To enable
!   both names to be sent to the server by AFSCreds or Integrated Logon, set this
!   value to 1.</p>
    </td>
   </tr>
   <tr style='mso-yfti-irow:3;height:119.0pt'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:119.0pt'>
!   <h5><a name="_Toc191662298"></a><a name="_Value:_Use524"></a><a name=Use524></a><a
!   name="_Toc139993285"></a><a name="_Toc126872362"></a><a
!   name="_Value___:_Use524"></a><span style='mso-bookmark:_Toc191662298'><span
    style='mso-fareast-font-family:"Times New Roman"'>Value: Use524</span></span><span
    style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: DWORD {0, 1}<br>
***************
*** 6995,7004 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:251.5pt'>
    <h5><a name="_Toc191662299"></a><a name="_Toc152605244"></a><a
!   name="_Value___:_AfscredsShortcutParams"></a><a name="_Toc115416294"></a><a
!   name="_Toc126872363"></a><a name="_Toc139993286"></a><span style='mso-bookmark:
!   _Toc191662299'><span style='mso-bookmark:_Toc152605244'><span
!   style='mso-fareast-font-family:"Times New Roman"'>Value:
    AfscredsShortcutParams</span></span></span><span style='mso-fareast-font-family:
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
--- 7879,7887 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:251.5pt'>
    <h5><a name="_Toc191662299"></a><a name="_Toc152605244"></a><a
!   name="_Toc139993286"></a><a name="_Toc126872363"></a><a name="_Toc115416294"></a><a
!   name="_Value___:_AfscredsShortcutParams"></a><span style='mso-bookmark:_Toc191662299'><span
!   style='mso-bookmark:_Toc152605244'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    AfscredsShortcutParams</span></span></span><span style='mso-fareast-font-family:
    "Times New Roman"'><o:p></o:p></span></h5>
    <p class=MsoBodyText>Type: REG_SZ<br>
***************
*** 7007,7016 ****
    <p class=MsoBodyText>This value specifies the command line options which
    should be set as part of the shortcut to afscreds.exe.&nbsp; afscreds.exe
    rewrites the shortcut each time it exits so as to ensure that the shortcut
!   points to the latest version of the program.&nbsp; This value is used to determine
!   which values should be used for command line parameters.&nbsp; The current
!   user value is checked first; if it does not exist the local machine value is
!   checked.</p>
    <p class=MsoBodyText>The following subset of the command line options is
    appropriate for use in this registry setting:</p>
    <p class=MsoBodyText>-A = autoinit<br>
--- 7890,7899 ----
    <p class=MsoBodyText>This value specifies the command line options which
    should be set as part of the shortcut to afscreds.exe.&nbsp; afscreds.exe
    rewrites the shortcut each time it exits so as to ensure that the shortcut
!   points to the latest version of the program.&nbsp; This value is used to
!   determine which values should be used for command line parameters.&nbsp; The
!   current user value is checked first; if it does not exist the local machine
!   value is checked.</p>
    <p class=MsoBodyText>The following subset of the command line options is
    appropriate for use in this registry setting:</p>
    <p class=MsoBodyText>-A = autoinit<br>
***************
*** 7024,7034 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662300"></a><a name="_Toc152605245"></a><a
! name="_Toc115416295"></a><a name="_Toc139993287"></a><a name="_Toc126872364"></a><span
! style='mso-bookmark:_Toc191662300'><span style='mso-bookmark:_Toc152605245'><span
! style='mso-bookmark:_Toc115416295'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7907,7920 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871754"></a><a name="_Toc193871509"></a><a name="_Toc191662300"></a><a
! name="_Toc152605245"></a><a name="_Toc115416295"></a><a name="_Toc139993287"></a><a
! name="_Toc126872364"></a><span style='mso-bookmark:_Toc193871754'><span
! style='mso-bookmark:_Toc193871509'><span style='mso-bookmark:_Toc191662300'><span
! style='mso-bookmark:_Toc152605245'><span style='mso-bookmark:_Toc115416295'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 7038,7044 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662301"></a><a name="_Toc152605246"></a><a
!   name="_Toc115416296"></a><a name="_Toc126872365"></a><a name="_Toc139993288"></a><span
    style='mso-bookmark:_Toc191662301'><span style='mso-bookmark:_Toc152605246'><span
    style='mso-bookmark:_Toc115416296'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Authentication Cell</span></span></span></span><span style='mso-fareast-font-family:
--- 7924,7930 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:92.0pt'>
    <h5><a name="_Toc191662301"></a><a name="_Toc152605246"></a><a
!   name="_Toc115416296"></a><a name="_Toc139993288"></a><a name="_Toc126872365"></a><span
    style='mso-bookmark:_Toc191662301'><span style='mso-bookmark:_Toc152605246'><span
    style='mso-bookmark:_Toc115416296'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    Authentication Cell</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 7052,7062 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662302"></a><a name="_Toc152605247"></a><a
! name="_Toc115416297"></a><a name="_Toc139993289"></a><a name="_Toc126872366"></a><span
! style='mso-bookmark:_Toc191662302'><span style='mso-bookmark:_Toc152605247'><span
! style='mso-bookmark:_Toc115416297'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client\Reminders]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7938,7951 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871755"></a><a name="_Toc193871510"></a><a name="_Toc191662302"></a><a
! name="_Toc152605247"></a><a name="_Toc115416297"></a><a name="_Toc139993289"></a><a
! name="_Toc126872366"></a><span style='mso-bookmark:_Toc193871755'><span
! style='mso-bookmark:_Toc193871510'><span style='mso-bookmark:_Toc191662302'><span
! style='mso-bookmark:_Toc152605247'><span style='mso-bookmark:_Toc115416297'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client\Reminders]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 7066,7072 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:124.75pt'>
    <h5><a name="_Toc191662303"></a><a name="_Toc152605248"></a><a
!   name="_Toc115416298"></a><a name="_Toc126872367"></a><a name="_Toc139993290"></a><span
    style='mso-bookmark:_Toc191662303'><span style='mso-bookmark:_Toc152605248'><span
    style='mso-bookmark:_Toc115416298'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;afs cell name&quot;</span></span></span></span><span style='mso-fareast-font-family:
--- 7955,7961 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:124.75pt'>
    <h5><a name="_Toc191662303"></a><a name="_Toc152605248"></a><a
!   name="_Toc115416298"></a><a name="_Toc139993290"></a><a name="_Toc126872367"></a><span
    style='mso-bookmark:_Toc191662303'><span style='mso-bookmark:_Toc152605248'><span
    style='mso-bookmark:_Toc115416298'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;afs cell name&quot;</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 7082,7092 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662304"></a><a name="_Toc152605249"></a><a
! name="_Toc115416299"></a><a name="_Toc139993291"></a><a name="_Toc126872368"></a><span
! style='mso-bookmark:_Toc191662304'><span style='mso-bookmark:_Toc152605249'><span
! style='mso-bookmark:_Toc115416299'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client\Active Maps]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 7971,7984 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871756"></a><a name="_Toc193871511"></a><a name="_Toc191662304"></a><a
! name="_Toc152605249"></a><a name="_Toc115416299"></a><a name="_Toc139993291"></a><a
! name="_Toc126872368"></a><span style='mso-bookmark:_Toc193871756'><span
! style='mso-bookmark:_Toc193871511'><span style='mso-bookmark:_Toc191662304'><span
! style='mso-bookmark:_Toc152605249'><span style='mso-bookmark:_Toc115416299'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client\Active Maps]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 7096,7102 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:98.5pt'>
    <h5><a name="_Toc191662305"></a><a name="_Toc152605250"></a><a
!   name="_Toc115416300"></a><a name="_Toc126872369"></a><a name="_Toc139993292"></a><span
    style='mso-bookmark:_Toc191662305'><span style='mso-bookmark:_Toc152605250'><span
    style='mso-bookmark:_Toc115416300'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;upper case drive letter&quot;</span></span></span></span><span
--- 7988,7994 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:98.5pt'>
    <h5><a name="_Toc191662305"></a><a name="_Toc152605250"></a><a
!   name="_Toc115416300"></a><a name="_Toc139993292"></a><a name="_Toc126872369"></a><span
    style='mso-bookmark:_Toc191662305'><span style='mso-bookmark:_Toc152605250'><span
    style='mso-bookmark:_Toc115416300'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;upper case drive letter&quot;</span></span></span></span><span
***************
*** 7110,7120 ****
   </tr>
  </table>
  
! <h3><a name="_Toc191662306"></a><a name="_Toc152605251"></a><a
! name="_Toc115416301"></a><a name="_Toc139993293"></a><a name="_Toc126872370"></a><span
! style='mso-bookmark:_Toc191662306'><span style='mso-bookmark:_Toc152605251'><span
! style='mso-bookmark:_Toc115416301'><span style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client\Mappings]</span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
--- 8002,8015 ----
   </tr>
  </table>
  
! <h3 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871757"></a><a name="_Toc193871512"></a><a name="_Toc191662306"></a><a
! name="_Toc152605251"></a><a name="_Toc115416301"></a><a name="_Toc139993293"></a><a
! name="_Toc126872370"></a><span style='mso-bookmark:_Toc193871757'><span
! style='mso-bookmark:_Toc193871512'><span style='mso-bookmark:_Toc191662306'><span
! style='mso-bookmark:_Toc152605251'><span style='mso-bookmark:_Toc115416301'><span
! style='mso-fareast-font-family:"Times New Roman"'>Regkey:<br>
! [HKCU\SOFTWARE\OpenAFS\Client\Mappings]</span></span></span></span></span></span><span
  style='mso-fareast-font-family:"Times New Roman"'><o:p></o:p></span></h3>
  
  <table class=MsoNormalTable border=1 cellspacing=3 cellpadding=0
***************
*** 7124,7130 ****
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:98.5pt'>
    <h5><a name="_Toc191662307"></a><a name="_Toc152605252"></a><a
!   name="_Toc115416302"></a><a name="_Toc126872371"></a><a name="_Toc139993294"></a><span
    style='mso-bookmark:_Toc191662307'><span style='mso-bookmark:_Toc152605252'><span
    style='mso-bookmark:_Toc115416302'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;upper case drive letter&quot;</span></span></span></span><span
--- 8019,8025 ----
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt;
    height:98.5pt'>
    <h5><a name="_Toc191662307"></a><a name="_Toc152605252"></a><a
!   name="_Toc115416302"></a><a name="_Toc139993294"></a><a name="_Toc126872371"></a><span
    style='mso-bookmark:_Toc191662307'><span style='mso-bookmark:_Toc152605252'><span
    style='mso-bookmark:_Toc115416302'><span style='mso-fareast-font-family:"Times New Roman"'>Value:
    &quot;upper case drive letter&quot;</span></span></span></span><span
***************
*** 7138,7149 ****
   </tr>
  </table>
  
! <h2><a name="_Toc191662308"></a><a name="_Toc152605253"></a><a
! name="_Toc115416303"></a><a name="_Toc139993295"></a><a name="_Toc126872372"></a><a
! name="_Toc115417108"></a><span style='mso-bookmark:_Toc191662308'><span
! style='mso-bookmark:_Toc152605253'><span style='mso-bookmark:_Toc115416303'><span
! lang=FR style='mso-fareast-font-family:"Times New Roman";mso-ansi-language:
! FR'>A.4 OpenAFS Client Service Environment Variables</span></span></span></span><span
  lang=FR style='mso-fareast-font-family:"Times New Roman";mso-ansi-language:
  FR'><o:p></o:p></span></h2>
  
--- 8033,8046 ----
   </tr>
  </table>
  
! <h2 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a
! name="_Toc193871758"></a><a name="_Toc193871513"></a><a name="_Toc191662308"></a><a
! name="_Toc152605253"></a><a name="_Toc115416303"></a><a name="_Toc139993295"></a><a
! name="_Toc126872372"></a><a name="_Toc115417108"></a><span style='mso-bookmark:
! _Toc193871758'><span style='mso-bookmark:_Toc193871513'><span style='mso-bookmark:
! _Toc191662308'><span style='mso-bookmark:_Toc152605253'><span style='mso-bookmark:
! _Toc115416303'><span lang=FR style='mso-fareast-font-family:"Times New Roman";
! mso-ansi-language:FR'>A.4 OpenAFS Client Service Environment Variables</span></span></span></span></span></span><span
  lang=FR style='mso-fareast-font-family:"Times New Roman";mso-ansi-language:
  FR'><o:p></o:p></span></h2>
  
***************
*** 7152,7158 ****
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662309"></a><a name="_Toc152605254"></a><a
!   name="_Toc115416304"></a><a name="_Toc126872373"></a><a name="_Toc139993296"></a><span
    style='mso-bookmark:_Toc191662309'><span style='mso-bookmark:_Toc152605254'><span
    style='mso-bookmark:_Toc115416304'><span style='mso-fareast-font-family:"Times New Roman"'>Variable:
    AFS_RPC_ENCRYPT</span></span></span></span><span style='mso-fareast-font-family:
--- 8049,8055 ----
   <tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662309"></a><a name="_Toc152605254"></a><a
!   name="_Toc115416304"></a><a name="_Toc139993296"></a><a name="_Toc126872373"></a><span
    style='mso-bookmark:_Toc191662309'><span style='mso-bookmark:_Toc152605254'><span
    style='mso-bookmark:_Toc115416304'><span style='mso-fareast-font-family:"Times New Roman"'>Variable:
    AFS_RPC_ENCRYPT</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 7165,7171 ****
   <tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662310"></a><a name="_Toc152605255"></a><a
!   name="_Toc115416305"></a><a name="_Toc126872374"></a><a name="_Toc139993297"></a><span
    style='mso-bookmark:_Toc191662310'><span style='mso-bookmark:_Toc152605255'><span
    style='mso-bookmark:_Toc115416305'><span style='mso-fareast-font-family:"Times New Roman"'>Variable:
    AFS_RPC_PROTSEQ</span></span></span></span><span style='mso-fareast-font-family:
--- 8062,8068 ----
   <tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'>
    <td width=590 valign=top style='width:6.15in;padding:0in 5.4pt 0in 5.4pt'>
    <h5><a name="_Toc191662310"></a><a name="_Toc152605255"></a><a
!   name="_Toc115416305"></a><a name="_Toc139993297"></a><a name="_Toc126872374"></a><span
    style='mso-bookmark:_Toc191662310'><span style='mso-bookmark:_Toc152605255'><span
    style='mso-bookmark:_Toc115416305'><span style='mso-fareast-font-family:"Times New Roman"'>Variable:
    AFS_RPC_PROTSEQ</span></span></span></span><span style='mso-fareast-font-family:
***************
*** 7181,7187 ****
   </tr>
  </table>
  
! <p class=MsoBodyText>&nbsp;</p>
  
  </div>
  
--- 8078,8084 ----
   </tr>
  </table>
  
! <p class=MsoBodyText style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'>&nbsp;</p>
  
  </div>
  
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.29 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.30
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.29	Mon Feb 25 00:24:53 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm	Sat Mar  8 20:09:50 2008
***************
*** 11,17 ****
  <meta name=Originator content="Microsoft Word 12">
  <base target=body>
  <link rel=File-List href="toc_files/filelist.xml">
! <title>OpenAFS for Windows 1.5.33 Table of Contents</title>
  <!--[if gte mso 9]><xml>
   <o:DocumentProperties>
    <o:Author>Jeffrey Altman</o:Author>
--- 11,17 ----
  <meta name=Originator content="Microsoft Word 12">
  <base target=body>
  <link rel=File-List href="toc_files/filelist.xml">
! <title>OpenAFS for Windows 1.5.34 Table of Contents</title>
  <!--[if gte mso 9]><xml>
   <o:DocumentProperties>
    <o:Author>Jeffrey Altman</o:Author>
***************
*** 447,471 ****
  	font-family:"Times New Roman","serif";}
  </style>
  <![endif]--><!--[if gte mso 9]><xml>
-  <o:shapedefaults v:ext="edit" spidmax="12290"/>
- </xml><![endif]--><!--[if gte mso 9]><xml>
   <o:shapelayout v:ext="edit">
    <o:idmap v:ext="edit" data="1"/>
   </o:shapelayout></xml><![endif]-->
  </head>
  
  <body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>
  
  <div class=Section1>
  
- <p class=MsoNormal><!--[if supportFields]><span style='mso-element:field-begin'></span><span
- style='mso-spacerun:yes'> </span>RD
- &quot;C:\\src\\openafs\\openafs-1-5-branch\\src\\WINNT\\doc\\install\\Documentation\\en_US\\html\\ReleaseNotes\\relnotes.htm&quot;\f
- <![endif]--><!--[if supportFields]><span style='mso-element:field-end'></span><![endif]--><!--[if supportFields]><span
- style='mso-element:field-begin'></span><span
- style='mso-spacerun:yes'> </span>TOC \h \z \n \u <span style='mso-element:field-separator'></span><![endif]--><span
- style='mso-no-proof:yes'><o:p></o:p></span></p>
- 
  <p class=MsoToc1 style='tab-stops:right dotted 431.5pt'><span
  class=MsoHyperlink><span style='mso-no-proof:yes'><a
  href="relnotes.htm#_Toc191662062"><span style='mso-fareast-font-family:"Times New Roman"'>1.
--- 447,469 ----
  	font-family:"Times New Roman","serif";}
  </style>
  <![endif]--><!--[if gte mso 9]><xml>
   <o:shapelayout v:ext="edit">
    <o:idmap v:ext="edit" data="1"/>
   </o:shapelayout></xml><![endif]-->
+ <!--[if !mso]>
+ <style>
+ v\:*         { behavior: url(#default#VML) }
+ o\:*         { behavior: url(#default#VML) }
+ w\:*         { behavior: url(#default#VML) }
+ .shape       { behavior: url(#default#VML) }
+ </style>
+ <![endif]-->
  </head>
  
  <body lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>
  
  <div class=Section1>
  
  <p class=MsoToc1 style='tab-stops:right dotted 431.5pt'><span
  class=MsoHyperlink><span style='mso-no-proof:yes'><a
  href="relnotes.htm#_Toc191662062"><span style='mso-fareast-font-family:"Times New Roman"'>1.
***************
*** 2682,2688 ****
  minor-latin;mso-bidi-font-family:"Times New Roman";mso-bidi-theme-font:minor-bidi;
  mso-no-proof:yes'><o:p></o:p></span></p>
  
! <p class=MsoNormal><!--[if supportFields]><span style='mso-element:field-end'></span><![endif]--><o:p>&nbsp;</o:p></p>
  
  <p class=MsoNormal><o:p>&nbsp;</o:p></p>
  
--- 2680,2687 ----
  minor-latin;mso-bidi-font-family:"Times New Roman";mso-bidi-theme-font:minor-bidi;
  mso-no-proof:yes'><o:p></o:p></span></p>
  
! <p class=MsoNormal><!--[if supportFields]><span style='mso-element:field-end'></span>
! <![endif]--><o:p>&nbsp;</o:p></p>
  
  <p class=MsoNormal><o:p>&nbsp;</o:p></p>
  
Index: openafs/src/WINNT/install/NSIS/OpenAFS.nsi
diff -c openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.88.4.12 openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.88.4.13
*** openafs/src/WINNT/install/NSIS/OpenAFS.nsi:1.88.4.12	Wed Jan 30 22:03:13 2008
--- openafs/src/WINNT/install/NSIS/OpenAFS.nsi	Sat Mar  8 18:39:25 2008
***************
*** 740,746 ****
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "UseDNS" $R0
    WriteRegStr HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "NetbiosName" "AFS"
    WriteRegStr HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "MountRoot" "/afs"
!   WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "RxMaxMTU" 1260
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "IsGateway" 0
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "HideDotFiles" 1
  
--- 740,746 ----
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "UseDNS" $R0
    WriteRegStr HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "NetbiosName" "AFS"
    WriteRegStr HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "MountRoot" "/afs"
!   WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "RxMaxMTU" 0
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "IsGateway" 0
    WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\TransarcAFSDaemon\Parameters" "HideDotFiles" 1
  
Index: openafs/src/WINNT/install/wix/config.wxi
diff -c openafs/src/WINNT/install/wix/config.wxi:1.11.2.1 openafs/src/WINNT/install/wix/config.wxi:1.11.2.2
*** openafs/src/WINNT/install/wix/config.wxi:1.11.2.1	Wed Oct 10 11:38:25 2007
--- openafs/src/WINNT/install/wix/config.wxi	Sat Mar  8 18:39:26 2008
***************
*** 57,63 ****
  		<?define NetbiosName="AFS"?>
      <?endif?>
      <?ifndef RxMaxMTU?>
! 		<?define RxMaxMTU="1260"?>
      <?endif?>
      <?ifndef HideDotFiles?>
  		<?define HideDotFiles="1"?>
--- 57,63 ----
  		<?define NetbiosName="AFS"?>
      <?endif?>
      <?ifndef RxMaxMTU?>
! 		<?define RxMaxMTU="0"?>
      <?endif?>
      <?ifndef HideDotFiles?>
  		<?define HideDotFiles="1"?>
Index: openafs/src/afs/afs_callback.c
diff -c openafs/src/afs/afs_callback.c:1.39.2.3 openafs/src/afs/afs_callback.c:1.39.2.4
*** openafs/src/afs/afs_callback.c:1.39.2.3	Fri Nov 23 09:32:56 2007
--- openafs/src/afs/afs_callback.c	Mon Mar 10 18:32:32 2008
***************
*** 17,23 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_callback.c,v 1.39.2.3 2007/11/23 14:32:56 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
--- 17,23 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_callback.c,v 1.39.2.4 2008/03/10 22:32:32 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
***************
*** 1009,1015 ****
      /*
       * Donate this process to Rx.
       */
!     rx_ServerProc();
      return (0);
  
  }				/*afs_RXCallBackServer */
--- 1009,1015 ----
      /*
       * Donate this process to Rx.
       */
!     rx_ServerProc(NULL);
      return (0);
  
  }				/*afs_RXCallBackServer */
Index: openafs/src/afs/afs_pioctl.c
diff -c openafs/src/afs/afs_pioctl.c:1.110.2.11 openafs/src/afs/afs_pioctl.c:1.110.2.14
*** openafs/src/afs/afs_pioctl.c:1.110.2.11	Mon Nov 26 16:08:38 2007
--- openafs/src/afs/afs_pioctl.c	Mon Mar 17 12:53:24 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_pioctl.c,v 1.110.2.11 2007/11/26 21:08:38 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #ifdef AFS_OBSD_ENV
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_pioctl.c,v 1.110.2.14 2008/03/17 16:53:24 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #ifdef AFS_OBSD_ENV
***************
*** 884,891 ****
  #if defined(AFS_SUN510_ENV)
      if (vp && !IsAfsVnode(vp)) {
  	struct vnode *realvp;
! 	
! 	if (VOP_REALVP(vp, &realvp) == 0) {
  	    struct vnode *oldvp = vp;
  	    
  	    VN_HOLD(realvp);
--- 884,896 ----
  #if defined(AFS_SUN510_ENV)
      if (vp && !IsAfsVnode(vp)) {
  	struct vnode *realvp;
! 	if
! #ifdef AFS_SUN511_ENV
!           (VOP_REALVP(vp, &realvp, NULL) == 0) 
! #else
! 	  (VOP_REALVP(vp, &realvp) == 0) 
! #endif
! {
  	    struct vnode *oldvp = vp;
  	    
  	    VN_HOLD(realvp);
***************
*** 1409,1414 ****
--- 1414,1422 ----
  	afs_osi_Free(tu->stp, tu->stLen);
      }
      tu->stp = (char *)afs_osi_Alloc(stLen);
+     if (tu->stp == NULL) {
+ 	return ENOMEM;
+     }
      tu->stLen = stLen;
      memcpy(tu->stp, stp, stLen);
      tu->ct = clear;
Index: openafs/src/afs/afs_stats.h
diff -c openafs/src/afs/afs_stats.h:1.14 openafs/src/afs/afs_stats.h:1.14.6.1
*** openafs/src/afs/afs_stats.h:1.14	Wed Apr 27 08:37:53 2005
--- openafs/src/afs/afs_stats.h	Mon Mar 17 14:03:37 2008
***************
*** 35,40 ****
--- 35,41 ----
  #define AFS_STATS(arg)
  #define XSTATS_DECLS
  #define XSTATS_START_TIME(arg)
+ #define XSTATS_START_CMTIME(arg)
  #define XSTATS_END_TIME
  
  #else /* AFS_NOSTATS */
Index: openafs/src/afs/LINUX/osi_file.c
diff -c openafs/src/afs/LINUX/osi_file.c:1.28.2.6 openafs/src/afs/LINUX/osi_file.c:1.28.2.9
*** openafs/src/afs/LINUX/osi_file.c:1.28.2.6	Thu Dec 13 14:18:33 2007
--- openafs/src/afs/LINUX/osi_file.c	Sat Mar 22 20:53:46 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_file.c,v 1.28.2.6 2007/12/13 19:18:33 shadow Exp $");
  
  #ifdef AFS_LINUX24_ENV
  #include "h/module.h" /* early to avoid printf->printk mapping */
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_file.c,v 1.28.2.9 2008/03/23 00:53:46 shadow Exp $");
  
  #ifdef AFS_LINUX24_ENV
  #include "h/module.h" /* early to avoid printf->printk mapping */
***************
*** 23,29 ****
  #if defined(AFS_LINUX26_ENV)
  #include "h/namei.h"
  #endif
! 
  
  afs_lock_t afs_xosi;		/* lock is for tvattr */
  extern struct osi_dev cacheDev;
--- 23,31 ----
  #if defined(AFS_LINUX26_ENV)
  #include "h/namei.h"
  #endif
! #if !defined(HAVE_IGET)
! #include "h/exportfs.h"
! #endif
  
  afs_lock_t afs_xosi;		/* lock is for tvattr */
  extern struct osi_dev cacheDev;
***************
*** 41,46 ****
--- 43,51 ----
      struct inode *tip = NULL;
      struct dentry *dp = NULL;
      struct file *filp = NULL;
+ #if !defined(HAVE_IGET)
+     struct fid fid;
+ #endif
      AFS_STATCNT(osi_UFSOpen);
      if (cacheDiskType != AFS_FCACHE_TYPE_UFS) {
  	osi_Panic("UFSOpen called for non-UFS cache\n");
***************
*** 58,71 ****
  		  sizeof(struct osi_file));
      }
      memset(afile, 0, sizeof(struct osi_file));
      tip = iget(afs_cacheSBp, (u_long) ainode);
!     if (!tip)
! 	osi_Panic("Can't get inode %d\n", ainode);
!     tip->i_flags |= MS_NOATIME;	/* Disable updating access times. */
! 
!     dp = d_alloc_anon(tip);
      if (!dp) 
             osi_Panic("Can't get dentry for inode %d\n", ainode);          
  
      filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR);
      if (IS_ERR(filp))
--- 63,79 ----
  		  sizeof(struct osi_file));
      }
      memset(afile, 0, sizeof(struct osi_file));
+ #if defined(HAVE_IGET)
      tip = iget(afs_cacheSBp, (u_long) ainode);
! #else
!     fid.i32.ino = ainode;
!     fid.i32.gen = 0;
!     dp = afs_cacheSBp->s_export_op->fh_to_dentry(afs_cacheSBp, &fid, sizeof(fid), FILEID_INO32_GEN);
      if (!dp) 
             osi_Panic("Can't get dentry for inode %d\n", ainode);          
+     tip = dp->d_inode;
+ #endif
+     tip->i_flags |= MS_NOATIME;	/* Disable updating access times. */
  
      filp = dentry_open(dp, mntget(afs_cacheMnt), O_RDWR);
      if (IS_ERR(filp))
Index: openafs/src/afs/LINUX/osi_groups.c
diff -c openafs/src/afs/LINUX/osi_groups.c:1.28.4.11 openafs/src/afs/LINUX/osi_groups.c:1.28.4.12
*** openafs/src/afs/LINUX/osi_groups.c:1.28.4.11	Wed Jan 30 12:30:41 2008
--- openafs/src/afs/LINUX/osi_groups.c	Mon Mar 10 12:47:18 2008
***************
*** 20,26 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_groups.c,v 1.28.4.11 2008/01/30 17:30:41 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
--- 20,26 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_groups.c,v 1.28.4.12 2008/03/10 16:47:18 shadow Exp $");
  
  #include "afs/sysincludes.h"
  #include "afsincludes.h"
***************
*** 223,233 ****
  }
  
  #ifdef LINUX_KEYRING_SUPPORT
! #ifdef EXPORTS_KEY_TYPE_KEYRING
  static struct key_type *__key_type_keyring = &key_type_keyring;
- #else
- static struct key_type *__key_type_keyring;
- #endif
  
  static int
  install_session_keyring(struct task_struct *task, struct key *keyring)
--- 223,230 ----
  }
  
  #ifdef LINUX_KEYRING_SUPPORT
! extern struct key_type key_type_keyring __attribute__((weak));
  static struct key_type *__key_type_keyring = &key_type_keyring;
  
  static int
  install_session_keyring(struct task_struct *task, struct key *keyring)
***************
*** 627,658 ****
  
  void osi_keyring_init(void)
  {
- #ifndef EXPORTS_KEY_TYPE_KEYRING
      struct task_struct *p;
  #ifdef EXPORTED_TASKLIST_LOCK
!     if (&tasklist_lock)
!       read_lock(&tasklist_lock);
  #endif
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
  #ifdef EXPORTED_TASKLIST_LOCK
!     else
! #endif
!       rcu_read_lock();
! #endif
!     p = find_task_by_pid(1);
!     if (p && p->user->session_keyring)
! 	__key_type_keyring = p->user->session_keyring->type;
! #ifdef EXPORTED_TASKLIST_LOCK
!     if (&tasklist_lock)
!        read_unlock(&tasklist_lock);
  #endif
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
! #ifdef EXPORTED_TASKLIST_LOCK
!     else
! #endif
!       rcu_read_unlock();
! #endif
  #endif
  
      register_key_type(&key_type_afs_pag);
  }
--- 624,656 ----
  
  void osi_keyring_init(void)
  {
      struct task_struct *p;
+     
+     if (__key_type_keyring == NULL) {
  #ifdef EXPORTED_TASKLIST_LOCK
! 	if (&tasklist_lock)
! 	    read_lock(&tasklist_lock);
  #endif
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
+ # ifdef EXPORTED_TASKLIST_LOCK
+  	else
+ # endif
+ 	    rcu_read_lock();
+ #endif
+ 	p = find_task_by_pid(1);
+ 	if (p && p->user->session_keyring)
+ 	    __key_type_keyring = p->user->session_keyring->type;
  #ifdef EXPORTED_TASKLIST_LOCK
! 	if (&tasklist_lock)
! 	    read_unlock(&tasklist_lock);
  #endif
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
! # ifdef EXPORTED_TASKLIST_LOCK
! 	else
! # endif
! 	    rcu_read_unlock();
  #endif
+     }
  
      register_key_type(&key_type_afs_pag);
  }
Index: openafs/src/afs/LINUX/osi_misc.c
diff -c openafs/src/afs/LINUX/osi_misc.c:1.44.4.4 openafs/src/afs/LINUX/osi_misc.c:1.44.4.5
*** openafs/src/afs/LINUX/osi_misc.c:1.44.4.4	Wed Jan 30 12:26:01 2008
--- openafs/src/afs/LINUX/osi_misc.c	Mon Mar 10 14:52:54 2008
***************
*** 15,21 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_misc.c,v 1.44.4.4 2008/01/30 17:26:01 shadow Exp $");
  
  #include <linux/module.h> /* early to avoid printf->printk mapping */
  #include "afs/sysincludes.h"
--- 15,21 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_misc.c,v 1.44.4.5 2008/03/10 18:52:54 shadow Exp $");
  
  #include <linux/module.h> /* early to avoid printf->printk mapping */
  #include "afs/sysincludes.h"
***************
*** 99,108 ****
--- 99,115 ----
  #endif
  
      if (!code) {
+ #if defined(STRUCT_NAMEIDATA_HAS_PATH)
+ 	*dpp = dget(nd.path.dentry);
+         if (mnt)
+ 	    *mnt = mntget(nd.path.mnt);
+ 	path_put(&nd.path);
+ #else
  	*dpp = dget(nd.dentry);
          if (mnt)
             *mnt = mntget(nd.mnt);
  	path_release(&nd);
+ #endif
      }
      return code;
  }
Index: openafs/src/afs/SOLARIS/osi_file.c
diff -c openafs/src/afs/SOLARIS/osi_file.c:1.13.14.2 openafs/src/afs/SOLARIS/osi_file.c:1.13.14.3
*** openafs/src/afs/SOLARIS/osi_file.c:1.13.14.2	Thu Dec 13 14:18:33 2007
--- openafs/src/afs/SOLARIS/osi_file.c	Mon Mar 17 11:28:33 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/SOLARIS/osi_file.c,v 1.13.14.2 2007/12/13 19:18:33 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/SOLARIS/osi_file.c,v 1.13.14.3 2008/03/17 15:28:33 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 86,92 ****
--- 86,96 ----
      struct vattr vattr;
  
      vattr.va_mask = AT_FSID | AT_NODEID;	/* quick return using this mask. */
+ #ifdef AFS_SUN511_ENV
+     code = VOP_GETATTR(vp, &vattr, 0, &afs_osi_cred, NULL);
+ #else
      code = VOP_GETATTR(vp, &vattr, 0, &afs_osi_cred);
+ #endif
      if (code) {
  	osi_Panic("VnodeToIno");
      }
***************
*** 101,107 ****
--- 105,115 ----
  
      vattr.va_mask = AT_FSID | AT_NODEID;	/* quick return using this mask. */
      AFS_GUNLOCK();
+ #ifdef AFS_SUN511_ENV
+     code = VOP_GETATTR(vp, &vattr, 0, &afs_osi_cred, NULL);
+ #else
      code = VOP_GETATTR(vp, &vattr, 0, &afs_osi_cred);
+ #endif
      AFS_GLOCK();
      if (code) {
  	osi_Panic("VnodeToDev");
***************
*** 122,128 ****
--- 130,140 ----
      MObtainWriteLock(&afs_xosi, 578);
      vattr.va_mask = AT_SIZE;
      AFS_GUNLOCK();
+ #ifdef AFS_SUN511_ENV
+     code = VOP_GETATTR(vp, &vattr, 0, &afs_osi_cred, NULL);
+ #else
      code = VOP_GETATTR(vp, &vattr, 0, &afs_osi_cred);
+ #endif
      AFS_GLOCK();
      if (code) {
  	osi_Panic("VnodeToSize");
***************
*** 224,230 ****
--- 236,246 ----
      /* Ufs doesn't seem to care about the flags so we pass 0 for now */
      tvattr.va_mask = AT_ALL;
      AFS_GUNLOCK();
+ #ifdef AFS_SUN511_ENV 
+     code = VOP_GETATTR(afile->vnode, &tvattr, 0, &afs_osi_cred, NULL);
+ #else
      code = VOP_GETATTR(afile->vnode, &tvattr, 0, &afs_osi_cred);
+ #endif
      AFS_GLOCK();
      if (code == 0) {
  	astat->size = tvattr.va_size;
Index: openafs/src/afs/SOLARIS/osi_vfsops.c
diff -c openafs/src/afs/SOLARIS/osi_vfsops.c:1.18.14.5 openafs/src/afs/SOLARIS/osi_vfsops.c:1.18.14.6
*** openafs/src/afs/SOLARIS/osi_vfsops.c:1.18.14.5	Mon Jan 21 12:37:30 2008
--- openafs/src/afs/SOLARIS/osi_vfsops.c	Mon Mar 17 11:28:33 2008
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/SOLARIS/osi_vfsops.c,v 1.18.14.5 2008/01/21 17:37:30 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 14,20 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/SOLARIS/osi_vfsops.c,v 1.18.14.6 2008/03/17 15:28:33 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 417,428 ****
--- 417,438 ----
  }
  
  #ifdef AFS_SUN510_ENV
+ #ifdef AFS_SUN511_ENV
+ static struct vfsdef_v4 afs_vfsdef = {
+     VFSDEF_VERSION,
+     "afs",
+     afsinit,
+     0,
+     NULL
+ };
+ #else
  static struct vfsdef_v3 afs_vfsdef = {
      VFSDEF_VERSION,
      "afs",
      afsinit,
      0
  };
+ #endif
  #else
  static struct vfssw afs_vfw = {
      "afs",
Index: openafs/src/afs/SOLARIS/osi_vnodeops.c
diff -c openafs/src/afs/SOLARIS/osi_vnodeops.c:1.28.2.3 openafs/src/afs/SOLARIS/osi_vnodeops.c:1.28.2.4
*** openafs/src/afs/SOLARIS/osi_vnodeops.c:1.28.2.3	Thu Nov  1 12:57:37 2007
--- openafs/src/afs/SOLARIS/osi_vnodeops.c	Mon Mar 17 11:28:33 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/SOLARIS/osi_vnodeops.c,v 1.28.2.3 2007/11/01 16:57:37 shadow Exp $");
  
  /*
   * SOLARIS/osi_vnodeops.c
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/SOLARIS/osi_vnodeops.c,v 1.28.2.4 2008/03/17 15:28:33 shadow Exp $");
  
  /*
   * SOLARIS/osi_vnodeops.c
***************
*** 1404,1409 ****
--- 1404,1428 ----
  }
  
  #ifdef	AFS_SUN54_ENV
+ #ifdef	AFS_SUN511_ENV
+ extern void
+ afs_dispose(struct vnode *vp, struct page *p, int fl, int dn, struct cred *cr, struct caller_context_t *ct)
+ {
+     fs_dispose(vp, p, fl, dn, cr,ct);
+ }
+ 
+ int
+ afs_setsecattr(struct vnode *vp, vsecattr_t *vsecattr, int flag, struct cred *creds, struct caller_context_t *ct)
+ {
+     return ENOSYS;
+ }
+ 
+ int
+ afs_getsecattr(struct vnode *vp, vsecattr_t *vsecattr, int flag, struct cred *creds, struct caller_context_t *ct)
+ {
+   return fs_fab_acl(vp, vsecattr, flag, creds,ct);
+ }
+ #else
  extern void
  afs_dispose(vp, p, fl, dn, cr)
       struct vnode *vp;
***************
*** 1434,1439 ****
--- 1453,1459 ----
      return fs_fab_acl(vp, vsecattr, flag, creds);
  }
  #endif
+ #endif
  
  #ifdef	AFS_GLOBAL_SUNLOCK
  extern int gafs_open(), gafs_close(), afs_ioctl(), gafs_access();
Index: openafs/src/afs/VNOPS/afs_vnop_access.c
diff -c openafs/src/afs/VNOPS/afs_vnop_access.c:1.11.8.3 openafs/src/afs/VNOPS/afs_vnop_access.c:1.11.8.4
*** openafs/src/afs/VNOPS/afs_vnop_access.c:1.11.8.3	Mon Jul 31 17:27:40 2006
--- openafs/src/afs/VNOPS/afs_vnop_access.c	Fri Mar  7 12:31:28 2008
***************
*** 23,29 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_access.c,v 1.11.8.3 2006/07/31 21:27:40 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 23,29 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_access.c,v 1.11.8.4 2008/03/07 17:31:28 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 209,215 ****
      if ((code = afs_InitReq(&treq, acred)))
  	return code;
  
!     code = afs_EvalFakeStat(&avc, &fakestate, &treq);
      if (code) {
  	afs_PutFakeStat(&fakestate);
  	return code;
--- 209,224 ----
      if ((code = afs_InitReq(&treq, acred)))
  	return code;
  
!     if (afs_fakestat_enable && avc->mvstat == 1) {
! 	code = afs_TryEvalFakeStat(&avc, &fakestate, &treq);
!         if (code == 0 && avc->mvstat == 1) {
! 	    afs_PutFakeStat(&fakestate);
! 	    return 0;
!         }
!     } else {
! 	code = afs_EvalFakeStat(&avc, &fakestate, &treq);
!     }
! 
      if (code) {
  	afs_PutFakeStat(&fakestate);
  	return code;
Index: openafs/src/afs/VNOPS/afs_vnop_lookup.c
diff -c openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.72.2.4 openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.72.2.5
*** openafs/src/afs/VNOPS/afs_vnop_lookup.c:1.72.2.4	Sun Feb 10 23:00:49 2008
--- openafs/src/afs/VNOPS/afs_vnop_lookup.c	Fri Mar  7 12:31:28 2008
***************
*** 18,24 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v 1.72.2.4 2008/02/11 04:00:49 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
--- 18,24 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/VNOPS/afs_vnop_lookup.c,v 1.72.2.5 2008/03/07 17:31:28 shadow Exp $");
  
  #include "afs/sysincludes.h"	/* Standard vendor system headers */
  #include "afsincludes.h"	/* Afs-based standard headers */
***************
*** 1228,1233 ****
--- 1228,1238 ----
      ndp->ni_dvp = AFSTOV(adp);
  #endif /* AFS_OSF_ENV */
  
+     if (afs_fakestat_enable && adp->mvstat == 1) {
+        if (strcmp(aname, ".directory") == 0)
+            tryEvalOnly = 1;
+     }
+ 
  #if defined(AFS_DARWIN_ENV)
      /* Workaround for MacOSX Finder, which tries to look for
       * .DS_Store and Contents under every directory.
Index: openafs/src/auth/userok.c
diff -c openafs/src/auth/userok.c:1.14.4.2 openafs/src/auth/userok.c:1.14.4.3
*** openafs/src/auth/userok.c:1.14.4.2	Thu Nov  1 12:09:32 2007
--- openafs/src/auth/userok.c	Fri Feb 29 10:13:06 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/userok.c,v 1.14.4.2 2007/11/01 16:09:32 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/pthread_glock.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/auth/userok.c,v 1.14.4.3 2008/02/29 15:13:06 shadow Exp $");
  
  #include <afs/stds.h>
  #include <afs/pthread_glock.h>
***************
*** 51,59 ****
  afsconf_CheckAuth(register struct afsconf_dir *adir, 
  		  register struct rx_call *acall)
  {
      LOCK_GLOBAL_MUTEX;
!     return ((afsconf_SuperUser(adir, acall, NULL) == 0) ? 10029 : 0);
      UNLOCK_GLOBAL_MUTEX;
  }
  #endif /* !defined(UKERNEL) */
  
--- 51,61 ----
  afsconf_CheckAuth(register struct afsconf_dir *adir, 
  		  register struct rx_call *acall)
  {
+     int rc;
      LOCK_GLOBAL_MUTEX;
!     rc = ((afsconf_SuperUser(adir, acall, NULL) == 0) ? 10029 : 0);
      UNLOCK_GLOBAL_MUTEX;
+     return rc;
  }
  #endif /* !defined(UKERNEL) */
  
Index: openafs/src/bozo/bnode.c
diff -c openafs/src/bozo/bnode.c:1.19.2.5 openafs/src/bozo/bnode.c:1.19.2.6
*** openafs/src/bozo/bnode.c:1.19.2.5	Wed Oct 31 00:21:14 2007
--- openafs/src/bozo/bnode.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bnode.c,v 1.19.2.5 2007/10/31 04:21:14 shadow Exp $");
  
  #include <stddef.h>
  #include <stdlib.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bnode.c,v 1.19.2.6 2008/03/10 22:32:32 shadow Exp $");
  
  #include <stddef.h>
  #include <stdlib.h>
***************
*** 491,498 ****
  }
  
  /* bnode lwp executes this code repeatedly */
! static int
! bproc()
  {
      register afs_int32 code;
      register struct bnode *tb;
--- 491,498 ----
  }
  
  /* bnode lwp executes this code repeatedly */
! static void *
! bproc(void *unused)
  {
      register afs_int32 code;
      register struct bnode *tb;
***************
*** 641,646 ****
--- 641,647 ----
  	    }
  	}
      }
+     return NULL;
  }
  
  static afs_int32
***************
*** 763,771 ****
  
  /* Called by IOMGR at low priority on IOMGR's stack shortly after a SIGCHLD
   * occurs.  Wakes up bproc do redo things */
! int
! bnode_SoftInt(int asignal)
  {
      IOMGR_Cancel(bproc_pid);
      return 0;
  }
--- 764,774 ----
  
  /* Called by IOMGR at low priority on IOMGR's stack shortly after a SIGCHLD
   * occurs.  Wakes up bproc do redo things */
! void *
! bnode_SoftInt(void *param)
  {
+     /* int asignal = (int) param; */
+ 
      IOMGR_Cancel(bproc_pid);
      return 0;
  }
***************
*** 776,787 ****
  void
  bnode_Int(int asignal)
  {
-     extern void bozo_ShutdownAndExit();
- 
      if (asignal == SIGQUIT) {
! 	IOMGR_SoftSig(bozo_ShutdownAndExit, (char *)asignal);
      } else {
! 	IOMGR_SoftSig(bnode_SoftInt, (char *)asignal);
      }
  }
  
--- 779,788 ----
  void
  bnode_Int(int asignal)
  {
      if (asignal == SIGQUIT) {
! 	IOMGR_SoftSig(bozo_ShutdownAndExit, (void *) asignal);
      } else {
! 	IOMGR_SoftSig(bnode_SoftInt, (void *) asignal);
      }
  }
  
Index: openafs/src/bozo/bosoprocs.c
diff -c openafs/src/bozo/bosoprocs.c:1.19.14.3 openafs/src/bozo/bosoprocs.c:1.19.14.4
*** openafs/src/bozo/bosoprocs.c:1.19.14.3	Wed Oct 31 00:21:14 2007
--- openafs/src/bozo/bosoprocs.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bosoprocs.c,v 1.19.14.3 2007/10/31 04:21:14 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bosoprocs.c,v 1.19.14.4 2008/03/10 22:32:32 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 1655,1663 ****
  }
  #endif
  
! void
! bozo_ShutdownAndExit(int asignal)
  {
      int code;
  
      bozo_Log
--- 1655,1664 ----
  }
  #endif
  
! void *
! bozo_ShutdownAndExit(void *param)
  {
+     int asignal = (int) param;
      int code;
  
      bozo_Log
Index: openafs/src/bozo/bosprototypes.h
diff -c openafs/src/bozo/bosprototypes.h:1.1.2.2 openafs/src/bozo/bosprototypes.h:1.1.2.3
*** openafs/src/bozo/bosprototypes.h:1.1.2.2	Wed Oct 31 00:21:14 2007
--- openafs/src/bozo/bosprototypes.h	Mon Mar 10 18:32:32 2008
***************
*** 13,16 ****
--- 13,19 ----
  /* bosserver.c */
  void bozo_Log(char *format, ... );
  
+ /* bosoprocs.c */
+ void *bozo_ShutdownAndExit(void *arock /* really int asignal */);
+ 
  #endif
Index: openafs/src/bozo/bosserver.c
diff -c openafs/src/bozo/bosserver.c:1.32.2.9 openafs/src/bozo/bosserver.c:1.32.2.10
*** openafs/src/bozo/bosserver.c:1.32.2.9	Sun Feb  3 22:51:41 2008
--- openafs/src/bozo/bosserver.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bosserver.c,v 1.32.2.9 2008/02/04 03:51:41 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bozo/bosserver.c,v 1.32.2.10 2008/03/10 22:32:32 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 514,521 ****
  
  #define	BOZO_MINSKIP 3600	/* minimum to advance clock */
  /* lwp to handle system restarts */
! static int
! BozoDaemon()
  {
      register afs_int32 now;
  
--- 514,521 ----
  
  #define	BOZO_MINSKIP 3600	/* minimum to advance clock */
  /* lwp to handle system restarts */
! static void *
! BozoDaemon(void *unused)
  {
      register afs_int32 now;
  
***************
*** 550,555 ****
--- 550,556 ----
  	    bnode_ApplyInstance(bdrestart, 0);
  	}
      }
+     return NULL;
  }
  
  #ifdef AFS_AIX32_ENV
Index: openafs/src/bucoord/bc_status.c
diff -c openafs/src/bucoord/bc_status.c:1.11.14.2 openafs/src/bucoord/bc_status.c:1.11.14.3
*** openafs/src/bucoord/bc_status.c:1.11.14.2	Tue Apr 10 14:39:50 2007
--- openafs/src/bucoord/bc_status.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/stds.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/bc_status.c,v 1.11.14.2 2007/04/10 18:39:50 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/stds.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/bc_status.c,v 1.11.14.3 2008/03/10 22:32:32 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 104,111 ****
  
  char *cmdLine;
  
! int
! cmdDispatch()
  {
  #define	MAXV	100
      char **targv[MAXV];		/*Ptr to parsed argv stuff */
--- 104,111 ----
  
  char *cmdLine;
  
! void *
! cmdDispatch(void *unused)
  {
  #define	MAXV	100
      char **targv[MAXV];		/*Ptr to parsed argv stuff */
***************
*** 119,125 ****
      code = cmd_ParseLine(internalCmdLine, targv, &targc, MAXV);
      if (code) {
  	printf("Couldn't parse line: '%s'", afs_error_message(code));
! 	return (1);
      }
      free(internalCmdLine);
  
--- 119,125 ----
      code = cmd_ParseLine(internalCmdLine, targv, &targc, MAXV);
      if (code) {
  	printf("Couldn't parse line: '%s'", afs_error_message(code));
! 	return (void *)(1);
      }
      free(internalCmdLine);
  
***************
*** 129,138 ****
       */
      doDispatch(targc, targv, 1);
      cmd_FreeArgv(targv);
!     return(0);
  }
  
! statusWatcher()
  {
      struct rx_connection *tconn = (struct rc_connection *)0;
      statusP curPollPtr = 0;
--- 129,139 ----
       */
      doDispatch(targc, targv, 1);
      cmd_FreeArgv(targv);
!     return(void *)(0);
  }
  
! void *
! statusWatcher(void *unused)
  {
      struct rx_connection *tconn = (struct rc_connection *)0;
      statusP curPollPtr = 0;
***************
*** 394,399 ****
--- 395,401 ----
  	    curPollPtr = 0;
  	}			/*done */
      }				/*w */
+     return NULL;
  }
  
  /* bc_jobNumber
Index: openafs/src/bucoord/bucoord_prototypes.h
diff -c /dev/null openafs/src/bucoord/bucoord_prototypes.h:1.1.2.2
*** /dev/null	Sat Mar 22 21:01:54 2008
--- openafs/src/bucoord/bucoord_prototypes.h	Tue Mar 11 10:06:10 2008
***************
*** 0 ****
--- 1,17 ----
+ /* Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  */
+ 
+ #ifndef _BUCOORD_PROTOTYPES_H
+ #define _BUCOORD_PROTOTYPES_H
+ 
+ /* bc_status.c */
+ 
+ extern void *statusWatcher(void *);
+ 
+ #endif
+ 
Index: openafs/src/bucoord/dump.c
diff -c openafs/src/bucoord/dump.c:1.13.6.3 openafs/src/bucoord/dump.c:1.13.6.4
*** openafs/src/bucoord/dump.c:1.13.6.3	Mon Nov 26 16:08:41 2007
--- openafs/src/bucoord/dump.c	Mon Mar 10 18:32:32 2008
***************
*** 15,21 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/dump.c,v 1.13.6.3 2007/11/26 21:08:41 shadow Exp $");
  
  #include <sys/types.h>
  #include <afs/cmd.h>
--- 15,21 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/dump.c,v 1.13.6.4 2008/03/10 22:32:32 shadow Exp $");
  
  #include <sys/types.h>
  #include <afs/cmd.h>
***************
*** 199,207 ****
   *     The other half of the dump/restore create process call. In bc_StartDmpRst, 
   *     we allocated a dumpTask entry. Here we do the task and then free the entry.
   */
! bc_DmpRstStart(aindex)
!      afs_int32 aindex;
  {
      register struct bc_dumpTask *tdump;
      register afs_int32 code;
  
--- 199,208 ----
   *     The other half of the dump/restore create process call. In bc_StartDmpRst, 
   *     we allocated a dumpTask entry. Here we do the task and then free the entry.
   */
! void *
! bc_DmpRstStart(void *param)
  {
+     afs_int32 aindex = (afs_int32) param;
      register struct bc_dumpTask *tdump;
      register afs_int32 code;
  
Index: openafs/src/bucoord/main.c
diff -c openafs/src/bucoord/main.c:1.16.14.4 openafs/src/bucoord/main.c:1.16.14.5
*** openafs/src/bucoord/main.c:1.16.14.4	Wed Oct 31 00:09:24 2007
--- openafs/src/bucoord/main.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/main.c,v 1.16.14.4 2007/10/31 04:09:24 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/bucoord/main.c,v 1.16.14.5 2008/03/10 22:32:32 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 45,51 ****
  #include <afs/budb.h>
  
  #include "bc.h"			/*Backup Coordinator structs and defs */
! 
  
  int localauth, interact;
  char tcell[64];
--- 45,51 ----
  #include <afs/budb.h>
  
  #include "bc.h"			/*Backup Coordinator structs and defs */
! #include "bucoord_prototypes.h"
  
  int localauth, interact;
  char tcell[64];
***************
*** 244,251 ****
      PROCESS watcherPid;
      PROCESS pid;		/* LWP process ID */
  
-     extern statusWatcher();
- 
      /* Initialization */
      initialize_CMD_error_table();
  
--- 244,249 ----
Index: openafs/src/budb/dbs_dump.c
diff -c openafs/src/budb/dbs_dump.c:1.11.14.1 openafs/src/budb/dbs_dump.c:1.11.14.2
*** openafs/src/budb/dbs_dump.c:1.11.14.1	Thu Feb  8 20:00:19 2007
--- openafs/src/budb/dbs_dump.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/budb/dbs_dump.c,v 1.11.14.1 2007/02/09 01:00:19 shadow Exp $");
  
  #ifdef AFS_NT40_ENV
  #include <winsock2.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/budb/dbs_dump.c,v 1.11.14.2 2008/03/10 22:32:32 shadow Exp $");
  
  #ifdef AFS_NT40_ENV
  #include <winsock2.h>
***************
*** 44,49 ****
--- 44,50 ----
  #include "globals.h"
  #include "afs/audit.h"
  
+ void *dumpWatcher(void *);
  
  /* dump ubik database - interface routines */
  
***************
*** 63,71 ****
   *	decode the arguments passed via LWP and dump the database.
   */
  
! setupDbDump(writeFid)
!      int writeFid;
  {
      afs_int32 code = 0;
  
      code = InitRPC(&dumpSyncPtr->ut, LOCKREAD, 1);
--- 64,73 ----
   *	decode the arguments passed via LWP and dump the database.
   */
  
! void *
! setupDbDump(void *param)
  {
+     int writeFid = (int)param;
      afs_int32 code = 0;
  
      code = InitRPC(&dumpSyncPtr->ut, LOCKREAD, 1);
***************
*** 85,91 ****
    error_exit:
      if (dumpSyncPtr->ut)
  	ubik_EndTrans(dumpSyncPtr->ut);
!     return (code);
  }
  
  
--- 87,93 ----
    error_exit:
      if (dumpSyncPtr->ut)
  	ubik_EndTrans(dumpSyncPtr->ut);
!     return (void *)(code);
  }
  
  
***************
*** 116,122 ****
      PROCESS dumperPid, watcherPid;
      int readSize;
      afs_int32 code = 0;
-     extern dumpWatcher();
  
      if (callPermitted(call) == 0)
  	ERROR(BUDB_NOTPERMITTED);
--- 118,123 ----
***************
*** 288,294 ****
   *	transactions can proceed.
   */
  
! dumpWatcher()
  {
      afs_int32 code;
  
--- 289,296 ----
   *	transactions can proceed.
   */
  
! void *
! dumpWatcher(void *unused)
  {
      afs_int32 code;
  
Index: openafs/src/budb/server.c
diff -c openafs/src/budb/server.c:1.16.2.7 openafs/src/budb/server.c:1.16.2.8
*** openafs/src/budb/server.c:1.16.2.7	Mon Nov 26 16:08:41 2007
--- openafs/src/budb/server.c	Mon Mar 10 18:32:32 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/budb/server.c,v 1.16.2.7 2007/11/26 21:08:41 shadow Exp $");
  
  #include <fcntl.h>
  #include <sys/stat.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/budb/server.c,v 1.16.2.8 2008/03/10 22:32:32 shadow Exp $");
  
  #include <fcntl.h>
  #include <sys/stat.h>
***************
*** 584,590 ****
      currentTime = time(0);
      LogError(0, "Ready to process requests at %s\n", ctime(&currentTime));
  
!     rx_ServerProc();		/* donate this LWP */
  
    error_exit:
      osi_audit(BUDB_FinishEvent, code, AUD_END);
--- 584,590 ----
      currentTime = time(0);
      LogError(0, "Ready to process requests at %s\n", ctime(&currentTime));
  
!     rx_ServerProc(NULL);		/* donate this LWP */
  
    error_exit:
      osi_audit(BUDB_FinishEvent, code, AUD_END);
Index: openafs/src/butc/butc_prototypes.h
diff -c /dev/null openafs/src/butc/butc_prototypes.h:1.1.2.2
*** /dev/null	Sat Mar 22 21:01:55 2008
--- openafs/src/butc/butc_prototypes.h	Tue Mar 11 10:06:08 2008
***************
*** 0 ****
--- 1,36 ----
+ /* Copyright 2000, International Business Machines Corporation and others.
+  * All Rights Reserved.
+  * 
+  * This software has been released under the terms of the IBM Public
+  * License.  For details, see the LICENSE file in the top-level source
+  * directory or online at http://www.openafs.org/dl/license10.html
+  */
+ 
+ #ifndef _BUTC_PROTOTYPES_H
+ #define _BUTC_PROTOTYPES_H
+ 
+ /* dbentries.c */
+ 
+ extern void *dbWatcher(void *);
+ 
+ /* dump.c */
+ 
+ extern void *Dumper(void *);
+ extern void *DeleteDump(void *);
+ 
+ /* lwps.c */
+ extern void *Restorer(void *);
+ extern void *Labeller(void *);
+ 
+ /* recoverdDb.c */
+ 
+ extern void *ScanDumps(void *);
+ 
+ /* tcudbprocs.c */
+ 
+ extern void *saveDbToTape(void *);
+ extern void *restoreDbFromTape(void *);
+ extern void *KeepAlive(void *);
+ 
+ #endif
+ 
Index: openafs/src/butc/dbentries.c
diff -c openafs/src/butc/dbentries.c:1.8.14.4 openafs/src/butc/dbentries.c:1.8.14.5
*** openafs/src/butc/dbentries.c:1.8.14.4	Tue Dec 11 11:27:06 2007
--- openafs/src/butc/dbentries.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/dbentries.c,v 1.8.14.4 2007/12/11 16:27:06 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/dbentries.c,v 1.8.14.5 2008/03/10 22:32:33 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 316,323 ****
  #define MAXVOLUMESTOADD 100
  int addvolumes = 1;
  
! void
! dbWatcher()
  {
      dlqlinkP entryPtr;
      struct budb_dumpEntry *dumpPtr;
--- 316,323 ----
  #define MAXVOLUMESTOADD 100
  int addvolumes = 1;
  
! void *
! dbWatcher(void *unused)
  {
      dlqlinkP entryPtr;
      struct budb_dumpEntry *dumpPtr;
***************
*** 485,488 ****
--- 485,489 ----
  	IOMGR_Sleep(2);
  #endif
      }
+     return NULL;
  }
Index: openafs/src/butc/dump.c
diff -c openafs/src/butc/dump.c:1.18.6.1 openafs/src/butc/dump.c:1.18.6.2
*** openafs/src/butc/dump.c:1.18.6.1	Tue Oct 30 11:16:38 2007
--- openafs/src/butc/dump.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/dump.c,v 1.18.6.1 2007/10/30 15:16:38 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/dump.c,v 1.18.6.2 2008/03/10 22:32:33 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 1117,1125 ****
      return (code);
  }
  
! int
! Dumper(struct dumpNode *nodePtr)
  {
      struct dumpRock dparams;
      struct butm_tapeInfo tapeInfo;
      int pass;
--- 1117,1126 ----
      return (code);
  }
  
! void *
! Dumper(void *param)
  {
+     struct dumpNode *nodePtr = (struct dumpNode *)param;
      struct dumpRock dparams;
      struct butm_tapeInfo tapeInfo;
      int pass;
***************
*** 1369,1375 ****
  
      FreeNode(taskId);		/* free the dump node */
      LeaveDeviceQueue(deviceLatch);
!     return (code);
  }
  
  #define BELLTIME 60		/* 60 seconds before a bell rings */
--- 1370,1376 ----
  
      FreeNode(taskId);		/* free the dump node */
      LeaveDeviceQueue(deviceLatch);
!     return (void *)(code);
  }
  
  #define BELLTIME 60		/* 60 seconds before a bell rings */
***************
*** 2030,2038 ****
  /* DeleteDump
   *
   */
! int
! DeleteDump(struct deleteDumpIf *ptr)
  {
      afs_int32 taskId;
      afs_int32 rc, code = 0;
      afs_uint32 dumpid;
--- 2031,2041 ----
  /* DeleteDump
   *
   */
! void *
! DeleteDump(void *param)
  {
+     struct deleteDumpIf *ptr = (struct deleteDumpIf *)param;
+ 
      afs_int32 taskId;
      afs_int32 rc, code = 0;
      afs_uint32 dumpid;
Index: openafs/src/butc/lwps.c
diff -c openafs/src/butc/lwps.c:1.14.4.3 openafs/src/butc/lwps.c:1.14.4.4
*** openafs/src/butc/lwps.c:1.14.4.3	Mon Nov 26 16:08:41 2007
--- openafs/src/butc/lwps.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/lwps.c,v 1.14.4.3 2007/11/26 21:08:41 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/lwps.c,v 1.14.4.4 2008/03/10 22:32:33 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
***************
*** 1743,1751 ****
   *	created as a LWP by the server stub, <newNode> is a pointer to all
   *	the parameters Restorer needs
   */
! Restorer(newNode)
!      struct dumpNode *newNode;
! {
      afs_int32 code = 0, tcode;
      afs_uint32 taskId;
      char *newVolName;
--- 1743,1752 ----
   *	created as a LWP by the server stub, <newNode> is a pointer to all
   *	the parameters Restorer needs
   */
! void *
! Restorer(void *param) {
!     struct dumpNode *newNode = (struct dumpNode *) param;
! 
      afs_int32 code = 0, tcode;
      afs_uint32 taskId;
      char *newVolName;
***************
*** 2226,2234 ****
   *	specified by <label>
   */
  
! Labeller(labelIfPtr)
!      struct labelTapeIf *labelIfPtr;
  {
      struct tc_tapeLabel *label = &labelIfPtr->label;
  
      struct butm_tapeLabel newTapeLabel;
--- 2227,2237 ----
   *	specified by <label>
   */
  
! void *
! Labeller(void *param)
  {
+     struct labelTapeIf *labelIfPtr = (struct labelTapeIf *)param;
+ 
      struct tc_tapeLabel *label = &labelIfPtr->label;
  
      struct butm_tapeLabel newTapeLabel;
Index: openafs/src/butc/recoverDb.c
diff -c openafs/src/butc/recoverDb.c:1.13.4.3 openafs/src/butc/recoverDb.c:1.13.4.4
*** openafs/src/butc/recoverDb.c:1.13.4.3	Mon Nov 26 16:08:41 2007
--- openafs/src/butc/recoverDb.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/recoverDb.c,v 1.13.4.3 2007/11/26 21:08:41 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/recoverDb.c,v 1.13.4.4 2008/03/10 22:32:33 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
***************
*** 692,700 ****
   *	
   */
  
! int
! ScanDumps(struct scanTapeIf *ptr)
  {
      struct butm_tapeInfo curTapeInfo;
      struct tapeScanInfo tapeScanInfo;
      afs_uint32 taskId;
--- 692,702 ----
   *	
   */
  
! void *
! ScanDumps(void *param)
  {
+     struct scanTapeIf *ptr = (struct scanTapeIf *)param;
+     
      struct butm_tapeInfo curTapeInfo;
      struct tapeScanInfo tapeScanInfo;
      afs_uint32 taskId;
***************
*** 751,757 ****
      free(ptr);
      setStatus(taskId, TASK_DONE);
      LeaveDeviceQueue(deviceLatch);
!     return (code);
  }
  
  
--- 753,759 ----
      free(ptr);
      setStatus(taskId, TASK_DONE);
      LeaveDeviceQueue(deviceLatch);
!     return (void *)(code);
  }
  
  
Index: openafs/src/butc/tcmain.c
diff -c openafs/src/butc/tcmain.c:1.16.8.6 openafs/src/butc/tcmain.c:1.16.8.7
*** openafs/src/butc/tcmain.c:1.16.8.6	Wed Oct 31 00:09:25 2007
--- openafs/src/butc/tcmain.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcmain.c,v 1.16.8.6 2007/10/31 04:09:25 shadow Exp $");
  
  #include <sys/types.h>
  #include <sys/stat.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcmain.c,v 1.16.8.7 2008/03/10 22:32:33 shadow Exp $");
  
  #include <sys/types.h>
  #include <sys/stat.h>
***************
*** 56,61 ****
--- 56,62 ----
  #include "afs/butx.h"
  #define XBSA_TCMAIN
  #include "butc_xbsa.h"
+ #include "butc_prototypes.h"
  
  #define N_SECURITY_OBJECTS 3
  #define ERRCODE_RANGE 8		/* from error_table.h */
***************
*** 66,72 ****
  
  struct ubik_client *cstruct;
  extern void TC_ExecuteRequest();
- extern int dbWatcher();
  FILE *logIO, *ErrorlogIO, *centralLogIO, *lastLogIO;
  char lFile[AFSDIR_PATH_MAX];
  char logFile[256];
--- 67,72 ----
Index: openafs/src/butc/tcprocs.c
diff -c openafs/src/butc/tcprocs.c:1.14.6.4 openafs/src/butc/tcprocs.c:1.14.6.5
*** openafs/src/butc/tcprocs.c:1.14.6.4	Mon Nov 26 16:08:41 2007
--- openafs/src/butc/tcprocs.c	Mon Mar 10 18:32:33 2008
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcprocs.c,v 1.14.6.4 2007/11/26 21:08:41 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcprocs.c,v 1.14.6.5 2008/03/10 22:32:33 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
***************
*** 41,47 ****
  #include <afs/tcdata.h>
  #include "error_macros.h"
  #include "butc_xbsa.h"
! 
  static CopyDumpDesc();
  static CopyRestoreDesc();
  static CopyTapeSetDesc();
--- 41,48 ----
  #include <afs/tcdata.h>
  #include "error_macros.h"
  #include "butc_xbsa.h"
! #include "butc_prototypes.h"
!     
  static CopyDumpDesc();
  static CopyRestoreDesc();
  static CopyTapeSetDesc();
***************
*** 147,153 ****
      statusP statusPtr = NULL;
      afs_int32 code;
  
-     extern int Labeller();
      extern statusP createStatusNode();
      extern afs_int32 allocTaskId();
  
--- 148,153 ----
***************
*** 228,234 ****
      afs_int32 code = 0;
  
      extern statusP createStatusNode();
-     extern Dumper();
  
      if (callPermitted(rxCallId) == 0)
  	return (TC_NOTPERMITTED);
--- 228,233 ----
***************
*** 326,332 ****
      PROCESS pid;
  #endif
  
-     extern int Restorer();
      extern statusP createStatusNode();
  
      if (callPermitted(acid) == 0)
--- 325,330 ----
***************
*** 425,431 ****
      statusP statusPtr;
      afs_int32 code = 0;
  
-     extern afs_int32 restoreDbFromTape();
      extern statusP createStatusNode();
      extern afs_int32 allocTaskId();
  
--- 423,428 ----
***************
*** 496,502 ****
      afs_int32 code = 0;
      struct saveDbIf *ptr;
  
-     extern afs_int32 saveDbToTape();
      extern statusP createStatusNode();
      extern afs_int32 allocTaskId();
  
--- 493,498 ----
***************
*** 579,585 ****
      statusP statusPtr;
      afs_int32 code = 0;
  
-     extern afs_int32 ScanDumps();
      extern afs_int32 allocTaskId();
      extern statusP createStatusNode();
  
--- 575,580 ----
***************
*** 671,677 ****
      PROCESS pid;
  #endif
  #endif
-     extern afs_int32 DeleteDump();
      extern statusP createStatusNode();
      extern afs_int32 allocTaskId();
  
--- 666,671 ----
Index: openafs/src/butc/tcudbprocs.c
diff -c openafs/src/butc/tcudbprocs.c:1.15.6.4 openafs/src/butc/tcudbprocs.c:1.15.6.5
*** openafs/src/butc/tcudbprocs.c:1.15.6.4	Mon Nov 26 16:08:41 2007
--- openafs/src/butc/tcudbprocs.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcudbprocs.c,v 1.15.6.4 2007/11/26 21:08:41 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/butc/tcudbprocs.c,v 1.15.6.5 2008/03/10 22:32:33 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 56,61 ****
--- 56,62 ----
  static writeDbDump();
  static restoreDbEntries();
  
+ void * KeepAlive(void *);
  /* CreateDBDump
   *      create a dump entry for a saved database 
   */
***************
*** 413,420 ****
      extern struct tapeConfig globalTapeConfig;
      extern struct udbHandleS udbHandle;
  
-     extern int KeepAlive();
- 
      blockSize = BUTM_BLKSIZE;
      writeBlock = (char *)malloc(BUTM_BLOCKSIZE);
      if (!writeBlock)
--- 414,419 ----
***************
*** 624,633 ****
   *	dump backup database to tape
   */
  
! afs_int32
! saveDbToTape(saveDbIfPtr)
!      struct saveDbIf *saveDbIfPtr;
  {
      afs_int32 code = 0;
      afs_int32 i;
      int wroteLabel;
--- 623,632 ----
   *	dump backup database to tape
   */
  
! void *
! saveDbToTape(void *param)
  {
+     struct saveDbIf *saveDbIfPtr = (struct saveDbIf *)param;
      afs_int32 code = 0;
      afs_int32 i;
      int wroteLabel;
***************
*** 1018,1027 ****
   *	restore the backup database from tape.
   */
  
! afs_int32
! restoreDbFromTape(taskId)
!      afs_uint32 taskId;
  {
      afs_int32 code = 0;
      afs_int32 i;
      struct butm_tapeInfo tapeInfo;
--- 1017,1026 ----
   *	restore the backup database from tape.
   */
  
! void *
! restoreDbFromTape(void *param)
  {
+     afs_uint32 taskId = (void *)param;
      afs_int32 code = 0;
      afs_int32 i;
      struct butm_tapeInfo tapeInfo;
***************
*** 1107,1113 ****
      LeaveDeviceQueue(deviceLatch);
      setStatus(taskId, TASK_DONE);
  
!     return (code);
  }
  
  /* KeepAlive
--- 1106,1112 ----
      LeaveDeviceQueue(deviceLatch);
      setStatus(taskId, TASK_DONE);
  
!     return (void *)(code);
  }
  
  /* KeepAlive
***************
*** 1119,1126 ****
   *      
   *      Use the same udbHandle as writeDbDump so we go to the same server.
   */
! int
! KeepAlive()
  {
      charListT charList;
      afs_int32 code;
--- 1118,1125 ----
   *      
   *      Use the same udbHandle as writeDbDump so we go to the same server.
   */
! void *
! KeepAlive(void *unused)
  {
      charListT charList;
      afs_int32 code;
Index: openafs/src/cf/linux-test4.m4
diff -c openafs/src/cf/linux-test4.m4:1.29.2.36 openafs/src/cf/linux-test4.m4:1.29.2.38
*** openafs/src/cf/linux-test4.m4:1.29.2.36	Wed Jan 30 12:30:41 2008
--- openafs/src/cf/linux-test4.m4	Mon Mar 10 14:52:54 2008
***************
*** 767,796 ****
      AC_DEFINE([LINUX_KEYRING_SUPPORT], 1, [define if your kernel has keyring support])
    fi])
  
- 
- AC_DEFUN([LINUX_EXPORTS_KEY_TYPE_KEYRING], [
-   AC_MSG_CHECKING([for exported key_type_keyring])
-   AC_CACHE_VAL([ac_cv_linux_exports_key_type_keyring], [
-     AC_TRY_KBUILD(
- [
- #include <linux/kernel.h>
- #include <linux/rwsem.h>
- #ifdef KEY_TYPE_H_EXISTS
- #include <linux/key-type.h>
- #endif
- #include <linux/key.h>
- ],
- [
- printk("%x\n", key_type_keyring);
- ],
-       ac_cv_linux_exports_key_type_keyring=yes,
-       ac_cv_linux_exports_key_type_keyring=no)])
-   AC_MSG_RESULT($ac_cv_linux_exports_key_type_keyring)
-   if test "x$ac_cv_linux_exports_key_type_keyring" = "xyes"; then
-     AC_DEFINE([EXPORTS_KEY_TYPE_KEYRING], 1, [define if key_type_keyring is exported])
-   fi])
- 
- 
  AC_DEFUN([LINUX_KEY_ALLOC_NEEDS_STRUCT_TASK], [
    AC_MSG_CHECKING([if key_alloc() takes a struct task *])
    AC_CACHE_VAL([ac_cv_key_alloc_needs_struct_task], [
--- 767,772 ----
***************
*** 1000,1002 ****
--- 976,1002 ----
   ac_cv_linux_sysctl_table_checking=yes)])
  AC_MSG_RESULT($ac_cv_linux_sysctl_table_checking)])
  
+ AC_DEFUN([LINUX_HAVE_IGET], [
+   AC_MSG_CHECKING([for linux iget()])
+   AC_CACHE_VAL([ac_cv_linux_have_iget], [
+     save_CPPFLAGS="$CPPFLAGS"
+     CPPFLAGS="$CPPFLAGS -Werror-implicit-function-declaration"
+     AC_TRY_KBUILD(
+ [#include <linux/fs.h>],
+ [iget(NULL, NULL);],
+       ac_cv_linux_have_iget=yes,
+       ac_cv_linux_have_iget=no)
+     CPPFLAGS="$save_CPPFLAGS"])
+   AC_MSG_RESULT($ac_cv_linux_have_iget)])
+ 
+ AC_DEFUN([LINUX_FS_STRUCT_NAMEIDATA_HAS_PATH], [
+   AC_MSG_CHECKING([for path in struct nameidata])
+   AC_CACHE_VAL([ac_cv_linux_struct_nameidata_has_path], [
+     AC_TRY_KBUILD(
+ [#include <linux/namei.h>],
+ [struct nameidata _nd;
+ printk("%x\n", _nd.path);],
+       ac_cv_linux_struct_nameidata_has_path=yes,
+       ac_cv_linux_struct_nameidata_has_path=no)])
+   AC_MSG_RESULT($ac_cv_linux_struct_nameidata_has_path)])
+ 
Index: openafs/src/cf/osconf.m4
diff -c openafs/src/cf/osconf.m4:1.83.2.7 openafs/src/cf/osconf.m4:1.83.2.8
*** openafs/src/cf/osconf.m4:1.83.2.7	Tue Jan 15 00:21:18 2008
--- openafs/src/cf/osconf.m4	Thu Feb 28 09:28:39 2008
***************
*** 1114,1119 ****
--- 1114,1125 ----
    NO_STRIP_KRB=-ns
  fi
  
+ if test "x$enable_warnings" = "xyes"; then
+   if test "x$GCC" = "xyes"; then
+     XCFLAGS="${XCFLAGS} -Wall -Wstrict-prototypes -Wold-style-definition"
+   fi
+ fi
+ 
  AC_SUBST(CCXPG2)
  AC_SUBST(CCOBJ)
  AC_SUBST(AFSD_LIBS)
Index: openafs/src/config/NTMakefile.amd64_w2k
diff -c openafs/src/config/NTMakefile.amd64_w2k:1.24.2.39 openafs/src/config/NTMakefile.amd64_w2k:1.24.2.40
*** openafs/src/config/NTMakefile.amd64_w2k:1.24.2.39	Mon Feb 25 20:05:39 2008
--- openafs/src/config/NTMakefile.amd64_w2k	Fri Mar 21 13:02:48 2008
***************
*** 84,90 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=5
! AFSPRODUCT_VER_PATCH=3300
  AFSPRODUCT_VER_BUILD=0
  
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
--- 84,90 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=5
! AFSPRODUCT_VER_PATCH=3400
  AFSPRODUCT_VER_BUILD=0
  
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
Index: openafs/src/config/NTMakefile.i386_nt40
diff -c openafs/src/config/NTMakefile.i386_nt40:1.84.2.38 openafs/src/config/NTMakefile.i386_nt40:1.84.2.39
*** openafs/src/config/NTMakefile.i386_nt40:1.84.2.38	Mon Feb 25 20:05:39 2008
--- openafs/src/config/NTMakefile.i386_nt40	Fri Mar 21 13:02:48 2008
***************
*** 84,90 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=5
! AFSPRODUCT_VER_PATCH=3300
  AFSPRODUCT_VER_BUILD=0
  
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
--- 84,90 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=5
! AFSPRODUCT_VER_PATCH=3400
  AFSPRODUCT_VER_BUILD=0
  
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
Index: openafs/src/config/NTMakefile.i386_w2k
diff -c openafs/src/config/NTMakefile.i386_w2k:1.23.2.39 openafs/src/config/NTMakefile.i386_w2k:1.23.2.40
*** openafs/src/config/NTMakefile.i386_w2k:1.23.2.39	Mon Feb 25 20:05:39 2008
--- openafs/src/config/NTMakefile.i386_w2k	Fri Mar 21 13:02:48 2008
***************
*** 84,90 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=5
! AFSPRODUCT_VER_PATCH=3300
  AFSPRODUCT_VER_BUILD=0
  
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
--- 84,90 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=5
! AFSPRODUCT_VER_PATCH=3400
  AFSPRODUCT_VER_BUILD=0
  
  AFSPRODUCT_VERSION=$(AFSPRODUCT_VER_MAJOR).$(AFSPRODUCT_VER_MINOR).$(AFSPRODUCT_VER_PATCH)
Index: openafs/src/config/param.arm_linux26.h
diff -c openafs/src/config/param.arm_linux26.h:1.1.2.3 openafs/src/config/param.arm_linux26.h:1.1.2.4
*** openafs/src/config/param.arm_linux26.h:1.1.2.3	Mon Feb 18 22:39:17 2008
--- openafs/src/config/param.arm_linux26.h	Wed Feb 27 17:31:16 2008
***************
*** 83,93 ****
  #define SYS_NAME       "arm_linux26"
  #define SYS_NAME_ID    SYS_NAME_ID_arm_linux26
  
- #ifdef __GLIBC__
- #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 3)
- #define USE_UCONTEXT
- #endif
- #endif
  #endif /* AFS_PARAM_H */
  
  
--- 83,88 ----
Index: openafs/src/config/param.hp_ux110.h
diff -c openafs/src/config/param.hp_ux110.h:1.9 openafs/src/config/param.hp_ux110.h:1.9.14.1
*** openafs/src/config/param.hp_ux110.h:1.9	Fri Aug  8 17:54:39 2003
--- openafs/src/config/param.hp_ux110.h	Mon Mar 10 12:23:51 2008
***************
*** 10,17 ****
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
- /* THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT */
- 
  #ifndef	AFS_PARAM_H
  #define	AFS_PARAM_H
  
--- 10,15 ----
Index: openafs/src/config/param.hp_ux1123.h
diff -c openafs/src/config/param.hp_ux1123.h:1.1 openafs/src/config/param.hp_ux1123.h:1.1.8.1
*** openafs/src/config/param.hp_ux1123.h:1.1	Wed Apr 13 21:38:37 2005
--- openafs/src/config/param.hp_ux1123.h	Mon Mar 10 12:23:51 2008
***************
*** 7,14 ****
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
- /* THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT */
- 
  #ifndef	AFS_PARAM_H
  #define	AFS_PARAM_H
  
--- 7,12 ----
***************
*** 57,62 ****
--- 55,62 ----
                  }                                       \
                  }
  
+ #define KERNEL_HAVE_UERROR 1
+ 
  /* Extra kernel definitions (from kdefs file) */
  #ifdef KERNEL
  #define _KERNEL 1
Index: openafs/src/config/param.hp_ux11i.h
diff -c openafs/src/config/param.hp_ux11i.h:1.5 openafs/src/config/param.hp_ux11i.h:1.5.4.1
*** openafs/src/config/param.hp_ux11i.h:1.5	Wed Nov  2 00:30:47 2005
--- openafs/src/config/param.hp_ux11i.h	Mon Mar 10 12:23:51 2008
***************
*** 10,17 ****
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
- /* THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT */
- 
  #ifndef	AFS_PARAM_H
  #define	AFS_PARAM_H
  
--- 10,15 ----
Index: openafs/src/config/param.i386_linux26.h
diff -c openafs/src/config/param.i386_linux26.h:1.8.2.5 openafs/src/config/param.i386_linux26.h:1.8.2.7
*** openafs/src/config/param.i386_linux26.h:1.8.2.5	Thu Nov  9 18:18:45 2006
--- openafs/src/config/param.i386_linux26.h	Sat Mar 22 20:53:47 2008
***************
*** 27,32 ****
--- 27,33 ----
  #define AFS_64BIT_ENV		1
  #define AFS_64BIT_CLIENT	1
  
+ 
  #if defined(__KERNEL__) && !defined(KDUMP_KERNEL)
  
  #ifdef CONFIG_SMP
Index: openafs/src/config/stds.h
diff -c openafs/src/config/stds.h:1.23 openafs/src/config/stds.h:1.23.2.1
*** openafs/src/config/stds.h:1.23	Fri Mar 17 14:54:39 2006
--- openafs/src/config/stds.h	Wed Mar  5 16:53:25 2008
***************
*** 44,49 ****
--- 44,54 ----
  #error We require size of long and pointers to be equal
  #endif */
  
+ #define MAX_AFS_INT32 0x7FFFFFFF
+ #define MAX_AFS_UINT32 0xFFFFFFFF
+ #define MAX_AFS_INT64 0x7FFFFFFFFFFFFFFFL
+ #define MAX_AFS_UINT64 0xFFFFFFFFFFFFFFFFL
+ 
  typedef short afs_int16;
  typedef unsigned short afs_uint16;
  #ifdef  AFS_64BIT_ENV
***************
*** 73,81 ****
  #define CompareInt64(a,b) (afs_int64)(a) - (afs_int64)(b)
  #define CompareUInt64(a,b) (afs_uint64)(a) - (afs_uint64)(b)
  #define NonZeroInt64(a)                (a)
! #define Int64ToInt32(a)    (a) & 0xFFFFFFFFL
  #define FillInt64(t,h,l) (t) = (h); (t) <<= 32; (t) |= (l);
! #define SplitInt64(t,h,l) (h) = (t) >> 32; (l) = (t) & 0xFFFFFFFF;
  #else /* AFS_64BIT_ENV */
  typedef long afs_int32;
  typedef unsigned long afs_uint32;
--- 78,88 ----
  #define CompareInt64(a,b) (afs_int64)(a) - (afs_int64)(b)
  #define CompareUInt64(a,b) (afs_uint64)(a) - (afs_uint64)(b)
  #define NonZeroInt64(a)                (a)
! #define Int64ToInt32(a)    (a) & MAX_AFS_UINT32
  #define FillInt64(t,h,l) (t) = (h); (t) <<= 32; (t) |= (l);
! #define SplitInt64(t,h,l) (h) = (t) >> 32; (l) = (t) & MAX_AFS_UINT32;
! #define RoundInt64ToInt32(a)    (a > MAX_AFS_UINT32) ? MAX_AFS_UINT32 : a;
! #define RoundInt64ToInt31(a)    (a > MAX_AFS_INT32) ? MAX_AFS_INT32 : a;
  #else /* AFS_64BIT_ENV */
  typedef long afs_int32;
  typedef unsigned long afs_uint32;
***************
*** 111,116 ****
--- 118,125 ----
  #define Int64ToInt32(a)    (a).low
  #define FillInt64(t,h,l) (t).high = (h); (t).low = (l);
  #define SplitInt64(t,h,l) (h) = (t).high; (l) = (t).low;
+ #define RoundInt64ToInt32(a)    (a.high > 0) ? MAX_AFS_UINT32 : a.low;
+ #define RoundInt64ToInt31(a)    (a.high > 0) ? MAX_AFS_INT32 : a.low;
  #endif /* AFS_64BIT_ENV */
  
  /* AFS_64BIT_CLIENT should presently be set only for AFS_64BIT_ENV systems */
Index: openafs/src/fsint/afsint.xg
diff -c openafs/src/fsint/afsint.xg:1.13.14.1 openafs/src/fsint/afsint.xg:1.13.14.2
*** openafs/src/fsint/afsint.xg:1.13.14.1	Tue Feb  5 12:26:46 2008
--- openafs/src/fsint/afsint.xg	Wed Mar  5 16:53:29 2008
***************
*** 702,704 ****
--- 702,781 ----
  CallBackRxConnAddr(
    IN afs_int32 *addr
  ) = 65541;
+ 
+ %#define STATS64_CURRENTTIME 0
+ %#define STATS64_BOOTTIME 1
+ %#define STATS64_STARTTIME 2
+ %#define STATS64_CURRENTCONNECTIONS 3
+ %#define STATS64_TOTALFETCHES 4
+ %#define STATS64_FETCHDATAS 5
+ %#define STATS64_FETCHEDBYTES 6
+ %#define STATS64_FETCHDATARATE 7
+ %#define STATS64_TOTALSTORES 8
+ %#define STATS64_STOREDATAS 9
+ %#define STATS64_STOREDBYTES 10
+ %#define STATS64_STOREDATARATE 11
+ %#define STATS64_TOTALVICECALLS 12
+ %#define STATS64_WORKSTATIONS 13
+ %#define STATS64_ACTIVEWORKSTATIONS 14
+ %#define STATS64_PROCESSSIZE 15
+ 
+ const STATS64_VERSION = 16;
+ typedef afs_uint64 ViceStatistics64<STATS64_VERSION>;
+ 
+ /* the "version" is a number representing the number of 
+    array elements to return, from 0 to N-1 */
+ 
+ GetStatistics64(
+     IN afs_int32 statsVersion,
+     OUT ViceStatistics64 *Statistics
+ ) = 65542;
+ 
+ /* rx osd. put here now to hold version numbers.
+ ServerPath(
+   IN  AFSFid *Fid,
+   afs_int32 writing,
+   OUT FilePath *NameiInfo,
+   AFSFetchStatus *OutStatus,
+   AFSCallBack *CallBack
+ ) = 65551;
+ 
+ PerfTest(
+   IN  afs_int32 type,
+   afs_int64 bytes,
+   afs_int32 bufsize
+ ) split = 65552;
+ 
+ GetOSDlocation(
+   IN AFSFid *Fid,
+   afs_uint64 offset,
+   afs_uint64 length,
+   afs_int32 flag,
+   afsUUID uuid,
+   OUT AFSFetchStatus *OutStatus,
+   AFSCallBack *CallBack,
+   struct osd_file *osd
+ ) = 65557;
+ 
+ InverseLookup(
+   IN AFSFid *Fid,
+   afs_uint32 parent,
+   OUT struct afs_filename *file,
+   afs_uint32 *nextparent
+ ) = 65558;
+ 
+ CheckOSDconns() = 65559;
+ 
+ OsdPolicy(IN AFSFid *Fid,
+   afs_uint64 length,
+   OUT afs_uint32 *protocol
+ ) = 65560;
+ 
+ SetOsdFileReady(
+   IN AFSFid *Fid
+ ) = 65561;
+ 
+ GetOsdMetadata(
+   IN AFSFid *Fid
+ ) split = 65562;
+ */
Index: openafs/src/fsprobe/fsprobe.c
diff -c openafs/src/fsprobe/fsprobe.c:1.9.14.1 openafs/src/fsprobe/fsprobe.c:1.9.14.3
*** openafs/src/fsprobe/fsprobe.c:1.9.14.1	Tue Oct 30 11:16:39 2007
--- openafs/src/fsprobe/fsprobe.c	Mon Mar 10 18:32:33 2008
***************
*** 17,23 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/fsprobe/fsprobe.c,v 1.9.14.1 2007/10/30 15:16:39 shadow Exp $");
  
  
  #include <string.h>
--- 17,23 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/fsprobe/fsprobe.c,v 1.9.14.3 2008/03/10 22:32:33 shadow Exp $");
  
  
  #include <string.h>
***************
*** 25,30 ****
--- 25,31 ----
  #include <fsprobe.h>		/*Interface for this module */
  #include <lwp.h>		/*Lightweight process package */
  #include <afs/cellconfig.h>
+ #include <afs/afsint.h>
  
  #define LWP_STACK_SIZE	(16 * 1024)
  
***************
*** 231,238 ****
   * Side Effects:
   *	As advertised.
   *------------------------------------------------------------------------*/
! static void
! fsprobe_LWP()
  {				/*fsprobe_LWP */
  
      static char rn[] = "fsprobe_LWP";	/*Routine name */
--- 232,239 ----
   * Side Effects:
   *	As advertised.
   *------------------------------------------------------------------------*/
! static void *
! fsprobe_LWP(void *unused)
  {				/*fsprobe_LWP */
  
      static char rn[] = "fsprobe_LWP";	/*Routine name */
***************
*** 242,248 ****
      struct fsprobe_ConnectionInfo *curr_conn;	/*Current connection */
      struct ProbeViceStatistics *curr_stats;	/*Current stats region */
      int *curr_probeOK;		/*Current probeOK field */
! 
      while (1) {			/*Service loop */
  	/*
  	 * Iterate through the server connections, gathering data.
--- 243,251 ----
      struct fsprobe_ConnectionInfo *curr_conn;	/*Current connection */
      struct ProbeViceStatistics *curr_stats;	/*Current stats region */
      int *curr_probeOK;		/*Current probeOK field */
!     ViceStatistics64 stats64;      /*Current stats region */
!     stats64.ViceStatistics64_val = (afs_uint64 *)malloc(STATS64_VERSION *
! 							sizeof(afs_uint64));
      while (1) {			/*Service loop */
  	/*
  	 * Iterate through the server connections, gathering data.
***************
*** 274,281 ****
  			    "[%s] Connection valid, calling RXAFS_GetStatistics\n",
  			    rn);
  		*curr_probeOK =
! 		    RXAFS_GetStatistics(curr_conn->rxconn, curr_stats);
! 
  	    }
  
  	    /*Valid Rx connection */
--- 277,295 ----
  			    "[%s] Connection valid, calling RXAFS_GetStatistics\n",
  			    rn);
  		*curr_probeOK =
! 		    RXAFS_GetStatistics64(curr_conn->rxconn, STATS64_VERSION, &stats64);
! 		if (*curr_probeOK == RXGEN_OPCODE)
! 		    *curr_probeOK =
! 			RXAFS_GetStatistics(curr_conn->rxconn, curr_stats);
! 		else if (*curr_probeOK == 0) {
! 		    curr_stats->CurrentTime = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_CURRENTTIME]);
! 		    curr_stats->BootTime = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_BOOTTIME]);
! 		    curr_stats->StartTime = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_STARTTIME]);
! 		    curr_stats->CurrentConnections = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_CURRENTCONNECTIONS]);
! 		    curr_stats->TotalFetchs = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_TOTALFETCHES]);
! 		    curr_stats->TotalStores = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_TOTALSTORES]);
! 		    curr_stats->WorkStations = RoundInt64ToInt32(stats64.ViceStatistics64_val[STATS64_WORKSTATIONS]);
! 		}
  	    }
  
  	    /*Valid Rx connection */
***************
*** 289,294 ****
--- 303,310 ----
  		int i, code;
  		char pname[10];
  		struct diskPartition partition;
+ 		struct diskPartition64 *partition64p =
+ 		    (struct diskPartition64 *)malloc(sizeof(struct diskPartition64));
  
  		if (fsprobe_debug)
  		    fprintf(stderr,
***************
*** 299,320 ****
  			MapPartIdIntoName(curr_conn->partList.partId[i],
  					  pname);
  			code =
! 			    AFSVolPartitionInfo(curr_conn->rxVolconn, pname,
! 						&partition);
  			if (code) {
  			    fprintf(stderr,
  				    "Could not get information on server %s partition %s\n",
  				    curr_conn->hostName, pname);
- 			} else {
- 			    curr_stats->Disk[i].BlocksAvailable =
- 				partition.free;
- 			    curr_stats->Disk[i].TotalBlocks =
- 				partition.minFree;
- 			    strcpy(curr_stats->Disk[i].Name, pname);
  			}
  		    }
- 
  		}
  	    }
  
  
--- 315,350 ----
  			MapPartIdIntoName(curr_conn->partList.partId[i],
  					  pname);
  			code =
! 			    AFSVolPartitionInfo64(curr_conn->rxVolconn, pname,
! 						  partition64p);
! 
! 			if (!code) {
! 			    curr_stats->Disk[i].BlocksAvailable =
! 				RoundInt64ToInt31(partition64p->free);
! 			    curr_stats->Disk[i].TotalBlocks =
! 				RoundInt64ToInt31(partition64p->minFree);
! 			    strcpy(curr_stats->Disk[i].Name, pname);
! 			}
! 			if (code == RXGEN_OPCODE) {
! 			    code = 
! 				AFSVolPartitionInfo(curr_conn->rxVolconn, 
! 						    pname, &partition);
! 			    if (!code) {
! 				curr_stats->Disk[i].BlocksAvailable =
! 				    partition.free;
! 				curr_stats->Disk[i].TotalBlocks =
! 				    partition.minFree;
! 				strcpy(curr_stats->Disk[i].Name, pname);
! 			    }
! 			}
  			if (code) {
  			    fprintf(stderr,
  				    "Could not get information on server %s partition %s\n",
  				    curr_conn->hostName, pname);
  			}
  		    }
  		}
+ 		free(partition64p);
  	    }
  
  
***************
*** 358,364 ****
--- 388,396 ----
  	if (code)
  	    fprintf(stderr, "[%s] IOMGR_Select returned code %d\n", rn, code);
      }				/*Service loop */
+     free(stats64.ViceStatistics64_val);
  
+     return NULL;
  }				/*fsprobe_LWP */
  
  /*list all the partitions on <aserver> */
Index: openafs/src/gtx/curseswindows.c
diff -c openafs/src/gtx/curseswindows.c:1.10.14.1 openafs/src/gtx/curseswindows.c:1.10.14.2
*** openafs/src/gtx/curseswindows.c:1.10.14.1	Tue Oct 30 11:16:39 2007
--- openafs/src/gtx/curseswindows.c	Mon Mar 10 18:32:33 2008
***************
*** 14,25 ****
   *	Implementation of the gator curses window facility.
   *
   *------------------------------------------------------------------------*/
! #define	IGNORE_STDS_H
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/gtx/curseswindows.c,v 1.10.14.1 2007/10/30 15:16:39 shadow Exp $");
  
  
  #if defined(AFS_HPUX110_ENV) && !defined(__HP_CURSES)
--- 14,25 ----
   *	Implementation of the gator curses window facility.
   *
   *------------------------------------------------------------------------*/
! 
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/gtx/curseswindows.c,v 1.10.14.2 2008/03/10 22:32:33 shadow Exp $");
  
  
  #if defined(AFS_HPUX110_ENV) && !defined(__HP_CURSES)
***************
*** 40,45 ****
--- 40,47 ----
  #include <string.h>
  #include <stdlib.h>
  
+ #include <lwp.h>
+ 
  #include "gtxcurseswin.h"	/*Interface definition */
  #include "gtxobjects.h"
  #include "gtxframe.h"
Index: openafs/src/gtx/frame.c
diff -c openafs/src/gtx/frame.c:1.7.14.2 openafs/src/gtx/frame.c:1.7.14.3
*** openafs/src/gtx/frame.c:1.7.14.2	Mon Nov 26 16:08:42 2007
--- openafs/src/gtx/frame.c	Mon Mar 10 18:32:33 2008
***************
*** 7,18 ****
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
- #define	IGNORE_STDS_H
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/gtx/frame.c,v 1.7.14.2 2007/11/26 21:08:42 shadow Exp $");
  
  #ifdef AFS_HPUX_ENV
  #include <sys/types.h>
--- 7,17 ----
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/gtx/frame.c,v 1.7.14.3 2008/03/10 22:32:33 shadow Exp $");
  
  #ifdef AFS_HPUX_ENV
  #include <sys/types.h>
Index: openafs/src/gtx/input.c
diff -c openafs/src/gtx/input.c:1.7.14.1 openafs/src/gtx/input.c:1.7.14.2
*** openafs/src/gtx/input.c:1.7.14.1	Mon Nov 26 16:08:42 2007
--- openafs/src/gtx/input.c	Mon Mar 10 18:32:33 2008
***************
*** 7,18 ****
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
- #define	IGNORE_STDS_H
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/gtx/input.c,v 1.7.14.1 2007/11/26 21:08:42 shadow Exp $");
  
  #ifdef AFS_HPUX_ENV
  #include <sys/types.h>
--- 7,17 ----
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/gtx/input.c,v 1.7.14.2 2008/03/10 22:32:33 shadow Exp $");
  
  #ifdef AFS_HPUX_ENV
  #include <sys/types.h>
***************
*** 29,37 ****
  
  
  /* process input */
! gtx_InputServer(awin)
!      register struct gwin *awin;
  {
      register int tc;
      register int code;
      register struct gtx_frame *tframe;
--- 28,38 ----
  
  
  /* process input */
! void *
! gtx_InputServer(void *param)
  {
+     struct gwin *awin = (struct gwin *) param;
+     
      register int tc;
      register int code;
      register struct gtx_frame *tframe;
Index: openafs/src/kauth/kaserver.c
diff -c openafs/src/kauth/kaserver.c:1.19.2.5 openafs/src/kauth/kaserver.c:1.19.2.6
*** openafs/src/kauth/kaserver.c:1.19.2.5	Tue Oct 30 11:16:39 2007
--- openafs/src/kauth/kaserver.c	Mon Mar 10 18:32:33 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kaserver.c,v 1.19.2.5 2007/10/30 15:16:39 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/kaserver.c,v 1.19.2.6 2008/03/10 22:32:33 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 491,496 ****
      }
  
      ViceLog(0, ("Starting to process AuthServer requests\n"));
!     rx_ServerProc();		/* donate this LWP */
      return 0;
  }
--- 491,496 ----
      }
  
      ViceLog(0, ("Starting to process AuthServer requests\n"));
!     rx_ServerProc(NULL);		/* donate this LWP */
      return 0;
  }
Index: openafs/src/kauth/krb_udp.c
diff -c openafs/src/kauth/krb_udp.c:1.23.14.4 openafs/src/kauth/krb_udp.c:1.23.14.5
*** openafs/src/kauth/krb_udp.c:1.23.14.4	Sun Feb  3 22:59:06 2008
--- openafs/src/kauth/krb_udp.c	Mon Mar 10 18:32:33 2008
***************
*** 16,22 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/krb_udp.c,v 1.23.14.4 2008/02/04 03:59:06 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 16,22 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/kauth/krb_udp.c,v 1.23.14.5 2008/03/10 22:32:33 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 104,111 ****
  
  int fiveminutes = 300;
  
! static
! FiveMinuteCheckLWP()
  {
  
      printf("start 5 min check lwp\n");
--- 104,111 ----
  
  int fiveminutes = 300;
  
! static void *
! FiveMinuteCheckLWP(void *unused)
  {
  
      printf("start 5 min check lwp\n");
***************
*** 115,120 ****
--- 115,121 ----
  	/* close the log so it can be removed */
  	ReOpenLog(AFSDIR_SERVER_KALOG_FILEPATH);	/* no trunc, just append */
      }
+     return NULL;
  }
  
  
***************
*** 820,827 ****
      return;
  }
  
! static void
! SocketListener()
  {
      fd_set rfds;
      struct timeval tv;
--- 821,828 ----
      return;
  }
  
! static void *
! SocketListener(void *unused)
  {
      fd_set rfds;
      struct timeval tv;
***************
*** 903,908 ****
--- 904,911 ----
  	sock_kerb5 = -1;
      }
      printf("UDP SocketListener exiting due to error\n");
+ 
+     return NULL;
  }
  
  #if MAIN
Index: openafs/src/libadmin/client/afs_clientAdmin.c
diff -c openafs/src/libadmin/client/afs_clientAdmin.c:1.11.4.2 openafs/src/libadmin/client/afs_clientAdmin.c:1.11.4.3
*** openafs/src/libadmin/client/afs_clientAdmin.c:1.11.4.2	Wed Oct  3 11:29:29 2007
--- openafs/src/libadmin/client/afs_clientAdmin.c	Thu Feb 28 20:27:57 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/libadmin/client/afs_clientAdmin.c,v 1.11.4.2 2007/10/03 15:29:29 jaltman Exp $");
  
  #include <afs/stds.h>
  #include "afs_clientAdmin.h"
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/libadmin/client/afs_clientAdmin.c,v 1.11.4.3 2008/02/29 01:27:57 jaltman Exp $");
  
  #include <afs/stds.h>
  #include "afs_clientAdmin.h"
***************
*** 24,29 ****
--- 24,30 ----
  #include <afs/afssyscalls.h>
  #include <winsock2.h>
  #include <afs/fs_utils.h>
+ #define close(x) closesocket(x)
  #else
  #include <sys/socket.h>
  #include <netinet/in.h>
Index: openafs/src/lwp/Makefile.in
diff -c openafs/src/lwp/Makefile.in:1.35.2.1 openafs/src/lwp/Makefile.in:1.35.2.2
*** openafs/src/lwp/Makefile.in:1.35.2.1	Fri Oct 19 20:23:46 2007
--- openafs/src/lwp/Makefile.in	Wed Feb 27 17:31:11 2008
***************
*** 36,42 ****
  	@set -x; case "$(SYS_NAME)" in \
  	pmax_he1) \
  		$(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c -I${TOP_INCDIR} process.s;; \
! 	sun4c_51 | sun4c_52 | sun4m_51 | sun4m_52 | sun4c_53 | sun4m_53  | sun4_53 | sun4_52 | sun4_54 | sun4c_54 | sun4m_54 | sun4x_5* ) \
  		$(CPP) -P -I${TOP_INCDIR} ${srcdir}/process.s process.ss; \
  		${AS} process.ss -o process.o; \
  			$(RM) process.ss ;; \
--- 36,42 ----
  	@set -x; case "$(SYS_NAME)" in \
  	pmax_he1) \
  		$(CCOBJ) ${LWP_DBG} ${LWP_OPTMZ} -c -I${TOP_INCDIR} process.s;; \
! 	sun4c_51 | sun4c_52 | sun4m_51 | sun4m_52 | sun4c_53 | sun4m_53  | sun4_53 | sun4_52 | sun4_54 | sun4c_54 | sun4m_54 | sun4x_5* | arm_linux* ) \
  		$(CPP) -P -I${TOP_INCDIR} ${srcdir}/process.s process.ss; \
  		${AS} process.ss -o process.o; \
  			$(RM) process.ss ;; \
Index: openafs/src/lwp/NTMakefile
diff -c openafs/src/lwp/NTMakefile:1.7 openafs/src/lwp/NTMakefile:1.7.4.1
*** openafs/src/lwp/NTMakefile:1.7	Sun Nov 20 20:57:11 2005
--- openafs/src/lwp/NTMakefile	Tue Mar 11 13:02:07 2008
***************
*** 31,39 ****
  	$(DESTDIR)\include\preempt.h \
  	$(DESTDIR)\include\timer.h
  
  
! 
! install: $(LIBFILE) $(INCFILES)
  
  install9x: install
  
--- 31,39 ----
  	$(DESTDIR)\include\preempt.h \
  	$(DESTDIR)\include\timer.h
  
+ install_headers: $(INCFILES)
  
! install: install_headers $(LIBFILE) 
  
  install9x: install
  
Index: openafs/src/lwp/iomgr.c
diff -c openafs/src/lwp/iomgr.c:1.16 openafs/src/lwp/iomgr.c:1.16.2.1
*** openafs/src/lwp/iomgr.c:1.16	Wed Feb 15 08:00:16 2006
--- openafs/src/lwp/iomgr.c	Mon Mar 10 18:32:33 2008
***************
*** 36,42 ****
  #include <afsconfig.h>
  #include <afs/param.h>
  
! RCSID("$Header: /cvs/openafs/src/lwp/iomgr.c,v 1.16 2006/02/15 13:00:16 jaltman Exp $");
  
  #include <stdio.h>
  #include <stdlib.h>
--- 36,42 ----
  #include <afsconfig.h>
  #include <afs/param.h>
  
! RCSID("$Header: /cvs/openafs/src/lwp/iomgr.c,v 1.16.2.1 2008/03/10 22:32:33 shadow Exp $");
  
  #include <stdio.h>
  #include <stdlib.h>
***************
*** 107,113 ****
  #define NSIG 8*sizeof(sigset_t)
  #endif
  
! static int SignalSignals();
  
  /********************************\
  * 				 *
--- 107,113 ----
  #define NSIG 8*sizeof(sigset_t)
  #endif
  
! static int SignalSignals(void);
  
  /********************************\
  * 				 *
***************
*** 163,170 ****
  					   to write it */
  /* software 'signals' */
  #define NSOFTSIG		4
! static int (*sigProc[NSOFTSIG])();
! static char *sigRock[NSOFTSIG];
  
  
  static struct IoRequest *iorFreeList = 0;
--- 163,170 ----
  					   to write it */
  /* software 'signals' */
  #define NSOFTSIG		4
! static void *(*sigProc[NSOFTSIG])(void *);
! static void *sigRock[NSOFTSIG];
  
  
  static struct IoRequest *iorFreeList = 0;
***************
*** 232,238 ****
  
  #define FreeRequest(x) ((x)->next = iorFreeList, iorFreeList = (x))
  
! static struct IoRequest *NewRequest()
  {
      struct IoRequest *request;
  
--- 232,238 ----
  
  #define FreeRequest(x) ((x)->next = iorFreeList, iorFreeList = (x))
  
! static struct IoRequest *NewRequest(void)
  {
      struct IoRequest *request;
  
***************
*** 415,421 ****
  static fd_set IOMGR_readfds, IOMGR_writefds, IOMGR_exceptfds;
  static int IOMGR_nfds = 0;
  
! static int IOMGR(void *dummy)
  {
      for (;;) {
  	int code;
--- 415,421 ----
  static fd_set IOMGR_readfds, IOMGR_writefds, IOMGR_exceptfds;
  static int IOMGR_nfds = 0;
  
! static void *IOMGR(void *dummy)
  {
      for (;;) {
  	int code;
***************
*** 669,675 ****
  	}
  	LWP_DispatchProcess();
      }
!     return -1; /* keeps compilers happy. */
  }
  
  /************************\
--- 669,675 ----
  	}
  	LWP_DispatchProcess();
      }
!     return (void *)-1; /* keeps compilers happy. */
  }
  
  /************************\
***************
*** 726,733 ****
  *  signalling routines, above).			      *
  *						      *
  \*****************************************************/
! static void SigHandler (signo)
!     int signo;
  {
      if (badsig(signo) || (sigsHandled & mysigmask(signo)) == 0)
  	return;		/* can't happen. */
--- 726,732 ----
  *  signalling routines, above).			      *
  *						      *
  \*****************************************************/
! static void SigHandler (int signo)
  {
      if (badsig(signo) || (sigsHandled & mysigmask(signo)) == 0)
  	return;		/* can't happen. */
***************
*** 744,750 ****
  {
      bool gotone = FALSE;
      register int i;
!     register int (*p)();
      afs_int32 stackSize;
  
      anySigsDelivered = FALSE;
--- 743,749 ----
  {
      bool gotone = FALSE;
      register int i;
!     register void *(*p)(void *);
      afs_int32 stackSize;
  
      anySigsDelivered = FALSE;
***************
*** 753,761 ****
      stackSize = (AFS_LWP_MINSTACKSIZE < lwp_MaxStackSeen? lwp_MaxStackSeen : AFS_LWP_MINSTACKSIZE);
      for (i=0; i < NSOFTSIG; i++) {
  	PROCESS pid;
! 	if (p=sigProc[i]) /* This yields!!! */
  	    LWP_CreateProcess2(p, stackSize, LWP_NORMAL_PRIORITY, 
! 			       (void *) sigRock[i], "SignalHandler", &pid);
  	sigProc[i] = 0;
      }
  
--- 752,760 ----
      stackSize = (AFS_LWP_MINSTACKSIZE < lwp_MaxStackSeen? lwp_MaxStackSeen : AFS_LWP_MINSTACKSIZE);
      for (i=0; i < NSOFTSIG; i++) {
  	PROCESS pid;
! 	if ((p=sigProc[i])) /* This yields!!! */
  	    LWP_CreateProcess2(p, stackSize, LWP_NORMAL_PRIORITY, 
! 			       sigRock[i], "SignalHandler", &pid);
  	sigProc[i] = 0;
      }
  
***************
*** 779,787 ****
  /* Keep IOMGR process id */
  static PROCESS IOMGR_Id = NULL;
  
! int IOMGR_SoftSig(aproc, arock)
! int (*aproc)();
! char *arock; {
      register int i;
      for (i=0;i<NSOFTSIG;i++) {
  	if (sigProc[i] == 0) {
--- 778,785 ----
  /* Keep IOMGR process id */
  static PROCESS IOMGR_Id = NULL;
  
! int IOMGR_SoftSig(void *(*aproc)(void *), void *arock)
! {
      register int i;
      for (i=0;i<NSOFTSIG;i++) {
  	if (sigProc[i] == 0) {
***************
*** 802,808 ****
  
  int IOMGR_Initialize(void)
  {
-     extern int TM_Init();
      PROCESS pid;
  
      /* If lready initialized, just return */
--- 800,805 ----
***************
*** 829,835 ****
  			     "IO MANAGER", &IOMGR_Id);
  }
  
! int IOMGR_Finalize()
  {
      int status;
  
--- 826,832 ----
  			     "IO MANAGER", &IOMGR_Id);
  }
  
! int IOMGR_Finalize(void)
  {
      int status;
  
***************
*** 917,926 ****
      return 0;
  }
  
! int IOMGR_Select(fds, readfds, writefds, exceptfds, timeout)
!      int fds;
!      fd_set *readfds, *writefds, *exceptfds;
!      struct timeval *timeout;
  {
      register struct IoRequest *request;
      int result;
--- 914,921 ----
      return 0;
  }
  
! int IOMGR_Select(int fds, fd_set *readfds, fd_set *writefds, 
! 		 fd_set *exceptfds, struct timeval *timeout)
  {
      register struct IoRequest *request;
      int result;
***************
*** 941,947 ****
--- 936,944 ----
  #ifdef DEBUG
  	    if (lwp_debug != 0) puts("[Polling SELECT]");
  #endif /* DEBUG */
+ #if	defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_AIX32_ENV) || defined(AFS_NT40_ENV)
  again:
+ #endif
  	    code = select(fds, readfds, writefds, exceptfds, timeout);
  #if	defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_AIX32_ENV)
  	    /*
Index: openafs/src/lwp/lock.c
diff -c openafs/src/lwp/lock.c:1.5 openafs/src/lwp/lock.c:1.5.14.1
*** openafs/src/lwp/lock.c:1.5	Tue Jul 15 19:15:45 2003
--- openafs/src/lwp/lock.c	Mon Mar 10 18:32:33 2008
***************
*** 26,32 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/lwp/lock.c,v 1.5 2003/07/15 23:15:45 shadow Exp $");
  
  #ifdef AFS_PTHREAD_ENV
  #include <afs/assert.h>
--- 26,32 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/lwp/lock.c,v 1.5.14.1 2008/03/10 22:32:33 shadow Exp $");
  
  #ifdef AFS_PTHREAD_ENV
  #include <afs/assert.h>
***************
*** 197,205 ****
  
  /* release a write lock and sleep on an address, atomically */
  void
! LWP_WaitProcessR(addr, alock)
!      register char *addr;
!      register struct Lock *alock;
  {
      ReleaseReadLock(alock);
      LWP_WaitProcess(addr);
--- 197,203 ----
  
  /* release a write lock and sleep on an address, atomically */
  void
! LWP_WaitProcessR(register void *addr, register struct Lock *alock)
  {
      ReleaseReadLock(alock);
      LWP_WaitProcess(addr);
***************
*** 207,215 ****
  
  /* release a write lock and sleep on an address, atomically */
  void
! LWP_WaitProcessW(addr, alock)
!      register char *addr;
!      register struct Lock *alock;
  {
      ReleaseWriteLock(alock);
      LWP_WaitProcess(addr);
--- 205,211 ----
  
  /* release a write lock and sleep on an address, atomically */
  void
! LWP_WaitProcessW(register void *addr, register struct Lock *alock)
  {
      ReleaseWriteLock(alock);
      LWP_WaitProcess(addr);
***************
*** 217,225 ****
  
  /* release a write lock and sleep on an address, atomically */
  void
! LWP_WaitProcessS(addr, alock)
!      register char *addr;
!      register struct Lock *alock;
  {
      ReleaseSharedLock(alock);
      LWP_WaitProcess(addr);
--- 213,219 ----
  
  /* release a write lock and sleep on an address, atomically */
  void
! LWP_WaitProcessS(register void *addr, register struct Lock *alock)
  {
      ReleaseSharedLock(alock);
      LWP_WaitProcess(addr);
Index: openafs/src/lwp/lock.h
diff -c openafs/src/lwp/lock.h:1.7 openafs/src/lwp/lock.h:1.7.8.1
*** openafs/src/lwp/lock.h:1.7	Wed Aug 18 20:45:33 2004
--- openafs/src/lwp/lock.h	Mon Mar 10 18:32:33 2008
***************
*** 68,73 ****
--- 68,74 ----
  extern void Afs_Lock_Obtain(struct Lock *lock, int how);
  extern void Afs_Lock_ReleaseR(struct Lock *lock);
  extern void Afs_Lock_ReleaseW(struct Lock *lock);
+ extern void Afs_Lock_WakeupR(struct Lock *lock);
  void Lock_Init(struct Lock *lock);
  void Lock_Destroy(struct Lock *lock);
  
Index: openafs/src/lwp/lwp.c
diff -c openafs/src/lwp/lwp.c:1.34.2.4 openafs/src/lwp/lwp.c:1.34.2.6
*** openafs/src/lwp/lwp.c:1.34.2.4	Tue Jan 15 00:12:15 2008
--- openafs/src/lwp/lwp.c	Thu Mar 13 09:42:19 2008
***************
*** 17,23 ****
  #include <afsconfig.h>
  #include <afs/param.h>
  
! RCSID("$Header: /cvs/openafs/src/lwp/lwp.c,v 1.34.2.4 2008/01/15 05:12:15 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
--- 17,23 ----
  #include <afsconfig.h>
  #include <afs/param.h>
  
! RCSID("$Header: /cvs/openafs/src/lwp/lwp.c,v 1.34.2.6 2008/03/13 13:42:19 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
***************
*** 100,119 ****
  } while (0)
  #endif
  
! static int Dispatcher();
! static int Create_Process_Part2();
! static int Exit_LWP();
! static afs_int32 Initialize_Stack();
! static int Stack_Used();
! char (*RC_to_ASCII());
! 
! static void Abort_LWP();
! static void Overflow_Complain();
! static void Initialize_PCB();
! static void Dispose_of_Dead_PCB();
! static void Free_PCB();
! static int Internal_Signal();
! static purge_dead_pcbs();
  
  #define MAX_PRIORITIES	(LWP_MAX_PRIORITY+1)
  
--- 100,122 ----
  } while (0)
  #endif
  
! static void Dispatcher(void);
! static void Create_Process_Part2(void);
! static void Exit_LWP(void);
! static afs_int32 Initialize_Stack(char *stackptr, int stacksize);
! static int Stack_Used(register char *stackptr, int stacksize);
! 
! static void Abort_LWP(char *msg);
! static void Overflow_Complain(void);
! static void Initialize_PCB(PROCESS temp, int priority, char *stack,
! 			   int stacksize, void *(*ep)(void *), void *parm, 
! 			   char *name);
! static void Dispose_of_Dead_PCB(PROCESS cur);
! static void Free_PCB(PROCESS pid);
! static int Internal_Signal(void *event);
! static int purge_dead_pcbs(void);
! static int LWP_MwaitProcess(int wcount, void *evlist[]);
! 	
  
  #define MAX_PRIORITIES	(LWP_MAX_PRIORITY+1)
  
***************
*** 121,127 ****
      PROCESS head;
      int count;
  } runnable[MAX_PRIORITIES], blocked, qwaiting;
! /* Invariant for runnable queues: The head of each queue points to the currently running process if it is in that queue, or it points to the next process in that queue that should run. */
  
  /* Offset of stack field within pcb -- used by stack checking stuff */
  int stack_offset;
--- 124,132 ----
      PROCESS head;
      int count;
  } runnable[MAX_PRIORITIES], blocked, qwaiting;
! /* Invariant for runnable queues: The head of each queue points to the 
!  * currently running process if it is in that queue, or it points to the 
!  * next process in that queue that should run. */
  
  /* Offset of stack field within pcb -- used by stack checking stuff */
  int stack_offset;
***************
*** 262,268 ****
  #endif
  
  int
! LWP_CreateProcess(int (*ep) (), int stacksize, int priority, void *parm,
  		  char *name, PROCESS * pid)
  {
      PROCESS temp, temp2;
--- 267,273 ----
  #endif
  
  int
! LWP_CreateProcess(void *(*ep) (void *), int stacksize, int priority, void *parm,
  		  char *name, PROCESS * pid)
  {
      PROCESS temp, temp2;
***************
*** 419,425 ****
  
  #ifdef	AFS_AIX32_ENV
  int
! LWP_CreateProcess2(int (*ep) (), int stacksize, int priority, void *parm,
  		   char *name, PROCESS * pid)
  {
      PROCESS temp, temp2;
--- 424,430 ----
  
  #ifdef	AFS_AIX32_ENV
  int
! LWP_CreateProcess2(void *(*ep) (void *), int stacksize, int priority, void *parm,
  		   char *name, PROCESS * pid)
  {
      PROCESS temp, temp2;
***************
*** 650,656 ****
  }
  
  int
! LWP_INTERNALSIGNAL(char *event, int yield)
  {				/* signal the occurence of an event */
      Debug(2, ("Entered LWP_SignalProcess"));
      if (lwp_init) {
--- 655,661 ----
  }
  
  int
! LWP_INTERNALSIGNAL(void *event, int yield)
  {				/* signal the occurence of an event */
      Debug(2, ("Entered LWP_SignalProcess"));
      if (lwp_init) {
***************
*** 689,697 ****
  }
  
  int
! LWP_WaitProcess(char *event)
  {				/* wait on a single event */
!     char *tempev[2];
  
      Debug(2, ("Entered Wait_Process"));
      if (event == NULL)
--- 694,702 ----
  }
  
  int
! LWP_WaitProcess(void *event)
  {				/* wait on a single event */
!     void *tempev[2];
  
      Debug(2, ("Entered Wait_Process"));
      if (event == NULL)
***************
*** 702,708 ****
  }
  
  int
! LWP_MwaitProcess(int wcount, char *evlist[])
  {				/* wait on m of n events */
      register int ecount, i;
  
--- 707,713 ----
  }
  
  int
! LWP_MwaitProcess(int wcount, void *evlist[])
  {				/* wait on m of n events */
      register int ecount, i;
  
***************
*** 730,737 ****
  	if (ecount > lwp_cpptr->eventlistsize) {
  
  	    lwp_cpptr->eventlist =
! 		(char **)realloc(lwp_cpptr->eventlist,
! 				 ecount * sizeof(char *));
  	    lwp_cpptr->eventlistsize = ecount;
  	}
  	for (i = 0; i < ecount; i++)
--- 735,742 ----
  	if (ecount > lwp_cpptr->eventlistsize) {
  
  	    lwp_cpptr->eventlist =
! 		(void **)realloc(lwp_cpptr->eventlist,
! 				 ecount * sizeof(void *));
  	    lwp_cpptr->eventlistsize = ecount;
  	}
  	for (i = 0; i < ecount; i++)
***************
*** 787,793 ****
      return;
  }
  
! static int
  Create_Process_Part2(void)
  {				/* creates a context for the new process */
      PROCESS temp;
--- 792,798 ----
      return;
  }
  
! static void
  Create_Process_Part2(void)
  {				/* creates a context for the new process */
      PROCESS temp;
***************
*** 797,803 ****
      savecontext(Dispatcher, &temp->context, NULL);
      (*temp->ep) (temp->parm);
      LWP_DestroyProcess(temp);
!     return 0;
  }
  
  static int
--- 802,808 ----
      savecontext(Dispatcher, &temp->context, NULL);
      (*temp->ep) (temp->parm);
      LWP_DestroyProcess(temp);
!     return;
  }
  
  static int
***************
*** 876,882 ****
  
  int LWP_TraceProcesses = 0;
  
! static int
  Dispatcher(void)
  {				/* Lightweight process dispatcher */
      register int i;
--- 881,887 ----
  
  int LWP_TraceProcesses = 0;
  
! static void
  Dispatcher(void)
  {				/* Lightweight process dispatcher */
      register int i;
***************
*** 928,934 ****
  	printf("stackcheck = %u: stack = %u \n", lwp_cpptr->stackcheck,
  	       *(int *)lwp_cpptr->stack);
  	printf("topstack = 0x%x: stackptr = 0x%x: stacksize = 0x%x\n",
! 	       lwp_cpptr->context.topstack, lwp_cpptr->stack,
  	       lwp_cpptr->stacksize);
  
  	switch (lwp_overflowAction) {
--- 933,940 ----
  	printf("stackcheck = %u: stack = %u \n", lwp_cpptr->stackcheck,
  	       *(int *)lwp_cpptr->stack);
  	printf("topstack = 0x%x: stackptr = 0x%x: stacksize = 0x%x\n",
! 	       (unsigned int)lwp_cpptr->context.topstack, 
! 	       (unsigned int)lwp_cpptr->stack,
  	       lwp_cpptr->stacksize);
  
  	switch (lwp_overflowAction) {
***************
*** 970,976 ****
  
      returnto(&lwp_cpptr->context);
      
!     return 0; /* not reachable */
  }
  
  /* Complain of a stack overflow to stderr without using stdio. */
--- 976,982 ----
  
      returnto(&lwp_cpptr->context);
      
!     return; /* not reachable */
  }
  
  /* Complain of a stack overflow to stderr without using stdio. */
***************
*** 1003,1009 ****
  */
  }
  
! static int
  Exit_LWP(void)
  {
      abort();
--- 1009,1015 ----
  */
  }
  
! static void
  Exit_LWP(void)
  {
      abort();
***************
*** 1028,1034 ****
  
  static void
  Initialize_PCB(PROCESS temp, int priority, char *stack, int stacksize,
! 	       int (*ep) (), void *parm, char *name)
  {
      register int i = 0;
  
--- 1034,1040 ----
  
  static void
  Initialize_PCB(PROCESS temp, int priority, char *stack, int stacksize,
! 	       void *(*ep) (void *), void *parm, char *name)
  {
      register int i = 0;
  
***************
*** 1038,1044 ****
  	    i++;
      temp->name[31] = '\0';
      temp->status = READY;
!     temp->eventlist = (char **)malloc(EVINITSIZE * sizeof(char *));
      temp->eventlistsize = EVINITSIZE;
      temp->eventcnt = 0;
      temp->wakevent = 0;
--- 1044,1050 ----
  	    i++;
      temp->name[31] = '\0';
      temp->status = READY;
!     temp->eventlist = (void **)malloc(EVINITSIZE * sizeof(void *));
      temp->eventlistsize = EVINITSIZE;
      temp->eventcnt = 0;
      temp->wakevent = 0;
***************
*** 1066,1072 ****
  }
  
  static int
! Internal_Signal(register char *event)
  {
      int rc = LWP_ENOWAIT;
      register int i;
--- 1072,1078 ----
  }
  
  static int
! Internal_Signal(register void *event)
  {
      int rc = LWP_ENOWAIT;
      register int i;
***************
*** 1256,1268 ****
  
  #ifdef	AFS_SUN5_ENV
  int
! LWP_NoYieldSignal(char *event)
  {
      return (LWP_INTERNALSIGNAL(event, 0));
  }
  
  int
! LWP_SignalProcess(char *event)
  {
      return (LWP_INTERNALSIGNAL(event, 1));
  }
--- 1262,1274 ----
  
  #ifdef	AFS_SUN5_ENV
  int
! LWP_NoYieldSignal(void *event)
  {
      return (LWP_INTERNALSIGNAL(event, 0));
  }
  
  int
! LWP_SignalProcess(void *event)
  {
      return (LWP_INTERNALSIGNAL(event, 1));
  }
***************
*** 1287,1293 ****
  
  typedef struct event {
      struct event *next;		/* next in hash chain */
!     char *event;		/* lwp event: an address */
      int refcount;		/* Is it in use? */
      pthread_cond_t cond;	/* Currently associated condition variable */
      int seq;			/* Sequence number: this is incremented
--- 1293,1299 ----
  
  typedef struct event {
      struct event *next;		/* next in hash chain */
!     void *event;		/* lwp event: an address */
      int refcount;		/* Is it in use? */
      pthread_cond_t cond;	/* Currently associated condition variable */
      int seq;			/* Sequence number: this is incremented
***************
*** 1512,1518 ****
  
  /* Get and initialize event structure corresponding to lwp event (i.e. address) */
  static event_t *
! getevent(char *event)
  {
      event_t *evp, *newp;
      int hashcode;
--- 1518,1524 ----
  
  /* Get and initialize event structure corresponding to lwp event (i.e. address) */
  static event_t *
! getevent(void *event)
  {
      event_t *evp, *newp;
      int hashcode;
***************
*** 1546,1552 ****
  #define relevent(evp) ((evp)->refcount--)
  
  int
! LWP_WaitProcess(char *event)
  {				/* wait on a single event */
      struct event *ev;
      int seq;
--- 1552,1558 ----
  #define relevent(evp) ((evp)->refcount--)
  
  int
! LWP_WaitProcess(void *event)
  {				/* wait on a single event */
      struct event *ev;
      int seq;
***************
*** 1570,1576 ****
  }
  
  int
! LWP_NoYieldSignal(char *event)
  {
      struct event *ev;
      debugf(("%s: no yield signal (%x)\n", lwp_process_string(), event));
--- 1576,1582 ----
  }
  
  int
! LWP_NoYieldSignal(void *event)
  {
      struct event *ev;
      debugf(("%s: no yield signal (%x)\n", lwp_process_string(), event));
***************
*** 1586,1592 ****
  }
  
  int
! LWP_SignalProcess(char *event)
  {
      struct event *ev;
      debugf(("%s: signal process (%x)\n", lwp_process_string(), event));
--- 1592,1598 ----
  }
  
  int
! LWP_SignalProcess(void *event)
  {
      struct event *ev;
      debugf(("%s: signal process (%x)\n", lwp_process_string(), event));
Index: openafs/src/lwp/lwp.h
diff -c openafs/src/lwp/lwp.h:1.17 openafs/src/lwp/lwp.h:1.17.6.2
*** openafs/src/lwp/lwp.h:1.17	Sun Apr  3 14:13:32 2005
--- openafs/src/lwp/lwp.h	Thu Mar 13 09:42:19 2008
***************
*** 223,229 ****
      char blockflag;		/* if (blockflag), process blocked */
      char eventlistsize;		/* size of eventlist array */
      char padding;		/* force 32-bit alignment */
!     char **eventlist;		/* ptr to array of eventids */
      int eventcnt;		/* no. of events currently in eventlist array */
      int wakevent;		/* index of eventid causing wakeup */
      int waitcnt;		/* min number of events awaited */
--- 223,229 ----
      char blockflag;		/* if (blockflag), process blocked */
      char eventlistsize;		/* size of eventlist array */
      char padding;		/* force 32-bit alignment */
!     void **eventlist;		/* ptr to array of eventids */
      int eventcnt;		/* no. of events currently in eventlist array */
      int wakevent;		/* index of eventid causing wakeup */
      int waitcnt;		/* min number of events awaited */
***************
*** 232,238 ****
      char *stack;		/* ptr to process stack */
      int stacksize;		/* size of stack */
      int stackcheck;		/* first word of stack for overflow checking */
!     int (*ep) ();		/* initial entry point */
      char *parm;			/* initial parm for process */
      struct lwp_context
        context;			/* saved context for next dispatch */
--- 232,238 ----
      char *stack;		/* ptr to process stack */
      int stacksize;		/* size of stack */
      int stackcheck;		/* first word of stack for overflow checking */
!     void *(*ep)(void *);	/* initial entry point */
      char *parm;			/* initial parm for process */
      struct lwp_context
        context;			/* saved context for next dispatch */
***************
*** 348,354 ****
  extern int IOMGR_Cancel(PROCESS pid);
  extern int IOMGR_Initialize(void);
  extern void IOMGR_FreeFDSet(fd_set * fds);
! extern int IOMGR_SoftSig(int (*aproc) (), char *arock);
  
  
  /* fasttime.c */
--- 348,354 ----
  extern int IOMGR_Cancel(PROCESS pid);
  extern int IOMGR_Initialize(void);
  extern void IOMGR_FreeFDSet(fd_set * fds);
! extern int IOMGR_SoftSig(void *(*aproc) (void *), void *arock);
  
  
  /* fasttime.c */
***************
*** 374,388 ****
  extern int LWP_QSignal(PROCESS pid);
  #else
  extern int LWP_CurrentProcess(PROCESS * pid);
! extern int LWP_INTERNALSIGNAL(char *event, int yield);
  extern int LWP_InitializeProcessSupport(int priority, PROCESS * pid);
! extern int LWP_CreateProcess(int (*ep) (), int stacksize, int priority,
  			     void *parm, char *name, PROCESS * pid);
  extern int LWP_DestroyProcess(PROCESS pid);
! extern int LWP_WaitProcess(char *event);
  extern PROCESS LWP_ThreadId(void);
  #endif
  
  #ifdef AFS_LINUX24_ENV
  /* max time we are allowed to spend in a select call on Linux to avoid 
   lost signal issues */
--- 374,395 ----
  extern int LWP_QSignal(PROCESS pid);
  #else
  extern int LWP_CurrentProcess(PROCESS * pid);
! extern int LWP_INTERNALSIGNAL(void *event, int yield);
  extern int LWP_InitializeProcessSupport(int priority, PROCESS * pid);
! extern int LWP_CreateProcess(void *(*ep)(void *), int stacksize, int priority,
  			     void *parm, char *name, PROCESS * pid);
  extern int LWP_DestroyProcess(PROCESS pid);
! extern int LWP_DispatchProcess(void);
! extern int LWP_WaitProcess(void *event);
  extern PROCESS LWP_ThreadId(void);
+ extern int LWP_QWait(void);
+ extern int LWP_QSignal(register PROCESS pid);
  #endif
  
+ extern afs_int32 savecontext(void (*ep)(void), 
+ 			     struct lwp_context *savearea, char *sp);
+ extern void returnto(struct lwp_context *savearea);
+ 
  #ifdef AFS_LINUX24_ENV
  /* max time we are allowed to spend in a select call on Linux to avoid 
   lost signal issues */
Index: openafs/src/lwp/preempt.c
diff -c openafs/src/lwp/preempt.c:1.17 openafs/src/lwp/preempt.c:1.17.4.1
*** openafs/src/lwp/preempt.c:1.17	Sat Jun 18 19:20:45 2005
--- openafs/src/lwp/preempt.c	Mon Mar 10 18:32:33 2008
***************
*** 17,23 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/lwp/preempt.c,v 1.17 2005/06/18 23:20:45 shadow Exp $");
  
  
  #include "lwp.h"
--- 17,23 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/lwp/preempt.c,v 1.17.4.1 2008/03/10 22:32:33 shadow Exp $");
  
  
  #include "lwp.h"
***************
*** 34,40 ****
  }
  
  int
! PRE_EndPreempt()
  {
      return LWP_SUCCESS;
  }
--- 34,40 ----
  }
  
  int
! PRE_EndPreempt(void)
  {
      return LWP_SUCCESS;
  }
Index: openafs/src/lwp/process.c
diff -c openafs/src/lwp/process.c:1.23.2.2 openafs/src/lwp/process.c:1.23.2.7
*** openafs/src/lwp/process.c:1.23.2.2	Mon Jul 16 23:12:36 2007
--- openafs/src/lwp/process.c	Thu Mar 13 09:42:19 2008
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/lwp/process.c,v 1.23.2.2 2007/07/17 03:12:36 shadow Exp $");
  
  #include <stdio.h>
  #include <assert.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/lwp/process.c,v 1.23.2.7 2008/03/13 13:42:19 shadow Exp $");
  
  #include <stdio.h>
  #include <assert.h>
***************
*** 31,37 ****
  #if defined(USE_UCONTEXT) && defined(HAVE_UCONTEXT_H)
  
  afs_int32
! savecontext(char (*ep) (), struct lwp_context *savearea, char *newsp)
  {
  #if defined(AFS_LINUX20_ENV)
      /* getcontext does not export stack info */
--- 31,37 ----
  #if defined(USE_UCONTEXT) && defined(HAVE_UCONTEXT_H)
  
  afs_int32
! savecontext(void (*ep) (void), struct lwp_context *savearea, char *newsp)
  {
  #if defined(AFS_LINUX20_ENV)
      /* getcontext does not export stack info */
***************
*** 69,76 ****
  }
  
  void
! returnto(savearea)
!      struct lwp_context *savearea;
  {
      PRE_Block = 0;
  
--- 69,75 ----
  }
  
  void
! returnto(struct lwp_context *savearea)
  {
      PRE_Block = 0;
  
***************
*** 138,144 ****
  #endif /*SGI*/
  
      static jmp_buf jmp_tmp;
! static char (*EP) ();
  static int rc;
  static jmp_buf_type *jmpBuffer;
  
--- 137,143 ----
  #endif /*SGI*/
  
      static jmp_buf jmp_tmp;
! static void *(*EP) (void);
  static int rc;
  static jmp_buf_type *jmpBuffer;
  
***************
*** 172,181 ****
  
  
  afs_int32
! savecontext(ep, savearea, sp)
!      char (*ep) ();
!      struct lwp_context *savearea;
!      char *sp;
  {
      int code;
  
--- 171,177 ----
  
  
  afs_int32
! savecontext(void (*ep)(void), struct lwp_context *savearea, char *sp)
  {
      int code;
  
***************
*** 233,239 ****
      return 0;
  }
  
! afs_int32
  returnto(struct lwp_context * savearea)
  {
  #if	defined(DEBUG)
--- 229,235 ----
      return 0;
  }
  
! void
  returnto(struct lwp_context * savearea)
  {
  #if	defined(DEBUG)
***************
*** 249,255 ****
  #endif
      PRE_Block = 0;
      longjmp(savearea->setjmp_buffer, 2);
!     return 0;
  }
  
  #endif
--- 245,251 ----
  #endif
      PRE_Block = 0;
      longjmp(savearea->setjmp_buffer, 2);
!     return;
  }
  
  #endif
Index: openafs/src/lwp/timer.h
diff -c openafs/src/lwp/timer.h:1.5 openafs/src/lwp/timer.h:1.5.14.1
*** openafs/src/lwp/timer.h:1.5	Tue Jul 15 19:15:46 2003
--- openafs/src/lwp/timer.h	Mon Mar 10 18:32:33 2008
***************
*** 30,42 ****
  #ifndef _TIMER_IMPL_
  #define Tm_Insert(list, elem) openafs_insque(list, elem)
  #define TM_Remove(list, elem) openafs_remque(elem)
! extern int TM_Rescan();
! void TM_Insert();
! extern struct TM_Elem *TM_GetExpired();
! extern struct TM_Elem *TM_GetEarliest();
  #endif
  
! extern int TM_Final();
  
  #define FOR_ALL_ELTS(var, list, body)\
  	{\
--- 30,43 ----
  #ifndef _TIMER_IMPL_
  #define Tm_Insert(list, elem) openafs_insque(list, elem)
  #define TM_Remove(list, elem) openafs_remque(elem)
! extern int TM_Rescan(struct TM_Elem *tlist);
! void TM_Insert(struct TM_Elem *tlistPtr, struct TM_Elem *elem);
! extern struct TM_Elem *TM_GetExpired(struct TM_Elem *tlist);
! extern struct TM_Elem *TM_GetEarliest(struct TM_Elem *tlist);
  #endif
  
! extern int TM_Init(register struct TM_Elem **list);
! extern int TM_Final(register struct TM_Elem **list);
  
  #define FOR_ALL_ELTS(var, list, body)\
  	{\
Index: openafs/src/ptserver/pt_util.c
diff -c openafs/src/ptserver/pt_util.c:1.11.4.2 openafs/src/ptserver/pt_util.c:1.11.4.3
*** openafs/src/ptserver/pt_util.c:1.11.4.2	Wed Oct 31 00:09:32 2007
--- openafs/src/ptserver/pt_util.c	Sat Mar  8 20:58:49 2008
***************
*** 1,4 ****
! /* $Id: pt_util.c,v 1.11.4.2 2007/10/31 04:09:32 shadow Exp $ */
  
  /*
   *
--- 1,4 ----
! /* $Id: pt_util.c,v 1.11.4.3 2008/03/09 01:58:49 jaltman Exp $ */
  
  /*
   *
***************
*** 23,29 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ptserver/pt_util.c,v 1.11.4.2 2007/10/31 04:09:32 shadow Exp $");
  
  #include <afs/cmd.h>		/*Command line parsing */
  #include <errno.h>
--- 23,29 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ptserver/pt_util.c,v 1.11.4.3 2008/03/09 01:58:49 jaltman Exp $");
  
  #include <afs/cmd.h>		/*Command line parsing */
  #include <errno.h>
***************
*** 33,38 ****
--- 33,39 ----
  #include <ubik.h>
  #include <rx/xdr.h>
  #include <rx/rx.h>
+ #include <afs/com_err.h>
  #include "ptint.h"
  #include "ptserver.h"
  #include "pterror.h"
Index: openafs/src/ptserver/pts.c
diff -c openafs/src/ptserver/pts.c:1.15.2.4 openafs/src/ptserver/pts.c:1.15.2.5
*** openafs/src/ptserver/pts.c:1.15.2.4	Mon Feb  4 12:53:43 2008
--- openafs/src/ptserver/pts.c	Tue Mar 18 11:58:54 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ptserver/pts.c,v 1.15.2.4 2008/02/04 17:53:43 shadow Exp $");
  
  #include <stdio.h>
  #include <string.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ptserver/pts.c,v 1.15.2.5 2008/03/18 15:58:54 shadow Exp $");
  
  #include <stdio.h>
  #include <string.h>
***************
*** 59,64 ****
--- 59,65 ----
  int
  pts_Interactive(struct cmd_syndesc *as, void *arock)
  {
+     source = stdin;
      finished = 0;
      return 0;
  }
***************
*** 1177,1188 ****
      cmd_SetBeforeProc(GetGlobals, &state);
  
      finished = 1;
!     source = stdin;
      if (code = cmd_Dispatch(argc, argv)) {
  	CleanUp(NULL, NULL);
  	exit(1);
      }
!     while (!finished) {
  	if (isatty(fileno(source)))
  	    fprintf(stderr, "pts> ");
  	if (!fgets(line, sizeof line, source)) {
--- 1178,1189 ----
      cmd_SetBeforeProc(GetGlobals, &state);
  
      finished = 1;
!     source = NULL;
      if (code = cmd_Dispatch(argc, argv)) {
  	CleanUp(NULL, NULL);
  	exit(1);
      }
!     while (source && !finished) {
  	if (isatty(fileno(source)))
  	    fprintf(stderr, "pts> ");
  	if (!fgets(line, sizeof line, source)) {
Index: openafs/src/rx/rx.c
diff -c openafs/src/rx/rx.c:1.97.2.14 openafs/src/rx/rx.c:1.97.2.19
*** openafs/src/rx/rx.c:1.97.2.14	Mon Feb 18 12:29:16 2008
--- openafs/src/rx/rx.c	Mon Mar 17 13:57:18 2008
***************
*** 17,23 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx.c,v 1.97.2.14 2008/02/18 17:29:16 jaltman Exp $");
  
  #ifdef KERNEL
  #include "afs/sysincludes.h"
--- 17,23 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx.c,v 1.97.2.19 2008/03/17 17:57:18 shadow Exp $");
  
  #ifdef KERNEL
  #include "afs/sysincludes.h"
***************
*** 658,665 ****
  rx_StartClientThread(void)
  {
  #ifdef AFS_PTHREAD_ENV
!     int pid;
!     pid = (int) pthread_self();
  #endif /* AFS_PTHREAD_ENV */
  }
  #endif /* AFS_NT40_ENV */
--- 658,665 ----
  rx_StartClientThread(void)
  {
  #ifdef AFS_PTHREAD_ENV
!     pthread_t pid;
!     pid = pthread_self();
  #endif /* AFS_PTHREAD_ENV */
  }
  #endif /* AFS_NT40_ENV */
***************
*** 722,728 ****
  	    (*registerProgram) (pid, name);
  #endif /* KERNEL */
  #endif /* AFS_NT40_ENV */
! 	rx_ServerProc();	/* Never returns */
      }
  #ifdef RX_ENABLE_TSFPQ
      /* no use leaving packets around in this thread's local queue if
--- 722,728 ----
  	    (*registerProgram) (pid, name);
  #endif /* KERNEL */
  #endif /* AFS_NT40_ENV */
! 	rx_ServerProc(NULL);	/* Never returns */
      }
  #ifdef RX_ENABLE_TSFPQ
      /* no use leaving packets around in this thread's local queue if
***************
*** 785,794 ****
      conn->refCount++;		/* no lock required since only this thread knows... */
      conn->next = rx_connHashTable[hashindex];
      rx_connHashTable[hashindex] = conn;
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.nClientConns++;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
      MUTEX_EXIT(&rx_connHashTable_lock);
      USERPRI;
      return conn;
--- 785,791 ----
      conn->refCount++;		/* no lock required since only this thread knows... */
      conn->next = rx_connHashTable[hashindex];
      rx_connHashTable[hashindex] = conn;
!     rx_MutexIncrement(rx_stats.nClientConns, rx_stats_mutex);
      MUTEX_EXIT(&rx_connHashTable_lock);
      USERPRI;
      return conn;
***************
*** 838,850 ****
      conn->peer->refCount--;
      MUTEX_EXIT(&rx_peerHashTable_lock);
  
-     MUTEX_ENTER(&rx_stats_mutex);
      if (conn->type == RX_SERVER_CONNECTION)
! 	rx_stats.nServerConns--;
      else
! 	rx_stats.nClientConns--;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
  #ifndef KERNEL
      if (conn->specific) {
  	int i;
--- 835,844 ----
      conn->peer->refCount--;
      MUTEX_EXIT(&rx_peerHashTable_lock);
  
      if (conn->type == RX_SERVER_CONNECTION)
! 	rx_MutexDecrement(rx_stats.nServerConns, rx_stats_mutex);
      else
! 	rx_MutexDecrement(rx_stats.nClientConns, rx_stats_mutex);
  #ifndef KERNEL
      if (conn->specific) {
  	int i;
***************
*** 2124,2132 ****
  	call = queue_First(&rx_freeCallQueue, rx_call);
  #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
  	queue_Remove(call);
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_stats.nFreeCallStructs--;
! 	MUTEX_EXIT(&rx_stats_mutex);
  	MUTEX_EXIT(&rx_freeCallQueue_lock);
  	MUTEX_ENTER(&call->lock);
  	CLEAR_CALL_QUEUE_LOCK(call);
--- 2118,2124 ----
  	call = queue_First(&rx_freeCallQueue, rx_call);
  #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
  	queue_Remove(call);
!         rx_MutexDecrement(rx_stats.nFreeCallStructs, rx_stats_mutex);
  	MUTEX_EXIT(&rx_freeCallQueue_lock);
  	MUTEX_ENTER(&call->lock);
  	CLEAR_CALL_QUEUE_LOCK(call);
***************
*** 2150,2158 ****
  	CV_INIT(&call->cv_rq, "call rq", CV_DEFAULT, 0);
  	CV_INIT(&call->cv_tq, "call tq", CV_DEFAULT, 0);
  
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_stats.nCallStructs++;
! 	MUTEX_EXIT(&rx_stats_mutex);
  	/* Initialize once-only items */
  	queue_Init(&call->tq);
  	queue_Init(&call->rq);
--- 2142,2148 ----
  	CV_INIT(&call->cv_rq, "call rq", CV_DEFAULT, 0);
  	CV_INIT(&call->cv_tq, "call tq", CV_DEFAULT, 0);
  
!         rx_MutexIncrement(rx_stats.nFreeCallStructs, rx_stats_mutex);
  	/* Initialize once-only items */
  	queue_Init(&call->tq);
  	queue_Init(&call->rq);
***************
*** 2212,2221 ****
  #else /* AFS_GLOBAL_RXLOCK_KERNEL */
      queue_Append(&rx_freeCallQueue, call);
  #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.nFreeCallStructs++;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
      MUTEX_EXIT(&rx_freeCallQueue_lock);
  
      /* Destroy the connection if it was previously slated for
--- 2202,2208 ----
  #else /* AFS_GLOBAL_RXLOCK_KERNEL */
      queue_Append(&rx_freeCallQueue, call);
  #endif /* AFS_GLOBAL_RXLOCK_KERNEL */
!     rx_MutexIncrement(rx_stats.nFreeCallStructs, rx_stats_mutex);
      MUTEX_EXIT(&rx_freeCallQueue_lock);
  
      /* Destroy the connection if it was previously slated for
***************
*** 2251,2261 ****
  {
      register char *p;
  
!     MUTEX_ENTER(&rx_stats_mutex);
!     rxi_Alloccnt++;
!     rxi_Allocsize += (afs_int32)size;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
      p = (char *)osi_Alloc(size);
  
      if (!p)
--- 2238,2244 ----
  {
      register char *p;
  
!     rx_MutexAdd1Increment2(rxi_Allocsize, (afs_int32)size, rxi_Alloccnt, rx_stats_mutex);
      p = (char *)osi_Alloc(size);
  
      if (!p)
***************
*** 2267,2277 ****
  void
  rxi_Free(void *addr, register size_t size)
  {
!     MUTEX_ENTER(&rx_stats_mutex);
!     rxi_Alloccnt--;
!     rxi_Allocsize -= (afs_int32)size;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
      osi_Free(addr, size);
  }
  
--- 2250,2256 ----
  void
  rxi_Free(void *addr, register size_t size)
  {
!     rx_MutexAdd1Decrement2(rxi_Allocsize, -(afs_int32)size, rxi_Alloccnt, rx_stats_mutex);
      osi_Free(addr, size);
  }
  
***************
*** 2304,2312 ****
  	    pp->next = rx_peerHashTable[hashIndex];
  	    rx_peerHashTable[hashIndex] = pp;
  	    rxi_InitPeerParams(pp);
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.nPeerStructs++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	}
      }
      if (pp && create) {
--- 2283,2289 ----
  	    pp->next = rx_peerHashTable[hashIndex];
  	    rx_peerHashTable[hashIndex] = pp;
  	    rxi_InitPeerParams(pp);
! 	    rx_MutexIncrement(rx_stats.nPeerStructs, rx_stats_mutex);
  	}
      }
      if (pp && create) {
***************
*** 2411,2419 ****
  	/* XXXX Connection timeout? */
  	if (service->newConnProc)
  	    (*service->newConnProc) (conn);
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_stats.nServerConns++;
! 	MUTEX_EXIT(&rx_stats_mutex);
      }
  
      MUTEX_ENTER(&conn->conn_data_lock);
--- 2388,2394 ----
  	/* XXXX Connection timeout? */
  	if (service->newConnProc)
  	    (*service->newConnProc) (conn);
!         rx_MutexIncrement(rx_stats.nServerConns, rx_stats_mutex);
      }
  
      MUTEX_ENTER(&conn->conn_data_lock);
***************
*** 2611,2619 ****
  	     * then, since this is a client connection we're getting data for
  	     * it must be for the previous call.
  	     */
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.spuriousPacketsRead++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	    MUTEX_ENTER(&conn->conn_data_lock);
  	    conn->refCount--;
  	    MUTEX_EXIT(&conn->conn_data_lock);
--- 2586,2592 ----
  	     * then, since this is a client connection we're getting data for
  	     * it must be for the previous call.
  	     */
! 	    rx_MutexIncrement(rx_stats.spuriousPacketsRead, rx_stats_mutex);
  	    MUTEX_ENTER(&conn->conn_data_lock);
  	    conn->refCount--;
  	    MUTEX_EXIT(&conn->conn_data_lock);
***************
*** 2625,2633 ****
  
      if (type == RX_SERVER_CONNECTION) {	/* We're the server */
  	if (np->header.callNumber < currentCallNumber) {
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.spuriousPacketsRead++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  #ifdef	RX_ENABLE_LOCKS
  	    if (call)
  		MUTEX_EXIT(&call->lock);
--- 2598,2604 ----
  
      if (type == RX_SERVER_CONNECTION) {	/* We're the server */
  	if (np->header.callNumber < currentCallNumber) {
! 	    rx_MutexIncrement(rx_stats.spuriousPacketsRead, rx_stats_mutex);
  #ifdef	RX_ENABLE_LOCKS
  	    if (call)
  		MUTEX_EXIT(&call->lock);
***************
*** 2662,2670 ****
  		MUTEX_ENTER(&conn->conn_data_lock);
  		conn->refCount--;
  		MUTEX_EXIT(&conn->conn_data_lock);
! 		MUTEX_ENTER(&rx_stats_mutex);
! 		rx_stats.nBusies++;
! 		MUTEX_EXIT(&rx_stats_mutex);
  		return tp;
  	    }
  	    rxi_KeepAliveOn(call);
--- 2633,2639 ----
  		MUTEX_ENTER(&conn->conn_data_lock);
  		conn->refCount--;
  		MUTEX_EXIT(&conn->conn_data_lock);
!                 rx_MutexIncrement(rx_stats.nBusies, rx_stats_mutex);
  		return tp;
  	    }
  	    rxi_KeepAliveOn(call);
***************
*** 2727,2735 ****
  		MUTEX_ENTER(&conn->conn_data_lock);
  		conn->refCount--;
  		MUTEX_EXIT(&conn->conn_data_lock);
! 		MUTEX_ENTER(&rx_stats_mutex);
! 		rx_stats.nBusies++;
! 		MUTEX_EXIT(&rx_stats_mutex);
  		return tp;
  	    }
  	    rxi_KeepAliveOn(call);
--- 2696,2702 ----
  		MUTEX_ENTER(&conn->conn_data_lock);
  		conn->refCount--;
  		MUTEX_EXIT(&conn->conn_data_lock);
!                 rx_MutexIncrement(rx_stats.nBusies, rx_stats_mutex);
  		return tp;
  	    }
  	    rxi_KeepAliveOn(call);
***************
*** 2740,2748 ****
  	/* Ignore all incoming acknowledgements for calls in DALLY state */
  	if (call && (call->state == RX_STATE_DALLY)
  	    && (np->header.type == RX_PACKET_TYPE_ACK)) {
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.ignorePacketDally++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  #ifdef  RX_ENABLE_LOCKS
  	    if (call) {
  		MUTEX_EXIT(&call->lock);
--- 2707,2713 ----
  	/* Ignore all incoming acknowledgements for calls in DALLY state */
  	if (call && (call->state == RX_STATE_DALLY)
  	    && (np->header.type == RX_PACKET_TYPE_ACK)) {
! 	    rx_MutexIncrement(rx_stats.ignorePacketDally, rx_stats_mutex);
  #ifdef  RX_ENABLE_LOCKS
  	    if (call) {
  		MUTEX_EXIT(&call->lock);
***************
*** 2757,2765 ****
  	/* Ignore anything that's not relevant to the current call.  If there
  	 * isn't a current call, then no packet is relevant. */
  	if (!call || (np->header.callNumber != currentCallNumber)) {
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.spuriousPacketsRead++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  #ifdef	RX_ENABLE_LOCKS
  	    if (call) {
  		MUTEX_EXIT(&call->lock);
--- 2722,2728 ----
  	/* Ignore anything that's not relevant to the current call.  If there
  	 * isn't a current call, then no packet is relevant. */
  	if (!call || (np->header.callNumber != currentCallNumber)) {
! 	    rx_MutexIncrement(rx_stats.spuriousPacketsRead, rx_stats_mutex);
  #ifdef	RX_ENABLE_LOCKS
  	    if (call) {
  		MUTEX_EXIT(&call->lock);
***************
*** 2824,2832 ****
  		 * XXX interact badly with the server-restart detection 
  		 * XXX code in receiveackpacket.  */
  		if (ntohl(rx_GetInt32(np, FIRSTACKOFFSET)) < call->tfirst) {
! 		    MUTEX_ENTER(&rx_stats_mutex);
! 		    rx_stats.spuriousPacketsRead++;
! 		    MUTEX_EXIT(&rx_stats_mutex);
  		    MUTEX_EXIT(&call->lock);
  		    MUTEX_ENTER(&conn->conn_data_lock);
  		    conn->refCount--;
--- 2787,2793 ----
  		 * XXX interact badly with the server-restart detection 
  		 * XXX code in receiveackpacket.  */
  		if (ntohl(rx_GetInt32(np, FIRSTACKOFFSET)) < call->tfirst) {
!                     rx_MutexIncrement(rx_stats.spuriousPacketsRead, rx_stats_mutex);
  		    MUTEX_EXIT(&call->lock);
  		    MUTEX_ENTER(&conn->conn_data_lock);
  		    conn->refCount--;
***************
*** 3001,3007 ****
  		    struct rx_call *acall)
  {
      struct rx_call *call = acall;
!     struct clock when;
      int i, waiting;
  
      MUTEX_ENTER(&conn->conn_data_lock);
--- 2962,2968 ----
  		    struct rx_call *acall)
  {
      struct rx_call *call = acall;
!     struct clock when, now;
      int i, waiting;
  
      MUTEX_ENTER(&conn->conn_data_lock);
***************
*** 3040,3052 ****
  	    if (call != acall)
  		MUTEX_EXIT(&call->lock);
  
! 	    clock_GetTime(&when);
  	    when.sec += RX_CHECKREACH_TIMEOUT;
  	    MUTEX_ENTER(&conn->conn_data_lock);
  	    if (!conn->checkReachEvent) {
  		conn->refCount++;
  		conn->checkReachEvent =
! 		    rxevent_Post(&when, rxi_CheckReachEvent, conn, NULL);
  	    }
  	    MUTEX_EXIT(&conn->conn_data_lock);
  	}
--- 3001,3015 ----
  	    if (call != acall)
  		MUTEX_EXIT(&call->lock);
  
! 	    clock_GetTime(&now);
! 	    when = now;
  	    when.sec += RX_CHECKREACH_TIMEOUT;
  	    MUTEX_ENTER(&conn->conn_data_lock);
  	    if (!conn->checkReachEvent) {
  		conn->refCount++;
  		conn->checkReachEvent =
! 		    rxevent_PostNow(&when, &now, rxi_CheckReachEvent, conn, 
! 				    NULL);
  	    }
  	    MUTEX_EXIT(&conn->conn_data_lock);
  	}
***************
*** 3123,3132 ****
      afs_uint32 seq, serial, flags;
      int isFirst;
      struct rx_packet *tnp;
!     struct clock when;
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.dataPacketsRead++;
!     MUTEX_EXIT(&rx_stats_mutex);
  
  #ifdef KERNEL
      /* If there are no packet buffers, drop this new packet, unless we can find
--- 3086,3093 ----
      afs_uint32 seq, serial, flags;
      int isFirst;
      struct rx_packet *tnp;
!     struct clock when, now;
!     rx_MutexIncrement(rx_stats.dataPacketsRead, rx_stats_mutex);
  
  #ifdef KERNEL
      /* If there are no packet buffers, drop this new packet, unless we can find
***************
*** 3136,3150 ****
  	MUTEX_ENTER(&rx_freePktQ_lock);
  	rxi_NeedMorePackets = TRUE;
  	MUTEX_EXIT(&rx_freePktQ_lock);
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_stats.noPacketBuffersOnRead++;
! 	MUTEX_EXIT(&rx_stats_mutex);
  	call->rprev = np->header.serial;
  	rxi_calltrace(RX_TRACE_DROP, call);
  	dpf(("packet %x dropped on receipt - quota problems", np));
  	if (rxi_doreclaim)
  	    rxi_ClearReceiveQueue(call);
! 	clock_GetTime(&when);
  	clock_Add(&when, &rx_softAckDelay);
  	if (!call->delayedAckEvent
  	    || clock_Gt(&call->delayedAckEvent->eventTime, &when)) {
--- 3097,3110 ----
  	MUTEX_ENTER(&rx_freePktQ_lock);
  	rxi_NeedMorePackets = TRUE;
  	MUTEX_EXIT(&rx_freePktQ_lock);
!         rx_MutexIncrement(rx_stats.noPacketBuffersOnRead, rx_stats_mutex);
  	call->rprev = np->header.serial;
  	rxi_calltrace(RX_TRACE_DROP, call);
  	dpf(("packet %x dropped on receipt - quota problems", np));
  	if (rxi_doreclaim)
  	    rxi_ClearReceiveQueue(call);
! 	clock_GetTime(&now);
! 	when = now;
  	clock_Add(&when, &rx_softAckDelay);
  	if (!call->delayedAckEvent
  	    || clock_Gt(&call->delayedAckEvent->eventTime, &when)) {
***************
*** 3152,3158 ****
  			   RX_CALL_REFCOUNT_DELAY);
  	    CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  	    call->delayedAckEvent =
! 		rxevent_Post(&when, rxi_SendDelayedAck, call, 0);
  	}
  	/* we've damaged this call already, might as well do it in. */
  	return np;
--- 3112,3118 ----
  			   RX_CALL_REFCOUNT_DELAY);
  	    CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  	    call->delayedAckEvent =
! 		rxevent_PostNow(&when, &now, rxi_SendDelayedAck, call, 0);
  	}
  	/* we've damaged this call already, might as well do it in. */
  	return np;
***************
*** 3202,3210 ****
  	    /* Check to make sure it is not a duplicate of one already queued */
  	    if (queue_IsNotEmpty(&call->rq)
  		&& queue_First(&call->rq, rx_packet)->header.seq == seq) {
! 		MUTEX_ENTER(&rx_stats_mutex);
! 		rx_stats.dupPacketsRead++;
! 		MUTEX_EXIT(&rx_stats_mutex);
  		dpf(("packet %x dropped on receipt - duplicate", np));
  		rxevent_Cancel(call->delayedAckEvent, call,
  			       RX_CALL_REFCOUNT_DELAY);
--- 3162,3168 ----
  	    /* Check to make sure it is not a duplicate of one already queued */
  	    if (queue_IsNotEmpty(&call->rq)
  		&& queue_First(&call->rq, rx_packet)->header.seq == seq) {
!                 rx_MutexIncrement(rx_stats.dupPacketsRead, rx_stats_mutex);
  		dpf(("packet %x dropped on receipt - duplicate", np));
  		rxevent_Cancel(call->delayedAckEvent, call,
  			       RX_CALL_REFCOUNT_DELAY);
***************
*** 3288,3296 ****
  	    /* If the new packet's sequence number has been sent to the
  	     * application already, then this is a duplicate */
  	    if (seq < call->rnext) {
! 		MUTEX_ENTER(&rx_stats_mutex);
! 		rx_stats.dupPacketsRead++;
! 		MUTEX_EXIT(&rx_stats_mutex);
  		rxevent_Cancel(call->delayedAckEvent, call,
  			       RX_CALL_REFCOUNT_DELAY);
  		np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE, istack);
--- 3246,3252 ----
  	    /* If the new packet's sequence number has been sent to the
  	     * application already, then this is a duplicate */
  	    if (seq < call->rnext) {
!                 rx_MutexIncrement(rx_stats.dupPacketsRead, rx_stats_mutex);
  		rxevent_Cancel(call->delayedAckEvent, call,
  			       RX_CALL_REFCOUNT_DELAY);
  		np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE, istack);
***************
*** 3317,3325 ****
  		 0, queue_Scan(&call->rq, tp, nxp, rx_packet)) {
  		/*Check for duplicate packet */
  		if (seq == tp->header.seq) {
! 		    MUTEX_ENTER(&rx_stats_mutex);
! 		    rx_stats.dupPacketsRead++;
! 		    MUTEX_EXIT(&rx_stats_mutex);
  		    rxevent_Cancel(call->delayedAckEvent, call,
  				   RX_CALL_REFCOUNT_DELAY);
  		    np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE,
--- 3273,3279 ----
  		 0, queue_Scan(&call->rq, tp, nxp, rx_packet)) {
  		/*Check for duplicate packet */
  		if (seq == tp->header.seq) {
!                     rx_MutexIncrement(rx_stats.dupPacketsRead, rx_stats_mutex);
  		    rxevent_Cancel(call->delayedAckEvent, call,
  				   RX_CALL_REFCOUNT_DELAY);
  		    np = rxi_SendAck(call, np, serial, RX_ACK_DUPLICATE,
***************
*** 3430,3436 ****
  	rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
  	np = rxi_SendAck(call, np, serial, RX_ACK_IDLE, istack);
      } else if (call->nSoftAcks) {
! 	clock_GetTime(&when);
  	if (haveLast && !(flags & RX_CLIENT_INITIATED)) {
  	    clock_Add(&when, &rx_lastAckDelay);
  	} else {
--- 3384,3391 ----
  	rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
  	np = rxi_SendAck(call, np, serial, RX_ACK_IDLE, istack);
      } else if (call->nSoftAcks) {
! 	clock_GetTime(&now);
! 	when = now;
  	if (haveLast && !(flags & RX_CLIENT_INITIATED)) {
  	    clock_Add(&when, &rx_lastAckDelay);
  	} else {
***************
*** 3442,3448 ****
  			   RX_CALL_REFCOUNT_DELAY);
  	    CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  	    call->delayedAckEvent =
! 		rxevent_Post(&when, rxi_SendDelayedAck, call, 0);
  	}
      } else if (call->flags & RX_CALL_RECEIVE_DONE) {
  	rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
--- 3397,3403 ----
  			   RX_CALL_REFCOUNT_DELAY);
  	    CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  	    call->delayedAckEvent =
! 		rxevent_PostNow(&when, &now, rxi_SendDelayedAck, call, 0);
  	}
      } else if (call->flags & RX_CALL_RECEIVE_DONE) {
  	rxevent_Cancel(call->delayedAckEvent, call, RX_CALL_REFCOUNT_DELAY);
***************
*** 3558,3566 ****
      u_short maxMTU = 0;		/* Set if peer supports AFS 3.4a jumbo datagrams */
      int maxDgramPackets = 0;	/* Set if peer supports AFS 3.5 jumbo datagrams */
  
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.ackPacketsRead++;
!     MUTEX_EXIT(&rx_stats_mutex);
      ap = (struct rx_ackPacket *)rx_DataOf(np);
      nbytes = rx_Contiguous(np) - (int)((ap->acks) - (u_char *) ap);
      if (nbytes < 0)
--- 3513,3519 ----
      u_short maxMTU = 0;		/* Set if peer supports AFS 3.4a jumbo datagrams */
      int maxDgramPackets = 0;	/* Set if peer supports AFS 3.5 jumbo datagrams */
  
!     rx_MutexIncrement(rx_stats.ackPacketsRead, rx_stats_mutex);
      ap = (struct rx_ackPacket *)rx_DataOf(np);
      nbytes = rx_Contiguous(np) - (int)((ap->acks) - (u_char *) ap);
      if (nbytes < 0)
***************
*** 3884,3892 ****
  	    call->nNacks = nNacked;
  	}
      } else {
! 	if (newAckCount) {
! 	    call->nAcks++;
! 	}
  	call->nNacks = 0;
      }
  
--- 3837,3843 ----
  	    call->nNacks = nNacked;
  	}
      } else {
! 	call->nAcks += newAckCount;
  	call->nNacks = 0;
      }
  
***************
*** 4320,4326 ****
  		  int istack, int force)
  {
      afs_int32 error;
!     struct clock when;
  
      if (!call->error)
  	return packet;
--- 4271,4277 ----
  		  int istack, int force)
  {
      afs_int32 error;
!     struct clock when, now;
  
      if (!call->error)
  	return packet;
***************
*** 4346,4356 ****
  	    rxi_SendSpecial(call, call->conn, packet, RX_PACKET_TYPE_ABORT,
  			    (char *)&error, sizeof(error), istack);
      } else if (!call->delayedAbortEvent) {
! 	clock_GetTime(&when);
  	clock_Addmsec(&when, rxi_callAbortDelay);
  	CALL_HOLD(call, RX_CALL_REFCOUNT_ABORT);
  	call->delayedAbortEvent =
! 	    rxevent_Post(&when, rxi_SendDelayedCallAbort, call, 0);
      }
      return packet;
  }
--- 4297,4308 ----
  	    rxi_SendSpecial(call, call->conn, packet, RX_PACKET_TYPE_ABORT,
  			    (char *)&error, sizeof(error), istack);
      } else if (!call->delayedAbortEvent) {
! 	clock_GetTime(&now);
! 	when = now;
  	clock_Addmsec(&when, rxi_callAbortDelay);
  	CALL_HOLD(call, RX_CALL_REFCOUNT_ABORT);
  	call->delayedAbortEvent =
! 	    rxevent_PostNow(&when, &now, rxi_SendDelayedCallAbort, call, 0);
      }
      return packet;
  }
***************
*** 4369,4375 ****
  			struct rx_packet *packet, int istack, int force)
  {
      afs_int32 error;
!     struct clock when;
  
      if (!conn->error)
  	return packet;
--- 4321,4327 ----
  			struct rx_packet *packet, int istack, int force)
  {
      afs_int32 error;
!     struct clock when, now;
  
      if (!conn->error)
  	return packet;
***************
*** 4392,4401 ****
  			    sizeof(error), istack);
  	MUTEX_ENTER(&conn->conn_data_lock);
      } else if (!conn->delayedAbortEvent) {
! 	clock_GetTime(&when);
  	clock_Addmsec(&when, rxi_connAbortDelay);
  	conn->delayedAbortEvent =
! 	    rxevent_Post(&when, rxi_SendDelayedConnAbort, conn, 0);
      }
      return packet;
  }
--- 4344,4354 ----
  			    sizeof(error), istack);
  	MUTEX_ENTER(&conn->conn_data_lock);
      } else if (!conn->delayedAbortEvent) {
! 	clock_GetTime(&now);
! 	when = now;
  	clock_Addmsec(&when, rxi_connAbortDelay);
  	conn->delayedAbortEvent =
! 	    rxevent_PostNow(&when, &now, rxi_SendDelayedConnAbort, conn, 0);
      }
      return packet;
  }
***************
*** 4433,4441 ****
  	    }
  	}
  	conn->error = error;
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_stats.fatalErrors++;
! 	MUTEX_EXIT(&rx_stats_mutex);
      }
  }
  
--- 4386,4392 ----
  	    }
  	}
  	conn->error = error;
!         rx_MutexIncrement(rx_stats.fatalErrors, rx_stats_mutex);
      }
  }
  
***************
*** 4849,4857 ****
  		nbytes -= p->wirevec[i].iov_len;
  	}
      }
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.ackPacketsSent++;
!     MUTEX_EXIT(&rx_stats_mutex);
  #ifndef RX_ENABLE_TSFPQ
      if (!optionalPacket)
  	rxi_FreePacket(p);
--- 4800,4806 ----
  		nbytes -= p->wirevec[i].iov_len;
  	}
      }
!     rx_MutexIncrement(rx_stats.ackPacketsSent, rx_stats_mutex);
  #ifndef RX_ENABLE_TSFPQ
      if (!optionalPacket)
  	rxi_FreePacket(p);
***************
*** 4875,4883 ****
      peer->nSent += len;
      if (resending)
  	peer->reSends += len;
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.dataPacketsSent += len;
!     MUTEX_EXIT(&rx_stats_mutex);
      MUTEX_EXIT(&peer->peer_lock);
  
      if (list[len - 1]->header.flags & RX_LAST_PACKET) {
--- 4824,4830 ----
      peer->nSent += len;
      if (resending)
  	peer->reSends += len;
!     rx_MutexIncrement(rx_stats.dataPacketsSent, rx_stats_mutex);
      MUTEX_EXIT(&peer->peer_lock);
  
      if (list[len - 1]->header.flags & RX_LAST_PACKET) {
***************
*** 4912,4920 ****
  	 * packet until the congestion window reaches the ack rate. */
  	if (list[i]->header.serial) {
  	    requestAck = 1;
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.dataPacketsReSent++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	} else {
  	    /* improved RTO calculation- not Karn */
  	    list[i]->firstSent = *now;
--- 4859,4865 ----
  	 * packet until the congestion window reaches the ack rate. */
  	if (list[i]->header.serial) {
  	    requestAck = 1;
! 	    rx_MutexIncrement(rx_stats.dataPacketsReSent, rx_stats_mutex);
  	} else {
  	    /* improved RTO calculation- not Karn */
  	    list[i]->firstSent = *now;
***************
*** 4929,4937 ****
  	peer->nSent++;
  	if (resending)
  	    peer->reSends++;
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_stats.dataPacketsSent++;
! 	MUTEX_EXIT(&rx_stats_mutex);
  	MUTEX_EXIT(&peer->peer_lock);
  
  	/* Tag this packet as not being the last in this group,
--- 4874,4880 ----
  	peer->nSent++;
  	if (resending)
  	    peer->reSends++;
!         rx_MutexIncrement(rx_stats.dataPacketsSent, rx_stats_mutex);
  	MUTEX_EXIT(&peer->peer_lock);
  
  	/* Tag this packet as not being the last in this group,
***************
*** 5091,5097 ****
      struct rx_packet *p;
      register struct rx_packet *nxp;	/* Next pointer for queue_Scan */
      struct rx_peer *peer = call->conn->peer;
!     struct clock now, retryTime;
      int haveEvent;
      int nXmitPackets;
      int maxXmitPackets;
--- 5034,5040 ----
      struct rx_packet *p;
      register struct rx_packet *nxp;	/* Next pointer for queue_Scan */
      struct rx_peer *peer = call->conn->peer;
!     struct clock now, usenow, retryTime;
      int haveEvent;
      int nXmitPackets;
      int maxXmitPackets;
***************
*** 5151,5159 ****
      }
      if (call->error) {
  #ifdef	AFS_GLOBAL_RXLOCK_KERNEL
! 	MUTEX_ENTER(&rx_stats_mutex);
! 	rx_tq_debug.rxi_start_in_error++;
! 	MUTEX_EXIT(&rx_stats_mutex);
  #endif
  	return;
      }
--- 5094,5100 ----
      }
      if (call->error) {
  #ifdef	AFS_GLOBAL_RXLOCK_KERNEL
!         rx_MutexIncrement(rx_tq_debug.rxi_start_in_error, rx_stats_mutex);
  #endif
  	return;
      }
***************
*** 5163,5175 ****
  	 * in this burst.  Note, if we back off, it's reasonable to
  	 * back off all of the packets in the same manner, even if
  	 * some of them have been retransmitted more times than more
! 	 * recent additions */
! 	clock_GetTime(&now);
! 	retryTime = now;	/* initialize before use */
  	MUTEX_ENTER(&peer->peer_lock);
  	clock_Add(&retryTime, &peer->timeout);
  	MUTEX_EXIT(&peer->peer_lock);
! 
  	/* Send (or resend) any packets that need it, subject to
  	 * window restrictions and congestion burst control
  	 * restrictions.  Ask for an ack on the last packet sent in
--- 5104,5118 ----
  	 * in this burst.  Note, if we back off, it's reasonable to
  	 * back off all of the packets in the same manner, even if
  	 * some of them have been retransmitted more times than more
! 	 * recent additions.
! 	 * Do a dance to avoid blocking after setting now. */
! 	clock_Zero(&retryTime);
  	MUTEX_ENTER(&peer->peer_lock);
  	clock_Add(&retryTime, &peer->timeout);
  	MUTEX_EXIT(&peer->peer_lock);
! 	clock_GetTime(&now);
! 	clock_Add(&retryTime, &now);
! 	usenow = now;
  	/* Send (or resend) any packets that need it, subject to
  	 * window restrictions and congestion burst control
  	 * restrictions.  Ask for an ack on the last packet sent in
***************
*** 5219,5227 ****
  			osi_Panic("rxi_Start: xmit queue clobbered");
  		    }
  		    if (p->flags & RX_PKTFLAG_ACKED) {
! 			MUTEX_ENTER(&rx_stats_mutex);
! 			rx_stats.ignoreAckedPacket++;
! 			MUTEX_EXIT(&rx_stats_mutex);
  			continue;	/* Ignore this packet if it has been acknowledged */
  		    }
  
--- 5162,5170 ----
  			osi_Panic("rxi_Start: xmit queue clobbered");
  		    }
  		    if (p->flags & RX_PKTFLAG_ACKED) {
! 			/* Since we may block, don't trust this */
! 			usenow.sec = usenow.usec = 0;
!                         rx_MutexIncrement(rx_stats.ignoreAckedPacket, rx_stats_mutex);
  			continue;	/* Ignore this packet if it has been acknowledged */
  		    }
  
***************
*** 5288,5296 ****
  		     * the time to reset the call. This will also inform the using
  		     * process that the call is in an error state.
  		     */
! 		    MUTEX_ENTER(&rx_stats_mutex);
! 		    rx_tq_debug.rxi_start_aborted++;
! 		    MUTEX_EXIT(&rx_stats_mutex);
  		    call->flags &= ~RX_CALL_TQ_BUSY;
  		    if (call->tqWaiters || (call->flags & RX_CALL_TQ_WAIT)) {
  			dpf(("call %x has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
--- 5231,5237 ----
  		     * the time to reset the call. This will also inform the using
  		     * process that the call is in an error state.
  		     */
!                     rx_MutexIncrement(rx_tq_debug.rxi_start_aborted, rx_stats_mutex);
  		    call->flags &= ~RX_CALL_TQ_BUSY;
  		    if (call->tqWaiters || (call->flags & RX_CALL_TQ_WAIT)) {
  			dpf(("call %x has %d waiters and flags %d\n", call, call->tqWaiters, call->flags));
***************
*** 5364,5375 ****
  #ifdef RX_ENABLE_LOCKS
  			CALL_HOLD(call, RX_CALL_REFCOUNT_RESEND);
  			call->resendEvent =
! 			    rxevent_Post2(&retryTime, rxi_StartUnlocked,
! 					 (void *)call, 0, istack);
  #else /* RX_ENABLE_LOCKS */
  			call->resendEvent =
! 			    rxevent_Post2(&retryTime, rxi_Start, (void *)call,
! 					 0, istack);
  #endif /* RX_ENABLE_LOCKS */
  		    }
  		}
--- 5305,5317 ----
  #ifdef RX_ENABLE_LOCKS
  			CALL_HOLD(call, RX_CALL_REFCOUNT_RESEND);
  			call->resendEvent =
! 			    rxevent_PostNow2(&retryTime, &usenow, 
! 					     rxi_StartUnlocked,
! 					     (void *)call, 0, istack);
  #else /* RX_ENABLE_LOCKS */
  			call->resendEvent =
! 			    rxevent_PostNow2(&retryTime, &usenow, rxi_Start, 
! 					     (void *)call, 0, istack);
  #endif /* RX_ENABLE_LOCKS */
  		    }
  		}
***************
*** 5566,5577 ****
  rxi_ScheduleKeepAliveEvent(register struct rx_call *call)
  {
      if (!call->keepAliveEvent) {
! 	struct clock when;
! 	clock_GetTime(&when);
  	when.sec += call->conn->secondsUntilPing;
  	CALL_HOLD(call, RX_CALL_REFCOUNT_ALIVE);
  	call->keepAliveEvent =
! 	    rxevent_Post(&when, rxi_KeepAliveEvent, call, 0);
      }
  }
  
--- 5508,5520 ----
  rxi_ScheduleKeepAliveEvent(register struct rx_call *call)
  {
      if (!call->keepAliveEvent) {
! 	struct clock when, now;
! 	clock_GetTime(&now);
! 	when = now;
  	when.sec += call->conn->secondsUntilPing;
  	CALL_HOLD(call, RX_CALL_REFCOUNT_ALIVE);
  	call->keepAliveEvent =
! 	    rxevent_PostNow(&when, &now, rxi_KeepAliveEvent, call, 0);
      }
  }
  
***************
*** 5647,5653 ****
      conn->challengeEvent = NULL;
      if (RXS_CheckAuthentication(conn->securityObject, conn) != 0) {
  	register struct rx_packet *packet;
! 	struct clock when;
  
  	if (tries <= 0) {
  	    /* We've failed to authenticate for too long.
--- 5590,5596 ----
      conn->challengeEvent = NULL;
      if (RXS_CheckAuthentication(conn->securityObject, conn) != 0) {
  	register struct rx_packet *packet;
! 	struct clock when, now;
  
  	if (tries <= 0) {
  	    /* We've failed to authenticate for too long.
***************
*** 5680,5689 ****
  			    RX_PACKET_TYPE_CHALLENGE, NULL, -1, 0);
  	    rxi_FreePacket(packet);
  	}
! 	clock_GetTime(&when);
  	when.sec += RX_CHALLENGE_TIMEOUT;
  	conn->challengeEvent =
! 	    rxevent_Post2(&when, rxi_ChallengeEvent, conn, 0,
  			 (tries - 1));
      }
  }
--- 5623,5633 ----
  			    RX_PACKET_TYPE_CHALLENGE, NULL, -1, 0);
  	    rxi_FreePacket(packet);
  	}
! 	clock_GetTime(&now);
! 	when = now;
  	when.sec += RX_CHALLENGE_TIMEOUT;
  	conn->challengeEvent =
! 	    rxevent_PostNow2(&when, &now, rxi_ChallengeEvent, conn, 0,
  			 (tries - 1));
      }
  }
***************
*** 5805,5811 ****
  void
  rxi_ReapConnections(void)
  {
!     struct clock now;
      clock_GetTime(&now);
  
      /* Find server connection structures that haven't been used for
--- 5749,5755 ----
  void
  rxi_ReapConnections(void)
  {
!     struct clock now, when;
      clock_GetTime(&now);
  
      /* Find server connection structures that haven't been used for
***************
*** 5920,5928 ****
  			rxi_rpc_peer_stat_cnt -= num_funcs;
  		    }
  		    rxi_FreePeer(peer);
! 		    MUTEX_ENTER(&rx_stats_mutex);
! 		    rx_stats.nPeerStructs--;
! 		    MUTEX_EXIT(&rx_stats_mutex);
  		    if (peer == *peer_ptr) {
  			*peer_ptr = next;
  			prev = next;
--- 5864,5870 ----
  			rxi_rpc_peer_stat_cnt -= num_funcs;
  		    }
  		    rxi_FreePeer(peer);
!                     rx_MutexDecrement(rx_stats.nPeerStructs, rx_stats_mutex);
  		    if (peer == *peer_ptr) {
  			*peer_ptr = next;
  			prev = next;
***************
*** 5956,5963 ****
      }
      MUTEX_EXIT(&rx_freePktQ_lock);
  
!     now.sec += RX_REAP_TIME;	/* Check every RX_REAP_TIME seconds */
!     rxevent_Post(&now, rxi_ReapConnections, 0, 0);
  }
  
  
--- 5898,5906 ----
      }
      MUTEX_EXIT(&rx_freePktQ_lock);
  
!     when = now;
!     when.sec += RX_REAP_TIME;	/* Check every RX_REAP_TIME seconds */
!     rxevent_Post(&when, rxi_ReapConnections, 0, 0);
  }
  
  
***************
*** 6333,6339 ****
  	      void *outputData, size_t outputLength)
  {
      static afs_int32 counter = 100;
!     time_t waitTime, waitCount, startTime, endTime;
      struct rx_header theader;
      char tbuffer[1500];
      register afs_int32 code;
--- 6276,6282 ----
  	      void *outputData, size_t outputLength)
  {
      static afs_int32 counter = 100;
!     time_t waitTime, waitCount, startTime;
      struct rx_header theader;
      char tbuffer[1500];
      register afs_int32 code;
***************
*** 6755,6763 ****
  		}
  		next = peer->next;
  		rxi_FreePeer(peer);
! 		MUTEX_ENTER(&rx_stats_mutex);
! 		rx_stats.nPeerStructs--;
! 		MUTEX_EXIT(&rx_stats_mutex);
  	    }
  	}
      }
--- 6698,6704 ----
  		}
  		next = peer->next;
  		rxi_FreePeer(peer);
!                 rx_MutexDecrement(rx_stats.nPeerStructs, rx_stats_mutex);
  	    }
  	}
      }
Index: openafs/src/rx/rx.h
diff -c openafs/src/rx/rx.h:1.28.4.5 openafs/src/rx/rx.h:1.28.4.7
*** openafs/src/rx/rx.h:1.28.4.5	Fri Feb  8 16:21:07 2008
--- openafs/src/rx/rx.h	Wed Mar 12 01:13:59 2008
***************
*** 1047,1053 ****
  
  #define RX_STATS_SERVICE_ID 409
  
! 
  
  #endif /* _RX_   End of rx.h */
  
--- 1047,1104 ----
  
  #define RX_STATS_SERVICE_ID 409
  
! #ifdef AFS_NT40_ENV
! #define rx_MutexIncrement(object, mutex) InterlockedIncrement(&object)
! #define rx_MutexAdd(object, addend, mutex) InterlockedAdd(&object, addend)
! #define rx_MutexDecrement(object, mutex) InterlockedDecrement(&object)
! #define rx_MutexAdd1Increment2(object1, addend, object2, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object1 += addend; \
!         InterlockedIncrement(&object2); \
!         MUTEX_EXIT(&mutex); \
!     } while (0)
! #define rx_MutexAdd1Decrement2(object1, addend, object2, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object1 += addend; \
!         InterlockedDecrement(&object2); \
!         MUTEX_EXIT(&mutex); \
!     } while (0)
! #else
! #define rx_MutexIncrement(object, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object++; \
!         MUTEX_EXIT(&mutex); \
!     } while(0)
! #define rx_MutexAdd(object, addend, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object += addend; \
!         MUTEX_EXIT(&mutex); \
!     } while(0)
! #define rx_MutexAdd1Increment2(object1, addend, object2, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object1 += addend; \
!         object2++; \
!         MUTEX_EXIT(&mutex); \
!     } while(0)
! #define rx_MutexAdd1Decrement2(object1, addend, object2, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object1 += addend; \
!         object2--; \
!         MUTEX_EXIT(&mutex); \
!     } while(0)
! #define rx_MutexDecrement(object, mutex) \
!     do { \
!         MUTEX_ENTER(&mutex); \
!         object--; \
!         MUTEX_EXIT(&mutex); \
!     } while(0)
! #endif 
  
  #endif /* _RX_   End of rx.h */
  
Index: openafs/src/rx/rx_event.c
diff -c openafs/src/rx/rx_event.c:1.18 openafs/src/rx/rx_event.c:1.18.4.1
*** openafs/src/rx/rx_event.c:1.18	Sat Nov  5 01:48:18 2005
--- openafs/src/rx/rx_event.c	Mon Mar 17 11:38:28 2008
***************
*** 19,25 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_event.c,v 1.18 2005/11/05 06:48:18 jaltman Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
--- 19,25 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_event.c,v 1.18.4.1 2008/03/17 15:38:28 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
***************
*** 90,95 ****
--- 90,96 ----
  static struct xfreelist *xfreemallocs = 0, *xsp = 0;
  
  struct clock rxevent_nextRaiseEvents;	/* Time of next call to raise events */
+ struct clock rxevent_lastEvent;        /* backwards time detection */
  int rxevent_raiseScheduled;	/* true if raise events is scheduled */
  
  #ifdef RX_ENABLE_LOCKS
***************
*** 117,122 ****
--- 118,145 ----
  #endif /* AFS_PTHREAD_ENV */
  
  
+ int
+ rxevent_adjTimes(struct clock *adjTime)
+ {
+     /* backwards clock correction */
+     int nAdjusted = 0;
+     struct rxepoch *qep, *nqep;
+     struct rxevent *qev, *nqev;
+     
+     for (queue_Scan(&rxepoch_queue, qep, nqep, rxepoch)) {
+ 	for (queue_Scan(&qep->events, qev, nqev, rxevent)) {
+ 	    if (clock_Gt(&qev->eventTime, adjTime)) {
+ 		clock_Sub(&qev->eventTime, adjTime); 
+ 		nAdjusted++;
+ 	    }
+ 	}
+ 	if (qep->epochSec > adjTime->sec) {
+ 	    qep->epochSec -= adjTime->sec;
+ 	}
+     }
+     return nAdjusted;
+ }
+ 
  /* Pass in the number of events to allocate at a time */
  int rxevent_initialized = 0;
  void
***************
*** 139,144 ****
--- 162,168 ----
      rxevent_ScheduledEarlierEvent = scheduler;
      rxevent_initialized = 1;
      clock_Zero(&rxevent_nextRaiseEvents);
+     clock_Zero(&rxevent_lastEvent);
      rxevent_raiseScheduled = 0;
      UNLOCK_EV_INIT;
  }
***************
*** 181,197 ****
   * "when" argument specifies when "func" should be called, in clock (clock.h)
   * units. */
  
- #if 0
- struct rxevent *
- rxevent_Post(struct clock *when,
- 	     void (*func) (struct rxevent * event,
- 			   struct rx_connection * conn,
- 			   struct rx_call * acall), void *arg, void *arg1)
- #else
  static struct rxevent *
! _rxevent_Post(struct clock *when, void (*func) (), void *arg, void *arg1,
! 	      int arg2, int newargs)
! #endif
  {
      register struct rxevent *ev, *evqe, *evqpr;
      register struct rxepoch *ep, *epqe, *epqpr;
--- 205,213 ----
   * "when" argument specifies when "func" should be called, in clock (clock.h)
   * units. */
  
  static struct rxevent *
! _rxevent_Post(struct clock *when, struct clock *now, void (*func) (), 
! 	      void *arg, void *arg1, int arg2, int newargs)
  {
      register struct rxevent *ev, *evqe, *evqpr;
      register struct rxepoch *ep, *epqe, *epqpr;
***************
*** 200,214 ****
      MUTEX_ENTER(&rxevent_lock);
  #ifdef RXDEBUG
      if (rx_Log_event) {
! 	struct clock now;
! 	clock_GetTime(&now);
  	fprintf(rx_Log_event, "%d.%d: rxevent_Post(%d.%d, %lp, %lp, %lp, %d)\n",
! 		(int)now.sec, (int)now.usec, (int)when->sec, (int)when->usec,
  		func, arg,
  		arg1, arg2);
      }
  #endif
! 
      /* Get a pointer to the epoch for this event, if none is found then
       * create a new epoch and insert it into the sorted list */
      for (ep = NULL, queue_ScanBackwards(&rxepoch_queue, epqe, epqpr, rxepoch)) {
--- 216,238 ----
      MUTEX_ENTER(&rxevent_lock);
  #ifdef RXDEBUG
      if (rx_Log_event) {
! 	struct clock now1;
! 	clock_GetTime(&now1);
  	fprintf(rx_Log_event, "%d.%d: rxevent_Post(%d.%d, %lp, %lp, %lp, %d)\n",
! 		(int)now1.sec, (int)now1.usec, (int)when->sec, (int)when->usec,
  		func, arg,
  		arg1, arg2);
      }
  #endif
!     /* If a time was provided, check for consistency */
!     if (now->sec) {
! 	if (clock_Gt(&rxevent_lastEvent, now)) {
! 	    struct clock adjTime = rxevent_lastEvent;
! 	    clock_Sub(&adjTime, now);
! 	    rxevent_adjTimes(&adjTime);
! 	}
! 	rxevent_lastEvent = *now;
!     }
      /* Get a pointer to the epoch for this event, if none is found then
       * create a new epoch and insert it into the sorted list */
      for (ep = NULL, queue_ScanBackwards(&rxepoch_queue, epqe, epqpr, rxepoch)) {
***************
*** 297,310 ****
  struct rxevent *
  rxevent_Post(struct clock *when, void (*func) (), void *arg, void *arg1)
  {
!     return _rxevent_Post(when, func, arg, arg1, 0, 0);
  }
  
  struct rxevent *
  rxevent_Post2(struct clock *when, void (*func) (), void *arg, void *arg1,
  	      int arg2)
  {
!     return _rxevent_Post(when, func, arg, arg1, arg2, 1);
  }
  
  /* Cancel an event by moving it from the event queue to the free list.
--- 321,352 ----
  struct rxevent *
  rxevent_Post(struct clock *when, void (*func) (), void *arg, void *arg1)
  {
!     struct clock now;
!     clock_Zero(&now);
!     return _rxevent_Post(when, &now, func, arg, arg1, 0, 0);
  }
  
  struct rxevent *
  rxevent_Post2(struct clock *when, void (*func) (), void *arg, void *arg1,
  	      int arg2)
  {
!     struct clock now;
!     clock_Zero(&now);
!     return _rxevent_Post(when, &now, func, arg, arg1, arg2, 1);
! }
! 
! struct rxevent *
! rxevent_PostNow(struct clock *when, struct clock *now, void (*func) (), 
! 		void *arg, void *arg1)
! {
!     return _rxevent_Post(when, now, func, arg, arg1, 0, 0);
! }
! 
! struct rxevent *
! rxevent_PostNow2(struct clock *when, struct clock *now, void (*func) (), 
! 		 void *arg, void *arg1, int arg2)
! {
!     return _rxevent_Post(when, now, func, arg, arg1, arg2, 1);
  }
  
  /* Cancel an event by moving it from the event queue to the free list.
***************
*** 378,384 ****
      register struct rxepoch *ep;
      register struct rxevent *ev;
      volatile struct clock now;
- 
      MUTEX_ENTER(&rxevent_lock);
  
      /* Events are sorted by time, so only scan until an event is found that has
--- 420,425 ----
***************
*** 394,410 ****
  	    continue;
  	}
  	do {
  	    ev = queue_First(&ep->events, rxevent);
  	    if (clock_Lt(&now, &ev->eventTime)) {
  		clock_GetTime(&now);
! 		if (clock_Lt(&now, &ev->eventTime)) {
! 		    *next = rxevent_nextRaiseEvents = ev->eventTime;
! 		    rxevent_raiseScheduled = 1;
! 		    clock_Sub(next, &now);
! 		    MUTEX_EXIT(&rxevent_lock);
! 		    return 1;
  		}
! 	    }
  	    queue_Remove(ev);
  	    rxevent_nPosted--;
  	    MUTEX_EXIT(&rxevent_lock);
--- 435,461 ----
  	    continue;
  	}
  	do {
+ 	reraise:
  	    ev = queue_First(&ep->events, rxevent);
  	    if (clock_Lt(&now, &ev->eventTime)) {
  		clock_GetTime(&now);
! 		if (clock_Gt(&rxevent_lastEvent, &now)) {
! 		    struct clock adjTime = rxevent_lastEvent;
! 		    int adjusted;
! 		    clock_Sub(&adjTime, &now);
! 		    adjusted = rxevent_adjTimes(&adjTime);
! 		    rxevent_lastEvent = now;
! 		    if (adjusted > 0)
! 			goto reraise;
  		}
! 		if (clock_Lt(&now, &ev->eventTime)) {
!                     *next = rxevent_nextRaiseEvents = ev->eventTime;
!                     rxevent_raiseScheduled = 1;
!                     clock_Sub(next, &now);
!                     MUTEX_EXIT(&rxevent_lock);
!                     return 1;
!                 }
!             }
  	    queue_Remove(ev);
  	    rxevent_nPosted--;
  	    MUTEX_EXIT(&rxevent_lock);
Index: openafs/src/rx/rx_globals.h
diff -c openafs/src/rx/rx_globals.h:1.21.2.6 openafs/src/rx/rx_globals.h:1.21.2.7
*** openafs/src/rx/rx_globals.h:1.21.2.6	Fri Jan  5 20:20:07 2007
--- openafs/src/rx/rx_globals.h	Tue Mar 11 14:27:39 2008
***************
*** 22,27 ****
--- 22,28 ----
  #ifndef GLOBALSINIT
  #define GLOBALSINIT(x)
  #if defined(AFS_NT40_ENV)
+ #define RX_STATS_INTERLOCKED 1
  #if defined(AFS_PTHREAD_ENV)
  #define EXT __declspec(dllimport) extern
  #else
Index: openafs/src/rx/rx_kcommon.c
diff -c openafs/src/rx/rx_kcommon.c:1.56.2.6 openafs/src/rx/rx_kcommon.c:1.56.2.7
*** openafs/src/rx/rx_kcommon.c:1.56.2.6	Wed Jan 30 16:05:48 2008
--- openafs/src/rx/rx_kcommon.c	Mon Mar 10 18:32:34 2008
***************
*** 15,21 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_kcommon.c,v 1.56.2.6 2008/01/30 21:05:48 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
--- 15,21 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_kcommon.c,v 1.56.2.7 2008/03/10 22:32:34 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
***************
*** 273,280 ****
  #ifndef UKERNEL
  /* This is the server process request loop. Kernel server
   * processes never become listener threads */
! void
! rx_ServerProc(void)
  {
      int threadID;
  
--- 273,280 ----
  #ifndef UKERNEL
  /* This is the server process request loop. Kernel server
   * processes never become listener threads */
! void *
! rx_ServerProc(void *unused)
  {
      int threadID;
  
Index: openafs/src/rx/rx_lwp.c
diff -c openafs/src/rx/rx_lwp.c:1.19.4.1 openafs/src/rx/rx_lwp.c:1.19.4.2
*** openafs/src/rx/rx_lwp.c:1.19.4.1	Thu Jun 14 15:06:25 2007
--- openafs/src/rx/rx_lwp.c	Mon Mar 10 18:32:34 2008
***************
*** 22,28 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_lwp.c,v 1.19.4.1 2007/06/14 19:06:25 jaltman Exp $");
  
  # include <sys/types.h>		/* fd_set on older platforms */
  # include <errno.h>
--- 22,28 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_lwp.c,v 1.19.4.2 2008/03/10 22:32:34 shadow Exp $");
  
  # include <sys/types.h>		/* fd_set on older platforms */
  # include <errno.h>
***************
*** 75,81 ****
  }
  
  PROCESS rx_listenerPid = 0;	/* LWP process id of socket listener process */
! static int rx_ListenerProc(void *dummy);
  
  /*
   * Delay the current thread the specified number of seconds.
--- 75,81 ----
  }
  
  PROCESS rx_listenerPid = 0;	/* LWP process id of socket listener process */
! static void* rx_ListenerProc(void *dummy);
  
  /*
   * Delay the current thread the specified number of seconds.
***************
*** 119,132 ****
  }
  
  void
! rxi_StartServerProc(void (*proc) (void), int stacksize)
  {
      PROCESS scratchPid;
      static int number = 0;
      char name[32];
  
      sprintf(name, "srv_%d", ++number);
!     LWP_CreateProcess((int (*)(void *))proc, stacksize, RX_PROCESS_PRIORITY, (void *)0,
  		      "rx_ServerProc", &scratchPid);
      if (registerProgram)
  	(*registerProgram) (scratchPid, name);
--- 119,132 ----
  }
  
  void
! rxi_StartServerProc(void *(*proc) (void *), int stacksize)
  {
      PROCESS scratchPid;
      static int number = 0;
      char name[32];
  
      sprintf(name, "srv_%d", ++number);
!     LWP_CreateProcess(proc, stacksize, RX_PROCESS_PRIORITY, NULL,
  		      "rx_ServerProc", &scratchPid);
      if (registerProgram)
  	(*registerProgram) (scratchPid, name);
***************
*** 320,326 ****
  /* This is the listener process request loop. The listener process loop
   * becomes a server thread when rxi_ListenerProc returns, and stays
   * server thread until rxi_ServerProc returns. */
! static int
  rx_ListenerProc(void *dummy)
  {
      int threadID;
--- 320,326 ----
  /* This is the listener process request loop. The listener process loop
   * becomes a server thread when rxi_ListenerProc returns, and stays
   * server thread until rxi_ServerProc returns. */
! static void *
  rx_ListenerProc(void *dummy)
  {
      int threadID;
***************
*** 343,355 ****
  	/* assert(sock != OSI_NULLSOCKET); */
      }
      /* not reached */
  }
  
  /* This is the server process request loop. The server process loop
   * becomes a listener thread when rxi_ServerProc returns, and stays
   * listener thread until rxi_ListenerProc returns. */
! void
! rx_ServerProc(void)
  {
      osi_socket sock;
      int threadID;
--- 343,356 ----
  	/* assert(sock != OSI_NULLSOCKET); */
      }
      /* not reached */
+     return NULL;
  }
  
  /* This is the server process request loop. The server process loop
   * becomes a listener thread when rxi_ServerProc returns, and stays
   * listener thread until rxi_ListenerProc returns. */
! void *
! rx_ServerProc(void * unused)
  {
      osi_socket sock;
      int threadID;
***************
*** 376,381 ****
--- 377,383 ----
  	/* assert(newcall != NULL); */
      }
      /* not reached */
+     return NULL;
  }
  
  /*
Index: openafs/src/rx/rx_packet.c
diff -c openafs/src/rx/rx_packet.c:1.62.2.10 openafs/src/rx/rx_packet.c:1.62.2.11
*** openafs/src/rx/rx_packet.c:1.62.2.10	Tue Oct 30 11:16:45 2007
--- openafs/src/rx/rx_packet.c	Tue Mar 11 14:27:39 2008
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_packet.c,v 1.62.2.10 2007/10/30 15:16:45 shadow Exp $");
  
  #ifdef KERNEL
  #if defined(UKERNEL)
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_packet.c,v 1.62.2.11 2008/03/11 18:27:39 jaltman Exp $");
  
  #ifdef KERNEL
  #if defined(UKERNEL)
***************
*** 266,272 ****
  static int
  AllocPacketBufs(int class, int num_pkts, struct rx_queue * q)
  {
-     register struct rx_packet *c;
      register struct rx_ts_info_t * rx_ts_info;
      int transfer, alloc;
      SPLVAR;
--- 266,271 ----
***************
*** 317,341 ****
  
      if (overq) {
  	rxi_NeedMorePackets = TRUE;
- 	MUTEX_ENTER(&rx_stats_mutex);
  	switch (class) {
  	case RX_PACKET_CLASS_RECEIVE:
! 	    rx_stats.receivePktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SEND:
! 	    rx_stats.sendPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SPECIAL:
! 	    rx_stats.specialPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_RECV_CBUF:
! 	    rx_stats.receiveCbufPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SEND_CBUF:
! 	    rx_stats.sendCbufPktAllocFailures++;
  	    break;
  	}
- 	MUTEX_EXIT(&rx_stats_mutex);
      }
  
      if (rx_nFreePackets < num_pkts)
--- 316,338 ----
  
      if (overq) {
  	rxi_NeedMorePackets = TRUE;
  	switch (class) {
  	case RX_PACKET_CLASS_RECEIVE:
! 	    rx_MutexIncrement(rx_stats.receivePktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SEND:
! 	    rx_MutexIncrement(rx_stats.sendPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SPECIAL:
!             rx_MutexIncrement(rx_stats.specialPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_RECV_CBUF:
! 	    rx_MutexIncrement(rx_stats.receiveCbufPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SEND_CBUF:
! 	    rx_MutexIncrement(rx_stats.sendCbufPktAllocFailures, rx_stats_mutex);
  	    break;
  	}
      }
  
      if (rx_nFreePackets < num_pkts)
***************
*** 1064,1096 ****
  #ifdef KERNEL
      if (rxi_OverQuota(class)) {
  	rxi_NeedMorePackets = TRUE;
- 	MUTEX_ENTER(&rx_stats_mutex);
  	switch (class) {
  	case RX_PACKET_CLASS_RECEIVE:
! 	    rx_stats.receivePktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SEND:
! 	    rx_stats.sendPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SPECIAL:
! 	    rx_stats.specialPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_RECV_CBUF:
! 	    rx_stats.receiveCbufPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SEND_CBUF:
! 	    rx_stats.sendCbufPktAllocFailures++;
  	    break;
  	}
! 	MUTEX_EXIT(&rx_stats_mutex);
! 	return (struct rx_packet *)0;
      }
  #endif /* KERNEL */
  
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.packetRequests++;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
      if (queue_IsEmpty(&rx_ts_info->_FPQ)) {
  
  #ifdef KERNEL
--- 1061,1088 ----
  #ifdef KERNEL
      if (rxi_OverQuota(class)) {
  	rxi_NeedMorePackets = TRUE;
  	switch (class) {
  	case RX_PACKET_CLASS_RECEIVE:
! 	    rx_MutexIncrement(rx_stats.receivePktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SEND:
! 	    rx_MutexIncrement(rx_stats.sendPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SPECIAL:
!             rx_MutexIncrement(rx_stats.specialPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_RECV_CBUF:
! 	    rx_MutexIncrement(rx_stats.receiveCbufPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SEND_CBUF:
! 	    rx_MutexIncrement(rx_stats.sendCbufPktAllocFailures, rx_stats_mutex);
  	    break;
  	}
!         return (struct rx_packet *)0;
      }
  #endif /* KERNEL */
  
!     rx_MutexIncrement(rx_stats.packetRequests, rx_stats_mutex);
      if (queue_IsEmpty(&rx_ts_info->_FPQ)) {
  
  #ifdef KERNEL
***************
*** 1126,1157 ****
  #ifdef KERNEL
      if (rxi_OverQuota(class)) {
  	rxi_NeedMorePackets = TRUE;
- 	MUTEX_ENTER(&rx_stats_mutex);
  	switch (class) {
  	case RX_PACKET_CLASS_RECEIVE:
! 	    rx_stats.receivePktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SEND:
! 	    rx_stats.sendPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SPECIAL:
! 	    rx_stats.specialPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_RECV_CBUF:
! 	    rx_stats.receiveCbufPktAllocFailures++;
  	    break;
  	case RX_PACKET_CLASS_SEND_CBUF:
! 	    rx_stats.sendCbufPktAllocFailures++;
  	    break;
  	}
- 	MUTEX_EXIT(&rx_stats_mutex);
  	return (struct rx_packet *)0;
      }
  #endif /* KERNEL */
  
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.packetRequests++;
!     MUTEX_EXIT(&rx_stats_mutex);
  
  #ifdef KERNEL
      if (queue_IsEmpty(&rx_freePacketQueue))
--- 1118,1145 ----
  #ifdef KERNEL
      if (rxi_OverQuota(class)) {
  	rxi_NeedMorePackets = TRUE;
  	switch (class) {
  	case RX_PACKET_CLASS_RECEIVE:
! 	    rx_MutexIncrement(rx_stats.receivePktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SEND:
! 	    rx_MutexIncrement(rx_stats.sendPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SPECIAL:
!             rx_MutexIncrement(rx_stats.specialPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_RECV_CBUF:
! 	    rx_MutexIncrement(rx_stats.receiveCbufPktAllocFailures, rx_stats_mutex);
  	    break;
  	case RX_PACKET_CLASS_SEND_CBUF:
! 	    rx_MutexIncrement(rx_stats.sendCbufPktAllocFailures, rx_stats_mutex);
  	    break;
  	}
  	return (struct rx_packet *)0;
      }
  #endif /* KERNEL */
  
!     rx_MutexIncrement(rx_stats.packetRequests, rx_stats_mutex);
  
  #ifdef KERNEL
      if (queue_IsEmpty(&rx_freePacketQueue))
***************
*** 1187,1196 ****
  
      RX_TS_INFO_GET(rx_ts_info);
  
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.packetRequests++;
!     MUTEX_EXIT(&rx_stats_mutex);
! 
      if (pull_global && queue_IsEmpty(&rx_ts_info->_FPQ)) {
          MUTEX_ENTER(&rx_freePktQ_lock);
  
--- 1175,1181 ----
  
      RX_TS_INFO_GET(rx_ts_info);
  
!     rx_MutexIncrement(rx_stats.packetRequests, rx_stats_mutex);
      if (pull_global && queue_IsEmpty(&rx_ts_info->_FPQ)) {
          MUTEX_ENTER(&rx_freePktQ_lock);
  
***************
*** 1410,1418 ****
      p->length = (nbytes - RX_HEADER_SIZE);
      if ((nbytes > tlen) || (p->length & 0x8000)) {	/* Bogus packet */
  	if (nbytes < 0 && errno == EWOULDBLOCK) {
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.noPacketOnRead++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	} else if (nbytes <= 0) {
  	    MUTEX_ENTER(&rx_stats_mutex);
  	    rx_stats.bogusPacketOnRead++;
--- 1395,1401 ----
      p->length = (nbytes - RX_HEADER_SIZE);
      if ((nbytes > tlen) || (p->length & 0x8000)) {	/* Bogus packet */
  	if (nbytes < 0 && errno == EWOULDBLOCK) {
!             rx_MutexIncrement(rx_stats.noPacketOnRead, rx_stats_mutex);
  	} else if (nbytes <= 0) {
  	    MUTEX_ENTER(&rx_stats_mutex);
  	    rx_stats.bogusPacketOnRead++;
***************
*** 1447,1455 ****
  	*port = from.sin_port;
  	if (p->header.type > 0 && p->header.type < RX_N_PACKET_TYPES) {
  	    struct rx_peer *peer;
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.packetsRead[p->header.type - 1]++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	    /*
  	     * Try to look up this peer structure.  If it doesn't exist,
  	     * don't create a new one - 
--- 1430,1436 ----
  	*port = from.sin_port;
  	if (p->header.type > 0 && p->header.type < RX_N_PACKET_TYPES) {
  	    struct rx_peer *peer;
!             rx_MutexIncrement(rx_stats.packetsRead[p->header.type - 1], rx_stats_mutex);
  	    /*
  	     * Try to look up this peer structure.  If it doesn't exist,
  	     * don't create a new one - 
***************
*** 2214,2222 ****
  	     osi_NetSend(socket, &addr, p->wirevec, p->niovecs,
  			 p->length + RX_HEADER_SIZE, istack)) != 0) {
  	    /* send failed, so let's hurry up the resend, eh? */
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.netSendFailures++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	    p->retryTime = p->timeSent;	/* resend it very soon */
  	    clock_Addmsec(&(p->retryTime),
  			  10 + (((afs_uint32) p->backoff) << 8));
--- 2195,2201 ----
  	     osi_NetSend(socket, &addr, p->wirevec, p->niovecs,
  			 p->length + RX_HEADER_SIZE, istack)) != 0) {
  	    /* send failed, so let's hurry up the resend, eh? */
!             rx_MutexIncrement(rx_stats.netSendFailures, rx_stats_mutex);
  	    p->retryTime = p->timeSent;	/* resend it very soon */
  	    clock_Addmsec(&(p->retryTime),
  			  10 + (((afs_uint32) p->backoff) << 8));
***************
*** 2256,2264 ****
      }
      dpf(("%c %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %lx resend %d.%0.3d len %d", deliveryType, p->header.serial, rx_packetTypes[p->header.type - 1], ntohl(peer->host), ntohs(peer->port), p->header.serial, p->header.epoch, p->header.cid, p->header.callNumber, p->header.seq, p->header.flags, (unsigned long)p, p->retryTime.sec, p->retryTime.usec / 1000, p->length));
  #endif
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.packetsSent[p->header.type - 1]++;
!     MUTEX_EXIT(&rx_stats_mutex);
      MUTEX_ENTER(&peer->peer_lock);
      hadd32(peer->bytesSent, p->length);
      MUTEX_EXIT(&peer->peer_lock);
--- 2235,2241 ----
      }
      dpf(("%c %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %lx resend %d.%0.3d len %d", deliveryType, p->header.serial, rx_packetTypes[p->header.type - 1], ntohl(peer->host), ntohs(peer->port), p->header.serial, p->header.epoch, p->header.cid, p->header.callNumber, p->header.seq, p->header.flags, (unsigned long)p, p->retryTime.sec, p->retryTime.usec / 1000, p->length));
  #endif
!     rx_MutexIncrement(rx_stats.packetsSent[p->header.type - 1], rx_stats_mutex);
      MUTEX_ENTER(&peer->peer_lock);
      hadd32(peer->bytesSent, p->length);
      MUTEX_EXIT(&peer->peer_lock);
***************
*** 2403,2411 ****
  	     osi_NetSend(socket, &addr, &wirevec[0], len + 1, length,
  			 istack)) != 0) {
  	    /* send failed, so let's hurry up the resend, eh? */
! 	    MUTEX_ENTER(&rx_stats_mutex);
! 	    rx_stats.netSendFailures++;
! 	    MUTEX_EXIT(&rx_stats_mutex);
  	    for (i = 0; i < len; i++) {
  		p = list[i];
  		p->retryTime = p->timeSent;	/* resend it very soon */
--- 2380,2386 ----
  	     osi_NetSend(socket, &addr, &wirevec[0], len + 1, length,
  			 istack)) != 0) {
  	    /* send failed, so let's hurry up the resend, eh? */
!             rx_MutexIncrement(rx_stats.netSendFailures, rx_stats_mutex);
  	    for (i = 0; i < len; i++) {
  		p = list[i];
  		p->retryTime = p->timeSent;	/* resend it very soon */
***************
*** 2442,2452 ****
      dpf(("%c %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %lx resend %d.%0.3d len %d", deliveryType, p->header.serial, rx_packetTypes[p->header.type - 1], ntohl(peer->host), ntohs(peer->port), p->header.serial, p->header.epoch, p->header.cid, p->header.callNumber, p->header.seq, p->header.flags, (unsigned long)p, p->retryTime.sec, p->retryTime.usec / 1000, p->length));
  
  #endif
!     MUTEX_ENTER(&rx_stats_mutex);
!     rx_stats.packetsSent[p->header.type - 1]++;
!     MUTEX_EXIT(&rx_stats_mutex);
      MUTEX_ENTER(&peer->peer_lock);
- 
      hadd32(peer->bytesSent, p->length);
      MUTEX_EXIT(&peer->peer_lock);
  }
--- 2417,2424 ----
      dpf(("%c %d %s: %x.%u.%u.%u.%u.%u.%u flags %d, packet %lx resend %d.%0.3d len %d", deliveryType, p->header.serial, rx_packetTypes[p->header.type - 1], ntohl(peer->host), ntohs(peer->port), p->header.serial, p->header.epoch, p->header.cid, p->header.callNumber, p->header.seq, p->header.flags, (unsigned long)p, p->retryTime.sec, p->retryTime.usec / 1000, p->length));
  
  #endif
!     rx_MutexIncrement(rx_stats.packetsSent[p->header.type - 1], rx_stats_mutex);
      MUTEX_ENTER(&peer->peer_lock);
      hadd32(peer->bytesSent, p->length);
      MUTEX_EXIT(&peer->peer_lock);
  }
***************
*** 2595,2601 ****
  		      register struct rx_packet *p, register int last)
  {
      register struct rx_connection *conn = call->conn;
!     int i, j;
      ssize_t len;		/* len must be a signed type; it can go negative */
  
      p->flags &= ~RX_PKTFLAG_ACKED;
--- 2567,2573 ----
  		      register struct rx_packet *p, register int last)
  {
      register struct rx_connection *conn = call->conn;
!     int i;
      ssize_t len;		/* len must be a signed type; it can go negative */
  
      p->flags &= ~RX_PKTFLAG_ACKED;
Index: openafs/src/rx/rx_prototypes.h
diff -c openafs/src/rx/rx_prototypes.h:1.29.4.7 openafs/src/rx/rx_prototypes.h:1.29.4.9
*** openafs/src/rx/rx_prototypes.h:1.29.4.7	Fri Feb  8 16:21:07 2008
--- openafs/src/rx/rx_prototypes.h	Mon Mar 17 11:38:28 2008
***************
*** 304,309 ****
--- 304,314 ----
  				    void *arg, void *arg1);
  extern struct rxevent *rxevent_Post2(struct clock *when, void (*func) (),
  				    void *arg, void *arg1, int arg2);
+ extern struct rxevent *rxevent_PostNow(struct clock *when, struct clock *now,
+ 				       void (*func) (), void *arg, void *arg1);
+ extern struct rxevent *rxevent_PostNow2(struct clock *when, struct clock *now,
+ 					void (*func) (), void *arg, 
+ 					void *arg1, int arg2);
  #endif
  extern void shutdown_rxevent(void);
  extern struct rxepoch *rxepoch_Allocate(struct clock *when);
***************
*** 365,371 ****
  extern int rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host,
  			  int *port);
  #ifdef UKERNEL
! extern void rx_ServerProc(void);
  #endif
  extern void osi_AssertFailK(const char *expr, const char *file, int line);
  extern void rxk_ListenerProc(void);
--- 370,376 ----
  extern int rxk_ReadPacket(osi_socket so, struct rx_packet *p, int *host,
  			  int *port);
  #ifdef UKERNEL
! extern void *rx_ServerProc(void *);
  #endif
  extern void osi_AssertFailK(const char *expr, const char *file, int line);
  extern void rxk_ListenerProc(void);
***************
*** 419,425 ****
  
  
  /* rx_lwp.c */
- extern void rx_ServerProc(void);
  extern void rxi_Sleep(void *addr);
  extern void rxi_Delay(int seconds);
  extern void rxi_InitializeThreadSupport(void);
--- 424,429 ----
***************
*** 429,437 ****
  extern void rxi_ReScheduleEvents(void);
  #endif
  extern void rxi_InitializeThreadSupport(void);
! extern void rxi_StartServerProc(void (*proc) (void), int stacksize);
  extern void rxi_StartListener(void);
! extern void rx_ServerProc(void);
  extern int rxi_Listen(osi_socket sock);
  extern int rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags);
  extern int rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags);
--- 433,441 ----
  extern void rxi_ReScheduleEvents(void);
  #endif
  extern void rxi_InitializeThreadSupport(void);
! extern void rxi_StartServerProc(void *(*proc) (void *), int stacksize);
  extern void rxi_StartListener(void);
! extern void *rx_ServerProc(void *);
  extern int rxi_Listen(osi_socket sock);
  extern int rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags);
  extern int rxi_Sendmsg(osi_socket socket, struct msghdr *msg_p, int flags);
***************
*** 531,541 ****
  /* rx_pthread.c */
  extern void rxi_Delay(int sec);
  extern void rxi_InitializeThreadSupport(void);
! extern void rxi_StartServerProc(void (*proc) (void), int stacksize);
  #ifndef rxi_ReScheduleEvents
  extern void rxi_ReScheduleEvents(void);
  #endif
! extern void rx_ServerProc(void);
  extern void rxi_StartListener(void);
  extern int rxi_Listen(osi_socket sock);
  extern int rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags);
--- 535,545 ----
  /* rx_pthread.c */
  extern void rxi_Delay(int sec);
  extern void rxi_InitializeThreadSupport(void);
! extern void rxi_StartServerProc(void *(*proc) (void *), int stacksize);
  #ifndef rxi_ReScheduleEvents
  extern void rxi_ReScheduleEvents(void);
  #endif
! extern void *rx_ServerProc(void *);
  extern void rxi_StartListener(void);
  extern int rxi_Listen(osi_socket sock);
  extern int rxi_Recvmsg(osi_socket socket, struct msghdr *msg_p, int flags);
Index: openafs/src/rx/rx_pthread.c
diff -c openafs/src/rx/rx_pthread.c:1.24.4.4 openafs/src/rx/rx_pthread.c:1.24.4.5
*** openafs/src/rx/rx_pthread.c:1.24.4.4	Wed Feb 20 12:18:47 2008
--- openafs/src/rx/rx_pthread.c	Mon Mar 10 18:32:34 2008
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_pthread.c,v 1.24.4.4 2008/02/20 17:18:47 jaltman Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_pthread.c,v 1.24.4.5 2008/03/10 22:32:34 shadow Exp $");
  
  #include <sys/types.h>
  #include <errno.h>
***************
*** 108,114 ****
   * Start an Rx server process.
   */
  void
! rxi_StartServerProc(void (*proc) (void), int stacksize)
  {
      pthread_t thread;
      pthread_attr_t tattr;
--- 108,114 ----
   * Start an Rx server process.
   */
  void
! rxi_StartServerProc(void *(*proc) (void *), int stacksize)
  {
      pthread_t thread;
      pthread_attr_t tattr;
***************
*** 279,286 ****
  /* This is the server process request loop. The server process loop
   * becomes a listener thread when rxi_ServerProc returns, and stays
   * listener thread until rxi_ListenerProc returns. */
! void
! rx_ServerProc(void)
  {
      osi_socket sock;
      int threadID;
--- 279,286 ----
  /* This is the server process request loop. The server process loop
   * becomes a listener thread when rxi_ServerProc returns, and stays
   * listener thread until rxi_ListenerProc returns. */
! void *
! rx_ServerProc(void * dummy)
  {
      osi_socket sock;
      int threadID;
Index: openafs/src/rx/rx_rdwr.c
diff -c openafs/src/rx/rx_rdwr.c:1.29.2.2 openafs/src/rx/rx_rdwr.c:1.29.2.3
*** openafs/src/rx/rx_rdwr.c:1.29.2.2	Tue Oct 30 11:16:45 2007
--- openafs/src/rx/rx_rdwr.c	Mon Mar 17 11:38:28 2008
***************
*** 15,21 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_rdwr.c,v 1.29.2.2 2007/10/30 15:16:45 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
--- 15,21 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/rx_rdwr.c,v 1.29.2.3 2008/03/17 15:38:28 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
***************
*** 192,199 ****
  					       RX_CALL_REFCOUNT_DELAY);
  				rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
  			    } else {
! 				struct clock when;
! 				clock_GetTime(&when);
  				/* Delay to consolidate ack packets */
  				clock_Add(&when, &rx_hardAckDelay);
  				if (!call->delayedAckEvent
--- 192,200 ----
  					       RX_CALL_REFCOUNT_DELAY);
  				rxi_SendAck(call, 0, 0, RX_ACK_DELAY, 0);
  			    } else {
! 				struct clock when, now;
! 				clock_GetTime(&now);
! 				when = now;
  				/* Delay to consolidate ack packets */
  				clock_Add(&when, &rx_hardAckDelay);
  				if (!call->delayedAckEvent
***************
*** 204,210 ****
  						   RX_CALL_REFCOUNT_DELAY);
  				    CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  				    call->delayedAckEvent =
! 					rxevent_Post(&when,
  						     rxi_SendDelayedAck, call,
  						     0);
  				}
--- 205,211 ----
  						   RX_CALL_REFCOUNT_DELAY);
  				    CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  				    call->delayedAckEvent =
! 				      rxevent_PostNow(&when, &now,
  						     rxi_SendDelayedAck, call,
  						     0);
  				}
***************
*** 521,528 ****
  	    rxi_SendAck(call, 0, serial, RX_ACK_DELAY, 0);
  	    didHardAck = 1;
  	} else {
! 	    struct clock when;
! 	    clock_GetTime(&when);
  	    /* Delay to consolidate ack packets */
  	    clock_Add(&when, &rx_hardAckDelay);
  	    if (!call->delayedAckEvent
--- 522,530 ----
  	    rxi_SendAck(call, 0, serial, RX_ACK_DELAY, 0);
  	    didHardAck = 1;
  	} else {
! 	    struct clock when, now;
! 	    clock_GetTime(&now);
! 	    when = now;
  	    /* Delay to consolidate ack packets */
  	    clock_Add(&when, &rx_hardAckDelay);
  	    if (!call->delayedAckEvent
***************
*** 531,537 ****
  			       RX_CALL_REFCOUNT_DELAY);
  		CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  		call->delayedAckEvent =
! 		    rxevent_Post(&when, rxi_SendDelayedAck, call, 0);
  	    }
  	}
      }
--- 533,539 ----
  			       RX_CALL_REFCOUNT_DELAY);
  		CALL_HOLD(call, RX_CALL_REFCOUNT_DELAY);
  		call->delayedAckEvent =
! 		    rxevent_PostNow(&when, &now, rxi_SendDelayedAck, call, 0);
  	    }
  	}
      }
Index: openafs/src/rx/SOLARIS/rx_knet.c
diff -c openafs/src/rx/SOLARIS/rx_knet.c:1.20.6.2 openafs/src/rx/SOLARIS/rx_knet.c:1.20.6.3
*** openafs/src/rx/SOLARIS/rx_knet.c:1.20.6.2	Wed Jan 30 16:05:48 2008
--- openafs/src/rx/SOLARIS/rx_knet.c	Mon Mar 17 11:28:34 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/SOLARIS/rx_knet.c,v 1.20.6.2 2008/01/30 21:05:48 shadow Exp $");
  
  #ifdef AFS_SUN5_ENV
  #include "rx/rx_kcommon.h"
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/SOLARIS/rx_knet.c,v 1.20.6.3 2008/03/17 15:28:34 shadow Exp $");
  
  #ifdef AFS_SUN5_ENV
  #include "rx/rx_kcommon.h"
***************
*** 444,450 ****
--- 444,454 ----
  
      /* Was sockfs_sounbind(so, 0); sockfs_sockfree(so); That's wrong */
      vp = SOTOV(so);
+  #ifdef AFS_SUN511_ENV
+     VOP_CLOSE(vp, FREAD|FWRITE, 1, (offset_t)0, CRED(), NULL);
+  #else
      VOP_CLOSE(vp, FREAD|FWRITE, 1, (offset_t)0, CRED());
+  #endif
      VN_RELE(vp);
  
      return 0;
Index: openafs/src/rx/UKERNEL/rx_knet.c
diff -c openafs/src/rx/UKERNEL/rx_knet.c:1.13 openafs/src/rx/UKERNEL/rx_knet.c:1.13.4.1
*** openafs/src/rx/UKERNEL/rx_knet.c:1.13	Thu Jan 26 10:52:37 2006
--- openafs/src/rx/UKERNEL/rx_knet.c	Mon Mar 10 18:32:34 2008
***************
*** 11,17 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/UKERNEL/rx_knet.c,v 1.13 2006/01/26 15:52:37 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
--- 11,17 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/rx/UKERNEL/rx_knet.c,v 1.13.4.1 2008/03/10 22:32:34 shadow Exp $");
  
  #include "rx/rx_kcommon.h"
  
***************
*** 134,141 ****
  /* This is the server process request loop. The server process loop
   * becomes a listener thread when rxi_ServerProc returns, and stays
   * listener thread until rxi_ListenerProc returns. */
! void
! rx_ServerProc(void)
  {
      osi_socket sock;
      int threadID;
--- 134,141 ----
  /* This is the server process request loop. The server process loop
   * becomes a listener thread when rxi_ServerProc returns, and stays
   * listener thread until rxi_ListenerProc returns. */
! void *
! rx_ServerProc(void *unused)
  {
      osi_socket sock;
      int threadID;
Index: openafs/src/sys/pioctl_nt.c
diff -c openafs/src/sys/pioctl_nt.c:1.34.4.8 openafs/src/sys/pioctl_nt.c:1.34.4.11
*** openafs/src/sys/pioctl_nt.c:1.34.4.8	Thu Oct 18 18:07:59 2007
--- openafs/src/sys/pioctl_nt.c	Fri Mar 21 00:17:14 2008
***************
*** 6,41 ****
   * License.  For details, see the LICENSE file in the top-level source
   * directory or online at http://www.openafs.org/dl/license10.html
   */
- /* AFSIFS portions copyright (c) 2005
-  * the regents of the university of michigan
-  * all rights reserved
-  * 
-  * permission is granted to use, copy, create derivative works and
-  * redistribute this software and such derivative works for any purpose,
-  * so long as the name of the university of michigan is not used in
-  * any advertising or publicity pertaining to the use or distribution
-  * of this software without specific, written prior authorization.  if
-  * the above copyright notice or any other identification of the
-  * university of michigan is included in any copy of any portion of
-  * this software, then the disclaimer below must also be included.
-  * 
-  * this software is provided as is, without representation from the
-  * university of michigan as to its fitness for any purpose, and without
-  * warranty by the university of michigan of any kind, either express
-  * or implied, including without limitation the implied warranties of
-  * merchantability and fitness for a particular purpose.  the regents
-  * of the university of michigan shall not be liable for any damages,
-  * including special, indirect, incidental, or consequential damages, 
-  * with respect to any claim arising out or in connection with the use
-  * of the software, even if it has been or is hereafter advised of the
-  * possibility of such damages.
-  */
  
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/sys/pioctl_nt.c,v 1.34.4.8 2007/10/18 22:07:59 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <windows.h>
--- 6,17 ----
   * License.  For details, see the LICENSE file in the top-level source
   * directory or online at http://www.openafs.org/dl/license10.html
   */
  
  #include <afsconfig.h>
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/sys/pioctl_nt.c,v 1.34.4.11 2008/03/21 04:17:14 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <windows.h>
***************
*** 67,73 ****
  #include <pioctl_nt.h>
  #include <WINNT/afsreg.h>
  #include <lanahelper.h>
- #include <../WINNT/afsrdr/kif.h>
  
  #include <loadfuncs-krb5.h>
  #include <krb5.h>
--- 43,48 ----
***************
*** 164,169 ****
--- 139,168 ----
      return debug;
  }
  
+ static BOOL
+ DisableServiceManagerCheck(void)
+ {
+     static int init = 0;
+     static BOOL smcheck = 0;
+ 
+     if ( !init ) {
+         HKEY hk;
+ 
+         if (RegOpenKey (HKEY_LOCAL_MACHINE, 
+                          TEXT("Software\\OpenAFS\\Client"), &hk) == 0)
+         {
+             DWORD dwSize = sizeof(BOOL);
+             DWORD dwType = REG_DWORD;
+             RegQueryValueEx (hk, TEXT("DisableIoctlSMCheck"), NULL, &dwType, (PBYTE)&smcheck, &dwSize);
+             RegCloseKey (hk);
+         }
+ 
+         init = 1;
+     }
+ 
+     return smcheck;
+ }
+ 
  static DWORD 
  GetServiceStatus(
      LPSTR lpszMachineName, 
***************
*** 397,408 ****
  static long
  GetIoctlHandle(char *fileNamep, HANDLE * handlep)
  {
- #ifndef AFSIFS
      char *drivep;
      char netbiosName[MAX_NB_NAME_LENGTH];
      DWORD CurrentState = 0;
      char  HostName[64] = "";
- #endif
      char tbuffer[256]="";
      HANDLE fh;
      HKEY hk;
--- 396,405 ----
***************
*** 415,424 ****
      DWORD gle;
      DWORD dwSize = sizeof(szUser);
  
- #ifndef AFSIFS
      memset(HostName, '\0', sizeof(HostName));
      gethostname(HostName, sizeof(HostName));
!     if (GetServiceStatus(HostName, TEXT("TransarcAFSDaemon"), &CurrentState) == NOERROR &&
  	CurrentState != SERVICE_RUNNING)
  	return -1;
  
--- 412,421 ----
      DWORD gle;
      DWORD dwSize = sizeof(szUser);
  
      memset(HostName, '\0', sizeof(HostName));
      gethostname(HostName, sizeof(HostName));
!     if (!DisableServiceManagerCheck() &&
!         GetServiceStatus(HostName, TEXT("TransarcAFSDaemon"), &CurrentState) == NOERROR &&
  	CurrentState != SERVICE_RUNNING)
  	return -1;
  
***************
*** 476,484 ****
          lana_GetNetbiosName(netbiosName,LANA_NETBIOS_NAME_FULL);
          sprintf(tbuffer,"\\\\%s\\all%s",netbiosName,SMB_IOCTL_FILENAME);
      }
- #else   
-     sprintf(tbuffer,"\\\\.\\afscom\\ioctl");
- #endif 
  
      fflush(stdout);
      /* now open the file */
--- 473,478 ----
***************
*** 488,499 ****
  
  	fflush(stdout);
  
- #ifdef AFSIFS
-     if (fh == INVALID_HANDLE_VALUE) {
-         return -1;
-     }
- #endif
- 	
      if (fh == INVALID_HANDLE_VALUE) {
          int  gonext = 0;
  
--- 482,487 ----
***************
*** 715,723 ****
      long rcount;
      long ioCount;
      DWORD gle;
- #ifdef AFSIFS
-     char *data;
- #endif
  
      rcount = (long)(reqp->mp - reqp->data);
      if (rcount <= 0) {
--- 703,708 ----
***************
*** 726,732 ****
  	return EINVAL;		/* not supposed to happen */
      }
  
- #ifndef AFSIFS
      if (!WriteFile(handle, reqp->data, rcount, &ioCount, NULL)) {
  	/* failed to write */
  	gle = GetLastError();
--- 711,716 ----
***************
*** 744,760 ****
              fprintf(stderr, "pioctl Transceive ReadFile failed: 0x%X\r\n",gle);
          return gle;
      }
- #else
-     /* ioctl completes as one operation, so copy input to a new buffer, and use as output buffer */
-     data = malloc(rcount);
-     memcpy(data, reqp->data, rcount);
-     if (!DeviceIoControl(handle, IOCTL_AFSRDR_IOCTL, data, rcount, reqp->data, sizeof(reqp->data), &ioCount, NULL))
-     {
-         free(data);
-         return GetLastError();
-     }
-     free(data);
- #endif
  
      reqp->nbytes = ioCount;	/* set # of bytes available */
      reqp->mp = reqp->data;	/* restart marshalling */
--- 728,733 ----
***************
*** 828,861 ****
      int pathHasDrive;
      int doSwitch;
      char newPath[3];
- #ifdef AFSIFS
-     HANDLE rootDir;
-     wchar_t *wpath;
-     unsigned long length;
- #endif
      char * p;
  
- #ifdef AFSIFS
-     if (!pathp)
-         return CM_ERROR_NOSUCHPATH;
- 
-     rootDir = CreateFile(pathp, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
-     if (rootDir == INVALID_HANDLE_VALUE)
-         return CM_ERROR_NOSUCHPATH;
- 
-     wpath = (wchar_t *)tpath;
-     length = 0;
-     if (!DeviceIoControl(rootDir, IOCTL_AFSRDR_GET_PATH, NULL, 0, wpath, 1000, &length, NULL))
-     {
-         CloseHandle(rootDir);
-         return CM_ERROR_NOSUCHPATH;
-     }
-     CloseHandle(rootDir);
- 
-     code = WideCharToMultiByte(CP_UTF8, 0/*WC_NO_BEST_FIT_CHARS*/, wpath, length/sizeof(wchar_t), outPathp, outSize/sizeof(wchar_t), NULL, NULL);
- 
-     return 0;
- #else
      if (pathp[0] != 0 && pathp[1] == ':') {
  	/* there's a drive letter there */
  	firstp = pathp + 2;
--- 801,808 ----
***************
*** 957,963 ****
  	    *p = '\\';
      }
      return 0;
- #endif
  }
  
  long
--- 904,909 ----
Index: openafs/src/ubik/beacon.c
diff -c openafs/src/ubik/beacon.c:1.21.8.2 openafs/src/ubik/beacon.c:1.21.8.3
*** openafs/src/ubik/beacon.c:1.21.8.2	Mon Nov 26 16:08:45 2007
--- openafs/src/ubik/beacon.c	Mon Mar 10 18:32:34 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/beacon.c,v 1.21.8.2 2007/11/26 21:08:45 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/beacon.c,v 1.21.8.3 2008/03/10 22:32:34 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 305,311 ****
   * we're sync site or we want to be the sync site.  It runs in its very own light-weight
   * process.
   */
! ubeacon_Interact()
  {
      register afs_int32 code;
      struct timeval tt;
--- 305,312 ----
   * we're sync site or we want to be the sync site.  It runs in its very own light-weight
   * process.
   */
! void *
! ubeacon_Interact(void *dummy)
  {
      register afs_int32 code;
      struct timeval tt;
Index: openafs/src/ubik/recovery.c
diff -c openafs/src/ubik/recovery.c:1.14.4.3 openafs/src/ubik/recovery.c:1.14.4.4
*** openafs/src/ubik/recovery.c:1.14.4.3	Wed Feb 20 15:09:05 2008
--- openafs/src/ubik/recovery.c	Mon Mar 10 18:32:34 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/recovery.c,v 1.14.4.3 2008/02/20 20:09:05 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/recovery.c,v 1.14.4.4 2008/03/10 22:32:34 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 412,419 ****
   * requests.  However, the recovery module still has one more task:
   * propagating the dbase out to everyone who is up in the network.
   */
! int
! urecovery_Interact(void)
  {
      afs_int32 code, tcode;
      struct ubik_server *bestServer = NULL;
--- 412,419 ----
   * requests.  However, the recovery module still has one more task:
   * propagating the dbase out to everyone who is up in the network.
   */
! void *
! urecovery_Interact(void *dummy)
  {
      afs_int32 code, tcode;
      struct ubik_server *bestServer = NULL;
Index: openafs/src/ubik/ubik.c
diff -c openafs/src/ubik/ubik.c:1.15.14.2 openafs/src/ubik/ubik.c:1.15.14.3
*** openafs/src/ubik/ubik.c:1.15.14.2	Tue Oct 30 11:16:47 2007
--- openafs/src/ubik/ubik.c	Mon Mar 10 18:32:34 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/ubik.c,v 1.15.14.2 2007/10/30 15:16:47 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/ubik/ubik.c,v 1.15.14.3 2008/03/10 22:32:34 shadow Exp $");
  
  #include <sys/types.h>
  #ifdef AFS_NT40_ENV
***************
*** 193,199 ****
  
      struct rx_service *tservice;
      extern int VOTE_ExecuteRequest(), DISK_ExecuteRequest();
-     extern void rx_ServerProc();
      extern int rx_stackSize;
  
      initialize_U_error_table();
--- 193,198 ----
Index: openafs/src/ubik/ubik.p.h
diff -c openafs/src/ubik/ubik.p.h:1.18.8.1 openafs/src/ubik/ubik.p.h:1.18.8.2
*** openafs/src/ubik/ubik.p.h:1.18.8.1	Mon Jul  3 15:07:15 2006
--- openafs/src/ubik/ubik.p.h	Mon Mar 10 18:32:34 2008
***************
*** 313,323 ****
  extern int urecovery_AbortAll(struct ubik_dbase *adbase);
  extern int urecovery_CheckTid(register struct ubik_tid *atid);
  extern int urecovery_Initialize(register struct ubik_dbase *adbase);
! extern int urecovery_Interact(void);
  extern int DoProbe(struct ubik_server *server);
  
  
! extern int ubeacon_Interact();
  extern int sdisk_Interact();
  extern int uvote_Interact();
  extern int DISK_Abort();
--- 313,323 ----
  extern int urecovery_AbortAll(struct ubik_dbase *adbase);
  extern int urecovery_CheckTid(register struct ubik_tid *atid);
  extern int urecovery_Initialize(register struct ubik_dbase *adbase);
! extern void *urecovery_Interact(void *);
  extern int DoProbe(struct ubik_server *server);
  
  
! extern void *ubeacon_Interact(void *);
  extern int sdisk_Interact();
  extern int uvote_Interact();
  extern int DISK_Abort();
Index: openafs/src/util/serverLog.c
diff -c openafs/src/util/serverLog.c:1.33.4.3 openafs/src/util/serverLog.c:1.33.4.4
*** openafs/src/util/serverLog.c:1.33.4.3	Wed Oct 31 00:26:18 2007
--- openafs/src/util/serverLog.c	Mon Mar 10 18:32:35 2008
***************
*** 20,26 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/util/serverLog.c,v 1.33.4.3 2007/10/31 04:26:18 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
--- 20,26 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/util/serverLog.c,v 1.33.4.4 2008/03/10 22:32:35 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
***************
*** 41,46 ****
--- 41,47 ----
  #include <sys/stat.h>
  #include "afsutil.h"
  #include "fileutil.h"
+ #include <lwp.h>
  #if defined(AFS_PTHREAD_ENV)
  #include <assert.h>
  #include <pthread.h>
***************
*** 165,173 ****
      va_end(args);
  }				/*FSLog */
  
! static int
! DebugOn(int loglevel)
  {
      if (loglevel == 0) {
  	ViceLog(0, ("Reset Debug levels to 0\n"));
      } else {
--- 166,175 ----
      va_end(args);
  }				/*FSLog */
  
! static void*
! DebugOn(void *param)
  {
+     int loglevel = (int)param;
      if (loglevel == 0) {
  	ViceLog(0, ("Reset Debug levels to 0\n"));
      } else {
***************
*** 181,188 ****
  void
  SetDebug_Signal(int signo)
  {
- /*    extern int IOMGR_SoftSig();*/
- 
      if (LogLevel > 0) {
  	LogLevel *= 5;
  
--- 183,188 ----
***************
*** 202,210 ****
      }
      printLocks = 2;
  #if defined(AFS_PTHREAD_ENV)
!     DebugOn(LogLevel);
  #else /* AFS_PTHREAD_ENV */
!     IOMGR_SoftSig(DebugOn, LogLevel);
  #endif /* AFS_PTHREAD_ENV */
  
      (void)signal(signo, SetDebug_Signal);	/* on some platforms, this
--- 202,210 ----
      }
      printLocks = 2;
  #if defined(AFS_PTHREAD_ENV)
!     DebugOn((void *) LogLevel);
  #else /* AFS_PTHREAD_ENV */
!     IOMGR_SoftSig(DebugOn, (void *) LogLevel);
  #endif /* AFS_PTHREAD_ENV */
  
      (void)signal(signo, SetDebug_Signal);	/* on some platforms, this
***************
*** 220,228 ****
      if (printLocks > 0)
  	--printLocks;
  #if defined(AFS_PTHREAD_ENV)
!     DebugOn(LogLevel);
  #else /* AFS_PTHREAD_ENV */
!     IOMGR_SoftSig(DebugOn, LogLevel);
  #endif /* AFS_PTHREAD_ENV */
  
      (void)signal(signo, ResetDebug_Signal);	/* on some platforms,
--- 220,228 ----
      if (printLocks > 0)
  	--printLocks;
  #if defined(AFS_PTHREAD_ENV)
!     DebugOn((void *) LogLevel);
  #else /* AFS_PTHREAD_ENV */
!     IOMGR_SoftSig(DebugOn, (void *) LogLevel);
  #endif /* AFS_PTHREAD_ENV */
  
      (void)signal(signo, ResetDebug_Signal);	/* on some platforms,
Index: openafs/src/viced/afsfileprocs.c
diff -c openafs/src/viced/afsfileprocs.c:1.113.2.22 openafs/src/viced/afsfileprocs.c:1.113.2.24
*** openafs/src/viced/afsfileprocs.c:1.113.2.22	Tue Feb 19 09:38:20 2008
--- openafs/src/viced/afsfileprocs.c	Thu Mar  6 11:55:46 2008
***************
*** 29,35 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/viced/afsfileprocs.c,v 1.113.2.22 2008/02/19 14:38:20 shadow Exp $");
  
  #include <stdio.h>
  #include <stdlib.h>
--- 29,35 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/viced/afsfileprocs.c,v 1.113.2.24 2008/03/06 16:55:46 shadow Exp $");
  
  #include <stdio.h>
  #include <stdlib.h>
***************
*** 469,474 ****
--- 469,482 ----
  	extern int VInit;
  
  	while (1) {
+ 	    int restarting = 
+ #ifdef AFS_DEMAND_ATTACH_FS
+ 		VSALVAGE
+ #else
+ 		VRESTARTING
+ #endif
+ 		;
+ 
  	    errorCode = 0;
  	    *volptr = VGetVolume(&local_errorCode, &errorCode, (afs_int32) fid->Volume);
  	    if (!errorCode) {
***************
*** 531,537 ****
  			afs_perfstats.fs_nBusies++;
  			FS_UNLOCK;
  		    }
! 		    return (busyonrst ? VBUSY : VRESTARTING);
  		} else {
  		    struct timeval now;
  		    TM_GetTimeOfDay(&now, 0);
--- 539,545 ----
  			afs_perfstats.fs_nBusies++;
  			FS_UNLOCK;
  		    }
! 		    return (busyonrst ? VBUSY : restarting);
  		} else {
  		    struct timeval now;
  		    TM_GetTimeOfDay(&now, 0);
***************
*** 541,549 ****
  			    afs_perfstats.fs_nBusies++;
  			    FS_UNLOCK;
  			}
! 			return (busyonrst ? VBUSY : VRESTARTING);
  		    } else {
! 			return (VRESTARTING);
  		    }
  		}
  	    }
--- 549,557 ----
  			    afs_perfstats.fs_nBusies++;
  			    FS_UNLOCK;
  			}
! 			return (busyonrst ? VBUSY : restarting);
  		    } else {
! 			return (restarting);
  		    }
  		}
  	    }
***************
*** 1850,1857 ****
      status->MinQuota = V_minquota(volptr);
      status->MaxQuota = V_maxquota(volptr);
      status->BlocksInUse = V_diskused(volptr);
!     status->PartBlocksAvail = volptr->partition->free;
!     status->PartMaxBlocks = volptr->partition->totalUsable;
  
      /* now allocate and copy these things; they're freed by the RXGEN stub */
      temp = strlen(V_name(volptr)) + 1;
--- 1858,1865 ----
      status->MinQuota = V_minquota(volptr);
      status->MaxQuota = V_maxquota(volptr);
      status->BlocksInUse = V_diskused(volptr);
!     status->PartBlocksAvail = RoundInt64ToInt32(volptr->partition->free);
!     status->PartMaxBlocks = RoundInt64ToInt32(volptr->partition->totalUsable);
  
      /* now allocate and copy these things; they're freed by the RXGEN stub */
      temp = strlen(V_name(volptr)) + 1;
***************
*** 5451,5463 ****
  void
  SetVolumeStats(struct AFSStatistics *stats)
  {
!     struct DiskPartition *part;
      int i = 0;
  
      for (part = DiskPartitionList; part && i < AFS_MSTATDISKS;
  	 part = part->next) {
! 	stats->Disks[i].TotalBlocks = part->totalUsable;
! 	stats->Disks[i].BlocksAvailable = part->free;
  	memset(stats->Disks[i].Name, 0, AFS_DISKNAMESIZE);
  	strncpy(stats->Disks[i].Name, part->name, AFS_DISKNAMESIZE);
  	i++;
--- 5459,5471 ----
  void
  SetVolumeStats(struct AFSStatistics *stats)
  {
!     struct DiskPartition64 *part;
      int i = 0;
  
      for (part = DiskPartitionList; part && i < AFS_MSTATDISKS;
  	 part = part->next) {
! 	stats->Disks[i].TotalBlocks = RoundInt64ToInt32(part->totalUsable);
! 	stats->Disks[i].BlocksAvailable = RoundInt64ToInt32(part->free);
  	memset(stats->Disks[i].Name, 0, AFS_DISKNAMESIZE);
  	strncpy(stats->Disks[i].Name, part->name, AFS_DISKNAMESIZE);
  	i++;
***************
*** 5532,5537 ****
--- 5540,5656 ----
  }				/*SRXAFS_GetStatistics */
  
  
+ afs_int32
+ SRXAFS_GetStatistics64(struct rx_call *acall, afs_int32 statsVersion, ViceStatistics64 *Statistics)
+ {
+     extern afs_int32 StartTime, CurrentConnections;
+     int seconds;
+     afs_int32 code;
+     struct rx_connection *tcon = rx_ConnectionOf(acall);
+     struct host *thost;
+     struct client *t_client = NULL;	/* tmp ptr to client data */
+     struct timeval time;
+ #if FS_STATS_DETAILED
+     struct fs_stats_opTimingData *opP;	/* Ptr to this op's timing struct */
+     struct timeval opStartTime, opStopTime;	/* Start/stop times for RPC op */
+     struct timeval elapsedTime;	/* Transfer time */
+ 
+     /*
+      * Set our stats pointer, remember when the RPC operation started, and
+      * tally the operation.
+      */
+     opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_GETSTATISTICS]);
+     FS_LOCK;
+     (opP->numOps)++;
+     FS_UNLOCK;
+     TM_GetTimeOfDay(&opStartTime, 0);
+ #endif /* FS_STATS_DETAILED */
+ 
+     if ((code = CallPreamble(acall, NOTACTIVECALL, &tcon, &thost)))
+ 	goto Bad_GetStatistics64;
+ 
+     ViceLog(1, ("SAFS_GetStatistics64 Received\n"));
+     Statistics->ViceStatistics64_val = 
+ 	malloc(statsVersion*sizeof(afs_int64));
+     Statistics->ViceStatistics64_len = statsVersion;
+     FS_LOCK;
+     AFSCallStats.GetStatistics++, AFSCallStats.TotalCalls++;
+     Statistics->ViceStatistics64_val[STATS64_STARTTIME] = StartTime;
+     Statistics->ViceStatistics64_val[STATS64_CURRENTCONNECTIONS] =
+ 	CurrentConnections;
+     Statistics->ViceStatistics64_val[STATS64_TOTALVICECALLS] = 
+ 	AFSCallStats.TotalCalls;
+     Statistics->ViceStatistics64_val[STATS64_TOTALFETCHES] =
+        AFSCallStats.FetchData + AFSCallStats.FetchACL +
+        AFSCallStats.FetchStatus;
+     Statistics->ViceStatistics64_val[STATS64_FETCHDATAS] = 
+ 	AFSCallStats.FetchData;
+     Statistics->ViceStatistics64_val[STATS64_FETCHEDBYTES] = 
+ 	AFSCallStats.TotalFetchedBytes;
+     seconds = AFSCallStats.AccumFetchTime / 1000;
+     if (seconds <= 0)
+         seconds = 1;
+     Statistics->ViceStatistics64_val[STATS64_FETCHDATARATE] = 
+ 	AFSCallStats.TotalFetchedBytes / seconds;
+     Statistics->ViceStatistics64_val[STATS64_TOTALSTORES] =
+         AFSCallStats.StoreData + AFSCallStats.StoreACL +
+         AFSCallStats.StoreStatus;
+     Statistics->ViceStatistics64_val[STATS64_STOREDATAS] = 
+ 	AFSCallStats.StoreData;
+     Statistics->ViceStatistics64_val[STATS64_STOREDBYTES] = 
+ 	AFSCallStats.TotalStoredBytes;
+     seconds = AFSCallStats.AccumStoreTime / 1000;
+     if (seconds <= 0)
+         seconds = 1;
+     Statistics->ViceStatistics64_val[STATS64_STOREDATARATE] = 
+ 	AFSCallStats.TotalStoredBytes / seconds;
+ #ifdef AFS_NT40_ENV
+     Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = -1;
+ #else
+     Statistics->ViceStatistics64_val[STATS64_PROCESSSIZE] = 
+ 	(afs_int32) ((long)sbrk(0) >> 10);
+ #endif
+     FS_UNLOCK;
+     h_GetWorkStats((int *)&(Statistics->ViceStatistics64_val[STATS64_WORKSTATIONS]),
+                    (int *)&(Statistics->ViceStatistics64_val[STATS64_ACTIVEWORKSTATIONS]), 
+ 		   (int *)0,
+                    (afs_int32) (FT_ApproxTime()) - (15 * 60));
+ 
+ 
+ 
+     /* this works on all system types */
+     TM_GetTimeOfDay(&time, 0);
+     Statistics->ViceStatistics64_val[STATS64_CURRENTTIME] = time.tv_sec;
+ 
+   Bad_GetStatistics64:
+     code = CallPostamble(tcon, code, thost);
+ 
+     t_client = (struct client *)rx_GetSpecific(tcon, rxcon_client_key);
+ 
+ #if FS_STATS_DETAILED
+     TM_GetTimeOfDay(&opStopTime, 0);
+     if (code == 0) {
+ 	FS_LOCK;
+ 	(opP->numSuccesses)++;
+ 	fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
+ 	fs_stats_AddTo((opP->sumTime), elapsedTime);
+ 	fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
+ 	if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
+ 	    fs_stats_TimeAssign((opP->minTime), elapsedTime);
+ 	}
+ 	if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
+ 	    fs_stats_TimeAssign((opP->maxTime), elapsedTime);
+ 	}
+ 	FS_UNLOCK;
+     }
+ #endif /* FS_STATS_DETAILED */
+ 
+     osi_auditU(acall, GetStatisticsEvent, code, 
+                AUD_ID, t_client ? t_client->ViceId : 0, AUD_END);
+     return code;
+ }				/*SRXAFS_GetStatistics */
+ 
+ 
  /*------------------------------------------------------------------------
   * EXPORTED SRXAFS_XStatsVersion
   *
Index: openafs/src/viced/host.h
diff -c openafs/src/viced/host.h:1.21.2.6 openafs/src/viced/host.h:1.21.2.7
*** openafs/src/viced/host.h:1.21.2.6	Mon Feb 25 12:03:51 2008
--- openafs/src/viced/host.h	Mon Mar 10 18:32:35 2008
***************
*** 224,230 ****
  				     struct AFSCBFids *afidp);
  extern int DumpCallBackState(void);
  extern int PrintCallBackStats(void);
! extern int ShutDown(void);
  extern void ShutDownAndCore(int dopanic);
  
  extern struct host *h_Alloc(register struct rx_connection *r_con);
--- 224,230 ----
  				     struct AFSCBFids *afidp);
  extern int DumpCallBackState(void);
  extern int PrintCallBackStats(void);
! extern void *ShutDown(void *);
  extern void ShutDownAndCore(int dopanic);
  
  extern struct host *h_Alloc(register struct rx_connection *r_con);
Index: openafs/src/viced/viced.c
diff -c openafs/src/viced/viced.c:1.75.2.20 openafs/src/viced/viced.c:1.75.2.21
*** openafs/src/viced/viced.c:1.75.2.20	Tue Jan 22 23:18:16 2008
--- openafs/src/viced/viced.c	Mon Mar 10 18:32:35 2008
***************
*** 22,28 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/viced/viced.c,v 1.75.2.20 2008/01/23 04:18:16 shadow Exp $");
  
  #include <stdio.h>
  #include <stdlib.h>
--- 22,28 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/viced/viced.c,v 1.75.2.21 2008/03/10 22:32:35 shadow Exp $");
  
  #include <stdio.h>
  #include <stdlib.h>
***************
*** 111,120 ****
  extern int LogLevel, etext;
  extern afs_int32 BlocksSpare, PctSpare;
  
! int ShutDown(void);
  static void ClearXStatValues(), NewParms(), PrintCounters();
  static void ResetCheckDescriptors(void), ResetCheckSignal(void);
! static int CheckSignal(void);
  extern int GetKeysFromToken();
  extern int RXAFS_ExecuteRequest();
  extern int RXSTATS_ExecuteRequest();
--- 111,120 ----
  extern int LogLevel, etext;
  extern afs_int32 BlocksSpare, PctSpare;
  
! void *ShutDown(void *);
  static void ClearXStatValues(), NewParms(), PrintCounters();
  static void ResetCheckDescriptors(void), ResetCheckSignal(void);
! static void *CheckSignal(void *);
  extern int GetKeysFromToken();
  extern int RXAFS_ExecuteRequest();
  extern int RXSTATS_ExecuteRequest();
***************
*** 246,253 ****
   */
  
  /* DEBUG HACK */
! static int
! CheckDescriptors()
  {
  #ifndef AFS_NT40_ENV
      struct afs_stat status;
--- 246,253 ----
   */
  
  /* DEBUG HACK */
! static void *
! CheckDescriptors(void *unused)
  {
  #ifndef AFS_NT40_ENV
      struct afs_stat status;
***************
*** 262,269 ****
      }
      fflush(stdout);
      ResetCheckDescriptors();
-     return 0;
  #endif
  }				/*CheckDescriptors */
  
  
--- 262,269 ----
      }
      fflush(stdout);
      ResetCheckDescriptors();
  #endif
+     return 0;
  }				/*CheckDescriptors */
  
  
***************
*** 271,289 ****
  void
  CheckSignal_Signal(x)
  {
!     CheckSignal();
  }
  
  void
  ShutDown_Signal(x)
  {
!     ShutDown();
  }
  
  void
  CheckDescriptors_Signal(x)
  {
!     CheckDescriptors();
  }
  #else /* AFS_PTHREAD_ENV */
  void
--- 271,289 ----
  void
  CheckSignal_Signal(x)
  {
!     CheckSignal(NULL);
  }
  
  void
  ShutDown_Signal(x)
  {
!     ShutDown(NULL);
  }
  
  void
  CheckDescriptors_Signal(x)
  {
!     CheckDescriptors(NULL);
  }
  #else /* AFS_PTHREAD_ENV */
  void
***************
*** 438,445 ****
  }
  
  /* This LWP does things roughly every 5 minutes */
! static void
! FiveMinuteCheckLWP()
  {
      static int msg = 0;
      char tbuffer[32];
--- 438,445 ----
  }
  
  /* This LWP does things roughly every 5 minutes */
! static void *
! FiveMinuteCheckLWP(void *unused)
  {
      static int msg = 0;
      char tbuffer[32];
***************
*** 507,512 ****
--- 507,513 ----
      FS_UNLOCK;
      FS_STATE_UNLOCK;
  #endif
+     return NULL;
  }				/*FiveMinuteCheckLWP */
  
  
***************
*** 515,522 ****
   * it probes the workstations
   */
  
! static void
! HostCheckLWP()
  {
      ViceLog(1, ("Starting Host check process\n"));
      setThreadId("HostCheckLWP");
--- 516,523 ----
   * it probes the workstations
   */
  
! static void *
! HostCheckLWP(void *unused)
  {
      ViceLog(1, ("Starting Host check process\n"));
      setThreadId("HostCheckLWP");
***************
*** 558,571 ****
      FS_UNLOCK;
      FS_STATE_UNLOCK;
  #endif
  }				/*HostCheckLWP */
  
  /* This LWP does fsync checks every 5 minutes:  it should not be used for
   * other 5 minute activities because it may be delayed by timeouts when
   * it probes the workstations
   */
! static void
! FsyncCheckLWP()
  {
      afs_int32 code;
  #ifdef AFS_PTHREAD_ENV
--- 559,573 ----
      FS_UNLOCK;
      FS_STATE_UNLOCK;
  #endif
+     return NULL;
  }				/*HostCheckLWP */
  
  /* This LWP does fsync checks every 5 minutes:  it should not be used for
   * other 5 minute activities because it may be delayed by timeouts when
   * it probes the workstations
   */
! static void *
! FsyncCheckLWP(void *unused)
  {
      afs_int32 code;
  #ifdef AFS_PTHREAD_ENV
***************
*** 624,629 ****
--- 626,632 ----
      FS_UNLOCK;
      FS_STATE_UNLOCK;
  #endif /* AFS_DEMAND_ATTACH_FS */
+     return NULL;
  }
  
  /*------------------------------------------------------------------------
***************
*** 743,750 ****
  
  
  
! static int
! CheckSignal()
  {
      if (FS_registered > 0) {
  	/*
--- 746,753 ----
  
  
  
! static void *
! CheckSignal(void *unused)
  {
      if (FS_registered > 0) {
  	/*
***************
*** 851,858 ****
      exit(0);
  }
  
! int
! ShutDown(void)
  {				/* backward compatibility */
      ShutDownAndCore(DONTPANIC);
      return 0;
--- 854,861 ----
      exit(0);
  }
  
! void *
! ShutDown(void *unused)
  {				/* backward compatibility */
      ShutDownAndCore(DONTPANIC);
      return 0;
***************
*** 2215,2226 ****
      assert(pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) == 0);
  
      assert(pthread_create
! 	   (&serverPid, &tattr, (void *)FiveMinuteCheckLWP,
  	    &fiveminutes) == 0);
      assert(pthread_create
! 	   (&serverPid, &tattr, (void *)HostCheckLWP, &fiveminutes) == 0);
      assert(pthread_create
! 	   (&serverPid, &tattr, (void *)FsyncCheckLWP, &fiveminutes) == 0);
  #else /* AFS_PTHREAD_ENV */
      ViceLog(5, ("Starting LWP\n"));
      assert(LWP_CreateProcess
--- 2218,2229 ----
      assert(pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED) == 0);
  
      assert(pthread_create
! 	   (&serverPid, &tattr, FiveMinuteCheckLWP,
  	    &fiveminutes) == 0);
      assert(pthread_create
! 	   (&serverPid, &tattr, HostCheckLWP, &fiveminutes) == 0);
      assert(pthread_create
! 	   (&serverPid, &tattr, FsyncCheckLWP, &fiveminutes) == 0);
  #else /* AFS_PTHREAD_ENV */
      ViceLog(5, ("Starting LWP\n"));
      assert(LWP_CreateProcess
Index: openafs/src/vlserver/vlserver.c
diff -c openafs/src/vlserver/vlserver.c:1.22.2.6 openafs/src/vlserver/vlserver.c:1.22.2.7
*** openafs/src/vlserver/vlserver.c:1.22.2.6	Sun Feb  3 22:51:41 2008
--- openafs/src/vlserver/vlserver.c	Mon Mar 10 18:32:36 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vlserver/vlserver.c,v 1.22.2.6 2008/02/04 03:51:41 jaltman Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vlserver/vlserver.c,v 1.22.2.7 2008/03/10 22:32:36 shadow Exp $");
  
  #include <afs/stds.h>
  #include <sys/types.h>
***************
*** 60,66 ****
  extern int afsconf_CheckAuth();
  extern int afsconf_ServerAuth();
  
! static CheckSignal();
  int LogLevel = 0;
  int smallMem = 0;
  int rxJumbograms = 1;		/* default is to send and receive jumbo grams */
--- 60,66 ----
  extern int afsconf_CheckAuth();
  extern int afsconf_ServerAuth();
  
! static void *CheckSignal(void*);
  int LogLevel = 0;
  int smallMem = 0;
  int rxJumbograms = 1;		/* default is to send and receive jumbo grams */
***************
*** 77,84 ****
      IOMGR_SoftSig(CheckSignal, 0);
  }
  
! static
! CheckSignal()
  {
      register int i, errorcode;
      struct ubik_trans *trans;
--- 77,84 ----
      IOMGR_SoftSig(CheckSignal, 0);
  }
  
! static void *
! CheckSignal(void *unused)
  {
      register int i, errorcode;
      struct ubik_trans *trans;
***************
*** 94,100 ****
      for (i = 0; i < HASHSIZE; i++) {
  	HashIdDump(trans, i);
      }
!     return (ubik_EndTrans(trans));
  }				/*CheckSignal */
  
  
--- 94,100 ----
      for (i = 0; i < HASHSIZE; i++) {
  	HashIdDump(trans, i);
      }
!     return ((void *)ubik_EndTrans(trans));
  }				/*CheckSignal */
  
  
Index: openafs/src/vol/clone.c
diff -c openafs/src/vol/clone.c:1.19.2.7 openafs/src/vol/clone.c:1.19.2.8
*** openafs/src/vol/clone.c:1.19.2.7	Tue Oct 30 11:16:57 2007
--- openafs/src/vol/clone.c	Wed Mar  5 16:53:30 2008
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/clone.c,v 1.19.2.7 2007/10/30 15:16:57 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/clone.c,v 1.19.2.8 2008/03/05 21:53:30 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
***************
*** 175,181 ****
  
      struct VnodeClassInfo *vcp = &VnodeClassInfo[class];
      int ReadWriteOriginal = VolumeWriteable(rwvp);
-     struct DiskPartition *partition = rwvp->partition;
      Device device = rwvp->device;
  
      /* Open the RW volume's index file and seek to beginning */
--- 175,180 ----
Index: openafs/src/vol/daemon_com.c
diff -c openafs/src/vol/daemon_com.c:1.3.4.5 openafs/src/vol/daemon_com.c:1.3.4.6
*** openafs/src/vol/daemon_com.c:1.3.4.5	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/daemon_com.c	Fri Mar 21 12:59:14 2008
***************
*** 22,28 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/daemon_com.c,v 1.3.4.5 2008/02/04 18:51:39 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
--- 22,28 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/daemon_com.c,v 1.3.4.6 2008/03/21 16:59:14 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
***************
*** 77,82 ****
--- 77,94 ----
  
  static int SYNC_ask_internal(SYNC_client_state * state, SYNC_command * com, SYNC_response * res);
  
+ 
+ /*
+  * On AIX, connect() and bind() require use of SUN_LEN() macro;
+  * sizeof(struct sockaddr_un) will not suffice.
+  */
+ #if defined(AFS_AIX_ENV) && defined(USE_UNIX_SOCKETS)
+ #define AFS_SOCKADDR_LEN(sa)  SUN_LEN(sa)
+ #else
+ #define AFS_SOCKADDR_LEN(sa)  sizeof(*sa)
+ #endif
+ 
+ 
  /* daemon com SYNC general interfaces */
  
  /**
***************
*** 159,165 ****
  
      for (;;) {
  	state->fd = SYNC_getSock(&state->endpoint);
! 	if (connect(state->fd, (struct sockaddr *)&addr, sizeof(addr)) >= 0)
  	    return 1;
  	if (!*timeout)
  	    break;
--- 171,177 ----
  
      for (;;) {
  	state->fd = SYNC_getSock(&state->endpoint);
! 	if (connect(state->fd, (struct sockaddr *)&addr, AFS_SOCKADDR_LEN(&addr)) >= 0)
  	    return 1;
  	if (!*timeout)
  	    break;
***************
*** 647,653 ****
      for (numTries = 0; numTries < state->bind_retry_limit; numTries++) {
  	code = bind(state->fd, 
  		    (struct sockaddr *)&state->addr, 
! 		    sizeof(state->addr));
  	if (code == 0)
  	    break;
  	Log("SYNC_bindSock: bind failed with (%d), will sleep and retry\n",
--- 659,665 ----
      for (numTries = 0; numTries < state->bind_retry_limit; numTries++) {
  	code = bind(state->fd, 
  		    (struct sockaddr *)&state->addr, 
! 		    AFS_SOCKADDR_LEN(&state->addr));
  	if (code == 0)
  	    break;
  	Log("SYNC_bindSock: bind failed with (%d), will sleep and retry\n",
Index: openafs/src/vol/daemon_com.h
diff -c openafs/src/vol/daemon_com.h:1.1.4.2 openafs/src/vol/daemon_com.h:1.1.4.3
*** openafs/src/vol/daemon_com.h:1.1.4.2	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/daemon_com.h	Fri Mar 14 00:42:52 2008
***************
*** 27,32 ****
--- 27,33 ----
   */
  enum SYNCOpCode {
      SYNC_COM_CHANNEL_CLOSE    = 0,      /**< request sync channel shutdown */
+     SYNC_OP_CODE_END
  };
  
  
***************
*** 47,52 ****
--- 48,54 ----
      SYNC_COM_ERROR            = 2,  /**< sync protocol communicaions error */
      SYNC_BAD_COMMAND          = 3,  /**< sync command code not implemented by server */
      SYNC_FAILED               = 4,  /**< sync server-side procedure failed */
+     SYNC_REASON_CODE_END
  };
  
  /* SYNC protocol reason codes
Index: openafs/src/vol/fssync-debug.c
diff -c openafs/src/vol/fssync-debug.c:1.1.4.2 openafs/src/vol/fssync-debug.c:1.1.4.4
*** openafs/src/vol/fssync-debug.c:1.1.4.2	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/fssync-debug.c	Mon Mar 17 12:05:28 2008
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/fssync-debug.c,v 1.1.4.2 2008/02/04 18:51:39 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/fssync-debug.c,v 1.1.4.4 2008/03/17 16:05:28 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
***************
*** 105,111 ****
  static int VnQuery(struct cmd_syndesc * as, void * rock);
  
  static void print_vol_stats_general(VolPkgStats * stats);
! static void print_vol_stats_viceP(struct DiskPartitionStats * stats);
  static void print_vol_stats_hash(struct VolumeHashChainStats * stats);
  #ifdef AFS_DEMAND_ATTACH_FS
  static void print_vol_stats_hdr(struct volume_hdr_LRU_stats * stats);
--- 105,111 ----
  static int VnQuery(struct cmd_syndesc * as, void * rock);
  
  static void print_vol_stats_general(VolPkgStats * stats);
! static void print_vol_stats_viceP(struct DiskPartitionStats64 * stats);
  static void print_vol_stats_hash(struct VolumeHashChainStats * stats);
  #ifdef AFS_DEMAND_ATTACH_FS
  static void print_vol_stats_hdr(struct volume_hdr_LRU_stats * stats);
***************
*** 759,765 ****
  	
  	printf("\tid               = %u\n", v.id);
  	printf("\tname             = '%s'\n", v.name);
! 	printf("\tinUse            = %d\n", v.inUse);
  	printf("\tinService        = %d\n", v.inService);
  	printf("\tblessed          = %d\n", v.blessed);
  	printf("\tneedsSalvaged    = %d\n", v.needsSalvaged);
--- 759,769 ----
  	
  	printf("\tid               = %u\n", v.id);
  	printf("\tname             = '%s'\n", v.name);
! 	if (v.inUse != 0) {
! 	    printf("\tinUse            = %d (%s)\n", v.inUse, program_type_to_string(v.inUse));
! 	} else {
! 	    printf("\tinUse            = %d (no)\n", v.inUse);
! 	}
  	printf("\tinService        = %d\n", v.inService);
  	printf("\tblessed          = %d\n", v.blessed);
  	printf("\tneedsSalvaged    = %d\n", v.needsSalvaged);
***************
*** 1045,1051 ****
  #ifdef AFS_DEMAND_ATTACH_FS
  	struct volume_hdr_LRU_stats * hdr_stats;
  #endif
! 	struct DiskPartitionStats * vicep_stats;
      } sres;
  
      sres.ptr = res_buf;
--- 1049,1055 ----
  #ifdef AFS_DEMAND_ATTACH_FS
  	struct volume_hdr_LRU_stats * hdr_stats;
  #endif
! 	struct DiskPartitionStats64 * vicep_stats;
      } sres;
  
      sres.ptr = res_buf;
***************
*** 1222,1234 ****
  }
  
  static void
! print_vol_stats_viceP(struct DiskPartitionStats * stats)
  {
!     printf("DiskPartitionStats = {\n");
!     printf("\tfree = %d\n", stats->free);
!     printf("\tminFree = %d\n", stats->minFree);
!     printf("\ttotalUsable = %d\n", stats->totalUsable);
!     printf("\tf_files = %d\n", stats->f_files);
  #ifdef AFS_DEMAND_ATTACH_FS
      printf("\tvol_list_len = %d\n", stats->vol_list_len);
  #endif
--- 1226,1238 ----
  }
  
  static void
! print_vol_stats_viceP(struct DiskPartitionStats64 * stats)
  {
!     printf("DiskPartitionStats64 = {\n");
!     printf("\tfree = %lld\n", stats->free);
!     printf("\tminFree = %lld\n", stats->minFree);
!     printf("\ttotalUsable = %lld\n", stats->totalUsable);
!     printf("\tf_files = %lld\n", stats->f_files);
  #ifdef AFS_DEMAND_ATTACH_FS
      printf("\tvol_list_len = %d\n", stats->vol_list_len);
  #endif
Index: openafs/src/vol/fssync-server.c
diff -c openafs/src/vol/fssync-server.c:1.1.4.8 openafs/src/vol/fssync-server.c:1.1.4.9
*** openafs/src/vol/fssync-server.c:1.1.4.8	Sun Feb 10 22:37:22 2008
--- openafs/src/vol/fssync-server.c	Wed Mar  5 16:53:30 2008
***************
*** 53,59 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/fssync-server.c,v 1.1.4.8 2008/02/11 03:37:22 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
--- 53,59 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/fssync-server.c,v 1.1.4.9 2008/03/05 21:53:30 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
***************
*** 1078,1085 ****
  FSYNC_com_StatsOpViceP(FSSYNC_StatsOp_command * scom, SYNC_response * res)
  {
      afs_int32 code = SYNC_OK;
!     struct DiskPartition * dp;
!     struct DiskPartitionStats * stats;
  
      if (SYNC_verifyProtocolString(scom->sop->args.partName, sizeof(scom->sop->args.partName))) {
  	res->hdr.reason = SYNC_REASON_MALFORMED_PACKET;
--- 1078,1085 ----
  FSYNC_com_StatsOpViceP(FSSYNC_StatsOp_command * scom, SYNC_response * res)
  {
      afs_int32 code = SYNC_OK;
!     struct DiskPartition64 * dp;
!     struct DiskPartitionStats64 * stats;
  
      if (SYNC_verifyProtocolString(scom->sop->args.partName, sizeof(scom->sop->args.partName))) {
  	res->hdr.reason = SYNC_REASON_MALFORMED_PACKET;
***************
*** 1091,1104 ****
      if (!dp) {
  	code = SYNC_FAILED;
      } else {
! 	stats = (struct DiskPartitionStats *) res->payload.buf;
  	stats->free = dp->free;
  	stats->totalUsable = dp->totalUsable;
  	stats->minFree = dp->minFree;
  	stats->f_files = dp->f_files;
  	stats->vol_list_len = dp->vol_list.len;
  	
! 	res->hdr.response_len += sizeof(struct DiskPartitionStats);
      }
  
   done:
--- 1091,1104 ----
      if (!dp) {
  	code = SYNC_FAILED;
      } else {
! 	stats = (struct DiskPartitionStats64 *) res->payload.buf;
  	stats->free = dp->free;
  	stats->totalUsable = dp->totalUsable;
  	stats->minFree = dp->minFree;
  	stats->f_files = dp->f_files;
  	stats->vol_list_len = dp->vol_list.len;
  	
! 	res->hdr.response_len += sizeof(struct DiskPartitionStats64);
      }
  
   done:
Index: openafs/src/vol/fssync.h
diff -c openafs/src/vol/fssync.h:1.5.2.2 openafs/src/vol/fssync.h:1.5.2.3
*** openafs/src/vol/fssync.h:1.5.2.2	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/fssync.h	Fri Mar 14 00:42:52 2008
***************
*** 50,55 ****
--- 50,56 ----
      FSYNC_VOL_FORCE_ERROR     = SYNC_COM_CODE_DECL(16), /**< force volume into error state */
      FSYNC_VOL_LEAVE_OFF       = SYNC_COM_CODE_DECL(17), /**< end vol op, but leave volume offline */
      FSYNC_VOL_QUERY_VNODE     = SYNC_COM_CODE_DECL(18), /**< query vnode state */
+     FSYNC_OP_CODE_END
  };
  
  /**
***************
*** 66,71 ****
--- 67,73 ----
      FSYNC_NO_PENDING_VOL_OP   = SYNC_REASON_CODE_DECL(7), /**< no volume operation pending */
      FSYNC_VOL_PKG_ERROR       = SYNC_REASON_CODE_DECL(8), /**< error in the volume package */
      FSYNC_UNKNOWN_VNID        = SYNC_REASON_CODE_DECL(9), /**< vnode id not known by fileserver */
+     FSYNC_REASON_CODE_END
  };
  
  /* FSYNC response codes */
Index: openafs/src/vol/listinodes.c
diff -c openafs/src/vol/listinodes.c:1.16.4.5 openafs/src/vol/listinodes.c:1.16.4.6
*** openafs/src/vol/listinodes.c:1.16.4.5	Tue Dec  4 16:03:33 2007
--- openafs/src/vol/listinodes.c	Wed Mar  5 16:53:30 2008
***************
*** 23,29 ****
  #include <string.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/listinodes.c,v 1.16.4.5 2007/12/04 21:03:33 shadow Exp $");
  
  #ifndef AFS_NAMEI_ENV
  #if defined(AFS_LINUX20_ENV) || defined(AFS_SUN4_ENV)
--- 23,29 ----
  #include <string.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/listinodes.c,v 1.16.4.6 2008/03/05 21:53:30 shadow Exp $");
  
  #ifndef AFS_NAMEI_ENV
  #if defined(AFS_LINUX20_ENV) || defined(AFS_SUN4_ENV)
***************
*** 1652,1658 ****
      char *name;
      int fd, err, forcep, len, j, code;
      struct dirent *dp;
!     struct DiskPartition *partP;
      struct ViceInodeInfo info;
      struct VolumeDiskHeader h;
      IHandle_t *ih, *ih2;
--- 1652,1658 ----
      char *name;
      int fd, err, forcep, len, j, code;
      struct dirent *dp;
!     struct DiskPartition64 *partP;
      struct ViceInodeInfo info;
      struct VolumeDiskHeader h;
      IHandle_t *ih, *ih2;
Index: openafs/src/vol/namei_ops.c
diff -c openafs/src/vol/namei_ops.c:1.28.2.15 openafs/src/vol/namei_ops.c:1.28.2.16
*** openafs/src/vol/namei_ops.c:1.28.2.15	Mon Nov 26 16:08:46 2007
--- openafs/src/vol/namei_ops.c	Wed Mar  5 16:53:30 2008
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/namei_ops.c,v 1.28.2.15 2007/11/26 21:08:46 shadow Exp $");
  
  #ifdef AFS_NAMEI_ENV
  #include <stdio.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/namei_ops.c,v 1.28.2.16 2008/03/05 21:53:30 shadow Exp $");
  
  #ifdef AFS_NAMEI_ENV
  #include <stdio.h>
***************
*** 1564,1570 ****
      DIR *dirp;
      Inode ino;
      struct dirent *dp;
!     struct DiskPartition *partP;
      struct ViceInodeInfo info;
      struct VolumeDiskHeader h;
      char volname[20];
--- 1564,1570 ----
      DIR *dirp;
      Inode ino;
      struct dirent *dp;
!     struct DiskPartition64 *partP;
      struct ViceInodeInfo info;
      struct VolumeDiskHeader h;
      char volname[20];
Index: openafs/src/vol/partition.c
diff -c openafs/src/vol/partition.c:1.33.2.4 openafs/src/vol/partition.c:1.33.2.5
*** openafs/src/vol/partition.c:1.33.2.4	Fri Nov 30 14:17:02 2007
--- openafs/src/vol/partition.c	Wed Mar  5 16:53:30 2008
***************
*** 22,28 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/partition.c,v 1.33.2.4 2007/11/30 19:17:02 shadow Exp $");
  
  #include <ctype.h>
  #include <string.h>
--- 22,28 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/partition.c,v 1.33.2.5 2008/03/05 21:53:30 shadow Exp $");
  
  #include <ctype.h>
  #include <string.h>
***************
*** 181,194 ****
  /*@printflike@*/ extern void Log(const char *format, ...);
  
  int aixlow_water = 8;		/* default 8% */
! struct DiskPartition *DiskPartitionList;
  
  #ifdef AFS_DEMAND_ATTACH_FS
! static struct DiskPartition *DiskPartitionTable[VOLMAXPARTS+1];
  
! static struct DiskPartition * VLookupPartition_r(char * path);
! static void AddPartitionToTable_r(struct DiskPartition *);
! static void DeletePartitionFromTable_r(struct DiskPartition *);
  #endif /* AFS_DEMAND_ATTACH_FS */
  
  #ifdef AFS_SGI_XFS_IOPS_ENV
--- 181,194 ----
  /*@printflike@*/ extern void Log(const char *format, ...);
  
  int aixlow_water = 8;		/* default 8% */
! struct DiskPartition64 *DiskPartitionList;
  
  #ifdef AFS_DEMAND_ATTACH_FS
! static struct DiskPartition64 *DiskPartitionTable[VOLMAXPARTS+1];
  
! static struct DiskPartition64 * VLookupPartition_r(char * path);
! static void AddPartitionToTable_r(struct DiskPartition64 *);
! static void DeletePartitionFromTable_r(struct DiskPartition64 *);
  #endif /* AFS_DEMAND_ATTACH_FS */
  
  #ifdef AFS_SGI_XFS_IOPS_ENV
***************
*** 241,248 ****
  static void
  VInitPartition_r(char *path, char *devname, Device dev)
  {
!     struct DiskPartition *dp, *op;
!     dp = (struct DiskPartition *)malloc(sizeof(struct DiskPartition));
      /* Add it to the end, to preserve order when we print statistics */
      for (op = DiskPartitionList; op; op = op->next) {
  	if (!op->next)
--- 241,248 ----
  static void
  VInitPartition_r(char *path, char *devname, Device dev)
  {
!     struct DiskPartition64 *dp, *op;
!     dp = (struct DiskPartition64 *)malloc(sizeof(struct DiskPartition64));
      /* Add it to the end, to preserve order when we print statistics */
      for (op = DiskPartitionList; op; op = op->next) {
  	if (!op->next)
***************
*** 733,739 ****
  int
  VAttachPartitions(void)
  {
!     struct DiskPartition *partP, *prevP, *nextP;
      struct vpt_iter iter;
      struct vptab entry;
  
--- 733,739 ----
  int
  VAttachPartitions(void)
  {
!     struct DiskPartition64 *partP, *prevP, *nextP;
      struct vpt_iter iter;
      struct vptab entry;
  
***************
*** 834,840 ****
   * is required. The canonical name is still in part->name.
   */
  char *
! VPartitionPath(struct DiskPartition *part)
  {
  #ifdef AFS_NT40_ENV
      return part->devName;
--- 834,840 ----
   * is required. The canonical name is still in part->name.
   */
  char *
! VPartitionPath(struct DiskPartition64 *part)
  {
  #ifdef AFS_NT40_ENV
      return part->devName;
***************
*** 844,853 ****
  }
  
  /* get partition structure, abortp tells us if we should abort on failure */
! struct DiskPartition *
  VGetPartition_r(char *name, int abortp)
  {
!     register struct DiskPartition *dp;
  #ifdef AFS_DEMAND_ATTACH_FS
      dp = VLookupPartition_r(name);
  #else /* AFS_DEMAND_ATTACH_FS */
--- 844,853 ----
  }
  
  /* get partition structure, abortp tells us if we should abort on failure */
! struct DiskPartition64 *
  VGetPartition_r(char *name, int abortp)
  {
!     register struct DiskPartition64 *dp;
  #ifdef AFS_DEMAND_ATTACH_FS
      dp = VLookupPartition_r(name);
  #else /* AFS_DEMAND_ATTACH_FS */
***************
*** 861,870 ****
      return dp;
  }
  
! struct DiskPartition *
  VGetPartition(char *name, int abortp)
  {
!     struct DiskPartition *retVal;
      VOL_LOCK;
      retVal = VGetPartition_r(name, abortp);
      VOL_UNLOCK;
--- 861,870 ----
      return dp;
  }
  
! struct DiskPartition64 *
  VGetPartition(char *name, int abortp)
  {
!     struct DiskPartition64 *retVal;
      VOL_LOCK;
      retVal = VGetPartition_r(name, abortp);
      VOL_UNLOCK;
***************
*** 873,879 ****
  
  #ifdef AFS_NT40_ENV
  void
! VSetPartitionDiskUsage_r(register struct DiskPartition *dp)
  {
      ULARGE_INTEGER free_user, total, free_total;
      int ufree, tot, tfree;
--- 873,879 ----
  
  #ifdef AFS_NT40_ENV
  void
! VSetPartitionDiskUsage_r(register struct DiskPartition64 *dp)
  {
      ULARGE_INTEGER free_user, total, free_total;
      int ufree, tot, tfree;
***************
*** 897,905 ****
  
  #else
  void
! VSetPartitionDiskUsage_r(register struct DiskPartition *dp)
  {
!     int fd, totalblks, free, used, availblks, bsize, code;
      int reserved;
  #ifdef afs_statvfs
      struct afs_statvfs statbuf;
--- 897,906 ----
  
  #else
  void
! VSetPartitionDiskUsage_r(register struct DiskPartition64 *dp)
  {
!     int fd, bsize, code;
!     afs_int64 totalblks, free, used, availblks;
      int reserved;
  #ifdef afs_statvfs
      struct afs_statvfs statbuf;
***************
*** 962,968 ****
  #endif /* AFS_NT40_ENV */
  
  void
! VSetPartitionDiskUsage(register struct DiskPartition *dp)
  {
      VOL_LOCK;
      VSetPartitionDiskUsage_r(dp);
--- 963,969 ----
  #endif /* AFS_NT40_ENV */
  
  void
! VSetPartitionDiskUsage(register struct DiskPartition64 *dp)
  {
      VOL_LOCK;
      VSetPartitionDiskUsage_r(dp);
***************
*** 972,978 ****
  void
  VResetDiskUsage_r(void)
  {
!     struct DiskPartition *dp;
      for (dp = DiskPartitionList; dp; dp = dp->next) {
  	VSetPartitionDiskUsage_r(dp);
  #ifndef AFS_PTHREAD_ENV
--- 973,979 ----
  void
  VResetDiskUsage_r(void)
  {
!     struct DiskPartition64 *dp;
      for (dp = DiskPartitionList; dp; dp = dp->next) {
  	VSetPartitionDiskUsage_r(dp);
  #ifndef AFS_PTHREAD_ENV
***************
*** 1061,1067 ****
  void
  VPrintDiskStats_r(void)
  {
!     struct DiskPartition *dp;
      for (dp = DiskPartitionList; dp; dp = dp->next) {
  	Log("Partition %s: %d available 1K blocks (minfree=%d), ", dp->name,
  	    dp->totalUsable, dp->minFree);
--- 1062,1068 ----
  void
  VPrintDiskStats_r(void)
  {
!     struct DiskPartition64 *dp;
      for (dp = DiskPartitionList; dp; dp = dp->next) {
  	Log("Partition %s: %d available 1K blocks (minfree=%d), ", dp->name,
  	    dp->totalUsable, dp->minFree);
***************
*** 1086,1092 ****
  void
  VLockPartition_r(char *name)
  {
!     struct DiskPartition *dp = VGetPartition_r(name, 0);
      OVERLAPPED lap;
  
      if (!dp)
--- 1087,1093 ----
  void
  VLockPartition_r(char *name)
  {
!     struct DiskPartition64 *dp = VGetPartition_r(name, 0);
      OVERLAPPED lap;
  
      if (!dp)
***************
*** 1111,1117 ****
  void
  VUnlockPartition_r(char *name)
  {
!     register struct DiskPartition *dp = VGetPartition_r(name, 0);
      OVERLAPPED lap;
  
      if (!dp)
--- 1112,1118 ----
  void
  VUnlockPartition_r(char *name)
  {
!     register struct DiskPartition64 *dp = VGetPartition_r(name, 0);
      OVERLAPPED lap;
  
      if (!dp)
***************
*** 1134,1140 ****
  void
  VLockPartition_r(char *name)
  {
!     register struct DiskPartition *dp = VGetPartition_r(name, 0);
      char *partitionName;
      int retries, code;
      struct timeval pausing;
--- 1135,1141 ----
  void
  VLockPartition_r(char *name)
  {
!     register struct DiskPartition64 *dp = VGetPartition_r(name, 0);
      char *partitionName;
      int retries, code;
      struct timeval pausing;
***************
*** 1237,1243 ****
  void
  VUnlockPartition_r(char *name)
  {
!     register struct DiskPartition *dp = VGetPartition_r(name, 0);
      if (!dp)
  	return;			/* no partition, will fail later */
      close(dp->lock_fd);
--- 1238,1244 ----
  void
  VUnlockPartition_r(char *name)
  {
!     register struct DiskPartition64 *dp = VGetPartition_r(name, 0);
      if (!dp)
  	return;			/* no partition, will fail later */
      close(dp->lock_fd);
***************
*** 1266,1275 ****
  /* XXX not sure this will work on AFS_NT40_ENV
   * needs to be tested!
   */
! struct DiskPartition * 
  VGetPartitionById_r(afs_int32 id, int abortp)
  {
!     struct DiskPartition * dp = NULL;
  
      if ((id >= 0) && (id <= VOLMAXPARTS)) {
  	dp = DiskPartitionTable[id];
--- 1267,1276 ----
  /* XXX not sure this will work on AFS_NT40_ENV
   * needs to be tested!
   */
! struct DiskPartition64 * 
  VGetPartitionById_r(afs_int32 id, int abortp)
  {
!     struct DiskPartition64 *dp = NULL;
  
      if ((id >= 0) && (id <= VOLMAXPARTS)) {
  	dp = DiskPartitionTable[id];
***************
*** 1281,1290 ****
      return dp;
  }
  
! struct DiskPartition *
  VGetPartitionById(afs_int32 id, int abortp)
  {
!     struct Diskpartition * dp;
  
      VOL_LOCK;
      dp = VGetPartitionById_r(id, abortp);
--- 1282,1291 ----
      return dp;
  }
  
! struct DiskPartition64 *
  VGetPartitionById(afs_int32 id, int abortp)
  {
!     struct Diskpartition64 * dp;
  
      VOL_LOCK;
      dp = VGetPartitionById_r(id, abortp);
***************
*** 1293,1299 ****
      return dp;
  }
  
! static struct DiskPartition * 
  VLookupPartition_r(char * path)
  {
      afs_int32 id = volutil_GetPartitionID(path);
--- 1294,1300 ----
      return dp;
  }
  
! static struct DiskPartition64 * 
  VLookupPartition_r(char * path)
  {
      afs_int32 id = volutil_GetPartitionID(path);
***************
*** 1305,1318 ****
  }
  
  static void 
! AddPartitionToTable_r(struct DiskPartition * dp)
  {
      assert(dp->index >= 0 && dp->index <= VOLMAXPARTS);
      DiskPartitionTable[dp->index] = dp;
  }
  
  static void 
! DeletePartitionFromTable_r(struct DiskPartition * dp)
  {
      assert(dp->index >= 0 && dp->index <= VOLMAXPARTS);
      DiskPartitionTable[dp->index] = NULL;
--- 1306,1319 ----
  }
  
  static void 
! AddPartitionToTable_r(struct DiskPartition64 *dp)
  {
      assert(dp->index >= 0 && dp->index <= VOLMAXPARTS);
      DiskPartitionTable[dp->index] = dp;
  }
  
  static void 
! DeletePartitionFromTable_r(struct DiskPartition64 *dp)
  {
      assert(dp->index >= 0 && dp->index <= VOLMAXPARTS);
      DiskPartitionTable[dp->index] = NULL;
Index: openafs/src/vol/partition.h
diff -c openafs/src/vol/partition.h:1.10 openafs/src/vol/partition.h:1.10.2.1
*** openafs/src/vol/partition.h:1.10	Fri Mar 17 14:54:51 2006
--- openafs/src/vol/partition.h	Wed Mar  5 16:53:30 2008
***************
*** 51,65 ****
   * variant for VGetPartition as well. Also, the VolPartitionInfo RPC does
   * a swap before sending the data out on the wire.
   */
! struct DiskPartition {
!     struct DiskPartition *next;
      char *name;			/* Mounted partition name */
      char *devName;		/* Device mounted on */
      Device device;		/* device number */
      afs_int32 index;            /* partition index (0<=x<=VOLMAXPARTS) */
      int lock_fd;		/* File descriptor of this partition if locked; otherwise -1;
  				 * Not used by the file server */
!     int free;			/* Total number of blocks (1K) presumed
  				 * available on this partition (accounting
  				 * for the minfree parameter for the
  				 * partition).  This is adjusted
--- 51,65 ----
   * variant for VGetPartition as well. Also, the VolPartitionInfo RPC does
   * a swap before sending the data out on the wire.
   */
! struct DiskPartition64 {
!     struct DiskPartition64 *next;
      char *name;			/* Mounted partition name */
      char *devName;		/* Device mounted on */
      Device device;		/* device number */
      afs_int32 index;            /* partition index (0<=x<=VOLMAXPARTS) */
      int lock_fd;		/* File descriptor of this partition if locked; otherwise -1;
  				 * Not used by the file server */
!     afs_int64 free;		/* Total number of blocks (1K) presumed
  				 * available on this partition (accounting
  				 * for the minfree parameter for the
  				 * partition).  This is adjusted
***************
*** 69,75 ****
  				 * this is recomputed.  This number can
  				 * be negative, if the partition starts
  				 * out too full */
!     int totalUsable;		/* Total number of blocks available on this
  				 * partition, taking into account the minfree
  				 * parameter for the partition (see the
  				 * 4.2bsd command tunefs, but note that the
--- 69,75 ----
  				 * this is recomputed.  This number can
  				 * be negative, if the partition starts
  				 * out too full */
!     afs_int64 totalUsable;	/* Total number of blocks available on this
  				 * partition, taking into account the minfree
  				 * parameter for the partition (see the
  				 * 4.2bsd command tunefs, but note that the
***************
*** 77,86 ****
  				 * is not reread--does not apply here.  The
  				 * superblock is re-read periodically by
  				 * VSetPartitionDiskUsage().) */
!     int minFree;		/* Number blocks to be kept free, as last read
  				 * from the superblock */
      int flags;
!     int f_files;		/* total number of files in this partition */
  #ifdef AFS_DEMAND_ATTACH_FS
      struct {
  	struct rx_queue head;   /* list of volumes on this partition (VByPList) */
--- 77,86 ----
  				 * is not reread--does not apply here.  The
  				 * superblock is re-read periodically by
  				 * VSetPartitionDiskUsage().) */
!     afs_int64 minFree;		/* Number blocks to be kept free, as last read
  				 * from the superblock */
      int flags;
!     afs_int64 f_files;		/* total number of files in this partition */
  #ifdef AFS_DEMAND_ATTACH_FS
      struct {
  	struct rx_queue head;   /* list of volumes on this partition (VByPList) */
***************
*** 91,101 ****
  #endif /* AFS_DEMAND_ATTACH_FS */
  };
  
! struct DiskPartitionStats {
!     afs_int32 free;
!     afs_int32 totalUsable;
!     afs_int32 minFree;
!     afs_int32 f_files;
  #ifdef AFS_DEMAND_ATTACH_FS
      afs_int32 vol_list_len;
  #endif
--- 91,101 ----
  #endif /* AFS_DEMAND_ATTACH_FS */
  };
  
! struct DiskPartitionStats64 {
!     afs_int64 free;
!     afs_int64 totalUsable;
!     afs_int64 minFree;
!     afs_int64 f_files;
  #ifdef AFS_DEMAND_ATTACH_FS
      afs_int32 vol_list_len;
  #endif
***************
*** 115,126 ****
  
  struct Volume;			/* Potentially forward definition */
  
! extern struct DiskPartition *DiskPartitionList;
! extern struct DiskPartition *VGetPartition(char * name, int abortp);
! extern struct DiskPartition *VGetPartition_r(char * name, int abortp);
  #ifdef AFS_DEMAND_ATTACH_FS
! extern struct DiskPartition *VGetPartitionById(afs_int32 index, int abortp);
! extern struct DiskPartition *VGetPartitionById_r(afs_int32 index, int abortp);
  #endif
  extern int VAttachPartitions(void);
  extern void VLockPartition(char *name);
--- 115,126 ----
  
  struct Volume;			/* Potentially forward definition */
  
! extern struct DiskPartition64 *DiskPartitionList;
! extern struct DiskPartition64 *VGetPartition(char * name, int abortp);
! extern struct DiskPartition64 *VGetPartition_r(char * name, int abortp);
  #ifdef AFS_DEMAND_ATTACH_FS
! extern struct DiskPartition64 *VGetPartitionById(afs_int32 index, int abortp);
! extern struct DiskPartition64 *VGetPartitionById_r(afs_int32 index, int abortp);
  #endif
  extern int VAttachPartitions(void);
  extern void VLockPartition(char *name);
***************
*** 129,137 ****
  extern void VUnlockPartition_r(char *name);
  extern void VResetDiskUsage(void);
  extern void VResetDiskUsage_r(void);
! extern void VSetPartitionDiskUsage(register struct DiskPartition *dp);
! extern void VSetPartitionDiskUsage_r(register struct DiskPartition *dp);
! extern char *VPartitionPath(struct DiskPartition *p);
  extern void VAdjustDiskUsage(Error * ec, struct Volume *vp,
  			     afs_sfsize_t blocks, afs_sfsize_t checkBlocks);
  extern int VDiskUsage(struct Volume *vp, afs_sfsize_t blocks);
--- 129,137 ----
  extern void VUnlockPartition_r(char *name);
  extern void VResetDiskUsage(void);
  extern void VResetDiskUsage_r(void);
! extern void VSetPartitionDiskUsage(register struct DiskPartition64 *dp);
! extern void VSetPartitionDiskUsage_r(register struct DiskPartition64 *dp);
! extern char *VPartitionPath(struct DiskPartition64 *p);
  extern void VAdjustDiskUsage(Error * ec, struct Volume *vp,
  			     afs_sfsize_t blocks, afs_sfsize_t checkBlocks);
  extern int VDiskUsage(struct Volume *vp, afs_sfsize_t blocks);
Index: openafs/src/vol/purge.c
diff -c openafs/src/vol/purge.c:1.12.2.3 openafs/src/vol/purge.c:1.12.2.4
*** openafs/src/vol/purge.c:1.12.2.3	Tue Oct 30 11:16:57 2007
--- openafs/src/vol/purge.c	Wed Mar  5 16:53:30 2008
***************
*** 17,23 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/purge.c,v 1.12.2.3 2007/10/30 15:16:57 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
--- 17,23 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/purge.c,v 1.12.2.4 2008/03/05 21:53:30 shadow Exp $");
  
  #include <stdio.h>
  #ifdef AFS_NT40_ENV
***************
*** 63,69 ****
  void
  VPurgeVolume(Error * ec, Volume * vp)
  {
!     struct DiskPartition *tpartp = vp->partition;
      char purgePath[MAXPATHLEN];
  
      /* N.B.  it's important here to use the partition pointed to by the
--- 63,69 ----
  void
  VPurgeVolume(Error * ec, Volume * vp)
  {
!     struct DiskPartition64 *tpartp = vp->partition;
      char purgePath[MAXPATHLEN];
  
      /* N.B.  it's important here to use the partition pointed to by the
Index: openafs/src/vol/salvaged.c
diff -c openafs/src/vol/salvaged.c:1.1.4.4 openafs/src/vol/salvaged.c:1.1.4.5
*** openafs/src/vol/salvaged.c:1.1.4.4	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/salvaged.c	Wed Mar  5 16:53:30 2008
***************
*** 19,25 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/salvaged.c,v 1.1.4.4 2008/02/04 18:51:39 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
--- 19,25 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/salvaged.c,v 1.1.4.5 2008/03/05 21:53:30 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
***************
*** 186,192 ****
      register struct cmd_item *ti;
      char pname[100], *temp;
      afs_int32 seenpart = 0, seenvol = 0, vid = 0, seenany = 0;
!     struct DiskPartition *partP;
  
  
  #ifdef AFS_SGI_VNODE_GLUE
--- 186,192 ----
      register struct cmd_item *ti;
      char pname[100], *temp;
      afs_int32 seenpart = 0, seenvol = 0, vid = 0, seenany = 0;
!     struct DiskPartition64 *partP;
  
  
  #ifdef AFS_SGI_VNODE_GLUE
***************
*** 578,584 ****
  {
      char childLog[AFSDIR_PATH_MAX];
      int ret;
!     struct DiskPartition * partP;
  
      /* do not allow further forking inside salvager */
      canfork = 0;
--- 578,584 ----
  {
      char childLog[AFSDIR_PATH_MAX];
      int ret;
!     struct DiskPartition64 * partP;
  
      /* do not allow further forking inside salvager */
      canfork = 0;
Index: openafs/src/vol/salvager.c
diff -c openafs/src/vol/salvager.c:1.1.4.3 openafs/src/vol/salvager.c:1.1.4.4
*** openafs/src/vol/salvager.c:1.1.4.3	Mon Nov 26 16:08:46 2007
--- openafs/src/vol/salvager.c	Wed Mar  5 16:53:30 2008
***************
*** 21,27 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/salvager.c,v 1.1.4.3 2007/11/26 21:08:46 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
--- 21,27 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/salvager.c,v 1.1.4.4 2008/03/05 21:53:30 shadow Exp $");
  
  #include <stdlib.h>
  #include <stdio.h>
***************
*** 142,148 ****
      register struct cmd_item *ti;
      char pname[100], *temp;
      afs_int32 seenpart = 0, seenvol = 0, vid = 0, seenany = 0;
!     struct DiskPartition *partP;
  
  #ifdef AFS_SGI_VNODE_GLUE
      if (afs_init_kernel_config(-1) < 0) {
--- 142,148 ----
      register struct cmd_item *ti;
      char pname[100], *temp;
      afs_int32 seenpart = 0, seenvol = 0, vid = 0, seenany = 0;
!     struct DiskPartition64 *partP;
  
  #ifdef AFS_SGI_VNODE_GLUE
      if (afs_init_kernel_config(-1) < 0) {
Index: openafs/src/vol/salvsync-server.c
diff -c openafs/src/vol/salvsync-server.c:1.1.4.5 openafs/src/vol/salvsync-server.c:1.1.4.6
*** openafs/src/vol/salvsync-server.c:1.1.4.5	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/salvsync-server.c	Wed Mar  5 16:53:30 2008
***************
*** 27,33 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/salvsync-server.c,v 1.1.4.5 2008/02/04 18:51:39 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
--- 27,33 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/salvsync-server.c,v 1.1.4.6 2008/03/05 21:53:30 shadow Exp $");
  
  #include <sys/types.h>
  #include <stdio.h>
***************
*** 619,625 ****
  SALVSYNC_com_CancelAll(SALVSYNC_command * com, SALVSYNC_response * res)
  {
      struct SalvageQueueNode * np, *nnp;
!     struct DiskPartition * dp;
  
      for (dp = DiskPartitionList ; dp ; dp = dp->next) {
  	for (queue_Scan(&salvageQueue.part[dp->index], np, nnp, SalvageQueueNode)) {
--- 619,625 ----
  SALVSYNC_com_CancelAll(SALVSYNC_command * com, SALVSYNC_response * res)
  {
      struct SalvageQueueNode * np, *nnp;
!     struct DiskPartition64 * dp;
  
      for (dp = DiskPartitionList ; dp ; dp = dp->next) {
  	for (queue_Scan(&salvageQueue.part[dp->index], np, nnp, SalvageQueueNode)) {
***************
*** 1148,1154 ****
  SALVSYNC_getWork(void)
  {
      int i, ret;
!     struct DiskPartition * dp = NULL, * fdp;
      static afs_int32 next_part_sched = 0;
      struct SalvageQueueNode *node = NULL, *np;
  
--- 1148,1154 ----
  SALVSYNC_getWork(void)
  {
      int i, ret;
!     struct DiskPartition64 * dp = NULL, * fdp;
      static afs_int32 next_part_sched = 0;
      struct SalvageQueueNode *node = NULL, *np;
  
Index: openafs/src/vol/vnode.h
diff -c openafs/src/vol/vnode.h:1.15.2.1 openafs/src/vol/vnode.h:1.15.2.2
*** openafs/src/vol/vnode.h:1.15.2.1	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/vnode.h	Fri Mar 14 00:42:52 2008
***************
*** 155,160 ****
--- 155,161 ----
      VN_ON_HASH            = 0x1,        /**< vnode is on hash table */
      VN_ON_LRU             = 0x2,        /**< vnode is on lru list */
      VN_ON_VVN             = 0x4,        /**< vnode is on volume vnode list */
+     VN_FLAGS_END
  };
  
  
Index: openafs/src/vol/vnode_inline.h
diff -c openafs/src/vol/vnode_inline.h:1.1.2.3 openafs/src/vol/vnode_inline.h:1.1.2.4
*** openafs/src/vol/vnode_inline.h:1.1.2.3	Wed Feb  6 07:21:48 2008
--- openafs/src/vol/vnode_inline.h	Fri Mar 14 00:42:52 2008
***************
*** 15,21 ****
  #ifdef AFS_HPUX_ENV
  #define static_inline static __inline
  #elif defined(AFS_AIX_ENV)
! #define static_inline inline
  #else
  #define static_inline static inline
  #endif
--- 15,21 ----
  #ifdef AFS_HPUX_ENV
  #define static_inline static __inline
  #elif defined(AFS_AIX_ENV)
! #define static_inline static
  #else
  #define static_inline static inline
  #endif
Index: openafs/src/vol/vol-info.c
diff -c openafs/src/vol/vol-info.c:1.22.4.1 openafs/src/vol/vol-info.c:1.22.4.2
*** openafs/src/vol/vol-info.c:1.22.4.1	Wed Oct 31 00:09:45 2007
--- openafs/src/vol/vol-info.c	Wed Mar  5 16:53:30 2008
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-info.c,v 1.22.4.1 2007/10/31 04:09:45 shadow Exp $");
  
  #include <ctype.h>
  #include <errno.h>
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-info.c,v 1.22.4.2 2008/03/05 21:53:30 shadow Exp $");
  
  #include <ctype.h>
  #include <errno.h>
***************
*** 87,96 ****
  /* Forward Declarations */
  void PrintHeader(register Volume * vp);
  void HandleAllPart(void);
! void HandlePart(struct DiskPartition *partP);
! void HandleVolume(struct DiskPartition *partP, char *name);
! struct DiskPartition *FindCurrentPartition(void);
! Volume *AttachVolume(struct DiskPartition *dp, char *volname,
  		     register struct VolumeHeader *header);
  #if defined(AFS_NAMEI_ENV)
  void PrintVnode(int offset, VnodeDiskObject * vnode, VnodeId vnodeNumber,
--- 87,96 ----
  /* Forward Declarations */
  void PrintHeader(register Volume * vp);
  void HandleAllPart(void);
! void HandlePart(struct DiskPartition64 *partP);
! void HandleVolume(struct DiskPartition64 *partP, char *name);
! struct DiskPartition64 *FindCurrentPartition(void);
! Volume *AttachVolume(struct DiskPartition64 *dp, char *volname,
  		     register struct VolumeHeader *header);
  #if defined(AFS_NAMEI_ENV)
  void PrintVnode(int offset, VnodeDiskObject * vnode, VnodeId vnodeNumber,
***************
*** 169,175 ****
  
  
  Volume *
! AttachVolume(struct DiskPartition * dp, char *volname,
  	     register struct VolumeHeader * header)
  {
      register Volume *vp;
--- 169,175 ----
  
  
  Volume *
! AttachVolume(struct DiskPartition64 * dp, char *volname,
  	     register struct VolumeHeader * header)
  {
      register Volume *vp;
***************
*** 223,229 ****
      int err = 0;
      int volumeId = 0;
      char *partName = 0;
!     struct DiskPartition *partP = NULL;
  
  
  #ifndef AFS_NT40_ENV
--- 223,229 ----
      int err = 0;
      int volumeId = 0;
      char *partName = 0;
!     struct DiskPartition64 *partP = NULL;
  
  
  #ifndef AFS_NT40_ENV
***************
*** 333,343 ****
  
  #ifdef AFS_NT40_ENV
  #include <direct.h>
! struct DiskPartition *
  FindCurrentPartition()
  {
      int dr = _getdrive();
!     struct DiskPartition *dp;
  
      dr--;
      for (dp = DiskPartitionList; dp; dp = dp->next) {
--- 333,343 ----
  
  #ifdef AFS_NT40_ENV
  #include <direct.h>
! struct DiskPartition64 *
  FindCurrentPartition()
  {
      int dr = _getdrive();
!     struct DiskPartition64 *dp;
  
      dr--;
      for (dp = DiskPartitionList; dp; dp = dp->next) {
***************
*** 350,362 ****
      return dp;
  }
  #else
! struct DiskPartition *
  FindCurrentPartition()
  {
      char partName[1024];
      char tmp = '\0';
      char *p;
!     struct DiskPartition *dp;
  
      if (!getcwd(partName, 1023)) {
  	perror("pwd");
--- 350,362 ----
      return dp;
  }
  #else
! struct DiskPartition64 *
  FindCurrentPartition()
  {
      char partName[1024];
      char tmp = '\0';
      char *p;
!     struct DiskPartition64 *dp;
  
      if (!getcwd(partName, 1023)) {
  	perror("pwd");
***************
*** 380,386 ****
  void
  HandleAllPart(void)
  {
!     struct DiskPartition *partP;
  
  
      for (partP = DiskPartitionList; partP; partP = partP->next) {
--- 380,386 ----
  void
  HandleAllPart(void)
  {
!     struct DiskPartition64 *partP;
  
  
      for (partP = DiskPartitionList; partP; partP = partP->next) {
***************
*** 400,406 ****
  
  
  void
! HandlePart(struct DiskPartition *partP)
  {
      int nvols = 0;
      DIR *dirp;
--- 400,406 ----
  
  
  void
! HandlePart(struct DiskPartition64 *partP)
  {
      int nvols = 0;
      DIR *dirp;
***************
*** 445,451 ****
  
  
  void
! HandleVolume(struct DiskPartition *dp, char *name)
  {
      struct VolumeHeader header;
      struct VolumeDiskHeader diskHeader;
--- 445,451 ----
  
  
  void
! HandleVolume(struct DiskPartition64 *dp, char *name)
  {
      struct VolumeHeader header;
      struct VolumeDiskHeader diskHeader;
Index: openafs/src/vol/vol-salvage.c
diff -c openafs/src/vol/vol-salvage.c:1.51.2.10 openafs/src/vol/vol-salvage.c:1.51.2.12
*** openafs/src/vol/vol-salvage.c:1.51.2.10	Thu Nov  1 11:00:03 2007
--- openafs/src/vol/vol-salvage.c	Mon Mar 17 12:05:28 2008
***************
*** 87,93 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-salvage.c,v 1.51.2.10 2007/11/01 15:00:03 shadow Exp $");
  
  #ifndef AFS_NT40_ENV
  #include <sys/param.h>
--- 87,93 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vol-salvage.c,v 1.51.2.12 2008/03/17 16:05:28 shadow Exp $");
  
  #ifndef AFS_NT40_ENV
  #include <sys/param.h>
***************
*** 269,275 ****
  char *fileSysPathName;		/* NT needs this to make name pretty in log. */
  IHandle_t *VGLinkH;		/* Link handle for current volume group. */
  int VGLinkH_cnt;		/* # of references to lnk handle. */
! struct DiskPartition *fileSysPartition;	/* Partition  being salvaged */
  #ifndef AFS_NT40_ENV
  char *fileSysDeviceName;	/* The block device where the file system
  				 * being salvaged was mounted */
--- 269,275 ----
  char *fileSysPathName;		/* NT needs this to make name pretty in log. */
  IHandle_t *VGLinkH;		/* Link handle for current volume group. */
  int VGLinkH_cnt;		/* # of references to lnk handle. */
! struct DiskPartition64 *fileSysPartition;	/* Partition  being salvaged */
  #ifndef AFS_NT40_ENV
  char *fileSysDeviceName;	/* The block device where the file system
  				 * being salvaged was mounted */
***************
*** 439,445 ****
  #define HDSTR "\\Device\\Harddisk"
  #define HDLEN  (sizeof(HDSTR)-1)	/* Length of "\Device\Harddisk" */
  int
! SameDisk(struct DiskPartition *p1, struct DiskPartition *p2)
  {
  #define RES_LEN 256
      char res[RES_LEN];
--- 439,445 ----
  #define HDSTR "\\Device\\Harddisk"
  #define HDLEN  (sizeof(HDSTR)-1)	/* Length of "\Device\Harddisk" */
  int
! SameDisk(struct DiskPartition64 *p1, struct DiskPartition64 *p2)
  {
  #define RES_LEN 256
      char res[RES_LEN];
***************
*** 480,489 ****
   * PartsPerDisk are on the same disk.
   */
  void
! SalvageFileSysParallel(struct DiskPartition *partP)
  {
      struct job {
! 	struct DiskPartition *partP;
  	int pid;		/* Pid for this job */
  	int jobnumb;		/* Log file job number */
  	struct job *nextjob;	/* Next partition on disk to salvage */
--- 480,489 ----
   * PartsPerDisk are on the same disk.
   */
  void
! SalvageFileSysParallel(struct DiskPartition64 *partP)
  {
      struct job {
! 	struct DiskPartition64 *partP;
  	int pid;		/* Pid for this job */
  	int jobnumb;		/* Log file job number */
  	struct job *nextjob;	/* Next partition on disk to salvage */
***************
*** 671,677 ****
  
  
  void
! SalvageFileSys(struct DiskPartition *partP, VolumeId singleVolumeNumber)
  {
      if (!canfork || debug || Fork() == 0) {
  	SalvageFileSys1(partP, singleVolumeNumber);
--- 671,677 ----
  
  
  void
! SalvageFileSys(struct DiskPartition64 *partP, VolumeId singleVolumeNumber)
  {
      if (!canfork || debug || Fork() == 0) {
  	SalvageFileSys1(partP, singleVolumeNumber);
***************
*** 703,709 ****
  }
  
  void
! SalvageFileSys1(struct DiskPartition *partP, VolumeId singleVolumeNumber)
  {
      char *name, *tdir;
      char inodeListPath[256];
--- 703,709 ----
  }
  
  void
! SalvageFileSys1(struct DiskPartition64 *partP, VolumeId singleVolumeNumber)
  {
      char *name, *tdir;
      char inodeListPath[256];
***************
*** 1633,1639 ****
  	    && volHeader.stamp.magic == VOLUMEINFOMAGIC
  	    && volHeader.dontSalvage == DONT_SALVAGE
  	    && volHeader.needsSalvaged == 0 && volHeader.destroyMe == 0) {
! 	    if (volHeader.inUse == 1) {
  		volHeader.inUse = 0;
  		volHeader.inService = 1;
  		if (!Testing) {
--- 1633,1639 ----
  	    && volHeader.stamp.magic == VOLUMEINFOMAGIC
  	    && volHeader.dontSalvage == DONT_SALVAGE
  	    && volHeader.needsSalvaged == 0 && volHeader.destroyMe == 0) {
! 	    if (volHeader.inUse != 0) {
  		volHeader.inUse = 0;
  		volHeader.inService = 1;
  		if (!Testing) {
Index: openafs/src/vol/vol-salvage.h
diff -c openafs/src/vol/vol-salvage.h:1.1.4.2 openafs/src/vol/vol-salvage.h:1.1.4.3
*** openafs/src/vol/vol-salvage.h:1.1.4.2	Thu Nov  1 11:00:03 2007
--- openafs/src/vol/vol-salvage.h	Wed Mar  5 16:53:30 2008
***************
*** 156,162 ****
  extern char *fileSysPathName;	/* NT needs this to make name pretty in log. */
  extern IHandle_t *VGLinkH;	/* Link handle for current volume group. */
  extern int VGLinkH_cnt;	        /* # of references to lnk handle. */
! extern struct DiskPartition *fileSysPartition;	/* Partition  being salvaged */
  #ifndef AFS_NT40_ENV
  extern char *fileSysDeviceName;	/* The block device where the file system
  				 * being salvaged was mounted */
--- 156,162 ----
  extern char *fileSysPathName;	/* NT needs this to make name pretty in log. */
  extern IHandle_t *VGLinkH;	/* Link handle for current volume group. */
  extern int VGLinkH_cnt;	        /* # of references to lnk handle. */
! extern struct DiskPartition64 *fileSysPartition;	/* Partition  being salvaged */
  #ifndef AFS_NT40_ENV
  extern char *fileSysDeviceName;	/* The block device where the file system
  				 * being salvaged was mounted */
***************
*** 251,259 ****
  extern void SalvageDir(char *name, VolumeId rwVid, struct VnodeInfo *dirVnodeInfo,
  		       IHandle_t * alinkH, int i, struct DirSummary *rootdir,
  		       int *rootdirfound);
! extern void SalvageFileSysParallel(struct DiskPartition *partP);
! extern void SalvageFileSys(struct DiskPartition *partP, VolumeId singleVolumeNumber);
! extern void SalvageFileSys1(struct DiskPartition *partP,
  			    VolumeId singleVolumeNumber);
  extern int SalvageHeader(register struct stuff *sp, struct InodeSummary *isp,
  			 int check, int *deleteMe);
--- 251,259 ----
  extern void SalvageDir(char *name, VolumeId rwVid, struct VnodeInfo *dirVnodeInfo,
  		       IHandle_t * alinkH, int i, struct DirSummary *rootdir,
  		       int *rootdirfound);
! extern void SalvageFileSysParallel(struct DiskPartition64 *partP);
! extern void SalvageFileSys(struct DiskPartition64 *partP, VolumeId singleVolumeNumber);
! extern void SalvageFileSys1(struct DiskPartition64 *partP,
  			    VolumeId singleVolumeNumber);
  extern int SalvageHeader(register struct stuff *sp, struct InodeSummary *isp,
  			 int check, int *deleteMe);
Index: openafs/src/vol/volume.c
diff -c openafs/src/vol/volume.c:1.43.2.13 openafs/src/vol/volume.c:1.43.2.17
*** openafs/src/vol/volume.c:1.43.2.13	Sun Feb 10 22:37:22 2008
--- openafs/src/vol/volume.c	Tue Mar 18 12:06:19 2008
***************
*** 22,28 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/volume.c,v 1.43.2.13 2008/02/11 03:37:22 shadow Exp $");
  
  #include <rx/xdr.h>
  #include <afs/afsint.h>
--- 22,28 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/volume.c,v 1.43.2.17 2008/03/18 16:06:19 shadow Exp $");
  
  #include <rx/xdr.h>
  #include <afs/afsint.h>
***************
*** 176,182 ****
  /* Forward declarations */
  static Volume *attach2(Error * ec, VolId vid, char *path,
  		       register struct VolumeHeader *header,
! 		       struct DiskPartition *partp, Volume * vp, 
  		       int isbusy, int mode);
  static void ReallyFreeVolume(Volume * vp);
  #ifdef AFS_DEMAND_ATTACH_FS
--- 176,182 ----
  /* Forward declarations */
  static Volume *attach2(Error * ec, VolId vid, char *path,
  		       register struct VolumeHeader *header,
! 		       struct DiskPartition64 *partp, Volume * vp, 
  		       int isbusy, int mode);
  static void ReallyFreeVolume(Volume * vp);
  #ifdef AFS_DEMAND_ATTACH_FS
***************
*** 284,290 ****
  #ifdef AFS_PTHREAD_ENV
  typedef struct diskpartition_queue_t {
      struct rx_queue queue;
!     struct DiskPartition * diskP;
  } diskpartition_queue_t;
  typedef struct vinitvolumepackage_thread_t {
      struct rx_queue queue;
--- 284,290 ----
  #ifdef AFS_PTHREAD_ENV
  typedef struct diskpartition_queue_t {
      struct rx_queue queue;
!     struct DiskPartition64 * diskP;
  } diskpartition_queue_t;
  typedef struct vinitvolumepackage_thread_t {
      struct rx_queue queue;
***************
*** 294,300 ****
  static void * VInitVolumePackageThread(void * args);
  #endif /* AFS_PTHREAD_ENV */
  
! static int VAttachVolumesByPartition(struct DiskPartition *diskP, 
  				     int * nAttached, int * nUnattached);
  
  
--- 294,300 ----
  static void * VInitVolumePackageThread(void * args);
  #endif /* AFS_PTHREAD_ENV */
  
! static int VAttachVolumesByPartition(struct DiskPartition64 *diskP, 
  				     int * nAttached, int * nUnattached);
  
  
***************
*** 351,359 ****
  /* VByP List */
  static void AddVolumeToVByPList_r(Volume * vp);
  static void DeleteVolumeFromVByPList_r(Volume * vp);
! static void VVByPListBeginExclusive_r(struct DiskPartition * dp);
! static void VVByPListEndExclusive_r(struct DiskPartition * dp);
! static void VVByPListWait_r(struct DiskPartition * dp);
  
  /* online salvager */
  static int VCheckSalvage(register Volume * vp);
--- 351,359 ----
  /* VByP List */
  static void AddVolumeToVByPList_r(Volume * vp);
  static void DeleteVolumeFromVByPList_r(Volume * vp);
! static void VVByPListBeginExclusive_r(struct DiskPartition64 * dp);
! static void VVByPListEndExclusive_r(struct DiskPartition64 * dp);
! static void VVByPListWait_r(struct DiskPartition64 * dp);
  
  /* online salvager */
  static int VCheckSalvage(register Volume * vp);
***************
*** 368,375 ****
  static void VHashWait_r(VolumeHashChainHead * head);
  
  /* shutdown */
! static int ShutdownVByPForPass_r(struct DiskPartition * dp, int pass);
! static int ShutdownVolumeWalk_r(struct DiskPartition * dp, int pass,
  				struct rx_queue ** idx);
  static void ShutdownController(vshutdown_thread_t * params);
  static void ShutdownCreateSchedule(vshutdown_thread_t * params);
--- 368,375 ----
  static void VHashWait_r(VolumeHashChainHead * head);
  
  /* shutdown */
! static int ShutdownVByPForPass_r(struct DiskPartition64 * dp, int pass);
! static int ShutdownVolumeWalk_r(struct DiskPartition64 * dp, int pass,
  				struct rx_queue ** idx);
  static void ShutdownController(vshutdown_thread_t * params);
  static void ShutdownCreateSchedule(vshutdown_thread_t * params);
***************
*** 503,509 ****
  	return -1;
  
      if (programType == fileServer) {
! 	struct DiskPartition *diskP;
  #ifdef AFS_PTHREAD_ENV
  	struct vinitvolumepackage_thread_t params;
  	struct diskpartition_queue_t * dpq;
--- 503,509 ----
  	return -1;
  
      if (programType == fileServer) {
! 	struct DiskPartition64 *diskP;
  #ifdef AFS_PTHREAD_ENV
  	struct vinitvolumepackage_thread_t params;
  	struct diskpartition_queue_t * dpq;
***************
*** 608,614 ****
  
      DIR *dirp;
      struct dirent *dp;
!     struct DiskPartition *diskP;
      struct vinitvolumepackage_thread_t * params;
      struct diskpartition_queue_t * dpq;
  
--- 608,614 ----
  
      DIR *dirp;
      struct dirent *dp;
!     struct DiskPartition64 *diskP;
      struct vinitvolumepackage_thread_t * params;
      struct diskpartition_queue_t * dpq;
  
***************
*** 642,648 ****
   * attach all volumes on a given disk partition
   */
  static int
! VAttachVolumesByPartition(struct DiskPartition *diskP, int * nAttached, int * nUnattached)
  {
    DIR * dirp;
    struct dirent * dp;
--- 642,648 ----
   * attach all volumes on a given disk partition
   */
  static int
! VAttachVolumesByPartition(struct DiskPartition64 *diskP, int * nAttached, int * nUnattached)
  {
    DIR * dirp;
    struct dirent * dp;
***************
*** 753,759 ****
      register Volume *vp, *np;
      register afs_int32 code;
  #ifdef AFS_DEMAND_ATTACH_FS
!     struct DiskPartition * diskP;
      struct diskpartition_queue_t * dpq;
      vshutdown_thread_t params;
      pthread_t tid;
--- 753,759 ----
      register Volume *vp, *np;
      register afs_int32 code;
  #ifdef AFS_DEMAND_ATTACH_FS
!     struct DiskPartition64 * diskP;
      struct diskpartition_queue_t * dpq;
      vshutdown_thread_t params;
      pthread_t tid;
***************
*** 904,910 ****
  ShutdownController(vshutdown_thread_t * params)
  {
      /* XXX debug */
!     struct DiskPartition * diskP;
      Device id;
      vshutdown_thread_t shadow;
  
--- 904,910 ----
  ShutdownController(vshutdown_thread_t * params)
  {
      /* XXX debug */
!     struct DiskPartition64 * diskP;
      Device id;
      vshutdown_thread_t shadow;
  
***************
*** 949,955 ****
  static void
  ShutdownCreateSchedule(vshutdown_thread_t * params)
  {
!     struct DiskPartition * diskP;
      int sum, thr_workload, thr_left;
      int part_residue[VOLMAXPARTS+1];
      Device id;
--- 949,955 ----
  static void
  ShutdownCreateSchedule(vshutdown_thread_t * params)
  {
!     struct DiskPartition64 * diskP;
      int sum, thr_workload, thr_left;
      int part_residue[VOLMAXPARTS+1];
      Device id;
***************
*** 1071,1077 ****
      Volume * vp;
      vshutdown_thread_t * params;
      int part, code, found, pass, schedule_version_save, count;
!     struct DiskPartition *diskP;
      struct diskpartition_queue_t * dpq;
      Device id;
  
--- 1071,1077 ----
      Volume * vp;
      vshutdown_thread_t * params;
      int part, code, found, pass, schedule_version_save, count;
!     struct DiskPartition64 *diskP;
      struct diskpartition_queue_t * dpq;
      Device id;
  
***************
*** 1220,1226 ****
   * note that this function will not allow mp-fast
   * shutdown of a partition */
  int
! VShutdownByPartition_r(struct DiskPartition * dp)
  {
      int pass, retVal;
      int pass_stats[4];
--- 1220,1226 ----
   * note that this function will not allow mp-fast
   * shutdown of a partition */
  int
! VShutdownByPartition_r(struct DiskPartition64 * dp)
  {
      int pass, retVal;
      int pass_stats[4];
***************
*** 1271,1277 ****
   * traversal
   */
  static int
! ShutdownVByPForPass_r(struct DiskPartition * dp, int pass)
  {
      struct rx_queue * q = queue_First(&dp->vol_list, rx_queue);
      register int i = 0;
--- 1271,1277 ----
   * traversal
   */
  static int
! ShutdownVByPForPass_r(struct DiskPartition64 * dp, int pass)
  {
      struct rx_queue * q = queue_First(&dp->vol_list, rx_queue);
      register int i = 0;
***************
*** 1286,1292 ****
   * returns 1 if a volume was shutdown in this pass,
   * 0 otherwise */
  static int
! ShutdownVolumeWalk_r(struct DiskPartition * dp, int pass,
  		     struct rx_queue ** idx)
  {
      struct rx_queue *qp, *nqp;
--- 1286,1292 ----
   * returns 1 if a volume was shutdown in this pass,
   * 0 otherwise */
  static int
! ShutdownVolumeWalk_r(struct DiskPartition64 * dp, int pass,
  		     struct rx_queue ** idx)
  {
      struct rx_queue *qp, *nqp;
***************
*** 1593,1599 ****
  		       VolId volumeId)
  {
      Volume *vp;
!     struct DiskPartition *partp;
  
      *ec = 0;
  
--- 1593,1599 ----
  		       VolId volumeId)
  {
      Volume *vp;
!     struct DiskPartition64 *partp;
  
      *ec = 0;
  
***************
*** 1641,1647 ****
   */
  Volume * 
  VPreAttachVolumeByVp_r(Error * ec, 
! 		       struct DiskPartition * partp, 
  		       Volume * vp,
  		       VolId vid)
  {
--- 1641,1647 ----
   */
  Volume * 
  VPreAttachVolumeByVp_r(Error * ec, 
! 		       struct DiskPartition64 * partp, 
  		       Volume * vp,
  		       VolId vid)
  {
***************
*** 1752,1758 ****
      struct afs_stat status;
      struct VolumeDiskHeader diskHeader;
      struct VolumeHeader iheader;
!     struct DiskPartition *partp;
      char path[64];
      int isbusy = 0;
      VolId volumeId;
--- 1752,1758 ----
      struct afs_stat status;
      struct VolumeDiskHeader diskHeader;
      struct VolumeHeader iheader;
!     struct DiskPartition64 *partp;
      char path[64];
      int isbusy = 0;
      VolId volumeId;
***************
*** 1812,1818 ****
  	    /* if it's already attached, see if we can return it */
  	    if (V_attachState(vp) == VOL_STATE_ATTACHED) {
  		VGetVolumeByVp_r(ec, vp);
! 		if (V_inUse(vp)) {
  		    VCancelReservation_r(vp);
  		    return vp;
  		}
--- 1812,1818 ----
  	    /* if it's already attached, see if we can return it */
  	    if (V_attachState(vp) == VOL_STATE_ATTACHED) {
  		VGetVolumeByVp_r(ec, vp);
! 		if (V_inUse(vp) == fileServer) {
  		    VCancelReservation_r(vp);
  		    return vp;
  		}
***************
*** 1882,1888 ****
  #else /* AFS_DEMAND_ATTACH_FS */
  	vp = VGetVolume_r(ec, volumeId);
  	if (vp) {
! 	    if (V_inUse(vp))
  		return vp;
  	    if (vp->specialStatus == VBUSY)
  		isbusy = 1;
--- 1882,1888 ----
  #else /* AFS_DEMAND_ATTACH_FS */
  	vp = VGetVolume_r(ec, volumeId);
  	if (vp) {
! 	    if (V_inUse(vp) == fileServer)
  		return vp;
  	    if (vp->specialStatus == VBUSY)
  		isbusy = 1;
***************
*** 1956,1961 ****
--- 1956,1966 ----
      vp = attach2(ec, volumeId, path, &iheader, partp, vp, isbusy, mode);
  
      if (programType == volumeUtility && vp) {
+ 	if ((mode == V_VOLUPD) || (VolumeWriteable(vp) && (mode == V_CLONE))) {
+ 	    /* mark volume header as in use so that volser crashes lead to a
+ 	     * salvage attempt */
+ 	    VUpdateVolume_r(ec, vp, 0);
+ 	}
  #ifdef AFS_DEMAND_ATTACH_FS
  	/* for dafs, we should tell the fileserver, except for V_PEEK
           * where we know it is not necessary */
***************
*** 2075,2081 ****
      struct afs_stat status;
      struct VolumeDiskHeader diskHeader;
      struct VolumeHeader iheader;
!     struct DiskPartition *partp;
      char path[64];
      int isbusy = 0;
      VolId volumeId;
--- 2080,2086 ----
      struct afs_stat status;
      struct VolumeDiskHeader diskHeader;
      struct VolumeHeader iheader;
!     struct DiskPartition64 *partp;
      char path[64];
      int isbusy = 0;
      VolId volumeId;
***************
*** 2099,2105 ****
      /* if it's already attached, see if we can return it */
      if (V_attachState(vp) == VOL_STATE_ATTACHED) {
  	VGetVolumeByVp_r(ec, vp);
! 	if (V_inUse(vp)) {
  	    return vp;
  	} else {
  	    if (vp->specialStatus == VBUSY)
--- 2104,2110 ----
      /* if it's already attached, see if we can return it */
      if (V_attachState(vp) == VOL_STATE_ATTACHED) {
  	VGetVolumeByVp_r(ec, vp);
! 	if (V_inUse(vp) == fileServer) {
  	    return vp;
  	} else {
  	    if (vp->specialStatus == VBUSY)
***************
*** 2242,2248 ****
   */
  private Volume * 
  attach2(Error * ec, VolId volumeId, char *path, register struct VolumeHeader * header,
! 	struct DiskPartition * partp, register Volume * vp, int isbusy, int mode)
  {
      vp->specialStatus = (byte) (isbusy ? VBUSY : 0);
      IH_INIT(vp->vnodeIndex[vLarge].handle, partp->device, header->parent,
--- 2247,2253 ----
   */
  private Volume * 
  attach2(Error * ec, VolId volumeId, char *path, register struct VolumeHeader * header,
! 	struct DiskPartition64 * partp, register Volume * vp, int isbusy, int mode)
  {
      vp->specialStatus = (byte) (isbusy ? VBUSY : 0);
      IH_INIT(vp->vnodeIndex[vLarge].handle, partp->device, header->parent,
***************
*** 2493,2501 ****
  	if (vp->specialStatus)
  	    vp->specialStatus = 0;
  	if (V_blessed(vp) && V_inService(vp) && !V_needsSalvaged(vp)) {
! 	    V_inUse(vp) = 1;
  	    V_offlineMessage(vp)[0] = '\0';
  	}
      }
  
      AddVolumeToHashTable(vp, V_id(vp));
--- 2498,2509 ----
  	if (vp->specialStatus)
  	    vp->specialStatus = 0;
  	if (V_blessed(vp) && V_inService(vp) && !V_needsSalvaged(vp)) {
! 	    V_inUse(vp) = fileServer;
  	    V_offlineMessage(vp)[0] = '\0';
  	}
+     } else {
+ 	V_inUse(vp) = programType;
+ 	V_checkoutMode(vp) = mode;
      }
  
      AddVolumeToHashTable(vp, V_id(vp));
***************
*** 2503,2509 ****
      AddVolumeToVByPList_r(vp);
      VLRU_Add_r(vp);
      if ((programType != fileServer) ||
! 	V_inUse(vp)) {
  	VChangeState_r(vp, VOL_STATE_ATTACHED);
      } else {
  	VChangeState_r(vp, VOL_STATE_UNATTACHED);
--- 2511,2517 ----
      AddVolumeToVByPList_r(vp);
      VLRU_Add_r(vp);
      if ((programType != fileServer) ||
! 	(V_inUse(vp) == fileServer)) {
  	VChangeState_r(vp, VOL_STATE_ATTACHED);
      } else {
  	VChangeState_r(vp, VOL_STATE_UNATTACHED);
***************
*** 3129,3135 ****
  VDetachVolume_r(Error * ec, Volume * vp)
  {
      VolumeId volume;
!     struct DiskPartition *tpartp;
      int notifyServer, useDone = FSYNC_VOL_ON;
  
      *ec = 0;			/* always "succeeds" */
--- 3137,3143 ----
  VDetachVolume_r(Error * ec, Volume * vp)
  {
      VolumeId volume;
!     struct DiskPartition64 *tpartp;
      int notifyServer, useDone = FSYNC_VOL_ON;
  
      *ec = 0;			/* always "succeeds" */
***************
*** 3435,3446 ****
--- 3443,3467 ----
  VCheckDetach(register Volume * vp)
  {
      int ret = 0;
+     Error ec = 0;
  
      if (vp->nUsers || vp->nWaiters)
  	return ret;
  
      if (vp->shuttingDown) {
  	ret = 1;
+ 	if ((programType != fileServer) &&
+ 	    (V_inUse(vp) == programType) &&
+ 	    ((V_checkoutMode(vp) == V_VOLUPD) ||
+ 	     ((V_checkoutMode(vp) == V_CLONE) &&
+ 	      (VolumeWriteable(vp))))) {
+ 	    V_inUse(vp) = 0;
+ 	    VUpdateVolume_r(&ec, vp, VOL_UPDATE_NOFORCEOFF);
+ 	    if (ec) {
+ 		Log("VCheckDetach: failed to clear inUse failed during detachment of volid %u\n",
+ 		    vp->hashid);
+ 	    }
+ 	}
  	VReleaseVolumeHandles_r(vp);
  	VCheckSalvage(vp);
  	ReallyFreeVolume(vp);
***************
*** 3455,3466 ****
--- 3476,3500 ----
  VCheckDetach(register Volume * vp)
  {
      int ret = 0;
+     Error ec = 0;
  
      if (vp->nUsers)
  	return ret;
  
      if (vp->shuttingDown) {
  	ret = 1;
+ 	if ((programType != fileServer) &&
+ 	    (V_inUse(vp) == programType) &&
+ 	    ((V_checkoutMode(vp) == V_VOLUPD) ||
+ 	     ((V_checkoutMode(vp) == V_CLONE) &&
+ 	      (VolumeWriteable(vp))))) {
+ 	    V_inUse(vp) = 0;
+ 	    VUpdateVolume_r(&ec, vp, VOL_UPDATE_NOFORCEOFF);
+ 	    if (ec) {
+ 		Log("VCheckDetach: failed to clear inUse failed during detachment of volid %u\n",
+ 		    vp->hashid);
+ 	    }
+ 	}
  	VReleaseVolumeHandles_r(vp);
  	ReallyFreeVolume(vp);
  	if (programType == fileServer) {
***************
*** 4688,4694 ****
      static char partition[VMAXPATHLEN], name[VMAXPATHLEN];
      char path[VMAXPATHLEN];
      int found = 0;
!     struct DiskPartition *dp;
  
      *ec = 0;
      name[0] = '/';
--- 4722,4728 ----
      static char partition[VMAXPATHLEN], name[VMAXPATHLEN];
      char path[VMAXPATHLEN];
      int found = 0;
!     struct DiskPartition64 *dp;
  
      *ec = 0;
      name[0] = '/';
***************
*** 6846,6852 ****
   */
  /* take exclusive control over the list */
  static void
! VVByPListBeginExclusive_r(struct DiskPartition * dp)
  {
      assert(dp->vol_list.busy == 0);
      dp->vol_list.busy = 1;
--- 6880,6886 ----
   */
  /* take exclusive control over the list */
  static void
! VVByPListBeginExclusive_r(struct DiskPartition64 * dp)
  {
      assert(dp->vol_list.busy == 0);
      dp->vol_list.busy = 1;
***************
*** 6870,6876 ****
   * @internal volume package internal use only.
   */
  static void
! VVByPListEndExclusive_r(struct DiskPartition * dp)
  {
      assert(dp->vol_list.busy);
      dp->vol_list.busy = 0;
--- 6904,6910 ----
   * @internal volume package internal use only.
   */
  static void
! VVByPListEndExclusive_r(struct DiskPartition64 * dp)
  {
      assert(dp->vol_list.busy);
      dp->vol_list.busy = 0;
***************
*** 6902,6908 ****
   * @internal volume package internal use only.
   */
  static void
! VVByPListWait_r(struct DiskPartition * dp)
  {
      while (dp->vol_list.busy) {
  	VOL_CV_WAIT(&dp->vol_list.cv);
--- 6936,6942 ----
   * @internal volume package internal use only.
   */
  static void
! VVByPListWait_r(struct DiskPartition64 * dp)
  {
      while (dp->vol_list.busy) {
  	VOL_CV_WAIT(&dp->vol_list.cv);
***************
*** 6968,6977 ****
--- 7002,7111 ----
      return buf;
  }
  
+ struct VLRUExtStatsEntry {
+     VolumeId volid;
+ };
+ 
+ struct VLRUExtStats {
+     afs_uint32 len;
+     afs_uint32 used;
+     struct {
+ 	afs_uint32 start;
+ 	afs_uint32 len;
+     } queue_info[VLRU_QUEUE_INVALID];
+     struct VLRUExtStatsEntry * vec;
+ };
+ 
+ /** 
+  * add a 256-entry fudge factor onto the vector in case state changes
+  * out from under us.
+  */
+ #define VLRU_EXT_STATS_VEC_LEN_FUDGE   256
+ 
+ /**
+  * collect extended statistics for the VLRU subsystem.
+  *
+  * @param[out] stats  pointer to stats structure to be populated
+  * @param[in] nvols   number of volumes currently known to exist
+  *
+  * @pre VOL_LOCK held
+  *
+  * @post stats->vec allocated and populated
+  *
+  * @return operation status
+  *    @retval 0 success
+  *    @retval 1 failure
+  */
+ static int
+ VVLRUExtStats_r(struct VLRUExtStats * stats, afs_uint32 nvols)
+ {
+     afs_uint32 cur, idx, len;
+     struct rx_queue * qp, * nqp;
+     Volume * vp;
+     struct VLRUExtStatsEntry * vec;
+ 
+     len = nvols + VLRU_EXT_STATS_VEC_LEN_FUDGE;
+     vec = stats->vec = calloc(len,
+ 			      sizeof(struct VLRUExtStatsEntry));
+     if (vec == NULL) {
+ 	return 1;
+     }
+ 
+     cur = 0;
+     for (idx = VLRU_QUEUE_NEW; idx < VLRU_QUEUE_INVALID; idx++) {
+ 	VLRU_Wait_r(&volume_LRU.q[idx]);
+ 	VLRU_BeginExclusive_r(&volume_LRU.q[idx]);
+ 	VOL_UNLOCK;
+ 
+ 	stats->queue_info[idx].start = cur;
+ 
+ 	for (queue_Scan(&volume_LRU.q[idx], qp, nqp, rx_queue)) {
+ 	    if (cur == len) {
+ 		/* out of space in vec */
+ 		break;
+ 	    }
+ 	    vp = (Volume *)((char *)qp - offsetof(Volume, vlru));
+ 	    vec[cur].volid = vp->hashid;
+ 	    cur++;
+ 	}
+ 
+ 	stats->queue_info[idx].len = cur - stats->queue_info[idx].start;
+ 
+ 	VOL_LOCK;
+ 	VLRU_EndExclusive_r(&volume_LRU.q[idx]);
+     }
+ 
+     stats->len = len;
+     stats->used = cur;
+     return 0;
+ }
+ 
+ #define ENUMTOSTRING(en)  #en
+ #define ENUMCASE(en) \
+     case en: \
+         return ENUMTOSTRING(en); \
+         break
+ 
+ static char *
+ vlru_idx_to_string(int idx)
+ {
+     switch (idx) {
+ 	ENUMCASE(VLRU_QUEUE_NEW);
+ 	ENUMCASE(VLRU_QUEUE_MID);
+ 	ENUMCASE(VLRU_QUEUE_OLD);
+ 	ENUMCASE(VLRU_QUEUE_CANDIDATE);
+ 	ENUMCASE(VLRU_QUEUE_HELD);
+ 	ENUMCASE(VLRU_QUEUE_INVALID);
+     default:
+ 	return "**UNKNOWN**";
+     }
+ }
+ 
  void
  VPrintExtendedCacheStats_r(int flags)
  {
      int i, j;
+     afs_uint32 vol_sum = 0;
      struct stats {
  	double min;
  	double max;
***************
*** 6983,6988 ****
--- 7117,7123 ----
      char pr_buf[4][32];
      VolumeHashChainHead *head;
      Volume *vp, *np;
+     struct VLRUExtStats vlru_stats;
  
      /* zero out stats */
      memset(&looks, 0, sizeof(struct stats));
***************
*** 7010,7015 ****
--- 7145,7151 ----
  	    gets.sum     += ch_gets.sum;
  	    reorders.sum += ch_reorders.sum;
  	    len.sum      += (double)head->len;
+ 	    vol_sum      += head->len;
  	    
  	    if (i == 0) {
  		len.min      = (double) head->len;
***************
*** 7153,7159 ****
  
      /* print extended disk related statistics */
      {
! 	struct DiskPartition * diskP;
  	afs_uint32 vol_count[VOLMAXPARTS+1];
  	byte part_exists[VOLMAXPARTS+1];
  	Device id;
--- 7289,7295 ----
  
      /* print extended disk related statistics */
      {
! 	struct DiskPartition64 * diskP;
  	afs_uint32 vol_count[VOLMAXPARTS+1];
  	byte part_exists[VOLMAXPARTS+1];
  	Device id;
***************
*** 7173,7178 ****
--- 7309,7316 ----
  	VOL_UNLOCK;
  	for (i = 0; i <= VOLMAXPARTS; i++) {
  	    if (part_exists[i]) {
+ 		/* XXX while this is currently safe, it is a violation
+ 		 *     of the VGetPartitionById_r interface contract. */
  		diskP = VGetPartitionById_r(i, 0);
  		if (diskP) {
  		    Log("Partition %s has %d online volumes\n", 
***************
*** 7183,7188 ****
--- 7321,7363 ----
  	VOL_LOCK;
      }
  
+     /* print extended VLRU statistics */
+     if (VVLRUExtStats_r(&vlru_stats, vol_sum) == 0) {
+ 	afs_uint32 idx, cur, lpos;
+ 	VOL_UNLOCK;
+ 	VolumeId line[5];
+ 
+ 	Log("VLRU State Dump:\n\n");
+ 
+ 	for (idx = VLRU_QUEUE_NEW; idx < VLRU_QUEUE_INVALID; idx++) {
+ 	    Log("\t%s:\n", vlru_idx_to_string(idx));
+ 
+ 	    lpos = 0;
+ 	    for (cur = vlru_stats.queue_info[idx].start;
+ 		 cur < vlru_stats.queue_info[idx].len;
+ 		 cur++) {
+ 		line[lpos++] = vlru_stats.vec[cur].volid;
+ 		if (lpos==5) {
+ 		    Log("\t\t%u, %u, %u, %u, %u,\n",
+ 			line[0], line[1], line[2], line[3], line[4]);
+ 		    lpos = 0;
+ 		}
+ 	    }
+ 
+ 	    if (lpos) {
+ 		while (lpos < 5) {
+ 		    line[lpos++] = 0;
+ 		}
+ 		Log("\t\t%u, %u, %u, %u, %u\n",
+ 		    line[0], line[1], line[2], line[3], line[4]);
+ 	    }
+ 	    Log("\n");
+ 	}
+ 
+ 	free(vlru_stats.vec);
+ 
+ 	VOL_LOCK;
+     }
  }
  
  void
Index: openafs/src/vol/volume.h
diff -c openafs/src/vol/volume.h:1.19.2.1 openafs/src/vol/volume.h:1.19.2.3
*** openafs/src/vol/volume.h:1.19.2.1	Mon Feb  4 13:51:39 2008
--- openafs/src/vol/volume.h	Mon Mar 17 12:05:29 2008
***************
*** 113,123 ****
  #define VTRANS_UNLOCK
  #endif /* AFS_PTHREAD_ENV */
  
! typedef enum { fileServer,       /* the fileserver process */
! 	       volumeUtility,    /* volserver, or a single volume salvager (non-dafs) */
! 	       salvager,         /* standalone whole-partition salvager */
! 	       salvageServer,    /* dafs online salvager */
! 	       debugUtility      /* fssync-debug or similar utility */
  } ProgramType;
  extern ProgramType programType;	/* The type of program using the package */
  
--- 113,128 ----
  #define VTRANS_UNLOCK
  #endif /* AFS_PTHREAD_ENV */
  
! /**
!  * volume package program type enumeration.
!  */
! typedef enum {
!     fileServer          = 1,    /**< the fileserver process */
!     volumeUtility       = 2,    /**< volserver, or a 
! 				 *   single volume salvager (non-dafs) */
!     salvager            = 3,    /**< standalone whole-partition salvager */
!     salvageServer       = 4,    /**< dafs online salvager */
!     debugUtility        = 5     /**< fssync-debug or similar utility */
  } ProgramType;
  extern ProgramType programType;	/* The type of program using the package */
  
***************
*** 581,587 ****
      VolumeId hashid;		/* Volume number -- for hash table lookup */
      struct volHeader *header;	/* Cached disk data */
      Device device;		/* Unix device for the volume */
!     struct DiskPartition
       *partition;		/* Information about the Unix partition */
      struct vnodeIndex {
  	IHandle_t *handle;	/* Unix inode holding this index */
--- 586,592 ----
      VolumeId hashid;		/* Volume number -- for hash table lookup */
      struct volHeader *header;	/* Cached disk data */
      Device device;		/* Unix device for the volume */
!     struct DiskPartition64
       *partition;		/* Information about the Unix partition */
      struct vnodeIndex {
  	IHandle_t *handle;	/* Unix inode holding this index */
***************
*** 615,620 ****
--- 620,626 ----
      byte specialStatus;		/* An error code to return on VGetVolume: the
  				 * volume is unavailable for the reason quoted,
  				 * currently VBUSY or VMOVED */
+     afs_uint32 checkoutMode;    /* for volume utilities, mode number for current checkout */
      afs_uint32 updateTime;	/* Time that this volume was put on the updated
  				 * volume list--the list of volumes that will be
  				 * salvaged should the file server crash */
***************
*** 649,654 ****
--- 655,661 ----
  #define V_vnodeIndex(vp)	((vp)->vnodeIndex)
  #define V_nextVnodeUnique(vp)	((vp)->nextVnodeUnique)
  #define V_linkHandle(vp)	((vp)->linkHandle)
+ #define V_checkoutMode(vp)      ((vp)->checkoutMode)
  #ifdef AFS_DEMAND_ATTACH_FS
  #define V_attachState(vp)       ((vp)->attach_state)
  #define V_attachFlags(vp)       ((vp)->attach_flags)
***************
*** 758,765 ****
  extern void VPrintCacheStats(void);
  extern void VReleaseVnodeFiles_r(Volume * vp);
  extern void VCloseVnodeFiles_r(Volume * vp);
! extern struct DiskPartition *VGetPartition(char *name, int abortp);
! extern struct DiskPartition *VGetPartition_r(char *name, int abortp);
  extern int VInitVolumePackage(ProgramType pt, afs_uint32 nLargeVnodes,
  			      afs_uint32 nSmallVnodes, int connect, afs_uint32 volcache);
  extern void DiskToVolumeHeader(VolumeHeader_t * h, VolumeDiskHeader_t * dh);
--- 765,772 ----
  extern void VPrintCacheStats(void);
  extern void VReleaseVnodeFiles_r(Volume * vp);
  extern void VCloseVnodeFiles_r(Volume * vp);
! extern struct DiskPartition64 *VGetPartition(char *name, int abortp);
! extern struct DiskPartition64 *VGetPartition_r(char *name, int abortp);
  extern int VInitVolumePackage(ProgramType pt, afs_uint32 nLargeVnodes,
  			      afs_uint32 nSmallVnodes, int connect, afs_uint32 volcache);
  extern void DiskToVolumeHeader(VolumeHeader_t * h, VolumeDiskHeader_t * dh);
***************
*** 773,782 ****
  extern Volume *VPreAttachVolumeByName_r(Error * ec, char *partition, char *name);
  extern Volume *VPreAttachVolumeById_r(Error * ec, char * partition, 
  				      VolId volumeId);
! extern Volume *VPreAttachVolumeByVp_r(Error * ec, struct DiskPartition * partp, 
  				      Volume * vp, VolId volume_id);
  extern Volume *VGetVolumeByVp_r(Error * ec, Volume * vp);
! extern int VShutdownByPartition_r(struct DiskPartition * dp);
  extern int VShutdownVolume_r(Volume * vp);
  extern int VConnectSALV(void);
  extern int VConnectSALV_r(void);
--- 780,789 ----
  extern Volume *VPreAttachVolumeByName_r(Error * ec, char *partition, char *name);
  extern Volume *VPreAttachVolumeById_r(Error * ec, char * partition, 
  				      VolId volumeId);
! extern Volume *VPreAttachVolumeByVp_r(Error * ec, struct DiskPartition64 * partp, 
  				      Volume * vp, VolId volume_id);
  extern Volume *VGetVolumeByVp_r(Error * ec, Volume * vp);
! extern int VShutdownByPartition_r(struct DiskPartition64 * dp);
  extern int VShutdownVolume_r(Volume * vp);
  extern int VConnectSALV(void);
  extern int VConnectSALV_r(void);
Index: openafs/src/vol/volume_inline.h
diff -c openafs/src/vol/volume_inline.h:1.1.2.3 openafs/src/vol/volume_inline.h:1.1.2.4
*** openafs/src/vol/volume_inline.h:1.1.2.3	Wed Feb  6 07:21:48 2008
--- openafs/src/vol/volume_inline.h	Fri Mar 14 00:42:52 2008
***************
*** 15,21 ****
  #ifdef AFS_HPUX_ENV
  #define static_inline static __inline
  #elif defined(AFS_AIX_ENV)
! #define static_inline inline
  #else
  #define static_inline static inline
  #endif
--- 15,21 ----
  #ifdef AFS_HPUX_ENV
  #define static_inline static __inline
  #elif defined(AFS_AIX_ENV)
! #define static_inline static
  #else
  #define static_inline static inline
  #endif
Index: openafs/src/vol/vutil.c
diff -c openafs/src/vol/vutil.c:1.16 openafs/src/vol/vutil.c:1.16.8.1
*** openafs/src/vol/vutil.c:1.16	Wed Aug 18 20:22:38 2004
--- openafs/src/vol/vutil.c	Wed Mar  5 16:53:31 2008
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vutil.c,v 1.16 2004/08/19 00:22:38 kolya Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/vol/vutil.c,v 1.16.8.1 2008/03/05 21:53:31 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
***************
*** 123,129 ****
      int fd, i;
      char headerName[32], volumePath[64];
      Device device;
!     struct DiskPartition *partition;
      struct VolumeDiskHeader diskHeader;
      IHandle_t *handle;
      FdHandle_t *fdP;
--- 123,129 ----
      int fd, i;
      char headerName[32], volumePath[64];
      Device device;
!     struct DiskPartition64 *partition;
      struct VolumeDiskHeader diskHeader;
      IHandle_t *handle;
      FdHandle_t *fdP;
Index: openafs/src/volser/dumpstuff.c
diff -c openafs/src/volser/dumpstuff.c:1.29.2.9 openafs/src/volser/dumpstuff.c:1.29.2.10
*** openafs/src/volser/dumpstuff.c:1.29.2.9	Mon Jan 21 09:06:11 2008
--- openafs/src/volser/dumpstuff.c	Wed Mar  5 16:53:31 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/dumpstuff.c,v 1.29.2.9 2008/01/21 14:06:11 shadow Exp $");
  
  #include <sys/types.h>
  #include <ctype.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/dumpstuff.c,v 1.29.2.10 2008/03/05 21:53:31 shadow Exp $");
  
  #include <sys/types.h>
  #include <ctype.h>
***************
*** 77,83 ****
      struct rx_call *call;	/* call to which to write, might be an array */
      int device;			/* dump device ID for volume */
      int parentId;		/* dump parent ID for volume */
!     struct DiskPartition *dumpPartition;	/* Dump partition. */
      struct rx_call **calls;	/* array of pointers to calls */
      int ncalls;			/* how many calls/codes in array */
      int *codes;			/* one return code for each call */
--- 77,83 ----
      struct rx_call *call;	/* call to which to write, might be an array */
      int device;			/* dump device ID for volume */
      int parentId;		/* dump parent ID for volume */
!     struct DiskPartition64 *dumpPartition;	/* Dump partition. */
      struct rx_call **calls;	/* array of pointers to calls */
      int ncalls;			/* how many calls/codes in array */
      int *codes;			/* one return code for each call */
***************
*** 988,993 ****
--- 988,997 ----
  	    (size <=
  	     vcp->diskSize ? 0 : size - vcp->diskSize) >> vcp->logSize;
  	if (nVnodes > 0) {
+ 	    if (DoLogging) {
+ 		Log("RestoreVolume ProcessIndex: Set up %d inodes for volume %d\n",
+ 		    nVnodes, V_id(vp));
+ 	    }
  	    Buf = (afs_int32 *) malloc(nVnodes * sizeof(afs_int32));
  	    if (Buf == NULL) {
  		STREAM_CLOSE(afile);
***************
*** 1007,1012 ****
--- 1011,1019 ----
  		}
  		offset += vcp->diskSize;
  	    }
+ 	    if (DoLogging) {
+ 		Log("RestoreVolume ProcessIndex: found %d inodes\n", cnt);
+ 	    }
  	    *Bufp = Buf;
  	    *sizep = nVnodes;
  	}
***************
*** 1147,1152 ****
--- 1154,1163 ----
  
  	if (!ReadInt32(iodp, &vnode->uniquifier))
  	    return VOLSERREAD_DUMPERROR;
+ 
+ 	if (DoLogging) {
+ 	    Log("ReadVnodes: setup %d/%d\n", vnodeNumber, vnode->uniquifier);
+ 	}
  	while ((tag = iod_getc(iodp)) > D_MAX && tag != EOF) {
  	    haveStuff = 1;
  	    switch (tag) {
Index: openafs/src/volser/vol-dump.c
diff -c openafs/src/volser/vol-dump.c:1.2.4.1 openafs/src/volser/vol-dump.c:1.2.4.2
*** openafs/src/volser/vol-dump.c:1.2.4.1	Wed Oct 31 00:09:46 2007
--- openafs/src/volser/vol-dump.c	Wed Mar  5 16:53:31 2008
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vol-dump.c,v 1.2.4.1 2007/10/31 04:09:46 shadow Exp $");
  
  #include <ctype.h>
  #include <errno.h>
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vol-dump.c,v 1.2.4.2 2008/03/05 21:53:31 shadow Exp $");
  
  #include <ctype.h>
  #include <errno.h>
***************
*** 90,99 ****
  int verbose = 0;
  
  /* Forward Declarations */
! void HandleVolume(struct DiskPartition *partP, char *name, char *filename);
! Volume *AttachVolume(struct DiskPartition *dp, char *volname,
  		     register struct VolumeHeader *header);
! static void DoMyVolDump(Volume * vp, struct DiskPartition *dp,
  			char *dumpfile);
  
  #ifndef AFS_NT40_ENV
--- 90,99 ----
  int verbose = 0;
  
  /* Forward Declarations */
! void HandleVolume(struct DiskPartition64 *partP, char *name, char *filename);
! Volume *AttachVolume(struct DiskPartition64 *dp, char *volname,
  		     register struct VolumeHeader *header);
! static void DoMyVolDump(Volume * vp, struct DiskPartition64 *dp,
  			char *dumpfile);
  
  #ifndef AFS_NT40_ENV
***************
*** 118,124 ****
  
  
  Volume *
! AttachVolume(struct DiskPartition * dp, char *volname,
  	     register struct VolumeHeader * header)
  {
      register Volume *vp;
--- 118,124 ----
  
  
  Volume *
! AttachVolume(struct DiskPartition64 * dp, char *volname,
  	     register struct VolumeHeader * header)
  {
      register Volume *vp;
***************
*** 173,179 ****
      int volumeId = 0;
      char *partName = 0;
      char *fileName = NULL;
!     struct DiskPartition *partP = NULL;
      char name1[128];
      char tmpPartName[20];
  
--- 173,179 ----
      int volumeId = 0;
      char *partName = 0;
      char *fileName = NULL;
!     struct DiskPartition64 *partP = NULL;
      char name1[128];
      char tmpPartName[20];
  
***************
*** 237,243 ****
  }
  
  void
! HandleVolume(struct DiskPartition *dp, char *name, char *filename)
  {
      struct VolumeHeader header;
      struct VolumeDiskHeader diskHeader;
--- 237,243 ----
  }
  
  void
! HandleVolume(struct DiskPartition64 *dp, char *name, char *filename)
  {
      struct VolumeHeader header;
      struct VolumeDiskHeader diskHeader;
***************
*** 833,839 ****
  
  
  static void
! DoMyVolDump(Volume * vp, struct DiskPartition *dp, char *dumpfile)
  {
      int code = 0;
      int fromtime = 0;
--- 833,839 ----
  
  
  static void
! DoMyVolDump(Volume * vp, struct DiskPartition64 *dp, char *dumpfile)
  {
      int code = 0;
      int fromtime = 0;
Index: openafs/src/volser/volint.xg
diff -c openafs/src/volser/volint.xg:1.5.4.1 openafs/src/volser/volint.xg:1.5.4.2
*** openafs/src/volser/volint.xg:1.5.4.1	Thu Jul 19 14:52:14 2007
--- openafs/src/volser/volint.xg	Wed Mar  5 16:53:31 2008
***************
*** 50,55 ****
--- 50,56 ----
  #define     VOLCONVERTRO        65536
  #define     VOLGETSIZE          65537
  #define     VOLDUMPV2           65538
+ #define     VOLDISKPART64       65539
  
  /* Bits for flags for DumpV2 */
  %#define     VOLDUMPV2_OMITDIRS 1
***************
*** 209,214 ****
--- 210,225 ----
  
  };
  
+ struct diskPartition64 {
+     char	name[256];	/* Mounted partition name */
+     char	devName[256];	
+     int	        lock_fd;
+     afs_int64	totalUsable;
+     afs_int64 	free;
+     afs_int64 	minFree;
+ 
+ };
+ 
  struct restoreCookie {
  	char name[32];
  	afs_int32 type;
***************
*** 419,421 ****
--- 430,436 ----
    IN afs_int32 flags
  ) split = VOLDUMPV2;
  
+ proc PartitionInfo64(
+     IN string name<>,
+     OUT struct diskPartition64 *partition
+ ) = VOLDISKPART64;
Index: openafs/src/volser/volmain.c
diff -c openafs/src/volser/volmain.c:1.22.2.9 openafs/src/volser/volmain.c:1.22.2.10
*** openafs/src/volser/volmain.c:1.22.2.9	Tue Jan 22 23:18:17 2008
--- openafs/src/volser/volmain.c	Mon Mar 10 18:32:36 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/volmain.c,v 1.22.2.9 2008/01/23 04:18:17 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/volmain.c,v 1.22.2.10 2008/03/10 22:32:36 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
***************
*** 142,149 ****
  }
  
  /* background daemon for timing out transactions */
! static void
! BKGLoop()
  {
      struct timeval tv;
      int loop = 0;
--- 142,149 ----
  }
  
  /* background daemon for timing out transactions */
! static void*
! BKGLoop(void *unused)
  {
      struct timeval tv;
      int loop = 0;
***************
*** 164,175 ****
  	    ReOpenLog(AFSDIR_SERVER_VOLSERLOG_FILEPATH);
  	}
      }
  }
  
  /* Background daemon for sleeping so the volserver does not become I/O bound */
  afs_int32 TTsleep, TTrun;
! static void
! BKGSleep()
  {
      struct volser_trans *tt;
  
--- 164,177 ----
  	    ReOpenLog(AFSDIR_SERVER_VOLSERLOG_FILEPATH);
  	}
      }
+ 
+     return NULL;
  }
  
  /* Background daemon for sleeping so the volserver does not become I/O bound */
  afs_int32 TTsleep, TTrun;
! static void *
! BKGSleep(void *unused)
  {
      struct volser_trans *tt;
  
***************
*** 197,202 ****
--- 199,205 ----
  	        VTRANS_UNLOCK;
  	}
      }
+     return NULL;
  }
  
  #ifndef AFS_NT40_ENV
Index: openafs/src/volser/volprocs.c
diff -c openafs/src/volser/volprocs.c:1.42.2.11 openafs/src/volser/volprocs.c:1.42.2.14
*** openafs/src/volser/volprocs.c:1.42.2.11	Sun Feb 10 22:37:23 2008
--- openafs/src/volser/volprocs.c	Mon Mar 17 13:14:11 2008
***************
*** 13,19 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/volprocs.c,v 1.42.2.11 2008/02/11 03:37:23 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
--- 13,19 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/volprocs.c,v 1.42.2.14 2008/03/17 17:14:11 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
***************
*** 101,107 ****
  int 
  VPFullUnlock()
  {
!     register struct DiskPartition *tp;
      for (tp = DiskPartitionList; tp; tp = tp->next) {
  	if (tp->lock_fd != -1) {
  	    close(tp->lock_fd);	/* releases flock held on this partition */
--- 101,107 ----
  int 
  VPFullUnlock()
  {
!     register struct DiskPartition64 *tp;
      for (tp = DiskPartitionList; tp; tp = tp->next) {
  	if (tp->lock_fd != -1) {
  	    close(tp->lock_fd);	/* releases flock held on this partition */
***************
*** 214,219 ****
--- 214,221 ----
      afs_fsize_t length;
  
      vnode = (struct VnodeDiskObject *)malloc(SIZEOF_LARGEDISKVNODE);
+     if (!vnode)
+ 	return ENOMEM;
      memset(vnode, 0, SIZEOF_LARGEDISKVNODE);
  
      V_pref(vp, nearInode);
***************
*** 287,292 ****
--- 289,315 ----
  		     *partition)
  {
      afs_int32 code;
+     struct diskPartition64 *dp = (struct diskPartition64 *)
+ 	malloc(sizeof(struct diskPartition64));
+ 
+     code = VolPartitionInfo(acid, pname, dp);
+     if (!code) {
+ 	strncpy(partition->name, dp->name, 32);
+ 	strncpy(partition->devName, dp->devName, 32);
+ 	partition->lock_fd = dp->lock_fd;
+ 	partition->free=RoundInt64ToInt32(dp->free);
+ 	partition->minFree=RoundInt64ToInt32(dp->minFree);
+     }
+     free(dp);
+     osi_auditU(acid, VS_ParInfEvent, code, AUD_STR, pname, AUD_END);
+     return code;
+ }
+ 
+ afs_int32
+ SAFSVolPartitionInfo64(struct rx_call *acid, char *pname, struct diskPartition64 
+ 		     *partition)
+ {
+     afs_int32 code;
  
      code = VolPartitionInfo(acid, pname, partition);
      osi_auditU(acid, VS_ParInfEvent, code, AUD_STR, pname, AUD_END);
***************
*** 294,303 ****
  }
  
  afs_int32
! VolPartitionInfo(struct rx_call *acid, char *pname, struct diskPartition 
  		 *partition)
  {
!     register struct DiskPartition *dp;
  
  /*
      if (!afsconf_SuperUser(tdir, acid, caller)) return VOLSERBAD_ACCESS;
--- 317,326 ----
  }
  
  afs_int32
! VolPartitionInfo(struct rx_call *acid, char *pname, struct diskPartition64 
  		 *partition)
  {
!     register struct DiskPartition64 *dp;
  
  /*
      if (!afsconf_SuperUser(tdir, acid, caller)) return VOLSERBAD_ACCESS;
***************
*** 841,847 ****
      DeleteTrans(ttc, 1);
  
      {
! 	struct DiskPartition *tpartp = originalvp->partition;
  	FSYNC_VolOp(cloneId, tpartp->name, FSYNC_VOL_BREAKCBKS, 0, NULL);
      }
      return 0;
--- 864,870 ----
      DeleteTrans(ttc, 1);
  
      {
! 	struct DiskPartition64 *tpartp = originalvp->partition;
  	FSYNC_VolOp(cloneId, tpartp->name, FSYNC_VOL_BREAKCBKS, 0, NULL);
      }
      return 0;
***************
*** 1177,1184 ****
      struct Volume *vp;
      int i, is_incremental;
  
!     if (results)
  	memset(results, 0, sizeof(manyResults));
  
      if (!afsconf_SuperUser(tdir, acid, caller))
  	return VOLSERBAD_ACCESS;	/*not a super user */
--- 1200,1213 ----
      struct Volume *vp;
      int i, is_incremental;
  
!     if (results) {
  	memset(results, 0, sizeof(manyResults));
+ 	i = results->manyResults_len = destinations->manyDests_len;
+ 	results->manyResults_val = codes =
+ 	  (afs_int32 *) malloc(i * sizeof(afs_int32));
+     }	
+     if (!results || !results->manyResults_val)
+ 	return ENOMEM;
  
      if (!afsconf_SuperUser(tdir, acid, caller))
  	return VOLSERBAD_ACCESS;	/*not a super user */
***************
*** 1196,1207 ****
      /* (fromDate == 0) ==> full dump */
      is_incremental = (fromDate ? 1 : 0);
  
-     i = results->manyResults_len = destinations->manyDests_len;
-     results->manyResults_val = codes =
- 	(afs_int32 *) malloc(i * sizeof(afs_int32));
      tcons =
  	(struct rx_connection **)malloc(i * sizeof(struct rx_connection *));
      tcalls = (struct rx_call **)malloc(i * sizeof(struct rx_call *));
  
      /* get auth info for this connection (uses afs from ticket file) */
      code = afsconf_ClientAuth(tdir, &securityObject, &securityIndex);
--- 1225,1240 ----
      /* (fromDate == 0) ==> full dump */
      is_incremental = (fromDate ? 1 : 0);
  
      tcons =
  	(struct rx_connection **)malloc(i * sizeof(struct rx_connection *));
+     if (!tcons) {
+ 	return ENOMEM;
+     }
      tcalls = (struct rx_call **)malloc(i * sizeof(struct rx_call *));
+     if (!tcalls) {
+ 	free(tcons);
+ 	return ENOMEM;
+     }
  
      /* get auth info for this connection (uses afs from ticket file) */
      code = afsconf_ClientAuth(tdir, &securityObject, &securityIndex);
***************
*** 1579,1585 ****
      struct volser_trans *tt;
      register int len;
  
!     *aname = NULL;
      tt = FindTrans(atrans);
      if (!tt)
  	return ENOENT;
--- 1612,1621 ----
      struct volser_trans *tt;
      register int len;
  
!     /* We need to at least fill it in */
!     *aname = (char *)malloc(1);
!     if (!*aname)
! 	return ENOMEM;
      tt = FindTrans(atrans);
      if (!tt)
  	return ENOENT;
***************
*** 1604,1610 ****
  	TRELE(tt);
  	return E2BIG;
      }
!     *aname = (char *)malloc(len);
      strcpy(*aname, td->name);
      tt->rxCallPtr = (struct rx_call *)0;
      if (TRELE(tt))
--- 1640,1646 ----
  	TRELE(tt);
  	return E2BIG;
      }
!     *aname = (char *)realloc(*aname, len);
      strcpy(*aname, td->name);
      tt->rxCallPtr = (struct rx_call *)0;
      if (TRELE(tt))
***************
*** 1671,1677 ****
      struct stat rbuf, pbuf;
      char namehead[9];
      struct partList partList;
!     struct DiskPartition *dp;
      int i, j = 0, k;
  
      strcpy(namehead, "/vicep");	/*7 including null terminator */
--- 1707,1713 ----
      struct stat rbuf, pbuf;
      char namehead[9];
      struct partList partList;
!     struct DiskPartition64 *dp;
      int i, j = 0, k;
  
      strcpy(namehead, "/vicep");	/*7 including null terminator */
***************
*** 1696,1701 ****
--- 1732,1739 ----
  	    partList.partId[j++] = i;
      }
      pEntries->partEntries_val = (afs_int32 *) malloc(j * sizeof(int));
+     if (!pEntries->partEntries_val)
+ 	return ENOMEM;
      memcpy((char *)pEntries->partEntries_val, (char *)&partList,
  	   j * sizeof(int));
      pEntries->partEntries_len = j;
***************
*** 1842,1848 ****
  	VOLINT_INFO_STORE(handle, inUse, 1);
      }
  #else
!     VOLINT_INFO_STORE(handle, inUse, hdr->inUse);
  #endif
  
  
--- 1880,1890 ----
  	VOLINT_INFO_STORE(handle, inUse, 1);
      }
  #else
!     if (hdr->inUse == fileServer) {
! 	VOLINT_INFO_STORE(handle, inUse, 1);
!     } else {
! 	VOLINT_INFO_STORE(handle, inUse, 0);
!     }
  #endif
  
  
***************
*** 2058,2064 ****
  		     volumeId, volEntries *volumeInfo)
  {
      volintInfo *pntr;
!     struct DiskPartition *partP;
      char pname[9], volname[20];
      afs_int32 error = 0;
      DIR *dirp;
--- 2100,2106 ----
  		     volumeId, volEntries *volumeInfo)
  {
      volintInfo *pntr;
!     struct DiskPartition64 *partP;
      char pname[9], volname[20];
      afs_int32 error = 0;
      DIR *dirp;
***************
*** 2069,2074 ****
--- 2111,2118 ----
      volint_info_handle_t handle;
  
      volumeInfo->volEntries_val = (volintInfo *) malloc(sizeof(volintInfo));
+     if (!volumeInfo->volEntries_val)
+ 	return ENOMEM;
      pntr = volumeInfo->volEntries_val;
      volumeInfo->volEntries_len = 1;
      if (GetPartName(partid, pname))
***************
*** 2156,2162 ****
  {				/*SAFSVolXListOneVolume */
  
      volintXInfo *xInfoP;	/*Ptr to the extended vol info */
!     struct DiskPartition *partP;	/*Ptr to partition */
      char pname[9], volname[20];	/*Partition, volume names */
      afs_int32 error;		/*Error code */
      DIR *dirp;			/*Partition directory ptr */
--- 2200,2206 ----
  {				/*SAFSVolXListOneVolume */
  
      volintXInfo *xInfoP;	/*Ptr to the extended vol info */
!     struct DiskPartition64 *partP;	/*Ptr to partition */
      char pname[9], volname[20];	/*Partition, volume names */
      afs_int32 error;		/*Error code */
      DIR *dirp;			/*Partition directory ptr */
***************
*** 2172,2177 ****
--- 2216,2223 ----
       */
      a_volumeXInfoP->volXEntries_val =
  	(volintXInfo *) malloc(sizeof(volintXInfo));
+     if (!a_volumeXInfoP->volXEntries_val)
+ 	return ENOMEM;
      xInfoP = a_volumeXInfoP->volXEntries_val;
      a_volumeXInfoP->volXEntries_len = 1;
      code = ENODEV;
***************
*** 2265,2271 ****
  		   volEntries *volumeInfo)
  {
      volintInfo *pntr;
!     struct DiskPartition *partP;
      afs_int32 allocSize = 1000;	/*to be changed to a larger figure */
      char pname[9], volname[20];
      afs_int32 error = 0;
--- 2311,2317 ----
  		   volEntries *volumeInfo)
  {
      volintInfo *pntr;
!     struct DiskPartition64 *partP;
      afs_int32 allocSize = 1000;	/*to be changed to a larger figure */
      char pname[9], volname[20];
      afs_int32 error = 0;
***************
*** 2277,2282 ****
--- 2323,2330 ----
  
      volumeInfo->volEntries_val =
  	(volintInfo *) malloc(allocSize * sizeof(volintInfo));
+     if (!volumeInfo->volEntries_val)
+ 	return ENOMEM;
      pntr = volumeInfo->volEntries_val;
      volumeInfo->volEntries_len = 0;
      if (GetPartName(partid, pname))
***************
*** 2390,2396 ****
  {				/*SAFSVolXListVolumes */
  
      volintXInfo *xInfoP;	/*Ptr to the extended vol info */
!     struct DiskPartition *partP;	/*Ptr to partition */
      afs_int32 allocSize = 1000;	/*To be changed to a larger figure */
      char pname[9], volname[20];	/*Partition, volume names */
      afs_int32 error = 0;	/*Return code */
--- 2438,2444 ----
  {				/*SAFSVolXListVolumes */
  
      volintXInfo *xInfoP;	/*Ptr to the extended vol info */
!     struct DiskPartition64 *partP;	/*Ptr to partition */
      afs_int32 allocSize = 1000;	/*To be changed to a larger figure */
      char pname[9], volname[20];	/*Partition, volume names */
      afs_int32 error = 0;	/*Return code */
***************
*** 2406,2411 ****
--- 2454,2461 ----
       */
      a_volumeXInfoP->volXEntries_val =
  	(volintXInfo *) malloc(allocSize * sizeof(volintXInfo));
+     if (!a_volumeXInfoP->volXEntries_val)
+ 	return ENOMEM;
      xInfoP = a_volumeXInfoP->volXEntries_val;
      a_volumeXInfoP->volXEntries_len = 0;
  
***************
*** 2537,2542 ****
--- 2587,2594 ----
  
      transInfo->transDebugEntries_val =
  	(transDebugInfo *) malloc(allocSize * sizeof(transDebugInfo));
+     if (!transInfo->transDebugEntries_val)
+ 	return ENOMEM;
      pntr = transInfo->transDebugEntries_val;
      transInfo->transDebugEntries_len = 0;
      allTrans = TransList();
***************
*** 2706,2712 ****
      DIR *dirp;
      register struct volser_trans *ttc;
      char pname[16], volname[20];
!     struct DiskPartition *partP;
      afs_int32 ret = ENODEV;
      afs_int32 volid;
  
--- 2758,2764 ----
      DIR *dirp;
      register struct volser_trans *ttc;
      char pname[16], volname[20];
!     struct DiskPartition64 *partP;
      afs_int32 ret = ENODEV;
      afs_int32 volid;
  
Index: openafs/src/volser/volser_prototypes.h
diff -c openafs/src/volser/volser_prototypes.h:1.5.8.2 openafs/src/volser/volser_prototypes.h:1.5.8.3
*** openafs/src/volser/volser_prototypes.h:1.5.8.2	Mon Jan 21 09:33:29 2008
--- openafs/src/volser/volser_prototypes.h	Wed Mar  5 16:53:31 2008
***************
*** 24,31 ****
  extern void SubEnumerateEntry(struct nvldbentry *entry);
  extern void EnumerateEntry(struct nvldbentry *entry);
  extern int UV_NukeVolume(afs_int32 server, afs_int32 partid, afs_int32 volid);
! extern int UV_PartitionInfo(afs_int32 server, char *pname,
! 			    struct diskPartition *partition);
  extern int UV_CreateVolume(afs_int32 aserver, afs_int32 apart, char *aname,
  			   afs_int32 * anewid);
  extern int UV_CreateVolume2(afs_int32 aserver, afs_int32 apart, char *aname,
--- 24,31 ----
  extern void SubEnumerateEntry(struct nvldbentry *entry);
  extern void EnumerateEntry(struct nvldbentry *entry);
  extern int UV_NukeVolume(afs_int32 server, afs_int32 partid, afs_int32 volid);
! extern int UV_PartitionInfo64(afs_int32 server, char *pname,
! 			    struct diskPartition64 *partition);
  extern int UV_CreateVolume(afs_int32 aserver, afs_int32 apart, char *aname,
  			   afs_int32 * anewid);
  extern int UV_CreateVolume2(afs_int32 aserver, afs_int32 apart, char *aname,
Index: openafs/src/volser/vos.c
diff -c openafs/src/volser/vos.c:1.55.2.12 openafs/src/volser/vos.c:1.55.2.13
*** openafs/src/volser/vos.c:1.55.2.12	Sun Feb 10 22:44:23 2008
--- openafs/src/volser/vos.c	Wed Mar  5 16:53:31 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vos.c,v 1.55.2.12 2008/02/11 03:44:23 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vos.c,v 1.55.2.13 2008/03/05 21:53:31 shadow Exp $");
  
  #include <sys/types.h>
  #include <string.h>
***************
*** 2102,2108 ****
      afs_int32 flags, code, err;
      char fromPartName[10], toPartName[10];
  
!     struct diskPartition partition;	/* for space check */
      volintInfo *p;
  
      volid = vsu_GetVolumeID(as->parms[0].items->data, cstruct, &err);
--- 2102,2108 ----
      afs_int32 flags, code, err;
      char fromPartName[10], toPartName[10];
  
!     struct diskPartition64 partition;	/* for space check */
      volintInfo *p;
  
      volid = vsu_GetVolumeID(as->parms[0].items->data, cstruct, &err);
***************
*** 2171,2177 ****
       * check target partition for space to move volume
       */
  
!     code = UV_PartitionInfo(toserver, toPartName, &partition);
      if (code) {
  	fprintf(STDERR, "vos: cannot access partition %s\n", toPartName);
  	exit(1);
--- 2171,2177 ----
       * check target partition for space to move volume
       */
  
!     code = UV_PartitionInfo64(toserver, toPartName, &partition);
      if (code) {
  	fprintf(STDERR, "vos: cannot access partition %s\n", toPartName);
  	exit(1);
***************
*** 2227,2233 ****
      afs_int32 volid, fromserver, toserver, frompart, topart, code, err, flags;
      char fromPartName[10], toPartName[10], *tovolume;
      struct nvldbentry entry;
!     struct diskPartition partition;	/* for space check */
      volintInfo *p;
  
      volid = vsu_GetVolumeID(as->parms[0].items->data, cstruct, &err);
--- 2227,2233 ----
      afs_int32 volid, fromserver, toserver, frompart, topart, code, err, flags;
      char fromPartName[10], toPartName[10], *tovolume;
      struct nvldbentry entry;
!     struct diskPartition64 partition;	/* for space check */
      volintInfo *p;
  
      volid = vsu_GetVolumeID(as->parms[0].items->data, cstruct, &err);
***************
*** 2322,2328 ****
       * check target partition for space to move volume
       */
  
!     code = UV_PartitionInfo(toserver, toPartName, &partition);
      if (code) {
  	fprintf(STDERR, "vos: cannot access partition %s\n", toPartName);
  	exit(1);
--- 2322,2328 ----
       * check target partition for space to move volume
       */
  
!     code = UV_PartitionInfo64(toserver, toPartName, &partition);
      if (code) {
  	fprintf(STDERR, "vos: cannot access partition %s\n", toPartName);
  	exit(1);
***************
*** 2374,2380 ****
      afs_int32 code, err, flags;
      char fromPartName[10], toPartName[10], toVolName[32], *tovolume;
      struct nvldbentry entry;
!     struct diskPartition partition;	/* for space check */
      volintInfo *p, *q;
  
      p = (volintInfo *) 0;
--- 2374,2380 ----
      afs_int32 code, err, flags;
      char fromPartName[10], toPartName[10], toVolName[32], *tovolume;
      struct nvldbentry entry;
!     struct diskPartition64 partition;	/* for space check */
      volintInfo *p, *q;
  
      p = (volintInfo *) 0;
***************
*** 2507,2513 ****
       * check target partition for space to move volume
       */
  
!     code = UV_PartitionInfo(toserver, toPartName, &partition);
      if (code) {
  	fprintf(STDERR, "vos: cannot access partition %s\n", toPartName);
  	exit(1);
--- 2507,2513 ----
       * check target partition for space to move volume
       */
  
!     code = UV_PartitionInfo64(toserver, toPartName, &partition);
      if (code) {
  	fprintf(STDERR, "vos: cannot access partition %s\n", toPartName);
  	exit(1);
***************
*** 4994,5000 ****
      afs_int32 apart;
      afs_int32 aserver, code;
      char pname[10];
!     struct diskPartition partition;
      struct partList dummyPartList;
      int i, cnt;
      int printSummary=0, sumPartitions=0;
--- 4994,5000 ----
      afs_int32 apart;
      afs_int32 aserver, code;
      char pname[10];
!     struct diskPartition64 partition;
      struct partList dummyPartList;
      int i, cnt;
      int printSummary=0, sumPartitions=0;
***************
*** 5043,5049 ****
      for (i = 0; i < cnt; i++) {
  	if (dummyPartList.partFlags[i] & PARTVALID) {
  	    MapPartIdIntoName(dummyPartList.partId[i], pname);
! 	    code = UV_PartitionInfo(aserver, pname, &partition);
  	    if (code) {
  		fprintf(STDERR, "Could not get information on partition %s\n",
  			pname);
--- 5043,5049 ----
      for (i = 0; i < cnt; i++) {
  	if (dummyPartList.partFlags[i] & PARTVALID) {
  	    MapPartIdIntoName(dummyPartList.partId[i], pname);
! 	    code = UV_PartitionInfo64(aserver, pname, &partition);
  	    if (code) {
  		fprintf(STDERR, "Could not get information on partition %s\n",
  			pname);
***************
*** 5051,5063 ****
  		exit(1);
  	    }
  	    fprintf(STDOUT,
! 		    "Free space on partition %s: %d K blocks out of total %d\n",
  		    pname, partition.free, partition.minFree);
  	    sumPartitions++;
!             FillInt64(tmp,0,partition.free);
!             AddUInt64(sumFree,tmp,&sumFree);
!             FillInt64(tmp,0,partition.minFree);
!             AddUInt64(sumStorage,tmp,&sumStorage);
  	}
      }
      if (printSummary) {
--- 5051,5061 ----
  		exit(1);
  	    }
  	    fprintf(STDOUT,
! 		    "Free space on partition %s: %lld K blocks out of total %lld\n",
  		    pname, partition.free, partition.minFree);
  	    sumPartitions++;
!             AddUInt64(sumFree,partition.free,&sumFree);
!             AddUInt64(sumStorage,partition.minFree,&sumStorage);
  	}
      }
      if (printSummary) {
Index: openafs/src/volser/vsprocs.c
diff -c openafs/src/volser/vsprocs.c:1.38.2.13 openafs/src/volser/vsprocs.c:1.38.2.14
*** openafs/src/volser/vsprocs.c:1.38.2.13	Sun Feb 10 22:44:24 2008
--- openafs/src/volser/vsprocs.c	Wed Mar  5 16:53:31 2008
***************
*** 11,17 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vsprocs.c,v 1.38.2.13 2008/02/11 03:44:24 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
--- 11,17 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/volser/vsprocs.c,v 1.38.2.14 2008/03/05 21:53:31 shadow Exp $");
  
  #include <stdio.h>
  #include <sys/types.h>
***************
*** 592,607 ****
  
  /* like df. Return usage of <pname> on <server> in <partition> */
  int
! UV_PartitionInfo(afs_int32 server, char *pname,
! 		 struct diskPartition *partition)
  {
      register struct rx_connection *aconn;
!     afs_int32 code;
  
-     code = 0;
      aconn = (struct rx_connection *)0;
      aconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
!     code = AFSVolPartitionInfo(aconn, pname, partition);
      if (code) {
  	fprintf(STDERR, "Could not get information on partition %s\n", pname);
  	PrintError("", code);
--- 592,619 ----
  
  /* like df. Return usage of <pname> on <server> in <partition> */
  int
! UV_PartitionInfo64(afs_int32 server, char *pname,
! 		   struct diskPartition64 *partition)
  {
      register struct rx_connection *aconn;
!     afs_int32 code = 0;
  
      aconn = (struct rx_connection *)0;
      aconn = UV_Bind(server, AFSCONF_VOLUMEPORT);
!     code = AFSVolPartitionInfo64(aconn, pname, partition);
!     if (code == RXGEN_OPCODE) {
! 	struct diskPartition *dpp = 
! 	    (struct diskPartition *)malloc(sizeof(struct diskPartition));
! 	code = AFSVolPartitionInfo(aconn, pname, dpp);
! 	if (!code) {
! 	    strncpy(partition->name, dpp->name, 32);
! 	    strncpy(partition->devName, dpp->devName, 32);
! 	    partition->lock_fd = dpp->lock_fd;
! 	    partition->free = dpp->free;
! 	    partition->minFree = dpp->minFree;
! 	}
! 	free(dpp);
!     } 
      if (code) {
  	fprintf(STDERR, "Could not get information on partition %s\n", pname);
  	PrintError("", code);
Index: openafs/src/xstat/xstat_cm.c
diff -c openafs/src/xstat/xstat_cm.c:1.10.2.2 openafs/src/xstat/xstat_cm.c:1.10.2.3
*** openafs/src/xstat/xstat_cm.c:1.10.2.2	Tue Oct 30 11:16:59 2007
--- openafs/src/xstat/xstat_cm.c	Mon Mar 10 18:32:37 2008
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/xstat/xstat_cm.c,v 1.10.2.2 2007/10/30 15:16:59 shadow Exp $");
  
  #include "xstat_cm.h"		/*Interface for this module */
  #include <lwp.h>		/*Lightweight process package */
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/xstat/xstat_cm.c,v 1.10.2.3 2008/03/10 22:32:37 shadow Exp $");
  
  #include "xstat_cm.h"		/*Interface for this module */
  #include <lwp.h>		/*Lightweight process package */
***************
*** 198,205 ****
   * Side Effects:
   *	As advertised.
   *------------------------------------------------------------------------*/
! static void
! xstat_cm_LWP()
  {
      static char rn[] = "xstat_cm_LWP";	/*Routine name */
      register afs_int32 code;	/*Results of calls */
--- 198,205 ----
   * Side Effects:
   *	As advertised.
   *------------------------------------------------------------------------*/
! static void *
! xstat_cm_LWP(void *unused)
  {
      static char rn[] = "xstat_cm_LWP";	/*Routine name */
      register afs_int32 code;	/*Results of calls */
***************
*** 349,354 ****
--- 349,355 ----
  			code);
  	}			/*Continuous execution */
      }				/*Service loop */
+     return NULL;
  }
  
  
Index: openafs/src/xstat/xstat_fs.c
diff -c openafs/src/xstat/xstat_fs.c:1.10.2.2 openafs/src/xstat/xstat_fs.c:1.10.2.3
*** openafs/src/xstat/xstat_fs.c:1.10.2.2	Tue Oct 30 11:16:59 2007
--- openafs/src/xstat/xstat_fs.c	Mon Mar 10 18:32:37 2008
***************
*** 18,24 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/xstat/xstat_fs.c,v 1.10.2.2 2007/10/30 15:16:59 shadow Exp $");
  
  #include "xstat_fs.h"		/*Interface for this module */
  #include <lwp.h>		/*Lightweight process package */
--- 18,24 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/xstat/xstat_fs.c,v 1.10.2.3 2008/03/10 22:32:37 shadow Exp $");
  
  #include "xstat_fs.h"		/*Interface for this module */
  #include <lwp.h>		/*Lightweight process package */
***************
*** 238,245 ****
   *	Nothing interesting.
   *------------------------------------------------------------------------*/
  
! static void
! xstat_fs_LWP()
  {
      static char rn[] = "xstat_fs_LWP";	/*Routine name */
      register afs_int32 code;	/*Results of calls */
--- 238,245 ----
   *	Nothing interesting.
   *------------------------------------------------------------------------*/
  
! static void *
! xstat_fs_LWP(void *unused)
  {
      static char rn[] = "xstat_fs_LWP";	/*Routine name */
      register afs_int32 code;	/*Results of calls */
***************
*** 388,393 ****
--- 388,394 ----
  			code);
  	}			/*Continuous execution */
      }				/*Service loop */
+     return NULL;
  }
  
  /*------------------------------------------------------------------------
