From: Ana Bobillo <anabobillo3@gmail.com>
To: Tom Rini <trini@konsulko.com>
Cc: u-boot@lists.u-boot-project.org, Simon Glass <sjg@chromium.org>,
Marek Vasut <marek.vasut+usb@mailbox.org>,
Bin Meng <bmeng.cn@gmail.com>,
Neil Armstrong <neil.armstrong@linaro.org>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Ilias Apalodimas <ilias.apalodimas@linaro.org>,
Alexey Charkov <alchark@flipper.net>,
Javier Martinez Canillas <javierm@redhat.com>
Subject: [PATCH v2 07/12] nvme: Skip a namespace with an unsupported LBA data size
Date: Wed, 28 Oct 2026 05:51:37 +0000 [thread overview]
Message-ID: <5bdc9bbe-e232-49c1-a1cb-d79d952ad6c8@gmail.com> (raw)
In-Reply-To: <01ba3f81-06b7-428b-9224-bd887c35e1c3@gmail.com>
From: Ana Bobillo <anabobillo3@gmail.com>
nvme_blk_probe() takes the LBA data size (log2 of the block size) of the
namespace's current LBA format as the device reports it, and shifts by
it: 1 << ns->lba_shift is undefined for a value of 31 or more, and
nvme_blk_rw() sizes each transfer with
1 << (dev->max_transfer_shift - ns->lba_shift), a negative shift for a
block larger than the maximum transfer size of the controller.
Check it, through a new nvme_lba_shift(), against the block sizes
blk_valid_blksz() accepts and the maximum transfer size. nvme_init()
skips a namespace with an unsupported LBA data size, as it skips an
inactive one, rather than create a block device for it that then fails
to probe, failing nvme_init() and leaving the namespaces it has already
probed on a controller that failed to probe. nvme_blk_probe() checks the
value it uses again.
Signed-off-by: Ana Bobillo <anabobillo3@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---
(no changes since v1)
drivers/nvme/nvme.c | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/nvme.c b/drivers/nvme/nvme.c
index c815a967137..3df9b531bfd 100644
--- a/drivers/nvme/nvme.c
+++ b/drivers/nvme/nvme.c
@@ -15,6 +15,7 @@
#include <time.h>
#include <dm/device-internal.h>
#include <linux/compat.h>
+#include <linux/log2.h>
#include "nvme.h"
#define NVME_Q_DEPTH 2
@@ -701,6 +702,26 @@ int nvme_scan_namespace(void)
return 0;
}
+/**
+ * nvme_lba_shift() - Get the LBA data size of a namespace
+ *
+ * @dev: NVMe controller
+ * @id: Identify Namespace data of the namespace
+ * Return: log2 of its block size, or -EINVAL if that size is not supported
+ */
+static int nvme_lba_shift(struct nvme_dev *dev, struct nvme_id_ns *id)
+{
+ u8 ds = id->lbaf[id->flbas & NVME_NS_FLBAS_LBA_MASK].ds;
+
+ if (ds < ilog2(DEFAULT_BLKSZ) || ds > ilog2(BLK_MAX_BLKSZ) ||
+ ds > dev->max_transfer_shift) {
+ log_err("Unsupported LBA data size 2^%d\n", ds);
+ return -EINVAL;
+ }
+
+ return ds;
+}
+
static int nvme_blk_probe(struct udevice *udev)
{
struct nvme_dev *ndev = dev_get_priv(udev->parent);
@@ -708,6 +729,7 @@ static int nvme_blk_probe(struct udevice *udev)
struct nvme_ns *ns = dev_get_priv(udev);
u8 flbas;
struct nvme_id_ns *id;
+ int ret;
id = memalign(ndev->page_size, sizeof(struct nvme_id_ns));
if (!id)
@@ -724,7 +746,12 @@ static int nvme_blk_probe(struct udevice *udev)
memcpy(&ns->eui64, &id->eui64, sizeof(id->eui64));
flbas = id->flbas & NVME_NS_FLBAS_LBA_MASK;
ns->flbas = flbas;
- ns->lba_shift = id->lbaf[flbas].ds;
+ ret = nvme_lba_shift(ndev, id);
+ if (ret < 0) {
+ free(id);
+ return ret;
+ }
+ ns->lba_shift = ret;
list_add(&ns->list, &ndev->namespaces);
desc->lba = le64_to_cpu(id->nsze);
@@ -899,6 +926,10 @@ int nvme_init(struct udevice *udev)
if (!id->nsze)
continue;
+ /* skip a namespace whose block size is not supported */
+ if (nvme_lba_shift(ndev, id) < 0)
+ continue;
+
/*
* Encode the namespace id to the device name so that
* we can extract it when doing the probe.
next prev parent reply other threads:[~2026-10-28 5:51 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 5:50 [PATCH v2 00/12] block, disk: Check block sizes and partition tables of devices Ana Bobillo
2026-10-28 5:50 ` [PATCH v2 01/12] treewide: Use is_power_of_2() from linux/log2.h Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` [PATCH v2 02/12] block: Add blk_valid_blksz() to check a block size Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` [PATCH v2 03/12] usb: storage: Fix the capacity faked when READ CAPACITY fails Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` [PATCH v2 04/12] usb: storage: Refuse a block size the block layer cannot use Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` [PATCH v2 05/12] scsi: " Ana Bobillo
2026-10-28 5:51 ` [PATCH v2 06/12] ide: Refuse an ATAPI block size atapi_read() cannot read Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` Ana Bobillo [this message]
2026-10-28 5:51 ` [PATCH v2 08/12] block: Refuse a device with an unsupported block size Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` [PATCH v2 09/12] disk: part_efi: Check the header and entry sizes of a GPT Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:51 ` [PATCH v2 10/12] disk: part_dos: Walk the extended partition tables in a bounded loop Ana Bobillo
2026-10-28 8:56 ` Simon Glass
2026-10-28 5:52 ` [PATCH v2 11/12] disk: part_dos: Make room for a three-digit partition number in the UUID Ana Bobillo
2026-10-28 5:52 ` [PATCH v2 12/12] efi_loader: Measure the GPT the partition driver uses Ana Bobillo
2026-10-28 8:57 ` Simon Glass
2026-10-28 9:32 ` Ana Bobillo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5bdc9bbe-e232-49c1-a1cb-d79d952ad6c8@gmail.com \
--to=anabobillo3@gmail.com \
--cc=alchark@flipper.net \
--cc=bmeng.cn@gmail.com \
--cc=ilias.apalodimas@linaro.org \
--cc=javierm@redhat.com \
--cc=marek.vasut+usb@mailbox.org \
--cc=neil.armstrong@linaro.org \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.u-boot-project.org \
--cc=xypron.glpk@gmx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.