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:
Trace("<==== %u\n", BlkifRing->Index);
}
-static VOID
+static BOOLEAN
__BlkifRingQueueSrb(
IN PXENVBD_BLKIF_RING BlkifRing,
IN PXENVBD_SRBEXT SrbExt
ULONG_PTR LockBit;
ULONG_PTR New;
+ if (!BlkifRing->Enabled)
+ goto fail1;
+
ListEntry = &SrbExt->ListEntry;
do {
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
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
BlkifRing = __RingGetBlkifRing(Ring, Srb->QueueTag);
ASSERT(BlkifRing != NULL);
- __BlkifRingQueueShutdown(BlkifRing, SrbExt);
+ return __BlkifRingQueueShutdown(BlkifRing, SrbExt);
}
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