VirtualBox

Changeset 31586 in vbox


Ignore:
Timestamp:
Aug 11, 2010 10:20:12 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64693
Message:

VBoxHDD: Needed enhancements for async iSCSI. Make it possible to let the backend take control over the I/O context and notify the VD layer when it is done.

Location:
trunk
Files:
2 edited

Legend:

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

    r31456 r31586  
    17501750
    17511751    /**
     1752     * Creates a segment array from the I/O context data buffer.
     1753     *
     1754     * @returns Number of bytes the array describes.
     1755     * @param  pvUser          The opaque user data passed on container creation.
     1756     * @param  pIoCtx          I/O context to copy the data from.
     1757     * @param  paSeg           The uninitialized segment array.
     1758     *                         If NULL pcSeg will contain the number of segments needed
     1759     *                         to describe the requested amount of data.
     1760     * @param  pcSeg           The number of segments the given array has.
     1761     *                         This will hold the actual number of entries needed upon return.
     1762     * @param  cbData          Number of bytes the new array should describe.
     1763     */
     1764    DECLR3CALLBACKMEMBER(size_t, pfnIoCtxSegArrayCreate, (void *pvUser, PVDIOCTX pIoCtx,
     1765                                                          PRTSGSEG paSeg, unsigned *pcSeg,
     1766                                                          size_t cbData));
     1767    /**
    17521768     * Marks the given number of bytes as completed and continues the I/O context.
    17531769     *
     
    17551771     * @param   pvUser         The opaque user data passed on container creation.
    17561772     * @param   pIoCtx         The I/O context.
     1773     * @param   rcReq          Status code the request completed with.
    17571774     * @param   cbCompleted    Number of bytes completed.
    17581775     */
    17591776    DECLR3CALLBACKMEMBER(void, pfnIoCtxCompleted, (void *pvUser, PVDIOCTX pIoCtx,
    1760                                                    size_t cbCompleted));
     1777                                                   int rcReq, size_t cbCompleted));
    17611778} VDINTERFACEIO, *PVDINTERFACEIO;
    17621779
  • trunk/src/VBox/Devices/Storage/VBoxHDD.cpp

    r31573 r31586  
    905905        && !pIoCtx->cDataTransfersPending)
    906906        rc = VINF_VD_ASYNC_IO_FINISHED;
    907     else if (RT_SUCCESS(rc) || rc == VERR_VD_NOT_ENOUGH_METADATA)
     907    else if (   RT_SUCCESS(rc)
     908             || rc == VERR_VD_NOT_ENOUGH_METADATA
     909             || rc == VERR_VD_IOCTX_HALT)
    908910        rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
    909911    else if (RT_FAILURE(rc) && (rc != VERR_VD_ASYNC_IO_IN_PROGRESS))
     
    983985        else if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
    984986            rc = VINF_SUCCESS;
     987        else if (rc == VERR_VD_IOCTX_HALT)
     988        {
     989            uOffset  += cbThisRead;
     990            cbToRead -= cbThisRead;
     991            pIoCtx->fBlocked = true;
     992        }
    985993
    986994        if (RT_FAILURE(rc))
     
    991999    } while (cbToRead != 0 && RT_SUCCESS(rc));
    9921000
    993     if (rc == VERR_VD_NOT_ENOUGH_METADATA)
     1001    if (   rc == VERR_VD_NOT_ENOUGH_METADATA
     1002        || rc == VERR_VD_IOCTX_HALT)
    9941003    {
    9951004        /* Save the current state. */
     
    14511460    if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
    14521461        rc = VINF_SUCCESS;
     1462    else if (rc == VERR_VD_IOCTX_HALT)
     1463    {
     1464        pIoCtx->fBlocked = true;
     1465        rc = VINF_SUCCESS;
     1466    }
    14531467
    14541468    return rc;
     
    16511665        }
    16521666
    1653         if (rc == VERR_VD_NOT_ENOUGH_METADATA)
     1667        if (rc == VERR_VD_IOCTX_HALT)
     1668        {
     1669            cbWrite -= cbThisWrite;
     1670            uOffset += cbThisWrite;
     1671            pIoCtx->fBlocked = true;
     1672            break;
     1673        }
     1674        else if (rc == VERR_VD_NOT_ENOUGH_METADATA)
    16541675            break;
    16551676
     
    16581679    } while (cbWrite != 0 && (RT_SUCCESS(rc) || rc == VERR_VD_ASYNC_IO_IN_PROGRESS));
    16591680
    1660     if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS || rc == VERR_VD_NOT_ENOUGH_METADATA)
     1681    if (   rc == VERR_VD_ASYNC_IO_IN_PROGRESS
     1682        || rc == VERR_VD_NOT_ENOUGH_METADATA
     1683        || rc == VERR_VD_IOCTX_HALT)
    16611684    {
    16621685        /*
     
    28012824}
    28022825
     2826static size_t vdIOIoCtxSegArrayCreate(void *pvUser, PVDIOCTX pIoCtx,
     2827                                     PRTSGSEG paSeg, unsigned *pcSeg,
     2828                                     size_t cbData)
     2829{
     2830    PVDIMAGE pImage = (PVDIMAGE)pvUser;
     2831    PVBOXHDD pDisk  = pImage->pDisk;
     2832    size_t cbCreated = 0;
     2833
     2834    VD_THREAD_IS_CRITSECT_OWNER(pDisk);
     2835
     2836    cbCreated = RTSgBufSegArrayCreate(&pIoCtx->SgBuf, paSeg, pcSeg, cbData);
     2837    Assert(!paSeg || cbData == cbCreated);
     2838
     2839    return cbCreated;
     2840}
     2841
     2842static void vdIOIoCtxCompleted(void *pvUser, PVDIOCTX pIoCtx, int rcReq,
     2843                               size_t cbCompleted)
     2844{
     2845    /* Continue */
     2846    pIoCtx->fBlocked = false;
     2847    ASMAtomicSubU32(&pIoCtx->cbTransferLeft, cbCompleted);
     2848
     2849    /* Clear the pointer to next transfer function in case we have nothing to transfer anymore.
     2850     * @todo: Find a better way to prevent vdIoCtxContinue from calling the read/write helper again. */
     2851    if (!pIoCtx->cbTransferLeft)
     2852        pIoCtx->pfnIoCtxTransfer = NULL;
     2853
     2854    vdIoCtxContinue(pIoCtx, rcReq);
     2855}
     2856
    28032857/**
    28042858 * VD I/O interface callback for opening a file (limited version for VDGetFormat).
     
    31243178
    31253179            /* Create the I/O callback table. */
    3126             pDisk->VDIIOCallbacks.cbSize             = sizeof(VDINTERFACEIO);
    3127             pDisk->VDIIOCallbacks.enmInterface       = VDINTERFACETYPE_IO;
    3128             pDisk->VDIIOCallbacks.pfnOpen            = vdIOOpen;
    3129             pDisk->VDIIOCallbacks.pfnClose           = vdIOClose;
    3130             pDisk->VDIIOCallbacks.pfnGetSize         = vdIOGetSize;
    3131             pDisk->VDIIOCallbacks.pfnSetSize         = vdIOSetSize;
    3132             pDisk->VDIIOCallbacks.pfnReadSync        = vdIOReadSync;
    3133             pDisk->VDIIOCallbacks.pfnWriteSync       = vdIOWriteSync;
    3134             pDisk->VDIIOCallbacks.pfnFlushSync       = vdIOFlushSync;
    3135             pDisk->VDIIOCallbacks.pfnReadUserAsync   = vdIOReadUserAsync;
    3136             pDisk->VDIIOCallbacks.pfnWriteUserAsync  = vdIOWriteUserAsync;
    3137             pDisk->VDIIOCallbacks.pfnReadMetaAsync   = vdIOReadMetaAsync;
    3138             pDisk->VDIIOCallbacks.pfnWriteMetaAsync  = vdIOWriteMetaAsync;
    3139             pDisk->VDIIOCallbacks.pfnMetaXferRelease = vdIOMetaXferRelease;
    3140             pDisk->VDIIOCallbacks.pfnFlushAsync      = vdIOFlushAsync;
    3141             pDisk->VDIIOCallbacks.pfnIoCtxCopyFrom   = vdIOIoCtxCopyFrom;
    3142             pDisk->VDIIOCallbacks.pfnIoCtxCopyTo     = vdIOIoCtxCopyTo;
    3143             pDisk->VDIIOCallbacks.pfnIoCtxSet        = vdIOIoCtxSet;
     3180            pDisk->VDIIOCallbacks.cbSize                 = sizeof(VDINTERFACEIO);
     3181            pDisk->VDIIOCallbacks.enmInterface           = VDINTERFACETYPE_IO;
     3182            pDisk->VDIIOCallbacks.pfnOpen                = vdIOOpen;
     3183            pDisk->VDIIOCallbacks.pfnClose               = vdIOClose;
     3184            pDisk->VDIIOCallbacks.pfnGetSize             = vdIOGetSize;
     3185            pDisk->VDIIOCallbacks.pfnSetSize             = vdIOSetSize;
     3186            pDisk->VDIIOCallbacks.pfnReadSync            = vdIOReadSync;
     3187            pDisk->VDIIOCallbacks.pfnWriteSync           = vdIOWriteSync;
     3188            pDisk->VDIIOCallbacks.pfnFlushSync           = vdIOFlushSync;
     3189            pDisk->VDIIOCallbacks.pfnReadUserAsync       = vdIOReadUserAsync;
     3190            pDisk->VDIIOCallbacks.pfnWriteUserAsync      = vdIOWriteUserAsync;
     3191            pDisk->VDIIOCallbacks.pfnReadMetaAsync       = vdIOReadMetaAsync;
     3192            pDisk->VDIIOCallbacks.pfnWriteMetaAsync      = vdIOWriteMetaAsync;
     3193            pDisk->VDIIOCallbacks.pfnMetaXferRelease     = vdIOMetaXferRelease;
     3194            pDisk->VDIIOCallbacks.pfnFlushAsync          = vdIOFlushAsync;
     3195            pDisk->VDIIOCallbacks.pfnIoCtxCopyFrom       = vdIOIoCtxCopyFrom;
     3196            pDisk->VDIIOCallbacks.pfnIoCtxCopyTo         = vdIOIoCtxCopyTo;
     3197            pDisk->VDIIOCallbacks.pfnIoCtxSet            = vdIOIoCtxSet;
     3198            pDisk->VDIIOCallbacks.pfnIoCtxSegArrayCreate = vdIOIoCtxSegArrayCreate;
     3199            pDisk->VDIIOCallbacks.pfnIoCtxCompleted      = vdIOIoCtxCompleted;
    31443200
    31453201            *ppDisk = pDisk;
Note: See TracChangeset for help on using the changeset viewer.

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