VirtualBox

Ignore:
Timestamp:
Sep 4, 2019 6:20:28 PM (5 years ago)
Author:
vboxsync
Message:

Devices/Storage: Add two new parameters to PDMIMEDIAEX::pfnIoReqSendScsiCmd to return the amount ofsense data written and the determined transfer direction from parsed CDB, bugref:9440

Location:
trunk/src/VBox/Devices/Storage/VSCSI
Files:
5 edited

Legend:

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

    r80541 r80589  
    6767                SCSIINQUIRYDATA ScsiInquiryReply;
    6868
     69                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    6970                vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3])));
    7071                memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply));
     
    8687             * to return an error.
    8788             */
     89            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    8890            vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U32(&pVScsiReq->pbCDB[6]));
    8991            if (pVScsiReq->cbXfer < 16)
     
    106108        case SCSI_TEST_UNIT_READY:
    107109        {
     110            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    108111            if (   vscsiDeviceLunIsPresent(pVScsiDevice, pVScsiReq->iLun)
    109112                && pVScsiDevice->papVScsiLun[pVScsiReq->iLun]->fReady)
     
    115118        case SCSI_REQUEST_SENSE:
    116119        {
     120            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    117121            vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
    118122
     
    183187    pVScsiDevice->pfnVScsiReqCompleted(pVScsiDevice, pVScsiDevice->pvVScsiDeviceUser,
    184188                                       pVScsiReq->pvVScsiReqUser, rcScsiCode, fRedoPossible,
    185                                        rcReq, pVScsiReq->cbXfer);
     189                                       rcReq, pVScsiReq->cbXfer, pVScsiReq->enmXferDir, pVScsiReq->cbSenseWritten);
    186190
    187191    if (pVScsiReq->pvLun)
     
    411415    pVScsiReq->cbXfer         = 0;
    412416    pVScsiReq->pvLun          = NULL;
     417    pVScsiReq->enmXferDir     = VSCSIXFERDIR_UNKNOWN;
     418    pVScsiReq->cbSenseWritten = 0;
    413419    RTSgBufInit(&pVScsiReq->SgBuf, paSGList, cSGListEntries);
    414420
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h

    r76565 r80589  
    126126    /** Transfer size determined from the CDB. */
    127127    size_t               cbXfer;
     128    /** Number of bytes of sense data written. */
     129    size_t               cbSenseWritten;
     130    /** Transfer direction as indicated by the CDB. */
     131    VSCSIXFERDIR         enmXferDir;
    128132    /** Pointer to the opaque data which may be allocated by the LUN
    129133     * the request is for. */
     
    491495
    492496/**
     497 * Sets the transfer direction for the given request.
     498 *
     499 * @returns nothing.
     500 * @param   pVScsiReq     The SCSI request.
     501 * @param   cbXfer        The transfer size for the request.
     502 */
     503DECLINLINE(void) vscsiReqSetXferDir(PVSCSIREQINT pVScsiReq, VSCSIXFERDIR enmXferDir)
     504{
     505    pVScsiReq->enmXferDir = enmXferDir;
     506}
     507
     508/**
    493509 * Wrapper for the set I/O request allocation size I/O callback.
    494510 *
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp

    r80541 r80589  
    10861086            case SCSI_TEST_UNIT_READY:
    10871087                Assert(!pVScsiLunMmc->Core.fReady); /* Only should get here if LUN isn't ready. */
     1088                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    10881089                rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0x00);
    10891090                break;
     
    10931094                SCSIINQUIRYDATA ScsiInquiryReply;
    10941095
     1096                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    10951097                vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3])));
    10961098                memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply));
     
    11221124                uint8_t aReply[8];
    11231125                memset(aReply, 0, sizeof(aReply));
     1126                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    11241127                vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
    11251128
     
    11441147                bool    fValid = false;
    11451148
     1149                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    11461150                vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
    11471151                memset(aReply, 0, sizeof(aReply));
     
    11761180            {
    11771181                size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
     1182                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    11781183                vscsiReqSetXferSize(pVScsiReq, cbMax);
    11791184                rcReq = vscsiLunMmcModeSense10(pVScsiLunMmc, pVScsiReq, cbMax);
     
    11831188            {
    11841189                uint32_t uLba = scsiBE2H_U32(&pVScsiReq->pbCDB[2]);
     1190
     1191                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    11851192                if (uLba > pVScsiLunMmc->cSectors)
    11861193                    rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
     
    11931200            {
    11941201                /** @todo implement!! */
     1202                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T);
    11951203                vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
    11961204                rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
     
    13941402                uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f;
    13951403
     1404                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    13961405                vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[6]));
    13971406
     
    14251434            {
    14261435                int rc2 = VINF_SUCCESS;
     1436
     1437                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    14271438                switch (pVScsiReq->pbCDB[4] & 3)
    14281439                {
     
    14481459                uint8_t uSubPageCode = pVScsiReq->pbCDB[3];
    14491460
     1461                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    14501462                vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[7]));
    14511463
     
    14871499                        /* Leave the rest 0 */
    14881500
     1501                        vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    14891502                        vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
    14901503                        RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
     
    15151528                fMSF   = (pVScsiReq->pbCDB[1] >> 1) & 1;
    15161529
     1530                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    15171531                vscsiReqSetXferSize(pVScsiReq, cbMax);
    15181532                switch (format)
     
    15371551                size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
    15381552
     1553                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    15391554                vscsiReqSetXferSize(pVScsiReq, cbMax);
    15401555                if (pVScsiReq->pbCDB[1] & 0x1)
     
    15491564                uint8_t aReply[8];
    15501565
     1566                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    15511567                vscsiReqSetXferSize(pVScsiReq, cbMax);
    15521568                scsiH2BE_U16(&aReply[0], 0);
     
    15661582                size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
    15671583
     1584                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    15681585                vscsiReqSetXferSize(pVScsiReq, cbMax);
    15691586                memset(aReply, '\0', sizeof(aReply));
     
    15881605            {
    15891606                size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
     1607
     1608                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    15901609                vscsiReqSetXferSize(pVScsiReq, cbMax);
    15911610                rcReq = vscsiLunMmcReadTrackInformation(pVScsiLunMmc, pVScsiReq, cbMax);
     
    15951614            {
    15961615                size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
     1616
     1617                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    15971618                vscsiReqSetXferSize(pVScsiReq, cbMax);
    15981619                rcReq = vscsiLunMmcGetConfiguration(pVScsiLunMmc, pVScsiReq, cbMax);
     
    16021623            {
    16031624                size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[8]);
     1625
     1626                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    16041627                vscsiReqSetXferSize(pVScsiReq, cbMax);
    16051628                rcReq = vscsiLunMmcReadDvdStructure(pVScsiLunMmc, pVScsiReq, cbMax);
     
    16171640                 __FUNCTION__, uLbaStart, cSectorTransfer));
    16181641
     1642        vscsiReqSetXferDir(pVScsiReq, enmTxDir == VSCSIIOREQTXDIR_WRITE ? VSCSIXFERDIR_I2T : VSCSIXFERDIR_T2I);
    16191643        vscsiReqSetXferSize(pVScsiReq, cSectorTransfer * cbSector);
    16201644        if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunMmc->cSectors))
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp

    r80541 r80589  
    201201        case SCSI_INQUIRY:
    202202        {
     203            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    203204            vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3])));
    204205
     
    252253            memset(aReply, 0, sizeof(aReply));
    253254
     255            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    254256            vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
    255257
     
    274276            bool    fValid = false;
    275277
     278            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    276279            vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
    277280            memset(aReply, 0, sizeof(aReply));
     
    312315            size_t  cbList = pVScsiReq->pbCDB[4];
    313316
     317            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T);
    314318            vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
    315319
     
    405409            uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f;
    406410
     411            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    407412            vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[6]));
    408413
     
    437442        case SCSI_START_STOP_UNIT:
    438443        {
     444            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    439445            vscsiReqSetXferSize(pVScsiReq, 0);
    440446            rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
     
    446452            uint8_t uSubPageCode = pVScsiReq->pbCDB[3];
    447453
     454            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    448455            vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[7]));
    449456
     
    486493                    /* Leave the rest 0 */
    487494
     495                    vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    488496                    vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
    489497                    RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
     
    505513
    506514                /* Copy the header. */
     515                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T);
    507516                vscsiReqSetXferSize(pVScsiReq, cbList);
    508517                cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abHdr[0], sizeof(abHdr));
     
    570579        if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunSbc->cSectors))
    571580        {
     581            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    572582            rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR, 0x00);
    573583            vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
     
    576586        {
    577587            /* A 0 transfer length is not an error. */
     588            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    578589            rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
    579590            vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
     
    587598                rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0x00);
    588599            else
     600            {
     601                vscsiReqSetXferDir(pVScsiReq, enmTxDir == VSCSIIOREQTXDIR_WRITE ? VSCSIXFERDIR_I2T : VSCSIXFERDIR_T2I);
    589602                rc = vscsiIoReqTransferEnqueue(pVScsiLun, pVScsiReq, enmTxDir,
    590603                                               uLbaStart * 512, cSectorTransfer * 512);
     604            }
    591605        }
    592606    }
     
    594608    {
    595609        /* Enqueue flush */
     610        vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
    596611        vscsiReqSetXferSize(pVScsiReq, 0);
    597612        rc = vscsiIoReqFlushEnqueue(pVScsiLun, pVScsiReq);
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp

    r76553 r80589  
    4444
    4545    if (pVScsiReq->pbSense && pVScsiReq->cbSense)
    46         memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense));
     46    {
     47        pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
     48        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
     49    }
    4750
    4851    return SCSI_STATUS_OK;
     
    5962
    6063    if (pVScsiReq->pbSense && pVScsiReq->cbSense)
    61         memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense));
     64    {
     65        pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
     66        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
     67    }
    6268
    6369    return SCSI_STATUS_CHECK_CONDITION;
     
    7581
    7682    if (pVScsiReq->pbSense && pVScsiReq->cbSense)
    77         memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense));
     83    {
     84        pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
     85        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
     86    }
    7887
    7988    return SCSI_STATUS_CHECK_CONDITION;
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