]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Attempt to process responses on the ring
authorOwen Smith <owen.smith@citrix.com>
Thu, 19 Sep 2019 08:24:28 +0000 (09:24 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 19 Sep 2019 08:24:28 +0000 (09:24 +0100)
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 <owen.smith@citrix.com>
src/xenvbd/adapter.c
src/xenvbd/ring.c
src/xenvbd/ring.h
src/xenvbd/target.c
src/xenvbd/target.h

index 79a5a0e50c1d6c22bafe40a432f605df8cf2916c..2d8d65fdb7ca16ccdfb3c835ab69c960d5b196da 100644 (file)
@@ -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:
index 514374c5e4d3dc4efaa771ddd05f7e799052feb9..6edee5c24d7e9366566c3d238746b9c2e3be695e 100644 (file)
@@ -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);
 }
index e3309e25a2b8b80cb7ea2f5a4c5331293a5ce625..81c2644881fae9dcc8054e77f6dcd3d72fd81644 100644 (file)
@@ -80,7 +80,7 @@ RingQueueRequest(
     IN  PXENVBD_SRBEXT  SrbExt
     );
 
-extern VOID
+extern BOOLEAN
 RingQueueShutdown(
     IN  PXENVBD_RING    Ring,
     IN  PXENVBD_SRBEXT  SrbExt
index 176cbbefc798de187da2dafc72887b266b5656f7..e322949f187bbbbca17b70acd4efdbee2ecd5e91 100644 (file)
@@ -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
index dd360f5a42c9c033bfb9941c8ece29e5fdd25ec0..cbd0ba4be278efa1f2ddf0f0c0311654419c8f08 100644 (file)
@@ -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