Index: /trunk/include/VBox/scsi.h
===================================================================
--- /trunk/include/VBox/scsi.h	(revision 80538)
+++ /trunk/include/VBox/scsi.h	(revision 80539)
@@ -317,4 +317,5 @@
 #if defined(IN_RING3) && (defined(LOG_ENABLED) || defined(RT_STRICT))
 const char * SCSICmdText(uint8_t uCmd);
+const char * SCSIStatusText(uint8_t uStatus);
 const char * SCSISenseText(uint8_t uSense);
 const char * SCSISenseExtText(uint8_t uASC, uint8_t uASCQ);
Index: /trunk/src/VBox/Devices/Storage/Debug.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/Debug.cpp	(revision 80538)
+++ /trunk/src/VBox/Devices/Storage/Debug.cpp	(revision 80539)
@@ -575,4 +575,24 @@
     "MISCOMPARE",
     "(reserved)"
+};
+
+static struct
+{
+    uint8_t uStatus;
+    const char * const pszStatusText;
+} g_aSCSIStatusText[]
+=
+{
+    { 0x00, "GOOD" },
+    { 0x02, "CHECK CONDITION" },
+    { 0x04, "CONDITION MET" },
+    { 0x08, "BUSY" },
+    { 0x10, "INTERMEDIATE"},
+    { 0x14, "CONDITION MET" },
+    { 0x18, "RESERVATION CONFLICT" },
+    { 0x22, "COMMAND TERMINATED" },
+    { 0x28, "TASK SET FULL" },
+    { 0x30, "ACA ACTIVE" },
+    { 0x40, "TASK ABORTED" },
 };
 
@@ -937,4 +957,17 @@
 }
 
+const char * SCSIStatusText(uint8_t uStatus)
+{
+    unsigned iIdx;
+
+    /* Linear search. Doesn't hurt as we don't call this function very frequently */
+    for (iIdx = 0; iIdx < RT_ELEMENTS(g_aSCSISenseText); iIdx++)
+    {
+        if (g_aSCSIStatusText[iIdx].uStatus  == uStatus)
+            return g_aSCSIStatusText[iIdx].pszStatusText;
+    }
+    return "(Unknown extended status code)";
+}
+
 /**
  * Return the plain text of an extended SCSI sense key.
Index: /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp	(revision 80538)
+++ /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp	(revision 80539)
@@ -471,5 +471,5 @@
     size_t                         cbPiOut;                  /**< Size of T10 pi in buffer                          */
     uint8_t                       *pbPiOut;                  /**< Address of pi out buffer                          */
-    uint8_t                       *pbDataOut;                /**< dataout */
+    uint8_t                       *pbDataOut;                /**< dataout                                           */
     size_t                         cbPiIn;                   /**< Size of T10 pi buffer                             */
     uint8_t                       *pbPiIn;                   /**< Address of pi in buffer                           */
@@ -480,4 +480,5 @@
     uint8_t                        uStatus;                  /**< SCSI status code                                  */
     PRTSGBUF                       pInSgBuf;                 /**< Buf vector to return PDM result to VirtIO Guest   */
+    PVIRTIOSCSI_REQ_CMD_T          pVirtqReq;                /**< Allocated to receive translated queued req        */
 } VIRTIOSCSIREQ;
 
@@ -524,15 +525,4 @@
         default:                                        return "<unknown>";
     }
-}
-
-DECLINLINE(void) virtioGetControlAsyncMaskText(char *pszOutput, size_t cbOutput, uint32_t uAsyncTypesMask)
-{
-    RTStrPrintf(pszOutput, cbOutput, "%s%s%s%s%s%s",
-        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_OPERATIONAL_CHANGE) ? "CHANGE_OPERATION  "   : "",
-        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_POWER_MGMT)         ? "POWER_MGMT  "         : "",
-        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST)   ? "EXTERNAL_REQ  "       : "",
-        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE)       ? "MEDIA_CHANGE  "       : "",
-        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MULTI_HOST)         ? "MULTI_HOST  "         : "",
-        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY)        ? "DEVICE_BUSY  "        : "");
 }
 
@@ -571,21 +561,13 @@
 }
 
-DECLINLINE(const char *) virtioGetScsiStatusText(uint8_t uScsiStatusCode)
-{
-    switch (uScsiStatusCode)
-    {
-        case 0x00:  return "GOOD";
-        case 0x02:  return "CHECK CONDITION";
-        case 0x04:  return "CONDITION MET";
-        case 0x08:  return "BUSY";
-        case 0x10:  return "INTERMEDIATE";
-        case 0x14:  return "CONDITION MET";
-        case 0x18:  return "RESERVATION CONFLICT";
-        case 0x22:  return "COMMAND TERMINATED";
-        case 0x28:  return "TASK SET FULL";
-        case 0x30:  return "ACA ACTIVE";
-        case 0x40:  return "TASK ABORTED";
-        default:    return "<UNKNOWN CODE>";
-    }
+DECLINLINE(void) virtioGetControlAsyncMaskText(char *pszOutput, size_t cbOutput, uint32_t uAsyncTypesMask)
+{
+    RTStrPrintf(pszOutput, cbOutput, "%s%s%s%s%s%s",
+        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_OPERATIONAL_CHANGE) ? "CHANGE_OPERATION  "   : "",
+        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_POWER_MGMT)         ? "POWER_MGMT  "         : "",
+        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_EXTERNAL_REQUEST)   ? "EXTERNAL_REQ  "       : "",
+        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MEDIA_CHANGE)       ? "MEDIA_CHANGE  "       : "",
+        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_MULTI_HOST)         ? "MULTI_HOST  "         : "",
+        (uAsyncTypesMask & VIRTIOSCSI_EVT_ASYNC_DEVICE_BUSY)        ? "DEVICE_BUSY  "        : "");
 }
 
@@ -837,5 +819,5 @@
 
     LogFunc(("status: %s  response: %s  0x%x%x/0x%x%x  cbXfer=%d, cbResidual: %u\n",
-                virtioGetScsiStatusText(pReq->uStatus),  virtioGetReqRespText(respHdr.uResponse),
+                SCSIStatusText(pReq->uStatus),  virtioGetReqRespText(respHdr.uResponse),
                 pReq->uStatus >> 4 & 0xf, pReq->uStatus & 0xf,
                 respHdr.uResponse >> 4 & 0xf, respHdr.uResponse & 0xf,
@@ -898,4 +880,5 @@
     virtioQueueSync(pThis->hVirtio, pReq->qIdx);
 
+    RTMemFree(pReq->pVirtqReq);
     RTMemFree(pReq->pbSense);
     RTMemFree(pReq->pbDataIn);
@@ -1051,4 +1034,5 @@
         respHdr.uStatusQualifier = 0;
         virtioScsiReqFinish(pThis, qIdx, &respHdr, pbSense);
+        RTMemFree(pVirtqReq);
         return VINF_SUCCESS;
     }
@@ -1070,4 +1054,5 @@
         pReq->pbDataOut = pbDataOut;
         pReq->cbPiIn    = cbPiIn;
+        pReq->pVirtqReq = pVirtqReq;
 
         if (cbPiIn)
@@ -1120,5 +1105,5 @@
             uint8_t pbSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED, 0, SCSI_SENSE_VENDOR_SPECIFIC,
                                   0, 0, 0, 0, 10, uASC, uASCQ, 0 };
-            respHdr.cbSense = sizeof(pbSense);
+            respHdr.cbSense   = sizeof(pbSense);
             respHdr.uResidual = cbDataIn + cbDataOut;
             respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
@@ -1126,4 +1111,9 @@
             respHdr.uStatusQualifier = 0;
             virtioScsiReqFinish(pThis, qIdx, &respHdr,  NULL /* pbSense */);
+            RTMemFree(pVirtqReq);
+            RTMemFree(pReq->pbSense);
+            RTMemFree(pReq->pbDataIn);
+            RTMemFree(pReq->pbPiIn);
+            pIMediaEx->pfnIoReqFree(pIMediaEx, pReq->hIoReq);
             return VINF_SUCCESS;
         }
@@ -1132,5 +1122,5 @@
         uint8_t pbSense[] = { RT_BIT(7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED, 0, SCSI_SENSE_NOT_READY,
                               0, 0, 0, 0, 10, 0, 0, 0 };
-        respHdr.cbSense = sizeof(pbSense);
+        respHdr.cbSense   = sizeof(pbSense);
         respHdr.uResidual = cbDataIn + cbDataOut;
         respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
