Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp	(revision 66057)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp	(revision 66058)
@@ -185,4 +185,18 @@
                                        rcReq, pVScsiReq->cbXfer);
 
+    if (pVScsiReq->pvLun)
+    {
+        if (vscsiDeviceLunIsPresent(pVScsiDevice, pVScsiReq->iLun))
+        {
+            PVSCSILUNINT pVScsiLun = pVScsiDevice->papVScsiLun[pVScsiReq->iLun];
+            pVScsiLun->pVScsiLunDesc->pfnVScsiLunReqFree(pVScsiLun, pVScsiReq, pVScsiReq->pvLun);
+        }
+        else
+            AssertLogRelMsgFailed(("vscsiDeviceReqComplete: LUN %u for VSCSI request %#p is not present but there is LUN specific data allocated\n",
+                                   pVScsiReq->iLun, pVScsiReq));
+
+        pVScsiReq->pvLun = NULL;
+    }
+
     RTMemCacheFree(pVScsiDevice->hCacheReq, pVScsiReq);
 }
@@ -396,4 +410,5 @@
     pVScsiReq->pvVScsiReqUser = pvVScsiReqUser;
     pVScsiReq->cbXfer         = 0;
+    pVScsiReq->pvLun          = NULL;
     RTSgBufInit(&pVScsiReq->SgBuf, paSGList, cSGListEntries);
 
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h	(revision 66057)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h	(revision 66058)
@@ -121,4 +121,7 @@
     /** Transfer size determined from the CDB. */
     size_t               cbXfer;
+    /** Pointer to the opaque data which may be allocated by the LUN
+     * the request is for. */
+    void                *pvLun;
 } VSCSIREQINT;
 
@@ -265,4 +268,15 @@
 
     /**
+     * Frees additional allocated resources for the given request if it was allocated before.
+     *
+     * @returns void.
+     * @param   pVScsiLun    The SCSI LUN instance.
+     * @param   pVScsiReq    The SCSI request.
+     * @param   pvScsiReqLun The opaque data allocated previously.
+     */
+    DECLR3CALLBACKMEMBER(void, pfnVScsiLunReqFree, (PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
+                                                    void *pvScsiReqLun));
+
+    /**
      * Informs about a medium being inserted - optional.
      *
@@ -424,4 +438,20 @@
 
 /**
+ * Enqueue a new data transfer request - extended variant.
+ *
+ * @returns VBox status code.
+ * @param   pVScsiLun   The LUN instance which issued the request.
+ * @param   pVScsiReq   The virtual SCSI request associated with the transfer.
+ * @param   enmTxDir    Transfer direction.
+ * @param   uOffset     Start offset of the transfer.
+ * @param   paSegs      Pointer to the array holding the memory buffer segments.
+ * @param   cSegs       Number of segments in the array.
+ * @param   cbTransfer  Number of bytes to transfer.
+ */
+int vscsiIoReqTransferEnqueueEx(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
+                                VSCSIIOREQTXDIR enmTxDir, uint64_t uOffset,
+                                PCRTSGSEG paSegs, unsigned cSegs, size_t cbTransfer);
+
+/**
  * Enqueue a new unmap request.
  *
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIIoReq.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIIoReq.cpp	(revision 66057)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIIoReq.cpp	(revision 66058)
@@ -92,4 +92,39 @@
 
 
+int vscsiIoReqTransferEnqueueEx(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
+                                VSCSIIOREQTXDIR enmTxDir, uint64_t uOffset,
+                                PCRTSGSEG paSegs, unsigned cSegs, size_t cbTransfer)
+{
+    int rc = VINF_SUCCESS;
+    PVSCSIIOREQINT pVScsiIoReq = NULL;
+
+    LogFlowFunc(("pVScsiLun=%#p pVScsiReq=%#p enmTxDir=%u uOffset=%llu cbTransfer=%u\n",
+                 pVScsiLun, pVScsiReq, enmTxDir, uOffset, cbTransfer));
+
+    rc = vscsiLunReqAlloc(pVScsiLun, (uintptr_t)pVScsiReq, &pVScsiIoReq);
+    if (RT_SUCCESS(rc))
+    {
+        pVScsiIoReq->pVScsiReq       = pVScsiReq;
+        pVScsiIoReq->pVScsiLun       = pVScsiLun;
+        pVScsiIoReq->enmTxDir        = enmTxDir;
+        pVScsiIoReq->u.Io.uOffset    = uOffset;
+        pVScsiIoReq->u.Io.cbTransfer = cbTransfer;
+        pVScsiIoReq->u.Io.paSeg      = paSegs;
+        pVScsiIoReq->u.Io.cSeg       = cSegs;
+
+        ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
+
+        rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
+        if (RT_FAILURE(rc))
+        {
+            ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
+            vscsiLunReqFree(pVScsiLun, pVScsiIoReq);
+        }
+    }
+
+    return rc;
+}
+
+
 int vscsiIoReqUnmapEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
                            PRTRANGE paRanges, unsigned cRanges)
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp	(revision 66057)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp	(revision 66058)
@@ -1338,4 +1338,6 @@
     /** pfnVScsiLunReqProcess */
     vscsiLunMmcReqProcess,
+    /** pfnVScsiLunReqFree */
+    NULL,
     /** pfnVScsiLunMediumInserted */
     vscsiLunMmcMediumInserted,
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp	(revision 66057)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp	(revision 66058)
@@ -616,4 +616,6 @@
     /** pfnVScsiLunReqProcess */
     vscsiLunSbcReqProcess,
+    /** pfnVScsiLunReqFree */
+    NULL,
     /** pfnVScsiLunMediumInserted */
     NULL,
