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);
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;
}
}
-/* 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) {
*/
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;
}
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__ */