From nobody Fri Nov 22 10:04:01 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598886558; cv=none; d=zohomail.com; s=zohoarc; b=UUQq6jq3468ezAEX+r/lyr7m24ORkgUEbArQjKsBRMDW6SifBUgo2cq49guuSd5r4IeFMFNRQaiTor222t8SvY3spJ+EUYN7iwWhbcSzDiELvixfHKTAjgJbDJRx2VhE/PsU6AEKx5DSLAfhpeF6+Gusj595sDQ1GFNXfkvflUI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598886558; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=sgznJQ2I4Fklag8gmk8CI9JqaVIi77SBCPkLErOkHL4=; b=gphXY4IROnxr/hcrxhXsZ0ECJfZpq1gqVHGQ5t35HYt7qIxH9w2EQqCQ/3EpN5MxpqRLwGUU7JRZ7vbcGKuTOcyg7fJ0FAWXgg2iwrO6wMDlr5+cHXTiOeB2QA2CkQCzgYqhdBKwAZAorNKYIgVuM8w/ixmopNobOuGc8c4xiaM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1598886558989465.9713251043978; Mon, 31 Aug 2020 08:09:18 -0700 (PDT) Received: from localhost ([::1]:54302 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kClQr-0007fV-NK for importer@patchew.org; Mon, 31 Aug 2020 11:09:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44354) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kClJy-0006dV-LU for qemu-devel@nongnu.org; Mon, 31 Aug 2020 11:02:10 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:42000) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kClJw-0004ZR-KL for qemu-devel@nongnu.org; Mon, 31 Aug 2020 11:02:10 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-564-YATnqnyrMEe0qutg9264ew-1; Mon, 31 Aug 2020 11:02:04 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E5FC3801AAC; Mon, 31 Aug 2020 15:02:03 +0000 (UTC) Received: from localhost.localdomain (unknown [10.35.206.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id D327C19C4F; Mon, 31 Aug 2020 15:02:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598886127; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sgznJQ2I4Fklag8gmk8CI9JqaVIi77SBCPkLErOkHL4=; b=M+fN1wA5Z5UoG1gFljjIiBY5OXY7T9p7NBxC/HaBb3oi6Ifd1E6rfUvCdsGUIhS4OAr9wL +XykCiuQzfsMmeZgFJjqucaWSsTEjNs/v7eTSGkZlHPZ6zHbIiBAeQNT3+CWXIIm5rHN7p tRutCNErp47yXVIFEIgHezrZ8G3L5V4= X-MC-Unique: YATnqnyrMEe0qutg9264ew-1 From: Maxim Levitsky To: qemu-devel@nongnu.org Subject: [PATCH v4 9/9] scsi/scsi_bus: fix races in REPORT LUNS Date: Mon, 31 Aug 2020 18:01:24 +0300 Message-Id: <20200831150124.206267-10-mlevitsk@redhat.com> In-Reply-To: <20200831150124.206267-1-mlevitsk@redhat.com> References: <20200831150124.206267-1-mlevitsk@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mlevitsk@redhat.com X-Mimecast-Spam-Score: 0.001 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=mlevitsk@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/31 03:02:42 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H5=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: Fam Zheng , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Eduardo Habkost , "Michael S. Tsirkin" , Maxim Levitsky , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Currently scsi_target_emulate_report_luns iterates over child devices list twice, and there is guarantee, that it will not be changed meanwhile. This reason for two loops is that it needs to know how much memory to allocate. Avoid this by iterating once, and allocating the memory for the output dynamically with reserving enought memory so that in practice it won't be reallocated often. Bugzilla for reference: https://bugzilla.redhat.com/show_bug.cgi?id=3D18667= 07 Signed-off-by: Maxim Levitsky Reviewed-by: Stefan Hajnoczi --- hw/scsi/scsi-bus.c | 62 ++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index feab20b76d..150dee2e6a 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -438,19 +438,25 @@ struct SCSITargetReq { static void store_lun(uint8_t *outbuf, int lun) { if (lun < 256) { + /* Simple logical unit addressing method*/ + outbuf[0] =3D 0; outbuf[1] =3D lun; - return; + } else { + /* Flat space addressing method */ + outbuf[0] =3D 0x40 | (lun >> 8); + outbuf[1] =3D (lun & 255); } - outbuf[1] =3D (lun & 255); - outbuf[0] =3D (lun >> 8) | 0x40; } =20 static bool scsi_target_emulate_report_luns(SCSITargetReq *r) { BusChild *kid; - int i, len, n; int channel, id; - bool found_lun0; + uint8_t tmp[8] =3D {0}; + int len =3D 0; + + /* reserve space for 63 LUNs*/ + GByteArray *buf =3D g_byte_array_sized_new(512); =20 if (r->req.cmd.xfer < 16) { return false; @@ -460,46 +466,36 @@ static bool scsi_target_emulate_report_luns(SCSITarge= tReq *r) } channel =3D r->req.dev->channel; id =3D r->req.dev->id; - found_lun0 =3D false; - n =3D 0; =20 - rcu_read_lock(); =20 - QTAILQ_FOREACH_RCU(kid, &r->req.bus->qbus.children, sibling) { - DeviceState *qdev =3D kid->child; - SCSIDevice *dev =3D SCSI_DEVICE(qdev); + /* add size (will be updated later to correct value */ + g_byte_array_append(buf, tmp, 8); + len +=3D 8; =20 - if (dev->channel =3D=3D channel && dev->id =3D=3D id) { - if (dev->lun =3D=3D 0) { - found_lun0 =3D true; - } - n +=3D 8; - } - } - if (!found_lun0) { - n +=3D 8; - } - - scsi_target_alloc_buf(&r->req, n + 8); + /* add LUN0 */ + g_byte_array_append(buf, tmp, 8); + len +=3D 8; =20 - len =3D MIN(n + 8, r->req.cmd.xfer & ~7); - memset(r->buf, 0, len); - stl_be_p(&r->buf[0], n); - i =3D found_lun0 ? 8 : 16; + rcu_read_lock(); QTAILQ_FOREACH_RCU(kid, &r->req.bus->qbus.children, sibling) { DeviceState *qdev =3D kid->child; SCSIDevice *dev =3D SCSI_DEVICE(qdev); =20 - if (dev->channel =3D=3D channel && dev->id =3D=3D id) { - store_lun(&r->buf[i], dev->lun); - i +=3D 8; + if (dev->channel =3D=3D channel && dev->id =3D=3D id && dev->lun != =3D 0) { + store_lun(tmp, dev->lun); + g_byte_array_append(buf, tmp, 8); + len +=3D 8; } } - rcu_read_unlock(); =20 - assert(i =3D=3D n + 8); - r->len =3D len; + r->buf_len =3D len; + r->buf =3D g_byte_array_free(buf, FALSE); + r->len =3D MIN(len, r->req.cmd.xfer & ~7); + + /* store the LUN list length */ + stl_be_p(&r->buf[0], len - 8); + return true; } =20 --=20 2.26.2