]> www.infradead.org Git - nvme.git/commitdiff
nvme-multipath: sysfs links may not be created for devices
authorHannes Reinecke <hare@kernel.org>
Tue, 15 Apr 2025 06:47:37 +0000 (08:47 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 16 Apr 2025 05:37:36 +0000 (07:37 +0200)
When rapidly rescanning for new namespaces nvme_mpath_add_sysfs_link() may be
called for a block device not added to sysfs. But NVME_NS_SYSFS_ATTR_LINK
had already been set, so when checking this device a second time we will fail
to create the link.

Fix this by exchanging the order of the block device check and the
NVME_NS_SYSFS_ATTR_LINK bit check.

Fixes: 4dbd2b2ebe4c ("nvme-multipath: Add visibility for round-robin io-policy")
Signed-off-by: Hannes Reinecke <hare@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>**
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/multipath.c

index 94152cf423f165aaba9cbb57f370ef4708365f1a..61b1d267ffdaa9a8faa85b83e6a1557998ea2896 100644 (file)
@@ -1050,6 +1050,13 @@ void nvme_mpath_add_sysfs_link(struct nvme_ns_head *head)
        srcu_idx = srcu_read_lock(&head->srcu);
 
        list_for_each_entry_rcu(ns, &head->list, siblings) {
+               /*
+                * Ensure that ns path disk node is already added otherwise we
+                * may get invalid kobj name for target
+                */
+               if (!test_bit(GD_ADDED, &ns->disk->state))
+                       continue;
+
                /*
                 * Avoid creating link if it already exists for the given path.
                 * When path ana state transitions from optimized to non-
@@ -1065,13 +1072,6 @@ void nvme_mpath_add_sysfs_link(struct nvme_ns_head *head)
                if (test_and_set_bit(NVME_NS_SYSFS_ATTR_LINK, &ns->flags))
                        continue;
 
-               /*
-                * Ensure that ns path disk node is already added otherwise we
-                * may get invalid kobj name for target
-                */
-               if (!test_bit(GD_ADDED, &ns->disk->state))
-                       continue;
-
                target = disk_to_dev(ns->disk);
                /*
                 * Create sysfs link from head gendisk kobject @kobj to the