From nobody Mon Feb 9 00:20:50 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 ARC-Seal: i=1; a=rsa-sha256; t=1605554323; cv=none; d=zohomail.com; s=zohoarc; b=NAIdkBTql7/zqDtUXbuC9V6DwXna/xiJL5tpOE8BdyrrqcqfzEjFS/GtIPhOr9NC57I1X1No+Yx8Bg4EM/wO50lPEhOpqGnE0IjkXLvXWqf9Y7SP7ZXFoA+/UfLKD7OO8DMJXO9x57/Ija9oTvE6RkvzWSzsWAIqujNk2PJ+Z4Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605554323; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=FP+6K7dWuv9nHaPailucVADYNP7nrAAjHdzMcWJhEvQ=; b=F1V4Th8uUdSiiS+flKrA57ljzDEU/VOMyti/d3u+Tlfflmke0i4JFAvS1mhDoMrTrSUTvfOU1nHPeYvyr1fizoUn9OQdHjSmEA+3Q5zc9b/hrFiCPnfhol6sC21JWoegA4Ffti/jQrd2ICPgOgR+XY6Vn2ItcP1vxYh/7UPm9Gc= ARC-Authentication-Results: i=1; mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160555432308492.3184341149564; Mon, 16 Nov 2020 11:18:43 -0800 (PST) Received: from localhost ([::1]:47290 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kek1R-00012L-Vg for importer@patchew.org; Mon, 16 Nov 2020 14:18:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:39868) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kejQt-0003sX-Ce for qemu-devel@nongnu.org; Mon, 16 Nov 2020 13:40:55 -0500 Received: from mx2.suse.de ([195.135.220.15]:45334) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kejQo-0000lH-Oj for qemu-devel@nongnu.org; Mon, 16 Nov 2020 13:40:55 -0500 Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 41A94AE1C; Mon, 16 Nov 2020 18:40:49 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Hannes Reinecke To: Paolo Bonzini Subject: [PATCH 1/7] scsi-disk: Add sg_io callback to evaluate status Date: Mon, 16 Nov 2020 19:40:35 +0100 Message-Id: <20201116184041.60465-2-hare@suse.de> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20201116184041.60465-1-hare@suse.de> References: <20201116184041.60465-1-hare@suse.de> 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=195.135.220.15; envelope-from=hare@suse.de; helo=mx2.suse.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/16 12:53:11 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x (no timestamps) [generic] X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org, Hannes Reinecke Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add a separate sg_io callback to allow us to evaluate the various states returned by the SG_IO ioctl. Signed-off-by: Hannes Reinecke --- hw/scsi/scsi-disk.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index dd23a38d6a..5d6c892f29 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -76,7 +76,6 @@ typedef struct SCSIDiskReq { struct iovec iov; QEMUIOVector qiov; BlockAcctCookie acct; - unsigned char *status; } SCSIDiskReq; =20 #define SCSI_DISK_F_REMOVABLE 0 @@ -188,7 +187,7 @@ static bool scsi_disk_req_check_error(SCSIDiskReq *r, i= nt ret, bool acct_failed) return true; } =20 - if (ret < 0 || (r->status && *r->status)) { + if (ret < 0 || r->req.status) { return scsi_handle_rw_error(r, -ret, acct_failed); } =20 @@ -452,11 +451,11 @@ static bool scsi_handle_rw_error(SCSIDiskReq *r, int = error, bool acct_failed) * whether the error has to be handled by the guest or should = rather * pause the host. */ - assert(r->status && *r->status); + assert(r->req.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, r->req.status); return true; } error =3D scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.= sense)); @@ -2688,8 +2687,24 @@ typedef struct SCSIBlockReq { =20 /* CDB passed to SG_IO. */ uint8_t cdb[16]; + BlockCompletionFunc *cb; + void *cb_opaque; } SCSIBlockReq; =20 +static void scsi_block_sgio_complete(void *opaque, int ret) +{ + SCSIBlockReq *req =3D (SCSIBlockReq *)opaque; + SCSIDiskReq *r =3D &req->req; + SCSISense sense; + + r->req.status =3D sg_io_sense_from_errno(-ret, &req->io_header, &sense= ); + if (r->req.status =3D=3D CHECK_CONDITION && + req->io_header.status !=3D CHECK_CONDITION) + scsi_req_build_sense(&r->req, sense); + + req->cb(req->cb_opaque, ret); +} + static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req, int64_t offset, QEMUIOVector *iov, int direction, @@ -2768,9 +2783,11 @@ static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *= req, io_header->timeout =3D s->qdev.io_timeout * 1000; io_header->usr_ptr =3D r; io_header->flags |=3D SG_FLAG_DIRECT_IO; + req->cb =3D cb; + req->cb_opaque =3D opaque; trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba, nb_logical_blocks, io_header->timeout= ); - aiocb =3D blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque= ); + aiocb =3D blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, scsi_block= _sgio_complete, req); assert(aiocb !=3D NULL); return aiocb; } @@ -2884,7 +2901,6 @@ static int32_t scsi_block_dma_command(SCSIRequest *re= q, uint8_t *buf) return 0; } =20 - r->req.status =3D &r->io_header.status; return scsi_disk_dma_command(req, buf); } =20 --=20 2.16.4