VSCSIDevice.cpp revision eeba9966af30f77cc308fd7140cc3d8e8a388780
/* $Id$ */
/** @file
* Virtual SCSI driver: Device handling
*/
/*
* Copyright (C) 2006-2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#define LOG_GROUP LOG_GROUP_VSCSI
#include "VSCSIInternal.h"
/**
* Checks if a specific LUN exists fir the SCSI device
*
* @returns true if the LUN is present
* false otherwise
* @param pVScsiDevice The SCSI device instance.
* @param iLun The LUN to check for.
*/
{
}
/**
* Process a request common for all device types.
*
* @returns Flag whether we could handle the request.
* @param pVScsiDevice The virtual SCSI device instance.
* @param pVScsiReq The SCSi request.
* @param prcReq The final return value if the request was handled.
*/
int *prcReq)
{
bool fProcessed = true;
{
case SCSI_INQUIRY:
{
{
ScsiInquiryReply.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED;
cbData = RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, (uint8_t *)&ScsiInquiryReply, sizeof(SCSIINQUIRYDATA));
}
else
fProcessed = false; /* Let the LUN process the request because it will provide LUN specific data */
break;
}
case SCSI_REPORT_LUNS:
{
/*
* If allocation length is less than 16 bytes SPC compliant devices have
* to return an error.
*/
*prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
else
{
if (cbData < 16)
*prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
else
}
break;
}
case SCSI_TEST_UNIT_READY:
{
else
fProcessed = false; /* The LUN (if present) will provide details. */
break;
}
case SCSI_REQUEST_SENSE:
{
/* Descriptor format sense data is not supported and results in an error. */
*prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00);
else
break;
}
default:
fProcessed = false;
}
return fProcessed;
}
{
rcReq);
}
void *pvVScsiDeviceUser)
{
int rc = VINF_SUCCESS;
if (!pVScsiDevice)
return VERR_NO_MEMORY;
pVScsiDevice->cLunsAttached = 0;
pVScsiDevice->cLunsMax = 0;
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
return rc;
}
{
if (pVScsiDevice->cLunsAttached > 0)
if (pVScsiDevice->papVScsiLun)
return VINF_SUCCESS;;
}
{
int rc = VINF_SUCCESS;
/* Parameter checks */
{
if (pVScsiDevice->papVScsiLun)
{
if (papLunOld)
}
else
rc = VERR_NO_MEMORY;
}
if (RT_SUCCESS(rc))
{
}
return rc;
}
{
/* Parameter checks */
*phVScsiLun = pVScsiLun;
return VINF_SUCCESS;
}
{
/* Parameter checks */
return VINF_SUCCESS;
}
{
int rc = VINF_SUCCESS;
/* Parameter checks */
/* Check if this request can be handled by us */
int rcReq;
if (!fProcessed)
{
/* Pass to the LUN driver */
{
}
else
{
/* LUN not present, report error. */
0x00);
SCSI_STATUS_CHECK_CONDITION, false, VINF_SUCCESS);
}
}
else
rcReq, false, VINF_SUCCESS);
return rc;
}
{
/* Parameter checks */
if (!pVScsiReq)
return VERR_NO_MEMORY;
if (cSGListEntries)
*phVScsiReq = pVScsiReq;
return VINF_SUCCESS;
}