From patchwork Wed Feb 24 18:24:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443991 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=kWVkKb3j; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4F05x8hz9rx6 for ; Thu, 25 Feb 2021 05:28:52 +1100 (AEDT) Received: from localhost ([::1]:47990 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyu2-00062i-Iq for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:28:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37484) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqI-0002JD-CG for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:24:59 -0500 Received: from mail-ed1-x532.google.com ([2a00:1450:4864:20::532]:45076) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqG-0004lb-IP for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:24:58 -0500 Received: by mail-ed1-x532.google.com with SMTP id p2so3722815edm.12 for ; Wed, 24 Feb 2021 10:24:56 -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=dmPfvXeQvEn+5queRrC9faXjWtuXEijScy1bn7bFvN8=; b=kWVkKb3jK+gAQZQbVvNdHa5kairmMN7BDMXLUjlC+eH+Imz/QUmoGBwzkj3BA5qaBw IiV7DHdKed4oK2tJUns96pFUhy5mHf6PZFyg/e/+g6AovIqQCWmhwoMhBcS1DVOie72p r2THzhLXLMomslACDyq13UxnrbdqwTCCMAl7D7kcNRF1nKDeKP8AqNjIIMVbve0x6ff8 fcxZMGj6TKA4C3WX28fOmgpfTAg02UUU7ckcNoi3HC2Z/KB5LPnFDIGRJsbeQJZkYpSI ifcj/4e4x63Unzw3qz4H2IvTMd5Jda4ShercDAwB4A4T2nwtDmsSAfjnCoIMGV+0rSF7 FttQ== 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=dmPfvXeQvEn+5queRrC9faXjWtuXEijScy1bn7bFvN8=; b=J3gBXYcTVJfyuqnxj5JfuqfHw4CmkdW5YT8SqrKHp30RrcwzbcSG5HGjUbCHKM+HQd Cqxc+54kClQFtmguLm3IzBqKXQePLKFjnfsR1q6SbpeqL2HBprjlsrhhzChZhDbvJdHC hrua6NlVsD63lOgbGTegtHFq2JrO3Mp5y/YsaJFITnRAGFThXWjIPNvn8HK4W9LNcRkW l3LtZtvzX5w8iDWDXsj3pDAtLDnsG1QnDTMcECSPA2hR/mNFD7YMIm/I8kwoH8uVdDrV +/qDHDZJcgG+WhLxZetD4lUpSfackKHo1IXf32naqf8kZVvaiJLjfi+rRYx390W2zGFk r8Ug== X-Gm-Message-State: AOAM5325+eOTREKQEYkh3cW/gjiOp8HMXPZfglmIuB2/k39pArRoLNLb CgoFwgf5mBYTjSEM2jDSS8Vwtb9z6I0= X-Google-Smtp-Source: ABdhPJwtpUw1btNbOdbmhJp35YLcGFcykAV3y0WnYhRV/gfjTthDs3moY8HLN8KrCW5pUfPmzJ3ztw== X-Received: by 2002:aa7:c314:: with SMTP id l20mr22735390edq.148.1614191095200; Wed, 24 Feb 2021 10:24:55 -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.24.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:54 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 01/10] scsi-disk: move scsi_handle_rw_error earlier Date: Wed, 24 Feb 2021 19:24:44 +0100 Message-Id: <20210224182453.587731-2-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 Received-SPF: pass client-ip=2a00:1450:4864:20::532; envelope-from=paolo.bonzini@gmail.com; helo=mail-ed1-x532.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Remove the forward declaration. Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-disk.c | 168 ++++++++++++++++++++++---------------------- 1 file changed, 83 insertions(+), 85 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index a2716b26b4..18ab777017 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -111,8 +111,6 @@ struct SCSIDiskState { uint16_t rotation_rate; }; -static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed); - static void scsi_free_request(SCSIRequest *req) { SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); @@ -182,6 +180,89 @@ static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req) qemu_iovec_init_external(&r->qiov, &r->iov, 1); } +/* + * scsi_handle_rw_error has two return values. False means that the error + * must be ignored, true means that the error has been processed and the + * caller should not do anything else for this request. Note that + * scsi_handle_rw_error always manages its reference counts, independent + * of the return value. + */ +static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed) +{ + bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV); + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); + SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s)); + BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk, + is_read, error); + + if (action == BLOCK_ERROR_ACTION_REPORT) { + if (acct_failed) { + block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); + } + switch (error) { + case 0: + /* A passthrough command has run and has produced sense data; check + * whether the error has to be handled by the guest or should rather + * pause the host. + */ + assert(r->status && *r->status); + if (scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) { + /* These errors are handled by guest. */ + sdc->update_sense(&r->req); + scsi_req_complete(&r->req, *r->status); + return true; + } + error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense)); + break; +#ifdef CONFIG_LINUX + /* These errno mapping are specific to Linux. For more information: + * - scsi_decide_disposition in drivers/scsi/scsi_error.c + * - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c + * - blk_errors[] in block/blk-core.c + */ + case EBADE: + /* DID_NEXUS_FAILURE -> BLK_STS_NEXUS. */ + scsi_req_complete(&r->req, RESERVATION_CONFLICT); + break; + case ENODATA: + /* DID_MEDIUM_ERROR -> BLK_STS_MEDIUM. */ + scsi_check_condition(r, SENSE_CODE(READ_ERROR)); + break; + case EREMOTEIO: + /* DID_TARGET_FAILURE -> BLK_STS_TARGET. */ + scsi_req_complete(&r->req, HARDWARE_ERROR); + break; +#endif + case ENOMEDIUM: + scsi_check_condition(r, SENSE_CODE(NO_MEDIUM)); + break; + case ENOMEM: + scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE)); + break; + case EINVAL: + scsi_check_condition(r, SENSE_CODE(INVALID_FIELD)); + break; + case ENOSPC: + scsi_check_condition(r, SENSE_CODE(SPACE_ALLOC_FAILED)); + break; + default: + scsi_check_condition(r, SENSE_CODE(IO_ERROR)); + break; + } + } + + blk_error_action(s->qdev.conf.blk, action, is_read, error); + if (action == BLOCK_ERROR_ACTION_IGNORE) { + scsi_req_complete(&r->req, 0); + return true; + } + + if (action == BLOCK_ERROR_ACTION_STOP) { + scsi_req_retry(&r->req); + } + return true; +} + static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed) { if (r->req.io_canceled) { @@ -428,89 +509,6 @@ static void scsi_read_data(SCSIRequest *req) } } -/* - * scsi_handle_rw_error has two return values. False means that the error - * must be ignored, true means that the error has been processed and the - * caller should not do anything else for this request. Note that - * scsi_handle_rw_error always manages its reference counts, independent - * of the return value. - */ -static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed) -{ - bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV); - SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); - SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s)); - BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk, - is_read, error); - - if (action == BLOCK_ERROR_ACTION_REPORT) { - if (acct_failed) { - block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); - } - switch (error) { - case 0: - /* A passthrough command has run and has produced sense data; check - * whether the error has to be handled by the guest or should rather - * pause the host. - */ - assert(r->status && *r->status); - if (scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) { - /* These errors are handled by guest. */ - sdc->update_sense(&r->req); - scsi_req_complete(&r->req, *r->status); - return true; - } - error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense)); - break; -#ifdef CONFIG_LINUX - /* These errno mapping are specific to Linux. For more information: - * - scsi_decide_disposition in drivers/scsi/scsi_error.c - * - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c - * - blk_errors[] in block/blk-core.c - */ - case EBADE: - /* DID_NEXUS_FAILURE -> BLK_STS_NEXUS. */ - scsi_req_complete(&r->req, RESERVATION_CONFLICT); - break; - case ENODATA: - /* DID_MEDIUM_ERROR -> BLK_STS_MEDIUM. */ - scsi_check_condition(r, SENSE_CODE(READ_ERROR)); - break; - case EREMOTEIO: - /* DID_TARGET_FAILURE -> BLK_STS_TARGET. */ - scsi_req_complete(&r->req, HARDWARE_ERROR); - break; -#endif - case ENOMEDIUM: - scsi_check_condition(r, SENSE_CODE(NO_MEDIUM)); - break; - case ENOMEM: - scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE)); - break; - case EINVAL: - scsi_check_condition(r, SENSE_CODE(INVALID_FIELD)); - break; - case ENOSPC: - scsi_check_condition(r, SENSE_CODE(SPACE_ALLOC_FAILED)); - break; - default: - scsi_check_condition(r, SENSE_CODE(IO_ERROR)); - break; - } - } - - blk_error_action(s->qdev.conf.blk, action, is_read, error); - if (action == BLOCK_ERROR_ACTION_IGNORE) { - scsi_req_complete(&r->req, 0); - return true; - } - - if (action == BLOCK_ERROR_ACTION_STOP) { - scsi_req_retry(&r->req); - } - return true; -} - static void scsi_write_complete_noio(SCSIDiskReq *r, int ret) { uint32_t n; From patchwork Wed Feb 24 18:24:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443990 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=KH4gf+iZ; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm49k43qWz9sVF for ; Thu, 25 Feb 2021 05:26:01 +1100 (AEDT) Received: from localhost ([::1]:39466 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyrF-0002La-Vl for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:25:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37498) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqJ-0002JH-EA for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:24:59 -0500 Received: from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e]:33091) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqH-0004lo-8N for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:24:58 -0500 Received: by mail-ej1-x62e.google.com with SMTP id jt13so4673791ejb.0 for ; Wed, 24 Feb 2021 10:24:56 -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=QvpruKzy7iRxPp+WZJ5J+qLhT0FlaXM1xbg2aJJPmEw=; b=KH4gf+iZbX3Ocwqz+RHnkMgyB/oaD0nmiDgkjS4PiWw6YPIJpfoWfeIatX86n70glN AlyOvHZzZgFaaD7WekpFCkw1zbamk4mkdWFNEuffIsne60rUl1NKox/nqNDHrjbTyKP3 nR1VrNnM1ThxMKo1vwkeUpGr0dd+Kc9IVVmEnt9shOgY5Q0lnQMBwduNM+ofkqbM03T3 U7bBxna2DeyB9F3MvvyOmxvUCsh5F0v/vD2j1NECTYPRMZrJ6jVC50Er38MEdlqwTi/T YYRat61ad+MdLARPfbf+UhpxzlebC61TVl2Mw3E+0WjjOR94D2PavxKorqWsOhVVk1Tv 1+ow== 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=QvpruKzy7iRxPp+WZJ5J+qLhT0FlaXM1xbg2aJJPmEw=; b=F0HP0ypi/PRdm9sbApoOqC+2P7oPJF880vC8X+zUOnpJuDZ2GrwmhQwABykbES1wwW N3ib4OdDUVF3KnE0gcJqq+IkgOM0rALSaqED0xETjWzu+NSZBKtu0aMeEMP/Z4b3BqeF tuq4ZAsrsVxUNgSlckifGWswAE91Cg2l7VEv8aGd79WqFW9d/TxU33q/I8Oy4MTrlG86 bGh9+ZZZp83boDPpgxJevMWootnvVSSgWjHvsfFf3UJAbNF4WfHg/VUG2HKybTVvu7c9 0VxhJcFvgt3vyqrTiuCEV9HFFyVDeie3H5rw/rXACXaPNn8RqRBqZCrqchumXf4U0eFC w9+w== X-Gm-Message-State: AOAM530NTQERw0oPXKpYXwoWRW/MyDk4IhbrKsrudrU/JxOsFFd4L7Km H0hK63pV7suJmR4ktkwprhSPKS9PXcM= X-Google-Smtp-Source: ABdhPJwdNiMKW4WJarITs9U65tE7mEzID+tA92tnwKTj+waQNmjwgQ7nBXXTlO4WYGtrT2nnR6BzKA== X-Received: by 2002:a17:906:c45a:: with SMTP id ck26mr3624552ejb.125.1614191095920; Wed, 24 Feb 2021 10:24:55 -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.24.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:55 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 02/10] scsi-disk: do not complete requests early for rerror/werror=ignore Date: Wed, 24 Feb 2021 19:24:45 +0100 Message-Id: <20210224182453.587731-3-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 Received-SPF: pass client-ip=2a00:1450:4864:20::62e; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x62e.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" When requested to ignore errors, just do nothing and let the request complete normally. This means that the request will be accounted correctly. This is what commit 40dce4ee61 ("scsi-disk: fix rerror/werror=ignore", 2018-10-19) was supposed to do: Fixes: 40dce4ee61 ("scsi-disk: fix rerror/werror=ignore", 2018-10-19) Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-disk.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 18ab777017..36aa872445 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -253,8 +253,7 @@ static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed) blk_error_action(s->qdev.conf.blk, action, is_read, error); if (action == BLOCK_ERROR_ACTION_IGNORE) { - scsi_req_complete(&r->req, 0); - return true; + return false; } if (action == BLOCK_ERROR_ACTION_STOP) { From patchwork Wed Feb 24 18:24:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443993 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=qJttzzqF; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4F41Tc8z9sTD for ; Thu, 25 Feb 2021 05:28:56 +1100 (AEDT) Received: from localhost ([::1]:48118 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyu6-00065d-5N for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:28:54 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37528) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqK-0002Jv-Rb for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:01 -0500 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]:38533) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqJ-0004mO-84 for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:00 -0500 Received: by mail-ej1-x62d.google.com with SMTP id n20so4652956ejb.5 for ; Wed, 24 Feb 2021 10:24:58 -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=osmTk+V+aeU1VByo64kXupbvRKx+EAC0OdfK2HOG+ik=; b=qJttzzqFEluTgyv/dn0yBp6jSLpDd6q9aGzb6ljO3h7gQs0qqIggSRkzJ9/X9jHBSB rkAygw8Q6iYTaUpezaZ+iOClcmHS82mxiYUtTbTy10ZUD5pM+AXI7Iz7hjBQs4jHgHS4 HCVxRrZ/iy7/xdwWBgihsDiHCJ6g4s4/Js7q+7MEOJ0a1jC7lCV3T8w4bA8O8WmrUGOB pxS/fXdnZZ9ybITPOLRiAiQeINqbWn2Qk4P+EDEgxqFz4PZyQZ3JEtOq18xhIp1od2+j aD4+DW+19hPD9beCpsQtdkdJWwhgaleEc7yw04c/59iOnABFYf3RYloDz4fN7XQkmMwk Jh5w== 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=osmTk+V+aeU1VByo64kXupbvRKx+EAC0OdfK2HOG+ik=; b=mOckMgqMR+8g4QJSwci9Yb4WQJnGyeKaCXkNBaCxcd7D9fQTGXm8w4iG6j3G8oHEUM CHWCyEhFHixvfack/zC8jo1VAEcucorR1xatF+oKfDt9cOfrPUA8VLpNKD3FFDrYC2q0 /yeVCSBh6yAO16413G1XBJ1+KJlCOXBe6PZupl8cTlsJPVGfbRZbhWWZJU7CZDbNoumD Ib8aSwyE6U7/cVeuyvb/1CSsUT8YELb+UDB2J+4i4MaC/wSZeRdbKcAgmccKlq9KjUQA XpCryTuHcKZDbbbcTXlUgvU6/Lu35mU1sBQoO8VkF8OZceCkGAex/8Tj9+dq3MEZPjc5 1nCg== X-Gm-Message-State: AOAM533vJ9IxpKix8ZqDqpWmC8t8730+qTcfkT4AQ3PZMdtg35hrVdw1 ZUNloNe3rtuvxIPHK2udq2hBHaJyunw= X-Google-Smtp-Source: ABdhPJxQFarWTVJuU4flp5VNSfzwi0ZEmR9Kp7EGyTjAqbv0h0slc7F7KhaXQtDol7ZhNXI89vxLig== X-Received: by 2002:a17:906:3f96:: with SMTP id b22mr31923202ejj.478.1614191097340; Wed, 24 Feb 2021 10:24:57 -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.24.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 04/10] scsi-disk: pass SCSI status to scsi_handle_rw_error Date: Wed, 24 Feb 2021 19:24:47 +0100 Message-Id: <20210224182453.587731-5-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 Received-SPF: pass client-ip=2a00:1450:4864:20::62d; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x62d.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Instead of fishing it from *r->status, just pass the SCSI status as a positive value of the second parameter and an errno as a negative value. Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-disk.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 9c6099ffc4..548a5297fa 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -187,34 +187,48 @@ static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req) * scsi_handle_rw_error always manages its reference counts, independent * of the return value. */ -static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed) +static bool scsi_handle_rw_error(SCSIDiskReq *r, int ret, bool acct_failed) { bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV); SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s)); - BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk, - is_read, error); - SCSISense sense; + SCSISense sense = SENSE_CODE(NO_SENSE); + int error = 0; + bool req_has_sense = false; + BlockErrorAction action; + int status; + if (ret < 0) { + status = scsi_sense_from_errno(-ret, &sense); + error = -ret; + } else { + /* A passthrough command has completed with nonzero status. */ + status = ret; + if (status == CHECK_CONDITION) { + req_has_sense = true; + error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense)); + } else { + error = EINVAL; + } + } + + action = blk_get_error_action(s->qdev.conf.blk, is_read, error); if (action == BLOCK_ERROR_ACTION_REPORT) { if (acct_failed) { block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); } - if (error == 0) { + if (req_has_sense) { /* A passthrough command has run and has produced sense data; check * whether the error has to be handled by the guest or should rather * pause the host. */ - assert(r->status && *r->status); if (scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) { /* These errors are handled by guest. */ sdc->update_sense(&r->req); - scsi_req_complete(&r->req, *r->status); + scsi_req_complete(&r->req, status); return true; } - error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense)); } else { - int status = scsi_sense_from_errno(error, &sense); if (status == CHECK_CONDITION) { scsi_req_build_sense(&r->req, sense); } @@ -240,8 +254,10 @@ static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed) return true; } - if (ret < 0 || (r->status && *r->status)) { - return scsi_handle_rw_error(r, -ret, acct_failed); + 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); } return false; From patchwork Wed Feb 24 18:24:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443989 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=crukes+y; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm49k6wYBz9sVr for ; Thu, 25 Feb 2021 05:26:01 +1100 (AEDT) Received: from localhost ([::1]:39486 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyrF-0002NG-Pg for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:25:57 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37530) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqK-0002Jw-TF for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:01 -0500 Received: from mail-ej1-x631.google.com ([2a00:1450:4864:20::631]:38537) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqJ-0004nC-Eq for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:00 -0500 Received: by mail-ej1-x631.google.com with SMTP id n20so4653010ejb.5 for ; Wed, 24 Feb 2021 10:24:59 -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=Ycz7tMt4XNpb7H0VgGp30K9fstHZJN03neY0qoiIQu0=; b=crukes+yM1ufCdPtlzg9crJRQa3WJh6bUxjcglPCiQXqOpAujXGTvyOucfkyDX3+2z HYHOpAFSgtYxFhqhTxIZSRkI4X0+MCOHEy7aVa3dVISj79kDiFyJUAexh+QV4/Buvpsu rS+b1DYX455p1Do6rAKWKlkzsSfaTL4T4mWwWZ87pTY0Tf4RR1s+l/oaXSOslVyOm/Nz 269RC6xzWJM2gntpDVnO8MEqKMYNH9mFBN/0jpyFn1YnfUi5mB7R8VnWEs4K0nW61eWt egEHtgWZ0ViRpdSGaCJ7+Uzg6bd+s3y8Mp2QlglrrCAmbRGchLEJq2QrAyKXDhJguaJN L+Og== 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=Ycz7tMt4XNpb7H0VgGp30K9fstHZJN03neY0qoiIQu0=; b=Cc3wVo/hQDpajVr4SNFMED4vRZrQvLDLOy4Ds/tQCv7U8U1Jny/EqKDjBzgjc2I4qk 2cCD48VmXuCWIwQ9ZXdCSBZCcO5ilDj1jJjrBCOxsn020NGY34gG78Ty7JGQg6k7o5KV 9WOXWNfCOdGJoXrZ8CEWs2unHrQYdUXcpXvRh4BuWFPKbPqYyRocorRfgCXtD9aUDHrl 4DPQE6mznvXJ3jXvaGAPh4fOrSwTZ9A/M6qWN1RxtgrAm1FtJFaOqj53XzWBTTB2RPr6 MaG0WEnm8h33URwEZopfGrA5VzLzaZ/fWP6usU4EGw4/R4t5wmyn8iB81Erp5/SG8FSM 5sHA== X-Gm-Message-State: AOAM531hYtPbCmEYxynx70re6xZW9TLYzs4Hwe8uWTPo9iut3EizA4RK MbGL+EE0jszReqMu/+moB3OSg+n2iHI= X-Google-Smtp-Source: ABdhPJxrp+nlp19W3TA//UrYOzwCdUUXLilUYbu0fLS7lrTaDE3BwwSHiR+zzWK9YvMbVfexCZypYw== X-Received: by 2002:a17:907:3d8d:: with SMTP id he13mr30651501ejc.448.1614191098106; Wed, 24 Feb 2021 10:24:58 -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.24.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 05/10] scsi-disk: pass guest recoverable errors through even for rerror=stop Date: Wed, 24 Feb 2021 19:24:48 +0100 Message-Id: <20210224182453.587731-6-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 Received-SPF: pass client-ip=2a00:1450:4864:20::631; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x631.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Right now, recoverable sense values are only passed directly to the guest only for rerror=report. However, when rerror/werror are 'stop' we still don't want the host to be involved on every UNIT ATTENTION (especially considered that the QMP event will not have enough information to act on the report). Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-disk.c | 51 +++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 548a5297fa..a5a58d7db3 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -212,39 +212,44 @@ static bool scsi_handle_rw_error(SCSIDiskReq *r, int ret, bool acct_failed) } } - action = blk_get_error_action(s->qdev.conf.blk, is_read, error); - if (action == BLOCK_ERROR_ACTION_REPORT) { + /* + * Check whether the error has to be handled by the guest or should + * rather follow the rerror=/werror= settings. Guest-handled errors + * are usually retried immediately, so do not post them to QMP and + * do not account them as failed I/O. + */ + if (req_has_sense && + scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) { + action = BLOCK_ERROR_ACTION_REPORT; + acct_failed = false; + } else { + action = blk_get_error_action(s->qdev.conf.blk, is_read, error); + blk_error_action(s->qdev.conf.blk, action, is_read, error); + } + + switch (action) { + case BLOCK_ERROR_ACTION_REPORT: if (acct_failed) { block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); } if (req_has_sense) { - /* A passthrough command has run and has produced sense data; check - * whether the error has to be handled by the guest or should rather - * pause the host. - */ - if (scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) { - /* These errors are handled by guest. */ - sdc->update_sense(&r->req); - scsi_req_complete(&r->req, status); - return true; - } - } else { - if (status == CHECK_CONDITION) { - scsi_req_build_sense(&r->req, sense); - } - scsi_req_complete(&r->req, status); + sdc->update_sense(&r->req); + } else if (status == CHECK_CONDITION) { + scsi_req_build_sense(&r->req, sense); } - } + scsi_req_complete(&r->req, status); + return true; - blk_error_action(s->qdev.conf.blk, action, is_read, error); - if (action == BLOCK_ERROR_ACTION_IGNORE) { + case BLOCK_ERROR_ACTION_IGNORE: return false; - } - if (action == BLOCK_ERROR_ACTION_STOP) { + case BLOCK_ERROR_ACTION_STOP: scsi_req_retry(&r->req); + return true; + + default: + g_assert_not_reached(); } - return true; } static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed) From patchwork Wed Feb 24 18:24:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443995 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=DbLRHqLh; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4JN5bwwz9sTD for ; Thu, 25 Feb 2021 05:31:48 +1100 (AEDT) Received: from localhost ([::1]:55356 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyws-0000nf-HF for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:31:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37578) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqM-0002Lg-KT for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:03 -0500 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]:41978) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqK-0004nb-3X for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:02 -0500 Received: by mail-ej1-x630.google.com with SMTP id lr13so4610678ejb.8 for ; Wed, 24 Feb 2021 10:24:59 -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=3w6Ug8GRqwYAgQamasa4rCbTfjIVmYeM2Cs+qcWf9kI=; b=DbLRHqLhUFrZCXRGrvyZg/EjQlC39PD0OyNU+bmaUHcbwQaYRDdaS1YEnKF0OuTeke dyJZB1CTXeRGEbSyBQGwC1Pn/nPUlE2YQNuzOGwaX62Ds8qLXDqkJ6iEco6kaLMcQVDL gQw1Y4oaEVycAEyBRE9OPmjjr4cYxntCW/KCv6rIWZD3OANDCs5/f0fxPWjsKTZ2gfyj Vj6GuHujMJ6y/DT0iMjxc1erSGllAFKuWpkW2OQBVmGamDYFyYcTuqxWOF9lgYukRc1K XZkXZIU9NfeipfOcHLOIthA6pFN1nIdUlEuV4XjBSGXzLw15gyxzhd56aMXAg5Uz/hbd j8hA== 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=3w6Ug8GRqwYAgQamasa4rCbTfjIVmYeM2Cs+qcWf9kI=; b=IwF6ZM90Nr8p318jLT+EhbHA3couxOVJRZ1PaCh0Xyqlhs6OROfKcDn9BPwgkr3Np/ fREJinryjp/mpO11Pbv3N9ircGou/Q27GMmKL35ueEquK1sPjluFC7tFr6hGjbB57S4a rl2URkcYXgGuPLQQCQwe8vIGPpzxpcHiZMdYz6uXTlXzeF+RR9w9s1UfZa2gcOFTpbXX YNN8C7RQsV71pfnEZDN2W7fnpFLjLRQSyQsr5RploM/aOMv/Ml9CwbVjTgwKRXEkHzRh GOlUkC70QU3DQLzz6YdugBtsBWVpPgf7YcL47UtHyJ5K2In+IKJ1IP/xxWM43FIM5duk lE+Q== X-Gm-Message-State: AOAM530CQ33PLBAV3uOZL5Y+aotFKRzCCRe2ylpMjrfwa2bVenNGEj4z tHtYaDClKSaopqXBNlF3SMg019GFOGA= X-Google-Smtp-Source: ABdhPJxBZNN74ZEIztr2xacqVg19/2tc53c7ibWf/9+F9YmxUO/A5mufeV6Qtw3Jg8wEknQDvUrKKQ== X-Received: by 2002:a17:906:82d3:: with SMTP id a19mr31871689ejy.505.1614191098809; Wed, 24 Feb 2021 10:24:58 -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.24.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 06/10] scsi: drop 'result' argument from command_complete callback Date: Wed, 24 Feb 2021 19:24:49 +0100 Message-Id: <20210224182453.587731-7-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 Received-SPF: pass client-ip=2a00:1450:4864:20::630; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x630.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Hannes Reinecke The command complete callback has a SCSIRequest as the first argument, and the status field of that structure is identical to the 'status' argument. So drop the argument from the callback. Signed-off-by: Hannes Reinecke Message-Id: <20201116184041.60465-3-hare@suse.de> Signed-off-by: Paolo Bonzini --- hw/scsi/esp-pci.c | 5 ++--- hw/scsi/esp.c | 7 +++---- hw/scsi/lsi53c895a.c | 6 +++--- hw/scsi/megasas.c | 6 ++---- hw/scsi/mptsas.c | 5 +++-- hw/scsi/scsi-bus.c | 2 +- hw/scsi/spapr_vscsi.c | 10 +++++----- hw/scsi/virtio-scsi.c | 5 ++--- hw/scsi/vmw_pvscsi.c | 4 ++-- hw/usb/dev-storage.c | 6 +++--- hw/usb/dev-uas.c | 7 +++---- include/hw/scsi/esp.h | 2 +- include/hw/scsi/scsi.h | 2 +- 13 files changed, 31 insertions(+), 36 deletions(-) diff --git a/hw/scsi/esp-pci.c b/hw/scsi/esp-pci.c index 2ce96dc56e..4d7c2cab56 100644 --- a/hw/scsi/esp-pci.c +++ b/hw/scsi/esp-pci.c @@ -329,13 +329,12 @@ static const VMStateDescription vmstate_esp_pci_scsi = { } }; -static void esp_pci_command_complete(SCSIRequest *req, uint32_t status, - size_t resid) +static void esp_pci_command_complete(SCSIRequest *req, size_t resid) { ESPState *s = req->hba_private; PCIESPState *pci = container_of(s, PCIESPState, esp); - esp_command_complete(req, status, resid); + esp_command_complete(req, resid); pci->dma_regs[DMA_WBC] = 0; pci->dma_regs[DMA_STAT] |= DMA_STAT_DONE; } diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index b84e0fe33e..93d9c9c7b9 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -485,8 +485,7 @@ static void esp_report_command_complete(ESPState *s, uint32_t status) } } -void esp_command_complete(SCSIRequest *req, uint32_t status, - size_t resid) +void esp_command_complete(SCSIRequest *req, size_t resid) { ESPState *s = req->hba_private; @@ -495,11 +494,11 @@ void esp_command_complete(SCSIRequest *req, uint32_t status, * interrupt has been handled. */ trace_esp_command_complete_deferred(); - s->deferred_status = status; + s->deferred_status = req->status; s->deferred_complete = true; return; } - esp_report_command_complete(s, status); + esp_report_command_complete(s, req->status); } void esp_transfer_data(SCSIRequest *req, uint32_t len) diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c index 7d13c7dc1c..a4e58580e4 100644 --- a/hw/scsi/lsi53c895a.c +++ b/hw/scsi/lsi53c895a.c @@ -787,14 +787,14 @@ static int lsi_queue_req(LSIState *s, SCSIRequest *req, uint32_t len) } /* Callback to indicate that the SCSI layer has completed a command. */ -static void lsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid) +static void lsi_command_complete(SCSIRequest *req, size_t resid) { LSIState *s = LSI53C895A(req->bus->qbus.parent); int out; out = (s->sstat1 & PHASE_MASK) == PHASE_DO; - trace_lsi_command_complete(status); - s->status = status; + trace_lsi_command_complete(req->status); + s->status = req->status; s->command_complete = 2; if (s->waiting && s->dbc != 0) { /* Raise phase mismatch for short transfers. */ diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c index 5bfc92fca1..8f2389d2c6 100644 --- a/hw/scsi/megasas.c +++ b/hw/scsi/megasas.c @@ -1852,13 +1852,12 @@ static void megasas_xfer_complete(SCSIRequest *req, uint32_t len) } } -static void megasas_command_complete(SCSIRequest *req, uint32_t status, - size_t resid) +static void megasas_command_complete(SCSIRequest *req, size_t resid) { MegasasCmd *cmd = req->hba_private; uint8_t cmd_status = MFI_STAT_OK; - trace_megasas_command_complete(cmd->index, status, resid); + trace_megasas_command_complete(cmd->index, req->status, resid); if (req->io_canceled) { return; @@ -1873,7 +1872,6 @@ static void megasas_command_complete(SCSIRequest *req, uint32_t status, return; } } else { - req->status = status; trace_megasas_scsi_complete(cmd->index, req->status, cmd->iov_size, req->cmd.xfer); if (req->status != GOOD) { diff --git a/hw/scsi/mptsas.c b/hw/scsi/mptsas.c index f86616544b..7416e78706 100644 --- a/hw/scsi/mptsas.c +++ b/hw/scsi/mptsas.c @@ -1133,7 +1133,7 @@ static QEMUSGList *mptsas_get_sg_list(SCSIRequest *sreq) } static void mptsas_command_complete(SCSIRequest *sreq, - uint32_t status, size_t resid) + size_t resid) { MPTSASRequest *req = sreq->hba_private; MPTSASState *s = req->dev; @@ -1143,7 +1143,8 @@ static void mptsas_command_complete(SCSIRequest *sreq, hwaddr sense_buffer_addr = req->dev->sense_buffer_high_addr | req->scsi_io.SenseBufferLowAddr; - trace_mptsas_command_complete(s, req->scsi_io.MsgContext, status, resid); + trace_mptsas_command_complete(s, req->scsi_io.MsgContext, + sreq->status, resid); sense_len = scsi_req_get_sense(sreq, sense_buf, SCSI_SENSE_BUF_SIZE); if (sense_len > 0) { diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index c349fb7f2d..dc4141ec8d 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -1483,7 +1483,7 @@ void scsi_req_complete(SCSIRequest *req, int status) scsi_req_ref(req); scsi_req_dequeue(req); - req->bus->info->complete(req, req->status, req->resid); + req->bus->info->complete(req, req->resid); /* Cancelled requests might end up being completed instead of cancelled */ notifier_list_notify(&req->cancel_notifiers, req); diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index 4aa0224c47..d653b5a6ad 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -551,19 +551,19 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len) } /* Callback to indicate that the SCSI layer has completed a transfer. */ -static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t resid) +static void vscsi_command_complete(SCSIRequest *sreq, size_t resid) { VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(sreq->bus->qbus.parent); vscsi_req *req = sreq->hba_private; int32_t res_in = 0, res_out = 0; - trace_spapr_vscsi_command_complete(sreq->tag, status, req); + trace_spapr_vscsi_command_complete(sreq->tag, sreq->status, req); if (req == NULL) { fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag); return; } - if (status == CHECK_CONDITION) { + if (sreq->status == CHECK_CONDITION) { req->senselen = scsi_req_get_sense(req->sreq, req->sense, sizeof(req->sense)); trace_spapr_vscsi_command_complete_sense_data1(req->senselen, @@ -574,8 +574,8 @@ static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t re req->sense[12], req->sense[13], req->sense[14], req->sense[15]); } - trace_spapr_vscsi_command_complete_status(status); - if (status == 0) { + trace_spapr_vscsi_command_complete_status(sreq->status); + if (sreq->status == 0) { /* We handle overflows, not underflows for normal commands, * but hopefully nobody cares */ diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 99ff261cea..358c0e70b0 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -500,8 +500,7 @@ static void virtio_scsi_complete_cmd_req(VirtIOSCSIReq *req) virtio_scsi_complete_req(req); } -static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status, - size_t resid) +static void virtio_scsi_command_complete(SCSIRequest *r, size_t resid) { VirtIOSCSIReq *req = r->hba_private; uint8_t sense[SCSI_SENSE_BUF_SIZE]; @@ -513,7 +512,7 @@ static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status, } req->resp.cmd.response = VIRTIO_SCSI_S_OK; - req->resp.cmd.status = status; + req->resp.cmd.status = r->status; if (req->resp.cmd.status == GOOD) { req->resp.cmd.resid = virtio_tswap32(vdev, resid); } else { diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c index a63d25de48..0da378ed50 100644 --- a/hw/scsi/vmw_pvscsi.c +++ b/hw/scsi/vmw_pvscsi.c @@ -511,7 +511,7 @@ pvscsi_write_sense(PVSCSIRequest *r, uint8_t *sense, int len) } static void -pvscsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid) +pvscsi_command_complete(SCSIRequest *req, size_t resid) { PVSCSIRequest *pvscsi_req = req->hba_private; PVSCSIState *s; @@ -528,7 +528,7 @@ pvscsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid) pvscsi_req->cmp.hostStatus = BTSTAT_DATARUN; } - pvscsi_req->cmp.scsiStatus = status; + pvscsi_req->cmp.scsiStatus = req->status; if (pvscsi_req->cmp.scsiStatus == CHECK_CONDITION) { uint8_t sense[SCSI_SENSE_BUF_SIZE]; int sense_len = diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index c49e8b819e..a5f76fc001 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -277,17 +277,17 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len) } } -static void usb_msd_command_complete(SCSIRequest *req, uint32_t status, size_t resid) +static void usb_msd_command_complete(SCSIRequest *req, size_t resid) { MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); USBPacket *p = s->packet; - trace_usb_msd_cmd_complete(status, req->tag); + trace_usb_msd_cmd_complete(req->status, req->tag); s->csw.sig = cpu_to_le32(0x53425355); s->csw.tag = cpu_to_le32(req->tag); s->csw.residue = cpu_to_le32(s->data_len); - s->csw.status = status != 0; + s->csw.status = req->status != 0; if (s->packet) { if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) { diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c index a51402bc0b..d2bd85d3f6 100644 --- a/hw/usb/dev-uas.c +++ b/hw/usb/dev-uas.c @@ -598,17 +598,16 @@ static void usb_uas_scsi_transfer_data(SCSIRequest *r, uint32_t len) } } -static void usb_uas_scsi_command_complete(SCSIRequest *r, - uint32_t status, size_t resid) +static void usb_uas_scsi_command_complete(SCSIRequest *r, size_t resid) { UASRequest *req = r->hba_private; - trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, status, resid); + trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, r->status, resid); req->complete = true; if (req->data) { usb_uas_complete_data_packet(req); } - usb_uas_queue_sense(req, status); + usb_uas_queue_sense(req, r->status); scsi_req_unref(req->req); } diff --git a/include/hw/scsi/esp.h b/include/hw/scsi/esp.h index 60cc3047a5..d8a6263c13 100644 --- a/include/hw/scsi/esp.h +++ b/include/hw/scsi/esp.h @@ -151,7 +151,7 @@ struct SysBusESPState { void esp_dma_enable(ESPState *s, int irq, int level); void esp_request_cancelled(SCSIRequest *req); -void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid); +void esp_command_complete(SCSIRequest *req, size_t resid); void esp_transfer_data(SCSIRequest *req, uint32_t len); void esp_hard_reset(ESPState *s); uint64_t esp_reg_read(ESPState *s, uint32_t saddr); diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h index a8ef59c0f4..5d992e6e1d 100644 --- a/include/hw/scsi/scsi.h +++ b/include/hw/scsi/scsi.h @@ -123,7 +123,7 @@ struct SCSIBusInfo { int (*parse_cdb)(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf, void *hba_private); void (*transfer_data)(SCSIRequest *req, uint32_t arg); - void (*complete)(SCSIRequest *req, uint32_t arg, size_t resid); + void (*complete)(SCSIRequest *req, size_t resid); void (*cancel)(SCSIRequest *req); void (*change)(SCSIBus *bus, SCSIDevice *dev, SCSISense sense); QEMUSGList *(*get_sg_list)(SCSIRequest *req); From patchwork Wed Feb 24 18:24:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443992 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=FmwSuZyM; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4F3515Cz9rx6 for ; Thu, 25 Feb 2021 05:28:55 +1100 (AEDT) Received: from localhost ([::1]:48116 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyu5-00065R-M1 for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:28:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37576) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqM-0002Lf-K8 for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:03 -0500 Received: from mail-ej1-x632.google.com ([2a00:1450:4864:20::632]:33095) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqK-0004nq-NF for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:02 -0500 Received: by mail-ej1-x632.google.com with SMTP id jt13so4674017ejb.0 for ; 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=q5f9t5j4/QGWJNhsSofDm2TZVW3Y7Podv7uACdRkSTU=; b=FmwSuZyMaBTzqNBluJ3p3vKIKI2B4afm+R7NL6MW9pacFgp9WlmEyj89+hz9vMLmFS 5jKMAgQ3de91/JJVRLpKvbJiG7LvAF5YwNYdU+8IaOFhvwv70eFjz8cukxIv4HwJ6rbG 8kmk81/IT112v0U9e9vg4hgpF24vfMpVafN7CNPx6VKKNeFriTjrjM5UEZ3kTjowM3eB iJO7uo0F9EOPOR9Q8VzHNkelr9Xm/kdmnUqi1YSSetbqo3B28IHvNznqKei82+hH1DCN UvK/T/XdKCs5juOS1pDNZ+xPg8GcISzQ+kcgvmnMvw61kUAlumfeHd6ZtRCyKJcIZOrY EH/g== 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=q5f9t5j4/QGWJNhsSofDm2TZVW3Y7Podv7uACdRkSTU=; b=UjG0E9FOpCPV+kMSMIhkevZXs7M2eIfKw0wU8h2b5/IOm9Rj2IHSZBKEZJj/DOy4uO UGqzCkW3klGKwqwxLnh2ng1y5YwaUNmOClb9t8AeYktjbs+HVROjMzKp1KKi5HBMjsbw cMi0SEl0PfoQpny5UTr5jJcE/Mu03jiXJWRRFcqYikC7pwx4bzhi7SlEot/FDD1VGfPY dY378eyyXIbI+av7TdyD6itturqNCnLXfkcBl4SDM2nh6iK9CdjUUEu2vqFF6+j6/45p Zq+CA6YsO+wghlf10ob37zbpxfQHt2/wDbO6cYvIhpenJ4D4JulhRyBSnR3TjL8HNRll XBdg== X-Gm-Message-State: AOAM531UUIYoJQuref5aKe7J37sxCOj+XjXd/RclTKOTKYk/xePgzGmu kcdtRVo/MtmtCHMBiin7utrsaM/hYlk= X-Google-Smtp-Source: ABdhPJw3ZUe+YM68rRubpP/44D5fif9cQo9+2pg8nrN3Onun7994MXkzhIBrkj5liZmeS7V9fpDr7A== X-Received: by 2002:a17:906:4c56:: with SMTP id d22mr4280886ejw.426.1614191099442; Wed, 24 Feb 2021 10:24:59 -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.24.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:59 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 07/10] scsi: Rename linux-specific SG_ERR codes to generic SCSI_HOST error codes Date: Wed, 24 Feb 2021 19:24:50 +0100 Message-Id: <20210224182453.587731-8-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 Received-SPF: pass client-ip=2a00:1450:4864:20::632; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x632.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Hannes Reinecke We really should make a distinction between legitimate sense codes (ie if one is running against an emulated block device or for pass-through sense codes), and the intermediate errors generated during processing of the command, which really are not sense codes but refer to some specific internal status. And this internal state is not necessarily linux-specific, but rather can refer to the qemu implementation itself. So rename the linux-only SG_ERR codes to SCSI_HOST codes and make them available generally. Signed-off-by: Hannes Reinecke Message-Id: <20201116184041.60465-5-hare@suse.de> Signed-off-by: Paolo Bonzini --- include/scsi/utils.h | 23 ++++++++++++++++------- scsi/utils.c | 6 +++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/scsi/utils.h b/include/scsi/utils.h index ff7c7091b6..ddb22b56df 100644 --- a/include/scsi/utils.h +++ b/include/scsi/utils.h @@ -16,6 +16,22 @@ enum SCSIXferMode { SCSI_XFER_TO_DEV, /* WRITE, MODE_SELECT, ... */ }; +enum SCSIHostStatus { + SCSI_HOST_OK, + SCSI_HOST_NO_LUN, + SCSI_HOST_BUSY, + SCSI_HOST_TIME_OUT, + SCSI_HOST_BAD_RESPONSE, + SCSI_HOST_ABORTED, + SCSI_HOST_ERROR = 0x07, + SCSI_HOST_RESET = 0x08, + SCSI_HOST_TRANSPORT_DISRUPTED = 0xe, + SCSI_HOST_TARGET_FAILURE = 0x10, + SCSI_HOST_RESERVATION_ERROR = 0x11, + SCSI_HOST_ALLOCATION_FAILURE = 0x12, + SCSI_HOST_MEDIUM_ERROR = 0x13, +}; + typedef struct SCSICommand { uint8_t buf[SCSI_CMD_BUF_SIZE]; int len; @@ -124,13 +140,6 @@ int scsi_cdb_length(uint8_t *buf); #define SG_ERR_DRIVER_TIMEOUT 0x06 #define SG_ERR_DRIVER_SENSE 0x08 -#define SG_ERR_DID_OK 0x00 -#define SG_ERR_DID_NO_CONNECT 0x01 -#define SG_ERR_DID_BUS_BUSY 0x02 -#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 diff --git a/scsi/utils.c b/scsi/utils.c index 6b56e01002..4d994b6d56 100644 --- a/scsi/utils.c +++ b/scsi/utils.c @@ -612,9 +612,9 @@ int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, if (errno_value != 0) { return scsi_sense_from_errno(errno_value, sense); } 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 || + if (io_hdr->host_status == SCSI_HOST_NO_LUN || + io_hdr->host_status == SCSI_HOST_BUSY || + io_hdr->host_status == SCSI_HOST_TIME_OUT || (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT)) { return BUSY; } else if (io_hdr->host_status) { From patchwork Wed Feb 24 18:24:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443994 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=IYQUFN7B; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4JN3fvKz9sRN for ; Thu, 25 Feb 2021 05:31:48 +1100 (AEDT) Received: from localhost ([::1]:55266 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEywq-0000la-Fr for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:31:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37610) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqN-0002Ll-Gb for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:03 -0500 Received: from mail-ej1-x636.google.com ([2a00:1450:4864:20::636]:33999) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqL-0004o8-HT for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:03 -0500 Received: by mail-ej1-x636.google.com with SMTP id hs11so4659591ejc.1 for ; Wed, 24 Feb 2021 10:25:01 -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=WtBT0u+jvn6wnMBv0IRJDqOEAKiAeRmCEq+7vu/c0Yc=; b=IYQUFN7B/PcJRkgjRmbOA8ugRa79G9AFtvB/iGQvRvytpscWPkP0yvC1n+eqLgFSUE ztk0LKnRk5Gn+QR03SIHSjFkJruEPWSRHDFn5Rl85Cod/OBJ+ctvFScCqbtfl7HlKqUH V8dqz/6niwWGm70Q0XWNA5yZfffPf4FkyXOeg1EFYKHiRRMD0CFkrjyL7cNb+PHVWuQ/ OK3+HyGMqqqtf2KQ3E2iKfPRavvFB1F5dvWXBfJWRcDE2Q0IEdj4KMzTFiKmy7fRvAZ8 dwiPMUVfweA5sVRHiXpnUOP6nyecrtNq0BtK+KfukhQlziPGjCURSYqgHsk+qhGCLslc mCDA== 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=WtBT0u+jvn6wnMBv0IRJDqOEAKiAeRmCEq+7vu/c0Yc=; b=n/DX4LfP7ALeD9nZRmv4KtMhoWpI0zHdgwDPEDfmkG/F6oiwUiTMQQQRIj5xdzRxH9 dMK+fOzhNcP5r/WQTmgPiDOFKDvnQnNemWKb5uMw41COvkvZhtIGvll6gAbf11ANGP+C Z/qjPmkoy8hlUvYVUn4knYRVR9q83Z1CC/3p397sxfDFqT3CxzjCQkAVUvB2IXrVdd8f fRqICuYCzV1vGx9okoGvrSlqLl17GqADHkk6EudPBvxM6+nsAa/1bArH6sPBu+C4i15j QvcKx/TMec8gyJv7UXjol9uGXJIR/VTI0YqQl+SW+gRzAnB0neNHf9ZYp4FwUxeZ/Yrf hHpw== X-Gm-Message-State: AOAM530+9D7055pGDTGw8AY4t5rvAoVwobS6bqb5sRLVdTA0UHnCqWD+ FfjiGOdcC5vb0QEwPrwAXUHkkRoY0eg= X-Google-Smtp-Source: ABdhPJyigwaldiRU5IzcFrXD/h6dRx6qCc8tgfanfYwTxw5Fhtas6BQBz2TspHMkkukg3YoMwTGIgA== X-Received: by 2002:a17:906:72d7:: with SMTP id m23mr18380934ejl.430.1614191100199; Wed, 24 Feb 2021 10:25:00 -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.24.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Feb 2021 10:24:59 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 08/10] scsi: Add mapping for generic SCSI_HOST status to sense codes Date: Wed, 24 Feb 2021 19:24:51 +0100 Message-Id: <20210224182453.587731-9-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 Received-SPF: pass client-ip=2a00:1450:4864:20::636; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x636.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Hannes Reinecke As we don't have a driver-specific mapping (yet) we should provide for a detailed mapping from host_status to SCSI sense codes. Signed-off-by: Hannes Reinecke Message-Id: <20201116184041.60465-6-hare@suse.de> Signed-off-by: Paolo Bonzini --- include/scsi/utils.h | 1 + scsi/utils.c | 65 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/include/scsi/utils.h b/include/scsi/utils.h index ddb22b56df..9080d65e27 100644 --- a/include/scsi/utils.h +++ b/include/scsi/utils.h @@ -145,5 +145,6 @@ int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, #endif int scsi_sense_from_errno(int errno_value, SCSISense *sense); +int scsi_sense_from_host_status(uint8_t host_status, SCSISense *sense); #endif diff --git a/scsi/utils.c b/scsi/utils.c index 4d994b6d56..28eb32746e 100644 --- a/scsi/utils.c +++ b/scsi/utils.c @@ -257,6 +257,21 @@ const struct SCSISense sense_code_LUN_COMM_FAILURE = { .key = ABORTED_COMMAND, .asc = 0x08, .ascq = 0x00 }; +/* Command aborted, LUN does not respond to selection */ +const struct SCSISense sense_code_LUN_NOT_RESPONDING = { + .key = ABORTED_COMMAND, .asc = 0x05, .ascq = 0x00 +}; + +/* Command aborted, Command Timeout during processing */ +const struct SCSISense sense_code_COMMAND_TIMEOUT = { + .key = ABORTED_COMMAND, .asc = 0x2e, .ascq = 0x02 +}; + +/* Command aborted, Commands cleared by device server */ +const struct SCSISense sense_code_COMMAND_ABORTED = { + .key = ABORTED_COMMAND, .asc = 0x2f, .ascq = 0x02 +}; + /* Medium Error, Unrecovered read error */ const struct SCSISense sense_code_READ_ERROR = { .key = MEDIUM_ERROR, .asc = 0x11, .ascq = 0x00 @@ -605,6 +620,45 @@ int scsi_sense_from_errno(int errno_value, SCSISense *sense) } } +int scsi_sense_from_host_status(uint8_t host_status, + SCSISense *sense) +{ + switch (host_status) { + case SCSI_HOST_NO_LUN: + *sense = SENSE_CODE(LUN_NOT_RESPONDING); + return CHECK_CONDITION; + case SCSI_HOST_BUSY: + return BUSY; + case SCSI_HOST_TIME_OUT: + *sense = SENSE_CODE(COMMAND_TIMEOUT); + return CHECK_CONDITION; + case SCSI_HOST_BAD_RESPONSE: + *sense = SENSE_CODE(LUN_COMM_FAILURE); + return CHECK_CONDITION; + case SCSI_HOST_ABORTED: + *sense = SENSE_CODE(COMMAND_ABORTED); + return CHECK_CONDITION; + case SCSI_HOST_RESET: + *sense = SENSE_CODE(RESET); + return CHECK_CONDITION; + case SCSI_HOST_TRANSPORT_DISRUPTED: + *sense = SENSE_CODE(I_T_NEXUS_LOSS); + return CHECK_CONDITION; + case SCSI_HOST_TARGET_FAILURE: + *sense = SENSE_CODE(TARGET_FAILURE); + return CHECK_CONDITION; + case SCSI_HOST_RESERVATION_ERROR: + return RESERVATION_CONFLICT; + case SCSI_HOST_ALLOCATION_FAILURE: + *sense = SENSE_CODE(SPACE_ALLOC_FAILED); + return CHECK_CONDITION; + case SCSI_HOST_MEDIUM_ERROR: + *sense = SENSE_CODE(READ_ERROR); + return CHECK_CONDITION; + } + return GOOD; +} + #ifdef CONFIG_LINUX int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, SCSISense *sense) @@ -612,14 +666,11 @@ int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, if (errno_value != 0) { return scsi_sense_from_errno(errno_value, sense); } else { - if (io_hdr->host_status == SCSI_HOST_NO_LUN || - io_hdr->host_status == SCSI_HOST_BUSY || - io_hdr->host_status == SCSI_HOST_TIME_OUT || - (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT)) { + int status = scsi_sense_from_host_status(io_hdr->host_status, sense); + if (status) { + return status; + } else if (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) { From patchwork Wed Feb 24 18:24:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443996 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=vARZBQ95; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4LM5TXxz9sRN for ; Thu, 25 Feb 2021 05:33:31 +1100 (AEDT) Received: from localhost ([::1]:59786 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyyX-0002fd-Pj for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:33:29 -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) 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) 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) 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 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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; #define SCSI_DISK_F_REMOVABLE 0 @@ -261,8 +260,6 @@ static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed) 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); } return false; @@ -2697,8 +2694,47 @@ typedef struct SCSIBlockReq { /* CDB passed to SG_IO. */ uint8_t cdb[16]; + BlockCompletionFunc *cb; + void *cb_opaque; } SCSIBlockReq; +static void scsi_block_sgio_complete(void *opaque, int ret) +{ + SCSIBlockReq *req = (SCSIBlockReq *)opaque; + SCSIDiskReq *r = &req->req; + SCSIDevice *s = r->req.dev; + sg_io_hdr_t *io_hdr = &req->io_header; + SCSISense sense; + + if (ret == 0) { + if (io_hdr->host_status != SCSI_HOST_OK) { + ret = scsi_sense_from_host_status(io_hdr->host_status, &sense); + if (ret == CHECK_CONDITION) { + scsi_req_build_sense(&r->req, sense); + } + } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { + ret = BUSY; + } else { + ret = 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 = 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 = s->qdev.io_timeout * 1000; io_header->usr_ptr = r; io_header->flags |= SG_FLAG_DIRECT_IO; + req->cb = cb; + req->cb_opaque = opaque; trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba, nb_logical_blocks, io_header->timeout); - aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque); + aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, scsi_block_sgio_complete, req); assert(aiocb != NULL); return aiocb; } @@ -2893,7 +2931,6 @@ static int32_t scsi_block_dma_command(SCSIRequest *req, uint8_t *buf) return 0; } - r->req.status = &r->io_header.status; return scsi_disk_dma_command(req, buf); } 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 = &r->io_header; assert(r->req.aiocb == NULL); @@ -82,15 +83,24 @@ static void scsi_command_complete_noio(SCSIGenericReq *r, int ret) scsi_req_cancel_complete(&r->req); goto done; } - 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 { + if (ret < 0) { + status = scsi_sense_from_errno(-ret, &sense); + if (status == CHECK_CONDITION) { + scsi_req_build_sense(&r->req, sense); + } + } else if (io_hdr->host_status != SCSI_HOST_OK) { + status = scsi_sense_from_host_status(io_hdr->host_status, &sense); + if (status == CHECK_CONDITION) { scsi_req_build_sense(&r->req, sense); } + } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { + status = BUSY; + } else { + status = io_hdr->status; + if (io_hdr->driver_status & SG_ERR_DRIVER_SENSE) { + r->req.sense_len = io_hdr->sb_len_wr; + } } - trace_scsi_generic_command_complete_noio(r, r->req.tag, status); 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 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 = (char *)data->buf; io_hdr.dxfer_len = data->sz; ret = ioctl(data->fd, SG_IO, &io_hdr); - status = sg_io_sense_from_errno(ret < 0 ? errno : 0, &io_hdr, - &sense_code); + + if (ret < 0) { + status = scsi_sense_from_errno(errno, &sense_code); + if (status == CHECK_CONDITION) { + scsi_build_sense(data->sense, sense_code); + } + } else if (io_hdr.host_status != SCSI_HOST_OK) { + status = scsi_sense_from_host_status(io_hdr.host_status, &sense_code); + if (status == CHECK_CONDITION) { + scsi_build_sense(data->sense, sense_code); + } + } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { + status = BUSY; + } else { + status = io_hdr.status; + } + if (status == GOOD) { data->sz -= io_hdr.resid; } else { data->sz = 0; } - if (status == CHECK_CONDITION && - !(io_hdr.driver_status & SG_ERR_DRIVER_SENSE)) { - scsi_build_sense(data->sense, sense_code); - } - return status; } 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 != 0) { - return scsi_sense_from_errno(errno_value, sense); - } else { - int status = scsi_sense_from_host_status(io_hdr->host_status, sense); - 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 From patchwork Wed Feb 24 18:24:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 1443997 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=bKz1vhhs; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Dm4LR4Rckz9sRN for ; Thu, 25 Feb 2021 05:33:35 +1100 (AEDT) Received: from localhost ([::1]:60000 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lEyyb-0002kn-BB for incoming@patchwork.ozlabs.org; Wed, 24 Feb 2021 13:33:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:37638) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lEyqO-0002Mb-VU for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:05 -0500 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]:43214) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lEyqM-0004pi-SR for qemu-devel@nongnu.org; Wed, 24 Feb 2021 13:25:04 -0500 Received: by mail-ej1-x62f.google.com with SMTP id k13so4622868ejs.10 for ; Wed, 24 Feb 2021 10:25:02 -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=XxRqz7mVV0toeHXJ6WSZFhW0mvu4brRctc9XFrbC9FQ=; b=bKz1vhhs9QxUzbW7a/VuaQrSwwc/WuMnS0LSAcCNsvEDtT8z/nsy/J3VBtzkUoBImz 87dpez4rUUS977ubCs+QilaLWOy/jnJCPgO+2I+XgID5INZTHjLC3mUgjh7MwisUkv4v nfGJL/SPh4k4YNFrrA0+SVeVD/seJSga73r5NDalQKUrun2O5vX7U6j1Bqi9qH4TWKs6 sLa2GHMAJinY4Jhdg7n3IUo+9H1bBH5caIPATkJNlEdf6JvThL7r7FzYhbluJ78+nt41 j0my2GBRoS5uM8jyhlBq0O63Yja8QljgowTHda84jsbTbjxqGzhC3G1yAmuzZxR0EPts jRow== 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=XxRqz7mVV0toeHXJ6WSZFhW0mvu4brRctc9XFrbC9FQ=; b=FIi1DZcQDph8UtExZcvk5bxGCHGcpCNMtlKrRoEnZJCDOdDX+CbZXuCLrM8/UjBLE9 HauKcgGaq12IQ6ROi0DNs83hYbL83WYfL/aD2pg2naF4J2ZwQ8PfGFTHzZ0i3ngGMNsp /zuNcXXsrH/8+EPCGsFIJg/zA4pBMFFlE4P7Bj8eRFKf8UsXEaTwZabxSzcJ4QMdBNIZ LoC3xUugdt8ltKpJ+FRIkPU18fhqNKWr7DwXUkM7xjY88VV2ou9N1JddXZNRoQgPkj+N UPmK2K5mJLuGd6LKMV0YY0Q+bGBXmCdIlCGGq4W3YfOzwBRor0eMXWctNwJDuArnDp6H J1+g== X-Gm-Message-State: AOAM533MF5JJwhpDI7iFJDjUtoKzsDDUJdwtpXSxKM7Tynx3Bf71kjfi CyUjL16S2tgS54zKiDXXKN0QYXpCglg= X-Google-Smtp-Source: ABdhPJwK1b6yu3wWJ3hJDL8uj6MHbO1BO0N17dykNiZbI4+ZhHLZw25YRNAAcbZ0pdwNDLWyHjrM4g== X-Received: by 2002:a17:906:a090:: with SMTP id q16mr31901695ejy.236.1614191101544; 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:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PATCH 10/10] scsi: move host_status handling into SCSI drivers Date: Wed, 24 Feb 2021 19:24:53 +0100 Message-Id: <20210224182453.587731-11-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 Received-SPF: pass client-ip=2a00:1450:4864:20::62f; envelope-from=paolo.bonzini@gmail.com; helo=mail-ej1-x62f.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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Hannes Reinecke Some SCSI drivers like virtio have an internal mapping for the host_status. This patch moves the host_status translation into the SCSI drivers to allow those drivers to set up the correct values. Signed-off-by: Hannes Reinecke . [Added default handling to avoid touching all drivers. - Paolo] Signed-off-by: Paolo Bonzini --- hw/scsi/scsi-bus.c | 23 +++++++++++++++++++- hw/scsi/scsi-disk.c | 7 ++---- hw/scsi/scsi-generic.c | 6 ++---- hw/scsi/virtio-scsi.c | 46 ++++++++++++++++++++++++++++++++++++++++ hw/scsi/vmw_pvscsi.c | 39 ++++++++++++++++++++++++++++++++++ include/hw/scsi/scsi.h | 4 +++- include/scsi/constants.h | 3 +++ 7 files changed, 117 insertions(+), 11 deletions(-) diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index dc4141ec8d..6088601925 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -692,6 +692,7 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d, req->lun = lun; req->hba_private = hba_private; req->status = -1; + req->host_status = -1; req->ops = reqops; object_ref(OBJECT(d)); object_ref(OBJECT(qbus->parent)); @@ -1455,6 +1456,17 @@ void scsi_req_print(SCSIRequest *req) } } +static void scsi_req_complete_failed(SCSIRequest *req) +{ + SCSISense sense; + + req->status = scsi_sense_from_host_status(req->host_status, &sense); + if (req->status == CHECK_CONDITION) { + scsi_req_build_sense(req, sense); + } + req->bus->info->complete(req, 0); +} + void scsi_req_complete(SCSIRequest *req, int status) { assert(req->status == -1); @@ -1483,7 +1495,16 @@ void scsi_req_complete(SCSIRequest *req, int status) scsi_req_ref(req); scsi_req_dequeue(req); - req->bus->info->complete(req, req->resid); + if (status == CHECK_HOST_STATUS) { + if (req->bus->info->fail) { + req->bus->info->fail(req); + } else { + scsi_req_complete_failed(req); + } + } else { + req->host_status = SCSI_HOST_OK; + req->bus->info->complete(req, req->resid); + } /* Cancelled requests might end up being completed instead of cancelled */ notifier_list_notify(&req->cancel_notifiers, req); diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index ceaf78b423..b7e53b1b6f 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2704,14 +2704,11 @@ static void scsi_block_sgio_complete(void *opaque, int ret) SCSIDiskReq *r = &req->req; SCSIDevice *s = r->req.dev; sg_io_hdr_t *io_hdr = &req->io_header; - SCSISense sense; if (ret == 0) { if (io_hdr->host_status != SCSI_HOST_OK) { - ret = scsi_sense_from_host_status(io_hdr->host_status, &sense); - if (ret == CHECK_CONDITION) { - scsi_req_build_sense(&r->req, sense); - } + ret = CHECK_HOST_STATUS; + r->req.host_status = io_hdr->host_status; } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { ret = BUSY; } else { diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c index 716caf0d22..8e26fccf74 100644 --- a/hw/scsi/scsi-generic.c +++ b/hw/scsi/scsi-generic.c @@ -89,10 +89,8 @@ static void scsi_command_complete_noio(SCSIGenericReq *r, int ret) scsi_req_build_sense(&r->req, sense); } } else if (io_hdr->host_status != SCSI_HOST_OK) { - status = scsi_sense_from_host_status(io_hdr->host_status, &sense); - if (status == CHECK_CONDITION) { - scsi_req_build_sense(&r->req, sense); - } + r->req.host_status = io_hdr->host_status; + status = CHECK_HOST_STATUS; } else if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) { status = BUSY; } else { diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 358c0e70b0..6d80730287 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -500,6 +500,51 @@ static void virtio_scsi_complete_cmd_req(VirtIOSCSIReq *req) virtio_scsi_complete_req(req); } +static void virtio_scsi_command_failed(SCSIRequest *r) +{ + VirtIOSCSIReq *req = r->hba_private; + + if (r->io_canceled) { + return; + } + + req->resp.cmd.status = GOOD; + switch (r->host_status) { + case SCSI_HOST_NO_LUN: + req->resp.cmd.response = VIRTIO_SCSI_S_INCORRECT_LUN; + break; + case SCSI_HOST_BUSY: + req->resp.cmd.response = VIRTIO_SCSI_S_BUSY; + break; + case SCSI_HOST_TIME_OUT: + case SCSI_HOST_ABORTED: + req->resp.cmd.response = VIRTIO_SCSI_S_ABORTED; + break; + case SCSI_HOST_BAD_RESPONSE: + req->resp.cmd.response = VIRTIO_SCSI_S_BAD_TARGET; + break; + case SCSI_HOST_RESET: + req->resp.cmd.response = VIRTIO_SCSI_S_RESET; + break; + case SCSI_HOST_TRANSPORT_DISRUPTED: + req->resp.cmd.response = VIRTIO_SCSI_S_TRANSPORT_FAILURE; + break; + case SCSI_HOST_TARGET_FAILURE: + req->resp.cmd.response = VIRTIO_SCSI_S_TARGET_FAILURE; + break; + case SCSI_HOST_RESERVATION_ERROR: + req->resp.cmd.response = VIRTIO_SCSI_S_NEXUS_FAILURE; + break; + case SCSI_HOST_ALLOCATION_FAILURE: + case SCSI_HOST_MEDIUM_ERROR: + case SCSI_HOST_ERROR: + default: + req->resp.cmd.response = VIRTIO_SCSI_S_FAILURE; + break; + } + virtio_scsi_complete_cmd_req(req); +} + static void virtio_scsi_command_complete(SCSIRequest *r, size_t resid) { VirtIOSCSIReq *req = r->hba_private; @@ -908,6 +953,7 @@ static struct SCSIBusInfo virtio_scsi_scsi_info = { .max_lun = VIRTIO_SCSI_MAX_LUN, .complete = virtio_scsi_command_complete, + .fail = virtio_scsi_command_failed, .cancel = virtio_scsi_request_cancelled, .change = virtio_scsi_change, .parse_cdb = virtio_scsi_parse_cdb, diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c index 0da378ed50..1f30cb020a 100644 --- a/hw/scsi/vmw_pvscsi.c +++ b/hw/scsi/vmw_pvscsi.c @@ -510,6 +510,44 @@ pvscsi_write_sense(PVSCSIRequest *r, uint8_t *sense, int len) cpu_physical_memory_write(r->req.senseAddr, sense, r->cmp.senseLen); } +static void +pvscsi_command_failed(SCSIRequest *req) +{ + PVSCSIRequest *pvscsi_req = req->hba_private; + PVSCSIState *s; + + if (!pvscsi_req) { + trace_pvscsi_command_complete_not_found(req->tag); + return; + } + s = pvscsi_req->dev; + + switch (req->host_status) { + case SCSI_HOST_NO_LUN: + pvscsi_req->cmp.hostStatus = BTSTAT_LUNMISMATCH; + break; + case SCSI_HOST_BUSY: + pvscsi_req->cmp.hostStatus = BTSTAT_ABORTQUEUE; + break; + case SCSI_HOST_TIME_OUT: + case SCSI_HOST_ABORTED: + pvscsi_req->cmp.hostStatus = BTSTAT_SENTRST; + break; + case SCSI_HOST_BAD_RESPONSE: + pvscsi_req->cmp.hostStatus = BTSTAT_SELTIMEO; + break; + case SCSI_HOST_RESET: + pvscsi_req->cmp.hostStatus = BTSTAT_BUSRESET; + break; + default: + pvscsi_req->cmp.hostStatus = BTSTAT_HASOFTWARE; + break; + } + pvscsi_req->cmp.scsiStatus = GOOD; + qemu_sglist_destroy(&pvscsi_req->sgl); + pvscsi_complete_request(s, pvscsi_req); +} + static void pvscsi_command_complete(SCSIRequest *req, size_t resid) { @@ -1103,6 +1141,7 @@ static const struct SCSIBusInfo pvscsi_scsi_info = { .get_sg_list = pvscsi_get_sg_list, .complete = pvscsi_command_complete, .cancel = pvscsi_request_cancelled, + .fail = pvscsi_command_failed, }; static void diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h index 5d992e6e1d..ee7876674c 100644 --- a/include/hw/scsi/scsi.h +++ b/include/hw/scsi/scsi.h @@ -27,7 +27,8 @@ struct SCSIRequest { uint32_t refcount; uint32_t tag; uint32_t lun; - uint32_t status; + int16_t status; + int16_t host_status; void *hba_private; size_t resid; SCSICommand cmd; @@ -123,6 +124,7 @@ struct SCSIBusInfo { int (*parse_cdb)(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf, void *hba_private); void (*transfer_data)(SCSIRequest *req, uint32_t arg); + void (*fail)(SCSIRequest *req); void (*complete)(SCSIRequest *req, size_t resid); void (*cancel)(SCSIRequest *req); void (*change)(SCSIBus *bus, SCSIDevice *dev, SCSISense sense); diff --git a/include/scsi/constants.h b/include/scsi/constants.h index 2a32c08b5e..0ee29bfd7d 100644 --- a/include/scsi/constants.h +++ b/include/scsi/constants.h @@ -181,6 +181,9 @@ #define STATUS_MASK 0x3e +/* QEMU only. */ +#define CHECK_HOST_STATUS 0xff + /* * SENSE KEYS */