VirtualBox

Changeset 31586 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Aug 11, 2010 10:20:12 PM (14 years ago)
Author:
vboxsync
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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.

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