Blob Blame History Raw
From 21c860888425762468d339950518ab8b0940ecea Mon Sep 17 00:00:00 2001
From: Tyrel Datwyler <tyreld@linux.ibm.com>
Date: Mon, 5 Oct 2020 13:03:45 -0700
Subject: [PATCH] ofpathname: Use NVMe controller physical nsid

Linux creates logical block devices of the the form nvmeXnYpZ such that X = the
controller, Y = namepsace, and Z = partition. For example:

/dev/nvme0n1p1

The Linux namespace numbering scheme for namespaces always starts at 1 and
increases monotonically regardless of the actual numbering scheme of the
namespaces as seen by the  physical NVMe controller. Accordingly, the Open
firmware path binding utilizes the namespace id as seen by the controller and
not the necessarily the one given in the logical block device name.

As such we need to use the "nsid" attribute in the sysfs entry for the logical
device to properly map back and forth from OP pathnames.

Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
 scripts/ofpathname | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/scripts/ofpathname b/scripts/ofpathname
index 2ceae25..41b8c5c 100755
--- a/scripts/ofpathname
+++ b/scripts/ofpathname
@@ -659,6 +659,11 @@ l2of_nvme()
         devspec=`$CAT $PWD/device/devspec | tr -d '\000'`
         if [[ -n $devspec ]]; then
             found=1
+            if [[ -n $devnsid ]]; then
+                # Linux logical nsid might not match nvme controller nsid
+                goto_dir $dir "nsid"
+                devnsid=`$CAT $PWD/nsid | tr -d '\000'`
+            fi
             break
         fi
     done
@@ -1609,16 +1614,9 @@ of2l_nvme()
     local dir
     local link
 
-    for dir in `$FIND /sys/block -name "nvme*n$nsid"`; do
+    for dir in `$FIND /sys/class/nvme -name "nvme[0-9]*"`; do
         cd $dir
 
-        link=`get_link "device"` # points to nvme[0-9]+ (non-namespace)
-        if [[ -n $link ]]; then
-            cd $link
-        else
-            continue
-        fi
-
         link=`get_link "device"` # points to pci address dir
         if [[ -n $link ]]; then
             cd $link
@@ -1635,6 +1633,16 @@ of2l_nvme()
         fi
     done
 
+    for dir in `$FIND /sys/block -name "${LOGICAL_DEVNAME}n[0-9]*"`; do
+	    cd $dir
+
+	    local devnsid=`$CAT ./nsid 2>/dev/null`
+	    if [[ $devnsid = $nsid ]]; then
+		    LOGICAL_DEVNAME="${dir##*/}"
+		    break
+	    fi
+    done
+
     if [[ -n $LOGICAL_DEVNAME ]] \
     && [[ -n $part ]]; then
 
-- 
1.8.3.1