nvme: avoid creating multipath sysfs group under namespace path devices
authorNilay Shroff <nilay@linux.ibm.com>
Wed, 21 May 2025 12:41:23 +0000 (18:11 +0530)
committerChristoph Hellwig <hch@lst.de>
Wed, 21 May 2025 12:55:46 +0000 (14:55 +0200)
Commit 4dbd2b2ebe4c ("nvme-multipath: Add visibility for round-robin
io-policy") introduced the creation of the multipath sysfs group under
the NVMe head gendisk device node. However, it also inadvertently added
the same sysfs group under each namespace path device which head node
refers to and that is incorrect.

The multipath sysfs group should only be exposed through the namespace
head gendisk node. This is sufficient, as the head device already
provides symbolic links to the individual namespace paths it manages.

This patch fixes the issue by preventing the creation of the multipath
sysfs group under namespace path devices, ensuring it only appears under
the head disk node.

Fixes: 4dbd2b2ebe4c ("nvme-multipath: Add visibility for round-robin io-policy")
Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/sysfs.c

index 6d31226..a5bc3bb 100644 (file)
@@ -306,13 +306,41 @@ static const struct attribute_group nvme_ns_attr_group = {
 };
 
 #ifdef CONFIG_NVME_MULTIPATH
+/*
+ * NOTE: The dummy attribute does not appear in sysfs. It exists solely to allow
+ * control over the visibility of the multipath sysfs node. Without at least one
+ * attribute defined in nvme_ns_mpath_attrs[], the sysfs implementation does not
+ * invoke the multipath_sysfs_group_visible() method. As a result, we would not
+ * be able to control the visibility of the multipath sysfs node.
+ */
+static struct attribute dummy_attr = {
+       .name = "dummy",
+};
+
 static struct attribute *nvme_ns_mpath_attrs[] = {
+       &dummy_attr,
        NULL,
 };
 
+static bool multipath_sysfs_group_visible(struct kobject *kobj)
+{
+       struct device *dev = container_of(kobj, struct device, kobj);
+
+       return nvme_disk_is_ns_head(dev_to_disk(dev));
+}
+
+static bool multipath_sysfs_attr_visible(struct kobject *kobj,
+               struct attribute *attr, int n)
+{
+       return false;
+}
+
+DEFINE_SYSFS_GROUP_VISIBLE(multipath_sysfs)
+
 const struct attribute_group nvme_ns_mpath_attr_group = {
        .name           = "multipath",
        .attrs          = nvme_ns_mpath_attrs,
+       .is_visible     = SYSFS_GROUP_VISIBLE(multipath_sysfs),
 };
 #endif