iscsi: reorganize iscsi_readcapacity_sync

Avoid the goto, and use the same retry logic for the 10- and 16-
byte versions.

Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit 1288844e7c)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Paolo Bonzini 2013-05-31 13:56:24 +02:00 committed by Michael Roth
parent 1b94fc4b9a
commit cb55efe6db
1 changed files with 47 additions and 49 deletions

View File

@ -931,43 +931,34 @@ static int iscsi_readcapacity_sync(IscsiLun *iscsilun)
int ret = 0; int ret = 0;
int retries = ISCSI_CMD_RETRIES; int retries = ISCSI_CMD_RETRIES;
try_again: do {
if (task != NULL) {
scsi_free_scsi_task(task);
task = NULL;
}
switch (iscsilun->type) { switch (iscsilun->type) {
case TYPE_DISK: case TYPE_DISK:
task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun); task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun);
if (task == NULL || task->status != SCSI_STATUS_GOOD) { if (task != NULL && task->status == SCSI_STATUS_GOOD) {
if (task != NULL && task->status == SCSI_STATUS_CHECK_CONDITION
&& task->sense.key == SCSI_SENSE_UNIT_ATTENTION
&& retries-- > 0) {
scsi_free_scsi_task(task);
goto try_again;
}
error_report("iSCSI: failed to send readcapacity16 command.");
ret = -EINVAL;
goto out;
}
rc16 = scsi_datain_unmarshall(task); rc16 = scsi_datain_unmarshall(task);
if (rc16 == NULL) { if (rc16 == NULL) {
error_report("iSCSI: Failed to unmarshall readcapacity16 data."); error_report("iSCSI: Failed to unmarshall readcapacity16 data.");
ret = -EINVAL; ret = -EINVAL;
goto out; } else {
}
iscsilun->block_size = rc16->block_length; iscsilun->block_size = rc16->block_length;
iscsilun->num_blocks = rc16->returned_lba + 1; iscsilun->num_blocks = rc16->returned_lba + 1;
}
}
break; break;
case TYPE_ROM: case TYPE_ROM:
task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0); task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0);
if (task == NULL || task->status != SCSI_STATUS_GOOD) { if (task != NULL && task->status == SCSI_STATUS_GOOD) {
error_report("iSCSI: failed to send readcapacity10 command.");
ret = -EINVAL;
goto out;
}
rc10 = scsi_datain_unmarshall(task); rc10 = scsi_datain_unmarshall(task);
if (rc10 == NULL) { if (rc10 == NULL) {
error_report("iSCSI: Failed to unmarshall readcapacity10 data."); error_report("iSCSI: Failed to unmarshall readcapacity10 data.");
ret = -EINVAL; ret = -EINVAL;
goto out; } else {
}
iscsilun->block_size = rc10->block_size; iscsilun->block_size = rc10->block_size;
if (rc10->lba == 0) { if (rc10->lba == 0) {
/* blank disk loaded */ /* blank disk loaded */
@ -975,16 +966,23 @@ try_again:
} else { } else {
iscsilun->num_blocks = rc10->lba + 1; iscsilun->num_blocks = rc10->lba + 1;
} }
}
}
break; break;
default: default:
break; return 0;
} }
} while (task != NULL && task->status == SCSI_STATUS_CHECK_CONDITION
&& task->sense.key == SCSI_SENSE_UNIT_ATTENTION
&& retries-- > 0);
out: if (task == NULL || task->status != SCSI_STATUS_GOOD) {
error_report("iSCSI: failed to send readcapacity10 command.");
ret = -EINVAL;
}
if (task) { if (task) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
} }
return ret; return ret;
} }