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