rsp = RING_GET_RESPONSE(&BlkifRing->Front, rsp_cons);
rsp_cons++;
- BlkifRing->ResponsesProcessed++;
BlkifRing->Stopped = FALSE;
Request = __BlkifRingGetSubmittedRequest(BlkifRing,
rsp->id);
- ASSERT3P(Request, != , NULL);
-
- __BlkifRingCompleteResponse(BlkifRing,
- Request,
- rsp->status);
+ if (Request != NULL) {
+ BlkifRing->ResponsesProcessed++;
+ __BlkifRingCompleteResponse(BlkifRing,
+ Request,
+ rsp->status);
+ }
if (rsp_cons - BlkifRing->Front.rsp_cons > XENVBD_BATCH(BlkifRing))
Retry = TRUE;
IN PXENVBD_BLKIF_RING BlkifRing
)
{
- PXENVBD_RING Ring = BlkifRing->Ring;
- ULONG Attempt;
-
Trace("====> %u\n", BlkifRing->Index);
__BlkifRingAcquireLock(BlkifRing);
ASSERT(BlkifRing->Enabled);
- // Discard any pending requests
- while (!IsListEmpty(&BlkifRing->PreparedQueue)) {
- PLIST_ENTRY ListEntry;
- PXENVBD_REQUEST Request;
- PXENVBD_SRBEXT SrbExt;
- PSCSI_REQUEST_BLOCK Srb;
-
- ListEntry = RemoveHeadList(&BlkifRing->PreparedQueue);
- ASSERT3P(ListEntry, !=, &BlkifRing->PreparedQueue);
+ BlkifRing->Enabled = FALSE;
- Request = CONTAINING_RECORD(ListEntry,
- XENVBD_REQUEST,
- ListEntry);
- SrbExt = Request->SrbExt;
- Srb = SrbExt->Srb;
- Srb->SrbStatus = SRB_STATUS_ABORTED;
- Srb->ScsiStatus = 0x40; // SCSI_ABORTED
+ while (!IsListEmpty(&BlkifRing->SubmittedList)) {
+ PLIST_ENTRY ListEntry;
+ PXENVBD_REQUEST Request;
- BlkifRingPutRequest(BlkifRing, Request);
+ ListEntry = RemoveHeadList(&BlkifRing->SubmittedList);
+ ASSERT3P(ListEntry, !=, &BlkifRing->SubmittedList);
- if (InterlockedDecrement(&SrbExt->RequestCount) == 0)
- __BlkifRingCompleteSrb(BlkifRing, SrbExt);
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
+ BlkifRing->ResponsesProcessed++;
+ __BlkifRingCompleteResponse(BlkifRing, Request, BLKIF_RSP_ERROR);
}
- Attempt = 0;
- ASSERT3U(BlkifRing->RequestsPushed, == , BlkifRing->RequestsPosted);
- while (BlkifRing->ResponsesProcessed != BlkifRing->RequestsPushed) {
- Attempt++;
- ASSERT(Attempt < 100);
-
- // Try to move things along
- __BlkifRingSend(BlkifRing);
- (VOID)BlkifRingPoll(BlkifRing);
+ while (!IsListEmpty(&BlkifRing->PreparedQueue)) {
+ PLIST_ENTRY ListEntry;
+ PXENVBD_REQUEST Request;
- // We are waiting for a watch event at DISPATCH_LEVEL so
- // it is our responsibility to poll the store ring.
- XENBUS_STORE(Poll,
- &Ring->StoreInterface);
+ ListEntry = RemoveHeadList(&BlkifRing->PreparedQueue);
+ ASSERT3P(ListEntry, !=, &BlkifRing->PreparedQueue);
- KeStallExecutionProcessor(1000); // 1ms
+ Request = CONTAINING_RECORD(ListEntry, XENVBD_REQUEST, ListEntry);
+ // Dont increment ResponsesProcessed, as this is a faked response
+ __BlkifRingCompleteResponse(BlkifRing, Request, BLKIF_RSP_ERROR);
}
- BlkifRing->Enabled = FALSE;
+ BlkifRing->Stopped = FALSE;
+
__BlkifRingReleaseLock(BlkifRing);
Trace("<==== %u\n", BlkifRing->Index);