From nobody Mon Feb 9 20:12:58 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1614191678; cv=none; d=zohomail.com; s=zohoarc; b=F1H5RONn6NXyFPL35laTNoJrymufZ60Qt/ObQSA0H63Ofh8dnznqN/sRmv4ElB6/cR2oVUX1OrbVwwYbnki9xfHakYlx2Ncd7oB3mTGklkBQXr1KCsEbUL65UlCHGI9+/TGmaGUu6OW0DxUYGLcBVftDbk5LFnURPhBoX84D0Fo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614191678; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=wt9pMPT0lL6EDRJ3SAekZXeRCQPtgI8juZkbMJm8DfQ=; b=U+HpO5pxNPXXHRGxfAHJjJnYprep8eLMMhaHNKyIpQvy/bYeXENn1twQVH2rsNguYVPja7en/8UkIUf8A9Wj9hX1A77lA+dOdKdiowxATFEvnawWszdQdSoBPBm4bZiVH2W+7e10BshC/+DwxB2S9P8FxZSZ4+vNQywO7QZjjK8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1614191678615385.99371406221246; Wed, 24 Feb 2021 10:34:38 -0800 (PST) Received: from localhost ([::1]:33550 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyzd-0003TV-FA for importer@patchew.org; Wed, 24 Feb 2021 13:34:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37634) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqO-0002MZ-Hz for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:04 -0500 Received: from mail-ej1-x62b.google.com ([2a00:1450:4864:20::62b]:33989) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqM-0004os-Cl for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:04 -0500 Received: by mail-ej1-x62b.google.com with SMTP id hs11so4659649ejc.1 for ; Wed, 24 Feb 2021 10:25:01 -0800 (PST) Received: from avogadro.lan ([2001:b07:6468:f312:c8dd:75d4:99ab:290a]) by smtp.gmail.com with ESMTPSA id bw22sm1791172ejb.78.2021.02.24.10.25.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:25:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wt9pMPT0lL6EDRJ3SAekZXeRCQPtgI8juZkbMJm8DfQ=; b=vARZBQ95dfJ0EVwKct9IQVCiCKUQf8VkzVPtBHG/sboU3fToD/wgBIKId1pxVNAtnH HDnBM/tqT04nIvW0rYQYe/Y1xUelkHefVZI9tBGCakEGVxOltX0Aook2dW/ZuPbSiJ8m +N9OKLIviDjy5ForSKP1gmtOh+RftgyNEjRUX9bAHeO/IuBDD0FeaEgOXDIc1k8Qkw+c FXZEyu+6faZ5hY686PQJbguJoXRscZzLgdK7nKkh9Ifei6P8zmeJuDj9NTM2MqAl4bLq WFB4abfDyMXe8Tqmpfy/4uvDNdjKwNihMhI2ITAOKQ72vLUqfUQXvnSvx/w0wYXgNR0c wNBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=wt9pMPT0lL6EDRJ3SAekZXeRCQPtgI8juZkbMJm8DfQ=; b=PdVSPF5hdc8emhelezdE7y8QPKYJfdYdLj16KRcBxJ4IG4QdIzqFyVbR0iE3W/gWIf czkd8lE3MnXs+NLifZNSI8oqyh7mpR5hqg6R4gnj3zLoeVYEoL7n0efj3k1mhe89tQFX M0dK82j8QKZayCHnOqv+Gpo9L8tG6cxzpi1Z7vO7tCi4c0KwbI5lWOZ1Gl/+9t0MC7+o Io2L16ETGunWP+Hjc0cGDwJWWj55rJclkzP7n3uvxJ0/Tt1r8BRO9P9iOQwrKcx/wbQs Rvf1qcNJvOsw+plaHgph0s3XWEx1dG1xTmTZacnvTqmaa188toB+7UgvjufazS/fwy4v X+xA== X-Gm-Message-State: AOAM531O4OyYuRZWqQw7pvRmjf82Rsmr8bLNyPMq329yCdC+NISsV1dY dB73yLUI7zNNk+VrjLr8BTkbrH3R0JQ= X-Google-Smtp-Source: ABdhPJwJizYXoUC3BFF0gZ+mejC93L8DQHtWrZ1IwCjBjMp8tQ7VPaDpBhoYUZ94RwI9r94UiZM+pA== X-Received: by 2002:a17:906:3e42:: with SMTP id t2mr29490133eji.554.1614191100885; Wed, 24 Feb 2021 10:25:00 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 09/10] scsi: inline sg_io_sense_from_errno() into the callers. Date: Wed, 24 Feb 2021 19:24:52 +0100 Message-Id: <20210224182453.587731-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210224182453.587731-1-pbonzini@redhat.com> References: <20210224182453.587731-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::62b; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x62b.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.25, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hare@suse.de Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Hannes Reinecke Currently sg_io_sense_from_errno() converts the two input parameters 'errno' and 'io_hdr' into sense code and SCSI status. Having split the function off into scsi_sense_from_errno() and scsi_sense_from_host_status(), both of which are available generically, we now inline the logic in the callers so that scsi-disk and scsi-generic will be able to pass host_status to the HBA. Signed-off-by: Hannes Reinecke Message-Id: <20201116184041.60465-7-hare@suse.de> [Put together from "scsi-disk: Add sg_io callback to evaluate status" and what remains of "scsi: split sg_io_sense_from_errno() in two functions= ", with many other fixes. - Paolo] Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-disk.c | 47 +++++++++++++++++++++++++++++++++++++----- hw/scsi/scsi-generic.c | 22 ++++++++++++++------ include/scsi/utils.h | 3 --- scsi/qemu-pr-helper.c | 24 ++++++++++++++------- scsi/utils.c | 23 --------------------- 5 files changed, 75 insertions(+), 44 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index a5a58d7db3..ceaf78b423 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -77,7 +77,6 @@ typedef struct SCSIDiskReq { struct iovec iov; QEMUIOVector qiov; BlockAcctCookie acct; - unsigned char *status; } SCSIDiskReq; =20 #define SCSI_DISK_F_REMOVABLE 0 @@ -261,8 +260,6 @@ static bool scsi_disk_req_check_error(SCSIDiskReq *r, i= nt ret, bool acct_failed) =20 if (ret < 0) { return scsi_handle_rw_error(r, ret, acct_failed); - } else if (r->status && *r->status) { - return scsi_handle_rw_error(r, *r->status, acct_failed); } =20 return false; @@ -2697,8 +2694,47 @@ typedef struct SCSIBlockReq { =20 /* CDB passed to SG_IO. */ uint8_t cdb[16]; + BlockCompletionFunc *cb; + void *cb_opaque; } SCSIBlockReq; =20 +static void scsi_block_sgio_complete(void *opaque, int ret) +{ + SCSIBlockReq *req =3D (SCSIBlockReq *)opaque; + SCSIDiskReq *r =3D &req->req; + SCSIDevice *s =3D r->req.dev; + sg_io_hdr_t *io_hdr =3D &req->io_header; + SCSISense sense; + + if (ret =3D=3D 0) { + if (io_hdr->host_status !=3D SCSI_HOST_OK) { + ret =3D scsi_sense_from_host_status(io_hdr->host_status, &sens= e); + if (ret =3D=3D CHECK_CONDITION) { + scsi_req_build_sense(&r->req, sense); + } + } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { + ret =3D BUSY; + } else { + ret =3D io_hdr->status; + } + + if (ret > 0) { + aio_context_acquire(blk_get_aio_context(s->conf.blk)); + if (scsi_handle_rw_error(r, ret, true)) { + aio_context_release(blk_get_aio_context(s->conf.blk)); + scsi_req_unref(&r->req); + return; + } + aio_context_release(blk_get_aio_context(s->conf.blk)); + + /* Ignore error. */ + ret =3D 0; + } + } + + req->cb(req->cb_opaque, ret); +} + static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req, int64_t offset, QEMUIOVector *iov, int direction, @@ -2777,9 +2813,11 @@ static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *= req, io_header->timeout =3D s->qdev.io_timeout * 1000; io_header->usr_ptr =3D r; io_header->flags |=3D SG_FLAG_DIRECT_IO; + req->cb =3D cb; + req->cb_opaque =3D opaque; trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba, nb_logical_blocks, io_header->timeout= ); - aiocb =3D blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque= ); + aiocb =3D blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, scsi_block= _sgio_complete, req); assert(aiocb !=3D NULL); return aiocb; } @@ -2893,7 +2931,6 @@ static int32_t scsi_block_dma_command(SCSIRequest *re= q, uint8_t *buf) return 0; } =20 - r->req.status =3D &r->io_header.status; return scsi_disk_dma_command(req, buf); } =20 diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c index cf7e11cf44..716caf0d22 100644 --- a/hw/scsi/scsi-generic.c +++ b/hw/scsi/scsi-generic.c @@ -75,6 +75,7 @@ static void scsi_command_complete_noio(SCSIGenericReq *r,= int ret) { int status; SCSISense sense; + sg_io_hdr_t *io_hdr =3D &r->io_header; =20 assert(r->req.aiocb =3D=3D NULL); =20 @@ -82,15 +83,24 @@ static void scsi_command_complete_noio(SCSIGenericReq *= r, int ret) scsi_req_cancel_complete(&r->req); goto done; } - status =3D sg_io_sense_from_errno(-ret, &r->io_header, &sense); - if (status =3D=3D CHECK_CONDITION) { - if (r->io_header.driver_status & SG_ERR_DRIVER_SENSE) { - r->req.sense_len =3D r->io_header.sb_len_wr; - } else { + if (ret < 0) { + status =3D scsi_sense_from_errno(-ret, &sense); + if (status =3D=3D CHECK_CONDITION) { + scsi_req_build_sense(&r->req, sense); + } + } else if (io_hdr->host_status !=3D SCSI_HOST_OK) { + status =3D scsi_sense_from_host_status(io_hdr->host_status, &sense= ); + if (status =3D=3D CHECK_CONDITION) { scsi_req_build_sense(&r->req, sense); } + } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { + status =3D BUSY; + } else { + status =3D io_hdr->status; + if (io_hdr->driver_status & SG_ERR_DRIVER_SENSE) { + r->req.sense_len =3D io_hdr->sb_len_wr; + } } - trace_scsi_generic_command_complete_noio(r, r->req.tag, status); =20 scsi_req_complete(&r->req, status); diff --git a/include/scsi/utils.h b/include/scsi/utils.h index 9080d65e27..d5c8efa16e 100644 --- a/include/scsi/utils.h +++ b/include/scsi/utils.h @@ -139,9 +139,6 @@ int scsi_cdb_length(uint8_t *buf); #ifdef CONFIG_LINUX #define SG_ERR_DRIVER_TIMEOUT 0x06 #define SG_ERR_DRIVER_SENSE 0x08 - -int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, - SCSISense *sense); #endif =20 int scsi_sense_from_errno(int errno_value, SCSISense *sense); diff --git a/scsi/qemu-pr-helper.c b/scsi/qemu-pr-helper.c index 2733d92f2d..0cb2bddd61 100644 --- a/scsi/qemu-pr-helper.c +++ b/scsi/qemu-pr-helper.c @@ -149,19 +149,29 @@ static int do_sgio_worker(void *opaque) io_hdr.dxferp =3D (char *)data->buf; io_hdr.dxfer_len =3D data->sz; ret =3D ioctl(data->fd, SG_IO, &io_hdr); - status =3D sg_io_sense_from_errno(ret < 0 ? errno : 0, &io_hdr, - &sense_code); + + if (ret < 0) { + status =3D scsi_sense_from_errno(errno, &sense_code); + if (status =3D=3D CHECK_CONDITION) { + scsi_build_sense(data->sense, sense_code); + } + } else if (io_hdr.host_status !=3D SCSI_HOST_OK) { + status =3D scsi_sense_from_host_status(io_hdr.host_status, &sense_= code); + if (status =3D=3D CHECK_CONDITION) { + scsi_build_sense(data->sense, sense_code); + } + } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { + status =3D BUSY; + } else { + status =3D io_hdr.status; + } + if (status =3D=3D GOOD) { data->sz -=3D io_hdr.resid; } else { data->sz =3D 0; } =20 - if (status =3D=3D CHECK_CONDITION && - !(io_hdr.driver_status & SG_ERR_DRIVER_SENSE)) { - scsi_build_sense(data->sense, sense_code); - } - return status; } =20 diff --git a/scsi/utils.c b/scsi/utils.c index 28eb32746e..873e05aeaf 100644 --- a/scsi/utils.c +++ b/scsi/utils.c @@ -658,26 +658,3 @@ int scsi_sense_from_host_status(uint8_t host_status, } return GOOD; } - -#ifdef CONFIG_LINUX -int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, - SCSISense *sense) -{ - if (errno_value !=3D 0) { - return scsi_sense_from_errno(errno_value, sense); - } else { - int status =3D scsi_sense_from_host_status(io_hdr->host_status, se= nse); - if (status) { - return status; - } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { - return BUSY; - } else if (io_hdr->status) { - return io_hdr->status; - } else if (io_hdr->driver_status & SG_ERR_DRIVER_SENSE) { - return CHECK_CONDITION; - } else { - return GOOD; - } - } -} -#endif --=20 2.29.2