VirtualBox

Changeset 64221 in vbox


Ignore:
Timestamp:
Oct 12, 2016 12:38:21 PM (8 years ago)
Author:
vboxsync
Message:

DrvSCSI: Fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DrvSCSI.cpp

    r64157 r64221  
    206206    void *pvIoReqAlloc;
    207207    int rc = pThis->pDrvMediaEx->pfnIoReqAlloc(pThis->pDrvMediaEx, &hIoReq, &pvIoReqAlloc, u64Tag,
    208                                                PDMIMEDIAEX_F_DEFAULT);
     208                                               PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR);
    209209    if (RT_SUCCESS(rc))
    210210    {
     
    454454
    455455    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);
    457457    VSCSIIOREQTXDIR enmTxDir = VSCSIIoReqTxDirGet(hVScsiIoReq);
    458458
     
    600600                                                   void *pvIoReqAlloc, PDMMEDIAEXIOREQSTATE enmState)
    601601{
    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);
    604624}
    605625
     
    852872    RT_NOREF1(pInterface);
    853873    PDRVSCSIREQ pReq = (PDRVSCSIREQ)hIoReq;
    854 
    855     if (pReq->pvBuf)
    856         RTMemFree(pReq->pvBuf);
    857874
    858875    RTMemFree(pReq);
     
    10281045
    10291046    /* Sync buffers. */
    1030     if (   pReq->cbBuf
     1047    if (   RT_SUCCESS(rcReq)
     1048        && pReq->cbBuf
    10311049        && (   pReq->enmXferDir == PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN
    10321050            || pReq->enmXferDir == PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE))
     
    10381056        if (RT_FAILURE(rcCopy))
    10391057            rcReq = rcCopy;
     1058    }
     1059
     1060    if (pReq->pvBuf)
     1061    {
     1062        RTMemFree(pReq->pvBuf);
     1063        pReq->pvBuf = NULL;
    10401064    }
    10411065
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette