|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 6/8] Prepare calls only need to return success/failure, not an error code
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvbd/pdo.c | 260 ++++++++++++++++++++++++++-----------------------------
1 file changed, 124 insertions(+), 136 deletions(-)
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 4e88302..5023a93 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -869,7 +869,7 @@ RequestCopyOutput(
}
}
-static NTSTATUS
+static BOOLEAN
PrepareSegment(
IN PXENVBD_PDO Pdo,
IN PXENVBD_SEGMENT Segment,
@@ -880,7 +880,7 @@ PrepareSegment(
)
{
PFN_NUMBER Pfn;
- NTSTATUS Status = STATUS_UNSUCCESSFUL;
+ NTSTATUS Status;
PXENVBD_GRANTER Granter = FrontendGetGranter(Pdo->Frontend);
const ULONG SectorSize = PdoSectorSize(Pdo);
const ULONG SectorsPerPage = __SectorsPerPage(SectorSize);
@@ -908,13 +908,13 @@ PrepareSegment(
// map SGList to Virtual Address. Populates Segment->Buffer and
Segment->Length
if (!MapSegmentBuffer(Pdo, Segment, SGList, SectorSize, *SectorsNow)) {
++Pdo->FailedMaps;
- goto fail;
+ goto fail1;
}
// get a buffer
if (!BufferGet(Segment, &Segment->BufferId, &Pfn)) {
++Pdo->FailedBounces;
- goto fail;
+ goto fail2;
}
// copy contents in
@@ -927,16 +927,18 @@ PrepareSegment(
Status = GranterGet(Granter, Pfn, ReadOnly, &Segment->Grant);
if (!NT_SUCCESS(Status)) {
++Pdo->FailedGrants;
- goto fail;
+ goto fail3;
}
- return STATUS_SUCCESS;
+ return TRUE;
-fail:
- return Status;
+fail3:
+fail2:
+fail1:
+ return FALSE;
}
-static NTSTATUS
+static BOOLEAN
PrepareBlkifReadWrite(
IN PXENVBD_PDO Pdo,
IN PXENVBD_REQUEST Request,
@@ -947,7 +949,6 @@ PrepareBlkifReadWrite(
OUT PULONG SectorsDone
)
{
- NTSTATUS Status;
UCHAR Operation;
BOOLEAN ReadOnly;
ULONG Index;
@@ -965,20 +966,18 @@ PrepareBlkifReadWrite(
ULONG SectorsNow;
Segment = __LookasideAlloc(&Pdo->SegmentList);
- Status = STATUS_NO_MEMORY;
if (Segment == NULL)
goto fail1;
InsertTailList(&Request->Segments, &Segment->Entry);
++Request->NrSegments;
- Status = PrepareSegment(Pdo,
- Segment,
- SGList,
- ReadOnly,
- SectorsLeft,
- &SectorsNow);
- if (!NT_SUCCESS(Status))
+ if (!PrepareSegment(Pdo,
+ Segment,
+ SGList,
+ ReadOnly,
+ SectorsLeft,
+ &SectorsNow))
goto fail2;
*SectorsDone += SectorsNow;
@@ -987,14 +986,14 @@ PrepareBlkifReadWrite(
ASSERT3U(Request->NrSegments, >, 0);
ASSERT3U(Request->NrSegments, <=, MaxSegments);
- return STATUS_SUCCESS;
+ return TRUE;
fail2:
fail1:
- return Status;
+ return FALSE;
}
-static NTSTATUS
+static BOOLEAN
PrepareBlkifIndirect(
IN PXENVBD_PDO Pdo,
IN PXENVBD_REQUEST Request
@@ -1010,8 +1009,6 @@ PrepareBlkifIndirect(
NrSegments < Request->NrSegments;
++Index) {
Request->Pages[Index] = __LookasideAlloc(&Pdo->IndirectList);
-
- status = STATUS_NO_MEMORY;
if (Request->Pages[Index] == NULL)
goto fail1;
@@ -1025,11 +1022,11 @@ PrepareBlkifIndirect(
NrSegments += XENVBD_MAX_SEGMENTS_PER_PAGE;
}
- return STATUS_SUCCESS;
+ return TRUE;
fail2:
fail1:
- return status;
+ return FALSE;
}
static FORCEINLINE ULONG
@@ -1050,130 +1047,148 @@ UseIndirect(
return MaxIndirectSegs;
}
+static FORCEINLINE ULONG
+PdoQueueRequestList(
+ IN PXENVBD_PDO Pdo,
+ IN PLIST_ENTRY List
+ )
+{
+ ULONG Count = 0;
+ for (;;) {
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY Entry;
+
+ Entry = RemoveHeadList(List);
+ if (Entry == List)
+ break;
+
+ ++Count;
+ Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ __PdoIncBlkifOpCount(Pdo, Request);
+ QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
+ }
+ return Count;
+}
+
+static FORCEINLINE VOID
+PdoCancelRequestList(
+ IN PXENVBD_PDO Pdo,
+ IN PLIST_ENTRY List
+ )
+{
+ for (;;) {
+ PXENVBD_REQUEST Request;
+ PLIST_ENTRY Entry;
+
+ Entry = RemoveHeadList(List);
+ if (Entry == List)
+ break;
+
+ Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ __LookasideFree(&Pdo->RequestList, Request);
+ }
+}
+
__checkReturn
-static NTSTATUS
+static BOOLEAN
PrepareReadWrite(
__in PXENVBD_PDO Pdo,
__in PSCSI_REQUEST_BLOCK Srb
)
{
- NTSTATUS Status;
- LIST_ENTRY ReqList;
- XENVBD_SG_LIST SGList;
PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
ULONG64 SectorStart = Cdb_LogicalBlock(Srb);
ULONG SectorsLeft = Cdb_TransferBlock(Srb);
+ LIST_ENTRY List;
+ XENVBD_SG_LIST SGList;
- InitializeListHead(&ReqList);
- RtlZeroMemory(&SGList, sizeof(SGList));
- SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
-
+ InitializeListHead(&List);
SrbExt->Count = 0;
- // mark the SRB as pending, completion will check for pending to detect
failures
Srb->SrbStatus = SRB_STATUS_PENDING;
+ RtlZeroMemory(&SGList, sizeof(SGList));
+ SGList.SGList = StorPortGetScatterGatherList(PdoGetFdo(Pdo), Srb);
+
while (SectorsLeft > 0) {
ULONG MaxSegments;
ULONG SectorsDone = 0;
- PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
+ PXENVBD_REQUEST Request;
- Status = STATUS_NO_MEMORY;
+ Request = __LookasideAlloc(&Pdo->RequestList);
if (Request == NULL)
- goto fail;
+ goto fail1;
+ InsertTailList(&List, &Request->Entry);
Request->Srb = Srb;
Request->Id = PdoGetTag(Pdo);
InitializeListHead(&Request->Segments);
- InsertTailList(&ReqList, &Request->Entry);
MaxSegments = UseIndirect(Pdo, SectorsLeft);
- Status = PrepareBlkifReadWrite(Pdo,
- Request,
- &SGList,
- MaxSegments,
- SectorStart,
- SectorsLeft,
- &SectorsDone);
- if (!NT_SUCCESS(Status))
- goto fail;
+ if (!PrepareBlkifReadWrite(Pdo,
+ Request,
+ &SGList,
+ MaxSegments,
+ SectorStart,
+ SectorsLeft,
+ &SectorsDone))
+ goto fail2;
if (MaxSegments > BLKIF_MAX_SEGMENTS_PER_REQUEST) {
- Status = PrepareBlkifIndirect(Pdo,
- Request);
- if (!NT_SUCCESS(Status))
- goto fail;
+ if (!PrepareBlkifIndirect(Pdo, Request))
+ goto fail3;
}
SectorsLeft -= SectorsDone;
SectorStart += SectorsDone;
}
- // completed preparing SRB, move requests to pending queue
- for (;;) {
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
-
- Entry = RemoveHeadList(&ReqList);
- if (Entry == &ReqList)
- break;
-
- ++SrbExt->Count;
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
-
- __PdoIncBlkifOpCount(Pdo, Request);
- QueueAppend(&Pdo->PreparedReqs, Entry);
- }
- return STATUS_SUCCESS;
-
-fail:
- for (;;) {
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
-
- Entry = RemoveHeadList(&ReqList);
- if (Entry == &ReqList)
- break;
-
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
+ SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+ return TRUE;
- RequestCleanup(Pdo, Request);
- __LookasideFree(&Pdo->RequestList, Request);
- }
- ASSERT3S(SrbExt->Count, ==, 0);
- ASSERT(!NT_SUCCESS(Status));
- return Status;
+fail3:
+fail2:
+fail1:
+ PdoCancelRequestList(Pdo, &List);
+ return FALSE;
}
__checkReturn
-static NTSTATUS
+static BOOLEAN
PrepareSyncCache(
__in PXENVBD_PDO Pdo,
__in PSCSI_REQUEST_BLOCK Srb
)
{
- PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
- PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
- if (Request == NULL)
- return STATUS_UNSUCCESSFUL;
+ PXENVBD_SRBEXT SrbExt = GetSrbExt(Srb);
+ PXENVBD_REQUEST Request;
+ LIST_ENTRY List;
- SrbExt->Count = 1;
- // mark the SRB as pending, completion will check for pending to detect
failures
+ InitializeListHead(&List);
+ SrbExt->Count = 0;
Srb->SrbStatus = SRB_STATUS_PENDING;
+ Request = __LookasideAlloc(&Pdo->RequestList);
+ if (Request == NULL)
+ goto fail1;
+ InsertTailList(&List, &Request->Entry);
+
Request->Srb = Srb;
Request->Id = PdoGetTag(Pdo);
Request->Operation = BLKIF_OP_WRITE_BARRIER;
Request->FirstSector = Cdb_LogicalBlock(Srb);
InitializeListHead(&Request->Segments);
- __PdoIncBlkifOpCount(Pdo, Request);
- QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
- return STATUS_SUCCESS;
+ SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+ return TRUE;
+
+fail1:
+ PdoCancelRequestList(Pdo, &List);
+ return FALSE;
}
__checkReturn
-static NTSTATUS
+static BOOLEAN
PrepareUnmap(
__in PXENVBD_PDO Pdo,
__in PSCSI_REQUEST_BLOCK Srb
@@ -1192,11 +1207,11 @@ PrepareUnmap(
for (Index = 0; Index < Count; ++Index) {
PUNMAP_BLOCK_DESCRIPTOR Descr = &Unmap->Descriptors[Index];
- PXENVBD_REQUEST Request = __LookasideAlloc(&Pdo->RequestList);
+ PXENVBD_REQUEST Request;
+
+ Request = __LookasideAlloc(&Pdo->RequestList);
if (Request == NULL)
goto fail1;
-
- ++SrbExt->Count;
InsertTailList(&List, &Request->Entry);
Request->Srb = Srb;
@@ -1208,36 +1223,12 @@ PrepareUnmap(
InitializeListHead(&Request->Segments);
}
- for (;;) {
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
-
- Entry = RemoveHeadList(&List);
- if (Entry == &List)
- break;
-
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- __PdoIncBlkifOpCount(Pdo, Request);
- QueueAppend(&Pdo->PreparedReqs, &Request->Entry);
- }
-
- return STATUS_SUCCESS;
-
+ SrbExt->Count = PdoQueueRequestList(Pdo, &List);
+ return TRUE;
fail1:
- for (;;) {
- PXENVBD_REQUEST Request;
- PLIST_ENTRY Entry;
-
- Entry = RemoveHeadList(&List);
- if (Entry == &List)
- break;
-
- Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
- __LookasideFree(&Pdo->RequestList, Request);
- --SrbExt->Count;
- }
- return STATUS_NO_MEMORY;
+ PdoCancelRequestList(Pdo, &List);
+ return FALSE;
}
//=============================================================================
@@ -1329,10 +1320,9 @@ __PdoUnpauseDataPath(
static FORCEINLINE BOOLEAN
PdoPrepareFresh(
- __in PXENVBD_PDO Pdo
+ IN PXENVBD_PDO Pdo
)
{
- NTSTATUS Status;
PXENVBD_SRBEXT SrbExt;
PLIST_ENTRY Entry;
@@ -1345,23 +1335,21 @@ PdoPrepareFresh(
switch (Cdb_OperationEx(SrbExt->Srb)) {
case SCSIOP_READ:
case SCSIOP_WRITE:
- Status = PrepareReadWrite(Pdo, SrbExt->Srb);
+ if (PrepareReadWrite(Pdo, SrbExt->Srb))
+ return TRUE; // prepared this SRB
break;
case SCSIOP_SYNCHRONIZE_CACHE:
- Status = PrepareSyncCache(Pdo, SrbExt->Srb);
+ if (PrepareSyncCache(Pdo, SrbExt->Srb))
+ return TRUE; // prepared this SRB
break;
case SCSIOP_UNMAP:
- Status = PrepareUnmap(Pdo, SrbExt->Srb);
+ if (PrepareUnmap(Pdo, SrbExt->Srb))
+ return TRUE; // prepared this SRB
break;
default:
ASSERT(FALSE);
- Status = STATUS_NOT_SUPPORTED;
break;
}
-
- if (NT_SUCCESS(Status))
- return TRUE; // prepared this SRB
-
QueueUnPop(&Pdo->FreshSrbs, &SrbExt->Entry);
return FALSE; // prepare failed
}
--
1.9.4.msysgit.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |