Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.4:Update
powerpc-utils.24248
0004-ofpathname-Add-support-for-NVMf-devices.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0004-ofpathname-Add-support-for-NVMf-devices.patch of Package powerpc-utils.24248
From 8a10a623a781ed3e56d0e7fecec7a035bb9e9755 Mon Sep 17 00:00:00 2001 From: Wen Xiong <wenxiong@linux.ibm.com> Date: Thu, 30 Sep 2021 08:53:14 -0500 Subject: [PATCH 4/4] ofpathname: Add support for NVMf devices References: jsc#SLE-18643 Upstream: accepted (expected in 1.3.10) Git-commit: 8a10a623a781ed3e56d0e7fecec7a035bb9e9755 To support boot/installtion over nvme-over-fc devices. This patch converts a NVMf device name between open firmware device path and logical device. Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com> Reviewed-by: Brian King <brking@linux.ibm.com> [tyreld: removed trailing whitespace] Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com> --- scripts/ofpathname | 209 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 3 deletions(-) diff --git a/scripts/ofpathname b/scripts/ofpathname index 310ee3e..b1d6b09 100755 --- a/scripts/ofpathname +++ b/scripts/ofpathname @@ -30,6 +30,7 @@ OFPATHNAME="ofpathname" VERSION="0.5" FIND=/usr/bin/find CAT=/bin/cat +LSPROP=/sbin/lsprop PSERIES_PLATFORM=$(dirname $0)/pseries_platform # Find out what platfrom we are running on. Hopefully this @@ -414,6 +415,21 @@ is_net_interface() fi } +# is_nvmf_device +# Check to see if this is a nvmf device +# +is_nvmf_device() +{ + local res + + res=`$FIND /sys/devices/virtual/nvme-fabrics -name $1 2>/dev/null` + if [[ ${#res} = 0 ]]; then + echo "no" + else + echo "yes" + fi +} + # # logical_to_ofpathname # Conversion for logical device name to an Open Firmware device path @@ -466,7 +482,14 @@ logical_to_ofpathname() logical_to_ofpathname exit ;; - nvme*) l2of_nvme ;; + nvme*) #check if the device is a nvmf device + local ctrl_name="${DEVICE%n[0-9]*}" + is_nvmf=$(is_nvmf_device $ctrl_name) + if [[ $is_nvmf = "yes" ]]; then + l2of_nvmf + else + l2of_nvme + fi ;; *) # check if the device is a network interface is_net=$(is_net_interface $DEVICE) if [[ $is_net = "yes" ]]; then @@ -709,6 +732,97 @@ l2of_nvme() OF_PATH="${OF_PATH}:${devpart}" } +# +# l2of_nvmf +# Conversion routine for logical => OF path of nvme devices +# +l2of_nvmf() +{ + + # OF path: <devspec>/nvme-of/controller@<target-wwpn>,<ctrl-id>: + # nqn=<tgt-subsystem-nqn> /namespace@<namespace-id>: + # <disk-label-args> + + # disk: nvmeX, nvmeXnY; not nvmeXnYpZ + local devdisk="${DEVICE%p[0-9]*}" + + # namespace id: Y in nvmeXnY, nvmeXnYpZ + local devnsid="${devdisk#nvme[0-9]*n}" + if [[ $devnsid = $devdisk ]]; then + devnsid='' # no namespace id + fi + + # partition number: Z in nvmeXnYpZ + local devpart="${DEVICE##*p}" + if [[ $devpart = $DEVICE ]]; then + devpart='' # no partition number + fi + + # controller name: nvmeX + local ctrl_name="${DEVICE%n[0-9]*}" + + # Get the device-tree device specification (devspec). + local dir + + for dir in `$FIND /sys/devices/virtual/nvme-fabrics -name "$ctrl_name"`; do + cd $dir + if [[ -f $PWD/address ]]; then + h_wwpn=`$CAT $PWD/address | cut -d "-" -f 5` + h_wwpn="${h_wwpn#0x}" + t_wwpn=`$CAT $PWD/address | cut -d "-" -f 3` + t_wwpn="${t_wwpn#0x}" + t_wwpn="${t_wwpn%,*}" + nqn=`$CAT $PWD/subsysnqn` + cntlid_dec=`$CAT $PWD/cntlid` + cntlid=`echo "obase=16; $cntlid_dec" |bc` + if [[ -n $h_wwpn ]]; then + for f in `$FIND /sys/devices -name "port_name"`; do + sys_wwpn=`$CAT $f 2>/dev/null` + sys_wwpn="${sys_wwpn#0x}" + if [[ $h_wwpn = $sys_wwpn ]] && \ + [[ "$f" == *"fc_host"* ]]; then + f=${f%/*} + goto_dir $f "device" 0 + link=`get_link "device"` + cd $link + goto_dir $PWD "devspec" + if [[ -e $PWD/devspec ]]; then + OF_PATH=`$CAT $PWD/devspec` + break + fi + fi + done + fi + fi + done + + if [[ -z $OF_PATH ]]; then + err $ERR_NO_OFPATH + fi + + OF_PATH="${OF_PATH}/nvme-of/controller@${t_wwpn},${cntlid}:nqn=${nqn}" + + # No namespace id (nY) specified. + if [[ -n $devnsid ]]; then + res=`$FIND /sys/devices/virtual -name ${devdisk}` + if [[ ${#res} = 0 ]]; then + OF_PATH="" + else + OF_PATH="$OF_PATH/namespace@$devnsid" + fi + fi + + # No partition (pZ) specified. + if [[ -n $devpart ]]; then + res=`$FIND /sys/devices/virtual -name ${devdisk}p${devpart}` + if [[ ${#res} = 0 ]]; then + OF_PATH="" + else + OF_PATH="${OF_PATH}:${devpart}" + fi + fi +} + # # int_to_scsilun # Conversion routine for SCSI HBTL LUN => SCSI LUN name @@ -1046,6 +1160,11 @@ ofpathname_to_logical() DEVTYPE="nvme" fi + if [[ "$DEVPATH" == *"nvme-of"* ]]; then + DEVTYPE="nvmf" + fi + + # Remove any possible cdrom data from DEVICE if [[ ${DEVICE##*,} = "\ppc\bootinfo.txt" || ${DEVICE##*,} = \ppc\bootinfo.txt ]]; then @@ -1060,7 +1179,8 @@ ofpathname_to_logical() # Remove any possible partition reference PART=$(expr "$DEVICE" : '.*\(:[0-9]\)') if [[ -n $PART ]] && \ - [[ $DEVTYPE != "nvme" ]]; then + [[ $DEVTYPE != "nvme" ]] && \ + [[ $DEVTYPE != "nvmf" ]]; then PART=${PART:1} DEVICE=${DEVICE%:[0-9]} fi @@ -1080,6 +1200,7 @@ ofpathname_to_logical() disk* ) of2l_ide ;; usb ) of2l_usb ;; nvme ) of2l_nvme ;; + nvmf ) of2l_nvmf ;; esac if [[ -z $LOGICAL_DEVNAME ]]; then @@ -1088,7 +1209,8 @@ ofpathname_to_logical() # Add any previously stripped partition reference if [[ -n $PART ]] && \ - [[ $DEVTYPE != "nvme" ]]; then + [[ $DEVTYPE != "nvme" ]] && \ + [[ $DEVTYPE != "nvmf" ]]; then LOGICAL_DEVNAME=$LOGICAL_DEVNAME$PART fi @@ -1689,6 +1811,87 @@ of2l_nvme() fi } +# of2l_nvmf +# Conversion routine for OF path => logical name for nvme devices +# +of2l_nvmf() +{ + # get namespace id and partition number + DEVICE=${DEVNAME##/*/} + if [[ "$DEVICE" == *"namespace"* ]]; then + local nsid_part=${DEVICE##*@} # <namespace-id>[:partition-number] + local nsid=${nsid_part%:*} # namespace id + fi + of_path_addr=`echo $DEVNAME | cut -d "/" -f 2,3` + ctrl_name=`echo $DEVNAME | cut -d "/" -f 5` + OF_WWPN=${ctrl_name%,*} + OF_WWPN=${OF_WWPN#*@} + of_cntlid=${ctrl_name%%:*} + of_cntlid=${of_cntlid#*,} + # set partition number only if ':' is present + case "${nsid_part}" in + *:*) + part=${nsid_part#*:} + ;; + esac + local dir + + for dir in `$FIND /sys/devices/virtual/nvme-fabrics -name "nvme[0-9]*"`; do + cd $dir + if [[ -f $PWD/address ]]; then + t_wwpn=`$CAT $PWD/address | cut -f 3 -d "-"` + t_wwpn="${t_wwpn#0x}" + t_wwpn="${t_wwpn%,*}" + h_wwpn=`$CAT $PWD/address | cut -f 5 -d "-"` + h_wwpn="${h_wwpn#0x}" + cntlid_dec=`$CAT $PWD/cntlid 2>/dev/null` + cntlid=`echo "obase=16; $cntlid_dec" |bc` + if [[ $t_wwpn = $OF_WWPN ]] && \ + [[ $cntlid == $of_cntlid ]]; then + for f in `$FIND /sys/devices -name "port_name"`; do + sys_wwpn=`$CAT $f 2>/dev/null` + sys_wwpn="${sys_wwpn#0x}" + if [[ $h_wwpn = $sys_wwpn ]] && \ + [[ "$f" == *"fc_host"* ]]; then + f=${f%/*} + goto_dir $f "device" 0 + link=`get_link "device"` + cd $link + goto_dir $PWD "devspec" + if [[ -e $PWD/devspec ]]; then + pci_addr=`$CAT $PWD/devspec` + pci_addr=${pci_addr#*/} + fi + if [[ $of_path_addr = $pci_addr ]]; then + LOGICAL_DEVNAME="${dir##*/}" + break + fi + fi + done + fi + fi + done + if [[ -n $LOGICAL_DEVNAME ]] && \ + [[ -n $nsid ]]; then + res=`$FIND /sys/devices/virtual -name ${LOGICAL_DEVNAME}n${nsid}` + if [[ ${#res} = 0 ]]; then + LOGICAL_DEVNAME='' + else + LOGICAL_DEVNAME="${LOGICAL_DEVNAME}n${nsid}" + fi + fi + + if [[ -n $LOGICAL_DEVNAME ]] && \ + [[ -n $part ]]; then + res=`$FIND /sys/devices/virtual -name ${LOGICAL_DEVNAME}p${part}` + if [[ ${#res} = 0 ]]; then + LOGICAL_DEVNAME='' + else + LOGICAL_DEVNAME="${LOGICAL_DEVNAME}p${part}" + fi + fi +} + # # Main # -- 2.34.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor