VirtualBox

Changeset 29006 in vbox


Ignore:
Timestamp:
May 4, 2010 11:37:42 AM (15 years ago)
Author:
vboxsync
Message:

VBoxHDD: Move the FinishWrite call from DrvVD to VBoxHDD where we can determine the type of the operation (read/write)

Location:
trunk/src/VBox/Devices/Storage
Files:
2 edited

Legend:

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

    r28835 r29006  
    302302        rc = pStorageBackend->pfnCompleted(pvUser, rcReq);
    303303        AssertRC(rc);
    304 
    305         /* If thread synchronization is active, then signal the end of the
    306          * this disk read/write operation. */
    307         /** @todo provide a way to determine the type of task (read/write)
    308          * which was completed, see also VBoxHDD.cpp. */
    309         if (RT_UNLIKELY(pStorageBackend->pInterfaceThreadSyncCallbacks))
    310         {
    311             int rc2 = pStorageBackend->pInterfaceThreadSyncCallbacks->pfnFinishWrite(pStorageBackend->pInterfaceThreadSync->pvUser);
    312             AssertRC(rc2);
    313         }
    314304    }
    315305}
  • trunk/src/VBox/Devices/Storage/VBoxHDD.cpp

    r28800 r29006  
    18161816                                                        pIoCtxParent->Type.Root.pvUser2,
    18171817                                                        pIoCtxParent->rcReq);
     1818                    vdThreadFinishWrite(pDisk);
    18181819                    vdIoCtxFree(pDisk, pIoCtxParent);
    18191820                }
     
    18551856                        {
    18561857                            LogFlowFunc(("Waiting I/O context completed pIoCtxWait=%#p\n", pIoCtxWait));
     1858                            vdThreadFinishWrite(pDisk);
    18571859                            pIoCtxWait->Type.Root.pfnComplete(pIoCtxWait->Type.Root.pvUser1,
    18581860                                                              pIoCtxWait->Type.Root.pvUser2,
     
    18661868            }
    18671869            else
     1870            {
     1871                if (pIoCtx->enmTxDir == VDIOCTXTXDIR_WRITE)
     1872                    vdThreadFinishWrite(pDisk);
     1873                else
     1874                    vdThreadFinishRead(pDisk);
     1875
    18681876                pIoCtx->Type.Root.pfnComplete(pIoCtx->Type.Root.pvUser1,
    18691877                                              pIoCtx->Type.Root.pvUser2,
    18701878                                              pIoCtx->rcReq);
     1879            }
    18711880
    18721881            vdIoCtxFree(pDisk, pIoCtx);
     
    59675976    } while (0);
    59685977
    5969     if (RT_UNLIKELY(fLockRead) && (rc != VINF_VD_ASYNC_IO_FINISHED))
     5978    if (RT_UNLIKELY(fLockRead) && (   rc == VINF_VD_ASYNC_IO_FINISHED
     5979                                   || rc != VERR_VD_ASYNC_IO_IN_PROGRESS))
    59705980    {
    59715981        rc2 = vdThreadFinishRead(pDisk);
     
    60426052    } while (0);
    60436053
    6044     if (RT_UNLIKELY(fLockWrite) && RT_FAILURE(rc))
     6054    if (RT_UNLIKELY(fLockWrite) && (   rc == VINF_VD_ASYNC_IO_FINISHED
     6055                                    || rc != VERR_VD_ASYNC_IO_IN_PROGRESS))
    60456056    {
    60466057        rc2 = vdThreadFinishWrite(pDisk);
     
    60886099
    60896100        rc = vdIoCtxProcess(pIoCtx);
     6101        if (rc == VINF_VD_ASYNC_IO_FINISHED)
     6102        {
     6103            if (ASMAtomicCmpXchgBool(&pIoCtx->fComplete, true, false))
     6104                vdIoCtxFree(pDisk, pIoCtx);
     6105            else
     6106                rc = VERR_VD_ASYNC_IO_IN_PROGRESS; /* Let the other handler complete the request. */
     6107        }
     6108        else if (rc != VERR_VD_ASYNC_IO_IN_PROGRESS) /* Another error */
     6109            vdIoCtxFree(pDisk, pIoCtx);
    60906110    } while (0);
    60916111
    6092     if (RT_UNLIKELY(fLockWrite) && RT_FAILURE(rc))
     6112    if (RT_UNLIKELY(fLockWrite) && (   rc == VINF_VD_ASYNC_IO_FINISHED
     6113                                    || rc != VERR_VD_ASYNC_IO_IN_PROGRESS))
    60936114    {
    60946115        rc2 = vdThreadFinishWrite(pDisk);
    60956116        AssertRC(rc2);
    6096     }
    6097 
    6098     if (RT_SUCCESS(rc))
    6099     {
    6100         if (   !pIoCtx->cbTransferLeft
    6101             && !pIoCtx->cMetaTransfersPending
    6102             && ASMAtomicCmpXchgBool(&pIoCtx->fComplete, true, false))
    6103         {
    6104             vdIoCtxFree(pDisk, pIoCtx);
    6105             rc = VINF_VD_ASYNC_IO_FINISHED;
    6106         }
    6107         else
    6108         {
    6109             LogFlow(("cbTransferLeft=%u cMetaTransfersPending=%u fComplete=%RTbool\n",
    6110                      pIoCtx->cbTransferLeft, pIoCtx->cMetaTransfersPending,
    6111                      pIoCtx->fComplete));
    6112             rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
    6113         }
    61146117    }
    61156118
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