[stgt] [PATCH 1/2] tgt-admin: allow setting target paramaters

Tomasz Chmielewski mangoo at wpkg.org
Thu Sep 25 11:34:29 CEST 2008


This patch adds setting the following target parameters:

scsi_id
scsi_sn
vendor_id
product_id
product_rev
sense_format
removable
online
path
mode_page

write-cache

Usage will be documented in the 2/2 patch.


Signed-off-by: Tomasz Chmielewski <mangoo at wpkg.org>

diff --git a/scripts/tgt-admin b/scripts/tgt-admin
index 856cf33..c2a7e1c 100755
--- a/scripts/tgt-admin
+++ b/scripts/tgt-admin
@@ -11,7 +11,6 @@

use strict;
use Config::General qw(ParseConfig);
-use Data::Dumper;
use Getopt::Long;

# Our config file
@@ -37,7 +36,8 @@ This tool configures tgt targets.
      --ignore-errors		continue even if tgtadm exits with non-zero code
  -f, --force			force some operations even if the target is in use
  -p, --pretend			only print tgtadm options
-      --dump			dump current tgtd configuration
+      --dump			dump current tgtd configuration (note: does not
+      				include detailed parameters, like write caching)
  -v, --verbose			increase verbosity (show tgtadm commands)
  -h, --help			show this help

@@ -77,7 +77,7 @@ my $result = GetOptions (
);

if (($help == 1) || ($param eq undef)) {
-	&usage
+	usage;
}

# Show all the targets and exit
@@ -92,7 +92,6 @@ my %tgtadm_output_tid;
my %tgtadm_output_name;
my @largest_tid;
my $next_tid;
-my @rootfs_dev;

# Look up which targets are configured
sub process_targets {
@@ -104,7 +103,6 @@ sub process_targets {
	my @show_target = `tgtadm --op show --mode target`;
	my $tid;
	my $targetname;
-
	# Here, we create hashes of target names (all target data) and target tids
	foreach my $show_target_line (@show_target) {
		if ( $show_target_line =~ m/^Target (\d*): (.+)/ ) {
@@ -133,7 +131,7 @@ sub parse_configs {
			%conf = ParseConfig(-ConfigFile => "$alternate_conf", -UseApacheInclude => 1, -IncludeGlob => 1,);
		}
		else {
-			die("file $alternate_conf not found. Exiting...\n");
+			die("Config file $alternate_conf not found. Exiting...\n");
		}
	} else {
		# Parse the config file with Config::General
@@ -150,6 +148,7 @@ my $default_driver;
my $target;
my $option;
my $value;
+my $lun;

sub add_targets {
	my $single_target = $_[0];
@@ -158,8 +157,8 @@ sub add_targets {
	my $in_configfile = $_[3];
	foreach my $k (sort keys %conf) {

-		if ( $k eq "default-driver" ) {
-			if ( not length ref($conf{$k}) ) {
+		if ($k eq "default-driver") {
+			if (not length ref($conf{$k})) {
				$default_driver = $conf{$k};
			} else {
				print "Multiple default-driver definitions are not allowed!\n";
@@ -170,13 +169,13 @@ sub add_targets {
	}

	# If $default_driver is empty, default to iscsi
-	if ( not defined $default_driver ) {
+	if (not defined $default_driver) {
		execute("# default-driver not defined, defaulting to iscsi.\n");
		$default_driver = "iscsi";
	}

	foreach my $k (sort keys %conf) {
-		if ( $k eq "target" ) {
+		if ($k eq "target") {
			foreach my $k2 (sort keys %{$conf{$k}}) {
				# Do we run update or execute?
				if (length $single_target) {
@@ -191,49 +190,47 @@ sub add_targets {

				my $in_use = 0;
				if (length $single_target) {
-					$in_use = &main_delete($target);
+					$in_use = main_delete($target);
				}
				my $allowall = 1;
				if ((not defined $tgtadm_output{$k2}) ||
					($update ne 0 && $in_use == 0) ||
					($update ne 0 && $in_use == 1 && $pretend == 1 && $force == 1))
-					 {
+					{
					# We have to find available tid
-					if (($in_configfile == 1) && ($configured == 0)) {
-						my $maxtid = &find_max_tid;
+					if ($in_configfile == 1 && $configured == 0 && $pretend == 0) {
+						my $maxtid = find_max_tid();
						$next_tid = $maxtid + 1;
-					} elsif (length $single_target) {
+					} elsif (length $single_target && $configured == 1) {
						$next_tid = $tgtadm_output_tid{$target};
					} else {
						$next_tid = $next_tid + 1;
					}
+
					# Before we add a target, we need to know its type
-					my $driver;
+					# and other parameters which can be specified globally
+					my %target_options;
+					my $target_options_ref;
					foreach my $k3 (sort keys %{$conf{$k}{$k2}}) {
+						$lun = 1;
						$option = $k3;
						$value = $conf{$k}{$k2}{$k3};
-						&check_value($value);
-						if ($option eq "driver") {
-							if (ref($value) eq "ARRAY") {
-							print "Multiple driver definitions not allowed!\n";
-							print "Check your config file for errors (target: $target).\n";
-							exit 1;
-							}
-						$driver = $value;
-						}
+						check_value($value);
+						$target_options{$option} = $value;
+						$target_options_ref = \%target_options;
					}

-					if (not defined $driver) {
-						$driver = $default_driver;
+					if (not defined $target_options{"driver"}) {
+						$target_options{"driver"} = $default_driver;
					}
-
+					my $driver = $target_options{"driver"};
					execute("# Adding target: $target");
					execute("tgtadm --lld $driver --op new --mode target --tid $next_tid -T $target");
					foreach my $k3 (sort keys %{$conf{$k}{$k2}}) {
						$option = $k3;
						$value = $conf{$k}{$k2}{$k3};
-						&check_value($value);
-						&process_options($driver);
+						check_value($value);
+						process_options($target_options_ref);
						# If there was no option called "initiator-address", it means
						# we want to allow ALL initiators for this target
						if ($option eq "initiator-address") {
@@ -252,7 +249,7 @@ sub add_targets {
				}
			}
			if (length $single_target && $in_configfile == 0 && $configured == 0) {
-				print "Target $single_target is $connected currently not configured\n";
+				print "Target $single_target is currently not configured\n";
				print "and does not exist in the config file - can't continue!\n";
				exit 1;
			}
@@ -261,93 +258,232 @@ sub add_targets {
	}
}

-# Process options from the config file
-sub process_options {
-	my $driver = $_[0];
-	if ( $option eq "backing-store" ) {
-        # if we have one command, force it to be an array anyway
-		unless (ref($value) eq 'ARRAY') {
-			$value = [ $value ];
+# Some options can be specified only once
+sub check_if_hash_array {
+	my $check = $_[0];
+	my $definition = $_[1];
+	if (ref($check) eq 'ARRAY' || ref($check) eq "HASH") {
+		print "Multiple '$definition' definitions in '$option' not allowed!\n";
+		print "Check your config file for errors (target: $target).\n";
+		exit 1;
+	}
+}
+
+# Force an array if we just have one command
+sub force_array {
+	unless (ref($value) eq 'ARRAY') {
+		$value = [ $value ];
+	}
+}
+
+# If we start any external command, we want to know if it exists
+sub check_exe {
+	my $command = $_[0];
+	my $option = $_[1];
+	my @path = split(":", $ENV{PATH});
+	my $exists = 0;
+	foreach my $path (@path) {
+		if ( -x "$path/$command" && -f "$path/$command" ) { $exists = 1 }
+	}
+	if ( $exists == 0 ) {
+		print "Command $command (needed by $option option in your config file) is not in your path - can't continue!\n";
+		exit 1;
+	}
+}
+
+# Apply additional parameters
+sub add_params {
+	my $param = shift;
+	my $param_value = shift;
+	my $lun = shift;
+	my $driver = shift;
+
+	if ($param eq "write-cache") {
+		if ($param_value eq "off") {
+			execute("tgtadm --lld $driver --op update --mode logicalunit --tid $next_tid --lun=$lun --params mode_page=8:0:18:0x10:0:0xff:0xff:0:0:0xff:0xff:0xff:0xff:0x80:0x14:0:0:0:0:0:0");
+		} elsif ($param_value eq "on" || not length $param_value) {
+			execute("# Write cache is enabled (default) for lun $lun.");
+		} else {
+			execute("# WARNING! Unknown value ($param_value) to write-cache! Accepted values are \"on\" and \"off\".");
		}
-		my @value_arr = @$value;
-		my $i = 1;
-
-		foreach my $backing_store (@value_arr) {
-			# Check if device exists
-			if ( ! -e $backing_store) {
-				print "skipping device $backing_store\n";
-				print "$backing_store does not exists - please check the configuration file\n";
-				next;
+	}
+
+	if ($param eq "scsi_id" || $param eq "scsi_sn" || $param eq "vendor_id" || $param eq "product_id" ||
+	    $param eq "product_rev" || $param eq "sense_format" || $param eq "removable" || $param eq "online" ||
+	    $param eq "path" || $param eq "mode_page") {
+		execute("tgtadm --lld $driver --op update --mode logicalunit --tid $next_tid --lun=$lun --params $param=\"$param_value\"");
+	}
+}
+
+# Add backing or direct store
+sub add_backing_direct {
+	my $backing_store = $_[0];
+	my $target_options_ref = $_[1];
+	my $lun = $_[2];
+	my $direct_store = $_[3];
+	my $driver = $$target_options_ref{"driver"};
+	
+	# Is the device in use?
+	(my $can_alloc, my $dev) = check_device($backing_store);
+	
+	# Needed if the config file has mixed definitions
+	if (ref($backing_store) eq "HASH") {
+		foreach my $backing_store (sort keys %$value) {
+			add_backing_direct($backing_store,$target_options_ref,$lun,$direct_store);
+			$lun += 1;
+		}
+		return $lun;
+	} elsif (-e $backing_store && $can_alloc == 1) {
+		execute("tgtadm --lld $driver --op new --mode logicalunit --tid $next_tid --lun $lun -b $backing_store");
+		# Process parameters for each lun / backing store
+		if (ref $value eq "HASH") {
+			my %params_added;
+			my @mode_page;
+			foreach my $store (keys %$value) {
+				if (ref $$value{$store} eq "HASH" && $store eq $backing_store) {
+					foreach my $store_option (keys %{$$value{$store}}) {
+						my $result = $$value{$store}{$store_option};
+						check_value($result);
+						if ($store_option ne "mode_page") { check_if_hash_array($result,$store_option) }
+						# write-cache can be set globally per target and overridden per lun,
+						# so we treat it differently
+						if ($store_option ne "mode_page" && $store_option ne "write-cache") {
+							add_params($store_option, $result, $lun, $driver);
+							$params_added{$store_option} = 1;
+						}
+						if ($store_option eq "write-cache") {
+							add_params($store_option, $result, $lun, $driver);
+							$params_added{write_cache} = 1;
+						}
+						if ($store_option eq "mode_page") { 
+							@mode_page = @$result;
+							foreach my $mode_page (@mode_page) {
+								add_params("mode_page", $mode_page, $lun, $driver);
+							}
+						}
+					}
+				}
+			}
+			# Used only if lun is a direct-store
+			my $sg_inq;
+			my %direct_params;
+			if ($direct_store == 1) {
+				$sg_inq=`sg_inq $backing_store`;
+				if ($sg_inq=~m {
+					Vendor\ identification:\s+?(.*?)\n
+					\s+Product\ identification:\s+(.*?)\n
+					\s+Product\ revision\ level:\s+(.*?)\n
+					(?:\s+Unit\ serial\ number:\s+(.*?)\n)?
+					}xs ) {
+					# If they were not defined globally for a target,
+					# add them now
+					if (not length $$target_options_ref{vendor_id}) {
+						$direct_params{vendor_id} = $1;
+					}
+					if (not length $$target_options_ref{product_id}) {
+						$direct_params{product_id} = $2;
+					}
+					if (not length $$target_options_ref{product_rev}) {
+						$direct_params{product_rev} = $3;
+					}
+					if (not length $$target_options_ref{scsi_sn}) {
+						$direct_params{scsi_sn} = $4;
+					}
+				}
			}

-			(my $can_alloc, my $dev) = check_device($backing_store);
-			if ($can_alloc) {
-				execute("tgtadm --lld $driver --op new --mode logicalunit --tid $next_tid --lun $i -b $backing_store");
-				$i += 1;
+			# Add these parameters if they were not overwritten in the config file
+			my @opts = ("scsi_id", "sense_format", "removable", "online", "path");
+			foreach my $single_opt (@opts) {
+				check_if_hash_array($$target_options_ref{$single_opt},$single_opt);
+				if ($params_added{$single_opt} ne 1 && length $$target_options_ref{$single_opt}) {
+					add_params($single_opt, $$target_options_ref{$single_opt}, $lun, $driver);
+					$params_added{$single_opt} = 1;
+				}
+			}
+			# These options can be fetched by sg_inq for direct-store
+			my @opts = ("vendor_id", "product_id", "product_rev", "scsi_sn");
+			foreach my $single_opt (@opts) {
+				check_if_hash_array($$target_options_ref{$single_opt},$single_opt);
+				my $this_opt;
+				if (length $$target_options_ref{$single_opt}) {
+					$this_opt = $$target_options_ref{$single_opt};
+				} elsif (length $direct_params{$single_opt}) {
+					$this_opt = $direct_params{$single_opt};
+				}
+				if ($params_added{$single_opt} ne 1 && length $this_opt) {
+					add_params($single_opt, $this_opt, $lun, $driver);
+					$params_added{$single_opt} = 1;
+				}
			}
-			else {
-				print "skipping device $backing_store\n";
-				print "rootfs is mounted on this device: $dev\n";
+			# write-cache
+			if ($params_added{write_cache} ne 1) {
+				add_params("write-cache", $$target_options_ref{"write-cache"}, $lun, $driver);
+				$params_added{write_cache} = 1;
			}
+			# mode_page
+			unless (ref($$target_options_ref{mode_page}) eq 'ARRAY') {
+				$$target_options_ref{mode_page} = [ $$target_options_ref{mode_page} ];
+			}
+			foreach my $mode_page (@{$$target_options_ref{"mode_page"}}) {
+				if (length $mode_page) {
+					add_params("mode_page", $mode_page, $lun, $driver);
+				}
+			}
+		} else {
+			print "If you got here, this means your config file is not supported.\n";
+			print "Please report it to stgt mailing list and attach your config files.\n";
+			exit 1;
		}
+		$lun += 1;
+		return $lun;
+	} elsif ($can_alloc == 0) {
+		execute("# Skipping device $backing_store ($dev is mounted / in use)");
+	} else {
+		execute("# Skipping device: $backing_store");
+		execute("# $backing_store does not exist - please check the configuration file");
	}
+}

-	if ( $option eq "direct-store" ) {
-		my $inq;
-		my $vendor_id="";
-		my $prod_id="";
-		my $prod_rev="";
-		my $scsi_serial="";
-	        # if we have one command, force it to be an array anyway
-		unless (ref($value) eq 'ARRAY') {
-			$value = [ $value ];
+# Process options from the config file
+sub process_options {
+	my $target_options_ref = $_[0];
+	my $driver = $$target_options_ref{"driver"};
+	if ($option eq "backing-store" || $option eq "direct-store") {
+		my $direct_store = 0;
+		if ($option eq "direct-store") {
+			check_exe("sg_inq", "direct-store");
+			$direct_store = 1;
		}
-		my @value_arr = @$value;
-		my $i = 1;
-		foreach my $direct_store (@value_arr) {
-			# Check if device exists
-			if ( ! -e $direct_store) {
-				print "skipping device $direct_store\n" ;
-				print "$direct_store does not exists - please check the configuration file\n";
-				next;
+		
+		# We want to make everything a hash to use it
+		# in the same way later on
+		unless (ref($value)) {
+			$value = { $value }
+		}
+		
+		my %arrvalue;
+		if (ref($value) eq "ARRAY") {
+			foreach my $backing_store (@$value) {
+				$arrvalue{$backing_store} = 1;
			}
+			$value = \%arrvalue;
+		}

-			(my $can_alloc, my $dev) = check_device($direct_store);
-			if ($can_alloc) {
-				$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*(\S*)\s*\n*Unit serial number:\s*(\S+)/)
-				{
-					$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 $driver --op new --mode logicalunit --tid $next_tid --lun 1 -b $direct_store");
-				execute("tgtadm --lld $driver --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;
+		if (ref($value) eq "HASH") {
+			foreach my $backing_store (sort keys %$value) {
+				$lun = add_backing_direct($backing_store,$target_options_ref,$lun,$direct_store);
			}
-			else {
-				print "skipping device $direct_store\n";
-				print "rootfs is mounted on this device: $dev \n";
-			}
-
		}
	}

	if ( $option eq "incominguser" ) {
	        # if we have one command, force it to be an array anyway
-		unless (ref($value) eq 'ARRAY') {
-			$value = [ $value ];
-		}
+		force_array();
		my @value_arr = @$value;
		foreach my $incominguser (@value_arr) {
			my @userpass = split(/ /, $incominguser);
-			&check_value($userpass[1]);
+			check_value($userpass[1]);
			execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]");
			execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]");
			execute("tgtadm --lld $driver --mode account --op bind --tid=$next_tid --user=$userpass[0]");
@@ -356,12 +492,10 @@ sub process_options {

	if ( $option eq "outgoinguser" ) {
	        # if we have one command, force it to be an array anyway
-		unless (ref($value) eq 'ARRAY') {
-			$value = [ $value ];
-		}
+		force_array();
		execute("# Warning: only one outgoinguser is allowed. Will only use the first one.");
		my @userpass = split(/ /, @$value[0]);
-		&check_value($userpass[1]);
+		check_value($userpass[1]);
		execute("tgtadm --lld $driver --mode account --op delete --user=$userpass[0]");
		execute("tgtadm --lld $driver --mode account --op new --user=$userpass[0] --password=$userpass[1]");
		execute("tgtadm --lld $driver --mode account --op bind --tid=$next_tid --user=$userpass[0] --outgoing");
@@ -369,11 +503,10 @@ sub process_options {

	if ( $option eq "initiator-address" ) {
	        # if we have one command, force it to be an array anyway
-		unless (ref($value) eq 'ARRAY') {
-			$value = [ $value ];
-		}
+		force_array();
		my @value_arr = @$value;
		foreach my $initiator_address (@value_arr) {
+			check_value($initiator_address);
			execute("tgtadm --lld $driver --op bind --mode target --tid $next_tid -I $initiator_address");
		}
	}
@@ -383,7 +516,7 @@ sub process_options {
# try to remove it
sub remove_targets {

-	&process_targets;
+	process_targets;
	my @all_targets = keys %tgtadm_output_tid;

	foreach my $existing_target (@all_targets) {
@@ -399,7 +532,7 @@ sub remove_targets {

				if ( $dontremove == 0 ) {
					# Remove the target
-					&main_delete($existing_target);
+					main_delete($existing_target);
				}
			}
		}
@@ -409,15 +542,15 @@ sub remove_targets {
# Dump current tgtd configuration
sub dump_config {

-	&process_targets;
+	process_targets;

	my @all_targets = keys %tgtadm_output_tid;
-
+	
	# If all targets use the same driver, us it only once in the config
	my $skip_driver = 0;
	my @drivers_combined;
	foreach my $current_target (@all_targets) {
-		my $driver = &show_target_info($current_target, "driver");
+		my $driver = show_target_info($current_target, "driver");
		push (@drivers_combined, $driver);
	}

@@ -431,20 +564,20 @@ sub dump_config {

	# Print everything else in the config
	foreach my $current_target (@all_targets) {
-		my $target_name = &show_target_info($current_target, "target_name");
+		my $target_name = show_target_info($current_target, "target_name");
		print "<target $target_name>\n";

		if (scalar @drivers_combined_uniq gt 1) {
-			my $driver = &show_target_info($current_target, "driver");
+			my $driver = show_target_info($current_target, "driver");
			print "\tdriver $driver\n";
		}

-		my @backing_stores = &show_target_info($current_target, "backing_stores");
+		my @backing_stores = show_target_info($current_target, "backing_stores");
		foreach my $backing_store (@backing_stores) {
			print "\tbacking-store $backing_store\n";
		}

-		my @account_information = &show_target_info($current_target, "account_information");
+		my @account_information = show_target_info($current_target, "account_information");
		foreach my $account (@account_information) {
			if ($account =~ /(.+)\ \(outgoing\)/) {
				print "\toutgoinguser $1 PLEASE_CORRECT_THE_PASSWORD\n";
@@ -453,7 +586,7 @@ sub dump_config {
			}
		}

-		my @acl_information = &show_target_info($current_target, "acl_information");
+		my @acl_information = show_target_info($current_target, "acl_information");
		if (scalar(@acl_information) != 1 || $acl_information[0] ne "ALL") {
			foreach my $ini_address (@acl_information) {
				print "\tinitiator-address $ini_address\n";
@@ -487,17 +620,17 @@ Example usage:

EOF
	} elsif ($off_ready eq "ALL") {
-		&process_targets;
+		process_targets;
		# Run over all targets and offline/ready them
		my @all_targets = keys %tgtadm_output_tid;
		foreach my $existing_target (@all_targets) {
			execute("tgtadm --op update --mode target --tid=$tgtadm_output_tid{$existing_target} -n state -v $var");
		}
	} elsif ($off_ready =~ m/tid=(.+)/) {
-		&process_targets;
+		process_targets;
		execute("tgtadm --op update --mode target --tid=$1 -n state -v $var");
	} else {
-		&process_targets;
+		process_targets;
		if (length $tgtadm_output_tid{$off_ready}) {
			execute("tgtadm --op update --mode target --tid=$tgtadm_output_tid{$off_ready} --name=\"$off_ready\" -n state -v $var");
		} else {
@@ -566,7 +699,7 @@ sub show_target_info {
			my @var = split(/\n/, $1);
			my $sid;
			my $cid;
-
+	
			foreach my $line (@var) {
			if ($line =~ m/\s+I_T nexus:\ (.+)/) {
					$sid = $1;
@@ -586,19 +719,19 @@ sub show_target_info {
sub main_delete {
	my $current_target = $_[0];
	my $current_tid = $_[1];
-	my $configured = &check_configured($current_target);
+	my $configured = check_configured($current_target);
	my $del_upd_text;
	# Check if the target has initiators connected
	if ($tgtadm_output{$current_target} =~ m/\s+Connection:/) {
		if ($force == 1) {
			execute("# Removing target: $current_target");
			# Remove ACLs first
-			my @acl_info = &show_target_info($current_target, "acl_information");
+			my @acl_info = show_target_info($current_target, "acl_information");
			foreach my $acl (@acl_info) {
				execute("tgtadm --op unbind --mode target --tid $tgtadm_output_tid{$current_target} -I $acl");
			}
			# Now, remove all sessions / connections from that tid
-			my %sessions = &show_target_info($current_target, "sessions");
+			my %sessions = show_target_info($current_target, "sessions");
			foreach my $sid (keys %sessions) {
				foreach my $cid ($sessions{$sid}) {
					execute("tgtadm --op delete --mode conn --tid $tgtadm_output_tid{$current_target} --sid $sid --cid $cid");
@@ -632,7 +765,7 @@ sub main_delete {

# Delete the targets
sub delete_targets {
-
+	
	if ($delete eq "help") {
		print <<EOF;
      --delete <value>		delete all or selected targets
@@ -650,22 +783,22 @@ Example usage:
EOF
		exit;
	} elsif ($delete eq "ALL") {
-		&process_targets;
+		process_targets;
		# Run over all targets and delete them
		my @all_targets = keys %tgtadm_output_tid;
		foreach my $current_target (@all_targets) {
-			&main_delete($current_target);
+			main_delete($current_target);
		}
	} elsif ($delete =~ m/^tid=(.+)/) {
		# Delete by tid
-		&process_targets;
+		process_targets;
		my $current_target = $tgtadm_output_name{$1};
-		&main_delete($current_target, $1);
+		main_delete($current_target, $1);
	} else {
		# Delete by name
-		&process_targets;
+		process_targets;
		my $current_target = $delete;
-		&main_delete($current_target);
+		main_delete($current_target);
	}
}

@@ -674,7 +807,7 @@ sub update_targets {
	if ($update eq "help") {
		print <<EOF;
      --update <value>		update all or selected targets
-				The target will be update only if it's not used
+				The target will be updated only if it's not used
				(no initiator is connected to it).
				If you want to update targets which are in use,
				you have to add "--force" flag.
@@ -689,67 +822,67 @@ EOF
		exit;
	} elsif ($update eq "ALL") {
		# Run over all targets and delete them if they are not in use
-		&parse_configs;
-		&process_targets;
-#		my @all_targets = keys %tgtadm_output_tid;
-		my @targets_combined = &combine_targets;
+		parse_configs;
+		process_targets;
+		my @targets_combined = combine_targets();
		foreach my $current_target (@targets_combined) {
-			my $configured = &check_configured($current_target);
-			my $connected = &check_connected($current_target);
-			my $in_configfile = &check_in_configfile($current_target);
-			&combine_targets;
+			my $configured = check_configured($current_target);
+			my $connected = check_connected($current_target);
+			my $in_configfile = check_in_configfile($current_target);
+			combine_targets();
			if (($in_configfile == 0) && ($configured == 1)) {
				# Delete the target if it's not in the config file
-				&main_delete($current_target);
+				main_delete($current_target);
			} else {
-				&add_targets($current_target, $configured, $connected, $in_configfile);
+				add_targets($current_target, $configured, $connected, $in_configfile);
			}

		}
	} elsif ($update =~ m/^tid=(.+)/) {
		# Update by tid
-		&parse_configs;
-		&process_targets;
+		parse_configs;
+		process_targets;
		my $current_target = $tgtadm_output_name{$1};
-		my $configured = &check_configured($current_target);
-		my $connected = &check_connected($current_target);
-		my $in_configfile = &check_in_configfile($current_target);
+		my $configured = check_configured($current_target);
+		my $connected = check_connected($current_target);
+		my $in_configfile = check_in_configfile($current_target);
		if (($in_configfile == 0) && ($configured == 1)) {
			# Delete the target if it's not in the config file
-			&main_delete($current_target);
+			main_delete($current_target);
		} elsif ($configured == 1) {
-			&add_targets($current_target, $configured, $connected);
+			add_targets($current_target, $configured, $connected, $in_configfile);
		} else {
			print "There is no target with tid $1, can't continue!\n";
			exit 1;
		}
	} else {
		# Update by name
-		&parse_configs;
-		&process_targets;
+		parse_configs;
+		process_targets;
		my $current_target = $update;
-		my $configured = &check_configured($current_target);
-		my $connected = &check_connected($current_target);
-		my $in_configfile = &check_in_configfile($current_target);
-		if (($in_configfile == 0) && ($configured == 1)) {
+		my $configured = check_configured($current_target);
+		my $connected = check_connected($current_target);
+		my $in_configfile = check_in_configfile($current_target);
+		if ($in_configfile == 0 && $configured == 1) {
			# Delete the target if it's not in the config file
-			&main_delete($current_target);
+			main_delete($current_target);
		} else {
-			&add_targets($current_target, $configured, $connected);
+			add_targets($current_target, $configured, $connected, $in_configfile);
		}
	}
}

# Find the biggest tid
sub find_max_tid {
+	process_targets;
	my @all_targets = keys %tgtadm_output_tid;
	my $maxtid = 0;
	foreach my $var (@all_targets) {
		if ($tgtadm_output_tid{$var} > $maxtid) {
			$maxtid = $tgtadm_output_tid{$var};
		}
-		return $maxtid;
	}
+	return $maxtid;
}

# Combine targets from the config file and currently configured targets
@@ -819,33 +952,8 @@ sub check_connected {
	}
}

-# Execute or just print (or both) everything we start or would start
-sub execute {
-	if ($pretend == 0) {
-
-		my $args = "@_";
-		if ($verbose == 1) {
-			print "$args\n";
-		}
-		# Don't try to execute if it's a comment
-		my @execargs = split(/#/, $args);
-		if ( $execargs[0] ne undef  ) {
-			system($args);
-
-			# If non-zero exit code was return, exit
-			my $exit_value  = $? >> 8;
-			if (($exit_value != 0) && ($ignore_errors == 0)) {
-				print "Command:\n\t$args\nexited with code: $exit_value.\n";
-				exit $exit_value;
-			}
-		}
-
-	} elsif ( $pretend == 1 ) {
-		print "@_\n";
-	}
-}
-
-#Check if a device can be allocated
+# Check if a device can be allocated
+my @rootfs_dev;
sub check_device {
	my $tmp_dev = $_[0];

@@ -904,21 +1012,47 @@ sub find_rootfs_device {
	@rootfs_dev = grep { ! $seen{ $_ }++ } @rootfs_dev;
}

+# Execute or just print (or both) everything we start or would start
+sub execute {
+	if ($pretend == 0) {
+
+		my $args = "@_";
+		if ($verbose == 1) {
+			print "$args\n";
+		}
+		# Don't try to execute if it's a comment
+		my @execargs = split(/#/, $args);
+		if ($execargs[0] ne undef) {
+			system($args);
+
+			# If non-zero exit code was return, exit
+			my $exit_value  = $? >> 8;
+			if (($exit_value != 0) && ($ignore_errors == 0)) {
+				print "Command:\n\t$args\nexited with code: $exit_value.\n";
+				exit $exit_value;
+			}
+		}
+
+	} elsif ($pretend == 1) {
+		print "@_\n";
+	}
+}
+
if ($execute == 1) {
-	&process_targets;
-	&parse_configs;
-	&add_targets;
-	&remove_targets;
+	process_targets;
+	parse_configs;
+	add_targets;
+	remove_targets;
} elsif ($delete ne 0) {
-	&delete_targets;
+	delete_targets;
} elsif ($update ne 0) {
-	&update_targets;
+	update_targets;
} elsif ($dump == 1) {
-	&dump_config;
+	dump_config;
} elsif ($offline ne 0) {
-	&ready_offline_targets("offline");
+	ready_offline_targets("offline");
} elsif ($ready ne 0) {
-	&ready_offline_targets("ready");
+	ready_offline_targets("ready");
} else {
	print "No action specified.\n";
}




-- 
Tomasz Chmielewski
http://wpkg.org

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list