[Stgt-devel] [PATCH] tgt-admin: support persistent device binding

Doron Shoham dorons
Sun Jul 27 15:47:51 CEST 2008


Add a device by its serial number and not only /dev/sdX.
This is important for persistent binding to physical devices.
The device mapping may change between reboots due different
bringup time of the storage devices.

Signed-off-by: Doron Shoham <dorons at voltaire.com>
---
 scripts/tgt-admin |   60 ++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/scripts/tgt-admin b/scripts/tgt-admin
index 9083417..8442474 100755
--- a/scripts/tgt-admin
+++ b/scripts/tgt-admin
@@ -70,6 +70,22 @@ if ($show == 1) {
 	exit;
 }
 
+# Create a hash of all the scsi id and their mapped devices
+my %sn_hash=();
+sub map_devices {
+	my @sd_list=();
+	my $sg_list=`sg_map -i -x`;
+	while ($sg_list=~/(\/dev\/sd\w)/sgi) {
+		push(@sd_list,$1);
+	}
+	foreach my $sd (@sd_list) {
+		my $inq=`sg_inq $sd`;
+		if ($inq=~/Unit serial number:\s*(\w+)/) {
+			$sn_hash{$1}=$sd;
+		}
+	}
+}
+
 # Check if alternative configuration file was given
 if ($alternate_conf ne 0) {
 	# Check if alternative configuration file exist
@@ -134,6 +150,7 @@ sub add_targets {
 
 # Process options from the config file
 sub process_options {
+	&map_devices;
 	if ( $option eq "backing-store" ) {
         # if we have one command, force it to be an array anyway
 		unless (ref($value) eq 'ARRAY') {
@@ -142,6 +159,10 @@ sub process_options {
 		my @value_arr = @$value;
 		my $i = 1;
 		foreach my $backing_store (@value_arr) {
+			# Check if a serial number was given
+			if ($backing_store!~/\/dev\//) {
+				$backing_store=$sn_hash{$backing_store};
+			}
 			# Check if device exists
 			if ( -e $backing_store) {
 				execute("tgtadm --lld iscsi --op new --mode logicalunit --tid $next_tid --lun $i -b $backing_store");
@@ -167,22 +188,33 @@ sub process_options {
 		my @value_arr = @$value;
 		my $i = 1;
 		foreach my $direct_store (@value_arr) {
-			$inq=`sg_inq $direct_store`;
-			if ($inq=~/Vendor identification:\s*(\w+)\s*\n*Product identification:\s*([\w\s\/\-]+)\n\s*\n*Product revision level:\s*(\w*)\s*\n*Unit serial number:\s*(\w+)/)
-			{
-				$vendor_id="$1";
-				$prod_id="$2";
-				$prod_rev="$3";
-				$scsi_serial="$4";
+			# Check if a serial number was given
+			if ($direct_store!~/\/dev\//) {
+				$direct_store=$sn_hash{$direct_store};
 			}
-			$vendor_id =~ s/\s+$//;
-			$prod_id =~ s/\s+$//;
-			$prod_rev =~ s/\s+$//;
-			$scsi_serial =~ s/\s+$//;
+			# Check if device exists
+			if ( -e $direct_store) {
+				$inq=`sg_inq $direct_store`;
+				if ($inq=~/Vendor identification:\s*(\w+)\s*\n*Product identification:\s*([\w\s\/\-]+)\n\s*\n*Product revision level:\s*(\w*)\s*\n*Unit serial number:\s*(\w+)/)
+				{
+					$vendor_id="$1";
+					$prod_id="$2";
+					$prod_rev="$3";
+					$scsi_serial="$4";
+				}
+				$vendor_id =~ s/\s+$//;
+				$prod_id =~ s/\s+$//;
+				$prod_rev =~ s/\s+$//;
+				$scsi_serial =~ s/\s+$//;
 
-			execute("tgtadm --lld iscsi --op new --mode logicalunit --tid $next_tid --lun 1 -b $direct_store");
-			execute("tgtadm --lld iscsi --op update --mode logicalunit --tid  $next_tid --lun 1 --params vendor_id=\"$vendor_id\",product_id=\"$prod_id\",product_rev=\"$prod_rev\",scsi_sn=\"$scsi_serial\"");
-			$i += 1;
+				execute("tgtadm --lld iscsi --op new --mode logicalunit --tid $next_tid --lun 1 -b $direct_store");
+				execute("tgtadm --lld iscsi --op update --mode logicalunit --tid  $next_tid --lun 1 --params vendor_id=\"$vendor_id\",product_id=\"$prod_id\",product_rev=\"$prod_rev\",scsi_sn=\"$scsi_serial\"");
+				$i += 1;
+			}
+			else {
+				print("skipping device $direct_store\n");
+				print("$direct_store does not exist - please check the configuration file\n");
+			}
 		}
 	}
 
-- 
1.5.2







More information about the stgt mailing list