a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync/* $Id$ */
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync/** @file
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * Virtual SCSI driver: I/O request handling.
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync */
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync/*
65697a26b524640b83828b715160c798c43a0424vboxsync * Copyright (C) 2006-2011 Oracle Corporation
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync *
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * available from http://www.virtualbox.org. This file is free software;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * General Public License (GPL) as published by the Free Software
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync */
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#define LOG_GROUP LOG_GROUP_VSCSI
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <VBox/log.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <VBox/err.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <VBox/types.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <VBox/vscsi.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <iprt/assert.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <iprt/mem.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include <iprt/asm.h>
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync#include "VSCSIInternal.h"
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncint vscsiIoReqFlushEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync{
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync int rc = VINF_SUCCESS;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSIIOREQINT pVScsiIoReq = NULL;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq = (PVSCSIIOREQINT)RTMemAllocZ(sizeof(VSCSIIOREQINT));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync if (!pVScsiIoReq)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return VERR_NO_MEMORY;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq->pVScsiReq = pVScsiReq;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq->pVScsiLun = pVScsiLun;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq->enmTxDir = VSCSIIOREQTXDIR_FLUSH;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync if (RT_FAILURE(rc))
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync {
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync RTMemFree(pVScsiIoReq);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync }
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return rc;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync}
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncint vscsiIoReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync VSCSIIOREQTXDIR enmTxDir, uint64_t uOffset,
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync size_t cbTransfer)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync{
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync int rc = VINF_SUCCESS;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSIIOREQINT pVScsiIoReq = NULL;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync LogFlowFunc(("pVScsiLun=%#p pVScsiReq=%#p enmTxDir=%u uOffset=%llu cbTransfer=%u\n",
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiLun, pVScsiReq, enmTxDir, uOffset, cbTransfer));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq = (PVSCSIIOREQINT)RTMemAllocZ(sizeof(VSCSIIOREQINT));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync if (!pVScsiIoReq)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return VERR_NO_MEMORY;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->pVScsiReq = pVScsiReq;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->pVScsiLun = pVScsiLun;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->enmTxDir = enmTxDir;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->u.Io.uOffset = uOffset;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->u.Io.cbTransfer = cbTransfer;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->u.Io.paSeg = pVScsiReq->SgBuf.paSegs;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->u.Io.cSeg = pVScsiReq->SgBuf.cSegs;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
65697a26b524640b83828b715160c798c43a0424vboxsync if (RT_FAILURE(rc))
65697a26b524640b83828b715160c798c43a0424vboxsync {
65697a26b524640b83828b715160c798c43a0424vboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
65697a26b524640b83828b715160c798c43a0424vboxsync RTMemFree(pVScsiIoReq);
65697a26b524640b83828b715160c798c43a0424vboxsync }
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync return rc;
65697a26b524640b83828b715160c798c43a0424vboxsync}
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsyncint vscsiIoReqUnmapEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
f4aad55f8addd816ef005845842a2418bbdc3ea2vboxsync PRTRANGE paRanges, unsigned cRanges)
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync int rc = VINF_SUCCESS;
65697a26b524640b83828b715160c798c43a0424vboxsync PVSCSIIOREQINT pVScsiIoReq = NULL;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync LogFlowFunc(("pVScsiLun=%#p pVScsiReq=%#p paRanges=%#p cRanges=%u\n",
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiLun, pVScsiReq, paRanges, cRanges));
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq = (PVSCSIIOREQINT)RTMemAllocZ(sizeof(VSCSIIOREQINT));
65697a26b524640b83828b715160c798c43a0424vboxsync if (!pVScsiIoReq)
65697a26b524640b83828b715160c798c43a0424vboxsync return VERR_NO_MEMORY;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->pVScsiReq = pVScsiReq;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->pVScsiLun = pVScsiLun;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->enmTxDir = VSCSIIOREQTXDIR_UNMAP;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->u.Unmap.paRanges = paRanges;
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq->u.Unmap.cRanges = cRanges;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync if (RT_FAILURE(rc))
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync {
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync RTMemFree(pVScsiIoReq);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync }
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return rc;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync}
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncuint32_t vscsiIoReqOutstandingCountGet(PVSCSILUNINT pVScsiLun)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync{
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return ASMAtomicReadU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync}
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsyncVBOXDDU_DECL(int) VSCSIIoReqCompleted(VSCSIIOREQ hVScsiIoReq, int rcIoReq, bool fRedoPossible)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync{
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSIIOREQINT pVScsiIoReq = hVScsiIoReq;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSILUNINT pVScsiLun;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSIREQINT pVScsiReq;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync int rcReq = SCSI_STATUS_OK;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync AssertPtrReturn(pVScsiIoReq, VERR_INVALID_HANDLE);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync LogFlowFunc(("hVScsiIoReq=%#p rcIoReq=%Rrc\n", hVScsiIoReq, rcIoReq));
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiLun = pVScsiIoReq->pVScsiLun;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiReq = pVScsiIoReq->pVScsiReq;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync AssertMsg(pVScsiLun->IoReq.cReqOutstanding > 0,
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync ("Unregistered I/O request completed\n"));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync if (RT_SUCCESS(rcIoReq))
97fd7338a708a1cdb63fbdf823f6e508dc0d914dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync else if (!fRedoPossible)
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync {
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync /** @todo Not 100% correct for the write case as the 0x00 ASCQ for write errors
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync * is not used for SBC devices. */
97fd7338a708a1cdb63fbdf823f6e508dc0d914dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_MEDIUM_ERROR,
97fd7338a708a1cdb63fbdf823f6e508dc0d914dvboxsync pVScsiIoReq->enmTxDir == VSCSIIOREQTXDIR_READ
97fd7338a708a1cdb63fbdf823f6e508dc0d914dvboxsync ? SCSI_ASC_READ_ERROR
65697a26b524640b83828b715160c798c43a0424vboxsync : SCSI_ASC_WRITE_ERROR,
65697a26b524640b83828b715160c798c43a0424vboxsync 0x00);
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync }
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync else
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync rcReq = SCSI_STATUS_CHECK_CONDITION;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync if (pVScsiIoReq->enmTxDir == VSCSIIOREQTXDIR_UNMAP)
65697a26b524640b83828b715160c798c43a0424vboxsync RTMemFree(pVScsiIoReq->u.Unmap.paRanges);
65697a26b524640b83828b715160c798c43a0424vboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync /* Free the I/O request */
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync RTMemFree(pVScsiIoReq);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync /* Notify completion of the SCSI request. */
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, fRedoPossible, rcIoReq);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return VINF_SUCCESS;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync}
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncVBOXDDU_DECL(VSCSIIOREQTXDIR) VSCSIIoReqTxDirGet(VSCSIIOREQ hVScsiIoReq)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync{
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSIIOREQINT pVScsiIoReq = hVScsiIoReq;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync AssertPtrReturn(pVScsiIoReq, VSCSIIOREQTXDIR_INVALID);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return pVScsiIoReq->enmTxDir;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync}
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncVBOXDDU_DECL(int) VSCSIIoReqParamsGet(VSCSIIOREQ hVScsiIoReq, uint64_t *puOffset,
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync size_t *pcbTransfer, unsigned *pcSeg,
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync size_t *pcbSeg, PCRTSGSEG *ppaSeg)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync{
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync PVSCSIIOREQINT pVScsiIoReq = hVScsiIoReq;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync AssertPtrReturn(pVScsiIoReq, VERR_INVALID_HANDLE);
65697a26b524640b83828b715160c798c43a0424vboxsync AssertReturn( pVScsiIoReq->enmTxDir != VSCSIIOREQTXDIR_FLUSH
65697a26b524640b83828b715160c798c43a0424vboxsync && pVScsiIoReq->enmTxDir != VSCSIIOREQTXDIR_UNMAP,
65697a26b524640b83828b715160c798c43a0424vboxsync VERR_NOT_SUPPORTED);
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync *puOffset = pVScsiIoReq->u.Io.uOffset;
65697a26b524640b83828b715160c798c43a0424vboxsync *pcbTransfer = pVScsiIoReq->u.Io.cbTransfer;
65697a26b524640b83828b715160c798c43a0424vboxsync *pcSeg = pVScsiIoReq->u.Io.cSeg;
65697a26b524640b83828b715160c798c43a0424vboxsync *pcbSeg = pVScsiIoReq->u.Io.cbSeg;
65697a26b524640b83828b715160c798c43a0424vboxsync *ppaSeg = pVScsiIoReq->u.Io.paSeg;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync return VINF_SUCCESS;
65697a26b524640b83828b715160c798c43a0424vboxsync}
65697a26b524640b83828b715160c798c43a0424vboxsync
f4aad55f8addd816ef005845842a2418bbdc3ea2vboxsyncVBOXDDU_DECL(int) VSCSIIoReqUnmapParamsGet(VSCSIIOREQ hVScsiIoReq, PCRTRANGE *ppaRanges,
65697a26b524640b83828b715160c798c43a0424vboxsync unsigned *pcRanges)
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync PVSCSIIOREQINT pVScsiIoReq = hVScsiIoReq;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync AssertPtrReturn(pVScsiIoReq, VERR_INVALID_HANDLE);
65697a26b524640b83828b715160c798c43a0424vboxsync AssertReturn(pVScsiIoReq->enmTxDir == VSCSIIOREQTXDIR_UNMAP, VERR_NOT_SUPPORTED);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync *ppaRanges = pVScsiIoReq->u.Unmap.paRanges;
65697a26b524640b83828b715160c798c43a0424vboxsync *pcRanges = pVScsiIoReq->u.Unmap.cRanges;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return VINF_SUCCESS;
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync}
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync