From da73496ba698ee2cc3c008775622014278d07739 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 5 Oct 2010 11:32:05 -0400 Subject: [PATCH] Windows: do not leak cm_volume_t objects from LRU queue The LRU queue is where volume objects are recycled from. Therefore if they are removed then they must be put back. Remove extraneous operations from cm_AdjustVolumeLRU(). LICENSE MIT Reviewed-on: http://gerrit.openafs.org/2913 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit 77456c07945659ff1254732aa8e428e6301e5ee6) Change-Id: I0de6b6cfe1598ae09471b25a506f34bfe577c2a7 Reviewed-on: http://gerrit.openafs.org/3052 Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear --- src/WINNT/afsd/cm_volume.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 266b50755..6a85c05cc 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -968,13 +968,21 @@ long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep, if (code == 0) { *outVolpp = volp; - if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) { + if ((volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) && + !(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) { lock_ObtainWrite(&cm_volumeLock); cm_AdjustVolumeLRU(volp); lock_ReleaseWrite(&cm_volumeLock); } } else { + /* + * do not return it to the caller but do insert it in the LRU + * otherwise it will be lost + */ lock_ObtainRead(&cm_volumeLock); + if (!(volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) || + (flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) + cm_AdjustVolumeLRU(volp); cm_PutVolume(volp); lock_ReleaseRead(&cm_volumeLock); } @@ -1681,14 +1689,13 @@ void cm_RemoveVolumeFromIDHashTable(cm_volume_t *volp, afs_uint32 volType) /* must be called with cm_volumeLock write-locked! */ void cm_AdjustVolumeLRU(cm_volume_t *volp) { - if (volp == cm_data.volumeLRULastp) - cm_data.volumeLRULastp = (cm_volume_t *) osi_QPrev(&volp->q); + if (volp == cm_data.volumeLRUFirstp) + return; + if (volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q); - osi_QAdd((osi_queue_t **) &cm_data.volumeLRUFirstp, &volp->q); + osi_QAddH((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q); volp->flags |= CM_VOLUMEFLAG_IN_LRU_QUEUE; - if (!cm_data.volumeLRULastp) - cm_data.volumeLRULastp = volp; } /* must be called with cm_volumeLock write-locked! */ @@ -1697,22 +1704,16 @@ void cm_MoveVolumeToLRULast(cm_volume_t *volp) if (volp == cm_data.volumeLRULastp) return; - if (volp == cm_data.volumeLRUFirstp) - cm_data.volumeLRUFirstp = (cm_volume_t *) osi_QNext(&volp->q); if (volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q); osi_QAddT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q); volp->flags |= CM_VOLUMEFLAG_IN_LRU_QUEUE; - if (!cm_data.volumeLRULastp) - cm_data.volumeLRULastp = volp; } /* must be called with cm_volumeLock write-locked! */ void cm_RemoveVolumeFromLRU(cm_volume_t *volp) { if (volp->flags & CM_VOLUMEFLAG_IN_LRU_QUEUE) { - if (volp == cm_data.volumeLRULastp) - cm_data.volumeLRULastp = (cm_volume_t *) osi_QPrev(&volp->q); osi_QRemoveHT((osi_queue_t **) &cm_data.volumeLRUFirstp, (osi_queue_t **) &cm_data.volumeLRULastp, &volp->q); volp->flags &= ~CM_VOLUMEFLAG_IN_LRU_QUEUE; } -- 2.39.5