]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
nvme-multipath: require exact iopolicy names for module parameter
authorliyouhong <liyouhong@kylinos.cn>
Fri, 29 May 2026 08:51:43 +0000 (16:51 +0800)
committerKeith Busch <kbusch@kernel.org>
Tue, 2 Jun 2026 10:16:26 +0000 (03:16 -0700)
The iopolicy module parameter uses strncmp prefix matching, so values
like "numax" are accepted as "numa".  The per-subsystem sysfs attribute
already requires an exact match via sysfs_streq().  Parse both through
a shared helper so invalid values are rejected consistently.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: liyouhong <liyouhong@kylinos.cn>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/multipath.c

index e00e2842df307094c84a44811e4f54f73ec9dd4f..d6c51f59ff25869fe10b9e3f4d58a0a3c00f3335 100644 (file)
@@ -73,19 +73,29 @@ static const char *nvme_iopolicy_names[] = {
 
 static int iopolicy = NVME_IOPOLICY_NUMA;
 
+static int nvme_iopolicy_parse(const char *str)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(nvme_iopolicy_names); i++) {
+               if (sysfs_streq(str, nvme_iopolicy_names[i]))
+                       return i;
+       }
+       return -EINVAL;
+}
+
 static int nvme_set_iopolicy(const char *val, const struct kernel_param *kp)
 {
+       int policy;
+
        if (!val)
                return -EINVAL;
-       if (!strncmp(val, "numa", 4))
-               iopolicy = NVME_IOPOLICY_NUMA;
-       else if (!strncmp(val, "round-robin", 11))
-               iopolicy = NVME_IOPOLICY_RR;
-       else if (!strncmp(val, "queue-depth", 11))
-               iopolicy = NVME_IOPOLICY_QD;
-       else
-               return -EINVAL;
 
+       policy = nvme_iopolicy_parse(val);
+       if (policy < 0)
+               return policy;
+
+       iopolicy = policy;
        return 0;
 }
 
@@ -1039,16 +1049,14 @@ static ssize_t nvme_subsys_iopolicy_store(struct device *dev,
 {
        struct nvme_subsystem *subsys =
                container_of(dev, struct nvme_subsystem, dev);
-       int i;
+       int policy;
 
-       for (i = 0; i < ARRAY_SIZE(nvme_iopolicy_names); i++) {
-               if (sysfs_streq(buf, nvme_iopolicy_names[i])) {
-                       nvme_subsys_iopolicy_update(subsys, i);
-                       return count;
-               }
-       }
+       policy = nvme_iopolicy_parse(buf);
+       if (policy < 0)
+               return policy;
 
-       return -EINVAL;
+       nvme_subsys_iopolicy_update(subsys, policy);
+       return count;
 }
 SUBSYS_ATTR_RW(iopolicy, S_IRUGO | S_IWUSR,
                      nvme_subsys_iopolicy_show, nvme_subsys_iopolicy_store);