From ab35badf7fef78451d6849d56cc740e76845e154 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 10 Aug 2006 00:49:41 +0000 Subject: [PATCH] DEVEL15-windows-buf-queue-handling-20060809 don't free objects that are still on the queue. remove them first. (cherry picked from commit aa4d289b87cda5790b268bbb44fd7806379d267f) --- src/WINNT/afsd/cm_dcache.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index cc548fd2b..bd28e17b7 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -1060,8 +1060,9 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp, /* add the buffer to the list */ qdp = osi_QDAlloc(); osi_SetQData(qdp, tbp); - osi_QAdd((osi_queue_t **)&heldBufListp, &qdp->q); - if (!heldBufListEndp) heldBufListEndp = qdp; + osi_QAddH((osi_queue_t **)&heldBufListp, + (osi_queue_t **)&heldBufListEndp, + &qdp->q); /* leave tbp held (from buf_Get) */ if (!reserving) @@ -1129,9 +1130,9 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp, /* add the buffer to the list */ qdp = osi_QDAlloc(); osi_SetQData(qdp, tbp); - osi_QAdd((osi_queue_t **)&biop->bufListp, &qdp->q); - if (!biop->bufListEndp) - biop->bufListEndp = qdp; + osi_QAddH((osi_queue_t **)&biop->bufListp, + (osi_queue_t **)&biop->bufListEndp, + &qdp->q); buf_Hold(tbp); /* from now on, a failure just stops our collection process, but @@ -1148,6 +1149,9 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp, for (qdp = heldBufListp; qdp; qdp = tqdp) { tqdp = (osi_queueData_t *) osi_QNext(&qdp->q); tbp = osi_GetQData(qdp); + osi_QRemoveHT((osi_queue_t **) &heldBufListp, + (osi_queue_t **) &heldBufListEndp, + &qdp->q); osi_QDFree(qdp); buf_Release(tbp); } @@ -1200,6 +1204,9 @@ void cm_ReleaseBIOD(cm_bulkIO_t *biop, int isStore) /* extract buffer and free queue data */ bufp = osi_GetQData(qdp); + osi_QRemoveHT((osi_queue_t **) &biop->bufListp, + (osi_queue_t **) &biop->bufListEndp, + &qdp->q); osi_QDFree(qdp); /* now, mark I/O as done, unlock the buffer and release it */ -- 2.39.5