Index: /trunk/include/VBox/scsi.h
===================================================================
--- /trunk/include/VBox/scsi.h	(revision 80527)
+++ /trunk/include/VBox/scsi.h	(revision 80528)
@@ -219,4 +219,5 @@
 #define SCSI_ASC_MEDIUM_NOT_PRESENT                         0x3a
 #define SCSI_ASC_SAVING_PARAMETERS_NOT_SUPPORTED            0x39
+#define SCSI_ASC_INTERNAL_TARGET_FAILURE                    0x44
 #define SCSI_ASC_INVALID_MESSAGE                            0x49
 #define SCSI_ASC_MEDIA_LOAD_OR_EJECT_FAILED                 0x53
@@ -224,4 +225,5 @@
 #define SCSI_ASC_SYSTEM_RESOURCE_FAILURE                    0x55
 #define SCSI_ASC_ILLEGAL_MODE_FOR_THIS_TRACK                0x64
+#define SCSI_ASC_COMMAND_TO_LOGICAL_UNIT_FAILED             0x6E
 
 /** Additional sense code qualifiers (ASCQ). */
Index: /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp	(revision 80527)
+++ /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp	(revision 80528)
@@ -513,15 +513,15 @@
         }
         for (int j = 0; j < 16; j++ ) {
-	        if (i * 16 + j >= cb)
+            if (i * 16 + j >= cb)
                 Log2((" "));
-	        else
-	        {
-	            uint8_t u8 = pv[i * 16 + j];
+            else
+            {
+                uint8_t u8 = pv[i * 16 + j];
                 Log2(("%c", u8 >= 0x20 && u8 <= 0x7e ? u8 : '.'));
             }
-	    }
+        }
         Log2(("\n"));
-   }
-   Log2(("\n"));
+    }
+    Log2(("\n"));
 }
 DECLINLINE(const char *) virtioGetTMFTypeText(uint32_t uSubType)
@@ -590,16 +590,16 @@
     switch (uScsiStatusCode)
     {
-        case 0x00:  return "Good";
-        case 0x02:  return "Check Condition";
-        case 0x04:  return "Condition Met";
-        case 0x08:  return "Busy";
-        case 0x10:  return "Intermediate (obsolete)";
-        case 0x14:  return "Condition Met (obsolete)";
-        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>";
+        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>";
     }
 }
@@ -732,4 +732,6 @@
 
     /** DrvSCSI.cpp, that issues this callback, just sticks one segment in the buffer */
+//    memset(pReq->pbDataIn + offDst, 0, cbCopy);
+LogFunc(("*** pSgBuf->cbSegLeft=%d\n", pSgBuf->cbSegLeft));
     memcpy(pReq->pbDataIn + offDst, pSgBuf->paSegs[0].pvSeg, cbCopy);
     return VINF_SUCCESS;
@@ -749,4 +751,5 @@
     PVIRTIOSCSIREQ pReq = (PVIRTIOSCSIREQ)pvIoReqAlloc;
     /** DrvSCSI.cpp, that issues this callback, just sticks one segment in the buffer */
+
     memcpy(pSgBuf->paSegs[0].pvSeg, pReq->pbDataOut + offSrc, cbCopy);
 
@@ -828,7 +831,10 @@
     ASMAtomicDecU32(&pTarget->cReqsInProgress);
 
-    size_t cbResidual = 0;
+    size_t cbResidual = 0, cbXfer = 0;
     int rc = pIMediaEx->pfnIoReqQueryResidual(pIMediaEx, pReq->hIoReq, &cbResidual);
-    AssertRC(rc); Assert(cbResidual == (uint32_t)cbResidual);
+    AssertRC(rc);
+
+    rc = pIMediaEx->pfnIoReqQueryXferSize(pIMediaEx, pReq->hIoReq, &cbXfer);
+    AssertRC(rc);
 
     /**
@@ -845,12 +851,12 @@
     respHdr.uStatusQualifier = 0;
 
-    LogFunc(("Status: %s (0x%x%x)      Response: %s (0x%x%x)\n",
-                virtioGetScsiStatusText(pReq->uStatus), pReq->uStatus >> 4 & 0xf, pReq->uStatus & 0xf,
-                virtioGetReqRespText(respHdr.uResponse), respHdr.uResponse >> 4 & 0xf, respHdr.uResponse & 0xf));
+    LogFunc(("status: %s  response: %s  0x%x%x/0x%x%x  cbXfer=%d, cbResidual: %u\n",
+                virtioGetScsiStatusText(pReq->uStatus),  virtioGetReqRespText(respHdr.uResponse),
+                pReq->uStatus >> 4 & 0xf, pReq->uStatus & 0xf,
+                respHdr.uResponse >> 4 & 0xf, respHdr.uResponse & 0xf,
+                cbXfer, cbResidual));
 
     if (pReq->cbSense)
     {
-    pReq->pbSense[12] = 0x25;
-    pReq->pbSense[13] = 0x00;
         Log2Func(("Sense: %s\n", SCSISenseText(pReq->pbSense[2])));
         Log2Func(("Sense Ext3: %s\n", SCSISenseExtText(pReq->pbSense[12], pReq->pbSense[13])));
@@ -986,5 +992,5 @@
     uint32_t uLUN = (pVirtqReq->cmdHdr.uLUN[2] << 8 | pVirtqReq->cmdHdr.uLUN[3]) & 0x3fff;
 
-    LogFunc(("[%s]%*s (Target: %d LUN: %d)  CDB: %.*Rhxs\n",
+    LogFunc(("[%s] (Target: %d LUN: %d)  CDB: %.*Rhxs\n",
          SCSICmdText(pbCdb[0]), uTarget, uLUN,
             virtioScsiEstimateCdbLen(pbCdb[0], pThis->virtioScsiConfig.uCdbSize), pbCdb));
@@ -992,5 +998,4 @@
     Log3Func(("   id: %RX64, attr: %x, prio: %d, crn: %x\n",
         pVirtqReq->cmdHdr.uId, pVirtqReq->cmdHdr.uTaskAttr, pVirtqReq->cmdHdr.uPrio, pVirtqReq->cmdHdr.uCrn));
-
 
     off_t    uPiOutOff = 0;
@@ -1080,4 +1085,5 @@
         pReq->pbDataOut = pbDataOut;
         pReq->cbPiIn    = cbPiIn;
+
         if (cbPiIn)
         {
@@ -1109,10 +1115,28 @@
         if (rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)
         {
+            /**
+             * This rc value from DrvSCSI/send SCSI cmd means the request failed early
+             * (no mem, buf copy callback, request buffer creation, or req enqueue),
+             * and not submitted to lower layers, error it out.
+             */
+            LogRel(("Error submitting request!\n"));
             size_t cbResidual;
             pIMediaEx->pfnIoReqQueryResidual(pIMediaEx, pReq->hIoReq, &cbResidual);
-            respHdr.cbSense = 0;
-            respHdr.uResidual = (uint32_t)cbResidual;
-            respHdr.uStatus   = SCSI_STATUS_OK;
-            respHdr.uResponse = VIRTIOSCSI_S_OK;
+            uint8_t uASC, uASCQ = 0;
+            switch (rc)
+            {
+                case VERR_NO_MEMORY:
+                    uASC = SCSI_ASC_SYSTEM_RESOURCE_FAILURE;
+                    break;
+                default:
+                    uASC = SCSI_ASC_INTERNAL_TARGET_FAILURE;
+                    break;
+            }
+            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.uResidual = cbDataIn + cbDataOut;
+            respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
+            respHdr.uResponse = VIRTIOSCSI_S_FAILURE;
             respHdr.uStatusQualifier = 0;
             virtioScsiReqFinish(pThis, qIdx, &respHdr,  NULL /* pbSense */);
@@ -1120,12 +1144,14 @@
         }
     } else {
-        respHdr.cbSense = 0;
-        respHdr.uResidual = cbDataOut + cbDataIn;
-        respHdr.uStatus   = SCSI_STATUS_OK;
+        LogRel(("Error submitting request, target not present!!\n"));
+        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.uResidual = cbDataIn + cbDataOut;
+        respHdr.uStatus   = SCSI_STATUS_CHECK_CONDITION;
         respHdr.uResponse = VIRTIOSCSI_S_TARGET_FAILURE;
         respHdr.uStatusQualifier = 0;
-        virtioScsiReqFinish(pThis, qIdx, &respHdr, NULL /* pbSense */);
+        virtioScsiReqFinish(pThis, qIdx, &respHdr,  NULL /* pbSense */);
         return VINF_SUCCESS;
-
     }
 
Index: /trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp
===================================================================
--- /trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp	(revision 80527)
+++ /trunk/src/VBox/Devices/VirtIO/Virtio_1_0.cpp	(revision 80528)
@@ -826,5 +826,5 @@
     {
         pVirtio->uISR = *(uint8_t *)pv;
-        Log2Func(("Setting uISR = 0x%02x (virtq interrupt: %d, dev confg interrupt: %d)\n",
+        Log3Func(("Setting uISR = 0x%02x (virtq interrupt: %d, dev confg interrupt: %d)\n",
               pVirtio->uISR & 0xff,
               pVirtio->uISR & VIRTIO_ISR_VIRTQ_INTERRUPT,
