[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.