Changeset 32691 in vbox
- Timestamp:
- Sep 22, 2010 10:09:54 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxHDD.h
r32553 r32691 253 253 /** Interface to pass error message to upper layers. Per-disk. */ 254 254 VDINTERFACETYPE_ERROR = VDINTERFACETYPE_FIRST, 255 /** Interface for I/O operations. Per- disk. */255 /** Interface for I/O operations. Per-image. */ 256 256 VDINTERFACETYPE_IO, 257 257 /** Interface for progress notification. Per-operation. */ … … 259 259 /** Interface for configuration information. Per-image. */ 260 260 VDINTERFACETYPE_CONFIG, 261 /** Interface for TCP network stack. Per- disk. */261 /** Interface for TCP network stack. Per-image. */ 262 262 VDINTERFACETYPE_TCPNET, 263 263 /** Interface for getting parent image state. Per-operation. */ … … 429 429 * to upper layers. 430 430 * 431 * Per 431 * Per-disk interface. Optional, but think twice if you want to miss the 432 432 * opportunity of reporting better human-readable error messages. 433 433 */ … … 509 509 * Support interface for I/O 510 510 * 511 * Per- disk. Optional as input.511 * Per-image. Optional as input. 512 512 */ 513 513 typedef struct VDINTERFACEIO 514 514 { 515 515 /** 516 * Size of the asyncinterface.516 * Size of the I/O interface. 517 517 */ 518 518 uint32_t cbSize; … … 537 537 * VDAsyncRead or VDAsyncWrite) in pvCompletion 538 538 * if this is NULL. 539 * @param pVDIfsDisk Pointer to the per-disk VD interface list.540 539 * @param ppStorage Where to store the opaque storage handle. 541 540 */ … … 543 542 uint32_t fOpen, 544 543 PFNVDCOMPLETED pfnCompleted, 545 PVDINTERFACE pVDIfsDisk,546 544 void **ppStorage)); 547 545 … … 705 703 706 704 /** 707 * Get asyncI/O interface from opaque callback table.705 * Get I/O interface from opaque callback table. 708 706 * 709 707 * @return Pointer to the callback table. … … 714 712 PVDINTERFACEIO pInterfaceIO; 715 713 716 /* Check that the interface descriptor is a asyncI/O interface. */714 /* Check that the interface descriptor is an I/O interface. */ 717 715 AssertMsgReturn( (pInterface->enmInterface == VDINTERFACETYPE_IO) 718 716 && (pInterface->cbSize == sizeof(VDINTERFACE)), 719 ("Not an asyncI/O interface"), NULL);717 ("Not an I/O interface"), NULL); 720 718 721 719 pInterfaceIO = (PVDINTERFACEIO)pInterface->pCallbacks; … … 724 722 AssertMsgReturn( (pInterfaceIO->cbSize == sizeof(VDINTERFACEIO)) 725 723 && (pInterfaceIO->enmInterface == VDINTERFACETYPE_IO), 726 ("A non async I/O callback table attached to aI/O interface descriptor\n"), NULL);724 ("A non I/O callback table attached to an I/O interface descriptor\n"), NULL); 727 725 728 726 return pInterfaceIO; … … 1118 1116 * TCP network stack interface 1119 1117 * 1120 * Per- disk. Mandatory for backends which have the VD_CAP_TCPNET bit set.1118 * Per-image. Mandatory for backends which have the VD_CAP_TCPNET bit set. 1121 1119 */ 1122 1120 typedef struct VDINTERFACETCPNET … … 1340 1338 * Interface to get the parent state. 1341 1339 * 1342 * Per 1340 * Per-operation interface. Optional, present only if there is a parent, and 1343 1341 * used only internally for compacting. 1344 1342 */ … … 1416 1414 * about worst case affected areas. 1417 1415 * 1418 * Per 1416 * Per-disk interface. Optional, needed if the disk is accessed concurrently 1419 1417 * by several threads, e.g. when merging diff images while a VM is running. 1420 1418 */ … … 1908 1906 DECLINLINE(PVDINTERFACEIOINT) VDGetInterfaceIOInt(PVDINTERFACE pInterface) 1909 1907 { 1910 PVDINTERFACEIOINT pInterfaceIO ;1911 1912 /* Check that the interface descriptor is a asyncI/O interface. */1908 PVDINTERFACEIOINT pInterfaceIOInt; 1909 1910 /* Check that the interface descriptor is an internal I/O interface. */ 1913 1911 AssertMsgReturn( (pInterface->enmInterface == VDINTERFACETYPE_IOINT) 1914 1912 && (pInterface->cbSize == sizeof(VDINTERFACE)), 1915 ("Not an I/O interface"), NULL);1916 1917 pInterfaceIO = (PVDINTERFACEIOINT)pInterface->pCallbacks;1913 ("Not an internal I/O interface"), NULL); 1914 1915 pInterfaceIOInt = (PVDINTERFACEIOINT)pInterface->pCallbacks; 1918 1916 1919 1917 /* Do basic checks. */ 1920 AssertMsgReturn( (pInterfaceIO ->cbSize == sizeof(VDINTERFACEIOINT))1921 && (pInterfaceIO ->enmInterface == VDINTERFACETYPE_IOINT),1922 ("A non I/O callback table attached to aI/O interface descriptor\n"), NULL);1923 1924 return pInterfaceIO ;1918 AssertMsgReturn( (pInterfaceIOInt->cbSize == sizeof(VDINTERFACEIOINT)) 1919 && (pInterfaceIOInt->enmInterface == VDINTERFACETYPE_IOINT), 1920 ("A non internal I/O callback table attached to an internal I/O interface descriptor\n"), NULL); 1921 1922 return pInterfaceIOInt; 1925 1923 } 1926 1924 -
trunk/src/VBox/Devices/Storage/DrvVD.cpp
r32553 r32691 86 86 /** Common structure for the configuration information interface. */ 87 87 VDINTERFACE VDIConfig; 88 /** Common structure for the supported TCP network stack interface. */ 89 VDINTERFACE VDITcpNet; 90 /** Common structure for the supported I/O interface. */ 91 VDINTERFACE VDIIO; 88 92 } VBOXIMAGE, *PVBOXIMAGE; 89 93 … … 105 109 /** Callback routine */ 106 110 PFNVDCOMPLETED pfnCompleted; 107 108 /** Pointer to the optional thread synchronization interface of the disk. */109 PVDINTERFACE pInterfaceThreadSync;110 /** Pointer to the optional thread synchronization callbacks of the disk. */111 PVDINTERFACETHREADSYNC pInterfaceThreadSyncCallbacks;112 111 } DRVVDSTORAGEBACKEND, *PDRVVDSTORAGEBACKEND; 113 112 … … 140 139 /** Callback table for error interface. */ 141 140 VDINTERFACEERROR VDIErrorCallbacks; 142 /** Common structure for the supported TCP network stack interface. */143 VDINTERFACE VDITcpNet;144 /** Callback table for TCP network stack interface. */145 VDINTERFACETCPNET VDITcpNetCallbacks;146 /** Common structure for the supported I/O interface. */147 VDINTERFACE VDIIO;148 /** Callback table for I/O interface. */149 VDINTERFACEIO VDIIOCallbacks;150 141 /** Common structure for the supported thread synchronization interface. */ 151 142 VDINTERFACE VDIThreadSync; 152 143 /** Callback table for thread synchronization interface. */ 153 144 VDINTERFACETHREADSYNC VDIThreadSyncCallbacks; 145 154 146 /** Callback table for the configuration information interface. */ 155 147 VDINTERFACECONFIG VDIConfigCallbacks; 148 /** Callback table for TCP network stack interface. */ 149 VDINTERFACETCPNET VDITcpNetCallbacks; 150 /** Callback table for I/O interface. */ 151 VDINTERFACEIO VDIIOCallbacks; 152 156 153 /** Flag whether opened disk suppports async I/O operations. */ 157 154 bool fAsyncIOSupported; … … 334 331 uint32_t fOpen, 335 332 PFNVDCOMPLETED pfnCompleted, 336 PVDINTERFACE pVDIfsDisk,337 333 void **ppStorage) 338 334 { … … 346 342 pStorageBackend->rcReqLast = VINF_SUCCESS; 347 343 pStorageBackend->pfnCompleted = pfnCompleted; 348 pStorageBackend->pInterfaceThreadSync = NULL;349 pStorageBackend->pInterfaceThreadSyncCallbacks = NULL;350 351 pStorageBackend->pInterfaceThreadSync = VDInterfaceGet(pVDIfsDisk, VDINTERFACETYPE_THREADSYNC);352 if (RT_UNLIKELY(pStorageBackend->pInterfaceThreadSync))353 pStorageBackend->pInterfaceThreadSyncCallbacks = VDGetInterfaceThreadSync(pStorageBackend->pInterfaceThreadSync);354 344 355 345 rc = RTSemEventCreate(&pStorageBackend->EventSem); … … 2131 2121 if (RT_SUCCESS(rc)) 2132 2122 { 2133 /* First of all figure out what kind of TCP networking stack interface 2134 * to use. This is done unconditionally, as backends which don't need 2135 * it will just ignore it. */ 2123 /* Construct TCPNET callback table depending on the config. This is 2124 * done unconditionally, as uninterested backends will ignore it. */ 2136 2125 if (fHostIP) 2137 2126 { … … 2202 2191 #endif /* VBOX_WITH_INIP */ 2203 2192 } 2204 if (RT_SUCCESS(rc))2205 {2206 rc = VDInterfaceAdd(&pThis->VDITcpNet, "DrvVD_INIP",2207 VDINTERFACETYPE_TCPNET,2208 &pThis->VDITcpNetCallbacks, NULL,2209 &pThis->pVDIfsDisk);2210 }2211 2193 2212 2194 /** @todo quick hack to work around problems in the async I/O … … 2231 2213 pThis->VDIIOCallbacks.pfnWriteAsync = drvvdAsyncIOWriteAsync; 2232 2214 pThis->VDIIOCallbacks.pfnFlushAsync = drvvdAsyncIOFlushAsync; 2233 2234 rc = VDInterfaceAdd(&pThis->VDIIO, "DrvVD_IO", VDINTERFACETYPE_IO,2235 &pThis->VDIIOCallbacks, pThis, &pThis->pVDIfsDisk);2236 2215 #else /* !VBOX_WITH_PDM_ASYNC_COMPLETION */ 2237 2216 rc = PDMDrvHlpVMSetError(pDrvIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES, … … 2348 2327 &pThis->VDIConfigCallbacks, pCfgVDConfig, &pImage->pVDIfsImage); 2349 2328 AssertRC(rc); 2329 2330 /* Unconditionally insert the TCPNET interface, don't bother to check 2331 * if an image really needs it. Will be ignored. Since the TCPNET 2332 * interface is per image we could make this more flexible in the 2333 * future if we want to. */ 2334 rc = VDInterfaceAdd(&pImage->VDITcpNet, "DrvVD_TCPNET", 2335 VDINTERFACETYPE_TCPNET, &pThis->VDITcpNetCallbacks, 2336 NULL, &pImage->pVDIfsImage); 2337 AssertRC(rc); 2338 2339 /* Insert the custom I/O interface only if we're told to use new IO. 2340 * Since the I/O interface is per image we could make this more 2341 * flexible in the future if we want to. */ 2342 if (fUseNewIo) 2343 { 2344 rc = VDInterfaceAdd(&pImage->VDIIO, "DrvVD_IO", VDINTERFACETYPE_IO, 2345 &pThis->VDIIOCallbacks, pThis, 2346 &pImage->pVDIfsImage); 2347 AssertRC(rc); 2348 } 2350 2349 2351 2350 /* -
trunk/src/VBox/Devices/Storage/ISCSIHDDCore.cpp
r32598 r32691 527 527 /** Error interface callback table. */ 528 528 PVDINTERFACEERROR pInterfaceErrorCallbacks; 529 /** TCP network stack interface. */530 PVDINTERFACE pInterfaceNet;531 /** TCP network stack interface callback table. */532 PVDINTERFACETCPNET pInterfaceNetCallbacks;533 529 /** Pointer to the per-image VD interface list. */ 534 530 PVDINTERFACE pVDIfsImage; … … 541 537 /** I/O interface callback table. */ 542 538 PVDINTERFACEIOINT pInterfaceIoCallbacks; 539 /** TCP network stack interface. */ 540 PVDINTERFACE pInterfaceNet; 541 /** TCP network stack interface callback table. */ 542 PVDINTERFACETCPNET pInterfaceNetCallbacks; 543 543 /** Image open flags. */ 544 544 unsigned uOpenFlags; … … 3733 3733 3734 3734 /* Get TCP network stack interface. */ 3735 pImage->pInterfaceNet = VDInterfaceGet(pImage->pVDIfs Disk, VDINTERFACETYPE_TCPNET);3735 pImage->pInterfaceNet = VDInterfaceGet(pImage->pVDIfsImage, VDINTERFACETYPE_TCPNET); 3736 3736 if (pImage->pInterfaceNet) 3737 3737 pImage->pInterfaceNetCallbacks = VDGetInterfaceTcpNet(pImage->pInterfaceNet); -
trunk/src/VBox/Devices/Storage/VBoxHDD.cpp
r32641 r32691 86 86 /** Function pointers for the various backend methods. */ 87 87 PCVBOXHDDBACKEND Backend; 88 /** Per image internal I/O interface. */ 89 VDINTERFACE VDIIO; 88 90 89 /** Pointer to list of VD interfaces, per-image. */ 91 90 PVDINTERFACE pVDIfsImage; 91 92 /** I/O interface to the upper layer. */ 93 PVDINTERFACE pInterfaceIO; 94 /** I/O interface callback table. */ 95 PVDINTERFACEIO pInterfaceIOCallbacks; 96 97 /** Per image internal I/O interface. */ 98 VDINTERFACE VDIIOInt; 99 100 /** Fallback I/O interface, only used if the caller doesn't provide it. */ 101 VDINTERFACE VDIIO; 102 92 103 /** Disk this image is part of */ 93 104 PVBOXHDD pDisk; … … 119 130 /** Function pointers for the various backend methods. */ 120 131 PCVDCACHEBACKEND Backend; 121 /** Per image internal I/O interface. */ 122 VDINTERFACE VDIIO; 132 123 133 /** Pointer to list of VD interfaces, per-cache. */ 124 134 PVDINTERFACE pVDIfsCache; 135 136 /** I/O interface to the upper layer. */ 137 PVDINTERFACE pInterfaceIO; 138 /** I/O interface callback table. */ 139 PVDINTERFACEIO pInterfaceIOCallbacks; 140 141 /** Per image internal I/O interface. */ 142 VDINTERFACE VDIIOInt; 143 144 /** Fallback I/O interface, only used if the caller doesn't provide it. */ 145 VDINTERFACE VDIIO; 146 125 147 /** Disk this image is part of */ 126 148 PVBOXHDD pDisk; … … 170 192 VDINTERFACEIOINT VDIIOIntCallbacks; 171 193 172 /** I/O interface to the upper layer. */173 PVDINTERFACE pInterfaceIO;174 /** I/O interface callback table. */175 PVDINTERFACEIO pInterfaceIOCallbacks;176 177 /** Fallback I/O interface. */178 VDINTERFACE VDIIO;179 194 /** Callback table for the fallback I/O interface. */ 180 195 VDINTERFACEIO VDIIOCallbacks; … … 2216 2231 * VD async I/O interface open callback. 2217 2232 */ 2218 static int vdIOOpenFallback(void *pvUser, const char *pszLocation, uint32_t fOpen,2219 PFNVDCOMPLETED pfnCompleted, PVDINTERFACE pVDIfsDisk,2233 static int vdIOOpenFallback(void *pvUser, const char *pszLocation, 2234 uint32_t fOpen, PFNVDCOMPLETED pfnCompleted, 2220 2235 void **ppStorage) 2221 2236 { … … 2640 2655 */ 2641 2656 static int vdIOIntOpen(void *pvUser, const char *pszLocation, 2642 unsigned uOpenFlags, PPVDIOSTORAGE ppIoStorage)2657 unsigned uOpenFlags, PPVDIOSTORAGE ppIoStorage) 2643 2658 { 2644 2659 int rc = VINF_SUCCESS; 2645 2660 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2646 PVBOXHDD pDisk = pImage->pDisk;2647 2661 PVDIOSTORAGE pIoStorage = (PVDIOSTORAGE)RTMemAllocZ(sizeof(VDIOSTORAGE)); 2648 2662 … … 2656 2670 if (pIoStorage->pTreeMetaXfers) 2657 2671 { 2658 rc = pDisk->pInterfaceIOCallbacks->pfnOpen(pDisk->pInterfaceIO->pvUser, 2659 pszLocation, uOpenFlags, 2660 vdIOIntReqCompleted, 2661 pDisk->pVDIfsDisk, 2662 &pIoStorage->pStorage); 2672 rc = pImage->pInterfaceIOCallbacks->pfnOpen(pImage->pInterfaceIO->pvUser, 2673 pszLocation, uOpenFlags, 2674 vdIOIntReqCompleted, 2675 &pIoStorage->pStorage); 2663 2676 if (RT_SUCCESS(rc)) 2664 2677 { … … 2685 2698 { 2686 2699 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2687 PVBOXHDD pDisk = pImage->pDisk; 2688 2689 int rc = pDisk->pInterfaceIOCallbacks->pfnClose(pDisk->pInterfaceIO->pvUser, 2690 pIoStorage->pStorage); 2700 2701 int rc = pImage->pInterfaceIOCallbacks->pfnClose(pImage->pInterfaceIO->pvUser, 2702 pIoStorage->pStorage); 2691 2703 AssertRC(rc); 2692 2704 … … 2699 2711 static int vdIOIntDelete(void *pvUser, const char *pcszFilename) 2700 2712 { 2701 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2702 PVBOXHDD pDisk = pImage->pDisk; 2703 return pDisk->pInterfaceIOCallbacks->pfnDelete(pDisk->pInterfaceIO->pvUser, 2704 pcszFilename); 2705 } 2706 2707 static int vdIOIntMove(void *pvUser, const char *pcszSrc, const char *pcszDst, unsigned fMove) 2708 { 2709 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2710 PVBOXHDD pDisk = pImage->pDisk; 2711 return pDisk->pInterfaceIOCallbacks->pfnMove(pDisk->pInterfaceIO->pvUser, 2712 pcszSrc, pcszDst, fMove); 2713 } 2714 2715 static int vdIOIntGetFreeSpace(void *pvUser, const char *pcszFilename, int64_t *pcbFreeSpace) 2716 { 2717 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2718 PVBOXHDD pDisk = pImage->pDisk; 2719 return pDisk->pInterfaceIOCallbacks->pfnGetFreeSpace(pDisk->pInterfaceIO->pvUser, 2720 pcszFilename, pcbFreeSpace); 2721 } 2722 2723 static int vdIOIntGetModificationTime(void *pvUser, const char *pcszFilename, PRTTIMESPEC pModificationTime) 2724 { 2725 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2726 PVBOXHDD pDisk = pImage->pDisk; 2727 return pDisk->pInterfaceIOCallbacks->pfnGetModificationTime(pDisk->pInterfaceIO->pvUser, 2728 pcszFilename, pModificationTime); 2713 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2714 return pImage->pInterfaceIOCallbacks->pfnDelete(pImage->pInterfaceIO->pvUser, 2715 pcszFilename); 2716 } 2717 2718 static int vdIOIntMove(void *pvUser, const char *pcszSrc, const char *pcszDst, 2719 unsigned fMove) 2720 { 2721 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2722 return pImage->pInterfaceIOCallbacks->pfnMove(pImage->pInterfaceIO->pvUser, 2723 pcszSrc, pcszDst, fMove); 2724 } 2725 2726 static int vdIOIntGetFreeSpace(void *pvUser, const char *pcszFilename, 2727 int64_t *pcbFreeSpace) 2728 { 2729 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2730 return pImage->pInterfaceIOCallbacks->pfnGetFreeSpace(pImage->pInterfaceIO->pvUser, 2731 pcszFilename, 2732 pcbFreeSpace); 2733 } 2734 2735 static int vdIOIntGetModificationTime(void *pvUser, const char *pcszFilename, 2736 PRTTIMESPEC pModificationTime) 2737 { 2738 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2739 return pImage->pInterfaceIOCallbacks->pfnGetModificationTime(pImage->pInterfaceIO->pvUser, 2740 pcszFilename, 2741 pModificationTime); 2729 2742 } 2730 2743 2731 2744 static int vdIOIntGetSize(void *pvUser, PVDIOSTORAGE pIoStorage, 2732 uint64_t *pcbSize)2745 uint64_t *pcbSize) 2733 2746 { 2734 2747 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2735 PVBOXHDD pDisk = pImage->pDisk; 2736 2737 return pDisk->pInterfaceIOCallbacks->pfnGetSize(pDisk->pInterfaceIO->pvUser, 2748 2749 return pImage->pInterfaceIOCallbacks->pfnGetSize(pImage->pInterfaceIO->pvUser, 2738 2750 pIoStorage->pStorage, 2739 2751 pcbSize); … … 2741 2753 2742 2754 static int vdIOIntSetSize(void *pvUser, PVDIOSTORAGE pIoStorage, 2743 uint64_t cbSize)2755 uint64_t cbSize) 2744 2756 { 2745 2757 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2746 PVBOXHDD pDisk = pImage->pDisk; 2747 2748 return pDisk->pInterfaceIOCallbacks->pfnSetSize(pDisk->pInterfaceIO->pvUser,2749 pIoStorage->pStorage,2750 cbSize); 2751 } 2752 2753 static int vdIOIntWriteSync(void *pvUser, PVDIOSTORAGE pIoStorage, uint64_t uOffset,2754 const void *pvBuf,size_t cbWrite, size_t *pcbWritten)2758 2759 return pImage->pInterfaceIOCallbacks->pfnSetSize(pImage->pInterfaceIO->pvUser, 2760 pIoStorage->pStorage, 2761 cbSize); 2762 } 2763 2764 static int vdIOIntWriteSync(void *pvUser, PVDIOSTORAGE pIoStorage, 2765 uint64_t uOffset, const void *pvBuf, 2766 size_t cbWrite, size_t *pcbWritten) 2755 2767 { 2756 2768 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2757 PVBOXHDD pDisk = pImage->pDisk; 2758 2759 return pDisk->pInterfaceIOCallbacks->pfnWriteSync(pDisk->pInterfaceIO->pvUser, 2769 2770 return pImage->pInterfaceIOCallbacks->pfnWriteSync(pImage->pInterfaceIO->pvUser, 2771 pIoStorage->pStorage, 2772 uOffset, pvBuf, cbWrite, 2773 pcbWritten); 2774 } 2775 2776 static int vdIOIntReadSync(void *pvUser, PVDIOSTORAGE pIoStorage, 2777 uint64_t uOffset, void *pvBuf, size_t cbRead, 2778 size_t *pcbRead) 2779 { 2780 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2781 2782 return pImage->pInterfaceIOCallbacks->pfnReadSync(pImage->pInterfaceIO->pvUser, 2760 2783 pIoStorage->pStorage, 2761 uOffset, pvBuf, cbWrite, 2762 pcbWritten); 2763 } 2764 2765 static int vdIOIntReadSync(void *pvUser, PVDIOSTORAGE pIoStorage, uint64_t uOffset, 2766 void *pvBuf, size_t cbRead, size_t *pcbRead) 2784 uOffset, pvBuf, cbRead, 2785 pcbRead); 2786 } 2787 2788 static int vdIOIntFlushSync(void *pvUser, PVDIOSTORAGE pIoStorage) 2767 2789 { 2768 2790 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2769 PVBOXHDD pDisk = pImage->pDisk; 2770 2771 return pDisk->pInterfaceIOCallbacks->pfnReadSync(pDisk->pInterfaceIO->pvUser, 2772 pIoStorage->pStorage, 2773 uOffset, pvBuf, cbRead, 2774 pcbRead); 2775 } 2776 2777 static int vdIOIntFlushSync(void *pvUser, PVDIOSTORAGE pIoStorage) 2778 { 2779 PVDIMAGE pImage = (PVDIMAGE)pvUser; 2780 PVBOXHDD pDisk = pImage->pDisk; 2781 2782 return pDisk->pInterfaceIOCallbacks->pfnFlushSync(pDisk->pInterfaceIO->pvUser, 2783 pIoStorage->pStorage); 2791 2792 return pImage->pInterfaceIOCallbacks->pfnFlushSync(pImage->pInterfaceIO->pvUser, 2793 pIoStorage->pStorage); 2784 2794 } 2785 2795 2786 2796 static int vdIOIntReadUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, 2787 uint64_t uOffset, PVDIOCTX pIoCtx,2788 size_t cbRead)2797 uint64_t uOffset, PVDIOCTX pIoCtx, 2798 size_t cbRead) 2789 2799 { 2790 2800 int rc = VINF_SUCCESS; … … 2824 2834 2825 2835 void *pvTask; 2826 rc = p Disk->pInterfaceIOCallbacks->pfnReadAsync(pDisk->pInterfaceIO->pvUser,2827 2828 2829 2830 2836 rc = pImage->pInterfaceIOCallbacks->pfnReadAsync(pImage->pInterfaceIO->pvUser, 2837 pIoStorage->pStorage, 2838 uOffset, aSeg, cSegments, 2839 cbTaskRead, pIoTask, 2840 &pvTask); 2831 2841 if (RT_SUCCESS(rc)) 2832 2842 { … … 2851 2861 2852 2862 static int vdIOIntWriteUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, 2853 uint64_t uOffset, PVDIOCTX pIoCtx,2854 size_t cbWrite,2855 PFNVDXFERCOMPLETED pfnComplete,2856 void *pvCompleteUser)2863 uint64_t uOffset, PVDIOCTX pIoCtx, 2864 size_t cbWrite, 2865 PFNVDXFERCOMPLETED pfnComplete, 2866 void *pvCompleteUser) 2857 2867 { 2858 2868 int rc = VINF_SUCCESS; … … 2892 2902 2893 2903 void *pvTask; 2894 rc = p Disk->pInterfaceIOCallbacks->pfnWriteAsync(pDisk->pInterfaceIO->pvUser,2895 2896 2897 2898 2904 rc = pImage->pInterfaceIOCallbacks->pfnWriteAsync(pImage->pInterfaceIO->pvUser, 2905 pIoStorage->pStorage, 2906 uOffset, aSeg, cSegments, 2907 cbTaskWrite, pIoTask, 2908 &pvTask); 2899 2909 if (RT_SUCCESS(rc)) 2900 2910 { … … 2918 2928 2919 2929 static int vdIOIntReadMetaAsync(void *pvUser, PVDIOSTORAGE pIoStorage, 2920 uint64_t uOffset, void *pvBuf,2921 size_t cbRead, PVDIOCTX pIoCtx,2922 PPVDMETAXFER ppMetaXfer,2923 PFNVDXFERCOMPLETED pfnComplete,2924 void *pvCompleteUser)2930 uint64_t uOffset, void *pvBuf, 2931 size_t cbRead, PVDIOCTX pIoCtx, 2932 PPVDMETAXFER ppMetaXfer, 2933 PFNVDXFERCOMPLETED pfnComplete, 2934 void *pvCompleteUser) 2925 2935 { 2926 2936 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 2962 2972 2963 2973 VDMETAXFER_TXDIR_SET(pMetaXfer->fFlags, VDMETAXFER_TXDIR_READ); 2964 rc = p Disk->pInterfaceIOCallbacks->pfnReadAsync(pDisk->pInterfaceIO->pvUser,2965 2966 2967 2968 2974 rc = pImage->pInterfaceIOCallbacks->pfnReadAsync(pImage->pInterfaceIO->pvUser, 2975 pIoStorage->pStorage, 2976 uOffset, &Seg, 1, 2977 cbRead, pIoTask, 2978 &pvTask); 2969 2979 2970 2980 if (RT_SUCCESS(rc) || rc == VERR_VD_ASYNC_IO_IN_PROGRESS) … … 3017 3027 3018 3028 static int vdIOIntWriteMetaAsync(void *pvUser, PVDIOSTORAGE pIoStorage, 3019 uint64_t uOffset, void *pvBuf,3020 size_t cbWrite, PVDIOCTX pIoCtx,3021 PFNVDXFERCOMPLETED pfnComplete,3022 void *pvCompleteUser)3029 uint64_t uOffset, void *pvBuf, 3030 size_t cbWrite, PVDIOCTX pIoCtx, 3031 PFNVDXFERCOMPLETED pfnComplete, 3032 void *pvCompleteUser) 3023 3033 { 3024 3034 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 3067 3077 3068 3078 VDMETAXFER_TXDIR_SET(pMetaXfer->fFlags, VDMETAXFER_TXDIR_WRITE); 3069 rc = p Disk->pInterfaceIOCallbacks->pfnWriteAsync(pDisk->pInterfaceIO->pvUser,3070 3071 3072 3073 3079 rc = pImage->pInterfaceIOCallbacks->pfnWriteAsync(pImage->pInterfaceIO->pvUser, 3080 pIoStorage->pStorage, 3081 uOffset, &Seg, 1, 3082 cbWrite, pIoTask, 3083 &pvTask); 3074 3084 if (RT_SUCCESS(rc)) 3075 3085 { … … 3114 3124 { 3115 3125 PVDIMAGE pImage = (PVDIMAGE)pvUser; 3126 PVBOXHDD pDisk = pImage->pDisk; 3116 3127 PVDIOSTORAGE pIoStorage = pMetaXfer->pIoStorage; 3117 3128 3118 VD_THREAD_IS_CRITSECT_OWNER(p Image->pDisk);3129 VD_THREAD_IS_CRITSECT_OWNER(pDisk); 3119 3130 3120 3131 Assert( VDMETAXFER_TXDIR_GET(pMetaXfer->fFlags) == VDMETAXFER_TXDIR_NONE … … 3137 3148 3138 3149 static int vdIOIntFlushAsync(void *pvUser, PVDIOSTORAGE pIoStorage, 3139 PVDIOCTX pIoCtx, 3140 PFNVDXFERCOMPLETED pfnComplete, 3141 void *pvCompleteUser) 3150 PVDIOCTX pIoCtx, PFNVDXFERCOMPLETED pfnComplete, 3151 void *pvCompleteUser) 3142 3152 { 3143 3153 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 3175 3185 RTListAppend(&pMetaXfer->ListIoCtxWaiting, &pDeferred->NodeDeferred); 3176 3186 VDMETAXFER_TXDIR_SET(pMetaXfer->fFlags, VDMETAXFER_TXDIR_FLUSH); 3177 rc = pDisk->pInterfaceIOCallbacks->pfnFlushAsync(pDisk->pInterfaceIO->pvUser, 3178 pIoStorage->pStorage, 3179 pIoTask, 3180 &pvTask); 3187 rc = pImage->pInterfaceIOCallbacks->pfnFlushAsync(pImage->pInterfaceIO->pvUser, 3188 pIoStorage->pStorage, 3189 pIoTask, &pvTask); 3181 3190 if (RT_SUCCESS(rc)) 3182 3191 { … … 3194 3203 3195 3204 static size_t vdIOIntIoCtxCopyTo(void *pvUser, PVDIOCTX pIoCtx, 3196 void *pvBuf, size_t cbBuf)3205 void *pvBuf, size_t cbBuf) 3197 3206 { 3198 3207 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 3211 3220 3212 3221 static size_t vdIOIntIoCtxCopyFrom(void *pvUser, PVDIOCTX pIoCtx, 3213 void *pvBuf, size_t cbBuf)3222 void *pvBuf, size_t cbBuf) 3214 3223 { 3215 3224 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 3227 3236 } 3228 3237 3229 static size_t vdIOIntIoCtxSet(void *pvUser, PVDIOCTX pIoCtx, 3230 int ch, size_t cb) 3238 static size_t vdIOIntIoCtxSet(void *pvUser, PVDIOCTX pIoCtx, int ch, size_t cb) 3231 3239 { 3232 3240 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 3245 3253 3246 3254 static size_t vdIOIntIoCtxSegArrayCreate(void *pvUser, PVDIOCTX pIoCtx, 3247 PRTSGSEG paSeg, unsigned *pcSeg,3248 size_t cbData)3255 PRTSGSEG paSeg, unsigned *pcSeg, 3256 size_t cbData) 3249 3257 { 3250 3258 PVDIMAGE pImage = (PVDIMAGE)pvUser; … … 3261 3269 3262 3270 static void vdIOIntIoCtxCompleted(void *pvUser, PVDIOCTX pIoCtx, int rcReq, 3263 size_t cbCompleted)3271 size_t cbCompleted) 3264 3272 { 3265 3273 /* Continue */ … … 3289 3297 3290 3298 rc = pInterfaceIOCallbacks->pfnOpen(NULL, pszLocation, fOpen, 3291 NULL, NULL,&pIoStorage->pStorage);3299 NULL, &pIoStorage->pStorage); 3292 3300 if (RT_SUCCESS(rc)) 3293 3301 *ppIoStorage = pIoStorage; … … 3314 3322 } 3315 3323 3316 static int vdIOIntMoveLimited(void *pvUser, const char *pcszSrc, const char *pcszDst, unsigned fMove) 3324 static int vdIOIntMoveLimited(void *pvUser, const char *pcszSrc, 3325 const char *pcszDst, unsigned fMove) 3317 3326 { 3318 3327 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3320 3329 } 3321 3330 3322 static int vdIOIntGetFreeSpaceLimited(void *pvUser, const char *pcszFilename, int64_t *pcbFreeSpace) 3331 static int vdIOIntGetFreeSpaceLimited(void *pvUser, const char *pcszFilename, 3332 int64_t *pcbFreeSpace) 3323 3333 { 3324 3334 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3326 3336 } 3327 3337 3328 static int vdIOIntGetModificationTimeLimited(void *pvUser, const char *pcszFilename, PRTTIMESPEC pModificationTime) 3338 static int vdIOIntGetModificationTimeLimited(void *pvUser, 3339 const char *pcszFilename, 3340 PRTTIMESPEC pModificationTime) 3329 3341 { 3330 3342 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3333 3345 3334 3346 static int vdIOIntGetSizeLimited(void *pvUser, PVDIOSTORAGE pIoStorage, 3335 uint64_t *pcbSize)3347 uint64_t *pcbSize) 3336 3348 { 3337 3349 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3340 3352 3341 3353 static int vdIOIntSetSizeLimited(void *pvUser, PVDIOSTORAGE pIoStorage, 3342 uint64_t cbSize)3354 uint64_t cbSize) 3343 3355 { 3344 3356 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3346 3358 } 3347 3359 3348 static int vdIOIntWriteSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage, uint64_t uOffset, 3349 const void *pvBuf, size_t cbWrite, size_t *pcbWritten) 3360 static int vdIOIntWriteSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage, 3361 uint64_t uOffset, const void *pvBuf, 3362 size_t cbWrite, size_t *pcbWritten) 3350 3363 { 3351 3364 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3353 3366 } 3354 3367 3355 static int vdIOIntReadSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage, uint64_t uOffset, 3356 void *pvBuf, size_t cbRead, size_t *pcbRead) 3368 static int vdIOIntReadSyncLimited(void *pvUser, PVDIOSTORAGE pIoStorage, 3369 uint64_t uOffset, void *pvBuf, size_t cbRead, 3370 size_t *pcbRead) 3357 3371 { 3358 3372 PVDINTERFACEIO pInterfaceIOCallbacks = (PVDINTERFACEIO)pvUser; … … 3616 3630 if (pDisk->pInterfaceThreadSync) 3617 3631 pDisk->pInterfaceThreadSyncCallbacks = VDGetInterfaceThreadSync(pDisk->pInterfaceThreadSync); 3618 pDisk->pInterfaceIO = VDInterfaceGet(pVDIfsDisk, VDINTERFACETYPE_IO); 3619 if (pDisk->pInterfaceIO) 3620 pDisk->pInterfaceIOCallbacks = VDGetInterfaceIO(pDisk->pInterfaceIO); 3621 else 3622 { 3623 /* Create fallback I/O interface */ 3624 pDisk->VDIIOCallbacks.cbSize = sizeof(VDINTERFACEIO); 3625 pDisk->VDIIOCallbacks.enmInterface = VDINTERFACETYPE_IO; 3626 pDisk->VDIIOCallbacks.pfnOpen = vdIOOpenFallback; 3627 pDisk->VDIIOCallbacks.pfnClose = vdIOCloseFallback; 3628 pDisk->VDIIOCallbacks.pfnDelete = vdIODeleteFallback; 3629 pDisk->VDIIOCallbacks.pfnMove = vdIOMoveFallback; 3630 pDisk->VDIIOCallbacks.pfnGetFreeSpace = vdIOGetFreeSpaceFallback; 3631 pDisk->VDIIOCallbacks.pfnGetModificationTime = vdIOGetModificationTimeFallback; 3632 pDisk->VDIIOCallbacks.pfnGetSize = vdIOGetSizeFallback; 3633 pDisk->VDIIOCallbacks.pfnSetSize = vdIOSetSizeFallback; 3634 pDisk->VDIIOCallbacks.pfnReadSync = vdIOReadSyncFallback; 3635 pDisk->VDIIOCallbacks.pfnWriteSync = vdIOWriteSyncFallback; 3636 pDisk->VDIIOCallbacks.pfnFlushSync = vdIOFlushSyncFallback; 3637 pDisk->VDIIOCallbacks.pfnReadAsync = vdIOReadAsyncFallback; 3638 pDisk->VDIIOCallbacks.pfnWriteAsync = vdIOWriteAsyncFallback; 3639 pDisk->VDIIOCallbacks.pfnFlushAsync = vdIOFlushAsyncFallback; 3640 pDisk->pInterfaceIOCallbacks = &pDisk->VDIIOCallbacks; 3641 3642 pDisk->VDIIO.pszInterfaceName = "VD_IO"; 3643 pDisk->VDIIO.cbSize = sizeof(VDINTERFACE); 3644 pDisk->VDIIO.pNext = NULL; 3645 pDisk->VDIIO.enmInterface = VDINTERFACETYPE_IO; 3646 pDisk->VDIIO.pvUser = pDisk; 3647 pDisk->VDIIO.pCallbacks = pDisk->pInterfaceIOCallbacks; 3648 pDisk->pInterfaceIO = &pDisk->VDIIO; 3649 } 3632 3633 /* Create fallback I/O callback table */ 3634 pDisk->VDIIOCallbacks.cbSize = sizeof(VDINTERFACEIO); 3635 pDisk->VDIIOCallbacks.enmInterface = VDINTERFACETYPE_IO; 3636 pDisk->VDIIOCallbacks.pfnOpen = vdIOOpenFallback; 3637 pDisk->VDIIOCallbacks.pfnClose = vdIOCloseFallback; 3638 pDisk->VDIIOCallbacks.pfnDelete = vdIODeleteFallback; 3639 pDisk->VDIIOCallbacks.pfnMove = vdIOMoveFallback; 3640 pDisk->VDIIOCallbacks.pfnGetFreeSpace = vdIOGetFreeSpaceFallback; 3641 pDisk->VDIIOCallbacks.pfnGetModificationTime = vdIOGetModificationTimeFallback; 3642 pDisk->VDIIOCallbacks.pfnGetSize = vdIOGetSizeFallback; 3643 pDisk->VDIIOCallbacks.pfnSetSize = vdIOSetSizeFallback; 3644 pDisk->VDIIOCallbacks.pfnReadSync = vdIOReadSyncFallback; 3645 pDisk->VDIIOCallbacks.pfnWriteSync = vdIOWriteSyncFallback; 3646 pDisk->VDIIOCallbacks.pfnFlushSync = vdIOFlushSyncFallback; 3647 pDisk->VDIIOCallbacks.pfnReadAsync = vdIOReadAsyncFallback; 3648 pDisk->VDIIOCallbacks.pfnWriteAsync = vdIOWriteAsyncFallback; 3649 pDisk->VDIIOCallbacks.pfnFlushAsync = vdIOFlushAsyncFallback; 3650 3650 3651 3651 /* … … 3774 3774 pInterfaceIOCallbacks = VDGetInterfaceIO(pInterfaceIO); 3775 3775 3776 /* Set up the internal I/O interface. */ 3777 AssertReturn(!VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IOINT), 3778 VERR_INVALID_PARAMETER); 3776 3779 VDIIOIntCallbacks.cbSize = sizeof(VDINTERFACEIOINT); 3777 3780 VDIIOIntCallbacks.enmInterface = VDINTERFACETYPE_IOINT; … … 3940 3943 } 3941 3944 3942 /* Set up the I/O interface if necessary. */ 3943 if (!VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IOINT)) 3944 { 3945 rc = VDInterfaceAdd(&pImage->VDIIO, "VD_IOINT", VDINTERFACETYPE_IOINT, 3946 &pDisk->VDIIOIntCallbacks, pImage, 3947 &pImage->pVDIfsImage); 3948 AssertRC(rc); 3949 } 3945 /* Set up the I/O interface. */ 3946 pImage->pInterfaceIO = VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IO); 3947 if (pImage->pInterfaceIO) 3948 pImage->pInterfaceIOCallbacks = VDGetInterfaceIO(pImage->pInterfaceIO); 3949 else 3950 { 3951 rc = VDInterfaceAdd(&pImage->VDIIO, "VD_IO", VDINTERFACETYPE_IO, 3952 &pDisk->VDIIOCallbacks, pDisk, &pVDIfsImage); 3953 pImage->pInterfaceIO = &pImage->VDIIO; 3954 pImage->pInterfaceIOCallbacks = &pDisk->VDIIOCallbacks; 3955 } 3956 3957 /* Set up the internal I/O interface. */ 3958 AssertBreakStmt(!VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IOINT), 3959 rc = VERR_INVALID_PARAMETER); 3960 rc = VDInterfaceAdd(&pImage->VDIIOInt, "VD_IOINT", VDINTERFACETYPE_IOINT, 3961 &pDisk->VDIIOIntCallbacks, pImage, &pImage->pVDIfsImage); 3962 AssertRC(rc); 3950 3963 3951 3964 pImage->uOpenFlags = uOpenFlags & VD_OPEN_FLAGS_HONOR_SAME; … … 4182 4195 4183 4196 /* Set up the I/O interface. */ 4184 rc = VDInterfaceAdd(&pCache->VDIIO, "VD_IOINT", VDINTERFACETYPE_IOINT, 4197 pCache->pInterfaceIO = VDInterfaceGet(pVDIfsCache, VDINTERFACETYPE_IO); 4198 if (pCache->pInterfaceIO) 4199 pCache->pInterfaceIOCallbacks = VDGetInterfaceIO(pCache->pInterfaceIO); 4200 else 4201 { 4202 rc = VDInterfaceAdd(&pCache->VDIIO, "VD_IO", VDINTERFACETYPE_IO, 4203 &pDisk->VDIIOCallbacks, pDisk, &pVDIfsCache); 4204 pCache->pInterfaceIO = &pCache->VDIIO; 4205 pCache->pInterfaceIOCallbacks = &pDisk->VDIIOCallbacks; 4206 } 4207 4208 /* Set up the internal I/O interface. */ 4209 AssertBreakStmt(!VDInterfaceGet(pVDIfsCache, VDINTERFACETYPE_IOINT), 4210 rc = VERR_INVALID_PARAMETER); 4211 rc = VDInterfaceAdd(&pCache->VDIIOInt, "VD_IOINT", VDINTERFACETYPE_IOINT, 4185 4212 &pDisk->VDIIOIntCallbacks, pCache, &pCache->pVDIfsCache); 4186 4213 AssertRC(rc); … … 4402 4429 pImage->pVDIfsImage = pVDIfsImage; 4403 4430 4404 rc = VDInterfaceAdd(&pImage->VDIIO, "VD_IOINT", VDINTERFACETYPE_IOINT, 4405 &pDisk->VDIIOIntCallbacks, pImage, 4406 &pImage->pVDIfsImage); 4431 /* Set up the I/O interface. */ 4432 pImage->pInterfaceIO = VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IO); 4433 if (pImage->pInterfaceIO) 4434 pImage->pInterfaceIOCallbacks = VDGetInterfaceIO(pImage->pInterfaceIO); 4435 else 4436 { 4437 rc = VDInterfaceAdd(&pImage->VDIIO, "VD_IO", VDINTERFACETYPE_IO, 4438 &pDisk->VDIIOCallbacks, pDisk, &pVDIfsImage); 4439 pImage->pInterfaceIO = &pImage->VDIIO; 4440 pImage->pInterfaceIOCallbacks = &pDisk->VDIIOCallbacks; 4441 } 4442 4443 /* Set up the internal I/O interface. */ 4444 AssertBreakStmt(!VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IOINT), 4445 rc = VERR_INVALID_PARAMETER); 4446 rc = VDInterfaceAdd(&pImage->VDIIOInt, "VD_IOINT", VDINTERFACETYPE_IOINT, 4447 &pDisk->VDIIOIntCallbacks, pImage, &pImage->pVDIfsImage); 4407 4448 AssertRC(rc); 4408 4449 … … 4655 4696 pImage->pVDIfsImage = pVDIfsImage; 4656 4697 4657 rc = VDInterfaceAdd(&pImage->VDIIO, "VD_IOINT", VDINTERFACETYPE_IOINT, 4658 &pDisk->VDIIOIntCallbacks, pImage, 4659 &pImage->pVDIfsImage); 4698 /* Set up the I/O interface. */ 4699 pImage->pInterfaceIO = VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IO); 4700 if (pImage->pInterfaceIO) 4701 pImage->pInterfaceIOCallbacks = VDGetInterfaceIO(pImage->pInterfaceIO); 4702 else 4703 { 4704 rc = VDInterfaceAdd(&pImage->VDIIO, "VD_IO", VDINTERFACETYPE_IO, 4705 &pDisk->VDIIOCallbacks, pDisk, &pVDIfsImage); 4706 pImage->pInterfaceIO = &pImage->VDIIO; 4707 pImage->pInterfaceIOCallbacks = &pDisk->VDIIOCallbacks; 4708 } 4709 4710 /* Set up the internal I/O interface. */ 4711 AssertBreakStmt(!VDInterfaceGet(pVDIfsImage, VDINTERFACETYPE_IOINT), 4712 rc = VERR_INVALID_PARAMETER); 4713 rc = VDInterfaceAdd(&pImage->VDIIOInt, "VD_IOINT", VDINTERFACETYPE_IOINT, 4714 &pDisk->VDIIOIntCallbacks, pImage, &pImage->pVDIfsImage); 4660 4715 AssertRC(rc); 4661 4716 … … 4898 4953 4899 4954 /* Set up the I/O interface. */ 4900 rc = VDInterfaceAdd(&pCache->VDIIO, "VD_IOINT", VDINTERFACETYPE_IOINT, 4955 pCache->pInterfaceIO = VDInterfaceGet(pVDIfsCache, VDINTERFACETYPE_IO); 4956 if (pCache->pInterfaceIO) 4957 pCache->pInterfaceIOCallbacks = VDGetInterfaceIO(pCache->pInterfaceIO); 4958 else 4959 { 4960 rc = VDInterfaceAdd(&pCache->VDIIO, "VD_IO", VDINTERFACETYPE_IO, 4961 &pDisk->VDIIOCallbacks, pDisk, &pVDIfsCache); 4962 pCache->pInterfaceIO = &pCache->VDIIO; 4963 pCache->pInterfaceIOCallbacks = &pDisk->VDIIOCallbacks; 4964 } 4965 4966 /* Set up the internal I/O interface. */ 4967 AssertBreakStmt(!VDInterfaceGet(pVDIfsCache, VDINTERFACETYPE_IOINT), 4968 rc = VERR_INVALID_PARAMETER); 4969 rc = VDInterfaceAdd(&pCache->VDIIOInt, "VD_IOINT", VDINTERFACETYPE_IOINT, 4901 4970 &pDisk->VDIIOIntCallbacks, pCache, &pCache->pVDIfsCache); 4902 4971 AssertRC(rc); -
trunk/src/VBox/Main/MediumImpl.cpp
r32536 r32691 100 100 implicit(false), 101 101 numCreateDiffTasks(0), 102 vdDiskIfaces(NULL) 102 vdDiskIfaces(NULL), 103 vdImageIfaces(NULL) 103 104 { } 104 105 … … 163 164 164 165 PVDINTERFACE vdDiskIfaces; 166 PVDINTERFACE vdImageIfaces; 165 167 }; 166 168 … … 729 731 m->vdIfCallsTcpNet.pfnPoke = NULL; 730 732 731 /* Initialize the per-disk interface chain */ 733 /* Initialize the per-disk interface chain (could be done more globally, 734 * but it's not wasting much time or space so it's not worth it). */ 732 735 int vrc; 733 736 vrc = VDInterfaceAdd(&m->vdIfError, … … 737 740 AssertRCReturn(vrc, E_FAIL); 738 741 742 /* Initialize the per-image interface chain */ 739 743 vrc = VDInterfaceAdd(&m->vdIfConfig, 740 744 "Medium::vdInterfaceConfig", 741 745 VDINTERFACETYPE_CONFIG, 742 &m->vdIfCallsConfig, this, &m->vd DiskIfaces);746 &m->vdIfCallsConfig, this, &m->vdImageIfaces); 743 747 AssertRCReturn(vrc, E_FAIL); 744 748 … … 746 750 "Medium::vdInterfaceTcpNet", 747 751 VDINTERFACETYPE_TCPNET, 748 &m->vdIfCallsTcpNet, this, &m->vd DiskIfaces);752 &m->vdIfCallsTcpNet, this, &m->vdImageIfaces); 749 753 AssertRCReturn(vrc, E_FAIL); 750 754 … … 3715 3719 location.c_str(), 3716 3720 uOpenFlags, 3717 m->vd DiskIfaces);3721 m->vdImageIfaces); 3718 3722 if (RT_FAILURE(vrc)) 3719 3723 { … … 3955 3959 location.c_str(), 3956 3960 uOpenFlags & ~VD_OPEN_FLAGS_READONLY, 3957 m->vd DiskIfaces);3961 m->vdImageIfaces); 3958 3962 if (RT_FAILURE(vrc)) 3959 3963 throw S_OK; … … 5479 5483 pMedium->m->strLocationFull.c_str(), 5480 5484 VD_OPEN_FLAGS_READONLY, 5481 pMedium->m->vd DiskIfaces);5485 pMedium->m->vdImageIfaces); 5482 5486 if (RT_FAILURE(vrc)) 5483 5487 throw vrc; … … 5493 5497 (*it)->m->strLocationFull.c_str(), 5494 5498 VD_OPEN_FLAGS_INFO, 5495 (*it)->m->vd DiskIfaces);5499 (*it)->m->vdImageIfaces); 5496 5500 if (RT_FAILURE(vrc)) 5497 5501 throw vrc; … … 5623 5627 id.raw(), 5624 5628 VD_OPEN_FLAGS_NORMAL, 5625 NULL,5629 m->vdImageIfaces, 5626 5630 task.mVDOperationIfaces); 5627 5631 if (RT_FAILURE(vrc)) … … 5770 5774 pMedium->m->strLocationFull.c_str(), 5771 5775 VD_OPEN_FLAGS_READONLY, 5772 pMedium->m->vd DiskIfaces);5776 pMedium->m->vdImageIfaces); 5773 5777 if (RT_FAILURE(vrc)) 5774 5778 throw setError(VBOX_E_FILE_ERROR, … … 5791 5795 id.raw(), 5792 5796 VD_OPEN_FLAGS_NORMAL, 5793 pTarget->m->vd DiskIfaces,5797 pTarget->m->vdImageIfaces, 5794 5798 task.mVDOperationIfaces); 5795 5799 if (RT_FAILURE(vrc)) … … 5974 5978 pMedium->m->strLocationFull.c_str(), 5975 5979 uOpenFlags, 5976 pMedium->m->vd DiskIfaces);5980 pMedium->m->vdImageIfaces); 5977 5981 if (RT_FAILURE(vrc)) 5978 5982 throw vrc; … … 6006 6010 (*it)->m->strLocationFull.c_str(), 6007 6011 VD_OPEN_FLAGS_INFO, 6008 (*it)->m->vd DiskIfaces);6012 (*it)->m->vdImageIfaces); 6009 6013 if (RT_FAILURE(vrc)) 6010 6014 throw vrc; … … 6255 6259 pMedium->m->strLocationFull.c_str(), 6256 6260 VD_OPEN_FLAGS_READONLY, 6257 pMedium->m->vd DiskIfaces);6261 pMedium->m->vdImageIfaces); 6258 6262 if (RT_FAILURE(vrc)) 6259 6263 throw setError(VBOX_E_FILE_ERROR, … … 6319 6323 pMedium->m->strLocationFull.c_str(), 6320 6324 uOpenFlags, 6321 pMedium->m->vd DiskIfaces);6325 pMedium->m->vdImageIfaces); 6322 6326 if (RT_FAILURE(vrc)) 6323 6327 throw setError(VBOX_E_FILE_ERROR, … … 6333 6337 targetFormat.c_str(), 6334 6338 (fCreatingTarget) ? targetLocation.c_str() : (char *)NULL, 6335 false ,6336 0 ,6339 false /* fMoveByRename */, 6340 0 /* cbSize */, 6337 6341 task.mVariant, 6338 6342 targetId.raw(), 6339 NULL ,6340 pTarget->m->vd DiskIfaces,6343 NULL /* pVDIfsOperation */, 6344 pTarget->m->vdImageIfaces, 6341 6345 task.mVDOperationIfaces); 6342 6346 if (RT_FAILURE(vrc)) … … 6471 6475 location.c_str(), 6472 6476 VD_OPEN_FLAGS_READONLY | VD_OPEN_FLAGS_INFO, 6473 m->vd DiskIfaces);6477 m->vdImageIfaces); 6474 6478 if (RT_SUCCESS(vrc)) 6475 6479 vrc = VDClose(hdd, true /* fDelete */); … … 6569 6573 pMedium->m->strLocationFull.c_str(), 6570 6574 VD_OPEN_FLAGS_READONLY, 6571 pMedium->m->vd DiskIfaces);6575 pMedium->m->vdImageIfaces); 6572 6576 if (RT_FAILURE(vrc)) 6573 6577 throw setError(VBOX_E_FILE_ERROR, … … 6593 6597 parentLocation.c_str(), 6594 6598 VD_OPEN_FLAGS_READONLY | VD_OPEN_FLAGS_INFO, 6595 m->vd DiskIfaces);6599 m->vdImageIfaces); 6596 6600 if (RT_FAILURE(vrc)) 6597 6601 throw setError(VBOX_E_FILE_ERROR, … … 6608 6612 parentId.raw(), 6609 6613 VD_OPEN_FLAGS_NORMAL, 6610 m->vd DiskIfaces,6614 m->vdImageIfaces, 6611 6615 task.mVDOperationIfaces); 6612 6616 if (RT_FAILURE(vrc)) … … 6699 6703 pMedium->m->strLocationFull.c_str(), 6700 6704 (it == mediumListLast) ? VD_OPEN_FLAGS_NORMAL : VD_OPEN_FLAGS_READONLY, 6701 pMedium->m->vd DiskIfaces);6705 pMedium->m->vdImageIfaces); 6702 6706 if (RT_FAILURE(vrc)) 6703 6707 throw setError(VBOX_E_FILE_ERROR, … … 6796 6800 pMedium->m->strLocationFull.c_str(), 6797 6801 (it == mediumListLast) ? VD_OPEN_FLAGS_NORMAL : VD_OPEN_FLAGS_READONLY, 6798 pMedium->m->vd DiskIfaces);6802 pMedium->m->vdImageIfaces); 6799 6803 if (RT_FAILURE(vrc)) 6800 6804 throw setError(VBOX_E_FILE_ERROR,
Note:
See TracChangeset
for help on using the changeset viewer.