VirtualBox

Changeset 22978 in vbox


Ignore:
Timestamp:
Sep 13, 2009 1:38:16 PM (15 years ago)
Author:
vboxsync
Message:

PDMAsyncCompletion: Fix crash on FreeBSD with failsafe manager. Need to advance to next task before freeing it. File sizes are only set during writes

Location:
trunk/src/VBox
Files:
3 edited

Legend:

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

    r22966 r22978  
    521521    if (pImage->pInterfaceError)
    522522        pImage->pInterfaceErrorCallbacks = VDGetInterfaceError(pImage->pInterfaceError);
     523
     524#ifdef VBOX_WITH_NEW_IO_CODE
     525    /* Try to get async I/O interface. */
     526    pImage->pInterfaceAsyncIO = VDInterfaceGet(pImage->pVDIfsDisk, VDINTERFACETYPE_ASYNCIO);
     527    AssertPtr(pImage->pInterfaceAsyncIO);
     528    pImage->pInterfaceAsyncIOCallbacks = VDGetInterfaceAsyncIO(pImage->pInterfaceAsyncIO);
     529    AssertPtr(pImage->pInterfaceAsyncIOCallbacks);
     530#endif
    523531
    524532    vdiInitPreHeader(&pImage->PreHeader);
  • trunk/src/VBox/VMM/PDMAsyncCompletionFile.cpp

    r22977 r22978  
    595595    if (RT_SUCCESS(rc))
    596596    {
    597         /* Initialize the segment cache */
    598         rc = MMR3HeapAllocZEx(pEpClassFile->Core.pVM, MM_TAG_PDM_ASYNC_COMPLETION,
    599                               sizeof(PDMACTASKFILE),
    600                               (void **)&pEpFile->pTasksFreeHead);
     597        rc = RTFileGetSize(pEpFile->File, (uint64_t *)&pEpFile->cbFile);
    601598        if (RT_SUCCESS(rc))
    602599        {
    603             PPDMACEPFILEMGR pAioMgr = NULL;
    604 
    605             pEpFile->pTasksFreeTail = pEpFile->pTasksFreeHead;
    606             pEpFile->cTasksCached = 0;
    607 
    608             if (pEpClassFile->fFailsafe)
     600            /* Initialize the segment cache */
     601            rc = MMR3HeapAllocZEx(pEpClassFile->Core.pVM, MM_TAG_PDM_ASYNC_COMPLETION,
     602                                  sizeof(PDMACTASKFILE),
     603                                  (void **)&pEpFile->pTasksFreeHead);
     604            if (RT_SUCCESS(rc))
    609605            {
    610                 /* Safe mode. Every file has its own async I/O manager. */
    611                 rc = pdmacFileAioMgrCreate(pEpClassFile, &pAioMgr);
    612                 AssertRC(rc);
    613             }
    614             else
    615             {
    616                 if (fFlags & PDMACEP_FILE_FLAGS_CACHING)
     606                PPDMACEPFILEMGR pAioMgr = NULL;
     607
     608                pEpFile->pTasksFreeTail = pEpFile->pTasksFreeHead;
     609                pEpFile->cTasksCached = 0;
     610
     611                if (pEpClassFile->fFailsafe)
    617612                {
    618                     pEpFile->fCaching = true;
    619                     rc = pdmacFileEpCacheInit(pEpFile, pEpClassFile);
    620                     if (RT_FAILURE(rc))
    621                     {
    622                         LogRel(("AIOMgr: Endpoint for \"%s\" was opened with caching but initializing cache failed. Disabled caching\n", pszUri));
    623                         pEpFile->fCaching = false;
    624                     }
    625                 }
    626 
    627                 /* Check for an idling one or create new if not found */
    628                 if (!pEpClassFile->pAioMgrHead)
    629                 {
     613                    /* Safe mode. Every file has its own async I/O manager. */
    630614                    rc = pdmacFileAioMgrCreate(pEpClassFile, &pAioMgr);
    631615                    AssertRC(rc);
     
    633617                else
    634618                {
    635                     pAioMgr = pEpClassFile->pAioMgrHead;
     619                    if (fFlags & PDMACEP_FILE_FLAGS_CACHING)
     620                    {
     621                        pEpFile->fCaching = true;
     622                        rc = pdmacFileEpCacheInit(pEpFile, pEpClassFile);
     623                        if (RT_FAILURE(rc))
     624                        {
     625                            LogRel(("AIOMgr: Endpoint for \"%s\" was opened with caching but initializing cache failed. Disabled caching\n", pszUri));
     626                            pEpFile->fCaching = false;
     627                        }
     628                    }
     629
     630                    /* Check for an idling one or create new if not found */
     631                    if (!pEpClassFile->pAioMgrHead)
     632                    {
     633                        rc = pdmacFileAioMgrCreate(pEpClassFile, &pAioMgr);
     634                        AssertRC(rc);
     635                    }
     636                    else
     637                    {
     638                        pAioMgr = pEpClassFile->pAioMgrHead;
     639                    }
    636640                }
     641
     642                pEpFile->enmState = PDMASYNCCOMPLETIONENDPOINTFILESTATE_ACTIVE;
     643
     644                /* Assign the endpoint to the thread. */
     645                rc = pdmacFileAioMgrAddEndpoint(pAioMgr, pEpFile);
     646                if (RT_FAILURE(rc))
     647                    MMR3HeapFree(pEpFile->pTasksFreeHead);
    637648            }
    638 
    639             pEpFile->enmState = PDMASYNCCOMPLETIONENDPOINTFILESTATE_ACTIVE;
    640 
    641             /* Assign the endpoint to the thread. */
    642             rc = pdmacFileAioMgrAddEndpoint(pAioMgr, pEpFile);
    643             if (RT_FAILURE(rc))
    644                 MMR3HeapFree(pEpFile->pTasksFreeHead);
    645649        }
    646650
  • trunk/src/VBox/VMM/PDMAsyncCompletionFileFailsafe.cpp

    r22757 r22978  
    3535        PPDMACTASKFILE pCurr = pTasks;
    3636
     37        pTasks = pTasks->pNext;
     38
    3739        switch (pCurr->enmTransferType)
    3840        {
     
    4749                if (pCurr->enmTransferType == PDMACTASKFILETRANSFER_READ)
    4850                {
    49                     if (RT_UNLIKELY((pCurr->Off + pCurr->DataSeg.cbSeg) > pEndpoint->cbFile))
    50                     {
    51                         ASMAtomicWriteU64(&pEndpoint->cbFile, pCurr->Off + pCurr->DataSeg.cbSeg);
    52                         RTFileSetSize(pEndpoint->File, pCurr->Off + pCurr->DataSeg.cbSeg);
    53                     }
    54 
    5551                    rc = RTFileReadAt(pEndpoint->File, pCurr->Off,
    5652                                      pCurr->DataSeg.pvSeg,
     
    6056                else
    6157                {
     58                    if (RT_UNLIKELY((pCurr->Off + pCurr->DataSeg.cbSeg) > pEndpoint->cbFile))
     59                    {
     60                        ASMAtomicWriteU64(&pEndpoint->cbFile, pCurr->Off + pCurr->DataSeg.cbSeg);
     61                        RTFileSetSize(pEndpoint->File, pCurr->Off + pCurr->DataSeg.cbSeg);
     62                    }
     63
    6264                    rc = RTFileWriteAt(pEndpoint->File, pCurr->Off,
    6365                                       pCurr->DataSeg.pvSeg,
     
    7678        pCurr->pfnCompleted(pCurr, pCurr->pvUser);
    7779        pdmacFileTaskFree(pEndpoint, pCurr);
    78 
    79         pTasks = pTasks->pNext;
    8080    }
    8181
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