a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync * Virtual SCSI driver: I/O request handling.
65697a26b524640b83828b715160c798c43a0424vboxsync * Copyright (C) 2006-2011 Oracle Corporation
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.
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncint vscsiIoReqFlushEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq = (PVSCSIIOREQINT)RTMemAllocZ(sizeof(VSCSIIOREQINT));
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncint vscsiIoReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync LogFlowFunc(("pVScsiLun=%#p pVScsiReq=%#p enmTxDir=%u uOffset=%llu cbTransfer=%u\n",
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiLun, pVScsiReq, enmTxDir, uOffset, cbTransfer));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync pVScsiIoReq = (PVSCSIIOREQINT)RTMemAllocZ(sizeof(VSCSIIOREQINT));
65697a26b524640b83828b715160c798c43a0424vboxsync ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
65697a26b524640b83828b715160c798c43a0424vboxsync rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
65697a26b524640b83828b715160c798c43a0424vboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
65697a26b524640b83828b715160c798c43a0424vboxsyncint vscsiIoReqUnmapEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
65697a26b524640b83828b715160c798c43a0424vboxsync LogFlowFunc(("pVScsiLun=%#p pVScsiReq=%#p paRanges=%#p cRanges=%u\n",
65697a26b524640b83828b715160c798c43a0424vboxsync pVScsiIoReq = (PVSCSIIOREQINT)RTMemAllocZ(sizeof(VSCSIIOREQINT));
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicIncU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync rc = vscsiLunReqTransferEnqueue(pVScsiLun, pVScsiIoReq);
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncuint32_t vscsiIoReqOutstandingCountGet(PVSCSILUNINT pVScsiLun)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync return ASMAtomicReadU32(&pVScsiLun->IoReq.cReqOutstanding);
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsyncVBOXDDU_DECL(int) VSCSIIoReqCompleted(VSCSIIOREQ hVScsiIoReq, int rcIoReq, bool fRedoPossible)
0dd6dfbebcda0af90da4413aaea5f3b9d1817556vboxsync LogFlowFunc(("hVScsiIoReq=%#p rcIoReq=%Rrc\n", hVScsiIoReq, rcIoReq));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync ("Unregistered I/O request completed\n"));
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync ASMAtomicDecU32(&pVScsiLun->IoReq.cReqOutstanding);
97fd7338a708a1cdb63fbdf823f6e508dc0d914dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
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,
65697a26b524640b83828b715160c798c43a0424vboxsync if (pVScsiIoReq->enmTxDir == VSCSIIOREQTXDIR_UNMAP)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync /* Free the I/O request */
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync /* Notify completion of the SCSI request. */
96a7e06717e2d7398642eadb5ebab1bf13fbe2dbvboxsync vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, fRedoPossible, rcIoReq);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncVBOXDDU_DECL(VSCSIIOREQTXDIR) VSCSIIoReqTxDirGet(VSCSIIOREQ hVScsiIoReq)
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsync AssertPtrReturn(pVScsiIoReq, VSCSIIOREQTXDIR_INVALID);
a4ba1fc5788b1fb4c078587d5f55936e1b83098dvboxsyncVBOXDDU_DECL(int) VSCSIIoReqParamsGet(VSCSIIOREQ hVScsiIoReq, uint64_t *puOffset,
65697a26b524640b83828b715160c798c43a0424vboxsync AssertReturn( pVScsiIoReq->enmTxDir != VSCSIIOREQTXDIR_FLUSH
f4aad55f8addd816ef005845842a2418bbdc3ea2vboxsyncVBOXDDU_DECL(int) VSCSIIoReqUnmapParamsGet(VSCSIIOREQ hVScsiIoReq, PCRTRANGE *ppaRanges,