iscsi: base all handling of check condition on scsi_sense_to_errno

Now that scsi-disk is not using scsi_sense_to_errno to separate guest-recoverable
sense codes, we can modify it to simplify iscsi's own sense handling.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2019-07-02 11:40:41 +02:00
parent 00e3cccdf4
commit 8c460269aa
2 changed files with 16 additions and 18 deletions

View file

@ -225,9 +225,9 @@ static inline unsigned exp_random(double mean)
static int iscsi_translate_sense(struct scsi_sense *sense) static int iscsi_translate_sense(struct scsi_sense *sense)
{ {
return - scsi_sense_to_errno(sense->key, return scsi_sense_to_errno(sense->key,
(sense->ascq & 0xFF00) >> 8, (sense->ascq & 0xFF00) >> 8,
sense->ascq & 0xFF); sense->ascq & 0xFF);
} }
/* Called (via iscsi_service) with QemuMutex held. */ /* Called (via iscsi_service) with QemuMutex held. */
@ -244,13 +244,6 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
if (status != SCSI_STATUS_GOOD) { if (status != SCSI_STATUS_GOOD) {
if (iTask->retries++ < ISCSI_CMD_RETRIES) { if (iTask->retries++ < ISCSI_CMD_RETRIES) {
if (status == SCSI_STATUS_CHECK_CONDITION
&& task->sense.key == SCSI_SENSE_UNIT_ATTENTION) {
error_report("iSCSI CheckCondition: %s",
iscsi_get_error(iscsi));
iTask->do_retry = 1;
goto out;
}
if (status == SCSI_STATUS_BUSY || if (status == SCSI_STATUS_BUSY ||
status == SCSI_STATUS_TIMEOUT || status == SCSI_STATUS_TIMEOUT ||
status == SCSI_STATUS_TASK_SET_FULL) { status == SCSI_STATUS_TASK_SET_FULL) {
@ -272,14 +265,20 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int status,
timer_mod(&iTask->retry_timer, timer_mod(&iTask->retry_timer,
qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + retry_time); qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + retry_time);
iTask->do_retry = 1; iTask->do_retry = 1;
goto out; }
} else if (status == SCSI_STATUS_CHECK_CONDITION) {
int error = iscsi_translate_sense(&task->sense);
if (error == EAGAIN) {
error_report("iSCSI CheckCondition: %s",
iscsi_get_error(iscsi));
iTask->do_retry = 1;
} else {
iTask->err_code = -error;
iTask->err_str = g_strdup(iscsi_get_error(iscsi));
} }
} }
iTask->err_code = iscsi_translate_sense(&task->sense);
iTask->err_str = g_strdup(iscsi_get_error(iscsi));
} }
out:
if (iTask->co) { if (iTask->co) {
aio_bh_schedule_oneshot(iTask->iscsilun->aio_context, aio_bh_schedule_oneshot(iTask->iscsilun->aio_context,
iscsi_co_generic_bh_cb, iTask); iscsi_co_generic_bh_cb, iTask);
@ -974,7 +973,7 @@ iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status,
if (status < 0) { if (status < 0) {
error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s", error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s",
iscsi_get_error(iscsi)); iscsi_get_error(iscsi));
acb->status = iscsi_translate_sense(&acb->task->sense); acb->status = -iscsi_translate_sense(&acb->task->sense);
} }
acb->ioh->driver_status = 0; acb->ioh->driver_status = 0;

View file

@ -379,8 +379,7 @@ int scsi_sense_to_errno(int key, int asc, int ascq)
case NO_SENSE: case NO_SENSE:
case RECOVERED_ERROR: case RECOVERED_ERROR:
case UNIT_ATTENTION: case UNIT_ATTENTION:
/* These sense keys are not errors */ return EAGAIN;
return 0;
case ABORTED_COMMAND: /* COMMAND ABORTED */ case ABORTED_COMMAND: /* COMMAND ABORTED */
return ECANCELED; return ECANCELED;
case NOT_READY: case NOT_READY:
@ -409,7 +408,7 @@ int scsi_sense_to_errno(int key, int asc, int ascq)
case 0x2700: /* WRITE PROTECTED */ case 0x2700: /* WRITE PROTECTED */
return EACCES; return EACCES;
case 0x0401: /* NOT READY, IN PROGRESS OF BECOMING READY */ case 0x0401: /* NOT READY, IN PROGRESS OF BECOMING READY */
return EAGAIN; return EINPROGRESS;
case 0x0402: /* NOT READY, INITIALIZING COMMAND REQUIRED */ case 0x0402: /* NOT READY, INITIALIZING COMMAND REQUIRED */
return ENOTCONN; return ENOTCONN;
default: default: