]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: adjust scache LRU postion upon deletion
authorJeffrey Altman <jaltman@your-file-system.com>
Thu, 4 Aug 2011 21:25:01 +0000 (17:25 -0400)
committerDerrick Brashear <shadow@dementia.org>
Fri, 12 Aug 2011 15:56:33 +0000 (08:56 -0700)
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 <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
(cherry picked from commit c5126838590eaf15e0df569c31b2a1bc12b3e0af)

Change-Id: Icf60ad3127c295e4fca0e99e338ba4c62cd9e392
Reviewed-on: http://gerrit.openafs.org/5210
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_vnodeops.c

index d26a061804a9a1b6fd72cc94805f490eaa8c19da..0858310213a37ee9800cd97e61d60a0bc8019047 100644 (file)
@@ -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);
 
index 329c5a56b83713639d30a6cae0a1be0658f84850..19d8d9d03fd36a93231b89c6b66950af38236533 100644 (file)
@@ -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 */
index 09551f1bbf5d82e28df30d9df5b6939d549a2169..1632ea01edb3a305887ff975e9432ecf6978da5a 100644 (file)
@@ -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);
         }
     }