[PATCH] nvme-multipath: expose path_state via sysfs
Guixin Liu
kanie at linux.alibaba.com
Wed Jun 17 05:15:43 PDT 2026
Add a read-only "path_state" sysfs attribute to each NVMe path namespace
device (/sys/class/nvme/nvmeX/nvmeXcYnZ/path_state) that exposes whether
the path is currently enabled or disabled.
The attribute reflects the result of nvme_path_is_disabled(), showing
"disabled" when the controller is not live/deleting, the namespace has
an ANA state change pending, or the namespace is not ready. Otherwise
it shows "enabled".
This gives userspace visibility into the multipath path selection state
without requiring users to piece together controller state and namespace
flags manually.
Signed-off-by: Guixin Liu <kanie at linux.alibaba.com>
---
drivers/nvme/host/multipath.c | 10 ++++++++++
drivers/nvme/host/nvme.h | 1 +
drivers/nvme/host/sysfs.c | 4 +++-
3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 81fff2f20d23..65bd3dd188ee 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -1210,6 +1210,16 @@ static ssize_t in_flight_bytes_show(struct device *dev,
}
DEVICE_ATTR_RO(in_flight_bytes);
+static ssize_t path_state_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct nvme_ns *ns = nvme_get_ns_from_dev(dev);
+
+ return sysfs_emit(buf, "%s\n",
+ nvme_path_is_disabled(ns) ? "disabled" : "enabled");
+}
+DEVICE_ATTR_RO(path_state);
+
static ssize_t relative_throughput_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 2b2627e0d3ce..bb9b8cdf973a 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -1066,6 +1066,7 @@ extern struct device_attribute dev_attr_queue_depth;
extern struct device_attribute dev_attr_in_flight_bytes;
extern struct device_attribute dev_attr_relative_throughput;
extern struct device_attribute dev_attr_numa_nodes;
+extern struct device_attribute dev_attr_path_state;
extern struct device_attribute dev_attr_delayed_removal_secs;
extern struct device_attribute subsys_attr_iopolicy;
diff --git a/drivers/nvme/host/sysfs.c b/drivers/nvme/host/sysfs.c
index 6309af224c93..5110a3bf5279 100644
--- a/drivers/nvme/host/sysfs.c
+++ b/drivers/nvme/host/sysfs.c
@@ -262,6 +262,7 @@ static struct attribute *nvme_ns_attrs[] = {
&dev_attr_in_flight_bytes.attr,
&dev_attr_relative_throughput.attr,
&dev_attr_numa_nodes.attr,
+ &dev_attr_path_state.attr,
&dev_attr_delayed_removal_secs.attr,
#endif
&dev_attr_io_passthru_err_log_enabled.attr,
@@ -296,7 +297,8 @@ static umode_t nvme_ns_attrs_are_visible(struct kobject *kobj,
return 0;
}
if (a == &dev_attr_queue_depth.attr || a == &dev_attr_in_flight_bytes.attr ||
- a == &dev_attr_relative_throughput.attr || a == &dev_attr_numa_nodes.attr) {
+ a == &dev_attr_relative_throughput.attr || a == &dev_attr_numa_nodes.attr ||
+ a == &dev_attr_path_state.attr) {
if (nvme_disk_is_ns_head(dev_to_disk(dev)))
return 0;
}
--
2.43.7
More information about the Linux-nvme
mailing list