From bdc3b89850bb437f48cb2f9fa31a8f51d3cd88b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Hor=C3=A1k?= Date: Fri, 28 Jan 2011 14:30:22 +0100 Subject: [PATCH 60/61] lsluns: Fix LUN reporting for SAN volume controller (SVC) Description: lsluns: Fix LUN reporting for SAN volume controller (SVC) Symptom: lsluns fails to report LUNs from SVC Problem: The SCSI Architecture Model (SAM) specifies that a storage server only has to support the REPORT LUNs command for LUN 0 or the "REPORT LUNS Well-Known-LUN" (WLUN). The SAN Volume Controller (SVC) only supports REPORT LUNS on LUN 0. The approach of lsluns of sending the REPORT LUNS to any attached LUN does not work for the SVC. Solution: Change the strategy of lsluns to check if the LUN 0 or the WLUN is already available. If both LUNs are not available, first try to attach LUN 0 and issue the command; if this fails, try the WLUN. --- zconf/lsluns | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff --git a/zconf/lsluns b/zconf/lsluns index 769b846..acbdcd7 100755 --- a/zconf/lsluns +++ b/zconf/lsluns @@ -45,16 +45,16 @@ sub list_luns next; } if (!defined($lun_hash{$a}{$p})) { - `echo $wlun >> $drv_dir/$a/$p/unit_add 2>/dev/null`; + `echo $lun0 >> $drv_dir/$a/$p/unit_add 2>/dev/null`; select(undef, undef, undef, 0.1); %lun_hash = get_lun_hash(); if (!defined($lun_hash{$a}{$p})) { - `echo $wlun >> $drv_dir/$a/$p/unit_remove 2>/dev/null`; - `echo $lun0 >> $drv_dir/$a/$p/unit_add 2>/dev/null`; + `echo $lun0 >> $drv_dir/$a/$p/unit_remove 2>/dev/null`; + `echo $wlun >> $drv_dir/$a/$p/unit_add 2>/dev/null`; select(undef, undef, undef, 0.1); %lun_hash = get_lun_hash(); if (!defined($lun_hash{$a}{$p})) { - `echo $lun0 >> $drv_dir/$a/$p/unit_remove 2>/dev/null`; + `echo $wlun >> $drv_dir/$a/$p/unit_remove 2>/dev/null`; print"\tat port $p:\n"; print "\t\tCannot attach WLUN / LUN0 for scanning.\n"; next; @@ -92,6 +92,8 @@ sub list_luns } } +# Look only for LUN0 and the REPORT LUNs WLUN. SAM specifies that the storage +# only has to response on one of those to the REPORT LUNs command. sub get_lun_hash { my %lun_hash; @@ -105,7 +107,9 @@ sub get_lun_hash $p =~ s/(0x\w{16})*\n/$1/; chomp($a); - $lun_hash{$a}{$p}{$l} = ${[split('/', $device)]}[-1]; + if ($l eq $lun0 or $l eq $wlun) { + $lun_hash{$a}{$p}{$l} = ${[split('/', $device)]}[-1]; + } } return %lun_hash; } -- 1.7.3.5