Windows: Do not leak cm_volume_t objects from the LRU queue

During cm_volume_t object recycling the object is removed
from the LRU to ensure that a single object is not recycled
by multiple threads at the same time.  Before cm_FindVolumeByName()
exits the object must be re-inserted into the LRU if it is not
present.

LICENSE MIT

Reviewed-on: http://gerrit.openafs.org/3220
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
(cherry picked from commit 862e29a98a)
Change-Id: I11847718cb5321ff2b08850786cc147390040f42
Reviewed-on: http://gerrit.openafs.org/3246
Tested-by: Derrick Brashear <shadow@dementia.org>
This commit is contained in:
Jeffrey Altman 2010-11-02 16:16:20 -04:00 committed by Derrick Brashear
parent c1157279a0
commit f5f3f9106a

View File

@ -900,6 +900,11 @@ long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep,
osi_Log2(afsd_logp, "Recycling Volume %s:%s",
volp->cellp->name, volp->namep);
/* The volp is removed from the LRU queue in order to
* prevent two threads from attempting to recycle the
* same object. This volp must be re-inserted back into
* the LRU queue before this function exits.
*/
if (volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE)
cm_RemoveVolumeFromLRU(volp);
if (volp->flags & CM_VOLUMEFLAG_IN_HASH)
@ -968,12 +973,11 @@ long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep,
if (code == 0) {
*outVolpp = volp;
if ((volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) &&
!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
lock_ObtainWrite(&cm_volumeLock);
lock_ObtainRead(&cm_volumeLock);
if (!(volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) ||
(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE))
cm_AdjustVolumeLRU(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
lock_ReleaseRead(&cm_volumeLock);
} else {
/*
* do not return it to the caller but do insert it in the LRU