425 lines
13 KiB
Diff
425 lines
13 KiB
Diff
|
|
||
|
Fixes up lsdevinfo to return the data needed by the HMC to fully support
|
||
|
end to end virtual device view enablement. Adds support for the -R parameter,
|
||
|
which is required. Also adds support for the uniquetype field.
|
||
|
|
||
|
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
|
||
|
---
|
||
|
|
||
|
scripts/lsdevinfo | 258 ++++++++++++++++++++++++++++++++++++++++++++++++------
|
||
|
1 file changed, 232 insertions(+), 26 deletions(-)
|
||
|
|
||
|
Index: powerpc-utils-1.2.2/scripts/lsdevinfo
|
||
|
===================================================================
|
||
|
--- powerpc-utils-1.2.2.orig/scripts/lsdevinfo 2009-10-22 14:00:13.000000000 -0500
|
||
|
+++ powerpc-utils-1.2.2/scripts/lsdevinfo 2010-05-17 15:37:15.957878294 -0500
|
||
|
@@ -20,6 +20,7 @@
|
||
|
LS="/bin/ls"
|
||
|
GREP="/bin/grep"
|
||
|
SED="/bin/sed"
|
||
|
+TR="/usr/bin/tr"
|
||
|
|
||
|
# Usage statemnet
|
||
|
usage()
|
||
|
@@ -31,6 +32,7 @@
|
||
|
echo " -q criteria Specifies a criteria to select which devices are"
|
||
|
echo " to be displayed."
|
||
|
echo " -F format Specifies the set of attributes to be displayed."
|
||
|
+ echo " -R Recursively display children of selected devices"
|
||
|
echo " -c Display output as a comma separated list for"
|
||
|
echo " each device."
|
||
|
echo " -V, --version Display version information and exit"
|
||
|
@@ -102,16 +104,21 @@
|
||
|
# default: CR separated list
|
||
|
comma_sep=0
|
||
|
|
||
|
+# default: non recursive
|
||
|
+recursive=0
|
||
|
+
|
||
|
# default: display all devices
|
||
|
criteria=""
|
||
|
|
||
|
# default: display all attributes
|
||
|
format=""
|
||
|
|
||
|
-while getopts "cq:F:Vh" flag ; do
|
||
|
+while getopts "cRq:F:Vh" flag ; do
|
||
|
case "$flag" in
|
||
|
c) comma_sep=1;;
|
||
|
|
||
|
+ R) recursive=1;;
|
||
|
+
|
||
|
q) criteria=$OPTARG;;
|
||
|
|
||
|
F) format=$OPTARG;;
|
||
|
@@ -141,13 +148,13 @@
|
||
|
separator="\n"
|
||
|
begin="\t"
|
||
|
dev_end="\n\n"
|
||
|
- path_begin="\n\npath:\n\tparent=\"vio\""
|
||
|
+ path_begin="\n\npath:\n\tparent="
|
||
|
path_end=""
|
||
|
else
|
||
|
dev_begin=""
|
||
|
separator=","
|
||
|
dev_end="\n"
|
||
|
- path_begin=",path=(parent=\"vio\","
|
||
|
+ path_begin=",path=(parent="
|
||
|
path_end=")"
|
||
|
fi
|
||
|
|
||
|
@@ -156,9 +163,17 @@
|
||
|
for dev in $($LS -d /proc/device-tree/vdevice/l-lan* 2> /dev/null); do
|
||
|
# use ofpathname to get the device name (i.e. eth0)
|
||
|
name=$($OFPATHNAME -l $(echo $dev | $SED -e "s/\/proc\/device-tree//"))
|
||
|
+ connection=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/l-lan@//")
|
||
|
+ parent="vio"
|
||
|
|
||
|
# get the physical location
|
||
|
physloc=$($CAT $dev/ibm,loc-code)
|
||
|
+ uniquetype="adapter/vdevice/IBM,l-lan"
|
||
|
+ class="adapter"
|
||
|
+ subclass="vdevice"
|
||
|
+ type="IBM,l-lan"
|
||
|
+ prefix="eth"
|
||
|
+ driver="ibmveth"
|
||
|
|
||
|
show=1
|
||
|
# if there is a criteria in the command line, check if this device matches
|
||
|
@@ -166,6 +181,12 @@
|
||
|
show=0
|
||
|
check_criteria "name"
|
||
|
check_criteria "physloc"
|
||
|
+ check_criteria "uniquetype"
|
||
|
+ check_criteria "class"
|
||
|
+ check_criteria "subclass"
|
||
|
+ check_criteria "type"
|
||
|
+ check_criteria "prefix"
|
||
|
+ check_criteria "driver"
|
||
|
fi
|
||
|
|
||
|
# print the info only if the device matches the criteria
|
||
|
@@ -173,12 +194,20 @@
|
||
|
# the name attribute is always printed
|
||
|
echo -ne $dev_begin$begin"name="\"$name\"
|
||
|
|
||
|
+ print_attr "uniquetype"
|
||
|
+ print_attr "class"
|
||
|
+ print_attr "subclass"
|
||
|
+ print_attr "type"
|
||
|
+ print_attr "prefix"
|
||
|
+ print_attr "driver"
|
||
|
+
|
||
|
# if there is no format in the command line or it contains "path", then
|
||
|
# print the path. Doesn't use print_attr because all of the fields in
|
||
|
# the path attribute should be printed.
|
||
|
if [[ $format == "" || $format =~ "path" ]]; then
|
||
|
- echo -ne $path_begin
|
||
|
- echo -ne $separator$begin"physloc="$physloc
|
||
|
+ echo -ne $path_begin\"$parent\"
|
||
|
+ echo -ne $separator$begin"physloc="\"$physloc\"
|
||
|
+ echo -ne $separator$begin"connection="\"$connection\"
|
||
|
echo -ne $path_end
|
||
|
fi
|
||
|
# done with this device
|
||
|
@@ -191,18 +220,92 @@
|
||
|
for dev in $($LS -d /proc/device-tree/vdevice/v-scsi* 2> /dev/null) ; do
|
||
|
# pull the physical location
|
||
|
physloc=$(cat $dev/ibm,loc-code)
|
||
|
+ hostphysloc=$physloc
|
||
|
+ connection=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/v-scsi@//")
|
||
|
|
||
|
# find the slot so it can be used in sysfs
|
||
|
slot=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/v-scsi@//")
|
||
|
|
||
|
# there is only one host per device, assign it to the path's name
|
||
|
for host in $($LS -d /sys/devices/vio/$slot/host*) ; do
|
||
|
- parent=$(echo $host/scsi_host* | $SED -e "s/.*://")
|
||
|
+ parent=$(echo $host | $SED -e "s/.*\///")
|
||
|
+ name=$parent
|
||
|
+
|
||
|
+ uniquetype="adapter/vdevice/IBM,v-scsi"
|
||
|
+ class="adapter"
|
||
|
+ subclass="vdevice"
|
||
|
+ type="IBM,v-scsi"
|
||
|
+ prefix="host"
|
||
|
+ driver="ibmvscsic"
|
||
|
+
|
||
|
+ host=$($LS -d /sys/devices/vio/$slot/host*/)
|
||
|
+ if [[ -d $host/scsi_host ]]; then
|
||
|
+ scsihost=$($LS -d $host/scsi_host/host*/)
|
||
|
+ else
|
||
|
+ scsihost=$($LS -d $host/scsi_host*/)
|
||
|
+ fi
|
||
|
+
|
||
|
+ if [[ $(cat $scsihost/state) == "running" ]] ; then
|
||
|
+ status=1
|
||
|
+ else
|
||
|
+ status=0
|
||
|
+ fi
|
||
|
+
|
||
|
+ show=1
|
||
|
+ # if there is a criteria in the command line, check if this
|
||
|
+ # device matches
|
||
|
+ if [[ $criteria != "" ]] ; then
|
||
|
+ show=0
|
||
|
+ check_criteria "name"
|
||
|
+ check_criteria "physloc"
|
||
|
+ check_criteria "status"
|
||
|
+ check_criteria "uniquetype"
|
||
|
+ check_criteria "class"
|
||
|
+ check_criteria "subclass"
|
||
|
+ check_criteria "type"
|
||
|
+ check_criteria "prefix"
|
||
|
+ check_criteria "driver"
|
||
|
+ fi
|
||
|
+
|
||
|
+ if [[ $show -ne 0 ]]; then
|
||
|
+ # the name attribute is always printed
|
||
|
+ echo -ne $dev_begin$begin"name="\"$name\"
|
||
|
+
|
||
|
+ print_attr "uniquetype"
|
||
|
+ print_attr "class"
|
||
|
+ print_attr "subclass"
|
||
|
+ print_attr "type"
|
||
|
+ print_attr "prefix"
|
||
|
+ print_attr "driver"
|
||
|
+ print_attr "status"
|
||
|
+
|
||
|
+ # print the path, see note for ibmveth above
|
||
|
+ if [[ $format == "" || $format =~ "path" ]]; then
|
||
|
+ echo -ne $path_begin"\"vio\""
|
||
|
+ echo -ne $separator$begin"connection="\"$connection\"
|
||
|
+ echo -ne $separator$begin"physloc="\"$physloc\"
|
||
|
+ echo -ne $path_end
|
||
|
+ fi
|
||
|
+ # done with this target
|
||
|
+ echo -ne $dev_end
|
||
|
+ fi
|
||
|
|
||
|
# loop through the targets for this host.
|
||
|
for t in $($LS -d $host/target*); do
|
||
|
- target=$(echo $($LS -d $t/$($LS $t | $GREP -v uevent)))
|
||
|
- name=$(echo $($LS -d $target/block*) | $SED -e "s/.*://")
|
||
|
+ target=$(echo $($LS -d $t/$($LS $t | $GREP -v uevent | $GREP -v power | $GREP -v subsystem)))
|
||
|
+ if [[ ! -d $target/block ]]; then
|
||
|
+ name=$(echo $($LS -d $target/block*) | $SED -e "s/.*://")
|
||
|
+ else
|
||
|
+ name=$($LS $target/block)
|
||
|
+ fi
|
||
|
+
|
||
|
+ conn=$($OFPATHNAME /dev/$name 2> /dev/null | $SED -e "s/.*disk@//")
|
||
|
+ connection=${conn:0:12}
|
||
|
+ uniquetype="disk/vscsi/vdisk"
|
||
|
+ class="disk"
|
||
|
+ subclass="vscsi"
|
||
|
+ type="vdisk"
|
||
|
+ physloc=$hostphysloc"-L"$conn
|
||
|
|
||
|
if [[ $(cat $target/state) == "running" ]] ; then
|
||
|
status=1
|
||
|
@@ -210,15 +313,24 @@
|
||
|
status=0
|
||
|
fi
|
||
|
|
||
|
- show=1
|
||
|
- # if there is a criteria in the command line, check if this
|
||
|
- # device matches
|
||
|
- if [[ $criteria != "" ]] ; then
|
||
|
+ # if there is a criteria in the command line, we are recursive and
|
||
|
+ # the parent passed criteria, show the device
|
||
|
+ if [[ $criteria != "" && $show -eq 1 && $recursive -eq 1 ]]; then
|
||
|
+ show=1
|
||
|
+ elif [[ $criteria != "" ]] ; then
|
||
|
+ # if there is a criteria in the command line, check if this
|
||
|
+ # device matches
|
||
|
show=0
|
||
|
check_criteria "name"
|
||
|
- check_criteria "physloc"
|
||
|
check_criteria "status"
|
||
|
+ check_criteria "physloc"
|
||
|
check_criteria "parent"
|
||
|
+ check_criteria "uniquetype"
|
||
|
+ check_criteria "class"
|
||
|
+ check_criteria "subclass"
|
||
|
+ check_criteria "type"
|
||
|
+ else
|
||
|
+ show=1
|
||
|
fi
|
||
|
|
||
|
# print the info only if the device matches the criteria
|
||
|
@@ -226,14 +338,20 @@
|
||
|
# the name attribute is always printed
|
||
|
echo -ne $dev_begin$begin"name="\"$name\"
|
||
|
|
||
|
+ print_attr "uniquetype"
|
||
|
+ print_attr "class"
|
||
|
+ print_attr "subclass"
|
||
|
+ print_attr "type"
|
||
|
print_attr "status"
|
||
|
|
||
|
# print the path, see note for ibmveth above
|
||
|
if [[ $format == "" || $format =~ "path" ]]; then
|
||
|
- echo -ne $path_begin
|
||
|
- echo -ne $separator$begin"name="\"$parent\"
|
||
|
- echo -ne $separator$begin"physloc="$physloc
|
||
|
- echo $path_end
|
||
|
+ echo -ne $path_begin\"$parent\"
|
||
|
+ echo -ne $separator$begin"connection="\"$connection\"
|
||
|
+ echo -ne $separator$begin"physloc="\"$physloc\"
|
||
|
+ echo -ne $separator$begin"path_id="\""0"\"
|
||
|
+ echo -ne $separator$begin"path_status="\"$status\"
|
||
|
+ echo -ne $path_end
|
||
|
fi
|
||
|
# done with this target
|
||
|
echo -ne $dev_end
|
||
|
@@ -247,13 +365,75 @@
|
||
|
for dev in $($LS -d /proc/device-tree/vdevice/vfc-client* 2> /dev/null) ; do
|
||
|
# pull the physical location
|
||
|
physloc=$(cat $dev/ibm,loc-code)
|
||
|
+ connection=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/vfc-client@//")
|
||
|
+ hostphysloc=$physloc
|
||
|
|
||
|
# find the slot so it can be used in sysfs
|
||
|
slot=$(echo $dev | $SED -e "s/\/proc\/device-tree\/vdevice\/vfc-client@//")
|
||
|
|
||
|
# there is only one host per device, assign it to the path's name
|
||
|
for host in $($LS -d /sys/devices/vio/$slot/host*) ; do
|
||
|
- parent=$(echo $host/scsi_host* | $SED -e "s/.*://")
|
||
|
+ parent=$(echo $host | $SED -e "s/.*\///")
|
||
|
+ name=$parent
|
||
|
+
|
||
|
+ uniquetype="adapter/vdevice/IBM,vfc-client"
|
||
|
+ class="adapter"
|
||
|
+ subclass="vdevice"
|
||
|
+ type="IBM,vfc-client"
|
||
|
+ prefix="host"
|
||
|
+ driver="ibmvfc"
|
||
|
+
|
||
|
+ host=$($LS -d /sys/devices/vio/$slot/host*/)
|
||
|
+ if [[ -d $host/scsi_host ]]; then
|
||
|
+ scsihost=$($LS -d $host/scsi_host/host*/)
|
||
|
+ else
|
||
|
+ scsihost=$($LS -d $host/scsi_host*/)
|
||
|
+ fi
|
||
|
+
|
||
|
+ if [[ $(cat $scsihost/state) == "running" ]] ; then
|
||
|
+ status=1
|
||
|
+ else
|
||
|
+ status=0
|
||
|
+ fi
|
||
|
+
|
||
|
+ show=1
|
||
|
+ # if there is a criteria in the command line, check if this
|
||
|
+ # device matches
|
||
|
+ if [[ $criteria != "" ]] ; then
|
||
|
+ show=0
|
||
|
+ check_criteria "name"
|
||
|
+ check_criteria "physloc"
|
||
|
+ check_criteria "status"
|
||
|
+ check_criteria "uniquetype"
|
||
|
+ check_criteria "class"
|
||
|
+ check_criteria "subclass"
|
||
|
+ check_criteria "type"
|
||
|
+ check_criteria "prefix"
|
||
|
+ check_criteria "driver"
|
||
|
+ fi
|
||
|
+
|
||
|
+ if [[ $show -ne 0 ]]; then
|
||
|
+ # the name attribute is always printed
|
||
|
+ echo -ne $dev_begin$begin"name="\"$name\"
|
||
|
+
|
||
|
+ print_attr "uniquetype"
|
||
|
+ print_attr "class"
|
||
|
+ print_attr "subclass"
|
||
|
+ print_attr "type"
|
||
|
+ print_attr "prefix"
|
||
|
+ print_attr "driver"
|
||
|
+ print_attr "status"
|
||
|
+
|
||
|
+ # print the path, see note for ibmveth above
|
||
|
+ if [[ $format == "" || $format =~ "path" ]]; then
|
||
|
+ echo -ne $path_begin"\"vio\""
|
||
|
+ echo -ne $separator$begin"connection="\"$connection\"
|
||
|
+ echo -ne $separator$begin"physloc="\"$physloc\"
|
||
|
+ echo -ne $path_end
|
||
|
+ fi
|
||
|
+ # done with this target
|
||
|
+ echo -ne $dev_end
|
||
|
+ fi
|
||
|
|
||
|
# As opposed to ibmvscsi, there are multiple rports in each host
|
||
|
for rport in $($LS -d $host/rport*); do
|
||
|
@@ -262,7 +442,18 @@
|
||
|
# the targets
|
||
|
for t in $($LS -d $rport/target*); do
|
||
|
for target in $($LS $t | $GREP "[0-9]*:[0-9]*:[0-9]*:[0-9]*"); do
|
||
|
- name=$(echo $($LS -d $t/$target/block*) | $SED -e "s/.*://")
|
||
|
+ if [[ ! -d $t/$target/block ]]; then
|
||
|
+ name=$(echo $($LS -d $t/$target/block*) | $SED -e "s/.*://")
|
||
|
+ else
|
||
|
+ name=$($LS $t/$target/block)
|
||
|
+ fi
|
||
|
+
|
||
|
+ connection=$($OFPATHNAME /dev/$name 2> /dev/null | $SED -e "s/.*disk@//")
|
||
|
+ physloc=$hostphysloc"-W"$(echo $connection | $TR "[:lower:]" "[:upper:]" | $SED -e "s/,/-L/")
|
||
|
+ uniquetype="disk/fcp/disk"
|
||
|
+ class="disk"
|
||
|
+ subclass="fcp"
|
||
|
+ type="disk"
|
||
|
|
||
|
if [[ $(cat $t/$target/state) == "running" ]] ; then
|
||
|
status=1
|
||
|
@@ -270,15 +461,24 @@
|
||
|
status=0
|
||
|
fi
|
||
|
|
||
|
- show=1
|
||
|
+ # if there is a criteria in the command line, we are recursive and
|
||
|
+ # the parent passed criteria, show the device
|
||
|
+ if [[ $criteria != "" && $show -eq 1 && $recursive -eq 1 ]]; then
|
||
|
+ show=1
|
||
|
+ elif [[ $criteria != "" ]] ; then
|
||
|
# if there is a criteria in the command line, check if this
|
||
|
- # device matches
|
||
|
- if [[ $criteria != "" ]] ; then
|
||
|
- show=0
|
||
|
+ # device matches
|
||
|
+ show=0
|
||
|
check_criteria "name"
|
||
|
check_criteria "physloc"
|
||
|
check_criteria "status"
|
||
|
check_criteria "parent"
|
||
|
+ check_criteria "uniquetype"
|
||
|
+ check_criteria "class"
|
||
|
+ check_criteria "subclass"
|
||
|
+ check_criteria "type"
|
||
|
+ else
|
||
|
+ show=1
|
||
|
fi
|
||
|
|
||
|
# print the info only if the device matches the criteria
|
||
|
@@ -286,13 +486,19 @@
|
||
|
# the name attribute is always printed
|
||
|
echo -ne $dev_begin$begin"name="\"$name\"
|
||
|
|
||
|
+ print_attr "uniquetype"
|
||
|
+ print_attr "class"
|
||
|
+ print_attr "subclass"
|
||
|
+ print_attr "type"
|
||
|
print_attr "status"
|
||
|
|
||
|
# print the path, see note for ibmveth above
|
||
|
if [[ $format == "" || $format =~ "path" ]]; then
|
||
|
- echo -ne $path_begin
|
||
|
- echo -ne $separator$begin"name="\"$parent\"
|
||
|
- echo -ne $separator$begin"physloc="$physloc
|
||
|
+ echo -ne $path_begin\"$parent\"
|
||
|
+ echo -ne $separator$begin"connection="\"$connection\"
|
||
|
+ echo -ne $separator$begin"physloc="\"$physloc\"
|
||
|
+ echo -ne $separator$begin"path_id="\""0"\"
|
||
|
+ echo -ne $separator$begin"path_status="\"$status\"
|
||
|
echo -ne $path_end
|
||
|
fi
|
||
|
# done with this device
|