Changeset 64221 in vbox
- Timestamp:
- Oct 12, 2016 12:38:21 PM (8 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Storage/DrvSCSI.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
r64157 r64221 206 206 void *pvIoReqAlloc; 207 207 int rc = pThis->pDrvMediaEx->pfnIoReqAlloc(pThis->pDrvMediaEx, &hIoReq, &pvIoReqAlloc, u64Tag, 208 PDMIMEDIAEX_F_ DEFAULT);208 PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR); 209 209 if (RT_SUCCESS(rc)) 210 210 { … … 454 454 455 455 PDRVSCSI pThis = RT_FROM_MEMBER(pInterface, DRVSCSI, IPortEx); 456 VSCSIIOREQ hVScsiIoReq = (VSCSIIOREQ)((uint8_t *)pvIoReqAlloc + sizeof(PDMMEDIAEXIOREQ));456 VSCSIIOREQ hVScsiIoReq = DRVSCSI_PDMMEDIAEXIOREQ_2_VSCSIIOREQ(pvIoReqAlloc); 457 457 VSCSIIOREQTXDIR enmTxDir = VSCSIIoReqTxDirGet(hVScsiIoReq); 458 458 … … 600 600 void *pvIoReqAlloc, PDMMEDIAEXIOREQSTATE enmState) 601 601 { 602 RT_NOREF4(pInterface, hIoReq, pvIoReqAlloc, enmState); 603 AssertLogRelMsgFailed(("This should not be hit because I/O requests should not be suspended\n")); 602 RT_NOREF2(hIoReq, pvIoReqAlloc); 603 PDRVSCSI pThis = RT_FROM_MEMBER(pInterface, DRVSCSI, IPortEx); 604 605 switch (enmState) 606 { 607 case PDMMEDIAEXIOREQSTATE_SUSPENDED: 608 { 609 /* Make sure the request is not accounted for so the VM can suspend successfully. */ 610 uint32_t cTasksActive = ASMAtomicDecU32(&pThis->StatIoDepth); 611 if (!cTasksActive && pThis->fDummySignal) 612 PDMDrvHlpAsyncNotificationCompleted(pThis->pDrvIns); 613 break; 614 } 615 case PDMMEDIAEXIOREQSTATE_ACTIVE: 616 /* Make sure the request is accounted for so the VM suspends only when the request is complete. */ 617 ASMAtomicIncU32(&pThis->StatIoDepth); 618 break; 619 default: 620 AssertMsgFailed(("Invalid request state given %u\n", enmState)); 621 } 622 623 pThis->pDevMediaExPort->pfnIoReqStateChanged(pThis->pDevMediaExPort, hIoReq, pvIoReqAlloc, enmState); 604 624 } 605 625 … … 852 872 RT_NOREF1(pInterface); 853 873 PDRVSCSIREQ pReq = (PDRVSCSIREQ)hIoReq; 854 855 if (pReq->pvBuf)856 RTMemFree(pReq->pvBuf);857 874 858 875 RTMemFree(pReq); … … 1028 1045 1029 1046 /* Sync buffers. */ 1030 if ( pReq->cbBuf 1047 if ( RT_SUCCESS(rcReq) 1048 && pReq->cbBuf 1031 1049 && ( pReq->enmXferDir == PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN 1032 1050 || pReq->enmXferDir == PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE)) … … 1038 1056 if (RT_FAILURE(rcCopy)) 1039 1057 rcReq = rcCopy; 1058 } 1059 1060 if (pReq->pvBuf) 1061 { 1062 RTMemFree(pReq->pvBuf); 1063 pReq->pvBuf = NULL; 1040 1064 } 1041 1065
Note:
See TracChangeset
for help on using the changeset viewer.

