From c5126838590eaf15e0df569c31b2a1bc12b3e0af Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 4 Aug 2011 17:25:01 -0400 Subject: [PATCH] Windows: adjust scache LRU postion upon deletion If the object represented by a scache object is deleted, update the LRU position of the scache object to make it the first object in the LRU queue to be recycled. This preserves the cached objects for those that might prove useful in the future. Change-Id: I0e862b1270e10c31f20ecde06d208f4b8c405c3a Reviewed-on: http://gerrit.openafs.org/5161 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_conn.c | 5 +++-- src/WINNT/afsd/cm_scache.c | 7 ++++++- src/WINNT/afsd/cm_vnodeops.c | 11 ++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 02b495ff7..141adb62a 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -670,11 +670,12 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, pscp = cm_FindSCacheParent(scp); lock_ObtainWrite(&scp->rw); + scp->flags |= CM_SCACHEFLAG_DELETED; lock_ObtainWrite(&cm_scacheLock); - cm_RemoveSCacheFromHashTable(scp); + cm_AdjustScacheLRU(scp); + cm_RemoveSCacheFromHashTable(scp); lock_ReleaseWrite(&cm_scacheLock); cm_LockMarkSCacheLost(scp); - scp->flags |= CM_SCACHEFLAG_DELETED; lock_ReleaseWrite(&scp->rw); cm_ReleaseSCache(scp); diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 9ac98741d..d835949a7 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -66,7 +66,12 @@ 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); + if (scp->flags & CM_SCACHEFLAG_DELETED) { + /* Since it has been deleted make it the first to be recycled. */ + osi_QAddT((osi_queue_t **) &cm_data.scacheLRUFirstp, (osi_queue_t **) &cm_data.scacheLRULastp, &scp->q); + } else { + 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 */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index bd2ed1ef9..f45f59f60 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1691,8 +1691,13 @@ long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t * cnamep, cm_ReleaseSCache(scp); if (code == 0) { lock_ObtainWrite(&scp->rw); - if (--scp->linkCount == 0) + if (--scp->linkCount == 0) { scp->flags |= CM_SCACHEFLAG_DELETED; + lock_ObtainWrite(&cm_scacheLock); + cm_AdjustScacheLRU(scp); + cm_RemoveSCacheFromHashTable(scp); + lock_ReleaseWrite(&cm_scacheLock); + } cm_DiscardSCache(scp); lock_ReleaseWrite(&scp->rw); } @@ -3449,6 +3454,10 @@ long cm_RemoveDir(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t *cnamep, cm_ if (code == 0) { lock_ObtainWrite(&scp->rw); scp->flags |= CM_SCACHEFLAG_DELETED; + lock_ObtainWrite(&cm_scacheLock); + cm_AdjustScacheLRU(scp); + cm_RemoveSCacheFromHashTable(scp); + lock_ReleaseWrite(&cm_scacheLock); lock_ReleaseWrite(&scp->rw); } } -- 2.39.5