From: Jeffrey Altman Date: Thu, 11 Sep 2008 18:11:15 +0000 (+0000) Subject: DEVEL15-windows-flush-btrees-20080911 X-Git-Tag: openafs-devel-1_5_53~39 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=a05dd19486025b8f036d72cf0d6816a3c2bd31f2;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-flush-btrees-20080911 LICENSE MIT fs flushall, fs flushvolume, and fs flush should tear down directory B+ trees so that when the data buffers are re-read from the file server with the same data version, the B+ trees will be rebuilt. (cherry picked from commit 186f1e97d0c15ead6bddae8697161a47ce9a80e4) --- diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 28525d9c9..0bda7f65b 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -104,6 +104,8 @@ cm_FlushFile(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) lock_ObtainWrite(&scp->rw); cm_DiscardSCache(scp); + if (scp->fileType == CM_SCACHETYPE_DIRECTORY) + cm_ResetSCacheDirectory(scp); lock_ReleaseWrite(&scp->rw); osi_Log2(afsd_logp,"cm_FlushFile scp 0x%x returns error: [%x]",scp, code); @@ -3050,7 +3052,7 @@ cm_CheckServersStatus(cm_serverRef_t *serversp) if (tsp = tsrp->server) { cm_GetServerNoLock(tsp); lock_ReleaseRead(&cm_serverLock); - if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { + if ((tsrp->status == srv_deleted) && !(tsp->flags & CM_SERVERFLAG_DOWN)) { allDown = 0; if (tsrp->status == srv_busy) { allOffline = 0; diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index d7909892e..b3944a56d 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -75,10 +75,25 @@ void cm_RemoveSCacheFromHashTable(cm_scache_t *scp) } } -/* called with cm_scacheLock and scp write-locked; recycles an existing scp. - * - * this function ignores all of the locking hierarchy. - */ +/* called with cm_scacheLock and scp write-locked */ +void cm_ResetSCacheDirectory(cm_scache_t *scp) +{ +#ifdef USE_BPLUS + /* destroy directory Bplus Tree */ + if (scp->dirBplus) { + LARGE_INTEGER start, end; + QueryPerformanceCounter(&start); + bplus_free_tree++; + freeBtree(scp->dirBplus); + scp->dirBplus = NULL; + QueryPerformanceCounter(&end); + + bplus_free_time += (end.QuadPart - start.QuadPart); + } +#endif +} + +/* called with cm_scacheLock and scp write-locked; recycles an existing scp. */ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) { if (scp->refCount != 0) { @@ -207,19 +222,7 @@ long cm_RecycleSCache(cm_scache_t *scp, afs_int32 flags) */ cm_FreeAllACLEnts(scp); -#ifdef USE_BPLUS - /* destroy directory Bplus Tree */ - if (scp->dirBplus) { - LARGE_INTEGER start, end; - QueryPerformanceCounter(&start); - bplus_free_tree++; - freeBtree(scp->dirBplus); - scp->dirBplus = NULL; - QueryPerformanceCounter(&end); - - bplus_free_time += (end.QuadPart - start.QuadPart); - } -#endif + cm_ResetSCacheDirectory(scp); return 0; } diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 2320807e6..5494916a9 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -409,4 +409,6 @@ extern void cm_RemoveSCacheFromHashTable(cm_scache_t *scp); extern void cm_AdjustScacheLRU(cm_scache_t *scp); extern int cm_DumpSCache(FILE *outputFile, char *cookie, int lock); + +extern void cm_ResetSCacheDirectory(cm_scache_t *scp); #endif /* __CM_SCACHE_H_ENV__ */