Home Home > GIT Browse > SLE12-SP5-AZURE
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2019-08-21 15:44:07 +0200
committerHannes Reinecke <hare@suse.de>2019-08-21 15:44:07 +0200
commit1d6ec2f3466ecad54a3adb754d1810923e15f165 (patch)
tree9b720ee80b1ad691768dc32039fa92449014abe9
parentc4afaf487c20e7e0f034984c2f7fa80f90171b48 (diff)
nvme-multipath: fix ana log nsid lookup when nsid is not found
(bsc#1141554).
-rw-r--r--patches.fixes/nvme-multipath-fix-ana-log-nsid-lookup-when-nsid-is-.patch76
-rw-r--r--series.conf1
2 files changed, 77 insertions, 0 deletions
diff --git a/patches.fixes/nvme-multipath-fix-ana-log-nsid-lookup-when-nsid-is-.patch b/patches.fixes/nvme-multipath-fix-ana-log-nsid-lookup-when-nsid-is-.patch
new file mode 100644
index 0000000000..809c595174
--- /dev/null
+++ b/patches.fixes/nvme-multipath-fix-ana-log-nsid-lookup-when-nsid-is-.patch
@@ -0,0 +1,76 @@
+From: Anton Eidelman <anton@lightbitslabs.com>
+Date: Tue, 20 Aug 2019 16:00:27 -0700
+Subject: [PATCH] nvme-multipath: fix ana log nsid lookup when nsid is not found
+Patch-Mainline: submitted linux-nvme 2019/08/21
+References: bsc#1141554
+
+ANA log parsing invokes nvme_update_ana_state() per ANA group desc.
+This updates the state of namespaces with nsids in desc->nsids[].
+
+Both ctrl->namespaces list and desc->nsids[] array are sorted by nsid.
+Hence nvme_update_ana_state() performs a single walk over ctrl->namespaces:
+- if current namespace matches the current desc->nsids[n],
+ this namespace is updated, and n is incremented.
+- the process stops when it encounters the end of either
+ ctrl->namespaces end or desc->nsids[]
+
+In case desc->nsids[n] does not match any of ctrl->namespaces,
+the remaining nsids following desc->nsids[n] will not be updated.
+Such situation was considered abnormal and generated WARN_ON_ONCE.
+
+However ANA log MAY contain nsids not (yet) found in ctrl->namespaces.
+For example, lets consider the following scenario:
+- nvme0 exposes namespaces with nsids = [2, 3] to the host
+- a new namespace nsid = 1 is added dynamically
+- also, a ANA topology change is triggered
+- NS_CHANGED aen is generated and triggers scan_work
+- before scan_work discovers nsid=1 and creates a namespace, a NOTICE_ANA
+ aen was issues and ana_work receives ANA log with nsids=[1, 2, 3]
+
+Result: ana_work fails to update ANA state on existing namespaces [2, 3]
+
+Solution:
+Change the way nvme_update_ana_state() namespace list walk
+checks the current namespace against desc->nsids[n] as follows:
+a) ns->head->ns_id < desc->nsids[n]: keep walking ctrl->namespaces.
+b) ns->head->ns_id == desc->nsids[n]: match, update the namespace
+c) ns->head->ns_id >= desc->nsids[n]: skip to desc->nsids[n+1]
+
+This enables correct operation in the scenario described above.
+This also allows ANA log to contain nsids currently invisible
+to the host, i.e. inactive nsids.
+
+Signed-off-by: Anton Eidelman <anton@lightbitslabs.com>
+Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
+Signed-off-by: Hannes Reinecke <hare@suse.com>
+---
+ drivers/nvme/host/multipath.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
+index 961d2a00a216..70ae22569947 100644
+--- a/drivers/nvme/host/multipath.c
++++ b/drivers/nvme/host/multipath.c
+@@ -449,14 +449,16 @@ static int nvme_update_ana_state(struct nvme_ctrl *ctrl,
+
+ mutex_lock(&ctrl->namespaces_mutex);
+ list_for_each_entry(ns, &ctrl->namespaces, list) {
+- if (ns->head->ns_id != le32_to_cpu(desc->nsids[n]))
++ unsigned nsid = le32_to_cpu(desc->nsids[n]);
++
++ if (ns->head->ns_id < nsid)
+ continue;
+- nvme_update_ns_ana_state(desc, ns);
++ if (ns->head->ns_id == nsid)
++ nvme_update_ns_ana_state(desc, ns);
+ if (++n == nr_nsids)
+ break;
+ }
+ mutex_unlock(&ctrl->namespaces_mutex);
+- WARN_ON_ONCE(n < nr_nsids);
+ return 0;
+ }
+
+--
+2.16.4
+
diff --git a/series.conf b/series.conf
index 60081f7731..1d6ac8587b 100644
--- a/series.conf
+++ b/series.conf
@@ -23443,6 +23443,7 @@
patches.suse/nvme-flush-scan_work-when-resetting-controller.patch
patches.suse/nvme-skip-nvme_update_disk_info-if-the-controller-is.patch
patches.suse/nvme-Return-BLK_STS_TARGET-if-the-DNR-bit-is-set.patch
+ patches.fixes/nvme-multipath-fix-ana-log-nsid-lookup-when-nsid-is-.patch
patches.kabi/kabi-drop-LINUX_MIB_TCPWQUEUETOOBIG-snmp-counter.patch
patches.kabi/kabi-move-sysctl_tcp_min_snd_mss-to-preserve-struct-.patch
patches.suse/block-Fix-a-NULL-pointer-dereference-in-generic_make.patch