VirtualBox

Changeset 65078 in vbox


Ignore:
Timestamp:
Jan 3, 2017 1:24:58 PM (8 years ago)
Author:
vboxsync
Message:

Devices/Storage/DrvHost*: Avoid using SCSI_MAX_BUFFER_SIZE (will be removed in the future) but query the maximum supported buffer size through a dedicated method from the platform specific code

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/scsi.h

    r65069 r65078  
    2929#include <iprt/assert.h>
    3030
     31/**
     32 * @todo: Remove when the splitting code was removed from DevATA.
     33 *        The limit doesn't belong here but is specific for each host platform.
     34 */
    3135#ifdef RT_OS_FREEBSD
    3236/* The cam subsystem doesn't allow more */
  • trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp

    r64316 r65078  
    2626#include <mach/mach_error.h>
    2727#include <VBox/scsi.h>
     28
     29/** Maximum buffer size we support, check whether darwin has some real upper limit. */
     30#define DARWIN_SCSI_MAX_BUFFER_SIZE (100 * _1K)
    2831
    2932/**
     
    322325
    323326
     327DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
     328{
     329    RT_NOREF(pThis);
     330
     331    return DARWIN_SCSI_MAX_BUFFER_SIZE;
     332}
     333
     334
    324335DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
    325336{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp

    r64316 r65078  
    2727#include <iprt/log.h>
    2828
     29/** Maximum buffer size supported by the CAM subsystem. */
     30#define FBSD_SCSI_MAX_BUFFER_SIZE (64 * _1K)
     31
    2932/**
    3033 * Host backend specific data.
     
    149152
    150153
     154DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
     155{
     156    RT_NOREF(pThis);
     157
     158    return FBSD_SCSI_MAX_BUFFER_SIZE;
     159}
     160
     161
    151162DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
    152163{
     
    194205            const uint32_t  LBA       = off / pThis->Os.cbBlock;
    195206            AssertReturn(!(off % pThis->Os.cbBlock), VERR_INVALID_PARAMETER);
    196             uint32_t        cbRead32  =   cbRead > SCSI_MAX_BUFFER_SIZE
    197                                         ? SCSI_MAX_BUFFER_SIZE
     207            uint32_t        cbRead32  =   cbRead > FBSD_SCSI_MAX_BUFFER_SIZE
     208                                        ? FBSD_SCSI_MAX_BUFFER_SIZE
    198209                                        : (uint32_t)cbRead;
    199210            const uint32_t  cBlocks   = cbRead32 / pThis->Os.cbBlock;
  • trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp

    r64316 r65078  
    3939#include <VBox/scsi.h>
    4040
     41/** Maximum buffer size supported by the kernel interface. */
     42#define LNX_SCSI_MAX_BUFFER_SIZE (100 * _1K)
     43
    4144/**
    4245 * Host backend specific data.
     
    7578    if(RT_UNLIKELY(!pThis->Os.pbDoubleBuffer))
    7679    {
    77         pThis->Os.pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
     80        pThis->Os.pbDoubleBuffer = (uint8_t *)RTMemAlloc(LNX_SCSI_MAX_BUFFER_SIZE);
    7881        if (!pThis->Os.pbDoubleBuffer)
    7982            return VERR_NO_MEMORY;
     
    9295        case PDMMEDIATXDIR_FROM_DEVICE:
    9396            Assert(*pcbBuf != 0);
    94             Assert(*pcbBuf <= SCSI_MAX_BUFFER_SIZE);
     97            Assert(*pcbBuf <= LNX_SCSI_MAX_BUFFER_SIZE);
    9598            /* Make sure that the buffer is clear for commands reading
    9699             * data. The actually received data may be shorter than what
     
    105108        case PDMMEDIATXDIR_TO_DEVICE:
    106109            Assert(*pcbBuf != 0);
    107             Assert(*pcbBuf <= SCSI_MAX_BUFFER_SIZE);
     110            Assert(*pcbBuf <= LNX_SCSI_MAX_BUFFER_SIZE);
    108111            memcpy(pThis->Os.pbDoubleBuffer, pvBuf, *pcbBuf);
    109112            direction = CGC_DATA_WRITE;
     
    154157}
    155158
     159
     160DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
     161{
     162    RT_NOREF(pThis);
     163
     164    return LNX_SCSI_MAX_BUFFER_SIZE;
     165}
     166
     167
    156168DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
    157169{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp

    r64317 r65078  
    3333
    3434#include <iprt/file.h>
     35
     36/** Maximum buffer size we support, check whether darwin has some real upper limit. */
     37#define SOL_SCSI_MAX_BUFFER_SIZE (100 * _1K)
    3538
    3639/**
     
    203206}
    204207
     208
     209DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
     210{
     211    RT_NOREF(pThis);
     212
     213    return SOL_SCSI_MAX_BUFFER_SIZE;
     214}
     215
     216
    205217DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
    206218{
  • trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp

    r64318 r65078  
    8080#include <iprt/file.h>
    8181#include <VBox/scsi.h>
     82
     83/** Maximum buffer size we support, check whether darwin has some real upper limit. */
     84#define SOL_SCSI_MAX_BUFFER_SIZE (100 * _1K)
    8285
    8386/**
     
    305308    return rc;
    306309}
     310
     311
     312DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
     313{
     314    RT_NOREF(pThis);
     315
     316    return WIN_SCSI_MAX_BUFFER_SIZE;
     317}
     318
    307319
    308320DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
  • trunk/src/VBox/Devices/Storage/DrvHostBase.h

    r64839 r65078  
    167167DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
    168168                                     void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies);
     169DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis);
    169170DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb);
    170171DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead);
  • trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp

    r65061 r65078  
    555555    size_t cbXfer = 0;
    556556    size_t cbSector = 0;
     557    size_t cbScsiCmdBufLimit = drvHostBaseScsiCmdGetBufLimitOs(&pThis->Core);
    557558    bool fPassthrough = drvHostDvdParseCdb(pThis, pReq, pbCdb, cbCdb, cbBuf,
    558559                                           &enmXferDir, &cbXfer, &cbSector, pu8ScsiSts);
     
    568569            rc = drvHostBaseBufferRetain(&pThis->Core, pReq, cbXfer, enmXferDir == PDMMEDIATXDIR_TO_DEVICE, &pvBuf);
    569570
    570         if (cbXfer > SCSI_MAX_BUFFER_SIZE)
     571        if (cbXfer > cbScsiCmdBufLimit)
    571572        {
    572573            /* Linux accepts commands with up to 100KB of data, but expects
     
    610611            for (uint32_t i = cSectors; i > 0; i -= cReqSectors)
    611612            {
    612                 if (i * cbSector > SCSI_MAX_BUFFER_SIZE)
    613                     cReqSectors = SCSI_MAX_BUFFER_SIZE / (uint32_t)cbSector;
     613                if (i * cbSector > cbScsiCmdBufLimit)
     614                    cReqSectors = cbScsiCmdBufLimit / (uint32_t)cbSector;
    614615                else
    615616                    cReqSectors = i;
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