diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-05-31 13:56:24 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-06-18 12:43:03 +0200 |
commit | 1288844e7c4ede59509bf697a4cca0f2215a1ce3 (patch) | |
tree | 8bad1e035b58571b4349fd0f6be862ed7c2e3558 | |
parent | f0d2a4d4d63dd2f0f3ecb2d591b979b0e7f24a22 (diff) | |
download | qemu-1288844e7c4ede59509bf697a4cca0f2215a1ce3.tar.gz qemu-1288844e7c4ede59509bf697a4cca0f2215a1ce3.tar.bz2 qemu-1288844e7c4ede59509bf697a4cca0f2215a1ce3.zip |
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>
-rw-r--r-- | block/iscsi.c | 94 |
1 files changed, 46 insertions, 48 deletions
diff --git a/block/iscsi.c b/block/iscsi.c index 6171b01bec..0bbf0b18b4 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -931,60 +931,58 @@ static int iscsi_readcapacity_sync(IscsiLun *iscsilun) int ret = 0; int retries = ISCSI_CMD_RETRIES; -try_again: - switch (iscsilun->type) { - case TYPE_DISK: - task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun); - 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); - if (rc16 == NULL) { - error_report("iSCSI: Failed to unmarshall readcapacity16 data."); - ret = -EINVAL; - goto out; - } - iscsilun->block_size = rc16->block_length; - iscsilun->num_blocks = rc16->returned_lba + 1; - break; - case TYPE_ROM: - task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0); - 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); - if (rc10 == NULL) { - error_report("iSCSI: Failed to unmarshall readcapacity10 data."); - ret = -EINVAL; - goto out; + do { + if (task != NULL) { + scsi_free_scsi_task(task); + task = NULL; } - iscsilun->block_size = rc10->block_size; - if (rc10->lba == 0) { - /* blank disk loaded */ - iscsilun->num_blocks = 0; - } else { - iscsilun->num_blocks = rc10->lba + 1; + + switch (iscsilun->type) { + case TYPE_DISK: + task = iscsi_readcapacity16_sync(iscsilun->iscsi, iscsilun->lun); + if (task != NULL && task->status == SCSI_STATUS_GOOD) { + rc16 = scsi_datain_unmarshall(task); + if (rc16 == NULL) { + error_report("iSCSI: Failed to unmarshall readcapacity16 data."); + ret = -EINVAL; + } else { + iscsilun->block_size = rc16->block_length; + iscsilun->num_blocks = rc16->returned_lba + 1; + } + } + break; + case TYPE_ROM: + task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0); + if (task != NULL && task->status == SCSI_STATUS_GOOD) { + rc10 = scsi_datain_unmarshall(task); + if (rc10 == NULL) { + error_report("iSCSI: Failed to unmarshall readcapacity10 data."); + ret = -EINVAL; + } else { + iscsilun->block_size = rc10->block_size; + if (rc10->lba == 0) { + /* blank disk loaded */ + iscsilun->num_blocks = 0; + } else { + iscsilun->num_blocks = rc10->lba + 1; + } + } + } + break; + default: + return 0; } - break; - default: - break; - } + } 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) { scsi_free_scsi_task(task); } - return ret; } |