VirtualBox

Changeset 44415 in vbox


Ignore:
Timestamp:
Jan 28, 2013 11:28:44 AM (12 years ago)
Author:
vboxsync
Message:

Storage: Merge sync/async path for flush requests

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/VD.cpp

    r44412 r44415  
    423423} VDIOCTX;
    424424
     425/** Default flags for an I/O context, i.e. unblocked and async. */
     426#define VDIOCTX_FLAGS_DEFAULT (0)
    425427/** Flag whether the context is blocked. */
    426428#define VDIOCTX_FLAGS_BLOCKED RT_BIT_32(0)
     
    13131315                                      void *pvUser1, void *pvUser2,
    13141316                                      void *pvAllocation,
    1315                                       PFNVDIOCTXTRANSFER pfnIoCtxTransfer)
     1317                                      PFNVDIOCTXTRANSFER pfnIoCtxTransfer,
     1318                                      uint32_t fFlags)
    13161319{
    13171320    PVDIOCTX pIoCtx = vdIoCtxAlloc(pDisk, enmTxDir, uOffset, cbTransfer, pImageStart,
    1318                                    pcSgBuf, pvAllocation, pfnIoCtxTransfer, 0);
     1321                                   pcSgBuf, pvAllocation, pfnIoCtxTransfer, fFlags);
    13191322
    13201323    if (RT_LIKELY(pIoCtx))
     
    17621765        rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
    17631766    }
     1767
     1768    return rc;
     1769}
     1770
     1771/**
     1772 * Process the I/O context in a synchronous manner, waiting
     1773 * for it to complete.
     1774 *
     1775 * @returns VBox status code of the completed request.
     1776 * @param   pIoCtx    The sync I/O context.
     1777 */
     1778static int vdIoCtxProcessSync(PVDIOCTX pIoCtx)
     1779{
     1780    int rc = VINF_SUCCESS;
     1781    PVBOXHDD pDisk = pIoCtx->pDisk;
     1782
     1783    LogFlowFunc(("pIoCtx=%p\n", pIoCtx));
     1784
     1785    AssertMsg(pIoCtx->fFlags & VDIOCTX_FLAGS_SYNC,
     1786              ("I/O context is not marked as synchronous\n"));
     1787
     1788    rc = vdIoCtxProcessTryLockDefer(pIoCtx);
     1789    if (rc == VINF_VD_ASYNC_IO_FINISHED)
     1790        rc = VINF_SUCCESS;
     1791
     1792    if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
     1793    {
     1794        rc = RTSemEventWait(pDisk->hEventSemSyncIo, RT_INDEFINITE_WAIT);
     1795        AssertRC(rc);
     1796
     1797        rc = pDisk->rcSync;
     1798    }
     1799    else /* Success or error. */
     1800        vdIoCtxFree(pDisk, pIoCtx);
    17641801
    17651802    return rc;
     
    28912928        vdResetModifiedFlag(pDisk);
    28922929        rc = pImage->Backend->pfnFlush(pImage->pBackendData, pIoCtx);
    2893         if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
    2894             rc = VINF_SUCCESS;
    2895         else if (rc == VINF_VD_ASYNC_IO_FINISHED)
    2896             vdIoCtxUnlockDisk(pDisk, pIoCtx, true /* fProcessDeferredReqs */);
     2930        if (   (   RT_SUCCESS(rc)
     2931                || rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
     2932            && pDisk->pCache)
     2933        {
     2934            rc = pDisk->pCache->Backend->pfnFlush(pDisk->pCache->pBackendData, pIoCtx);
     2935            if (   RT_SUCCESS(rc)
     2936                || rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
     2937                vdIoCtxUnlockDisk(pDisk, pIoCtx, true /* fProcessBlockedReqs */);
     2938        }
     2939        else
     2940            vdIoCtxUnlockDisk(pDisk, pIoCtx, true /* fProcessBlockedReqs */);
    28972941    }
    28982942
     
    81998243        AssertPtrBreakStmt(pImage, rc = VERR_VD_NOT_OPENED);
    82008244
    8201         vdResetModifiedFlag(pDisk);
    8202 
    8203         VDIOCTX IoCtx;
    8204         vdIoCtxInit(&IoCtx, pDisk, VDIOCTXTXDIR_FLUSH, 0, 0, NULL,
    8205                     NULL, NULL, NULL, VDIOCTX_FLAGS_SYNC);
    8206         rc = pImage->Backend->pfnFlush(pImage->pBackendData, &IoCtx);
    8207 
    8208         if (   RT_SUCCESS(rc)
    8209             && pDisk->pCache)
    8210             rc = pDisk->pCache->Backend->pfnFlush(pDisk->pCache->pBackendData, &IoCtx);
     8245        PVDIOCTX pIoCtx = vdIoCtxRootAlloc(pDisk, VDIOCTXTXDIR_FLUSH, 0,
     8246                                           0, pDisk->pLast, NULL,
     8247                                           vdIoCtxSyncComplete, pDisk, NULL,
     8248                                           NULL, vdFlushHelperAsync,
     8249                                           VDIOCTX_FLAGS_SYNC);
     8250
     8251        if (!pIoCtx)
     8252        {
     8253            rc = VERR_NO_MEMORY;
     8254            break;
     8255        }
     8256
     8257        rc = vdIoCtxProcessSync(pIoCtx);
    82118258    } while (0);
    82128259
     
    95329579        }
    95339580
    9534         rc = vdIoCtxProcessTryLockDefer(pIoCtx);
    9535         if (rc == VINF_VD_ASYNC_IO_FINISHED)
    9536             rc = VINF_SUCCESS;
    9537 
    9538         if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS)
    9539         {
    9540             rc = RTSemEventWait(pDisk->hEventSemSyncIo, RT_INDEFINITE_WAIT);
    9541             AssertRC(rc);
    9542 
    9543             rc = pDisk->rcSync;
    9544         }
    9545         else /* Success or error. */
    9546             vdIoCtxFree(pDisk, pIoCtx);
     9581        rc = vdIoCtxProcessSync(pIoCtx);
    95479582    } while (0);
    95489583
     
    95989633                                  cbRead, pDisk->pLast, pcSgBuf,
    95999634                                  pfnComplete, pvUser1, pvUser2,
    9600                                   NULL, vdReadHelperAsync);
     9635                                  NULL, vdReadHelperAsync,
     9636                                  VDIOCTX_FLAGS_DEFAULT);
    96019637        if (!pIoCtx)
    96029638        {
     
    96699705                                  cbWrite, pDisk->pLast, pcSgBuf,
    96709706                                  pfnComplete, pvUser1, pvUser2,
    9671                                   NULL, vdWriteHelperAsync);
     9707                                  NULL, vdWriteHelperAsync,
     9708                                  VDIOCTX_FLAGS_DEFAULT);
    96729709        if (!pIoCtx)
    96739710        {
     
    97259762                                  0, pDisk->pLast, NULL,
    97269763                                  pfnComplete, pvUser1, pvUser2,
    9727                                   NULL, vdFlushHelperAsync);
     9764                                  NULL, vdFlushHelperAsync,
     9765                                  VDIOCTX_FLAGS_DEFAULT);
    97289766        if (!pIoCtx)
    97299767        {
     
    97819819                                     pfnComplete, pvUser1, pvUser2, NULL,
    97829820                                     vdDiscardHelperAsync,
    9783                                      0 /* fFlags */);
     9821                                     VDIOCTX_FLAGS_DEFAULT);
    97849822        if (!pIoCtx)
    97859823        {
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