mirror of https://gitee.com/openkylin/linux.git
target: Set peripheral device type consistently in INQUIRY response
Current code sets the peripheral device type to 0x3f == "not present unknown" for virtual LUN 0 for standard INQUIRY commands, but leaves it as 0 == "connected direct access block" for VPD INQUIRY commands. This is just because the check for LUN 0 only happens in some code paths. Make our peripheral device type consistent by moving the LUN 0 check into the common emulate_inquiry() code. Signed-off-by: Roland Dreier <roland@purestorage.com> Cc: stable@vger.kernel.org Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
d95b82461c
commit
089461dda1
|
@ -70,15 +70,11 @@ target_emulate_inquiry_std(struct se_cmd *cmd, char *buf)
|
|||
{
|
||||
struct se_lun *lun = cmd->se_lun;
|
||||
struct se_device *dev = cmd->se_dev;
|
||||
struct se_portal_group *tpg = lun->lun_sep->sep_tpg;
|
||||
|
||||
if (dev == tpg->tpg_virt_lun0.lun_se_dev) {
|
||||
buf[0] = 0x3f; /* Not connected */
|
||||
} else {
|
||||
buf[0] = dev->transport->get_device_type(dev);
|
||||
if (buf[0] == TYPE_TAPE)
|
||||
/* Set RMB (removable media) for tape devices */
|
||||
if (dev->transport->get_device_type(dev) == TYPE_TAPE)
|
||||
buf[1] = 0x80;
|
||||
}
|
||||
|
||||
buf[2] = dev->transport->get_device_rev(dev);
|
||||
|
||||
/*
|
||||
|
@ -606,6 +602,7 @@ int target_emulate_inquiry(struct se_task *task)
|
|||
{
|
||||
struct se_cmd *cmd = task->task_se_cmd;
|
||||
struct se_device *dev = cmd->se_dev;
|
||||
struct se_portal_group *tpg = cmd->se_lun->lun_sep->sep_tpg;
|
||||
unsigned char *buf, *map_buf;
|
||||
unsigned char *cdb = cmd->t_task_cdb;
|
||||
int p, ret;
|
||||
|
@ -630,6 +627,11 @@ int target_emulate_inquiry(struct se_task *task)
|
|||
buf = map_buf;
|
||||
}
|
||||
|
||||
if (dev == tpg->tpg_virt_lun0.lun_se_dev)
|
||||
buf[0] = 0x3f; /* Not connected */
|
||||
else
|
||||
buf[0] = dev->transport->get_device_type(dev);
|
||||
|
||||
if (!(cdb[1] & 0x1)) {
|
||||
if (cdb[2]) {
|
||||
pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n",
|
||||
|
@ -643,8 +645,6 @@ int target_emulate_inquiry(struct se_task *task)
|
|||
goto out;
|
||||
}
|
||||
|
||||
buf[0] = dev->transport->get_device_type(dev);
|
||||
|
||||
for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) {
|
||||
if (cdb[2] == evpd_handlers[p].page) {
|
||||
buf[1] = cdb[2];
|
||||
|
|
Loading…
Reference in New Issue