From 2d2ad3cf0f0f095e014a4a25053ffe27918aeb15 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. Reviewed-on: http://gerrit.openafs.org/5161 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit c5126838590eaf15e0df569c31b2a1bc12b3e0af) Change-Id: Icf60ad3127c295e4fca0e99e338ba4c62cd9e392 Reviewed-on: http://gerrit.openafs.org/5210 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- 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 d26a06180..085831021 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -667,11 +667,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 329c5a56b..19d8d9d03 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -63,7 +63,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 09551f1bb..1632ea01e 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1688,8 +1688,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); } @@ -3446,6 +3451,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