diff --git a/scstadmin/scst-0.9.00/lib/SCST/SCST.pm b/scstadmin/scst-0.9.00/lib/SCST/SCST.pm index 1b54cd43c..ac934df3b 100644 --- a/scstadmin/scst-0.9.00/lib/SCST/SCST.pm +++ b/scstadmin/scst-0.9.00/lib/SCST/SCST.pm @@ -38,6 +38,9 @@ SCST_T10_IO => 't10_dev_id', # Module return codes SCST_C_FATAL_ERROR => 2, +SCST_C_BAD_PARAMETERS => 7, +SCST_C_PARAMETER_STATIC => 8, +SCST_C_SETPARAM_FAIL => 9, SCST_C_HND_NO_HANDLER => 10, @@ -90,6 +93,9 @@ SCST_C_INI_SETPARAM_FAIL => 99, my %VERBOSE_ERROR = ( (SCST_C_FATAL_ERROR) => 'A fatal error occured. See "dmesg" for more information.', +(SCST_C_BAD_PARAMETERS) => 'Bad parameters given for SCST.', +(SCST_C_PARAMETER_STATIC) => 'SCST parameter specified is static', +(SCST_C_SETPARAM_FAIL) => 'Failed to set a SCST parameter. See "demsg" for more information.', (SCST_C_HND_NO_HANDLER) => 'No such handler exists.', @@ -253,6 +259,38 @@ sub scstParameters { return \%parameters; } +sub setScstParameter { + my $self = shift; + my $parameter = shift; + my $value = shift; + + return TRUE if (!defined($parameter) || !defined($value)); + + my $parameters = $self->scstParameters(); + + return SCST_C_BAD_PARAMETERS if (!defined($$parameters{$parameter})); + return SCST_C_PARAMETER_STATIC if ($$parameters{$parameter}->{'static'}); + + my $path = mkpath(SCST_ROOT, $parameter); + + my $io = new IO::File $path, O_WRONLY; + + return SCST_C_SETPARAM_FAIL if (!$io); + + my $bytes; + + if ($self->{'debug'}) { + print "DBG($$): $path -> $parameter = $value\n"; + } else { + $bytes = syswrite($io, $value, length($value)); + } + + close $io; + + return FALSE if ($self->{'debug'} || $bytes); + return SCST_C_SETPARAM_FAIL; +} + sub drivers { my $self = shift; my @drivers; @@ -1151,6 +1189,13 @@ sub deviceParameters { $parameters{$parameter}->{'static'} = TRUE; $parameters{$parameter}->{'value'} = $handler; } + } elsif ($parameter eq 'scsi_device') { + my $linked = readlink $pPath; + + $linked =~ s/^\.\.\/\.\.\/\.\.\/\.\.\//\/sys\//; + + $parameters{$parameter}->{'static'} = TRUE; + $parameters{$parameter}->{'value'} = $linked; } else { if (!(($mode & S_IRUSR) >> 6)) { $parameters{$parameter}->{'static'} = FALSE; @@ -1953,7 +1998,7 @@ sub closeDevice { } $rc = $self->handlerDeviceExists($handler, $device); - return SCST_C_DEV_NO_DEVICE if ($rc == TRUE); + return SCST_C_DEV_NO_DEVICE if ($rc != TRUE); return $rc if ($rc > 1); my $cmd = "del_device $device\n"; diff --git a/scstadmin/scstadmin.sysfs b/scstadmin/scstadmin.sysfs index 906dc513f..7d3280f8f 100755 --- a/scstadmin/scstadmin.sysfs +++ b/scstadmin/scstadmin.sysfs @@ -18,7 +18,6 @@ General Operations -clear_config : Clear all SCST configuration. -write_config : Writes the current configuration out . -check_config : Checks the saved configuration in . - -sessions : List current initiator sessions. Query Operations -list_handler [] : List all available handlers or specific . @@ -30,6 +29,7 @@ Query Operations [-driver ] [-target ] + -list_scst_parm : List add parameters for SCST. -list_hnd_parm : List all parameters for a given handler. -list_dev_parm : List all parameters for a given device. -list_drv_parm : List all parameters for a given driver. @@ -47,6 +47,8 @@ Query Operations -list_sessions : List all current initiator sessions. Set Operations + -set_scst_parm : Sets SCST parameter(s)

to value . + -parameters -set_hnd_parm : Sets handler parameter(s)

to value . -parameters -set_dev_parm : Sets device parameters(s)

to value . @@ -168,7 +170,7 @@ Examples: EndUsage } -use SCST::SCST; +use SCST::SCST 0.9.0; use Getopt::Long; use IO::File; use IO::Dir; @@ -209,6 +211,7 @@ sub getArgs { my $listGroup; my $listSessions; + my $listScstParm; my $listHandlerParm; my $listDeviceParm; my $listDriverParm; @@ -216,6 +219,7 @@ sub getArgs { my $listLunParm; my $listInitiatorParm; + my $setScstParm; my $setHandlerParm; my $setDeviceParm; my $setDriverParm; @@ -270,6 +274,7 @@ sub getArgs { 'list_group:s' => \$listGroup, 'list_sessions' => \$listSessions, + 'list_scst_parm' => \$listScstParm, 'list_hnd_parm=s' => \$listHandlerParm, 'list_dev_parm=s' => \$listDeviceParm, 'list_drv_parm=s' => \$listDriverParm, @@ -277,6 +282,7 @@ sub getArgs { 'list_lun_parm=s' => \$listLunParm, 'list_ini_parm=s' => \$listInitiatorParm, + 'set_scst_parm' => \$setScstParm, 'set_hnd_parm=s' => \$setHandlerParm, 'set_dev_parm=s' => \$setDeviceParm, 'set_drv_parm=s' => \$setDriverParm, @@ -326,13 +332,18 @@ sub getArgs { $noprompt = TRUE if (defined($noprompt)); $clearInitiators = TRUE if (defined($clearInitiators)); $clearLuns = TRUE if (defined($clearLuns)); - $issueLip = TRUE if (defined($issueLip)); + $issueLip = TRUE if (defined($issueLip)); + $listSessions = TRUE if (defined($listSessions)); + $listScstParm = TRUE if (defined($listScstParm)); + $setScstParm = TRUE if (defined($setScstParm)); my $query_mode = defined($listHandler) || defined($listDevice) || defined($listDriver) || - defined($listTarget) || defined($listGroup) || defined($listSessions); + defined($listTarget) || defined($listGroup) || defined($listSessions) || defined($listScstParm) || + defined($listHandlerParm) || defined($listDeviceParm) || defined($listDriverParm) || + defined($listTargetParm) || defined($listLunParm) || defined($listInitiatorParm); - my $set_mode = defined($setHandlerParm) + defined($setDeviceParm) + defined($setDriverParm) + - defined($setTargetParm) + defined($setLunParm) + defined($setInitiatorParm); + my $set_mode = defined($setScstParm) + defined($setHandlerParm) + defined($setDeviceParm) + + defined($setDriverParm) + defined($setTargetParm) + defined($setLunParm) + defined($setInitiatorParm); my $op_mode = defined($clearConfig) + defined($writeConfig) + defined($checkConfig) + defined($openDev) + defined($closeDev) + defined($addGroup) + defined($removeGroup) + @@ -345,6 +356,11 @@ sub getArgs { usage(); } + if ($clearConfig && !$force) { + print "Please specify -force with -clear_config.\n"; + usage(); + } + if ($listTargetParm && !$driver) { print "Please specify -driver with -list_tgt_parm.\n"; usage(); @@ -360,6 +376,11 @@ sub getArgs { usage(); } + if ($setScstParm && !$parameters) { + print "Please specify -parameters with -set_scst_parm.\n"; + usage(); + } + if ($setHandlerParm && !$parameters) { print "Please specify -parameters with -set_hnd_parm.\n"; usage(); @@ -441,10 +462,10 @@ sub getArgs { } return ($applyConfig, $clearConfig, $writeConfig, $checkConfig, - $listHandler, $listDevice, $listDriver, $listTarget, $listGroup, $listSessions, - $listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm, $listLunParm, - $listInitiatorParm, $setHandlerParm, $setDeviceParm, $setDriverParm, $setTargetParm, - $setLunParm, $setInitiatorParm, + $listScstParm, $listHandler, $listDevice, $listDriver, $listTarget, $listGroup, + $listSessions, $listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm, + $listLunParm, $listInitiatorParm, $setScstParm, $setHandlerParm, $setDeviceParm, + $setDriverParm, $setTargetParm, $setLunParm, $setInitiatorParm, $openDev, $closeDev, $resyncDev, $addGroup, $removeGroup, $addInitiator, $removeInitiator, $moveInitiator, $clearInitiators, @@ -464,10 +485,10 @@ sub main { if ( $> ) {die("This program must run as root.\n");} my ($applyConfig, $clearConfig, $writeConfig, $checkConfig, - $listHandler, $listDevice, $listDriver, $listTarget, $listGroup, $listSessions, - $listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm, $listLunParm, - $listInitiatorParm, $setHandlerParm, $setDeviceParm, $setDriverParm, $setTargetParm, - $setLunParm, $setInitiatorParm, + $listScstParm, $listHandler, $listDevice, $listDriver, $listTarget, $listGroup, + $listSessions, $listHandlerParm, $listDeviceParm, $listDriverParm, $listTargetParm, + $listLunParm, $listInitiatorParm, $setScstParm, $setHandlerParm, $setDeviceParm, + $setDriverParm, $setTargetParm, $setLunParm, $setInitiatorParm, $openDev, $closeDev, $resyncDev, $addGroup, $removeGroup, $addInitiator, $removeInitiator, $moveInitiator, $clearInitiators, @@ -531,10 +552,14 @@ sub main { $rc = listGroups($listGroup, $driver, $target); $all_good = TRUE; }; - defined($listSessions) && do { + $listSessions && do { $rc = listSessions(); $all_good = TRUE; }; + $listScstParm && do { + $rc = listScstParm(); + $all_good = TRUE; + }; $listHandlerParm && do { $rc = listHandlerParameters($listHandlerParm); $all_good = TRUE; @@ -559,6 +584,10 @@ sub main { $rc = listInitiatorParameters($listInitiatorParm, $driver, $target, $group); $all_good = TRUE; }; + $setScstParm && do { + $rc = setScstParameters($parameters); + last SWITCH; + }; $setHandlerParm && do { $rc = setHandlerParameters($setHandlerParm, $parameters); last SWITCH; @@ -682,9 +711,13 @@ sub readWorkingConfig { immediateExit($SCST->errorString()); foreach my $driver (@{$drivers}) { + my %empty; + $CURRENT{'assign'}->{$driver} = \%empty; my $targets = $SCST->targets($driver); immediateExit($SCST->errorString()); foreach my $target (@{$targets}) { + my %empty; + $CURRENT{'assign'}->{$driver}->{$target} = \%empty; my $groups = $SCST->groups($driver, $target); immediateExit($SCST->errorString()); foreach my $group (@{$groups}) { @@ -726,7 +759,7 @@ sub writeConfiguration { my $parameters = $SCST->scstParameters(); immediateExit($SCST->errorString()); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { next if (defined($$parameters{$parameter}->{'set'})); if (!$$parameters{$parameter}->{'static'}) { @@ -738,14 +771,14 @@ sub writeConfiguration { print $io "\n"; - foreach my $handler (keys %{$CURRENT{'handler'}}) { + foreach my $handler (sort keys %{$CURRENT{'handler'}}) { my $handler_params = $SCST->deviceAvailableParameters($handler); print $io "HANDLER $handler {\n"; $parameters = $SCST->handlerParameters($handler); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { next if (defined($$parameters{$parameter}->{'set'})); if (!$$parameters{$parameter}->{'static'}) { @@ -764,7 +797,7 @@ sub writeConfiguration { my $written = 0; - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { next if (defined($$parameters{$parameter}->{'set'})); if (!defined($$handler_params{$parameter})) { @@ -783,7 +816,7 @@ sub writeConfiguration { print $io "\t\tCREATE_ATTRIBUTES {\n"; - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { next if (defined($$parameters{$parameter}->{'set'})); if (defined($$handler_params{$parameter})) { @@ -801,17 +834,17 @@ sub writeConfiguration { print $io "}\n\n"; } - foreach my $driver (keys %{$CURRENT{'assign'}}) { + foreach my $driver (sort keys %{$CURRENT{'assign'}}) { print $io "TARGET_DRIVER $driver {"; my $targets = $CURRENT{'assign'}->{$driver}; - foreach my $target (keys %{$targets}) { + foreach my $target (sort keys %{$targets}) { print $io "\n\tTARGET $target {"; my $groups = $CURRENT{'assign'}->{$driver}->{$target}; - foreach my $group (keys %{$groups}) { + foreach my $group (sort keys %{$groups}) { my $lun_params = $SCST->lunAvailableParameters($driver, $target, $group); my $ini_params = $SCST->initiatorAvailableParameters($driver, $target, $group); @@ -826,7 +859,7 @@ sub writeConfiguration { $parameters = $SCST->lunParameters($driver, $target, $group, $lun); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { next if (defined($$parameters{$parameter}->{'set'})); if (!$$parameters{$parameter}->{'static'} || @@ -847,7 +880,7 @@ sub writeConfiguration { $parameters = $SCST->initiatorParameters($driver, $target, $group, $init); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { next if (defined($$parameters{$parameter}->{'set'})); if (!$$parameters{$parameter}->{'static'} || @@ -879,21 +912,181 @@ sub applyConfiguration { my $file = shift; my $config = readConfig($file); + + my $handlers = $$config{'HANDLER'}; + my $assignments = $$config{'TARGET_DRIVER'}; + + foreach my $handler (sort keys %{$handlers}) { + if (defined($$handlers{$handler}->{'DEVICE'})) { + my $devices = $$handlers{$handler}->{'DEVICE'}; + + foreach my $device (sort keys %{$devices}) { + next if (handlerHasDevice($handler, $device)); + + my $parameters = configToParm($$devices{$device}->{'CREATE_ATTRIBUTES'}); + openDevice($device, $handler, $parameters); + } + } + } +use Data::Dumper; +print Dumper(\%CURRENT); + foreach my $driver (sort keys %{$assignments}) { + if (!defined($CURRENT{'assign'}->{$driver})) { + immediateExit("Target driver '$driver' is not loaded or available."); + } + + my $targets = $$assignments{$driver}->{'TARGET'}; + foreach my $target (sort keys %{$targets}) { + if (!defined($CURRENT{'assign'}->{$driver}->{$target})) { + immediateExit("Target '$target' for driver '$driver' does not exist."); + } + + my $groups = $$targets{$target}->{'GROUP'}; + foreach my $group (sort keys %{$groups}) { + if (!defined($CURRENT{'assign'}->{$driver}->{$target}->{$group})) { + addGroup($group, $driver, $target); + } + + my $inits = $CURRENT{'assign'}->{$driver}->{$target}->{$group}->{'INITIATORS'}; + my $luns = $CURRENT{'assign'}->{$driver}->{$target}->{$group}->{'LUNS'}; + + if (defined($$groups{$group}->{'LUN'})) { + foreach my $lun (sort keys %{$$groups{$group}->{'LUN'}}) { + if (!defined($$luns{$lun})) { + if ((keys %{$$groups{$group}->{'LUN'}->{$lun}}) > 1) { + immediateExit("Invalid configuration encountered. ". + "Driver/target/group/lun $driver/$target/$group/$lun ". + "has multiple devices assigned."); + } + + foreach my $device (sort keys %{$$groups{$group}->{'LUN'}->{$lun}}) { + my $parameters = configToParm($$groups{$group}->{'LUN'}->{$lun}->{$device}); + addLun($lun, $driver, $target, $group, $device, $parameters); + } + } + } + } + + if (defined($$groups{$group}->{'INITIATOR'})) { + foreach my $initiator (sort keys %{$$groups{$group}->{'INITIATOR'}}) { + if (!groupHasInitiator($inits, $initiator)) { + addInitiator($initiator, $driver, $target, $group); + } + } + } + } + } + } + + my %_parameters; + foreach my $item (keys %{$config}) { + next if ($item eq 'HANDLER'); + next if ($item eq 'TARGET_DRIVER'); + $_parameters{$item} = $$config{$item}; + } + + my $parameters = configToParm(\%_parameters); + + setScstParameters($parameters); } sub clearConfiguration { my $noprompt = shift; my $force = shift; + + my $assignments = $CURRENT{'assign'}; + + foreach my $driver (sort keys %{$assignments}) { + foreach my $target (sort keys %{$$assignments{$driver}}) { + foreach my $group (sort keys %{$$assignments{$driver}->{$target}}) { + clearInitiators($driver, $target, $group); + clearLuns($driver, $target, $group); + removeGroup($group, $driver, $target, $force); + } + } + } + + my $handlers = $CURRENT{'handler'}; + + foreach my $handler (sort keys %{$handlers}) { + foreach my $device (@{$$handlers{$handler}}) { + my $parameters = $SCST->deviceParameters($device); + if (!defined($$parameters{'scsi_device'})) { + closeDevice($device, $handler, $force); + } + } + } } #################################################################### sub listHandlers { my $handler = shift; + + return listHandler($handler) if ($handler); + + my $handlers = $SCST->handlers(); + + my $l_handler; + foreach my $handler (@{$handlers}) { + $l_handler = length($handler) if ($l_handler < length($handler)); + } + + print "\tHandler\n"; + print "\t"; + for (my $x = 0; $x < $l_handler; $x++) { + print "-"; + }; + print "\n"; + + foreach my $handler (@{$handlers}) { + print "\t$handler\n"; + } +} + +sub listHandler { + my $handler = shift; + + my $devices = $SCST->devicesByHandler($handler); + + if ($#{$devices} > -1) { + my $l_device; + foreach my $device (@{$devices}) { + $l_device = length($device) if ($l_device < length($device)); + } + + printf("\t%-*s %-*s\n", length($handler), 'Handler', $l_device, 'Device'); + print "\t"; + for (my $x = 0; $x < (length($handler) + $l_device + 2); $x++) { + print "-"; + }; + print "\n"; + + my $first = TRUE; + foreach my $device (@{$devices}) { + if ($first) { + printf("\t%-*s %-*s\n", length($handler), $handler, $l_device, $device); + $first = FALSE; + } else { + printf("\t%-*s %-*s\n", length($handler), '', $l_device, $device); + } + } + } else { + print "\t(handler '$handler' has no assigned devices)\n"; + } } sub listDevices { my $device = shift; + + listDevice($device) if ($device); + + +} + +sub listDevice { + my $device = shift; + } sub listDrivers { @@ -963,34 +1156,6 @@ sub listTargets { } } -sub listGroups { - my $group = shift; - my $driver = shift; - my $target = shift; - - if ($group && $driver && $target) { - return listGroup($driver, $target, $group); - } - - my $drivers = $SCST->drivers(); - - foreach my $driver (@{$drivers}) { - my $targets = $SCST->targets($driver); - foreach my $target (@{$targets}) { - my $groups = $SCST->groups($driver, $target); - foreach my $group (@{$groups}) { - print "Driver: $driver\n"; - print "Target: $target\n"; - print "Group : $group\n\n"; - - listGroup($driver, $target, $group); - - print "\n\n"; - } - } - } -} - sub listSessions { } @@ -1058,6 +1223,34 @@ sub listGroup { } +sub listGroups { + my $group = shift; + my $driver = shift; + my $target = shift; + + if ($group && $driver && $target) { + return listGroup($driver, $target, $group); + } + + my $drivers = $SCST->drivers(); + + foreach my $driver (@{$drivers}) { + my $targets = $SCST->targets($driver); + foreach my $target (@{$targets}) { + my $groups = $SCST->groups($driver, $target); + foreach my $group (@{$groups}) { + print "Driver: $driver\n"; + print "Target: $target\n"; + print "Group : $group\n\n"; + + listGroup($driver, $target, $group); + + print "\n\n"; + } + } + } +} + sub listExported { my $device = shift; my $parameters = shift; @@ -1095,9 +1288,9 @@ sub listExported { } print "\n"; - foreach my $driver (keys %{$exported}) { - foreach my $target (keys %{$$exported{$driver}}) { - foreach my $group (keys %{$$exported{$driver}->{$target}}) { + foreach my $driver (sort keys %{$exported}) { + foreach my $target (sort keys %{$$exported{$driver}}) { + foreach my $group (sort keys %{$$exported{$driver}->{$target}}) { my $lun = $$exported{$driver}->{$target}->{$group}; printf("\t%-*s %-*s %-*s %-4s\n", $l_driver, $driver, $l_target, $target, $l_group, $group, $lun); @@ -1109,6 +1302,9 @@ sub listExported { } } +sub listScstParameters { +} + sub listHandlerParameters { my $handler = shift; @@ -1181,13 +1377,39 @@ sub listInitiatorParameters { #################################################################### +sub setScstParameters { + my $parameters = shift; + + my $_parameters = $SCST->scstParameters(); + + foreach my $parameter (sort keys %{$parameters}) { + if (defined($$_parameters{$parameter}) && + !$$_parameters{$parameter}->{'static'}) { + my $value = $$parameters{$parameter}; + + next if ($$_parameters{$parameter}->{'value'} eq $value); + + print "-> Setting SCST parameter '$parameter' to '$value': "; + + my $rc = $SCST->setScstParameter($parameter, $value); + + print "done.\n"; + + immediateExit($SCST->errorString($rc)) if ($rc); + } else { + print "-> WARNING: SCST lacks the settable ". + "paraneter '$parameter', ignoring.\n"; + } + } +} + sub setHandlerParameters { my $handler = shift; my $parameters = shift; my $_parameters = $SCST->handlerParameters($handler); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { if (defined($$_parameters{$parameter}) && !$$_parameters{$parameter}->{'static'}) { my $value = $$parameters{$parameter}; @@ -1212,11 +1434,13 @@ sub setDeviceParameters { my $_parameters = $SCST->deviceParameters($device); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { if (defined($$_parameters{$parameter}) && !$$_parameters{$parameter}->{'static'}) { my $value = $$parameters{$parameter}; + next if ($$_parameters{$parameter}->{'value'} eq $value); + print "-> Setting device parameter '$parameter' to value '$value' for device '$device': "; my $rc = $SCST->setDeviceParameter($device, $parameter, $value); @@ -1237,11 +1461,13 @@ sub setDriverParameters { my $_parameters = $SCST->driverParameters($driver); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { if (defined($$_parameters{$parameter}) && !$$_parameters{$parameter}->{'static'}) { my $value = $$parameters{$parameter}; + next if ($$_parameters{$parameter}->{'value'} eq $value); + print "-> Setting driver parameter '$parameter' to value '$value' for driver '$driver': "; my $rc = $SCST->setDriverParameter($driver, $parameter, $value); @@ -1263,11 +1489,13 @@ sub setTargetParameters { my $_parameters = $SCST->targetParameters($driver, $target); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { if (defined($$_parameters{$parameter}) && !$$_parameters{$parameter}->{'static'}) { my $value = $$parameters{$parameter}; + next if ($$_parameters{$parameter}->{'value'} eq $value); + print "-> Setting target parameter '$parameter' to value '$value' for ". "driver/target '$driver/$target': "; @@ -1292,11 +1520,13 @@ sub setLunParameters { my $_parameters = $SCST->lunParameters($driver, $target, $group, $lun); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { if (defined($$_parameters{$parameter}) && !$$_parameters{$parameter}->{'static'}) { my $value = $$parameters{$parameter}; + next if ($$_parameters{$parameter}->{'value'} eq $value); + print "-> Setting LUN parameter '$parameter' to value '$value' for ". "driver/target/group/lun '$driver/$target/$group/$lun': "; @@ -1321,11 +1551,13 @@ sub setInitiatorParameters { my $_parameters = $SCST->initiatorParameters($driver, $target, $group, $initiator); - foreach my $parameter (keys %{$parameters}) { + foreach my $parameter (sort keys %{$parameters}) { if (defined($$_parameters{$parameter}) && !$$_parameters{$parameter}->{'static'}) { my $value = $$parameters{$parameter}; + next if ($$_parameters{$parameter}->{'value'} eq $value); + print "-> Setting initiator parameter '$parameter' to value '$value' for ". "driver/target/group/initiator '$driver/$target/$group/$initiator': "; @@ -1671,6 +1903,61 @@ sub parseLine { } } +#################################################################### + +sub handlerHasDevice { + my $handler = shift; + my $device = shift; + + return FALSE if (!defined($CURRENT{'handler'}->{$handler})); + + foreach my $_device (@{$CURRENT{'handler'}->{$handler}}) { + return TRUE if ($_device eq $device); + } + + return FALSE; +} + +sub groupHasInitiator { + my $initiators = shift; + my $initiator = shift; + + foreach my $_initiator (@{$initiators}) { + return TRUE if ($_initiator eq $initiator); + } + + return FALSE; +} + +sub configToParm { + my $config = shift; + my %parameters; + + foreach my $parm (keys %{$config}) { + if ((keys %{$$config{$parm}}) > 1) { + immediateExit("Invalid configuration encountered. ". + "Parameter '$parm' has multiple values!"); + } + + foreach my $value (keys %{$$config{$parm}}) { + if (keys %{$$config{$parm}->{$value}}) { + immediateExit("Invalid configuration encountered. ". + "Parameter '$parm' has an invalid value."); + } + + $parameters{$parm} = $value; + } + } + + return \%parameters; +} + +sub numerically { + $a <=> $b; +} + +#################################################################### + # If we have an unread error from SCST, exit immediately sub immediateExit { my $error = shift; @@ -1688,7 +1975,3 @@ sub commitSuicide { print "\n\nAborting immediately.\n"; exit 1; } - -sub numerically { - $a <=> $b; -}