[PATCH] nvme-cli: nvmf-autoconnect: Consolidate vendor-specific NVMe-oF udev rules into a single file
Martin Wilck
mwilck at suse.com
Mon Nov 9 02:09:47 PST 2026
On Mon, 2026-11-09 at 01:08 +0100, Xose Vazquez Perez wrote:
> Replace individual vendor udev rules (HPE, NetApp, and VAST Data)
> with
> a unified 80-nvmf-storage_arrays.rules file, leaving the rules
> untouched.
>
> This shifts execution to the 80 range for a logical sequence after
> base
> discovery and autoconnect, while simplifying maintenance and
> packaging.
>
> Cc: John Garry <john.garry at linux.dev>
> Cc: Nilay Shroff <nilay at linux.ibm.com>
> Cc: Guixin Liu <kanie at linux.alibaba.com>
> Cc: Wayne Berthiaume <Wayne.Berthiaume at dell.com>
> Cc: Vasuki Manikarnike <vasuki.manikarnike at hpe.com>
> Cc: Matthias Rudolph <Matthias.Rudolph at hitachivantara.com>
> Cc: Martin George <marting at netapp.com>
> Cc: NetApp RDAC team <ng-eseries-upstream-maintainers at netapp.com>
> Cc: Zou Ming <zouming.zouming at huawei.com>
> Cc: Li Xiaokeng <lixiaokeng at huawei.com>
> Cc: Randy Jennings <randyj at purestorage.com>
> Cc: Jyoti Rani <jrani at purestorage.com>
> Cc: Brian Bunker <brian at purestorage.com>
> Cc: Uday Shankar <ushankar at purestorage.com>
> Cc: Chaitanya Kulkarni <kch at nvidia.com>
> Cc: Sagi Grimberg <sagi at grimberg.me>
> Cc: Keith Busch <kbusch at kernel.org>
> Cc: Christoph Hellwig <hch at lst.de>
> Cc: Marco Patalano <mpatalan at redhat.com>
> Cc: Ewan D. Milne <emilne at redhat.com>
> Cc: John Meneghini <jmeneghi at redhat.com>
> Cc: Daniel Wagner <dwagner at suse.de>
> Cc: Daniel Wagner <wagi at monom.org>
> Cc: Hannes Reinecke <hare at suse.de>
> Cc: Martin Wilck <mwilck at suse.com>
> Cc: Benjamin Marzinski <bmarzins at redhat.com>
> Cc: Christophe Varoqui <christophe.varoqui at opensvc.com>
> Cc: BLOCK-ML <linux-block at vger.kernel.org>
> Cc: NVME-ML <linux-nvme at lists.infradead.org>
> Cc: SCSI-ML <linux-scsi at vger.kernel.org>
> Cc: DM_DEVEL-ML <dm-devel at lists.linux.dev>
> Signed-off-by: Xose Vazquez Perez <xose.vazquez at gmail.com>
Generally a good idea, but I think nvme-cli has a GitHub based
development workflow these days.
> ---
> BTW, there are two new I/O policies in development:
> https://lore.kernel.org/linux-nvme/20260815173502.1185929-1-nilay@linux.ibm.com/
> https://lore.kernel.org/linux-nvme/20261026111019.3724465-1-kanie@linux.alibaba.com/
> ---
> meson.build | 4 +---
> nvme.spec.in | 4 +---
> .../udev-rules/71-nvmf-hpe.rules.in | 5 ----
> .../udev-rules/71-nvmf-netapp.rules.in | 6 -----
> .../udev-rules/71-nvmf-vastdata.rules.in | 5 ----
> .../80-nvmf-storage_arrays.rules.in | 23
> +++++++++++++++++++
> 6 files changed, 25 insertions(+), 22 deletions(-)
> delete mode 100644 nvmf-autoconnect/udev-rules/71-nvmf-hpe.rules.in
> delete mode 100644 nvmf-autoconnect/udev-rules/71-nvmf-
> netapp.rules.in
> delete mode 100644 nvmf-autoconnect/udev-rules/71-nvmf-
> vastdata.rules.in
> create mode 100644 nvmf-autoconnect/udev-rules/80-nvmf-
> storage_arrays.rules.in
>
> diff --git a/meson.build b/meson.build
> index 90356ad94..00e9ad1be 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -894,9 +894,7 @@ if want_nvme
> udev_files = {
> '65-persistent-net-nbft.rules': 'nvmf',
> '70-nvmf-keys.rules': 'nvmf-autoconnect',
> - '71-nvmf-hpe.rules': 'nvmf',
> - '71-nvmf-netapp.rules': 'nvmf',
> - '71-nvmf-vastdata.rules': 'nvmf',
> + '80-nvmf-storage_arrays.rules': 'nvmf',
> }
> if want_nvmf_autoconnect
> udev_files += {'70-nvmf-autoconnect.rules': 'nvmf-
> autoconnect'}
> diff --git a/nvme.spec.in b/nvme.spec.in
> index 23d3d3268..a37c1a08d 100644
> --- a/nvme.spec.in
> +++ b/nvme.spec.in
> @@ -36,9 +36,7 @@ touch %{buildroot}@SYSCONFDIR@/nvme/hostid
> @UDEVRULESDIR@/65-persistent-net-nbft.rules
> @UDEVRULESDIR@/70-nvmf-autoconnect.rules
> @UDEVRULESDIR@/70-nvmf-keys.rules
> - at UDEVRULESDIR@/71-nvmf-hpe.rules
> - at UDEVRULESDIR@/71-nvmf-netapp.rules
> - at UDEVRULESDIR@/71-nvmf-vastdata.rules
> + at UDEVRULESDIR@/80-nvmf-storage_arrays.rules
> @DRACUTRULESDIR@/70-nvmf-autoconnect.conf
> @SYSTEMDDIR@/nvmf-connect at .service
> @SYSTEMDDIR@/nvmefc-boot-connections.service
> diff --git a/nvmf-autoconnect/udev-rules/71-nvmf-hpe.rules.in b/nvmf-
> autoconnect/udev-rules/71-nvmf-hpe.rules.in
> deleted file mode 100644
> index b050dd502..000000000
> --- a/nvmf-autoconnect/udev-rules/71-nvmf-hpe.rules.in
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -# Set appropriate iopolicy for HPE Alletra Storage MP
> -ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm",
> ATTR{model}=="HPE Alletra", ATTR{iopolicy}="round-robin"
> -
> -# Set ctrl_loss_tmo to -1 for HPE Alletra Storage MP NVMe/TCP
> -ACTION!="remove", SUBSYSTEM=="nvme", KERNEL=="nvme*",
> ATTR{transport}=="tcp", ATTR{model}=="HPE Alletra",
> ATTR{ctrl_loss_tmo}="-1"
> diff --git a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
> b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
> deleted file mode 100644
> index c76a3c434..000000000
> --- a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
> +++ /dev/null
> @@ -1,6 +0,0 @@
> -# Set appropriate iopolicy for NetApp ONTAP and NetApp E-Series
> -ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm",
> ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="queue-depth"
> -ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm",
> ATTR{model}=="NetApp E-Series", ATTR{iopolicy}="round-robin"
> -
> -# Set ctrl_loss_tmo to -1 for NetApp ONTAP NVMe/TCP
> -ACTION!="remove", SUBSYSTEM=="nvme", KERNEL=="nvme*",
> ATTR{transport}=="tcp", ATTR{model}=="NetApp ONTAP Controller",
> ATTR{ctrl_loss_tmo}="-1"
> diff --git a/nvmf-autoconnect/udev-rules/71-nvmf-vastdata.rules.in
> b/nvmf-autoconnect/udev-rules/71-nvmf-vastdata.rules.in
> deleted file mode 100644
> index dcd6146d8..000000000
> --- a/nvmf-autoconnect/udev-rules/71-nvmf-vastdata.rules.in
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -# Enable round-robin for Vast Data Block Subsystem
> -ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm",
> ATTR{model}=="VASTData", ATTR{iopolicy}="round-robin"
> -
> -# Set ctrl_loss_tmo to -1 for Vast Data Block Controller
> -ACTION!="remove", SUBSYSTEM=="nvme", KERNEL=="nvme*",
> ATTR{model}=="VASTData", ATTR{ctrl_loss_tmo}="-1"
> diff --git a/nvmf-autoconnect/udev-rules/80-nvmf-
> storage_arrays.rules.in b/nvmf-autoconnect/udev-rules/80-nvmf-
> storage_arrays.rules.in
> new file mode 100644
> index 000000000..1cd6c0c0b
> --- /dev/null
> +++ b/nvmf-autoconnect/udev-rules/80-nvmf-storage_arrays.rules.in
> @@ -0,0 +1,23 @@
> +##### Storage arrays
> +
> +#### Set iopolicy for NVMe-oF
> +### iopolicy: numa (default), round-robin (>=5.1), or queue-depth
> (>=6.11)
> +
> +## HPE
> +# Alletra 9000 / Alletra Storage MP / GreenLake Block Storage MP
> +ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm",
> ATTR{model}=="HPE Alletra", ATTR{iopolicy}="round-robin"
> +ACTION!="remove", SUBSYSTEM=="nvme", KERNEL=="nvme*",
> ATTR{transport}=="tcp", ATTR{model}=="HPE Alletra",
> ATTR{ctrl_loss_tmo}="-1"
I'm not a fan of repeated lengthy match expressions in udev rules.
Can we improve the readability by using GOTOs and LABELS?
SUBSYSTEM!="nvme*", GOTO="nvmf_end"
ATTR{model}=="HPE Alletra", GOTO="Alletra"
ATTR{model}=="NetApp ONTAP Controller", GOTO="Ontap"
...
GOTO="nvmf_end"
LABEL="Alletra"
ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", \
ATTR{iopolicy}="queue-depth"
ACTION!="remove", SUBSYSTEM=="nvme", KERNEL=="nvme*", \
ATTR{transport}=="tcp", ATTR{ctrl_loss_tmo}="-1"
GOTO="nvmf_end"
LABEL="Ontap"
...
LABEL="nvmf_end"
--
Dr. Martin Wilck <mwilck at suse.com>
SUSE Software Solutions Germany GmbH, Frankenstr. 146, 90461 Nürnberg,
Germany
Geschäftsführer: Stefan Gaiser, Jochen Jaser, Abhinav Puri (HRB
36809,AG Nürnberg)
More information about the Linux-nvme
mailing list