[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-stable] [PATCH 7/7] iscsi: reorganize iscsi_readcapacity_sync
From: |
Paolo Bonzini |
Subject: |
[Qemu-stable] [PATCH 7/7] iscsi: reorganize iscsi_readcapacity_sync |
Date: |
Tue, 18 Jun 2013 16:16:56 +0200 |
Avoid the goto, and use the same retry logic for the 10- and 16-
byte versions.
Cc: address@hidden
Signed-off-by: Paolo Bonzini <address@hidden>
---
block/iscsi.c | 94 +++++++++++++++++++++++++++++------------------------------
1 file changed, 46 insertions(+), 48 deletions(-)
diff --git a/block/iscsi.c b/block/iscsi.c
index 6171b01..0bbf0b1 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;
}
--
1.8.1.4
- [Qemu-stable] [PULL 0/7] SCSI patches for 2013-06-18 (including 1.5.1 patches), Paolo Bonzini, 2013/06/18
- [Qemu-stable] [PATCH 1/7] scsi: reset cdrom tray statuses on scsi_disk_reset, Paolo Bonzini, 2013/06/18
- [Qemu-stable] [PATCH 2/7] scsi-generic: fix sign extension of READ CAPACITY(10) data, Paolo Bonzini, 2013/06/18
- [Qemu-stable] [PATCH 3/7] scsi-generic: check the return value of bdrv_aio_ioctl in execute_command, Paolo Bonzini, 2013/06/18
- [Qemu-stable] [PATCH 7/7] iscsi: reorganize iscsi_readcapacity_sync,
Paolo Bonzini <=
- [Qemu-stable] [PATCH 6/7] iscsi: simplify freeing of tasks, Paolo Bonzini, 2013/06/18
- [Qemu-stable] [PATCH 5/7] vhost-scsi: fix k->set_guest_notifiers() NULL dereference, Paolo Bonzini, 2013/06/18
- [Qemu-stable] [PATCH 4/7] scsi-disk: scsi-block device for scsi pass-through should not be removable, Paolo Bonzini, 2013/06/18