fix: do only query unit serial for non-removable direct access devices
other device types might not implement evpd page 0x80 or change their serial. Signed-off-by: Peter Lieven <pl@dlhnet.de>
This commit is contained in:
@@ -77,15 +77,16 @@ iscsi_testunitready_connect(struct iscsi_context *iscsi, int lun,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct scsi_task *
|
static struct scsi_task *
|
||||||
iscsi_inquiry_page_0x80_connect(struct iscsi_context *iscsi, int lun,
|
iscsi_inquiry_task_connect(struct iscsi_context *iscsi, int lun, int evpd, int page_code,
|
||||||
iscsi_command_cb cb, void *private_data)
|
int maxsize, iscsi_command_cb cb, void *private_data)
|
||||||
{
|
{
|
||||||
struct scsi_task *task;
|
struct scsi_task *task;
|
||||||
struct iscsi_context *old_iscsi = iscsi->old_iscsi;
|
struct iscsi_context *old_iscsi = iscsi->old_iscsi;
|
||||||
|
|
||||||
iscsi->old_iscsi = NULL;
|
iscsi->old_iscsi = NULL;
|
||||||
task = iscsi_inquiry_task(iscsi, lun, 1, 0x80, MAX_STRING_SIZE + 64,
|
|
||||||
cb, private_data);
|
task = iscsi_inquiry_task(iscsi, lun, evpd, page_code, maxsize, cb, private_data);
|
||||||
|
|
||||||
iscsi->old_iscsi = old_iscsi;
|
iscsi->old_iscsi = old_iscsi;
|
||||||
|
|
||||||
return task;
|
return task;
|
||||||
@@ -125,6 +126,41 @@ iscsi_inquiry_page_0x80_cb(struct iscsi_context *iscsi, int status,
|
|||||||
iscsi_free(iscsi, ct);
|
iscsi_free(iscsi, ct);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
iscsi_inquiry_page_0x0_cb(struct iscsi_context *iscsi, int status,
|
||||||
|
void *command_data, void *private_data)
|
||||||
|
{
|
||||||
|
struct connect_task *ct = private_data;
|
||||||
|
struct scsi_task *task = command_data;
|
||||||
|
struct scsi_inquiry_standard *inq;
|
||||||
|
|
||||||
|
if (!status) {
|
||||||
|
inq = scsi_datain_unmarshall(task);
|
||||||
|
if (inq != NULL) {
|
||||||
|
ISCSI_LOG(iscsi, 2, "type [%s] vendor [%s] product [%s] rev [%s]",
|
||||||
|
scsi_devtype_to_str(inq->device_type), inq->vendor_identification,
|
||||||
|
inq->product_identification, inq->product_revision_level);
|
||||||
|
if (!inq->rmb && inq->device_type == SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) {
|
||||||
|
if (iscsi_inquiry_task_connect(iscsi, ct->lun, 1, 0x80, MAX_STRING_SIZE + 4,
|
||||||
|
iscsi_inquiry_page_0x80_cb, ct) != NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
iscsi_set_error(iscsi, "iscsi_inquiry_task for evpd 0x80 failed.");
|
||||||
|
status = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
iscsi_set_error(iscsi, "iscsi_inquiry_task datain_unmarshall failed. could not read vpd page 0x0.");
|
||||||
|
status = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
iscsi_set_error(iscsi, "iscsi_inquiry_task failed. could not read vpd page 0x0.");
|
||||||
|
}
|
||||||
|
|
||||||
|
ct->cb(iscsi, status?SCSI_STATUS_ERROR:SCSI_STATUS_GOOD, NULL, ct->private_data);
|
||||||
|
scsi_free_scsi_task(task);
|
||||||
|
iscsi_free(iscsi, ct);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
|
iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
|
||||||
void *command_data, void *private_data)
|
void *command_data, void *private_data)
|
||||||
@@ -194,10 +230,9 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iscsi_inquiry_page_0x80_connect(iscsi, ct->lun,
|
if (iscsi_inquiry_task_connect(iscsi, ct->lun, 0, 0, 96,
|
||||||
iscsi_inquiry_page_0x80_cb,
|
iscsi_inquiry_page_0x0_cb, ct) == NULL) {
|
||||||
ct) == NULL) {
|
iscsi_set_error(iscsi, "iscsi_inquiry_task for vpd 0x0 failed.");
|
||||||
iscsi_set_error(iscsi, "iscsi_inquiry_task failed.");
|
|
||||||
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
|
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
|
||||||
iscsi_free(iscsi, ct);
|
iscsi_free(iscsi, ct);
|
||||||
}
|
}
|
||||||
@@ -238,10 +273,10 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data,
|
|||||||
iscsi_free(iscsi, ct);
|
iscsi_free(iscsi, ct);
|
||||||
}
|
}
|
||||||
} else if (ct->lun != -1) {
|
} else if (ct->lun != -1) {
|
||||||
if (iscsi_inquiry_page_0x80_connect(iscsi, ct->lun,
|
if (iscsi_inquiry_task_connect(iscsi, ct->lun, 0, 0, 96,
|
||||||
iscsi_inquiry_page_0x80_cb,
|
iscsi_inquiry_page_0x0_cb,
|
||||||
ct) == NULL) {
|
ct) == NULL) {
|
||||||
iscsi_set_error(iscsi, "iscsi_inquiry_task failed.");
|
iscsi_set_error(iscsi, "iscsi_inquiry_task for vpd 0x0 failed.");
|
||||||
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
|
ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data);
|
||||||
iscsi_free(iscsi, ct);
|
iscsi_free(iscsi, ct);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user