VirtualBox

Changeset 27815 in vbox for trunk/src


Ignore:
Timestamp:
Mar 30, 2010 8:43:53 AM (15 years ago)
Author:
vboxsync
Message:

VBoxHDD: Fix VDGetFormat, we don't have disk structure at this point

File:
1 edited

Legend:

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

    r27808 r27815  
    215215typedef struct VDIOSTORAGE
    216216{
    217     /** Storage handle */
    218     void                        *pStorage;
     217    union
     218    {
     219        /** Storage handle */
     220        void                        *pStorage;
     221        /** File handle for the limited I/O version. */
     222        RTFILE                       hFile;
     223    } u;
    219224} VDIOSTORAGE;
    220225
     
    12001205                                                    vdIOReqCompleted,
    12011206                                                    pDisk->pVDIfsDisk,
    1202                                                     &pIoStorage->pStorage);
     1207                                                    &pIoStorage->u.pStorage);
    12031208    if (RT_SUCCESS(rc))
    12041209        *ppIoStorage = pIoStorage;
     
    12141219
    12151220    int rc = pDisk->pInterfaceAsyncIOCallbacks->pfnClose(pDisk->pInterfaceAsyncIO->pvUser,
    1216                                                          pIoStorage->pStorage);
     1221                                                         pIoStorage->u.pStorage);
    12171222    AssertRC(rc);
    12181223
     
    12271232
    12281233    return pDisk->pInterfaceAsyncIOCallbacks->pfnGetSize(pDisk->pInterfaceAsyncIO->pvUser,
    1229                                                          pIoStorage->pStorage,
     1234                                                         pIoStorage->u.pStorage,
    12301235                                                         pcbSize);
    12311236}
     
    12371242
    12381243    return pDisk->pInterfaceAsyncIOCallbacks->pfnSetSize(pDisk->pInterfaceAsyncIO->pvUser,
    1239                                                          pIoStorage->pStorage,
     1244                                                         pIoStorage->u.pStorage,
    12401245                                                         cbSize);
    12411246}
     
    12471252
    12481253    return pDisk->pInterfaceAsyncIOCallbacks->pfnWriteSync(pDisk->pInterfaceAsyncIO->pvUser,
    1249                                                            pIoStorage->pStorage,
     1254                                                           pIoStorage->u.pStorage,
    12501255                                                           uOffset, cbWrite, pvBuf,
    12511256                                                           pcbWritten);
     
    12581263
    12591264    return pDisk->pInterfaceAsyncIOCallbacks->pfnReadSync(pDisk->pInterfaceAsyncIO->pvUser,
    1260                                                           pIoStorage->pStorage,
     1265                                                          pIoStorage->u.pStorage,
    12611266                                                          uOffset, cbRead, pvBuf,
    12621267                                                          pcbRead);
     
    12681273
    12691274    return pDisk->pInterfaceAsyncIOCallbacks->pfnFlushSync(pDisk->pInterfaceAsyncIO->pvUser,
    1270                                                            pIoStorage->pStorage);
     1275                                                           pIoStorage->u.pStorage);
    12711276}
    12721277
     
    13261331    return vdIoCtxSet(pIoCtx, ch, cb);
    13271332}
     1333
     1334/**
     1335 * VD I/O interface callback for opening a file (limited version for VDGetFormat).
     1336 */
     1337static int vdIOOpenLimited(void *pvUser, const char *pszLocation,
     1338                           unsigned uOpenFlags, PPVDIOSTORAGE ppIoStorage)
     1339{
     1340    int rc = VINF_SUCCESS;
     1341    PVDIOSTORAGE pIoStorage = (PVDIOSTORAGE)RTMemAllocZ(sizeof(VDIOSTORAGE));
     1342
     1343    if (!pIoStorage)
     1344        return VERR_NO_MEMORY;
     1345
     1346    uint32_t fOpen = 0;
     1347
     1348    if (uOpenFlags & VD_INTERFACEASYNCIO_OPEN_FLAGS_READONLY)
     1349        fOpen |= RTFILE_O_READ      | RTFILE_O_DENY_NONE;
     1350    else
     1351        fOpen |= RTFILE_O_READWRITE | RTFILE_O_DENY_WRITE;
     1352
     1353    if (uOpenFlags & VD_INTERFACEASYNCIO_OPEN_FLAGS_CREATE)
     1354        fOpen |= RTFILE_O_CREATE;
     1355    else
     1356        fOpen |= RTFILE_O_OPEN;
     1357
     1358    rc = RTFileOpen(&pIoStorage->u.hFile, pszLocation, fOpen);
     1359    if (RT_SUCCESS(rc))
     1360        *ppIoStorage = pIoStorage;
     1361    else
     1362        RTMemFree(pIoStorage);
     1363
     1364    return rc;
     1365}
     1366
     1367static int vdIOCloseLimited(void *pvUser, PVDIOSTORAGE pIoStorage)
     1368{
     1369    int rc = RTFileClose(pIoStorage->u.hFile);
     1370    AssertRC(rc);
     1371
     1372    RTMemFree(pIoStorage);
     1373    return VINF_SUCCESS;
     1374}
     1375
     1376static int vdIOGetSizeLimited(void *pvUser, PVDIOSTORAGE pIoStorage,
     1377                       uint64_t *pcbSize)
     1378{
     1379    return RTFileGetSize(pIoStorage->u.hFile, pcbSize);
     1380}
     1381
     1382static int vdIOSetSizeLimited(void *pvUser, PVDIOSTORAGE pIoStorage,
     1383                       uint64_t cbSize)
     1384{
     1385    return RTFileSetSize(pIoStorage->u.hFile, cbSize);
     1386}
     1387
     1388static int vdIOWriteSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage, uint64_t uOffset,
     1389                         size_t cbWrite, const void *pvBuf, size_t *pcbWritten)
     1390{
     1391    return RTFileWriteAt(pIoStorage->u.hFile, uOffset, pvBuf, cbWrite, pcbWritten);
     1392}
     1393
     1394static int vdIOReadSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage, uint64_t uOffset,
     1395                        size_t cbRead, void *pvBuf, size_t *pcbRead)
     1396{
     1397    return RTFileReadAt(pIoStorage->u.hFile, uOffset, pvBuf, cbRead, pcbRead);
     1398}
     1399
     1400static int vdIOFlushSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage)
     1401{
     1402    return RTFileFlush(pIoStorage->u.hFile);
     1403}
     1404
    13281405
    13291406/**
     
    16431720    VDIIOCallbacks.cbSize            = sizeof(VDINTERFACEIO);
    16441721    VDIIOCallbacks.enmInterface      = VDINTERFACETYPE_IO;
    1645     VDIIOCallbacks.pfnOpen           = vdIOOpen;
    1646     VDIIOCallbacks.pfnClose          = vdIOClose;
    1647     VDIIOCallbacks.pfnGetSize        = vdIOGetSize;
    1648     VDIIOCallbacks.pfnSetSize        = vdIOSetSize;
    1649     VDIIOCallbacks.pfnReadSync       = vdIOReadSync;
    1650     VDIIOCallbacks.pfnWriteSync      = vdIOWriteSync;
    1651     VDIIOCallbacks.pfnFlushSync      = vdIOFlushSync;
     1722    VDIIOCallbacks.pfnOpen           = vdIOOpenLimited;
     1723    VDIIOCallbacks.pfnClose          = vdIOCloseLimited;
     1724    VDIIOCallbacks.pfnGetSize        = vdIOGetSizeLimited;
     1725    VDIIOCallbacks.pfnSetSize        = vdIOSetSizeLimited;
     1726    VDIIOCallbacks.pfnReadSync       = vdIOReadSyncLimited;
     1727    VDIIOCallbacks.pfnWriteSync      = vdIOWriteSyncLimited;
     1728    VDIIOCallbacks.pfnFlushSync      = vdIOFlushSyncLimited;
    16521729    VDIIOCallbacks.pfnReadUserAsync  = NULL;
    16531730    VDIIOCallbacks.pfnWriteUserAsync = NULL;
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