Index: openafs/src/WINNT/afsd/afsd_init.c diff -c openafs/src/WINNT/afsd/afsd_init.c:1.79.2.38 openafs/src/WINNT/afsd/afsd_init.c:1.79.2.38.2.1 *** openafs/src/WINNT/afsd/afsd_init.c:1.79.2.38 Wed Mar 19 20:01:59 2008 --- openafs/src/WINNT/afsd/afsd_init.c Sun Jun 22 22:50:08 2008 *************** *** 81,87 **** char cm_NetbiosName[MAX_NB_NAME_LENGTH] = ""; char cm_CachePath[MAX_PATH]; - DWORD cm_CachePathLen; DWORD cm_ValidateCache = 1; BOOL reportSessionStartups = FALSE; --- 81,86 ---- Index: openafs/src/WINNT/afsd/cm_btree.c diff -c openafs/src/WINNT/afsd/cm_btree.c:1.1.2.14 openafs/src/WINNT/afsd/cm_btree.c:1.1.2.14.2.1 *** openafs/src/WINNT/afsd/cm_btree.c:1.1.2.14 Fri Feb 22 19:17:34 2008 --- openafs/src/WINNT/afsd/cm_btree.c Sun Jun 22 22:52:04 2008 *************** *** 1341,1346 **** --- 1341,1348 ---- if (isdata(node)) { if ( getdatakey(node).name ) free(getdatakey(node).name); + if ( getdatavalue(node).longname ) + free(getdatavalue(node).longname); } else { /* data node */ for ( i=1; i<=getfanout(B); i++ ) { if (getkey(node, i).name) Index: openafs/src/WINNT/afsd/cm_buf.c diff -c openafs/src/WINNT/afsd/cm_buf.c:1.31.2.38 openafs/src/WINNT/afsd/cm_buf.c:1.31.2.38.2.1 *** openafs/src/WINNT/afsd/cm_buf.c:1.31.2.38 Thu May 8 01:27:14 2008 --- openafs/src/WINNT/afsd/cm_buf.c Sun Jun 22 23:02:06 2008 *************** *** 722,728 **** * because we aren't going to be able to write this data to the file * server. */ ! if (code == CM_ERROR_NOSUCHFILE || code == CM_ERROR_BADFD){ bp->flags &= ~CM_BUF_DIRTY; bp->flags |= CM_BUF_ERROR; bp->dirty_offset = 0; --- 722,728 ---- * because we aren't going to be able to write this data to the file * server. */ ! if (code == CM_ERROR_NOSUCHFILE || code == CM_ERROR_BADFD || code == CM_ERROR_NOACCESS){ bp->flags &= ~CM_BUF_DIRTY; bp->flags |= CM_BUF_ERROR; bp->dirty_offset = 0; Index: openafs/src/WINNT/afsd/cm_freelance.c diff -c openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.11 openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.11.2.1 *** openafs/src/WINNT/afsd/cm_freelance.c:1.33.2.11 Fri Apr 11 13:46:24 2008 --- openafs/src/WINNT/afsd/cm_freelance.c Sun Jun 22 23:00:43 2008 *************** *** 419,424 **** --- 419,425 ---- lscpp = &tscp->nextp, tscp = tscp->nextp) { if (tscp == scp) { *lscpp = scp->nextp; + scp->nextp = NULL; lock_ObtainWrite(&scp->rw); scp->flags &= ~CM_SCACHEFLAG_INHASH; lock_ReleaseWrite(&scp->rw); Index: openafs/src/WINNT/afsd/cm_scache.c diff -c openafs/src/WINNT/afsd/cm_scache.c:1.35.2.74 openafs/src/WINNT/afsd/cm_scache.c:1.35.2.74.2.2 *** openafs/src/WINNT/afsd/cm_scache.c:1.35.2.74 Mon Apr 14 18:44:03 2008 --- openafs/src/WINNT/afsd/cm_scache.c Sun Jun 22 23:05:03 2008 *************** *** 47,67 **** /* must be called with cm_scacheLock write-locked! */ void cm_AdjustScacheLRU(cm_scache_t *scp) { ! if (scp == cm_data.scacheLRULastp) ! cm_data.scacheLRULastp = (cm_scache_t *) osi_QPrev(&scp->q); osi_QRemoveHT((osi_queue_t **) &cm_data.scacheLRUFirstp, (osi_queue_t **) &cm_data.scacheLRULastp, &scp->q); ! osi_QAdd((osi_queue_t **) &cm_data.scacheLRUFirstp, &scp->q); ! if (!cm_data.scacheLRULastp) ! cm_data.scacheLRULastp = scp; } ! /* call with scache write-locked and mutex held */ void cm_RemoveSCacheFromHashTable(cm_scache_t *scp) { cm_scache_t **lscpp; cm_scache_t *tscp; int i; if (scp->flags & CM_SCACHEFLAG_INHASH) { /* hash it out first */ i = CM_SCACHE_HASH(&scp->fid); --- 47,66 ---- /* must be called with cm_scacheLock write-locked! */ void cm_AdjustScacheLRU(cm_scache_t *scp) { ! lock_AssertWrite(&cm_scacheLock); osi_QRemoveHT((osi_queue_t **) &cm_data.scacheLRUFirstp, (osi_queue_t **) &cm_data.scacheLRULastp, &scp->q); ! osi_QAddH((osi_queue_t **) &cm_data.scacheLRUFirstp, (osi_queue_t **) &cm_data.scacheLRULastp, &scp->q); } ! /* call with cm_scacheLock write-locked and scp rw held */ void cm_RemoveSCacheFromHashTable(cm_scache_t *scp) { cm_scache_t **lscpp; cm_scache_t *tscp; int i; + lock_AssertWrite(&cm_scacheLock); + lock_AssertWrite(&scp->rw); if (scp->flags & CM_SCACHEFLAG_INHASH) { /* hash it out first */ i = CM_SCACHE_HASH(&scp->fid); *************** *** 70,75 **** --- 69,75 ---- lscpp = &tscp->nextp, tscp = tscp->nextp) { if (tscp == scp) { *lscpp = scp->nextp; + scp->nextp = NULL; scp->flags &= ~CM_SCACHEFLAG_INHASH; break; } *************** *** 95,101 **** --- 95,103 ---- return -1; } + lock_ObtainWrite(&scp->rw); cm_RemoveSCacheFromHashTable(scp); + lock_ReleaseWrite(&scp->rw); #if 0 if (flags & CM_SCACHE_RECYCLEFLAG_DESTROY_BUFFERS) { *************** *** 234,239 **** --- 236,242 ---- cm_scache_t *scp; int retry = 0; + lock_AssertWrite(&cm_scacheLock); #if 0 /* first pass - look for deleted objects */ for ( scp = cm_data.scacheLRULastp; *************** *** 751,758 **** scp->dotdotFid.vnode=1; scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO); if (!(scp->flags & CM_SCACHEFLAG_INHASH)) { ! scp->nextp=cm_data.scacheHashTablep[hash]; ! cm_data.scacheHashTablep[hash]=scp; scp->flags |= CM_SCACHEFLAG_INHASH; } scp->refCount = 1; --- 754,761 ---- scp->dotdotFid.vnode=1; scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO); if (!(scp->flags & CM_SCACHEFLAG_INHASH)) { ! scp->nextp = cm_data.scacheHashTablep[hash]; ! cm_data.scacheHashTablep[hash] = scp; scp->flags |= CM_SCACHEFLAG_INHASH; } scp->refCount = 1; *************** *** 1803,1810 **** --- 1806,1817 ---- #endif { afs_int32 refCount; + long lockstate; + osi_assertx(scp != NULL, "null cm_scache_t"); lock_AssertAny(&cm_scacheLock); + + lockstate = lock_GetRWLockState(&cm_scacheLock); refCount = InterlockedDecrement(&scp->refCount); #ifdef DEBUG_REFCOUNT if (refCount < 0) *************** *** 1815,1820 **** --- 1822,1842 ---- 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 + + if (scp->flags & CM_SCACHEFLAG_DELETED) { + int deleted = 0; + lock_ObtainWrite(&scp->rw); + if (scp->flags & CM_SCACHEFLAG_DELETED) + deleted = 1; + lock_ReleaseWrite(&scp->rw); + if (deleted) { + if (lockstate != OSI_RWLOCK_WRITEHELD) + lock_ConvertRToW(&cm_scacheLock); + cm_RecycleSCache(scp, 0); + if (lockstate != OSI_RWLOCK_WRITEHELD) + lock_ConvertWToR(&cm_scacheLock); + } + } } #ifdef DEBUG_REFCOUNT *************** *** 1837,1842 **** --- 1859,1878 ---- 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 + + if (scp->flags & CM_SCACHEFLAG_DELETED) { + int deleted = 0; + lock_ObtainWrite(&scp->rw); + if (scp->flags & CM_SCACHEFLAG_DELETED) + deleted = 1; + lock_ReleaseWrite(&scp->rw); + if (deleted) { + lock_ConvertRToW(&cm_scacheLock); + cm_RecycleSCache(scp, 0); + lock_ConvertWToR(&cm_scacheLock); + } + } + lock_ReleaseRead(&cm_scacheLock); } Index: openafs/src/WINNT/afsd/cm_scache.h diff -c openafs/src/WINNT/afsd/cm_scache.h:1.21.2.24 openafs/src/WINNT/afsd/cm_scache.h:1.21.2.24.2.1 *** openafs/src/WINNT/afsd/cm_scache.h:1.21.2.24 Thu Mar 13 00:39:17 2008 --- openafs/src/WINNT/afsd/cm_scache.h Sun Jun 22 23:05:03 2008 *************** *** 409,412 **** --- 409,414 ---- extern long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags); extern void cm_RemoveSCacheFromHashTable(cm_scache_t *scp); + + extern void cm_AdjustScacheLRU(cm_scache_t *scp); #endif /* __CM_SCACHE_H_ENV__ */ Index: openafs/src/WINNT/afsd/cm_server.c diff -c openafs/src/WINNT/afsd/cm_server.c:1.25.2.28 openafs/src/WINNT/afsd/cm_server.c:1.25.2.28.2.1 *** openafs/src/WINNT/afsd/cm_server.c:1.25.2.28 Thu Mar 13 00:39:17 2008 --- openafs/src/WINNT/afsd/cm_server.c Sun Jun 22 22:54:28 2008 *************** *** 756,761 **** --- 756,762 ---- free(conntimer); free(deltas); free(results); + free(serversp); free(caps); } #endif /* MULTI_CHECKSERVERS */ Index: openafs/src/WINNT/afsd/cm_vnodeops.c diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.74 openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.74.2.2 *** openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.74 Mon Apr 14 18:44:04 2008 --- openafs/src/WINNT/afsd/cm_vnodeops.c Sun Jun 22 23:05:03 2008 *************** *** 1590,1595 **** --- 1590,1596 ---- AFSVolSync volSync; struct rx_connection * callp; cm_dirOp_t dirop; + cm_scache_t *scp = NULL; #ifdef AFS_FREELANCE_CLIENT if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { *************** *** 1599,1604 **** --- 1600,1607 ---- } #endif + code = cm_Lookup(dscp, namep, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp); + /* make sure we don't screw up the dir status during the merge */ code = cm_BeginDirOp(dscp, userp, reqp, CM_DIRLOCK_NONE, &dirop); *************** *** 1661,1666 **** --- 1664,1678 ---- } cm_EndDirOp(&dirop); + if (scp) { + cm_ReleaseSCache(scp); + if (code == 0) { + lock_ObtainWrite(&scp->rw); + scp->flags |= CM_SCACHEFLAG_DELETED; + lock_ReleaseWrite(&scp->rw); + } + } + return code; } *************** *** 2974,2980 **** code = RXAFS_Link(callp, &dirAFSFid, namep, &existingAFSFid, &newLinkStatus, &updatedDirStatus, &volSync); rx_PutConnection(callp); ! osi_Log1(smb_logp," RXAFS_Link returns 0x%x", code); } while (cm_Analyze(connp, userp, reqp, &dscp->fid, &volSync, NULL, NULL, code)); --- 2986,2992 ---- code = RXAFS_Link(callp, &dirAFSFid, namep, &existingAFSFid, &newLinkStatus, &updatedDirStatus, &volSync); rx_PutConnection(callp); ! osi_Log1(afsd_logp," RXAFS_Link returns 0x%x", code); } while (cm_Analyze(connp, userp, reqp, &dscp->fid, &volSync, NULL, NULL, code)); *************** *** 3125,3130 **** --- 3137,3145 ---- AFSVolSync volSync; struct rx_connection * callp; cm_dirOp_t dirop; + cm_scache_t *scp = NULL; + + code = cm_Lookup(dscp, namep, CM_FLAG_NOMOUNTCHASE, userp, reqp, &scp); /* before starting the RPC, mark that we're changing the directory data, * so that someone who does a chmod on the dir will wait until our *************** *** 3187,3192 **** --- 3202,3216 ---- } cm_EndDirOp(&dirop); + if (scp) { + cm_ReleaseSCache(scp); + if (code == 0) { + lock_ObtainWrite(&scp->rw); + scp->flags |= CM_SCACHEFLAG_DELETED; + lock_ReleaseWrite(&scp->rw); + } + } + /* and return error code */ return code; } *************** *** 4973,4979 **** | CM_SCACHESYNC_LOCK); if (code) { ! osi_Log1(smb_logp, "cm_CheckLocks SyncOp failure code 0x%x", code); goto post_syncopdone; } --- 4997,5003 ---- | CM_SCACHESYNC_LOCK); if (code) { ! osi_Log1(afsd_logp, "cm_CheckLocks SyncOp failure code 0x%x", code); goto post_syncopdone; } *************** *** 5299,5305 **** | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_LOCK); if (code) { ! osi_Log1(smb_logp, "cm_RetryLock SyncOp failure code 0x%x", code); lock_ReleaseWrite(&cm_scacheLock); goto post_syncopdone; } --- 5323,5329 ---- | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_LOCK); if (code) { ! osi_Log1(afsd_logp, "cm_RetryLock SyncOp failure code 0x%x", code); lock_ReleaseWrite(&cm_scacheLock); goto post_syncopdone; } Index: openafs/src/WINNT/afsd/smb.c diff -c openafs/src/WINNT/afsd/smb.c:1.118.2.70 openafs/src/WINNT/afsd/smb.c:1.118.2.70.2.1 *** openafs/src/WINNT/afsd/smb.c:1.118.2.70 Sun Mar 9 11:25:01 2008 --- openafs/src/WINNT/afsd/smb.c Sun Jun 22 23:05:04 2008 *************** *** 6086,6092 **** char *pathp = NULL; cm_scache_t * scp = NULL; cm_scache_t *delscp = NULL; - int deleted = 0; int nullcreator = 0; osi_Log4(smb_logp, "smb_CloseFID Closing fidp 0x%x (fid=%d scp=0x%x vcp=0x%x)", --- 6086,6091 ---- *************** *** 6205,6211 **** if (delscp->fileType == CM_SCACHETYPE_DIRECTORY) { code = cm_RemoveDir(dscp, fullPathp, userp, &req); if (code == 0) { - deleted = 1; if (dscp->flags & CM_SCACHEFLAG_ANYWATCH) smb_NotifyChange(FILE_ACTION_REMOVED, FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_CREATION, --- 6204,6209 ---- *************** *** 6214,6220 **** } else { code = cm_Unlink(dscp, fullPathp, userp, &req); if (code == 0) { - deleted = 1; if (dscp->flags & CM_SCACHEFLAG_ANYWATCH) smb_NotifyChange(FILE_ACTION_REMOVED, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_CREATION, --- 6212,6217 ---- *************** *** 6259,6270 **** cm_ReleaseSCache(dscp); if (delscp) { - if (deleted) { - lock_ObtainWrite(&delscp->rw); - if (deleted) - delscp->flags |= CM_SCACHEFLAG_DELETED; - lock_ReleaseWrite(&delscp->rw); - } cm_ReleaseSCache(delscp); } --- 6256,6261 ---- 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.30 openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.30.2.2 *** openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.30 Mon Apr 21 11:44:06 2008 --- openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm Mon Jun 23 00:09:20 2008 *************** *** 57,63 ****
--- 57,63 ----
*************** *** 80,86 **** · OpenAFS for Windows 1.5.35 Release Notes
--- 80,86 ---- · OpenAFS for Windows 1.5.36 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.30 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.30.2.2 *** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.30 Mon Apr 21 11:44:11 2008 --- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm Mon Jun 23 00:09:20 2008 *************** *** 18,24 **** .shape {behavior:url(#default#VML);} !
OpenAFS for Windows 1.5.35
Release Notes
The Andrew File System (AFS) is a location-independent --- 1282,1288 ----
OpenAFS for Windows 1.5.39
Release Notes
The Andrew File System (AFS) is a location-independent
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.31 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.31.2.2
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm:1.2.6.31 Mon Apr 21 11:44:12 2008
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/toc.htm Mon Jun 23 00:09:22 2008
***************
*** 11,17 ****