Index: openafs/src/WINNT/afsd/afsd_init.c diff -c openafs/src/WINNT/afsd/afsd_init.c:1.79.2.28 openafs/src/WINNT/afsd/afsd_init.c:1.79.2.32 *** openafs/src/WINNT/afsd/afsd_init.c:1.79.2.28 Thu Feb 14 22:26:35 2008 --- openafs/src/WINNT/afsd/afsd_init.c Mon Feb 25 17:21:24 2008 *************** *** 40,46 **** extern int RXAFSCB_ExecuteRequest(struct rx_call *z_call); extern int RXSTATS_ExecuteRequest(struct rx_call *z_call); ! extern afs_int32 cryptall; extern int cm_enableServerLocks; extern int cm_followBackupPath; extern int cm_deleteReadOnly; --- 40,47 ---- extern int RXAFSCB_ExecuteRequest(struct rx_call *z_call); extern int RXSTATS_ExecuteRequest(struct rx_call *z_call); ! extern afs_uint32 cryptall; ! extern afs_uint32 cm_anonvldb; extern int cm_enableServerLocks; extern int cm_followBackupPath; extern int cm_deleteReadOnly; *************** *** 943,948 **** --- 944,954 ---- else LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_CRYPT_OFF); + dummyLen = sizeof(cryptall); + code = RegQueryValueEx(parmKey, "ForceAnonVLDB", NULL, NULL, + (BYTE *) &cm_anonvldb, &dummyLen); + afsi_log("CM ForceAnonVLDB is %s", cm_anonvldb ? "on" : "off"); + #ifdef AFS_AFSDB_ENV dummyLen = sizeof(cm_dnsEnabled); code = RegQueryValueEx(parmKey, "UseDNS", NULL, NULL, *************** *** 1052,1057 **** --- 1058,1074 ---- if (rx_enable_process_stats) afsi_log("RX Process Statistics gathering is enabled"); + dummyLen = sizeof(dwValue); + dwValue = 0; + code = RegQueryValueEx(parmKey, "RxEnableHotThread", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code != ERROR_SUCCESS || dwValue != 0) { + rx_EnableHotThread(); + afsi_log("RX Hot Thread is enabled"); + } + else + afsi_log("RX Hot Thread is disabled"); + dummyLen = sizeof(DWORD); code = RegQueryValueEx(parmKey, "CallBackPort", NULL, NULL, (BYTE *) &dwValue, &dummyLen); *************** *** 1344,1353 **** /* compute the root fid */ if (!cm_freelanceEnabled) { ! cm_data.rootFid.cell = cm_data.rootCellp->cellID; ! cm_data.rootFid.volume = cm_GetROVolumeID(cm_data.rootVolumep); ! cm_data.rootFid.vnode = 1; ! cm_data.rootFid.unique = 1; } else cm_FakeRootFid(&cm_data.rootFid); --- 1361,1367 ---- /* compute the root fid */ if (!cm_freelanceEnabled) { ! cm_SetFid(&cm_data.rootFid, cm_data.rootCellp->cellID, cm_GetROVolumeID(cm_data.rootVolumep), 1, 1); } else cm_FakeRootFid(&cm_data.rootFid); *************** *** 1381,1386 **** --- 1395,1424 ---- (BYTE *) &dwValue, &dummyLen); if (code == ERROR_SUCCESS) smb_StoreAnsiFilenames = dwValue ? 1 : 0; + afsi_log("StoreAnsiFilenames = %d", smb_StoreAnsiFilenames); + + dummyLen = sizeof(DWORD); + 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); + code = RegQueryValueEx(parmKey, "SMBAsyncStoreSize", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) { + /* Should check for >= blocksize && <= chunksize && round down to multiple of blocksize */ + if (dwValue > cm_chunkSize) + smb_AsyncStoreSize = cm_chunkSize; + else if (dwValue < cm_data.buf_blockSize) + smb_AsyncStoreSize = cm_data.buf_blockSize; + else + smb_AsyncStoreSize = (dwValue & ~(cm_data.buf_blockSize-1)); + } else + smb_AsyncStoreSize = CM_CONFIGDEFAULT_ASYNCSTORESIZE; + afsi_log("SMBAsyncStoreSize = %d", smb_AsyncStoreSize); + RegCloseKey (parmKey); } Index: openafs/src/WINNT/afsd/cm_access.c diff -c openafs/src/WINNT/afsd/cm_access.c:1.7.2.15 openafs/src/WINNT/afsd/cm_access.c:1.7.2.17 *** openafs/src/WINNT/afsd/cm_access.c:1.7.2.15 Thu Apr 26 14:08:00 2007 --- openafs/src/WINNT/afsd/cm_access.c Sun Feb 24 01:28:57 2008 *************** *** 42,47 **** --- 42,48 ---- cm_fid_t tfid; int didLock; long trights; + int release = 0; /* Used to avoid a call to cm_HoldSCache in the directory case */ #if 0 if (scp->flags & CM_SCACHEFLAG_EACCESS) { *************** *** 51,63 **** #endif didLock = 0; if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { ! aclScp = scp; ! cm_HoldSCache(scp); } else { ! tfid.cell = scp->fid.cell; ! tfid.volume = scp->fid.volume; ! tfid.vnode = scp->parentVnode; ! tfid.unique = scp->parentUnique; aclScp = cm_FindSCache(&tfid); if (!aclScp) return 0; --- 52,60 ---- #endif didLock = 0; if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { ! aclScp = scp; /* not held, not released */ } else { ! cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, scp->parentVnode, scp->parentUnique); aclScp = cm_FindSCache(&tfid); if (!aclScp) return 0; *************** *** 78,83 **** --- 75,81 ---- } didLock = 1; } + release = 1; } lock_AssertMutex(&aclScp->mx); *************** *** 142,148 **** done: if (didLock) lock_ReleaseMutex(&aclScp->mx); ! cm_ReleaseSCache(aclScp); return code; } --- 140,147 ---- done: if (didLock) lock_ReleaseMutex(&aclScp->mx); ! if (release) ! cm_ReleaseSCache(aclScp); return code; } *************** *** 175,184 **** cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); } else { /* not a dir, use parent dir's acl */ ! tfid.cell = scp->fid.cell; ! tfid.volume = scp->fid.volume; ! tfid.vnode = scp->parentVnode; ! tfid.unique = scp->parentUnique; lock_ReleaseMutex(&scp->mx); code = cm_GetSCache(&tfid, &aclScp, userp, reqp); if (code) { --- 174,180 ---- cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); } 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) { Index: openafs/src/WINNT/afsd/cm_btree.c diff -c openafs/src/WINNT/afsd/cm_btree.c:1.1.2.13 openafs/src/WINNT/afsd/cm_btree.c:1.1.2.14 *** openafs/src/WINNT/afsd/cm_btree.c:1.1.2.13 Wed Nov 14 01:23:33 2007 --- openafs/src/WINNT/afsd/cm_btree.c Fri Feb 22 19:17:34 2008 *************** *** 1667,1676 **** lock_AssertWrite(&op->scp->dirlock); ! data.fid.cell = cfid->cell; ! data.fid.volume = cfid->volume; ! data.fid.vnode = cfid->vnode; ! data.fid.unique = cfid->unique; data.longname = NULL; QueryPerformanceCounter(&start); --- 1667,1673 ---- lock_AssertWrite(&op->scp->dirlock); ! cm_SetFid(&data.fid, cfid->cell, cfid->volume, cfid->vnode, cfid->unique); data.longname = NULL; QueryPerformanceCounter(&start); *************** *** 1857,1866 **** dataT data; char shortName[13]; ! data.fid.cell = scp->fid.cell; ! data.fid.volume = scp->fid.volume; ! data.fid.vnode = ntohl(dep->fid.vnode); ! data.fid.unique = ntohl(dep->fid.unique); data.longname = NULL; /* the Write lock is held in cm_BPlusDirBuildTree() */ --- 1854,1860 ---- dataT data; char shortName[13]; ! cm_SetFid(&data.fid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique)); data.longname = NULL; /* the Write lock is held in cm_BPlusDirBuildTree() */ Index: openafs/src/WINNT/afsd/cm_buf.c diff -c openafs/src/WINNT/afsd/cm_buf.c:1.31.2.25 openafs/src/WINNT/afsd/cm_buf.c:1.31.2.28 *** openafs/src/WINNT/afsd/cm_buf.c:1.31.2.25 Mon Dec 10 15:35:06 2007 --- openafs/src/WINNT/afsd/cm_buf.c Sat Feb 23 16:14:19 2008 *************** *** 92,121 **** void buf_HoldLocked(cm_buf_t *bp) { osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); ! bp->refCount++; } /* hold a reference to an already held buffer */ void buf_Hold(cm_buf_t *bp) { ! lock_ObtainWrite(&buf_globalLock); buf_HoldLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); } /* code to drop reference count while holding buf_globalLock */ ! void buf_ReleaseLocked(cm_buf_t *bp) { /* ensure that we're in the LRU queue if our ref count is 0 */ osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); #ifdef DEBUG ! if (bp->refCount == 0) osi_panic("buf refcount 0",__FILE__,__LINE__);; #else ! osi_assertx(bp->refCount > 0, "cm_buf_t refCount == 0"); #endif ! if (--bp->refCount == 0) { ! if (!(bp->flags & CM_BUF_INLRU)) { osi_QAdd((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); /* watch for transition from empty to one element */ --- 92,142 ---- void buf_HoldLocked(cm_buf_t *bp) { osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); ! InterlockedIncrement(&bp->refCount); } /* hold a reference to an already held buffer */ void buf_Hold(cm_buf_t *bp) { ! lock_ObtainRead(&buf_globalLock); buf_HoldLocked(bp); ! lock_ReleaseRead(&buf_globalLock); } /* code to drop reference count while holding buf_globalLock */ ! void buf_ReleaseLocked(cm_buf_t *bp, afs_uint32 writeLocked) { + afs_int32 refCount; + + if (writeLocked) + lock_AssertWrite(&buf_globalLock); + else + lock_AssertRead(&buf_globalLock); + /* ensure that we're in the LRU queue if our ref count is 0 */ osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); + + refCount = InterlockedDecrement(&bp->refCount); #ifdef DEBUG ! if (refCount < 0) osi_panic("buf refcount 0",__FILE__,__LINE__);; #else ! osi_assertx(refCount >= 0, "cm_buf_t refCount == 0"); #endif ! if (refCount == 0) { ! /* ! * If we are read locked there could be a race condition ! * with buf_Find() so we must obtain a write lock and ! * 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)) { osi_QAdd((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); /* watch for transition from empty to one element */ *************** *** 123,137 **** cm_data.buf_freeListEndp = cm_data.buf_freeListp; bp->flags |= CM_BUF_INLRU; } } } /* release a buffer. Buffer must be referenced, but unlocked. */ void buf_Release(cm_buf_t *bp) { ! lock_ObtainWrite(&buf_globalLock); ! buf_ReleaseLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); } /* incremental sync daemon. Writes all dirty buffers every 5000 ms */ --- 144,185 ---- cm_data.buf_freeListEndp = cm_data.buf_freeListp; bp->flags |= CM_BUF_INLRU; } + + if (!writeLocked) { + lock_ReleaseWrite(&buf_globalLock); + lock_ObtainRead(&buf_globalLock); + } } } /* release a buffer. Buffer must be referenced, but unlocked. */ void buf_Release(cm_buf_t *bp) { ! afs_int32 refCount; ! ! /* ensure that we're in the LRU queue if our ref count is 0 */ ! osi_assertx(bp->magic == CM_BUF_MAGIC,"incorrect cm_buf_t magic"); ! ! refCount = InterlockedDecrement(&bp->refCount); ! #ifdef DEBUG ! if (refCount < 0) ! osi_panic("buf refcount 0",__FILE__,__LINE__);; ! #else ! osi_assertx(refCount >= 0, "cm_buf_t refCount == 0"); ! #endif ! if (refCount == 0) { ! lock_ObtainWrite(&buf_globalLock); ! if (bp->refCount == 0 && ! !(bp->flags & CM_BUF_INLRU)) { ! osi_QAdd((osi_queue_t **) &cm_data.buf_freeListp, &bp->q); ! ! /* watch for transition from empty to one element */ ! if (!cm_data.buf_freeListEndp) ! cm_data.buf_freeListEndp = cm_data.buf_freeListp; ! bp->flags |= CM_BUF_INLRU; ! } ! lock_ReleaseWrite(&buf_globalLock); ! } } /* incremental sync daemon. Writes all dirty buffers every 5000 ms */ *************** *** 184,190 **** bp->dirtyp = NULL; if (cm_data.buf_dirtyListp == NULL) cm_data.buf_dirtyListEndp = NULL; ! buf_ReleaseLocked(bp); lock_ReleaseWrite(&buf_globalLock); } else { /* advance the pointer so we don't loop forever */ --- 232,238 ---- 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 */ *************** *** 574,582 **** { cm_buf_t *bp; ! lock_ObtainWrite(&buf_globalLock); bp = buf_FindLocked(scp, offsetp); ! lock_ReleaseWrite(&buf_globalLock); return bp; } --- 622,630 ---- { cm_buf_t *bp; ! lock_ObtainRead(&buf_globalLock); bp = buf_FindLocked(scp, offsetp); ! lock_ReleaseRead(&buf_globalLock); return bp; } *************** *** 672,678 **** */ void buf_Recycle(cm_buf_t *bp) { ! int i; cm_buf_t **lbpp; cm_buf_t *tbp; cm_buf_t *prevBp, *nextBp; --- 720,726 ---- */ void buf_Recycle(cm_buf_t *bp) { ! afs_uint32 i; cm_buf_t **lbpp; cm_buf_t *tbp; cm_buf_t *prevBp, *nextBp; *************** *** 750,758 **** */ long buf_GetNewLocked(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) { ! cm_buf_t *bp; /* buffer we're dealing with */ cm_buf_t *nextBp; /* next buffer in file hash chain */ ! long i; /* temp */ cm_req_t req; cm_InitReq(&req); /* just in case */ --- 798,806 ---- */ long buf_GetNewLocked(struct cm_scache *scp, osi_hyper_t *offsetp, cm_buf_t **bufpp) { ! cm_buf_t *bp; /* buffer we're dealing with */ cm_buf_t *nextBp; /* next buffer in file hash chain */ ! afs_uint32 i; /* temp */ cm_req_t req; cm_InitReq(&req); /* just in case */ *************** *** 763,768 **** --- 811,817 ---- while(1) { retry: + lock_ObtainRead(&scp->bufCreateLock); lock_ObtainWrite(&buf_globalLock); /* check to see if we lost the race */ if (scp) { *************** *** 773,778 **** --- 822,828 ---- */ bp->refCount--; lock_ReleaseWrite(&buf_globalLock); + lock_ReleaseRead(&scp->bufCreateLock); return CM_BUF_EXISTS; } } *************** *** 781,786 **** --- 831,837 ---- if (!cm_data.buf_freeListEndp) { lock_ReleaseWrite(&buf_globalLock); + lock_ReleaseRead(&scp->bufCreateLock); osi_Log0(afsd_logp, "buf_GetNewLocked: Free Buffer List is empty - sleeping 200ms"); Sleep(200); goto retry; *************** *** 837,842 **** --- 888,894 ---- */ buf_HoldLocked(bp); lock_ReleaseWrite(&buf_globalLock); + lock_ReleaseRead(&scp->bufCreateLock); /* grab required lock and clean; this only * starts the I/O. By the time we're back, *************** *** 913,918 **** --- 965,971 ---- bp->refCount = 1; lock_ReleaseWrite(&buf_globalLock); + lock_ReleaseRead(&scp->bufCreateLock); *bufpp = bp; #ifdef TESTING *************** *** 921,926 **** --- 974,980 ---- return 0; } /* for all buffers in lru queue */ lock_ReleaseWrite(&buf_globalLock); + lock_ReleaseRead(&scp->bufCreateLock); osi_Log0(afsd_logp, "buf_GetNewLocked: Free Buffer List has no buffers with a zero refcount - sleeping 100ms"); Sleep(100); /* give some time for a buffer to be freed */ } /* while loop over everything */ *************** *** 1184,1190 **** osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic"); osi_assertx(bp->refCount > 0, "cm_buf_t refcount 0"); - lock_ObtainWrite(&buf_globalLock); if (bp->flags & CM_BUF_DIRTY) { osi_Log1(buf_logp, "buf_SetDirty 0x%p already dirty", bp); --- 1238,1243 ---- *************** *** 1225,1230 **** --- 1278,1284 ---- * elsewhere, never add to the dirty list if the buffer is * already there. */ + lock_ObtainWrite(&buf_globalLock); if (bp->dirtyp == NULL && cm_data.buf_dirtyListEndp != bp) { buf_HoldLocked(bp); if (!cm_data.buf_dirtyListp) { *************** *** 1235,1242 **** } bp->dirtyp = NULL; } } - lock_ReleaseWrite(&buf_globalLock); } /* clean all buffers, reset log pointers and invalidate all buffers. --- 1289,1296 ---- } bp->dirtyp = NULL; } + lock_ReleaseWrite(&buf_globalLock); } } /* clean all buffers, reset log pointers and invalidate all buffers. *************** *** 1265,1276 **** cm_buf_t *bp; cm_req_t req; ! lock_ObtainWrite(&buf_globalLock); for(i=0; ihashp) { if ((bp->flags & CM_BUF_DIRTY) == CM_BUF_DIRTY) { buf_HoldLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); /* now no locks are held; clean buffer and go on */ cm_InitReq(&req); --- 1319,1330 ---- cm_buf_t *bp; cm_req_t req; ! lock_ObtainRead(&buf_globalLock); for(i=0; ihashp) { if ((bp->flags & CM_BUF_DIRTY) == CM_BUF_DIRTY) { buf_HoldLocked(bp); ! lock_ReleaseRead(&buf_globalLock); /* now no locks are held; clean buffer and go on */ cm_InitReq(&req); *************** *** 1280,1293 **** buf_CleanWait(NULL, bp); /* relock and release buffer */ ! lock_ObtainWrite(&buf_globalLock); ! buf_ReleaseLocked(bp); } /* dirty */ } /* over one bucket */ } /* for loop over all hash buckets */ /* release locks */ ! lock_ReleaseWrite(&buf_globalLock); #ifdef TESTING buf_ValidateBufQueues(); --- 1334,1347 ---- buf_CleanWait(NULL, bp); /* relock and release buffer */ ! lock_ObtainRead(&buf_globalLock); ! buf_ReleaseLocked(bp, FALSE); } /* dirty */ } /* over one bucket */ } /* for loop over all hash buckets */ /* release locks */ ! lock_ReleaseRead(&buf_globalLock); #ifdef TESTING buf_ValidateBufQueues(); *************** *** 1361,1382 **** osi_hyper_t bufEnd; long code; long bufferPos; ! long i; /* assert that cm_bufCreateLock is held in write mode */ lock_AssertWrite(&scp->bufCreateLock); i = BUF_FILEHASH(&scp->fid); ! lock_ObtainWrite(&buf_globalLock); bufp = cm_data.buf_fileHashTablepp[i]; if (bufp == NULL) { ! lock_ReleaseWrite(&buf_globalLock); return 0; } buf_HoldLocked(bufp); ! lock_ReleaseWrite(&buf_globalLock); while (bufp) { lock_ObtainMutex(&bufp->mx); --- 1415,1436 ---- osi_hyper_t bufEnd; long code; long bufferPos; ! afs_uint32 i; /* assert that cm_bufCreateLock is held in write mode */ lock_AssertWrite(&scp->bufCreateLock); i = BUF_FILEHASH(&scp->fid); ! lock_ObtainRead(&buf_globalLock); bufp = cm_data.buf_fileHashTablepp[i]; if (bufp == NULL) { ! lock_ReleaseRead(&buf_globalLock); return 0; } buf_HoldLocked(bufp); ! lock_ReleaseRead(&buf_globalLock); while (bufp) { lock_ObtainMutex(&bufp->mx); *************** *** 1400,1406 **** | CM_SCACHESYNC_BUFLOCKED); - lock_ObtainWrite(&buf_globalLock); /* if we succeeded in our locking, and this applies to the right * file, and the truncate request overlaps the buffer either * totally or partially, then do something. --- 1454,1459 ---- *************** *** 1448,1461 **** if (!code) { nbufp = bufp->fileHashp; if (nbufp) ! buf_HoldLocked(nbufp); } else { /* This forces the loop to end and the error code * to be returned. */ nbufp = NULL; } ! buf_ReleaseLocked(bufp); ! lock_ReleaseWrite(&buf_globalLock); bufp = nbufp; } --- 1501,1513 ---- if (!code) { nbufp = bufp->fileHashp; if (nbufp) ! buf_Hold(nbufp); } else { /* This forces the loop to end and the error code * to be returned. */ nbufp = NULL; } ! buf_Release(bufp); bufp = nbufp; } *************** *** 1473,1488 **** cm_buf_t *bp; /* buffer we're hacking on */ cm_buf_t *nbp; int didRelease; ! long i; i = BUF_FILEHASH(&scp->fid); code = 0; ! lock_ObtainWrite(&buf_globalLock); bp = cm_data.buf_fileHashTablepp[i]; if (bp) buf_HoldLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); for (; bp; bp = nbp) { didRelease = 0; /* haven't released this buffer yet */ --- 1525,1540 ---- cm_buf_t *bp; /* buffer we're hacking on */ cm_buf_t *nbp; int didRelease; ! afs_uint32 i; i = BUF_FILEHASH(&scp->fid); code = 0; ! lock_ObtainRead(&buf_globalLock); bp = cm_data.buf_fileHashTablepp[i]; if (bp) buf_HoldLocked(bp); ! lock_ReleaseRead(&buf_globalLock); for (; bp; bp = nbp) { didRelease = 0; /* haven't released this buffer yet */ *************** *** 1514,1534 **** bp->dirtyCounter++; lock_ReleaseMutex(&bp->mx); - lock_ObtainWrite(&buf_globalLock); /* actually, we only know that buffer is clean if ref * count is 1, since we don't have buffer itself locked. */ if (!(bp->flags & CM_BUF_DIRTY)) { if (bp->refCount == 1) { /* bp is held above */ nbp = bp->fileHashp; if (nbp) buf_HoldLocked(nbp); ! buf_ReleaseLocked(bp); didRelease = 1; buf_Recycle(bp); } } - lock_ReleaseWrite(&buf_globalLock); if (code != CM_ERROR_BADFD) (*cm_buf_opsp->Unstabilizep)(scp, userp); --- 1566,1586 ---- 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. */ if (!(bp->flags & CM_BUF_DIRTY)) { + lock_ObtainWrite(&buf_globalLock); if (bp->refCount == 1) { /* bp is held above */ nbp = bp->fileHashp; if (nbp) buf_HoldLocked(nbp); ! buf_ReleaseLocked(bp, TRUE); didRelease = 1; buf_Recycle(bp); } + lock_ReleaseWrite(&buf_globalLock); } if (code != CM_ERROR_BADFD) (*cm_buf_opsp->Unstabilizep)(scp, userp); *************** *** 1536,1547 **** skip: if (!didRelease) { ! lock_ObtainWrite(&buf_globalLock); nbp = bp->fileHashp; if (nbp) buf_HoldLocked(nbp); ! buf_ReleaseLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); } } /* for loop over a bunch of buffers */ --- 1588,1599 ---- skip: if (!didRelease) { ! lock_ObtainRead(&buf_globalLock); nbp = bp->fileHashp; if (nbp) buf_HoldLocked(nbp); ! buf_ReleaseLocked(bp, FALSE); ! lock_ReleaseRead(&buf_globalLock); } } /* for loop over a bunch of buffers */ *************** *** 1557,1563 **** long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion) { cm_buf_t * bp; ! unsigned int i; int found = 0; lock_AssertMutex(&scp->mx); --- 1609,1615 ---- 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); *************** *** 1588,1602 **** long wasDirty = 0; cm_buf_t *bp; /* buffer we're hacking on */ cm_buf_t *nbp; /* next one */ ! long i; i = BUF_FILEHASH(&scp->fid); ! lock_ObtainWrite(&buf_globalLock); bp = cm_data.buf_fileHashTablepp[i]; if (bp) buf_HoldLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); for (; bp; bp = nbp) { /* clean buffer synchronously */ if (cm_FidCmp(&bp->fid, &scp->fid) == 0) { --- 1640,1654 ---- long wasDirty = 0; cm_buf_t *bp; /* buffer we're hacking on */ cm_buf_t *nbp; /* next one */ ! afs_uint32 i; i = BUF_FILEHASH(&scp->fid); ! lock_ObtainRead(&buf_globalLock); bp = cm_data.buf_fileHashTablepp[i]; if (bp) buf_HoldLocked(bp); ! lock_ReleaseRead(&buf_globalLock); for (; bp; bp = nbp) { /* clean buffer synchronously */ if (cm_FidCmp(&bp->fid, &scp->fid) == 0) { *************** *** 1619,1630 **** lock_ReleaseMutex(&bp->mx); } ! lock_ObtainWrite(&buf_globalLock); nbp = bp->fileHashp; if (nbp) buf_HoldLocked(nbp); ! buf_ReleaseLocked(bp); ! lock_ReleaseWrite(&buf_globalLock); } /* for loop over a bunch of buffers */ #ifdef TESTING --- 1671,1682 ---- lock_ReleaseMutex(&bp->mx); } ! lock_ObtainRead(&buf_globalLock); nbp = bp->fileHashp; if (nbp) buf_HoldLocked(nbp); ! buf_ReleaseLocked(bp, FALSE); ! lock_ReleaseRead(&buf_globalLock); } /* for loop over a bunch of buffers */ #ifdef TESTING Index: openafs/src/WINNT/afsd/cm_buf.h diff -c openafs/src/WINNT/afsd/cm_buf.h:1.12.4.8 openafs/src/WINNT/afsd/cm_buf.h:1.12.4.10 *** openafs/src/WINNT/afsd/cm_buf.h:1.12.4.8 Wed Nov 14 01:23:33 2007 --- openafs/src/WINNT/afsd/cm_buf.h Sat Feb 23 02:30:18 2008 *************** *** 32,48 **** extern int buf_cacheType; /* force it to be signed so that mod comes out positive or 0 */ ! #define BUF_HASH(fidp,offsetp) ((((fidp)->vnode+((fidp)->unique << 5) \ ! +(fidp)->volume+(fidp)->cell \ ! +((offsetp)->LowPart / cm_data.buf_blockSize)) \ ! & 0x7fffffff) \ % cm_data.buf_hashSize) /* another hash fn */ ! #define BUF_FILEHASH(fidp) ((((fidp)->vnode+((fidp)->unique << 5) \ ! +(fidp)->volume+(fidp)->cell) \ ! & 0x7fffffff) \ ! % 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)))) --- 32,43 ---- extern int buf_cacheType; /* force it to be signed so that mod comes out positive or 0 */ ! #define BUF_HASH(fidp,offsetp) ((((fidp)->hash \ ! +(offsetp)->LowPart) / cm_data.buf_blockSize) \ % cm_data.buf_hashSize) /* 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)))) *************** *** 67,78 **** */ struct cm_buf *dirtyp; /* next in the dirty list */ osi_mutex_t mx; /* mutex protecting structure except refcount */ ! unsigned long 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 */ ! long 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 */ --- 62,73 ---- */ 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 */ *************** *** 146,152 **** extern void buf_WaitIO(cm_scache_t *, cm_buf_t *); ! extern void buf_ReleaseLocked(cm_buf_t *); extern void buf_HoldLocked(cm_buf_t *); --- 141,147 ---- extern void buf_WaitIO(cm_scache_t *, cm_buf_t *); ! extern void buf_ReleaseLocked(cm_buf_t *, afs_uint32); extern void buf_HoldLocked(cm_buf_t *); Index: openafs/src/WINNT/afsd/cm_callback.c diff -c openafs/src/WINNT/afsd/cm_callback.c:1.41.4.33 openafs/src/WINNT/afsd/cm_callback.c:1.41.4.34 *** openafs/src/WINNT/afsd/cm_callback.c:1.41.4.33 Thu Feb 7 16:21:20 2008 --- openafs/src/WINNT/afsd/cm_callback.c Fri Feb 22 19:17:34 2008 *************** *** 143,152 **** cm_fid_t tfid; cm_scache_t *dscp; ! tfid.cell = scp->fid.cell; ! tfid.volume = scp->fid.volume; ! tfid.vnode = scp->parentVnode; ! tfid.unique = scp->parentUnique; dscp = cm_FindSCache(&tfid); #ifndef AFSIFS if ( dscp && --- 143,149 ---- cm_fid_t tfid; cm_scache_t *dscp; ! cm_SetFid(&tfid, scp->fid.cell, scp->fid.volume, scp->parentVnode, scp->parentUnique); dscp = cm_FindSCache(&tfid); #ifndef AFSIFS if ( dscp && Index: openafs/src/WINNT/afsd/cm_config.h diff -c openafs/src/WINNT/afsd/cm_config.h:1.8.6.4 openafs/src/WINNT/afsd/cm_config.h:1.8.6.6 *** openafs/src/WINNT/afsd/cm_config.h:1.8.6.4 Fri Feb 1 16:39:41 2008 --- openafs/src/WINNT/afsd/cm_config.h Mon Feb 25 10:34:31 2008 *************** *** 12,17 **** --- 12,18 ---- #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 Index: openafs/src/WINNT/afsd/cm_conn.c diff -c openafs/src/WINNT/afsd/cm_conn.c:1.49.2.34 openafs/src/WINNT/afsd/cm_conn.c:1.49.2.35 *** openafs/src/WINNT/afsd/cm_conn.c:1.49.2.34 Mon Feb 18 12:34:51 2008 --- openafs/src/WINNT/afsd/cm_conn.c Mon Feb 25 17:21:24 2008 *************** *** 31,37 **** #define LANMAN_WKS_PARAM_KEY "SYSTEM\\CurrentControlSet\\Services\\lanmanworkstation\\parameters" #define LANMAN_WKS_SESSION_TIMEOUT "SessTimeout" ! afs_int32 cryptall = 0; void cm_PutConn(cm_conn_t *connp) { --- 31,38 ---- #define LANMAN_WKS_PARAM_KEY "SYSTEM\\CurrentControlSet\\Services\\lanmanworkstation\\parameters" #define LANMAN_WKS_SESSION_TIMEOUT "SessTimeout" ! afs_uint32 cryptall = 0; ! afs_uint32 cm_anonvldb = 0; void cm_PutConn(cm_conn_t *connp) { *************** *** 909,914 **** --- 910,918 ---- *connpp = NULL; + if (cm_anonvldb && serverp->type == CM_SERVER_VLDB) + userp = cm_rootUserp; + lock_ObtainMutex(&userp->mx); lock_ObtainWrite(&cm_connLock); for (tcp = serverp->connsp; tcp; tcp=tcp->nextp) { Index: openafs/src/WINNT/afsd/cm_dcache.c diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.25 openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.27 *** openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.25 Sun Feb 17 00:28:04 2008 --- openafs/src/WINNT/afsd/cm_dcache.c Sun Feb 24 01:33:20 2008 *************** *** 505,511 **** return 0; if ((bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) == (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) return 1; ! if (bufp->dataVersion == scp->dataVersion) return 1; if (!isBufLocked) { code = lock_TryMutex(&bufp->mx); --- 505,511 ---- return 0; if ((bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) == (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) return 1; ! if (bufp->dataVersion <= scp->dataVersion && bufp->dataVersion >= scp->bufDataVersionLow) return 1; if (!isBufLocked) { code = lock_TryMutex(&bufp->mx); *************** *** 697,705 **** mxheld = 0; } - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &offset, &bp); - lock_ReleaseRead(&scp->bufCreateLock); if (code) break; --- 697,703 ---- *************** *** 737,743 **** /* a read was issued to offsetp, and we have to determine whether we should * do a prefetch of the next chunk. */ ! void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, cm_user_t *userp, cm_req_t *reqp) { long code; --- 735,741 ---- /* a read was issued to offsetp, and we have to determine whether we should * do a prefetch of the next chunk. */ ! void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, afs_uint32 count, cm_user_t *userp, cm_req_t *reqp) { long code; *************** *** 750,756 **** readBase.LowPart += (cm_chunkSize-1); readBase.LowPart &= (-cm_chunkSize); ! readLength = ConvertLongToLargeInteger(cm_chunkSize); lock_ObtainMutex(&scp->mx); if ((scp->flags & CM_SCACHEFLAG_PREFETCHING) --- 748,754 ---- readBase.LowPart += (cm_chunkSize-1); readBase.LowPart &= (-cm_chunkSize); ! readLength = ConvertLongToLargeInteger(count); lock_ObtainMutex(&scp->mx); if ((scp->flags & CM_SCACHEFLAG_PREFETCHING) *************** *** 1092,1100 **** if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) break; - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &pageBase, &tbp); - lock_ReleaseRead(&scp->bufCreateLock); if (code) { //lock_ReleaseMutex(&cm_bufGetMutex); lock_ObtainMutex(&scp->mx); --- 1090,1096 ---- *************** *** 1165,1171 **** lock_ObtainMutex(&scp->mx); /* don't bother fetching over data that is already current */ ! if (tbp->dataVersion == scp->dataVersion) { /* we don't need this buffer, since it is current */ lock_ReleaseMutex(&scp->mx); lock_ReleaseMutex(&tbp->mx); --- 1161,1167 ---- 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); *************** *** 1359,1365 **** osi_Log1(afsd_logp,"GetBuffer returns cm_data.rootSCachep=%x",cm_data.rootSCachep); #endif ! if (cm_HaveCallback(scp) && bufp->dataVersion == scp->dataVersion) { /* We already have this buffer don't do extra work */ return 0; } --- 1355,1361 ---- osi_Log1(afsd_logp,"GetBuffer returns cm_data.rootSCachep=%x",cm_data.rootSCachep); #endif ! if (cm_HaveCallback(scp) && bufp->dataVersion <= scp->dataVersion && bufp->dataVersion >= scp->bufDataVersionLow) { /* We already have this buffer don't do extra work */ return 0; } *************** *** 1380,1386 **** * We can lose a race condition and end up with biod.length zero, in * which case we just retry. */ ! if (bufp->dataVersion == scp->dataVersion || biod.length == 0) { if ((bufp->dataVersion == -1 || bufp->dataVersion < scp->dataVersion) && LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->serverLength)) { --- 1376,1382 ---- * We can lose a race condition and end up with biod.length zero, in * 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)) { Index: openafs/src/WINNT/afsd/cm_dcache.h diff -c openafs/src/WINNT/afsd/cm_dcache.h:1.4.4.4 openafs/src/WINNT/afsd/cm_dcache.h:1.4.4.5 *** openafs/src/WINNT/afsd/cm_dcache.h:1.4.4.4 Mon Sep 10 15:08:17 2007 --- openafs/src/WINNT/afsd/cm_dcache.h Fri Feb 22 19:17:34 2008 *************** *** 50,56 **** struct cm_user *userp); extern void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, ! cm_user_t *userp, cm_req_t *reqp); extern long cm_ValidateDCache(void); --- 50,57 ---- struct cm_user *userp); extern void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, ! afs_uint32 count, ! cm_user_t *userp, cm_req_t *reqp); extern long cm_ValidateDCache(void); Index: openafs/src/WINNT/afsd/cm_dir.c diff -c openafs/src/WINNT/afsd/cm_dir.c:1.4.4.10 openafs/src/WINNT/afsd/cm_dir.c:1.4.4.11 *** openafs/src/WINNT/afsd/cm_dir.c:1.4.4.10 Mon Feb 18 23:15:03 2008 --- openafs/src/WINNT/afsd/cm_dir.c Fri Feb 22 19:17:34 2008 *************** *** 1559,1568 **** goto _has_buffer; } - lock_ObtainRead(&op->scp->bufCreateLock); code = buf_Get(op->scp, &bufferOffset, &bufferp); - lock_ReleaseRead(&op->scp->bufCreateLock); - if (code) { osi_Log1(afsd_logp, " buf_Get returned code 0x%x", code); bufferp = NULL; --- 1559,1565 ---- Index: openafs/src/WINNT/afsd/cm_freelance.c diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.6 openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.7 *** openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.6 Fri Feb 1 16:39:41 2008 --- openafs/src/WINNT/afsd/cm_freelance.c Fri Feb 22 19:17:35 2008 *************** *** 357,366 **** int cm_FakeRootFid(cm_fid_t *fidp) { ! fidp->cell = AFS_FAKE_ROOT_CELL_ID; /* root cell */ ! fidp->volume = AFS_FAKE_ROOT_VOL_ID; /* root.afs ? */ ! fidp->vnode = 0x1; ! fidp->unique = 0x1; return 0; } --- 357,366 ---- int cm_FakeRootFid(cm_fid_t *fidp) { ! cm_SetFid(fidp, ! AFS_FAKE_ROOT_CELL_ID, /* root cell */ ! AFS_FAKE_ROOT_VOL_ID, /* root.afs ? */ ! 1, 1); return 0; } *************** *** 395,404 **** osi_Log0(afsd_logp,"Invalidating local mount point scp... "); ! aFid.cell = AFS_FAKE_ROOT_CELL_ID; ! aFid.volume=AFS_FAKE_ROOT_VOL_ID; ! aFid.unique=0x1; ! aFid.vnode=0x2; lock_ObtainWrite(&cm_scacheLock); lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */ --- 395,401 ---- osi_Log0(afsd_logp,"Invalidating local mount point scp... "); ! cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, 1, 2); lock_ObtainWrite(&cm_scacheLock); lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */ *************** *** 434,440 **** } } } ! aFid.vnode = aFid.vnode + 1; } lock_ReleaseWrite(&cm_scacheLock); osi_Log0(afsd_logp,"\tall old scp cleared!"); --- 431,437 ---- } } } ! cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, aFid.vnode + 1, 2); } lock_ReleaseWrite(&cm_scacheLock); osi_Log0(afsd_logp,"\tall old scp cleared!"); *************** *** 1106,1115 **** lock_ReleaseMutex(&cm_Freelance_Lock); /* cm_reInitLocalMountPoints(); */ ! if (fidp) { ! fidp->unique = 1; ! fidp->vnode = cm_noLocalMountPoints + 1; /* vnode value of last mt pt */ ! } cm_noteLocalMountPointChange(); return 0; } --- 1103,1110 ---- lock_ReleaseMutex(&cm_Freelance_Lock); /* cm_reInitLocalMountPoints(); */ ! if (fidp) ! cm_SetFid(fidp, fidp->cell, fidp->volume, cm_noLocalMountPoints + 1, 1); cm_noteLocalMountPointChange(); return 0; } *************** *** 1322,1331 **** lock_ReleaseMutex(&cm_Freelance_Lock); /* cm_reInitLocalMountPoints(); */ ! if (fidp) { ! fidp->unique = 1; ! fidp->vnode = cm_noLocalMountPoints + 1; /* vnode value of last mt pt */ ! } cm_noteLocalMountPointChange(); return 0; } --- 1317,1324 ---- lock_ReleaseMutex(&cm_Freelance_Lock); /* cm_reInitLocalMountPoints(); */ ! if (fidp) ! cm_SetFid(fidp, fidp->cell, fidp->volume, cm_noLocalMountPoints + 1, 1); cm_noteLocalMountPointChange(); return 0; } Index: openafs/src/WINNT/afsd/cm_ioctl.c diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.35 openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.36 *** openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.35 Tue Feb 5 15:49:30 2008 --- openafs/src/WINNT/afsd/cm_ioctl.c Fri Feb 22 19:17:35 2008 *************** *** 71,84 **** { long code; - lock_ObtainWrite(&scp->bufCreateLock); code = buf_CleanVnode(scp, userp, reqp); lock_ObtainMutex(&scp->mx); cm_DiscardSCache(scp); lock_ReleaseMutex(&scp->mx); - lock_ReleaseWrite(&scp->bufCreateLock); osi_Log2(afsd_logp,"cm_CleanFile scp 0x%x returns error: [%x]",scp, code); return code; } --- 71,82 ---- *************** *** 94,100 **** } #endif - lock_ObtainWrite(&scp->bufCreateLock); code = buf_FlushCleanPages(scp, userp, reqp); lock_ObtainMutex(&scp->mx); --- 92,97 ---- *************** *** 102,108 **** lock_ReleaseMutex(&scp->mx); - lock_ReleaseWrite(&scp->bufCreateLock); osi_Log2(afsd_logp,"cm_FlushFile scp 0x%x returns error: [%x]",scp, code); return code; } --- 99,104 ---- Index: openafs/src/WINNT/afsd/cm_memmap.h diff -c openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.6 openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.7 *** openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.6 Wed Nov 14 01:23:33 2007 --- openafs/src/WINNT/afsd/cm_memmap.h Fri Feb 22 19:17:35 2008 *************** *** 10,16 **** #ifndef CM_MEMMAP_H #define CM_MEMMAP_H 1 ! #define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | 'D'<<24) typedef struct cm_config_data { afs_uint32 size; --- 10,17 ---- #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 { afs_uint32 size; Index: openafs/src/WINNT/afsd/cm_scache.c diff -c openafs/src/WINNT/afsd/cm_scache.c:1.35.2.58 openafs/src/WINNT/afsd/cm_scache.c:1.35.2.62 *** openafs/src/WINNT/afsd/cm_scache.c:1.35.2.58 Sun Feb 17 00:28:04 2008 --- openafs/src/WINNT/afsd/cm_scache.c Sun Feb 24 10:35:34 2008 *************** *** 166,171 **** --- 166,172 ---- | CM_SCACHEFLAG_EACCESS); scp->serverModTime = 0; scp->dataVersion = 0; + scp->bufDataVersionLow = 0; scp->bulkStatProgress = hzero; scp->waitCount = 0; scp->waitQueueT = NULL; *************** *** 180,185 **** --- 181,187 ---- scp->fid.volume = 0; scp->fid.unique = 0; scp->fid.cell = 0; + scp->fid.hash = 0; /* remove from dnlc */ cm_dnlcPurgedp(scp); *************** *** 337,346 **** return scp; } /* like strcmp, only for fids */ ! int cm_FidCmp(cm_fid_t *ap, cm_fid_t *bp) { ! if (ap->vnode != bp->vnode) return 1; if (ap->volume != bp->volume) return 1; --- 339,359 ---- return scp; } + void cm_SetFid(cm_fid_t *fidp, afs_uint32 cell, afs_uint32 volume, afs_uint32 vnode, afs_uint32 unique) + { + fidp->cell = cell; + fidp->volume = volume; + fidp->vnode = vnode; + fidp->unique = unique; + fidp->hash = ((cell & 0xF) << 28) | ((volume & 0x3F) << 22) | ((vnode & 0x7FF) << 11) | (unique & 0x7FF); + } + /* like strcmp, only for fids */ ! __inline int cm_FidCmp(cm_fid_t *ap, cm_fid_t *bp) { ! if (ap->hash != bp->hash) ! return 1; ! if (ap->vnode != bp->vnode) return 1; if (ap->volume != bp->volume) return 1; *************** *** 756,761 **** --- 769,775 ---- scp->parentVnode=0x1; scp->group=0; scp->dataVersion=cm_data.fakeDirVersion; + scp->bufDataVersionLow=cm_data.fakeDirVersion; scp->lockDataVersion=-1; /* no lock yet */ #if not_too_dangerous lock_ReleaseMutex(&scp->mx); *************** *** 880,888 **** cm_scache_t * pscp = NULL; lock_ObtainWrite(&cm_scacheLock); ! parent_fid = scp->fid; ! parent_fid.vnode = scp->parentVnode; ! parent_fid.unique = scp->parentUnique; if (cm_FidCmp(&scp->fid, &parent_fid)) { i = CM_SCACHE_HASH(&parent_fid); --- 894,900 ---- cm_scache_t * pscp = NULL; lock_ObtainWrite(&cm_scacheLock); ! cm_SetFid(&parent_fid, scp->fid.cell, scp->fid.volume, scp->parentVnode, scp->parentUnique); if (cm_FidCmp(&scp->fid, &parent_fid)) { i = CM_SCACHE_HASH(&parent_fid); *************** *** 903,908 **** --- 915,924 ---- { cm_scache_waiter_t * w; + /* Do not use the queue for asynchronous store operations */ + if (flags == CM_SCACHESYNC_ASYNCSTORE) + return; + lock_ObtainWrite(&cm_scacheLock); if (cm_allFreeWaiters == NULL) { w = malloc(sizeof(*w)); *************** *** 929,934 **** --- 945,954 ---- cm_scache_waiter_t * w; int this_is_me; + /* Do not use the queue for asynchronous store operations */ + if (flags == CM_SCACHESYNC_ASYNCSTORE) + return 1; + osi_Log0(afsd_logp, "cm_SyncOpCheckContinue checking for continuation"); lock_ObtainRead(&cm_scacheLock); *************** *** 1526,1531 **** --- 1546,1552 ---- scp->unixModeBits = 0; scp->anyAccess = 0; scp->dataVersion = 0; + scp->bufDataVersionLow = 0; if (dscp) { scp->parentVnode = dscp->fid.vnode; *************** *** 1636,1644 **** cm_AddACLCache(scp, userp, statusp->CallerAccess); } ! if ((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion == 1) { ! buf_ForceDataVersion(scp, scp->dataVersion, dataVersion); ! } else if (scp->dataVersion != 0 && (!(flags & CM_MERGEFLAG_DIROP) && dataVersion != scp->dataVersion || (flags & CM_MERGEFLAG_DIROP) && dataVersion - scp->dataVersion > 1)) { /* --- 1657,1663 ---- cm_AddACLCache(scp, userp, statusp->CallerAccess); } ! if (scp->dataVersion != 0 && (!(flags & CM_MERGEFLAG_DIROP) && dataVersion != scp->dataVersion || (flags & CM_MERGEFLAG_DIROP) && dataVersion - scp->dataVersion > 1)) { /* *************** *** 1669,1675 **** */ if (cm_FidCmp(&scp->fid, &bp->fid) == 0 && lock_TryMutex(&bp->mx)) { ! if (bp->refCount == 0) { prevBp = bp->fileHashBackp; bp->fileHashBackp = bp->fileHashp = NULL; if (prevBp) --- 1688,1695 ---- */ if (cm_FidCmp(&scp->fid, &bp->fid) == 0 && lock_TryMutex(&bp->mx)) { ! if (bp->refCount == 0 && ! !(bp->flags & CM_BUF_READING | CM_BUF_WRITING | CM_BUF_DIRTY)) { prevBp = bp->fileHashBackp; bp->fileHashBackp = bp->fileHashp = NULL; if (prevBp) *************** *** 1696,1701 **** --- 1716,1732 ---- } lock_ReleaseWrite(&buf_globalLock); } + + /* We maintain a range of buffer dataVersion values which are considered + * valid. This avoids the need to update the dataVersion on each buffer + * object during an uncontested storeData operation. As a result this + * merge status no longer has performance characteristics derived from + * 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; } *************** *** 1739,1751 **** #else void cm_HoldSCacheNoLock(cm_scache_t *scp) #endif ! { osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_AssertWrite(&cm_scacheLock); ! scp->refCount++; #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_HoldSCacheNoLock scp 0x%p ref %d",scp, scp->refCount); ! afsi_log("%s:%d cm_HoldSCacheNoLock scp 0x%p, ref %d", file, line, scp, scp->refCount); #endif } --- 1770,1784 ---- #else void cm_HoldSCacheNoLock(cm_scache_t *scp) #endif ! { ! afs_int32 refCount; ! osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_AssertAny(&cm_scacheLock); ! refCount = InterlockedIncrement(&scp->refCount); #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_HoldSCacheNoLock scp 0x%p ref %d",scp, refCount); ! afsi_log("%s:%d cm_HoldSCacheNoLock scp 0x%p, ref %d", file, line, scp, refCount); #endif } *************** *** 1755,1768 **** void cm_HoldSCache(cm_scache_t *scp) #endif { osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_ObtainWrite(&cm_scacheLock); ! scp->refCount++; #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_HoldSCache scp 0x%p ref %d",scp, scp->refCount); ! afsi_log("%s:%d cm_HoldSCache scp 0x%p ref %d", file, line, scp, scp->refCount); #endif ! lock_ReleaseWrite(&cm_scacheLock); } #ifdef DEBUG_REFCOUNT --- 1788,1803 ---- void cm_HoldSCache(cm_scache_t *scp) #endif { + afs_int32 refCount; + osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_ObtainRead(&cm_scacheLock); ! refCount = InterlockedIncrement(&scp->refCount); #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_HoldSCache scp 0x%p ref %d",scp, refCount); ! afsi_log("%s:%d cm_HoldSCache scp 0x%p ref %d", file, line, scp, refCount); #endif ! lock_ReleaseRead(&cm_scacheLock); } #ifdef DEBUG_REFCOUNT *************** *** 1771,1784 **** void cm_ReleaseSCacheNoLock(cm_scache_t *scp) #endif { osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_AssertWrite(&cm_scacheLock); ! if (scp->refCount == 0) osi_Log1(afsd_logp,"cm_ReleaseSCacheNoLock about to panic scp 0x%x",scp); ! osi_assertx(scp->refCount-- >= 0, "cm_scache_t refCount 0"); #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_ReleaseSCacheNoLock scp 0x%p ref %d",scp,scp->refCount); ! afsi_log("%s:%d cm_ReleaseSCacheNoLock scp 0x%p ref %d", file, line, scp, scp->refCount); #endif } --- 1806,1823 ---- void cm_ReleaseSCacheNoLock(cm_scache_t *scp) #endif { + afs_int32 refCount; osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_AssertAny(&cm_scacheLock); ! refCount = InterlockedDecrement(&scp->refCount); ! #ifdef DEBUG_REFCOUNT ! if (refCount < 0) osi_Log1(afsd_logp,"cm_ReleaseSCacheNoLock about to panic scp 0x%x",scp); ! #endif ! osi_assertx(refCount >= 0, "cm_scache_t refCount 0"); #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_ReleaseSCacheNoLock scp 0x%p ref %d",scp, refCount); ! afsi_log("%s:%d cm_ReleaseSCacheNoLock scp 0x%p ref %d", file, line, scp, refCount); #endif } *************** *** 1787,1804 **** #else void cm_ReleaseSCache(cm_scache_t *scp) #endif ! { osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_ObtainWrite(&cm_scacheLock); ! if (scp->refCount == 0) osi_Log1(afsd_logp,"cm_ReleaseSCache about to panic scp 0x%x",scp); ! osi_assertx(scp->refCount != 0, "cm_scache_t refCount 0"); ! scp->refCount--; #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_ReleaseSCache scp 0x%p ref %d",scp,scp->refCount); ! afsi_log("%s:%d cm_ReleaseSCache scp 0x%p ref %d", file, line, scp, scp->refCount); #endif ! lock_ReleaseWrite(&cm_scacheLock); } /* just look for the scp entry to get filetype */ --- 1826,1847 ---- #else void cm_ReleaseSCache(cm_scache_t *scp) #endif ! { ! afs_int32 refCount; ! osi_assertx(scp != NULL, "null cm_scache_t"); ! lock_ObtainRead(&cm_scacheLock); ! refCount = InterlockedDecrement(&scp->refCount); ! #ifdef DEBUG_REFCOUNT ! if (refCount < 0) osi_Log1(afsd_logp,"cm_ReleaseSCache about to panic scp 0x%x",scp); ! #endif ! osi_assertx(refCount >= 0, "cm_scache_t refCount 0"); #ifdef DEBUG_REFCOUNT ! osi_Log2(afsd_logp,"cm_ReleaseSCache scp 0x%p ref %d",scp, refCount); ! afsi_log("%s:%d cm_ReleaseSCache scp 0x%p ref %d", file, line, scp, refCount); #endif ! lock_ReleaseRead(&cm_scacheLock); } /* just look for the scp entry to get filetype */ Index: openafs/src/WINNT/afsd/cm_scache.h diff -c openafs/src/WINNT/afsd/cm_scache.h:1.21.2.19 openafs/src/WINNT/afsd/cm_scache.h:1.21.2.22 *** openafs/src/WINNT/afsd/cm_scache.h:1.21.2.19 Fri Dec 28 10:47:43 2007 --- openafs/src/WINNT/afsd/cm_scache.h Sun Feb 24 01:33:21 2008 *************** *** 17,28 **** #define MOUNTPOINTLEN 1024 /* max path length for symlink; same as AFSPATHMAX */ typedef struct cm_fid { ! unsigned long cell; ! unsigned long volume; ! unsigned long vnode; ! unsigned long unique; } cm_fid_t; /* Key used for byte range locking. Each unique key identifies a unique client per cm_scache_t for the purpose of locking. */ typedef afs_uint64 cm_key_t; --- 17,30 ---- #define MOUNTPOINTLEN 1024 /* max path length for symlink; same as AFSPATHMAX */ typedef struct cm_fid { ! afs_uint32 cell; ! afs_uint32 volume; ! afs_uint32 vnode; ! afs_uint32 unique; ! afs_uint32 hash; } cm_fid_t; + /* Key used for byte range locking. Each unique key identifies a unique client per cm_scache_t for the purpose of locking. */ typedef afs_uint64 cm_key_t; *************** *** 99,105 **** * write-locked to prevent buffers from * being created during a truncate op, etc. */ ! afs_uint32 refCount; /* reference count; cm_scacheLock */ osi_queueData_t *bufReadsp; /* queue of buffers being read */ osi_queueData_t *bufWritesp; /* queue of buffers being written */ --- 101,107 ---- * write-locked to prevent buffers from * being created during a truncate op, etc. */ ! afs_int32 refCount; /* reference count; cm_scacheLock */ osi_queueData_t *bufReadsp; /* queue of buffers being read */ osi_queueData_t *bufWritesp; /* queue of buffers being written */ *************** *** 121,126 **** --- 123,129 ---- afs_uint32 unixModeBits; /* unix protection mode bits */ afs_uint32 linkCount; /* link count */ afs_uint64 dataVersion; /* data version */ + afs_uint64 bufDataVersionLow; /* range of valid cm_buf_t dataVersions */ afs_uint32 owner; /* file owner */ afs_uint32 group; /* file owning group */ cm_user_t *creator; /* user, if new file */ *************** *** 345,351 **** extern cm_scache_t *cm_GetNewSCache(void); ! extern int cm_FidCmp(cm_fid_t *, cm_fid_t *); extern long cm_SyncOp(cm_scache_t *, struct cm_buf *, struct cm_user *, struct cm_req *, afs_uint32, afs_uint32); --- 348,356 ---- extern cm_scache_t *cm_GetNewSCache(void); ! extern __inline int cm_FidCmp(cm_fid_t *, cm_fid_t *); ! ! extern void cm_SetFid(cm_fid_t *, afs_uint32 cell, afs_uint32 volume, afs_uint32 vnode, afs_uint32 unique); extern long cm_SyncOp(cm_scache_t *, struct cm_buf *, struct cm_user *, struct cm_req *, afs_uint32, afs_uint32); Index: openafs/src/WINNT/afsd/cm_server.c diff -c openafs/src/WINNT/afsd/cm_server.c:1.25.2.24 openafs/src/WINNT/afsd/cm_server.c:1.25.2.25 *** openafs/src/WINNT/afsd/cm_server.c:1.25.2.24 Thu Feb 7 15:29:19 2008 --- openafs/src/WINNT/afsd/cm_server.c Fri Feb 22 19:17:35 2008 *************** *** 343,356 **** } lock_ReleaseWrite(&cm_serverLock); ! /* Perform the multi call */ ! start = time(NULL); ! multi_Rx(rxconns,nconns) ! { ! multi_RXAFS_GetCapabilities(&caps[multi_i]); ! results[multi_i]=multi_error; ! } multi_End; ! /* Process results of servers that support RXAFS_GetCapabilities */ for (i=0; inextp) { for (usersp=vcp->usersp; usersp; usersp=usersp->nextp) { if (usersp->unp) { --- 162,168 ---- /* * For every vcp, get the user and check his tokens */ ! lock_ObtainRead(&smb_rctLock); for (vcp=smb_allVCsp; vcp; vcp=vcp->nextp) { for (usersp=vcp->usersp; usersp; usersp=usersp->nextp) { if (usersp->unp) { *************** *** 194,200 **** } } } ! lock_ReleaseWrite(&smb_rctLock); } #ifdef USE_ROOT_TOKENS --- 194,200 ---- } } } ! lock_ReleaseRead(&smb_rctLock); } #ifdef USE_ROOT_TOKENS Index: openafs/src/WINNT/afsd/cm_vnodeops.c diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.60 openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.64 *** openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.60 Sun Feb 17 00:59:30 2008 --- openafs/src/WINNT/afsd/cm_vnodeops.c Sat Feb 23 16:37:08 2008 *************** *** 402,408 **** (*ldpp) = (cm_lock_data_t *)malloc(sizeof(cm_lock_data_t)); if (!*ldpp) { code = ENOMEM; ! goto _done; } (*ldpp)->key = key; --- 402,408 ---- (*ldpp) = (cm_lock_data_t *)malloc(sizeof(cm_lock_data_t)); if (!*ldpp) { code = ENOMEM; ! goto _syncopdone; } (*ldpp)->key = key; *************** *** 436,452 **** --- 436,455 ---- goto _done; } + _syncopdone: 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; } extern long cm_CheckNTOpenDone(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, cm_lock_data_t ** ldpp) { + 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, *************** *** 496,504 **** return code; thyper.HighPart = 0; thyper.LowPart = 0; - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); if (code) return code; --- 499,505 ---- *************** *** 732,740 **** bufferp = NULL; } - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); if (code) { /* if buf_Get() fails we do not have a buffer object to lock */ bufferp = NULL; --- 733,739 ---- *************** *** 977,986 **** /* otherwise, we have to read it in */ lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); thyper.LowPart = thyper.HighPart = 0; code = buf_Get(scp, &thyper, &bufp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&scp->mx); if (code) --- 976,983 ---- *************** *** 1123,1128 **** --- 1120,1127 ---- 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 *************** *** 1133,1139 **** volp->dotdotFid = dscp->fid; lock_ReleaseMutex(&volp->mx); ! scp->mountRootFid.cell = cellp->cellID; /* if the mt pt originates in a .backup volume (not a .readonly) * and FollowBackupPath is active, and if there is a .backup --- 1132,1138 ---- volp->dotdotFid = dscp->fid; lock_ReleaseMutex(&volp->mx); ! cell = cellp->cellID; /* if the mt pt originates in a .backup volume (not a .readonly) * and FollowBackupPath is active, and if there is a .backup *************** *** 1158,1172 **** targetType = ROVOL; } if (targetType == ROVOL) ! scp->mountRootFid.volume = volp->ro.ID; else if (targetType == BACKVOL) ! scp->mountRootFid.volume = volp->bk.ID; else ! scp->mountRootFid.volume = volp->rw.ID; /* the rest of the fid is a magic number */ ! scp->mountRootFid.vnode = 1; ! scp->mountRootFid.unique = 1; scp->mountRootGen = cm_data.mountRootGen; tfid = scp->mountRootFid; --- 1157,1170 ---- 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; *************** *** 1431,1436 **** --- 1429,1435 ---- cm_cell_t * cellp = NULL; cm_volume_t * volp = NULL; cm_fid_t fid; + afs_uint32 volume; int volType; int mountType = RWVOL; *************** *** 1497,1514 **** if (code != 0) goto _exit_cleanup; - fid.cell = cellp->cellID; - if (volType == BACKVOL) ! fid.volume = volp->bk.ID; else if (volType == ROVOL || (volType == RWVOL && mountType == ROVOL && volp->ro.ID != 0)) ! fid.volume = volp->ro.ID; else ! fid.volume = volp->rw.ID; ! fid.vnode = 1; ! fid.unique = 1; code = cm_GetSCache(&fid, outpScpp, userp, reqp); --- 1496,1510 ---- if (code != 0) goto _exit_cleanup; if (volType == BACKVOL) ! volume = volp->bk.ID; else if (volType == ROVOL || (volType == RWVOL && mountType == ROVOL && volp->ro.ID != 0)) ! volume = volp->ro.ID; else ! volume = volp->rw.ID; ! cm_SetFid(&fid, cellp->cellID, volume, 1, 1); code = cm_GetSCache(&fid, outpScpp, userp, reqp); *************** *** 1700,1708 **** /* read the link data */ lock_ReleaseMutex(&linkScp->mx); thyper.LowPart = thyper.HighPart = 0; - lock_ObtainRead(&linkScp->bufCreateLock); code = buf_Get(linkScp, &thyper, &bufp); - lock_ReleaseRead(&linkScp->bufCreateLock); lock_ObtainMutex(&linkScp->mx); if (code) return code; --- 1696,1702 ---- *************** *** 2261,2270 **** if (strcmp(dep->name, ".") == 0 || strcmp(dep->name, "..") == 0) return 0; ! tfid.cell = scp->fid.cell; ! tfid.volume = scp->fid.volume; ! tfid.vnode = ntohl(dep->fid.vnode); ! tfid.unique = ntohl(dep->fid.unique); tscp = cm_FindSCache(&tfid); if (tscp) { if (lock_TryMutex(&tscp->mx)) { --- 2255,2261 ---- if (strcmp(dep->name, ".") == 0 || strcmp(dep->name, "..") == 0) return 0; ! 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)) { *************** *** 2406,2415 **** /* otherwise, we should do the merges */ for (i = 0; ifid.cell; ! tfid.volume = bb.fids[j].Volume; ! tfid.vnode = bb.fids[j].Vnode; ! tfid.unique = bb.fids[j].Unique; code = cm_GetSCache(&tfid, &scp, userp, reqp); if (code != 0) continue; --- 2397,2403 ---- /* otherwise, we should do the merges */ for (i = 0; ifid.cell, bb.fids[j].Volume, bb.fids[j].Vnode, bb.fids[j].Unique); code = cm_GetSCache(&tfid, &scp, userp, reqp); if (code != 0) continue; *************** *** 2767,2776 **** * info. */ if (code == 0) { ! newFid.cell = dscp->fid.cell; ! newFid.volume = dscp->fid.volume; ! newFid.vnode = newAFSFid.Vnode; ! newFid.unique = newAFSFid.Unique; code = cm_GetSCache(&newFid, &scp, userp, reqp); if (code == 0) { lock_ObtainMutex(&scp->mx); --- 2755,2761 ---- * info. */ if (code == 0) { ! 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); *************** *** 2806,2814 **** { long code; - lock_ObtainWrite(&scp->bufCreateLock); code = buf_CleanVnode(scp, userp, reqp); - lock_ReleaseWrite(&scp->bufCreateLock); if (code == 0) { lock_ObtainMutex(&scp->mx); --- 2791,2797 ---- *************** *** 2927,2936 **** * info. */ if (code == 0) { ! newFid.cell = dscp->fid.cell; ! newFid.volume = dscp->fid.volume; ! newFid.vnode = newAFSFid.Vnode; ! newFid.unique = newAFSFid.Unique; code = cm_GetSCache(&newFid, &scp, userp, reqp); if (code == 0) { lock_ObtainMutex(&scp->mx); --- 2910,2916 ---- * info. */ if (code == 0) { ! 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); *************** *** 3115,3124 **** if (code == 0) { if (cm_CheckDirOpForSingleChange(&dirop)) { ! newFid.cell = dscp->fid.cell; ! newFid.volume = dscp->fid.volume; ! newFid.vnode = newAFSFid.Vnode; ! newFid.unique = newAFSFid.Unique; cm_DirCreateEntry(&dirop, namep, &newFid); #ifdef USE_BPLUS --- 3095,3101 ---- if (code == 0) { if (cm_CheckDirOpForSingleChange(&dirop)) { ! cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique); cm_DirCreateEntry(&dirop, namep, &newFid); #ifdef USE_BPLUS *************** *** 3134,3143 **** * info. */ if (code == 0) { ! newFid.cell = dscp->fid.cell; ! newFid.volume = dscp->fid.volume; ! newFid.vnode = newAFSFid.Vnode; ! newFid.unique = newAFSFid.Unique; code = cm_GetSCache(&newFid, &scp, userp, reqp); if (code == 0) { lock_ObtainMutex(&scp->mx); --- 3111,3117 ---- * info. */ if (code == 0) { ! 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); Index: openafs/src/WINNT/afsd/cm_volume.c diff -c openafs/src/WINNT/afsd/cm_volume.c:1.14.4.29 openafs/src/WINNT/afsd/cm_volume.c:1.14.4.31 *** openafs/src/WINNT/afsd/cm_volume.c:1.14.4.29 Thu Feb 14 22:31:36 2008 --- openafs/src/WINNT/afsd/cm_volume.c Mon Feb 25 14:40:13 2008 *************** *** 256,262 **** snprintf(name, VL_MAXNAMELEN, "%s.readonly", volp->namep); /* now we have volume structure locked and held; make RPC to fill it */ ! osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s", volp->cellp->name, name); do { code = cm_ConnByMServers(cellp->vlServersp, userp, reqp, &connp); if (code) --- 256,263 ---- snprintf(name, VL_MAXNAMELEN, "%s.readonly", volp->namep); /* now we have volume structure locked and held; make RPC to fill it */ ! osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s", volp->cellp->name, ! osi_LogSaveString(afsd_logp,name)); do { code = cm_ConnByMServers(cellp->vlServersp, userp, reqp, &connp); if (code) *************** *** 278,287 **** code = cm_MapVLRPCError(code, reqp); if ( code ) osi_Log3(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s FAILURE, code 0x%x", ! volp->cellp->name, name, code); else osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s SUCCESS", ! volp->cellp->name, name); } if (code == 0) { --- 279,288 ---- code = cm_MapVLRPCError(code, reqp); if ( code ) osi_Log3(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s FAILURE, code 0x%x", ! volp->cellp->name, osi_LogSaveString(afsd_logp,name), code); else osi_Log2(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s SUCCESS", ! volp->cellp->name, osi_LogSaveString(afsd_logp,name)); } if (code == 0) { *************** *** 755,760 **** --- 756,762 ---- 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)); *************** *** 1569,1578 **** cm_fid_t fid; cm_scache_t * scp; ! fid.cell = volp->cellp->cellID; ! fid.volume = volp->ro.ID; ! fid.vnode = 1; ! fid.unique = 1; cm_InitReq(&req); --- 1571,1577 ---- cm_fid_t fid; cm_scache_t * scp; ! cm_SetFid(&fid, volp->cellp->cellID, volp->ro.ID, 1, 1); cm_InitReq(&req); Index: openafs/src/WINNT/afsd/rawops.c diff -c openafs/src/WINNT/afsd/rawops.c:1.2.4.3 openafs/src/WINNT/afsd/rawops.c:1.2.4.4 *** openafs/src/WINNT/afsd/rawops.c:1.2.4.3 Thu Aug 9 01:33:56 2007 --- openafs/src/WINNT/afsd/rawops.c Fri Feb 22 19:17:35 2008 *************** *** 84,92 **** } lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&scp->mx); if (code) goto done; --- 84,90 ---- *************** *** 142,148 **** buf_Release(bufferp); if (code == 0 && sequential) ! cm_ConsiderPrefetch(scp, &lastByte, userp, &req); return code; } --- 140,146 ---- buf_Release(bufferp); if (code == 0 && sequential) ! cm_ConsiderPrefetch(scp, &lastByte, *readp, userp, &req); return code; } *************** *** 161,167 **** osi_hyper_t bufferOffset; afs_uint32 bufIndex; /* index in buffer where our data is */ int doWriteBack; ! osi_hyper_t writeBackOffset; /* offset of region to write back when * I/O is done */ DWORD filter = 0; cm_req_t req; --- 159,165 ---- osi_hyper_t bufferOffset; afs_uint32 bufIndex; /* index in buffer where our data is */ int doWriteBack; ! osi_hyper_t writeBackOffset;/* offset of region to write back when * I/O is done */ DWORD filter = 0; cm_req_t req; *************** *** 247,255 **** } lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&bufferp->mx); lock_ObtainMutex(&scp->mx); --- 245,251 ---- Index: openafs/src/WINNT/afsd/smb.c diff -c openafs/src/WINNT/afsd/smb.c:1.118.2.60 openafs/src/WINNT/afsd/smb.c:1.118.2.63 *** openafs/src/WINNT/afsd/smb.c:1.118.2.60 Mon Feb 18 12:34:51 2008 --- openafs/src/WINNT/afsd/smb.c Mon Feb 25 00:36:46 2008 *************** *** 69,74 **** --- 69,76 ---- unsigned char smb_LANadapter = LANA_INVALID; unsigned char smb_sharename[NCBNAMSZ+1] = {0}; int smb_LanAdapterChangeDetected = 0; + afs_uint32 smb_AsyncStore = 1; + afs_uint32 smb_AsyncStoreSize = CM_CONFIGDEFAULT_ASYNCSTORESIZE; BOOL isGateway = FALSE; *************** *** 903,909 **** { smb_vc_t *vcp; ! lock_ObtainWrite(&smb_globalLock); /* for numVCs */ lock_ObtainWrite(&smb_rctLock); for (vcp = smb_allVCsp; vcp; vcp=vcp->nextp) { if (vcp->magic != SMB_VC_MAGIC) --- 905,911 ---- { smb_vc_t *vcp; ! lock_ObtainWrite(&smb_globalLock); /* for numVCs */ lock_ObtainWrite(&smb_rctLock); for (vcp = smb_allVCsp; vcp; vcp=vcp->nextp) { if (vcp->magic != SMB_VC_MAGIC) *************** *** 979,985 **** } } lock_ReleaseWrite(&smb_rctLock); ! lock_ReleaseWrite(&smb_globalLock); return vcp; } --- 981,987 ---- } } lock_ReleaseWrite(&smb_rctLock); ! lock_ReleaseWrite(&smb_globalLock); return vcp; } *************** *** 1004,1038 **** vcp->refCount--; if (vcp->refCount == 0) { ! if (vcp->flags & SMB_VCFLAG_ALREADYDEAD) { ! /* remove VCP from smb_deadVCsp */ ! for (vcpp = &smb_deadVCsp; *vcpp; vcpp = &((*vcpp)->nextp)) { ! if (*vcpp == vcp) { ! *vcpp = vcp->nextp; ! break; ! } ! } ! lock_FinalizeMutex(&vcp->mx); ! memset(vcp,0,sizeof(smb_vc_t)); ! free(vcp); ! } else { ! for (avcp = smb_allVCsp; avcp; avcp = avcp->nextp) { ! if (avcp == vcp) ! break; ! } ! osi_Log3(smb_logp,"VCP not dead and %sin smb_allVCsp vcp %x ref %d", ! avcp?"not ":"",vcp, vcp->refCount); #ifdef DEBUG ! GenerateMiniDump(NULL); #endif ! /* This is a wrong. However, I suspect that there is an undercount ! * and I don't want to release 1.4.1 in a state that will allow ! * smb_vc_t objects to be deallocated while still in the ! * smb_allVCsp list. The list is supposed to keep a reference ! * to the smb_vc_t. Put it back. ! */ ! vcp->refCount++; ! } } } --- 1006,1040 ---- vcp->refCount--; if (vcp->refCount == 0) { ! if (vcp->flags & SMB_VCFLAG_ALREADYDEAD) { ! /* remove VCP from smb_deadVCsp */ ! for (vcpp = &smb_deadVCsp; *vcpp; vcpp = &((*vcpp)->nextp)) { ! if (*vcpp == vcp) { ! *vcpp = vcp->nextp; ! break; ! } ! } ! lock_FinalizeMutex(&vcp->mx); ! memset(vcp,0,sizeof(smb_vc_t)); ! free(vcp); ! } else { ! for (avcp = smb_allVCsp; avcp; avcp = avcp->nextp) { ! if (avcp == vcp) ! break; ! } ! osi_Log3(smb_logp,"VCP not dead and %sin smb_allVCsp vcp %x ref %d", ! avcp?"not ":"",vcp, vcp->refCount); #ifdef DEBUG ! GenerateMiniDump(NULL); #endif ! /* This is a wrong. However, I suspect that there is an undercount ! * and I don't want to release 1.4.1 in a state that will allow ! * smb_vc_t objects to be deallocated while still in the ! * smb_allVCsp list. The list is supposed to keep a reference ! * to the smb_vc_t. Put it back. ! */ ! vcp->refCount++; ! } } } *************** *** 1131,1141 **** osi_Log2(smb_logp, " Cleanup TID %d (tidp=0x%x)", tid, tidpIter); smb_HoldTIDNoLock(tidpIter); ! lock_ReleaseWrite(&smb_rctLock); ! ! smb_ReleaseTID(tidpIter); ! ! lock_ObtainWrite(&smb_rctLock); tidpNext = vcp->tidsp; } --- 1133,1139 ---- osi_Log2(smb_logp, " Cleanup TID %d (tidp=0x%x)", tid, tidpIter); smb_HoldTIDNoLock(tidpIter); ! smb_ReleaseTID(tidpIter, TRUE); tidpNext = vcp->tidsp; } *************** *** 1172,1180 **** for (tidp = vcp->tidsp; tidp; tidp = tidp->nextp) { if (tidp->refCount == 0 && tidp->delete) { tidp->refCount++; ! lock_ReleaseWrite(&smb_rctLock); ! smb_ReleaseTID(tidp); ! lock_ObtainWrite(&smb_rctLock); goto retry; } --- 1170,1176 ---- for (tidp = vcp->tidsp; tidp; tidp = tidp->nextp) { if (tidp->refCount == 0 && tidp->delete) { tidp->refCount++; ! smb_ReleaseTID(tidp, TRUE); goto retry; } *************** *** 1203,1216 **** tidp->refCount++; } ! void smb_ReleaseTID(smb_tid_t *tidp) { smb_tid_t *tp; smb_tid_t **ltpp; cm_user_t *userp; userp = NULL; ! lock_ObtainWrite(&smb_rctLock); osi_assertx(tidp->refCount-- > 0, "smb_tid_t refCount 0"); if (tidp->refCount == 0 && (tidp->delete)) { ltpp = &tidp->vcp->tidsp; --- 1199,1213 ---- tidp->refCount++; } ! void smb_ReleaseTID(smb_tid_t *tidp, afs_uint32 locked) { smb_tid_t *tp; smb_tid_t **ltpp; cm_user_t *userp; userp = NULL; ! if (!locked) ! lock_ObtainWrite(&smb_rctLock); osi_assertx(tidp->refCount-- > 0, "smb_tid_t refCount 0"); if (tidp->refCount == 0 && (tidp->delete)) { ltpp = &tidp->vcp->tidsp; *************** *** 1226,1232 **** smb_ReleaseVCNoLock(tidp->vcp); tidp->vcp = NULL; } ! lock_ReleaseWrite(&smb_rctLock); if (userp) cm_ReleaseUser(userp); } --- 1223,1230 ---- smb_ReleaseVCNoLock(tidp->vcp); tidp->vcp = NULL; } ! if (!locked) ! lock_ReleaseWrite(&smb_rctLock); if (userp) cm_ReleaseUser(userp); } *************** *** 1338,1347 **** free(unp); } lock_ReleaseWrite(&smb_rctLock); ! ! if (userp) { cm_ReleaseUser(userp); - } } void smb_HoldUIDNoLock(smb_user_t *uidp) --- 1336,1343 ---- free(unp); } lock_ReleaseWrite(&smb_rctLock); ! if (userp) cm_ReleaseUser(userp); } void smb_HoldUIDNoLock(smb_user_t *uidp) *************** *** 1437,1443 **** /* tidp->pathname would be NULL, but that's fine */ } *treepath = tidp->pathname; ! smb_ReleaseTID(tidp); } return code; } --- 1433,1439 ---- /* tidp->pathname would be NULL, but that's fine */ } *treepath = tidp->pathname; ! smb_ReleaseTID(tidp, FALSE); } return code; } *************** *** 3214,3219 **** --- 3210,3216 ---- lock_ReleaseMutex(&smb_RawBufLock); } + lock_ReleaseMutex(&fidp->mx); smb_ReleaseFID(fidp); return rc; } *************** *** 3627,3637 **** free(unp->name); free(unp->machine); free(unp); ! if (userp) { ! lock_ReleaseWrite(&smb_rctLock); cm_ReleaseUser(userp); - lock_ObtainWrite(&smb_rctLock); - } } else { unpp = &(*unpp)->nextp; } --- 3624,3631 ---- free(unp->name); free(unp->machine); free(unp); ! if (userp) cm_ReleaseUser(userp); } else { unpp = &(*unpp)->nextp; } *************** *** 3832,3845 **** if (uidp) smb_ReleaseUID(uidp); if (!shareFound) { ! smb_ReleaseTID(tidp); return CM_ERROR_BADSHARENAME; } lock_ObtainMutex(&tidp->mx); tidp->userp = userp; tidp->pathname = sharePath; lock_ReleaseMutex(&tidp->mx); ! smb_ReleaseTID(tidp); smb_SetSMBParm(rsp, 0, SMB_PACKETSIZE); smb_SetSMBParm(rsp, 1, newTid); --- 3826,3839 ---- if (uidp) smb_ReleaseUID(uidp); if (!shareFound) { ! smb_ReleaseTID(tidp, FALSE); return CM_ERROR_BADSHARENAME; } lock_ObtainMutex(&tidp->mx); tidp->userp = userp; tidp->pathname = sharePath; lock_ReleaseMutex(&tidp->mx); ! smb_ReleaseTID(tidp, FALSE); smb_SetSMBParm(rsp, 0, SMB_PACKETSIZE); smb_SetSMBParm(rsp, 1, newTid); *************** *** 4414,4422 **** bufferp = NULL; } lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&dsp->mx); /* now, if we're doing a star match, do bulk fetching of all of --- 4408,4414 ---- *************** *** 4549,4558 **** if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ { /* We have already done the cm_TryBulkStat above */ ! fid.cell = scp->fid.cell; ! fid.volume = scp->fid.volume; ! fid.vnode = ntohl(dep->fid.vnode); ! fid.unique = ntohl(dep->fid.unique); fileType = cm_FindFileType(&fid); osi_Log2(smb_logp, "smb_ReceiveCoreSearchDir: file %s " "has filetype %d", osi_LogSaveString(smb_logp, dep->name), --- 4541,4547 ---- if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ { /* We have already done the cm_TryBulkStat above */ ! cm_SetFid(&fid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique)); fileType = cm_FindFileType(&fid); osi_Log2(smb_logp, "smb_ReceiveCoreSearchDir: file %s " "has filetype %d", osi_LogSaveString(smb_logp, dep->name), *************** *** 4590,4599 **** curPatchp = malloc(sizeof(*curPatchp)); osi_QAdd((osi_queue_t **) &dirListPatchesp, &curPatchp->q); curPatchp->dptr = op; ! curPatchp->fid.cell = scp->fid.cell; ! curPatchp->fid.volume = scp->fid.volume; ! curPatchp->fid.vnode = ntohl(dep->fid.vnode); ! curPatchp->fid.unique = ntohl(dep->fid.unique); /* do hidden attribute here since name won't be around when applying * dir list patches --- 4579,4585 ---- curPatchp = malloc(sizeof(*curPatchp)); osi_QAdd((osi_queue_t **) &dirListPatchesp, &curPatchp->q); curPatchp->dptr = op; ! cm_SetFid(&curPatchp->fid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique)); /* do hidden attribute here since name won't be around when applying * dir list patches *************** *** 5062,5069 **** if (tidp) { lock_ObtainWrite(&smb_rctLock); tidp->delete = 1; lock_ReleaseWrite(&smb_rctLock); - smb_ReleaseTID(tidp); } return 0; --- 5048,5055 ---- if (tidp) { lock_ObtainWrite(&smb_rctLock); tidp->delete = 1; + smb_ReleaseTID(tidp, TRUE); lock_ReleaseWrite(&smb_rctLock); } return 0; *************** *** 6404,6412 **** } lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&scp->mx); if (code) goto done; --- 6390,6396 ---- *************** *** 6466,6472 **** buf_Release(bufferp); if (code == 0 && sequential) ! cm_ConsiderPrefetch(scp, &lastByte, userp, &req); cm_ReleaseSCache(scp); --- 6450,6456 ---- buf_Release(bufferp); if (code == 0 && sequential) ! cm_ConsiderPrefetch(scp, &lastByte, *readp, userp, &req); cm_ReleaseSCache(scp); *************** *** 6484,6503 **** cm_user_t *userp, long *writtenp, int dosflag) #endif /* !DJGPP */ { ! osi_hyper_t offset; 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 */ ! cm_buf_t *bufferp; osi_hyper_t thyper; /* hyper tmp variable */ osi_hyper_t bufferOffset; afs_uint32 bufIndex; /* index in buffer where our data is */ ! int doWriteBack; ! osi_hyper_t writeBackOffset;/* offset of region to write back when ! * I/O is done */ DWORD filter = 0; cm_req_t req; --- 6468,6486 ---- 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 */ ! cm_buf_t *bufferp = NULL; osi_hyper_t thyper; /* hyper tmp variable */ osi_hyper_t bufferOffset; afs_uint32 bufIndex; /* index in buffer where our data is */ ! int doWriteBack = 0; ! osi_hyper_t writeBackOffset;/* offset of region to write back when I/O is done */ DWORD filter = 0; cm_req_t req; *************** *** 6508,6517 **** cm_InitReq(&req); - bufferp = NULL; - doWriteBack = 0; - offset = *offsetp; - lock_ObtainMutex(&fidp->mx); /* make sure we have a writable FD */ if (!(fidp->flags & SMB_FID_OPENWRITE)) { --- 6491,6496 ---- *************** *** 6558,6572 **** /* now, if the new position (thyper) and the old (offset) are in * different storeback windows, remember to store back the previous * storeback window when we're done with the write. */ ! if ((thyper.LowPart & (-cm_chunkSize)) != ! (offset.LowPart & (-cm_chunkSize))) { /* they're different */ doWriteBack = 1; writeBackOffset.HighPart = offset.HighPart; ! writeBackOffset.LowPart = offset.LowPart & (-cm_chunkSize); } ! *writtenp = count; /* now, copy the data one buffer at a time, until we've filled the --- 6537,6559 ---- /* now, if the new position (thyper) and the old (offset) are in * different storeback windows, remember to store back the previous * storeback window when we're done with the write. + * + * the purpose of this logic is to slow down the CIFS client + * in order to avoid the client disconnecting during the CLOSE + * operation if there are too many dirty buffers left to write + * than can be accomplished during 45 seconds. This used to be + * 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; ! writeBackOffset.LowPart = offset.LowPart & ~(smb_AsyncStoreSize-1); } ! *writtenp = count; /* now, copy the data one buffer at a time, until we've filled the *************** *** 6595,6603 **** } lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&bufferp->mx); lock_ObtainMutex(&scp->mx); --- 6582,6588 ---- *************** *** 6717,6734 **** } lock_ReleaseMutex(&fidp->mx); ! if (code == 0 && 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, cm_chunkSize, 0, userp); ! /* cm_SyncOpDone is called at the completion of cm_BkgStore */ } cm_ReleaseSCache(scp); --- 6702,6727 ---- } 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 { ! cm_BufWrite(scp, offsetp, *writtenp, 0, userp, &req); ! } } cm_ReleaseSCache(scp); *************** *** 7739,7767 **** if (dp->procp) { /* we have a recognized operation */ if (inp->inCom == 0x1d) /* Raw Write */ code = smb_ReceiveCoreWriteRaw (vcp, inp, outp, rwcp); else { ! osi_Log4(smb_logp,"Dispatch %s vcp 0x%p lana %d lsn %d",myCrt_Dispatch(inp->inCom),vcp,vcp->lana,vcp->lsn); code = (*(dp->procp)) (vcp, inp, outp); osi_Log4(smb_logp,"Dispatch return code 0x%x vcp 0x%p lana %d lsn %d",code,vcp,vcp->lana,vcp->lsn); #ifdef LOG_PACKET if ( code == CM_ERROR_BADSMB || code == CM_ERROR_BADOP ) ! smb_LogPacket(inp); #endif /* LOG_PACKET */ } if (oldGen != sessionGen) { - newTime = GetTickCount(); #ifndef DJGPP LogEvent(EVENTLOG_WARNING_TYPE, MSG_BAD_SMB_WRONG_SESSION, newTime - oldTime, ncbp->ncb_length); #endif /* !DJGPP */ ! osi_Log2(smb_logp, "Pkt straddled session startup, " ! "took %d ms, ncb length %d", newTime - oldTime, ncbp->ncb_length); } } else { --- 7732,7763 ---- if (dp->procp) { /* we have a recognized operation */ + char * opName = myCrt_Dispatch(inp->inCom); if (inp->inCom == 0x1d) /* Raw Write */ code = smb_ReceiveCoreWriteRaw (vcp, inp, outp, rwcp); else { ! osi_Log4(smb_logp,"Dispatch %s vcp 0x%p lana %d lsn %d",opName,vcp,vcp->lana,vcp->lsn); code = (*(dp->procp)) (vcp, inp, outp); osi_Log4(smb_logp,"Dispatch return code 0x%x vcp 0x%p lana %d lsn %d",code,vcp,vcp->lana,vcp->lsn); #ifdef LOG_PACKET if ( code == CM_ERROR_BADSMB || code == CM_ERROR_BADOP ) ! smb_LogPacket(inp); #endif /* LOG_PACKET */ } + newTime = GetTickCount(); + osi_Log2(smb_logp, "Dispatch %s duration %d ms", opName, newTime - oldTime); + if (oldGen != sessionGen) { #ifndef DJGPP LogEvent(EVENTLOG_WARNING_TYPE, MSG_BAD_SMB_WRONG_SESSION, newTime - oldTime, ncbp->ncb_length); #endif /* !DJGPP */ ! osi_Log3(smb_logp, "Request %s straddled session startup, " ! "took %d ms, ncb length %d", opName, newTime - oldTime, ncbp->ncb_length); } } else { *************** *** 9749,9757 **** if (tidp->userp) { cm_user_t *userp = tidp->userp; tidp->userp = NULL; - lock_ReleaseWrite(&smb_rctLock); cm_ReleaseUser(userp); - lock_ObtainWrite(&smb_rctLock); } } } --- 9745,9751 ---- Index: openafs/src/WINNT/afsd/smb.h diff -c openafs/src/WINNT/afsd/smb.h:1.41.2.23 openafs/src/WINNT/afsd/smb.h:1.41.2.26 *** openafs/src/WINNT/afsd/smb.h:1.41.2.23 Thu Jan 10 18:00:41 2008 --- openafs/src/WINNT/afsd/smb.h Mon Feb 25 00:36:47 2008 *************** *** 223,232 **** typedef struct smb_vc { struct smb_vc *nextp; /* not used */ afs_uint32 magic; /* a magic value to detect bad entries */ ! unsigned long refCount; /* the reference count */ ! long flags; /* the flags, if any; locked by mx */ osi_mutex_t mx; /* the mutex */ ! long vcID; /* VC id */ unsigned short lsn; /* the NCB LSN associated with this */ unsigned short uidCounter; /* session ID counter */ unsigned short tidCounter; /* tree ID counter */ --- 223,232 ---- typedef struct smb_vc { struct smb_vc *nextp; /* not used */ afs_uint32 magic; /* a magic value to detect bad entries */ ! afs_int32 refCount; /* the reference count */ ! afs_uint32 flags; /* the flags, if any; locked by mx */ osi_mutex_t mx; /* the mutex */ ! afs_uint32 vcID; /* VC id */ unsigned short lsn; /* the NCB LSN associated with this */ unsigned short uidCounter; /* session ID counter */ unsigned short tidCounter; /* tree ID counter */ *************** *** 259,265 **** /* one per user session */ typedef struct smb_user { struct smb_user *nextp; /* next sibling */ ! unsigned long refCount; /* ref count */ afs_uint32 flags; /* flags; locked by mx */ osi_mutex_t mx; unsigned short userID; /* the session identifier */ --- 259,265 ---- /* one per user session */ typedef struct smb_user { struct smb_user *nextp; /* next sibling */ ! afs_int32 refCount; /* ref count */ afs_uint32 flags; /* flags; locked by mx */ osi_mutex_t mx; unsigned short userID; /* the session identifier */ *************** *** 272,278 **** typedef struct smb_username { struct smb_username *nextp; /* next sibling */ ! unsigned long refCount; /* ref count */ long flags; /* flags; locked by mx */ osi_mutex_t mx; struct cm_user *userp; /* CM user structure */ --- 272,278 ---- typedef struct smb_username { struct smb_username *nextp; /* next sibling */ ! afs_int32 refCount; /* ref count */ long flags; /* flags; locked by mx */ osi_mutex_t mx; struct cm_user *userp; /* CM user structure */ *************** *** 303,309 **** /* one per tree-connect */ typedef struct smb_tid { struct smb_tid *nextp; /* next sibling */ ! unsigned long refCount; afs_uint32 flags; /* protected by mx */ osi_mutex_t mx; /* for non-tree-related stuff */ unsigned short tid; /* the tid */ --- 303,309 ---- /* one per tree-connect */ typedef struct smb_tid { struct smb_tid *nextp; /* next sibling */ ! afs_int32 refCount; afs_uint32 flags; /* protected by mx */ osi_mutex_t mx; /* for non-tree-related stuff */ unsigned short tid; /* the tid */ *************** *** 319,325 **** /* one per process ID */ typedef struct smb_pid { struct smb_pid *nextp; /* next sibling */ ! unsigned long refCount; long flags; osi_mutex_t mx; /* for non-tree-related stuff */ unsigned short pid; /* the pid */ --- 319,325 ---- /* one per process ID */ typedef struct smb_pid { struct smb_pid *nextp; /* next sibling */ ! afs_int32 refCount; long flags; osi_mutex_t mx; /* for non-tree-related stuff */ unsigned short pid; /* the pid */ *************** *** 360,366 **** /* one per file ID; these are really file descriptors */ typedef struct smb_fid { osi_queue_t q; ! unsigned long refCount; afs_uint32 flags; /* protected by mx */ osi_mutex_t mx; /* for non-tree-related stuff */ unsigned short fid; /* the file ID */ --- 360,366 ---- /* one per file ID; these are really file descriptors */ typedef struct smb_fid { osi_queue_t q; ! afs_int32 refCount; afs_uint32 flags; /* protected by mx */ osi_mutex_t mx; /* for non-tree-related stuff */ unsigned short fid; /* the file ID */ *************** *** 452,458 **** typedef struct smb_dirSearch { osi_queue_t q; /* queue of all outstanding cookies */ osi_mutex_t mx; /* just in case the caller screws up */ ! unsigned long refCount; /* reference count */ long cookie; /* value returned to the caller */ struct cm_scache *scp; /* vnode of the dir we're searching */ time_t lastTime; /* last time we used this (osi_Time) */ --- 452,458 ---- typedef struct smb_dirSearch { osi_queue_t q; /* queue of all outstanding cookies */ osi_mutex_t mx; /* just in case the caller screws up */ ! afs_int32 refCount; /* reference count */ long cookie; /* value returned to the caller */ struct cm_scache *scp; /* vnode of the dir we're searching */ time_t lastTime; /* last time we used this (osi_Time) */ *************** *** 563,569 **** extern void smb_HoldTIDNoLock(smb_tid_t *tidp); ! extern void smb_ReleaseTID(smb_tid_t *tidp); extern smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags); --- 563,569 ---- extern void smb_HoldTIDNoLock(smb_tid_t *tidp); ! extern void smb_ReleaseTID(smb_tid_t *tidp, afs_uint32 locked); extern smb_user_t *smb_FindUID(smb_vc_t *vcp, unsigned short uid, int flags); *************** *** 671,676 **** --- 671,678 ---- extern int smb_StoreAnsiFilenames; extern int smb_hideDotFiles; extern unsigned int smb_IsDotFile(char *lastComp); + extern afs_uint32 smb_AsyncStore; + extern afs_uint32 smb_AsyncStoreSize; /* the following are used for smb auth */ extern int smb_authType; /* Type of SMB authentication to be used. One from below. */ Index: openafs/src/WINNT/afsd/smb3.c diff -c openafs/src/WINNT/afsd/smb3.c:1.95.2.53 openafs/src/WINNT/afsd/smb3.c:1.95.2.55 *** openafs/src/WINNT/afsd/smb3.c:1.95.2.53 Mon Feb 18 00:53:56 2008 --- openafs/src/WINNT/afsd/smb3.c Fri Feb 22 19:17:35 2008 *************** *** 1063,1069 **** if (!shareFound) { if (uidp) smb_ReleaseUID(uidp); ! smb_ReleaseTID(tidp); return CM_ERROR_BADSHARENAME; } --- 1063,1069 ---- if (!shareFound) { if (uidp) smb_ReleaseUID(uidp); ! smb_ReleaseTID(tidp, FALSE); return CM_ERROR_BADSHARENAME; } *************** *** 1100,1106 **** if (ipc) tidp->flags |= SMB_TIDFLAG_IPC; lock_ReleaseMutex(&tidp->mx); ! smb_ReleaseTID(tidp); ((smb_t *)outp)->tid = newTid; ((smb_t *)inp)->tid = newTid; --- 1100,1106 ---- if (ipc) tidp->flags |= SMB_TIDFLAG_IPC; lock_ReleaseMutex(&tidp->mx); ! smb_ReleaseTID(tidp, FALSE); ((smb_t *)outp)->tid = newTid; ((smb_t *)inp)->tid = newTid; *************** *** 4608,4617 **** curPatchp->flags = 0; } ! curPatchp->fid.cell = targetscp->fid.cell; ! curPatchp->fid.volume = targetscp->fid.volume; ! curPatchp->fid.vnode = targetscp->fid.vnode; ! curPatchp->fid.unique = targetscp->fid.unique; /* temp */ dep = (cm_dirEntry_t *)malloc(sizeof(cm_dirEntry_t)+strlen(maskp)); --- 4608,4614 ---- curPatchp->flags = 0; } ! cm_SetFid(&curPatchp->fid, targetscp->fid.cell, targetscp->fid.volume, targetscp->fid.vnode, targetscp->fid.unique); /* temp */ dep = (cm_dirEntry_t *)malloc(sizeof(cm_dirEntry_t)+strlen(maskp)); *************** *** 4663,4668 **** --- 4660,4666 ---- smb_FreeTran2Packet(outp); if (dep) free(dep); + if (scp) cm_ReleaseSCache(scp); cm_ReleaseSCache(targetscp); cm_ReleaseUser(userp); *************** *** 5032,5040 **** bufferp = NULL; } lock_ReleaseMutex(&scp->mx); - lock_ObtainRead(&scp->bufCreateLock); code = buf_Get(scp, &thyper, &bufferp); - lock_ReleaseRead(&scp->bufCreateLock); lock_ObtainMutex(&dsp->mx); /* now, if we're doing a star match, do bulk fetching --- 5030,5036 ---- *************** *** 5174,5183 **** if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ { /* We have already done the cm_TryBulkStat above */ ! fid.cell = scp->fid.cell; ! fid.volume = scp->fid.volume; ! fid.vnode = ntohl(dep->fid.vnode); ! fid.unique = ntohl(dep->fid.unique); fileType = cm_FindFileType(&fid); /* osi_Log2(smb_logp, "smb_ReceiveTran2SearchDir: file %s " * "has filetype %d", dep->name, fileType); --- 5170,5176 ---- if (!(dsp->attribute & SMB_ATTR_DIRECTORY)) /* no directories */ { /* We have already done the cm_TryBulkStat above */ ! cm_SetFid(&fid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique)); fileType = cm_FindFileType(&fid); /* osi_Log2(smb_logp, "smb_ReceiveTran2SearchDir: file %s " * "has filetype %d", dep->name, fileType); *************** *** 5294,5303 **** else curPatchp->flags = 0; ! curPatchp->fid.cell = scp->fid.cell; ! curPatchp->fid.volume = scp->fid.volume; ! curPatchp->fid.vnode = ntohl(dep->fid.vnode); ! curPatchp->fid.unique = ntohl(dep->fid.unique); /* temp */ curPatchp->dep = dep; --- 5287,5293 ---- else curPatchp->flags = 0; ! cm_SetFid(&curPatchp->fid, scp->fid.cell, scp->fid.volume, ntohl(dep->fid.vnode), ntohl(dep->fid.unique)); /* temp */ curPatchp->dep = dep; 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.27 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.27 Sun Feb 17 23:37:44 2008 --- openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm Mon Feb 25 00:24:46 2008 *************** *** 57,63 ****

OpenAFS for Windows

!

Version 1.5.32

 

--- 57,63 ----

OpenAFS for Windows

!

Version 1.5.33

 

*************** *** 80,86 **** ·         OpenAFS for Windows 1.5.32 Release Notes

--- 80,86 ---- ·         OpenAFS for Windows 1.5.33 Release Notes

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.27 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.27 Sun Feb 17 23:37:48 2008 --- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm Mon Feb 25 00:24:51 2008 *************** *** 18,24 **** .shape {behavior:url(#default#VML);} ! OpenAFS for Windows 1.5.32 Release Notes ! OpenAFS for Windows 1.5.33 Release Notes --- 264,278 ---- mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; + mso-style-priority:99; + mso-style-qformat:yes; mso-style-parent:""; ! mso-padding-alt:0in 5.4pt 0in 5.4pt; ! mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; ! font-family:"Times New Roman","serif";} *************** *** 90,96 **** ! <body lang=EN-US style='tab-interval:36.0pt'> <div class=Section1> <p class=MsoNormal>This page uses frames, but your browser doesn't support them.</p> --- 284,290 ---- </frameset> <frame name=body src=relnotes.htm> <noframes> ! <body lang=EN-US style='tab-interval:.5in'> <div class=Section1> <p class=MsoNormal>This page uses frames, but your browser doesn't support them.</p> 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.33 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.33 Sun Feb 17 23:37:48 2008 --- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/relnotes.htm Mon Feb 25 00:24:51 2008 *************** *** 1,14 **** <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:st1="urn:schemas-microsoft-com:office:smarttags" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv=Content-Type content="text/html; charset=windows-1252"> <meta name=ProgId content=Word.Document> ! <meta name=Generator content="Microsoft Word 11"> ! <meta name=Originator content="Microsoft Word 11"> <link rel=File-List href="relnotes_files/filelist.xml"> <link rel=Edit-Time-Data href="relnotes_files/editdata.mso"> <!--[if !mso]> --- 1,15 ---- <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-m