#!/bin/bash # Usage: block-npiv [add npiv | remove dev] dir=$(dirname "$0") . "$dir/block-common.sh" #set -x #command=$1 # Find first alive non-VHOST find_qla() { unset qla for qla in /proc/scsi/qla2xxx/*; do if grep -q "" $qla; then continue fi if grep -q "VHOST index" $qla; then continue fi return done } # Find dev for NPIV find_sdev() { unset dev for host in /proc/scsi/qla2xxx/*; do if grep -q $1 $host; then h=${host##*/} dev=`readlink /sys/class/scsi_device/$h*:0/device/block*` dev=${dev##*/} return fi done } # Find host for NPIV find_host() { unset host for host in /proc/scsi/qla2xxx/*; do if grep -q $1 $host; then host=${host##*/} return fi done } # Find NPIV for dev find_sdev_rev() { unset npiv for host in /proc/scsi/qla2xxx/*; do h=${host##*/} if test ! -L /sys/class/scsi_device/$h*:0/device/block*; then continue fi dev=`readlink /sys/class/scsi_device/$h*:0/device/block*` dev=${dev##*/} if test $dev = $1; then npiv=`grep adapter-port= $host` npiv=${npiv##*=} npiv=${npiv%;} return fi done } find_qla test -z "$qla" && exit 2 case "$command" in add) par=`xenstore-read $XENBUS_PATH/params` || true #par=$2 NPIV=$par find_sdev $NPIV if test -z "$dev"; then echo "scsi-qlavportc=$NPIV" > $qla sleep 8 find_host $NPIV # echo "/sys/class/scsi_host/host$host/scan" echo "- - -" > /sys/class/scsi_host/host$host/scan sleep 1 find_sdev $NPIV xenstore-write $XENBUS_PATH/node /dev/$dev write_dev /dev/$dev exit 0 fi exit 1 ;; remove) node=`xenstore-read $XENBUS_PATH/node` || true #node=$2 dev=$node; dev=${dev#/dev/} find_sdev_rev $dev if test -x /sbin/blockdev -a -n "$node"; then blockdev --flushbufs $node; fi test -z "$npiv" && exit 2 # echo "scsi-qlavportd" > $qla echo "scsi-qlavportd=$npiv" > $qla sleep 4 exit 0 ;; esac