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 ****
!
This page uses frames, but your browser doesn't support
them.
--- 284,290 ----
!
This page uses frames, but your browser doesn't support
them.
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 ****
!
!