VSCSILunSbc.cpp revision f4aad55f8addd816ef005845842a2418bbdc3ea2
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Virtual SCSI driver: SBC LUN implementation (hard disks)
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2006-2011 Oracle Corporation
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * available from http://www.virtualbox.org. This file is free software;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * General Public License (GPL) as published by the Free Software
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/*******************************************************************************
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync* Header Files *
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync*******************************************************************************/
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync/** Maximum of amount of LBAs to unmap with one command. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * SBC LUN instance
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsynctypedef struct VSCSILUNSBC
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Core LUN structure */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** Size of the virtual disk. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** VPD page pool. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync/** Pointer to a SBC LUN instance */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync PVSCSILUNSBC pVScsiLunSbc = (PVSCSILUNSBC)pVScsiLun;
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync pVScsiLunSbc->cSectors = cbDisk / 512; /* Fixed sector size */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolInit(&pVScsiLunSbc->VpdPagePool);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Create device identification page - mandatory. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolAllocNewPage(&pVScsiLunSbc->VpdPagePool, VSCSI_VPD_DEVID_NUMBER,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** @todo: Not conforming to the SPC spec but Solaris needs at least a stub to work. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pDevIdPage->u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pDevIdPage->u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync && (pVScsiLun->fFeatures & VSCSI_LUN_FEATURE_UNMAP))
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Create the page and fill it. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolAllocNewPage(&pVScsiLunSbc->VpdPagePool, VSCSI_VPD_BLOCK_LIMITS_NUMBER,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync VSCSI_VPD_BLOCK_LIMITS_SIZE, (uint8_t **)&pBlkPage);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pBlkPage->u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pBlkPage->u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED;
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync pBlkPage->u32MaxUnmapLbaCount = RT_H2BE_U32(VSCSI_UNMAP_LBAS_MAX);
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync pBlkPage->u32MaxUnmapBlkDescCount = UINT32_C(0xffffffff);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolAllocNewPage(&pVScsiLunSbc->VpdPagePool, VSCSI_VPD_BLOCK_PROV_NUMBER,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync VSCSI_VPD_BLOCK_PROV_SIZE, (uint8_t **)&pBlkProvPage);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pBlkProvPage->u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS;
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsync pBlkProvPage->u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync && (pVScsiLun->fFeatures & VSCSI_LUN_FEATURE_NON_ROTATIONAL))
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Create the page and fill it. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolAllocNewPage(&pVScsiLunSbc->VpdPagePool, VSCSI_VPD_BLOCK_CHARACTERISTICS_NUMBER,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync VSCSI_VPD_BLOCK_CHARACTERISTICS_SIZE, (uint8_t **)&pBlkPage);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pBlkPage->u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pBlkPage->u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED;
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync pBlkPage->u16MediumRotationRate = RT_H2BE_U16(VSCSI_VPD_BLOCK_CHARACT_MEDIUM_ROTATION_RATE_NON_ROTATING);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolAllocNewPage(&pVScsiLunSbc->VpdPagePool, VSCSI_VPD_SUPPORTED_PAGES_NUMBER,
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync VSCSI_VPD_SUPPORTED_PAGES_SIZE + cVpdPages, (uint8_t **)&pVpdPages);
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync unsigned idxVpdPage = 0;
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync pVpdPages->u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pVpdPages->u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pVpdPages->abVpdPages[idxVpdPage++] = VSCSI_VPD_DEVID_NUMBER;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync if (pVScsiLun->fFeatures & VSCSI_LUN_FEATURE_UNMAP)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pVpdPages->abVpdPages[idxVpdPage++] = VSCSI_VPD_BLOCK_LIMITS_NUMBER;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pVpdPages->abVpdPages[idxVpdPage++] = VSCSI_VPD_BLOCK_PROV_NUMBER;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync if (pVScsiLun->fFeatures & VSCSI_LUN_FEATURE_NON_ROTATIONAL)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync pVpdPages->abVpdPages[idxVpdPage++] = VSCSI_VPD_BLOCK_CHARACTERISTICS_NUMBER;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncstatic int vscsiLunSbcDestroy(PVSCSILUNINT pVScsiLun)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync PVSCSILUNSBC pVScsiLunSbc = (PVSCSILUNSBC)pVScsiLun;
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync vscsiVpdPagePoolDestroy(&pVScsiLunSbc->VpdPagePool);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsyncstatic int vscsiLunSbcReqProcess(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq)
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync PVSCSILUNSBC pVScsiLunSbc = (PVSCSILUNSBC)pVScsiLun;
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync VSCSIIOREQTXDIR enmTxDir = VSCSIIOREQTXDIR_INVALID;
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync /* Check for EVPD bit. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiVpdPagePoolQueryPage(&pVScsiLunSbc->VpdPagePool, pVScsiReq, pVScsiReq->pbCDB[2]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync else if (pVScsiReq->pbCDB[2] != 0) /* A non zero page code is an error. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync ScsiInquiryReply.u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS;
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync ScsiInquiryReply.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_CONNECTED;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync ScsiInquiryReply.u3AnsiVersion = 0x05; /* SPC-4 compliant */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync ScsiInquiryReply.fCmdQue = 1; /* Command queuing supported. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync vscsiPadStr(ScsiInquiryReply.achVendorId, "VBOX", 8);
9540eeb13face31ddc1c5f15338556fe46f18a77vboxsync vscsiPadStr(ScsiInquiryReply.achProductId, "HARDDISK", 16);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync vscsiPadStr(ScsiInquiryReply.achProductLevel, "1.0", 4);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, (uint8_t *)&ScsiInquiryReply, sizeof(SCSIINQUIRYDATA));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * If sector size exceeds the maximum value that is
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync * able to be stored in 4 bytes return 0xffffffff in this field
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cSectorTransfer = vscsiBE2HU16(&pVScsiReq->pbCDB[7]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cSectorTransfer = vscsiBE2HU32(&pVScsiReq->pbCDB[6]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cSectorTransfer = vscsiBE2HU32(&pVScsiReq->pbCDB[10]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cSectorTransfer = vscsiBE2HU16(&pVScsiReq->pbCDB[7]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cSectorTransfer = vscsiBE2HU32(&pVScsiReq->pbCDB[6]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cSectorTransfer = vscsiBE2HU32(&pVScsiReq->pbCDB[10]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync break; /* Handled below */
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync /* We do not implement an echo buffer. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
af5224eb6b6676bc892a3f5abeb21f602547d31cvboxsync uint16_t cbMax = vscsiBE2HU16(&pVScsiReq->pbCDB[7]);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
36fbf6dcd3e6b2e5891456b730577ff0eb355c9fvboxsync if (pVScsiLun->fFeatures & VSCSI_LUN_FEATURE_UNMAP)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Leave the rest 0 */
36fbf6dcd3e6b2e5891456b730577ff0eb355c9fvboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00); /* Don't know if this is correct */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync if (pVScsiLun->fFeatures & VSCSI_LUN_FEATURE_UNMAP)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync size_t cbList = vscsiBE2HU16(&pVScsiReq->pbCDB[7]);
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync /* Copy the header. */
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abHdr[0], sizeof(abHdr));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Using the anchor bit is not supported. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync paRanges = (PRTRANGE)RTMemAllocZ(cBlkDesc * sizeof(RTRANGE));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync for (unsigned i = 0; i < cBlkDesc; i++)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abBlkDesc[0], sizeof(abBlkDesc));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync paRanges[i].offStart = vscsiBE2HU64(&abBlkDesc[0]) * 512;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync paRanges[i].cbRange = vscsiBE2HU32(&abBlkDesc[8]) * 512;
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiIoReqUnmapEnqueue(pVScsiLun, pVScsiReq, paRanges, cBlkDesc);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync else /* Out of memory. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_HARDWARE_ERROR, SCSI_ASC_SYSTEM_RESOURCE_FAILURE,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync else /* No block descriptors is not an error condition. */
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync else /* Invalid CDB. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE, 0x00);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync //AssertMsgFailed(("Command %#x [%s] not implemented\n", pRequest->pbCDB[0], SCSICmdText(pRequest->pbCDB[0])));
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE, 0x00);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync LogFlow(("%s: uLbaStart=%llu cSectorTransfer=%u\n",
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunSbc->cSectors))
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR, 0x00);
762a68c2bb3ccde807330e3d1cb05f8b244a5f72vboxsync vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* A 0 transfer length is not an error. */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
fe554d9c0e3a6de4ba221610ac95a44c7d288e01vboxsync /* Enqueue new I/O request */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync rc = vscsiIoReqTransferEnqueue(pVScsiLun, pVScsiReq, enmTxDir,
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync else if (pVScsiReq->pbCDB[0] == SCSI_SYNCHRONIZE_CACHE)
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /* Enqueue flush */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync else if (pVScsiReq->pbCDB[0] != SCSI_UNMAP) /* Request completed */
9b7ab382b3f9667e8847020e1e58f7143c4d2334vboxsync vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** enmLunType */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** pcszDescName */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** cbLun */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** pfnVScsiLunInit */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** pfnVScsiLunDestroy */
016096e367cd20c3d3c3fd9a6650b55935c2e31dvboxsync /** pfnVScsiLunReqProcess */