[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 04/10] scsi: introduce sg_io_sense_from_errno
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 04/10] scsi: introduce sg_io_sense_from_errno |
Date: |
Tue, 22 Aug 2017 15:53:01 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 |
On 22/08/2017 15:45, Philippe Mathieu-Daudé wrote:
> Hi Paolo,
>
> On 08/22/2017 10:18 AM, Paolo Bonzini wrote:
>> Move more knowledge of SG_IO out of hw/scsi/scsi-generic.c, for
>> reusability.
>>
>> Signed-off-by: Paolo Bonzini <address@hidden>
>> ---
>> hw/scsi/scsi-generic.c | 40 +++++++---------------------------------
>> include/scsi/utils.h | 3 +++
>> scsi/utils.c | 35 +++++++++++++++++++++++++++++++++++
>> 3 files changed, 45 insertions(+), 33 deletions(-)
>>
>> diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
>> index 7a8f500934..04c687ee76 100644
>> --- a/hw/scsi/scsi-generic.c
>> +++ b/hw/scsi/scsi-generic.c
>> @@ -81,6 +81,7 @@ static void scsi_free_request(SCSIRequest *req)
>> static void scsi_command_complete_noio(SCSIGenericReq *r, int ret)
>> {
>> int status;
>> + SCSISense sense;
>> assert(r->req.aiocb == NULL);
>> @@ -88,42 +89,15 @@ static void
>> scsi_command_complete_noio(SCSIGenericReq *r, int ret)
>> scsi_req_cancel_complete(&r->req);
>> goto done;
>> }
>> - if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
>> - r->req.sense_len = r->io_header.sb_len_wr;
>> - }
>> -
>> - if (ret != 0) {
>> - switch (ret) {
>> - case -EDOM:
>> - status = TASK_SET_FULL;
>> - break;
>> - case -ENOMEM:
>> - status = CHECK_CONDITION;
>> - scsi_req_build_sense(&r->req, SENSE_CODE(TARGET_FAILURE));
>> - break;
>> - default:
>> - status = CHECK_CONDITION;
>> - scsi_req_build_sense(&r->req, SENSE_CODE(IO_ERROR));
>> - break;
>> - }
>> - } else {
>> - if (r->io_header.host_status == SG_ERR_DID_NO_CONNECT ||
>> - r->io_header.host_status == SG_ERR_DID_BUS_BUSY ||
>> - r->io_header.host_status == SG_ERR_DID_TIME_OUT ||
>> - (r->io_header.driver_status & SG_ERR_DRIVER_TIMEOUT)) {
>> - status = BUSY;
>> - BADF("Driver Timeout\n");
>> - } else if (r->io_header.host_status) {
>> - status = CHECK_CONDITION;
>> - scsi_req_build_sense(&r->req, SENSE_CODE(I_T_NEXUS_LOSS));
>> - } else if (r->io_header.status) {
>> - status = r->io_header.status;
>> - } else if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
>> - status = CHECK_CONDITION;
>> + status = sg_io_sense_from_errno(-ret, &r->io_header, &sense);
>> + if (status == CHECK_CONDITION) {
>> + if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) {
>> + r->req.sense_len = r->io_header.sb_len_wr;
>> } else {
>> - status = GOOD;
>> + scsi_req_build_sense(&r->req, sense);
>> }
>> }
>> +
>> DPRINTF("Command complete 0x%p tag=0x%x status=%d\n",
>> r, r->req.tag, status);
>> diff --git a/include/scsi/utils.h b/include/scsi/utils.h
>> index 76c3db98c0..c12b34f2e5 100644
>> --- a/include/scsi/utils.h
>> +++ b/include/scsi/utils.h
>> @@ -113,6 +113,9 @@ int scsi_cdb_length(uint8_t *buf);
>> #define SG_ERR_DID_TIME_OUT 0x03
>> #define SG_ERR_DRIVER_SENSE 0x08
>> +
>> +int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr,
>> + SCSISense *sense);
>> #endif
>> #endif
>> diff --git a/scsi/utils.c b/scsi/utils.c
>> index 54d6d4486a..ca5b058a73 100644
>> --- a/scsi/utils.c
>> +++ b/scsi/utils.c
>> @@ -412,3 +412,38 @@ const char *scsi_command_name(uint8_t cmd)
>> }
>> return names[cmd];
>> }
>> +
>> +#ifdef CONFIG_LINUX
>> +int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr,
>> + SCSISense *sense)
>> +{
>> + if (errno_value != 0) {
>> + switch (errno_value) {
>> + case EDOM:
>> + return TASK_SET_FULL;
>> + case ENOMEM:
>> + *sense = SENSE_CODE(TARGET_FAILURE);
>> + return CHECK_CONDITION;
>> + default:
>> + *sense = SENSE_CODE(IO_ERROR);
>> + return CHECK_CONDITION;
>> + }
>> + } else {
>> + if (io_hdr->host_status == SG_ERR_DID_NO_CONNECT ||
>> + io_hdr->host_status == SG_ERR_DID_BUS_BUSY ||
>> + io_hdr->host_status == SG_ERR_DID_TIME_OUT ||
>> + (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT)) {
>> + return BUSY;
>> + } else if (io_hdr->host_status) {
>> + *sense = SENSE_CODE(I_T_NEXUS_LOSS);
>> + return CHECK_CONDITION;
>> + } else if (io_hdr->status) {
>> + return io_hdr->status;
>> + } else if (io_hdr->driver_status & SG_ERR_DRIVER_SENSE) {
>> + return CHECK_CONDITION;
>> + }
>
>> + }
> I find it easier to read with the return GOOD out of the if/else:
>
> return GOOD;
Yes, you're right.
Paolo
- [Qemu-devel] [RFC PATCH 00/10] scsi, block: introduce persistent reservation managers, Paolo Bonzini, 2017/08/22
- [Qemu-devel] [PATCH 03/10] scsi: introduce scsi_build_sense, Paolo Bonzini, 2017/08/22
- [Qemu-devel] [PATCH 01/10] scsi: rename scsi_convert_sense, Paolo Bonzini, 2017/08/22
- [Qemu-devel] [PATCH 04/10] scsi: introduce sg_io_sense_from_errno, Paolo Bonzini, 2017/08/22
- [Qemu-devel] [PATCH 05/10] scsi: move block/scsi.h to include/scsi/constants.h, Paolo Bonzini, 2017/08/22
- [Qemu-devel] [PATCH 02/10] scsi: move non-emulation specific code to scsi/, Paolo Bonzini, 2017/08/22
- [Qemu-devel] [PATCH 06/10] scsi, file-posix: add support for persistent reservation management, Paolo Bonzini, 2017/08/22