From nobody Sun Nov 24 18:33:42 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1722246455; cv=none; d=zohomail.com; s=zohoarc; b=NhTMNyV3RhV+eOEAh+m95vVuui4og07aQvP08ffsC/k+JYiNU34QtY1ZUUcu4IXQ791jDSfJfuqvUXDR6d0Q3KWUSwGIds1xVCsng6rMvHkbCtEsAZy03Eds3ZrYxxDbCHZ9iXrBG5RjPlsxPQmkrhD0+Po2x40aHiZn3u3Ff0o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1722246455; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BdOLfUo1FinCPJEBrdvb3o1LkFOGtSrCp1ZUO0io0O8=; b=i02QvQHX89frDg3oa52KaS2jntF5K6C6u3Kty0fW8UduBRf5SnyVzWzVUeJMskRUJOQVzLA7XcjWMI26/eElUH71rPWyiKLSgykFvqkGMI/ld+iPe8v59DlNpu2NjVMdwxS/8jr4C27o6ftejRavFxmDPdSkUVs2kT/NH9kW+O4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1722246455708669.3553198532463; Mon, 29 Jul 2024 02:47:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sYMyP-0003Nv-Uw; Mon, 29 Jul 2024 05:47:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sYMyN-0003Hb-Q4 for qemu-devel@nongnu.org; Mon, 29 Jul 2024 05:47:19 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sYMyM-0004Yj-05 for qemu-devel@nongnu.org; Mon, 29 Jul 2024 05:47:19 -0400 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-375-QF7Dn0O1NGeIDUkglk6Qhw-1; Mon, 29 Jul 2024 05:47:12 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B70B61955F66; Mon, 29 Jul 2024 09:47:11 +0000 (UTC) Received: from merkur.redhat.com (unknown [10.39.194.89]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7D4F71955F3B; Mon, 29 Jul 2024 09:47:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722246437; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BdOLfUo1FinCPJEBrdvb3o1LkFOGtSrCp1ZUO0io0O8=; b=KOb3xzVpVV58/Cn9YAd5OiCJM7aeM2AMwm8h978aKut3Fw14RRXQVLQqQanuFXctn3/aXD 1GiYRQ+4dMW4LKzdQsVbncUACfcNVQyE3Di6xflSiTTCDPbjqUkjbBG0wIcqPUgsOyhsnI U6IGaUytGHu88qE/xNe1VyrdPkO2M3s= X-MC-Unique: QF7Dn0O1NGeIDUkglk6Qhw-1 From: Kevin Wolf To: qemu-block@nongnu.org Cc: kwolf@redhat.com, pbonzini@redhat.com, fam@euphon.net, stefanha@redhat.com, qemu-devel@nongnu.org Subject: [PATCH 1/4] scsi-disk: Use positive return value for status in dma_readv/writev Date: Mon, 29 Jul 2024 11:46:58 +0200 Message-ID: <20240729094702.50282-2-kwolf@redhat.com> In-Reply-To: <20240729094702.50282-1-kwolf@redhat.com> References: <20240729094702.50282-1-kwolf@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=170.10.129.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.125, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1722246456717116600 Content-Type: text/plain; charset="utf-8" In some error cases, scsi_block_sgio_complete() never calls the passed callback, but directly completes the request. This leads to bugs because its error paths are not exact copies of what the callback would normally do. In preparation to fix this, allow passing positive return values to the callbacks that represent the status code that should be used to complete the request. scsi_handle_rw_error() already handles positive values for its ret parameter because scsi_block_sgio_complete() calls directly into it. Signed-off-by: Kevin Wolf --- hw/scsi/scsi-disk.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index a67092db6a..3ff6798bde 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -65,6 +65,10 @@ OBJECT_DECLARE_TYPE(SCSIDiskState, SCSIDiskClass, SCSI_D= ISK_BASE) =20 struct SCSIDiskClass { SCSIDeviceClass parent_class; + /* + * Callbacks receive ret =3D=3D 0 for success. Errors are represented = either as + * negative errno values, or as positive SAM status codes. + */ DMAIOFunc *dma_readv; DMAIOFunc *dma_writev; bool (*need_fua_emulation)(SCSICommand *cmd); @@ -283,7 +287,7 @@ static bool scsi_disk_req_check_error(SCSIDiskReq *r, i= nt ret, bool acct_failed) return true; } =20 - if (ret < 0) { + if (ret !=3D 0) { return scsi_handle_rw_error(r, ret, acct_failed); } =20 @@ -360,7 +364,7 @@ static void scsi_write_do_fua(SCSIDiskReq *r) static void scsi_dma_complete_noio(SCSIDiskReq *r, int ret) { assert(r->req.aiocb =3D=3D NULL); - if (scsi_disk_req_check_error(r, ret, false)) { + if (scsi_disk_req_check_error(r, ret, ret > 0)) { goto done; } =20 @@ -385,9 +389,10 @@ static void scsi_dma_complete(void *opaque, int ret) assert(r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; =20 + /* ret > 0 is accounted for in scsi_disk_req_check_error() */ if (ret < 0) { block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); - } else { + } else if (ret =3D=3D 0) { block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); } scsi_dma_complete_noio(r, ret); @@ -403,7 +408,7 @@ static void scsi_read_complete_noio(SCSIDiskReq *r, int= ret) qemu_get_current_aio_context()); =20 assert(r->req.aiocb =3D=3D NULL); - if (scsi_disk_req_check_error(r, ret, false)) { + if (scsi_disk_req_check_error(r, ret, ret > 0)) { goto done; } =20 @@ -424,9 +429,10 @@ static void scsi_read_complete(void *opaque, int ret) assert(r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; =20 + /* ret > 0 is accounted for in scsi_disk_req_check_error() */ if (ret < 0) { block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); - } else { + } else if (ret =3D=3D 0) { block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); trace_scsi_disk_read_complete(r->req.tag, r->qiov.size); } @@ -534,7 +540,7 @@ static void scsi_write_complete_noio(SCSIDiskReq *r, in= t ret) qemu_get_current_aio_context()); =20 assert (r->req.aiocb =3D=3D NULL); - if (scsi_disk_req_check_error(r, ret, false)) { + if (scsi_disk_req_check_error(r, ret, ret > 0)) { goto done; } =20 @@ -562,9 +568,10 @@ static void scsi_write_complete(void * opaque, int ret) assert (r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; =20 + /* ret > 0 is accounted for in scsi_disk_req_check_error() */ if (ret < 0) { block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct); - } else { + } else if (ret =3D=3D 0) { block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct); } scsi_write_complete_noio(r, ret); --=20 2.45.2