From nobody Mon Feb 9 08:11:24 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=1615372133; cv=none; d=zohomail.com; s=zohoarc; b=Liks30a3KNL1/GlUD6WGGnDY6KwlOa8NkqoTsdJ0OO77VOXYNUiQzcSzYlsEV4GRFLy5c/Z+COgFGrpYvtO5/BwCV6JrU1p75KpR3J3AMKutP0FE/+Y7ZBRIWDdfhAKkd9sMqVc8z89MiQNsIReOSZocKbDgxv21ExGYWeTvN6c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615372133; h=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=L/feqfyPV5BO1kaBDO9LPqVkh3KJYYGE+O2L+ea2RuA=; b=RIre3pFV4Ax4inZWnX82DVwea07yJsQRWw5aAdPEd/FIl+RpE0oqN3Uy4/9BXTdXajxAUAlnt8SziNSs/fK8myHMYcRAbXxQmwM3QADsUwfQX0yxed2zrIpxINMO/NLsNCr67hY9FsjArpAAU67Wgtc8C/PR1qre1Smpq04x8YA= 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 161537213350429.510867321869227; Wed, 10 Mar 2021 02:28:53 -0800 (PST) Received: from localhost ([::1]:56850 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJw5E-000127-CM for importer@patchew.org; Wed, 10 Mar 2021 05:28:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:58200) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJvXh-0007fr-VT; Wed, 10 Mar 2021 04:54:13 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:33213) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJvXd-0005Ed-Pp; Wed, 10 Mar 2021 04:54:12 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 008E05C0160; Wed, 10 Mar 2021 04:54:09 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Wed, 10 Mar 2021 04:54:08 -0500 Received: from apples.local (80-167-98-190-cable.dk.customer.tdc.net [80.167.98.190]) by mail.messagingengine.com (Postfix) with ESMTPA id 9A2F3240057; Wed, 10 Mar 2021 04:54:07 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm2; bh=L/feqfyPV5BO1 kaBDO9LPqVkh3KJYYGE+O2L+ea2RuA=; b=BcVh5QDGNIeqkI6h/PuQj6ApExScX QtcMyLVVXCTngOYmKuxctVQg34I1doD0R3F88m1DThMC5abnMZL/LkINiIdNHiXF ekVh17j60cSyoRvAzu96SX8WrBBWPeuBC9fQMfhYiPDJpqa7e2waYvnpzvsdyrd0 dYSURpl9qdqnnC2pPa3kGe9f+HXgTRDNaUUHglKyVaUpm1Wz2D1uVWstV98L7zwI MtKE6rX4YKUefWDisbqAR+BxiyxdRQM5wJFP/NiwwKQSEUz/HMdm0rvroPHjBCdM l3wd6ydoSGjy7/dggFWxa6Z4VsTSPGy98QmkHNG9vIaKU69y+XGjCaYyQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=L/feqfyPV5BO1kaBDO9LPqVkh3KJYYGE+O2L+ea2RuA=; b=pA8UOO7O 3o/26TIjFupJzJowbJP0LjuoXrwuAeX78/bxuP3t1T/epTigIEoV8/Z0GzOtiN2B mUH6TJgSiRlatyNgIyXRVZgBUG0AySU8EARY/Tu6VlpbJvxCdiL+tc7oToDomVZ9 sZiEZezYeKkdB32T+LJRMjbH/v0uLTPkLuQPFYh9gwUkPVVQ0ELebs5Dz+0qI9Zc qoz1RECaE92t/utUNqvoLX2gj4q8uAp0J7cc6Rmgd3BffYStmHjh3ayIVgcrw697 nQWpyl06IBBRo8wwlJfISPskRKz8NBkIiADtbyBJi9RcktL3Or7j7hC0fTpFKtDp r7qpRnKyCrA2YQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledruddukedgtdelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpeejne curfgrrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH v5 12/13] hw/block/nvme: split zone check/set geometry Date: Wed, 10 Mar 2021 10:53:46 +0100 Message-Id: <20210310095347.682395-13-its@irrelevant.dk> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210310095347.682395-1-its@irrelevant.dk> References: <20210310095347.682395-1-its@irrelevant.dk> MIME-Version: 1.0 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=66.111.4.29; envelope-from=its@irrelevant.dk; helo=out5-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-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 , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Gollu Appalanaidu , Max Reitz , Keith Busch , Stefan Hajnoczi , Klaus Jensen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen In preparation for Format NVM support, split zone geometry check from the zone geometry set function. Signed-off-by: Klaus Jensen --- hw/block/nvme-ns.c | 76 ++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index 192c6c923ab4..1ef2ad4ae273 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -166,38 +166,59 @@ static int nvme_ns_init_blk(NvmeNamespace *ns, Error = **errp) return 0; } =20 -static int nvme_ns_zoned_check_calc_geometry(NvmeNamespace *ns, Error **er= rp) +static int nvme_verify_zone_geometry(size_t ns_size, uint8_t lbads, + uint16_t ms, uint64_t zone_size, + uint64_t zone_cap, Error **errp) { - uint64_t zone_size, zone_cap; - uint32_t lbasz =3D nvme_lsize(ns); + size_t lbasz =3D 1 << lbads; =20 - /* Make sure that the values of ZNS properties are sane */ - if (ns->params.zone_size_bs) { - zone_size =3D ns->params.zone_size_bs; - } else { - zone_size =3D NVME_DEFAULT_ZONE_SIZE; - } - if (ns->params.zone_cap_bs) { - zone_cap =3D ns->params.zone_cap_bs; - } else { + if (!zone_cap) { zone_cap =3D zone_size; } + if (zone_cap > zone_size) { error_setg(errp, "zone capacity %"PRIu64"B exceeds " "zone size %"PRIu64"B", zone_cap, zone_size); return -1; } + if (zone_size < lbasz) { error_setg(errp, "zone size %"PRIu64"B too small, " - "must be at least %"PRIu32"B", zone_size, lbasz); - return -1; - } - if (zone_cap < lbasz) { - error_setg(errp, "zone capacity %"PRIu64"B too small, " - "must be at least %"PRIu32"B", zone_cap, lbasz); + "must be at least %zuB", zone_size, lbasz); return -1; } =20 + if (zone_cap < lbasz) { + error_setg(errp, "zone capacity %"PRIu64"B too small, " + "must be at least %zuB", zone_cap, lbasz); + return -1; + } + + if (!(__nvme_nlbas(ns_size, lbads, ms) / (zone_size / lbasz))) { + error_setg(errp, "insufficient drive capacity, must be at least th= e " + "size of one zone (%"PRIu64"B)", zone_size); + return -1; + } + + return 0; +} + + +static int nvme_ns_zoned_set_geometry(NvmeNamespace *ns, Error **errp) +{ + uint64_t zone_size, zone_cap; + uint32_t lbasz =3D nvme_lsize(ns); + + zone_size =3D zone_cap =3D ns->params.zone_size_bs; + + if (ns->params.zone_cap_bs) { + zone_cap =3D ns->params.zone_cap_bs; + } + + if (nvme_verify_zone_geometry(ns->size, nvme_ns_lbads(ns), nvme_msize(= ns), + zone_size, zone_cap, errp)) { + return -1; + } /* * Save the main zone geometry values to avoid * calculating them later again. @@ -206,14 +227,6 @@ static int nvme_ns_zoned_check_calc_geometry(NvmeNames= pace *ns, Error **errp) ns->zone_capacity =3D zone_cap / lbasz; ns->num_zones =3D nvme_ns_nlbas(ns) / ns->zone_size; =20 - /* Do a few more sanity checks of ZNS properties */ - if (!ns->num_zones) { - error_setg(errp, - "insufficient drive capacity, must be at least the size= " - "of one zone (%"PRIu64"B)", zone_size); - return -1; - } - return 0; } =20 @@ -256,11 +269,15 @@ static void nvme_ns_zoned_init_state(NvmeNamespace *n= s) } } =20 -static void nvme_ns_init_zoned(NvmeNamespace *ns) +static int nvme_ns_init_zoned(NvmeNamespace *ns, Error **errp) { NvmeIdNsZoned *id_ns_z; int i; =20 + if (nvme_ns_zoned_set_geometry(ns, errp)) { + return -1; + } + nvme_ns_zoned_init_state(ns); =20 id_ns_z =3D g_malloc0(sizeof(NvmeIdNsZoned)); @@ -299,6 +316,8 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) } =20 ns->id_ns_zoned =3D id_ns_z; + + return 0; } =20 static void nvme_clear_zone(NvmeNamespace *ns, NvmeZone *zone) @@ -407,10 +426,9 @@ int nvme_ns_setup(NvmeNamespace *ns, Error **errp) return -1; } if (ns->params.zoned) { - if (nvme_ns_zoned_check_calc_geometry(ns, errp) !=3D 0) { + if (nvme_ns_init_zoned(ns, errp)) { return -1; } - nvme_ns_init_zoned(ns); } =20 return 0; --=20 2.30.1