|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 09/26] Move non-queue-srb handling to BuildIo
From: Owen Smith <owen.smith@xxxxxxxxxx>
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/adapter.c | 45 ++++++++++++++++++++----------------
src/xenvbd/target.c | 64 ++++++++++++++++++++++++++++++++--------------------
2 files changed, 65 insertions(+), 44 deletions(-)
diff --git a/src/xenvbd/adapter.c b/src/xenvbd/adapter.c
index e262fe3..53c858f 100644
--- a/src/xenvbd/adapter.c
+++ b/src/xenvbd/adapter.c
@@ -1638,33 +1638,38 @@ AdapterHwStartIo(
PXENVBD_SRBEXT SrbExt = Srb->SrbExtension;
PXENVBD_TARGET Target;
- Srb->SrbStatus = SRB_STATUS_INVALID_TARGET_ID;
Target = AdapterGetTarget(Adapter, Srb->TargetId);
- if (Target) {
- switch (Srb->Function) {
- case SRB_FUNCTION_EXECUTE_SCSI:
- TargetStartSrb(Target, SrbExt);
- break;
+ ASSERT(Target != NULL);
+ if (Target == NULL) {
+ Srb->SrbStatus = SRB_STATUS_INVALID_TARGET_ID;
+ goto complete_srb;
+ }
- case SRB_FUNCTION_RESET_DEVICE:
- TargetReset(Target);
- Srb->SrbStatus = SRB_STATUS_SUCCESS;
- break;
+ ASSERT(Srb->SrbStatus == SRB_STATUS_PENDING);
+ switch (Srb->Function) {
+ case SRB_FUNCTION_EXECUTE_SCSI:
+ TargetStartSrb(Target, SrbExt);
+ break;
- case SRB_FUNCTION_FLUSH:
- TargetFlush(Target, SrbExt);
- break;
+ case SRB_FUNCTION_RESET_DEVICE:
+ TargetReset(Target);
+ Srb->SrbStatus = SRB_STATUS_SUCCESS;
+ break;
- case SRB_FUNCTION_SHUTDOWN:
- TargetShutdown(Target, SrbExt);
- break;
+ case SRB_FUNCTION_FLUSH:
+ TargetFlush(Target, SrbExt);
+ break;
- default:
- Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
- break;
- }
+ case SRB_FUNCTION_SHUTDOWN:
+ TargetShutdown(Target, SrbExt);
+ break;
+
+ default:
+ Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
+ break;
}
+complete_srb:
if (Srb->SrbStatus != SRB_STATUS_PENDING)
AdapterCompleteSrb(Adapter, SrbExt);
diff --git a/src/xenvbd/target.c b/src/xenvbd/target.c
index 49dfc09..c8ff531 100644
--- a/src/xenvbd/target.c
+++ b/src/xenvbd/target.c
@@ -992,19 +992,6 @@ TargetShutdown(
BlockRingKick(Target->BlockRing);
}
-VOID
-TargetPrepareSrb(
- IN PXENVBD_TARGET Target,
- IN PXENVBD_SRBEXT SrbExt
- )
-{
- PSCSI_REQUEST_BLOCK Srb = SrbExt->OriginalReq;
-
- UNREFERENCED_PARAMETER(Target);
-
- Srb->SrbStatus = SRB_STATUS_PENDING;
-}
-
static FORCEINLINE VOID
TargetQueueSrb(
IN PXENVBD_TARGET Target,
@@ -1371,7 +1358,7 @@ TargetCheckSectors(
}
VOID
-TargetStartSrb(
+TargetPrepareSrb(
IN PXENVBD_TARGET Target,
IN PXENVBD_SRBEXT SrbExt
)
@@ -1383,24 +1370,27 @@ TargetStartSrb(
switch (Operation) {
case SCSIOP_READ:
case SCSIOP_WRITE:
- if (!TargetCheckSectors(Target, SrbExt))
- Srb->SrbStatus = SRB_STATUS_ERROR;
- else
- TargetQueueSrb(Target, SrbExt);
+ Srb->SrbStatus = SRB_STATUS_PENDING;
+ if (TargetCheckSectors(Target, SrbExt))
+ break;
+ // Sectors out of range, fail SRB
+ Srb->SrbStatus = SRB_STATUS_ERROR;
break;
case SCSIOP_UNMAP:
+ Srb->SrbStatus = SRB_STATUS_PENDING;
if (Target->FeatureDiscard)
- TargetQueueSrb(Target, SrbExt);
- else
- Srb->SrbStatus = SRB_STATUS_SUCCESS;
+ break;
+ // Discard not supported, just succeed SRB
+ Srb->SrbStatus = SRB_STATUS_SUCCESS;
break;
case SCSIOP_SYNCHRONIZE_CACHE:
+ Srb->SrbStatus = SRB_STATUS_PENDING;
if (Target->FeatureBarrier || Target->FeatureFlush)
- TargetQueueSrb(Target, SrbExt);
- else
- Srb->SrbStatus = SRB_STATUS_SUCCESS;
+ break;
+ // Barrier and Flush not supported, just succeed SRB
+ Srb->SrbStatus = SRB_STATUS_SUCCESS;
break;
case SCSIOP_INQUIRY:
@@ -1440,6 +1430,32 @@ TargetStartSrb(
}
}
+VOID
+TargetStartSrb(
+ IN PXENVBD_TARGET Target,
+ IN PXENVBD_SRBEXT SrbExt
+ )
+{
+ PSCSI_REQUEST_BLOCK Srb = SrbExt->OriginalReq;
+ UCHAR Operation;
+
+ Operation = Cdb_OperationEx(Srb);
+ switch (Operation) {
+ case SCSIOP_READ:
+ case SCSIOP_WRITE:
+ case SCSIOP_UNMAP:
+ case SCSIOP_SYNCHRONIZE_CACHE:
+ ASSERT(Srb->SrbStatus == SRB_STATUS_PENDING);
+ TargetQueueSrb(Target, SrbExt);
+ break;
+
+ default:
+ // BuildIo should complete non-queue-worthy SRBs
+ Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
+ break;
+ }
+}
+
static VOID
TargetStoreReadDiskInfo(
IN PXENVBD_TARGET Target
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |