From nobody Mon Feb 9 23:38:10 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528489307085850.1945266716581; Fri, 8 Jun 2018 13:21:47 -0700 (PDT) Received: from localhost ([::1]:38061 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fRNtK-0002TV-9B for importer@patchew.org; Fri, 08 Jun 2018 16:21:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48255) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fRNfz-00007K-Pe for qemu-devel@nongnu.org; Fri, 08 Jun 2018 16:08:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fRNfy-0007NJ-Fe for qemu-devel@nongnu.org; Fri, 08 Jun 2018 16:07:59 -0400 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:39734) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fRNfy-0007N6-Ak for qemu-devel@nongnu.org; Fri, 08 Jun 2018 16:07:58 -0400 Received: by mail-qk0-x243.google.com with SMTP id g14-v6so9524518qkm.6 for ; Fri, 08 Jun 2018 13:07:58 -0700 (PDT) Received: from localhost.localdomain ([2804:431:f700:ddd3:8b53:ca1c:8f9e:6815]) by smtp.gmail.com with ESMTPSA id 73-v6sm39213849qkc.96.2018.06.08.13.07.56 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 08 Jun 2018 13:07:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6hO/+ayhJyPYIwvF9bXKHL2SFR7Y7TiJ4kHiBBElEJI=; b=rccI08ABqdEaafEzc7w28IFi5u0FkFrFiQ1oLUsRnneN9EvDVCYHZOW5g/KW/7proR 35aroz8ia+nruy/rgvckp6qaIZMZH3bH8HoDwoIspdHyBnqaEJa40u2qxRvPp6ZsFlsy xnhTBgMrTLgOrUCtHWEWEw+mBtnDFWYChgXgGwB54njL8XRgWsYQKl1EUAlVa/4IPdeK sdk1ACxBLLkVit2+G50ifG/yFdL4gD15ZHdwNYbQML7kdY5RP0HrUK5zT6waI2hjJw2k Z2F02i905Dujzm58Ul4g9BcF7PCgfgcBVZzey56wIffdc+9VAq1ZZiSBft22B+HxAfeU Q3uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6hO/+ayhJyPYIwvF9bXKHL2SFR7Y7TiJ4kHiBBElEJI=; b=uWQxSwZBEUcBsTky/ipQwoiaXMJOVQnx9c36uUANGfwnOfoeZMHFkECnqvWAqAOOZq rvNYDb5UK4bc0v6DzOcZUH8WhCL6geU9Ve1WIF1FULQJBx8xGexUPcGTXAZJ7iNfbb5c IpHyj9OXqBQFA2ALgaLG8phomTb8Xa/LMzLBnzeJPS7Qax3ul8wetT0SPmZhVA28NEPw ssMg5xEN6R+gUNCDoy533XNwtXj332FZbQ1ddfBxGPlvHaX3sZz0ixjBl7C7br2Af1+t TNKITnc/ikNku+aL/1m0+FvbeBCmWl+kj6Mu3K7neZYBYB8m3JMt70mL/w3d24B99/16 pCCg== X-Gm-Message-State: APt69E0sYZBQaf1gML/x0V4FBiwsXd/u2HJvQxRZiIzd4qoWsqISpETq CEpIq0gYPAp/n2vCH3cPXOF+bwa1jQ7y4g== X-Google-Smtp-Source: ADUXVKIDp4CrhHu7plEw7cQHvGT4sJwyolMqEPFO/ze0g5+j77YQXP+Ydm18uRHS9qh9y9Xfmu4qfg== X-Received: by 2002:a37:6147:: with SMTP id v68-v6mr6398733qkb.1.1528488477710; Fri, 08 Jun 2018 13:07:57 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Date: Fri, 8 Jun 2018 17:07:40 -0300 Message-Id: <20180608200740.24915-4-danielhb413@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180608200740.24915-1-danielhb413@gmail.com> References: <20180608200740.24915-1-danielhb413@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::243 Subject: [Qemu-devel] [PATCH v1 3/3] scsi-block: adding flag at realize to enable Block Limits emulation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, Daniel Henrique Barboza , famz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The previous patches implemented a way to deliver an emulated Block Limits (BL) response for the guest in case the underlying hardware does not support this page. However, the approach used is crude. We're executing the logic for all SCSI devices, regardless of whether they need it or not. There's also a possibility that we'll end up masking a legitimate SCSI error of a device that does implement the BL page (thus not needing any BL emulation). This patch refines the solution used in the previous patches by adding a new SCSIDevice attribute called 'needs_vpl_bl_emulation'. This flag is set at scsi_block_realize using a new function called 'scsi_block_set_vpd_bl_emulation'. This new function queries the Inquiry Supported Pages of the device and checks if it supports the BL message. If it doesn't, the emulation flag is set to 'true'. This flag is then used at scsi_read_complete to isolate the emulation logic from the devices that does not require it. Signed-off-by: Daniel Henrique Barboza --- hw/scsi/scsi-disk.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++= +++ hw/scsi/scsi-generic.c | 32 +++++++++++++++----------------- include/hw/scsi/scsi.h | 1 + 3 files changed, 65 insertions(+), 17 deletions(-) diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 4461a592e5..cb53d0fdab 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2599,6 +2599,54 @@ static int get_device_type(SCSIDiskState *s) return 0; } =20 +static void scsi_block_set_vpd_bl_emulation(SCSIDevice *s) +{ + uint8_t cmd[6]; + uint8_t buf[250]; + uint8_t sensebuf[8]; + uint8_t page_len; + sg_io_hdr_t io_header; + int ret, i; + + memset(cmd, 0, sizeof(cmd)); + memset(buf, 0, sizeof(buf)); + cmd[0] =3D INQUIRY; + cmd[1] =3D 1; + cmd[2] =3D 0x00; + cmd[4] =3D sizeof(buf); + + memset(&io_header, 0, sizeof(io_header)); + io_header.interface_id =3D 'S'; + io_header.dxfer_direction =3D SG_DXFER_FROM_DEV; + io_header.dxfer_len =3D sizeof(buf); + io_header.dxferp =3D buf; + io_header.cmdp =3D cmd; + io_header.cmd_len =3D sizeof(cmd); + io_header.mx_sb_len =3D sizeof(sensebuf); + io_header.sbp =3D sensebuf; + io_header.timeout =3D 6000; /* XXX */ + + ret =3D blk_ioctl(s->conf.blk, SG_IO, &io_header); + if (ret < 0 || io_header.driver_status || io_header.host_status) { + /* + * Do not assume anything if we can't retrieve the + * INQUIRY response to assert the VPD Block Limits + * support. + */ + s->needs_vpd_bl_emulation =3D false; + return; + } + + page_len =3D buf[3]; + for (i =3D 4; i < page_len + 4; i++) { + if (buf[i] =3D=3D 0xb0) { + s->needs_vpd_bl_emulation =3D false; + return; + } + } + s->needs_vpd_bl_emulation =3D true; +} + static void scsi_block_realize(SCSIDevice *dev, Error **errp) { SCSIDiskState *s =3D DO_UPCAST(SCSIDiskState, qdev, dev); @@ -2648,6 +2696,7 @@ static void scsi_block_realize(SCSIDevice *dev, Error= **errp) =20 scsi_realize(&s->qdev, errp); scsi_generic_read_device_identification(&s->qdev); + scsi_block_set_vpd_bl_emulation(dev); } =20 typedef struct SCSIBlockReq { diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c index 64d3b79518..e08ffaa38c 100644 --- a/hw/scsi/scsi-generic.c +++ b/hw/scsi/scsi-generic.c @@ -243,9 +243,8 @@ static void scsi_read_complete(void * opaque, int ret) { SCSIGenericReq *r =3D (SCSIGenericReq *)opaque; SCSIDevice *s =3D r->req.dev; - SCSISense sense; uint8_t page, page_len; - int len, i; + int len; =20 assert(r->req.aiocb !=3D NULL); r->req.aiocb =3D NULL; @@ -328,11 +327,17 @@ static void scsi_read_complete(void * opaque, int ret) * the buffer, clean up the io_header to avoid firing up * the sense error. */ - if (sg_io_sense_from_errno(-ret, &r->io_header, &sense)) { + if (s->needs_vpd_bl_emulation) { + r->buflen =3D scsi_emulate_vpd_bl_page(s, r->buf); r->io_header.sb_len_wr =3D 0; =20 - /* Clean sg_io_sense */ + /* + * We have valid contents in the reply buffer but the + * io_header will report a sense error coming from + * the hardware in scsi_command_complete_noio. Clean it + * up the io_header to avoid reporting it. + */ r->io_header.driver_status =3D 0; r->io_header.status =3D 0; =20 @@ -346,26 +351,19 @@ static void scsi_read_complete(void * opaque, int ret) stl_be_p(&r->buf[12], MIN_NON_ZERO(max_transfer, ldl_be_p(&r->buf[1= 2]))); } - } else if (page =3D=3D 0x00) { + } else if (page =3D=3D 0x00 && s->needs_vpd_bl_emulation) { /* * Now we're capable of supplying the VPD Block Limits - * response if the hardware can't. Inspect if the INQUIRY - * response contains support for the VPD Block Limits page. - * Add it if it doesn't. + * response if the hardware can't. Add it in the INQUIRY + * Supported VPD pages response in case we are using the + * emulation for this device. * * This way, the guest kernel will be aware of the support * and will use it to proper setup the SCSI device. */ page_len =3D r->buf[3]; - for (i =3D 4; i < page_len + 4; i++) { - if (r->buf[i] =3D=3D 0xb0) { - break; - } - } - if (i =3D=3D page_len + 4) { - r->buf[i] =3D 0xb0; - r->buf[3] =3D ++page_len; - } + r->buf[page_len + 4] =3D 0xb0; + r->buf[3] =3D ++page_len; } } } diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h index 4fdde102b8..5fba858b11 100644 --- a/include/hw/scsi/scsi.h +++ b/include/hw/scsi/scsi.h @@ -90,6 +90,7 @@ struct SCSIDevice uint64_t port_wwn; int scsi_version; int default_scsi_version; + bool needs_vpd_bl_emulation; }; =20 extern const VMStateDescription vmstate_scsi_device; --=20 2.14.3