From: Owen Smith Date: Thu, 19 Sep 2019 08:24:28 +0000 (+0100) Subject: Attempt to process responses on the ring X-Git-Tag: 9.0.0-rc1~11 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=bb01ea5666fb6efa4ee98b079e3e07067dea14cf;p=pvdrivers%2Fwin%2Fxenvbd.git Attempt to process responses on the ring When Disabling the ring, outstanding responses need to be completed. Poll the ring to complete outstanding responses if the backend is still connected and valid. Signed-off-by: Owen Smith --- diff --git a/src/xenvbd/adapter.c b/src/xenvbd/adapter.c index 79a5a0e..2d8d65f 100644 --- a/src/xenvbd/adapter.c +++ b/src/xenvbd/adapter.c @@ -1993,13 +1993,11 @@ AdapterHwStartIo( break; case SRB_FUNCTION_FLUSH: - TargetFlush(Target, SrbExt); - WasQueued = TRUE; + WasQueued = TargetFlush(Target, SrbExt); break; case SRB_FUNCTION_SHUTDOWN: - TargetShutdown(Target, SrbExt); - WasQueued = TRUE; + WasQueued = TargetShutdown(Target, SrbExt); break; default: diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c index 514374c..6edee5c 100644 --- a/src/xenvbd/ring.c +++ b/src/xenvbd/ring.c @@ -2147,7 +2147,7 @@ BlkifRingDisconnect( Trace("<==== %u\n", BlkifRing->Index); } -static VOID +static BOOLEAN __BlkifRingQueueSrb( IN PXENVBD_BLKIF_RING BlkifRing, IN PXENVBD_SRBEXT SrbExt @@ -2158,6 +2158,9 @@ __BlkifRingQueueSrb( ULONG_PTR LockBit; ULONG_PTR New; + if (!BlkifRing->Enabled) + goto fail1; + ListEntry = &SrbExt->ListEntry; do { @@ -2177,17 +2180,36 @@ __BlkifRingQueueSrb( if (__BlkifRingTryAcquireLock(BlkifRing)) __BlkifRingReleaseLock(BlkifRing); + + return TRUE; + +fail1: + Error("fail1\n"); + + SrbExt->Srb->SrbStatus = SRB_STATUS_BUSY; + return FALSE; } -static VOID +static BOOLEAN __BlkifRingQueueShutdown( IN PXENVBD_BLKIF_RING BlkifRing, IN PXENVBD_SRBEXT SrbExt ) { + if (!BlkifRing->Enabled) + goto fail1; + __BlkifRingAcquireLock(BlkifRing); InsertTailList(&BlkifRing->ShutdownQueue, &SrbExt->ListEntry); __BlkifRingReleaseLock(BlkifRing); + + return TRUE; + +fail1: + Error("fail1\n"); + + SrbExt->Srb->SrbStatus = SRB_STATUS_BUSY; + return FALSE; } static DECLSPEC_NOINLINE VOID @@ -2616,12 +2638,10 @@ RingQueueRequest( BlkifRing = __RingGetBlkifRing(Ring, Srb->QueueTag); ASSERT(BlkifRing != NULL); - __BlkifRingQueueSrb(BlkifRing, SrbExt); - - return TRUE; + return __BlkifRingQueueSrb(BlkifRing, SrbExt); } -VOID +BOOLEAN RingQueueShutdown( IN PXENVBD_RING Ring, IN PXENVBD_SRBEXT SrbExt @@ -2633,5 +2653,5 @@ RingQueueShutdown( BlkifRing = __RingGetBlkifRing(Ring, Srb->QueueTag); ASSERT(BlkifRing != NULL); - __BlkifRingQueueShutdown(BlkifRing, SrbExt); + return __BlkifRingQueueShutdown(BlkifRing, SrbExt); } diff --git a/src/xenvbd/ring.h b/src/xenvbd/ring.h index e3309e2..81c2644 100644 --- a/src/xenvbd/ring.h +++ b/src/xenvbd/ring.h @@ -80,7 +80,7 @@ RingQueueRequest( IN PXENVBD_SRBEXT SrbExt ); -extern VOID +extern BOOLEAN RingQueueShutdown( IN PXENVBD_RING Ring, IN PXENVBD_SRBEXT SrbExt diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c index 176cbbe..e322949 100644 --- a/src/xenvbd/target.c +++ b/src/xenvbd/target.c @@ -973,22 +973,22 @@ TargetReset( Verbose("[%u] <=====\n", TargetGetTargetId(Target)); } -VOID +BOOLEAN TargetFlush( IN PXENVBD_TARGET Target, IN PXENVBD_SRBEXT SrbExt ) { - RingQueueShutdown(FrontendGetRing(Target->Frontend), SrbExt); + return RingQueueShutdown(FrontendGetRing(Target->Frontend), SrbExt); } -VOID +BOOLEAN TargetShutdown( IN PXENVBD_TARGET Target, IN PXENVBD_SRBEXT SrbExt ) { - RingQueueShutdown(FrontendGetRing(Target->Frontend), SrbExt); + return RingQueueShutdown(FrontendGetRing(Target->Frontend), SrbExt); } VOID diff --git a/src/xenvbd/target.h b/src/xenvbd/target.h index dd360f5..cbd0ba4 100644 --- a/src/xenvbd/target.h +++ b/src/xenvbd/target.h @@ -110,13 +110,13 @@ TargetReset( IN PXENVBD_TARGET Target ); -extern VOID +extern BOOLEAN TargetFlush( IN PXENVBD_TARGET Target, IN PXENVBD_SRBEXT SrbExt ); -extern VOID +extern BOOLEAN TargetShutdown( IN PXENVBD_TARGET Target, IN PXENVBD_SRBEXT SrbExt