#include <osi.h>
#include "afsd.h"
+#ifdef USE_BPLUS
+#include "cm_btree.h"
+#endif
#include <rx\rx.h>
#include <rx\rx_null.h>
#include <WINNT/syscfg.h>
extern afs_int32 cryptall;
extern int cm_enableServerLocks;
+extern int cm_followBackupPath;
extern int cm_deleteReadOnly;
+#ifdef USE_BPLUS
+extern afs_int32 cm_BPlusTrees;
+#endif
+extern afs_int32 cm_OfflineROIsValid;
+extern afs_int32 cm_giveUpAllCBs;
+extern const char **smb_ExecutableExtensions;
osi_log_t *afsd_logp;
KEY_READ|KEY_WRITE,
&hkMSV10) == ERROR_SUCCESS )
{
- if (RegQueryValueEx( hkMSV10, "BackConnectionHostNames", 0,
- &dwType, NULL, &dwAllocSize) == ERROR_SUCCESS) {
+ if ((RegQueryValueEx( hkMSV10, "BackConnectionHostNames", 0,
+ &dwType, NULL, &dwAllocSize) == ERROR_SUCCESS) &&
+ (dwType == REG_MULTI_SZ))
+ {
dwAllocSize += 1 /* in case the source string is not nul terminated */
+ strlen(cm_NetbiosName) + 2;
pHostNames = malloc(dwAllocSize);
dwSize = dwAllocSize;
if (RegQueryValueEx( hkMSV10, "BackConnectionHostNames", 0, &dwType,
- pHostNames, &dwSize) == ERROR_SUCCESS) {
+ pHostNames, &dwSize) == ERROR_SUCCESS)
+ {
for (pName = pHostNames;
(pName - pHostNames < dwSize) && *pName ;
pName += strlen(pName) + 1)
}
else /* add a new server without a cell */
{
- tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL); /* refcount = 1 */
+ tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
tsp->ipRank = (USHORT)dwRank;
}
}
}
else /* add a new server without a cell */
{
- tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL); /* refcount = 1 */
+ tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
tsp->ipRank = (USHORT)dwRank;
}
}
osi_uid_t debugID;
afs_uint64 cacheBlocks;
DWORD cacheSize;
+ DWORD blockSize;
long logChunkSize;
DWORD stats;
DWORD dwValue;
logChunkSize);
logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE;
}
- afsi_log("Chunk size %d", logChunkSize);
} else {
logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE;
- afsi_log("Default chunk size %d", logChunkSize);
}
cm_logChunkSize = logChunkSize;
cm_chunkSize = 1 << logChunkSize;
+ afsi_log("Chunk size %u (%d)", cm_chunkSize, cm_logChunkSize);
+
+ dummyLen = sizeof(blockSize);
+ code = RegQueryValueEx(parmKey, "blockSize", NULL, NULL,
+ (BYTE *) &blockSize, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ if (blockSize < 1 ||
+ (blockSize > 1024 && (blockSize % CM_CONFIGDEFAULT_BLOCKSIZE != 0)))
+ {
+ afsi_log("Invalid block size %u specified, using default", blockSize);
+ blockSize = CM_CONFIGDEFAULT_BLOCKSIZE;
+ } else {
+ /*
+ * if the blockSize is less than 1024 we permit the blockSize to be
+ * specified in multiples of the default blocksize
+ */
+ if (blockSize <= 1024)
+ blockSize *= CM_CONFIGDEFAULT_BLOCKSIZE;
+ }
+ } else {
+ blockSize = CM_CONFIGDEFAULT_BLOCKSIZE;
+ }
+ if (blockSize > cm_chunkSize) {
+ afsi_log("Block size (%d) cannot be larger than Chunk size (%d).",
+ blockSize, cm_chunkSize);
+ blockSize = cm_chunkSize;
+ }
+ if (cm_chunkSize % blockSize != 0) {
+ afsi_log("Block size (%d) must be a factor of Chunk size (%d).",
+ blockSize, cm_chunkSize);
+ blockSize = CM_CONFIGDEFAULT_BLOCKSIZE;
+ }
+ afsi_log("Block size %u", blockSize);
dummyLen = sizeof(numBkgD);
code = RegQueryValueEx(parmKey, "Daemons", NULL, NULL,
(BYTE *) &numBkgD, &dummyLen);
- if (code == ERROR_SUCCESS)
+ if (code == ERROR_SUCCESS) {
+ if (numBkgD > CM_MAX_DAEMONS)
+ numBkgD = CM_MAX_DAEMONS;
afsi_log("%d background daemons", numBkgD);
- else {
+ } else {
numBkgD = CM_CONFIGDEFAULT_DAEMONS;
afsi_log("Defaulting to %d background daemons", numBkgD);
}
}
afsi_log("CM DeleteReadOnly is %u", cm_deleteReadOnly);
+#ifdef USE_BPLUS
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "BPlusTrees", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_BPlusTrees = (unsigned short) dwValue;
+ }
+ afsi_log("CM BPlusTrees is %u", cm_BPlusTrees);
+
+ if (cm_BPlusTrees && !cm_InitBPlusDir()) {
+ cm_BPlusTrees = 0;
+ afsi_log("CM BPlusTree initialization failure; disabled for this session");
+ }
+#else
+ afsi_log("CM BPlusTrees is not supported");
+#endif
+
+ if ((RegQueryValueEx( parmKey, "PrefetchExecutableExtensions", 0,
+ ®Type, NULL, &dummyLen) == ERROR_SUCCESS) &&
+ (regType == REG_MULTI_SZ))
+ {
+ char * pSz;
+ dummyLen += 3; /* in case the source string is not nul terminated */
+ pSz = malloc(dummyLen);
+ if ((RegQueryValueEx( parmKey, "PrefetchExecutableExtensions", 0, ®Type,
+ pSz, &dummyLen) == ERROR_SUCCESS) &&
+ (regType == REG_MULTI_SZ))
+ {
+ int cnt;
+ char * p;
+
+ for (cnt = 0, p = pSz; (p - pSz < dummyLen) && *p; cnt++, p += strlen(p) + 1);
+
+ smb_ExecutableExtensions = malloc(sizeof(char *) * (cnt+1));
+
+ for (cnt = 0, p = pSz; (p - pSz < dummyLen) && *p; cnt++, p += strlen(p) + 1)
+ {
+ smb_ExecutableExtensions[cnt] = p;
+ afsi_log("PrefetchExecutableExtension: \"%s\"", p);
+ }
+ smb_ExecutableExtensions[cnt] = NULL;
+ }
+
+ if (!smb_ExecutableExtensions)
+ free(pSz);
+ }
+ if (!smb_ExecutableExtensions)
+ afsi_log("No PrefetchExecutableExtensions");
+
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "OfflineReadOnlyIsValid", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_OfflineROIsValid = (unsigned short) dwValue;
+ }
+ afsi_log("CM OfflineReadOnlyIsValid is %u", cm_deleteReadOnly);
+
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "GiveUpAllCallBacks", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_giveUpAllCBs = (unsigned short) dwValue;
+ }
+ afsi_log("CM GiveUpAllCallBacks is %u", cm_giveUpAllCBs);
+
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "FollowBackupPath", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_followBackupPath = (unsigned short) dwValue;
+ }
+ afsi_log("CM FollowBackupPath is %u", cm_followBackupPath);
+
RegCloseKey (parmKey);
- cacheBlocks = ((afs_uint64)cacheSize * 1024) / CM_CONFIGDEFAULT_BLOCKSIZE;
+ cacheBlocks = ((afs_uint64)cacheSize * 1024) / blockSize;
/* get network related info */
cm_noIPAddr = CM_MAXINTERFACE_ADDR;
smb_InitIoctl();
cm_InitCallback();
-
- code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, cm_chunkSize, cacheBlocks);
+
+ 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";
void afsd_printStack(HANDLE hThread, CONTEXT *c)
{
-#if defined(_X86_)
HANDLE hProcess = GetCurrentProcess();
int frameNum;
#if defined(_AMD64_)
#error The STACKFRAME initialization in afsd_printStack() for this platform
#error must be properly configured
#elif defined(_AMD64_)
- s.AddrPC.Offset = 0;
+ s.AddrPC.Offset = c->Rip;
s.AddrPC.Mode = AddrModeFlat;
- s.AddrFrame.Offset = 0;
+ s.AddrFrame.Offset = c->Rbp;
s.AddrFrame.Mode = AddrModeFlat;
#else
s.AddrPC.Offset = c->Eip;
SymCleanup(hProcess);
GlobalFree(pSym);
-#endif /* _X86_ */
}
#ifdef _DEBUG
#if defined(_X86)
ep->ContextRecord->Eip++;
#endif
+#if defined(_AMD64_)
+ ep->ContextRecord->Rip++;
+#endif
return EXCEPTION_CONTINUE_EXECUTION;
}
else