From: <mga...@us...> - 2010-07-29 15:27:30
|
Revision: 1892 http://scst.svn.sourceforge.net/scst/?rev=1892&view=rev Author: mgandalf Date: 2010-07-29 15:27:24 +0000 (Thu, 29 Jul 2010) Log Message: ----------- Big changes. 1. Simplify attribute setting to use a generic setAttributes() function for anything requiring non-dynamic attributes. 2. Reorder function argument to always be the same as their associated SCST::SCST methods. Modified Paths: -------------- trunk/scstadmin/scstadmin.sysfs/scstadmin Modified: trunk/scstadmin/scstadmin.sysfs/scstadmin =================================================================== --- trunk/scstadmin/scstadmin.sysfs/scstadmin 2010-07-29 14:21:16 UTC (rev 1891) +++ trunk/scstadmin/scstadmin.sysfs/scstadmin 2010-07-29 15:27:24 UTC (rev 1892) @@ -560,11 +560,11 @@ $all_good = TRUE; }; defined($listTarget) && do { - $rc = listTargets($listTarget, $driver); + $rc = listTargets($driver, $listTarget); $all_good = TRUE; }; defined($listGroup) && do { - $rc = listGroups($listGroup, $driver, $target); + $rc = listGroups($driver, $target, $listGroup); $all_good = TRUE; }; $listSessions && do { @@ -588,15 +588,15 @@ $all_good = TRUE; }; $listTargetAttr && do { - $rc = listTargetAttributes($listTargetAttr, $driver); + $rc = listTargetAttributes($driver, $listTargetAttr); $all_good = TRUE; }; $listLunAttr && do { - $rc = listLunAttributes($listLunAttr, $driver, $target, $group); + $rc = listLunAttributes($driver, $target, $group, $listLunAttr); $all_good = TRUE; }; $listInitiatorAttr && do { - $rc = listInitiatorAttributes($listInitiatorAttr, $driver, $target, $group); + $rc = listInitiatorAttributes($driver, $target, $group, $listInitiatorAttr); $all_good = TRUE; }; $setScstAttr && do { @@ -616,23 +616,23 @@ last SWITCH; }; $setTargetAttr && do { - $rc = setTargetAttributes($setTargetAttr, $driver, $attributes, FALSE); + $rc = setTargetAttributes($driver, $setTargetAttr, $attributes, FALSE); last SWITCH; }; $setLunAttr && do { - $rc = setLunAttributes($setLunAttr, $driver, $target, $attributes, $group); + $rc = setLunAttributes($driver, $target, $setLunAttr, $attributes, $group); last SWITCH; }; $setInitiatorAttr && do { - $rc = setInitiatorAttributes($setInitiatorAttr, $driver, $target, $group, $attributes); + $rc = setInitiatorAttributes($driver, $target, $group, $setInitiatorAttr, $attributes); last SWITCH; }; $openDev && do { - $rc = openDevice($openDev, $handler, $attributes); + $rc = openDevice($handler, $openDev, $attributes); last SWITCH; }; $closeDev && do { - $rc = closeDevice($closeDev, $handler, $force); + $rc = closeDevice($handler, $closeDev, $force); last SWITCH; }; $resyncDev && do { @@ -640,23 +640,23 @@ last SWITCH; }; $addGroup && do { - $rc = addGroup($addGroup, $driver, $target); + $rc = addGroup($driver, $target, $addGroup); last SWITCH; }; $removeGroup && do { - $rc = removeGroup($removeGroup, $driver, $target, $force); + $rc = removeGroup($driver, $target, $removeGroup, $force); last SWITCH; }; $addInitiator && do { - $rc = addInitiator($addInitiator, $driver, $target, $group); + $rc = addInitiator($driver, $target, $addInitiator, $group); last SWITCH; }; $removeInitiator && do { - $rc = removeInitiator($removeInitiator, $driver, $target, $group); + $rc = removeInitiator($driver, $target, $group, $removeInitiator); last SWITCH; }; $moveInitiator && do { - $rc = moveInitiator($moveInitiator, $driver, $target, $group, $to); + $rc = moveInitiator($driver, $target, $group, $moveInitiator, $to); last SWITCH; }; $clearInitiators && do { @@ -664,15 +664,15 @@ last SWITCH; }; $addLun && do { - $rc = addLun($addLun, $driver, $target, $device, $attributes, $group); + $rc = addLun($driver, $target, $device, $addLun, $attributes, $group); last SWITCH; }; $removeLun && do { - $rc = removeLun($removeLun, $driver, $target, $device, $group); + $rc = removeLun($driver, $target, $device, $removeLun, $group); last SWITCH; }; $replaceLun && do { - $rc = replaceLun($replaceLun, $driver, $target, $group, $device, $attributes); + $rc = replaceLun($driver, $target, $group, $replaceLun, $device, $attributes); last SWITCH; }; $clearLuns && do { @@ -1402,7 +1402,7 @@ next if (defined($$attributes{'scsi_device'})); if ($deletions) { - closeDevice($device, $handler, $deletions); + closeDevice($handler, $device, $deletions); } else { print "-> Device '$device' is not in configuration. Use -force to close it.\n"; } @@ -1424,13 +1424,18 @@ } my $attributes = configToAttr(\%_attributes); + + if (handlerHasDevice($handler, $device)) { + setDeviceAttributes($device, $attributes, $deletions) + if (scalar keys %{$attributes}); + next; + } + + my $create_attrs = configToAttr($$devices{$device}->{'CREATE_ATTRIBUTES'}); + openDevice($handler, $device, $create_attrs); + setDeviceAttributes($device, $attributes, $deletions) if (scalar keys %{$attributes}); - - next if (handlerHasDevice($handler, $device)); - - my $attributes = configToAttr($$devices{$device}->{'CREATE_ATTRIBUTES'}); - openDevice($device, $handler, $attributes); } } @@ -1463,7 +1468,7 @@ if (!defined($$def_group{'LUN'}->{$lun}->{$device})) { if ($deletions) { - removeLun($lun, $driver, $target, $device); + removeLun($driver, $target, $device, $lun); } else { print "-> Device '$device' at LUN '$lun' is not in configuration ". "for driver/target '$driver/$target'. ". @@ -1483,7 +1488,7 @@ if (!defined($$def_group{'LUN'}->{$lun}->{$device})) { if ($deletions) { - removeLun($lun, $driver, $target, $device, $group); + removeLun($driver, $target, $device, $lun, $group); } else { print "-> Device '$device' at LUN '$lun' is not in configuration ". "for driver/target/group '$driver/$target/$group'. ". @@ -1495,7 +1500,7 @@ foreach my $init (@{$inits}) { if (!defined($$def_group{'INITIATOR'}->{$init})) { if ($deletions) { - removeInitiator($init, $driver, $target, $group); + removeInitiator($driver, $target, $group, $init); } else { print "-> Initiator '$init' is not in configuration ". "for driver/target/group '$driver/$target/$group'. ". @@ -1506,7 +1511,7 @@ if (!defined($$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}->{$target}->{'GROUP'}->{$group})) { if ($deletions) { - removeGroup($group, $driver, $target); + removeGroup($driver, $target, $group); } else { print "-> Group '$group' is not in configuration. Use -force to remove.\n"; } @@ -1575,7 +1580,7 @@ my $attributes = configToAttr(\%_attributes); - setTargetAttributes($target, $driver, $attributes, $deletions); + setTargetAttributes($driver, $target, $attributes, $deletions); } } @@ -1586,7 +1591,7 @@ foreach my $group (sort keys %{$groups}) { if (!defined($CURRENT{'assign'}->{$driver}->{$target}->{'GROUP'}->{$group})) { - addGroup($group, $driver, $target); + addGroup($driver, $target, $group); } @@ -1605,7 +1610,7 @@ my $attributes = configToAttr(\%_attributes); - setGroupAttributes($target, $driver, $group, $attributes); + setGroupAttributes($driver, $target, $group, $attributes); } } @@ -1632,7 +1637,7 @@ foreach my $device (sort keys %{$$luns{$lun}}) { my $attributes = configToAttr($$luns{$lun}->{$device}); - addLun($lun, $driver, $target, $device, $attributes, $group); + addLun($driver, $target, $device, $lun, $attributes, $group); } } } @@ -1648,7 +1653,7 @@ foreach my $initiator (sort keys %{$initiators}) { if (!groupHasInitiator($c_inits, $initiator)) { - addInitiator($initiator, $driver, $target, $group); + addInitiator($driver, $target, $group, $initiator); } } } @@ -1664,7 +1669,7 @@ foreach my $group (sort keys %{$$assignments{$driver}->{$target}->{'GROUP'}}) { clearInitiators($driver, $target, $group); clearLuns($driver, $target, $group); - removeGroup($group, $driver, $target, $force); + removeGroup($driver, $target, $group, $force); } clearLuns($driver, $target); @@ -1683,7 +1688,7 @@ foreach my $device (@{$$handlers{$handler}}) { my $attributes = $SCST->deviceAttributes($device); if (!defined($$attributes{'scsi_device'})) { - closeDevice($device, $handler, $force); + closeDevice($handler, $device, $force); } } } @@ -1908,9 +1913,9 @@ } sub listGroups { - my $group = shift; my $driver = shift; my $target = shift; + my $group = shift; if ($group && $driver && $target) { return listGroup($driver, $target, $group); @@ -2061,82 +2066,243 @@ #################################################################### +sub setScstAttribute { + shift; + shift; + shift; + shift; + my $attribute = shift; + my $value = shift; + + print "-> Setting SCST attribute '$attribute' to value '$value': "; + my $rc = $SCST->setScstAttribute($attribute, $value); + print "done.\n"; + + return $rc; +} + sub setScstAttributes { my $attributes = shift; + my $error = "-> WARNING: SCST lacks the settable attribute '%s', ignoring.\n\n"; my $_attributes = $SCST->scstAttributes(); - foreach my $attribute (sort keys %{$attributes}) { - if (defined($$_attributes{$attribute}) && - !$$_attributes{$attribute}->{'static'}) { - my $value = $$attributes{$attribute}; + return setAttributes(undef, undef, undef, undef, $attributes, + $_attributes, $error, \&setScstAttribute); +} - next if ($$_attributes{$attribute}->{'value'} eq $value); +sub setDeviceAttribute { + shift; + shift; + shift; + my $device = shift; + my $attribute = shift; + my $value = shift; - print "-> Setting SCST attribute '$attribute' to '$value': "; + print "-> Setting device attribute '$attribute' to value '$value' for device '$device': "; + my $rc = $SCST->setDeviceAttribute($device, $attribute, $value); + print "done.\n"; - my $rc = $SCST->setScstAttribute($attribute, $value); + return $rc; +} - print "done.\n"; +sub setDeviceAttributes { + my $device = shift; + my $attributes = shift; - immediateExit($SCST->errorString($rc)) if ($rc); - } else { - print "-> WARNING: SCST lacks the settable ". - "attribute '$attribute', ignoring.\n\n"; - } - } + my $error = "-> WARNING: Device '$device' lacks the settable ". + "attribute '%s', ignoring.\n\n"; + my $_attributes = $SCST->deviceAttributes($device); + + return setAttributes(undef, undef, undef, $device, $attributes, + $_attributes, $error, \&setDeviceAttribute); } +sub setHandlerAttribute { + shift; + shift; + my $handler = shift; + my $attribute = shift; + my $value = shift; + + print "-> Setting handler attribute '$attribute' to value '$value' for handler '$handler': "; + my $rc = $SCST->setHandlerAttribute($handler, $attribute, $value); + print "done.\n"; + + return $rc; +} + sub setHandlerAttributes { my $handler = shift; my $attributes = shift; + my $error = "-> WARNING: Handler '$handler' lacks the settable ". + "attribute '%s', ignoring.\n\n"; my $_attributes = $SCST->handlerAttributes($handler); - foreach my $attribute (sort keys %{$attributes}) { - if (defined($$_attributes{$attribute}) && - !$$_attributes{$attribute}->{'static'}) { - my $value = $$attributes{$attribute}; + return setAttributes(undef, undef, $handler, $attributes, + $_attributes, $error, \&setHandlerAttribute); +} - print "-> Setting handler attribute '$attribute' to '$value' for handler '$handler': "; +sub setGroupAttribute { + shift; + my $driver = shift; + my $target = shift; + my $group = shift; + my $attribute = shift; + my $value = shift; - my $rc = $SCST->setHandlerAttribute($handler, $attribute, $value); + print "-> Setting group attribute '$attribute' to value '$value' for group '$group': "; + my $rc = $SCST->setGroupAttribute($driver, $target, $group, $attribute, $value); + print "done.\n"; - print "done.\n"; + return $rc; +} - immediateExit($SCST->errorString($rc)) if ($rc); - } else { - print "-> WARNING: Handler '$handler' lacks the settable ". - "attribute '$attribute', ignoring.\n\n"; - } +sub setGroupAttributes { + my $driver = shift; + my $target = shift; + my $group = shift; + my $attributes = shift; + + my $error = "-> WARNING: Driver/target/group '$driver/$target/$group' lacks the settable ". + "attribute '%s', ignoring.\n\n"; + my $_attributes = $SCST->groupAttributes($driver, $target, $group); + + return setAttributes(undef, $driver, $target, $group, $attributes, + $_attributes, $error, \&setGroupAttribute); +} + +sub setLunAttribute { + my $driver = shift; + my $target = shift; + my $lun = shift; + my $group = shift; + my $attribute = shift; + my $value = shift; + + if ($group) { + print "-> Setting LUN attribute '$attribute' to value '$value' for ". + "driver/target/group/LUN '$driver/$target/$group/$lun': "; + } else { + print "-> Setting LUN attribute '$attribute' to value '$value' for ". + "driver/target/LUN '$driver/$target/$lun': "; } + + my $rc = $SCST->setLunAttribute($driver, $target, $lun, $attribute, $value, $group); + print "done.\n"; + + return $rc; } -sub setDeviceAttributes { - my $device = shift; +sub setLunAttributes { + my $driver = shift; + my $target = shift; + my $lun = shift; my $attributes = shift; + my $group = shift; + my $error; - my $_attributes = $SCST->deviceAttributes($device); + if ($group) { + $error = "-> WARNING: Driver/target/group/LUN '$driver/$target/$group/$lun' ". + "lacks the settable attribute '%s', ignoring.\n\n"; + } else { + $error = "-> WARNING: Driver/target/LUN '$driver/$target/$lun' lacks the settable ". + "attribute '%s', ignoring.\n\n"; + } - foreach my $attribute (sort keys %{$attributes}) { - if (defined($$_attributes{$attribute}) && - !$$_attributes{$attribute}->{'static'}) { - my $value = $$attributes{$attribute}; + my $_attributes = $SCST->lunAttributes($driver, $target, $lun, $group); - next if ($$_attributes{$attribute}->{'value'} eq $value); + return setAttributes($driver, $target, $lun, $group, $attributes, + $_attributes, $error, \&setLunAttribute); +} - print "-> Setting device attribute '$attribute' to value '$value' for device '$device': "; +sub setInitiatorAttribute { + my $driver = shift; + my $target = shift; + my $group = shift; + my $initiator = shift; + my $attribute = shift; + my $value = shift; - my $rc = $SCST->setDeviceAttribute($device, $attribute, $value); + print "-> Setting initiator attribute '$attribute' to value '$value' for ". + "driver/target/group/initiator '$driver/$target/$group/initiator': "; + my $rc = $SCST->setInitiatorAttribute($driver, $target, $group, + $initiator, $attribute, $value); + print "done.\n"; - print "done.\n"; + return $rc; +} - immediateExit($SCST->errorString($rc)) if ($rc); +sub setInitiatorAttributes { + my $driver = shift; + my $target = shift; + my $group = shift; + my $initiator = shift; + my $attributes = shift; + + my $error = "-> WARNING: Driver/target/group/initiator '$driver/$target/$group/$initiator' ". + "lacks the settable attribute '%s', ignoring.\n\n"; + my $_attributes = $SCST->initiatorAttributes($driver, $target, $group, $initiator); + + return setAttributes($driver, $target, $group, $initiator, $attributes, + $_attributes, $error, \&setInitiatorAttribute); +} + +# Sets any non-dynamic attributes +sub setAttributes { + my $level1 = shift; + my $level2 = shift; + my $level3 = shift; + my $level4 = shift; + my $attributes = shift; + my $_attributes = shift; + my $error = shift; + my $callback = shift; + my %toset; + my %existing; + + # build caches for easier matching + foreach my $attribute (keys %{$attributes}) { + if (ref($$attributes{$attribute}) eq 'ARRAY') { + foreach my $value (@{$$attributes{$attribute}}) { + $toset{$attribute}->{$value}++; + } } else { - print "-> WARNING: Device '$device' lacks the settable ". - "attribute '$attribute', ignoring.\n\n"; + $toset{$attribute}->{$$attributes{$attribute}}++; } } + + foreach my $attribute (keys %{$_attributes}) { + next if ($$_attributes{$attribute}->{'static'}); + + if (defined($$_attributes{$attribute}->{'keys'})) { + foreach my $key (keys %{$$_attributes{$attribute}->{'keys'}}) { + my $value = $$_attributes{$attribute}->{'keys'}->{$key}->{'value'}; + $existing{$attribute}->{$value}++ + if (defined($value) && ($value ne '')); + } + } else { + my $value = $$_attributes{$attribute}->{'value'}; + $existing{$attribute}->{$value} = FALSE + if (defined($value) && ($value ne '')); + } + } + + foreach my $attribute (keys %toset) { + foreach my $value (keys %{$toset{$attribute}}) { + if (!defined($existing{$attribute})) { + print sprintf($error, $attribute); + next; + } + + # already set, move on + next if (defined($existing{$attribute}->{$value})); + + # Set the existing attribute + $callback->($level1, $level2, $level3, $level4, $attribute, $value); + } + } } sub setDriverAttribute { @@ -2195,6 +2361,10 @@ $driverCap && !$SCST->checkDriverDynamicAttributes($driver, $attribute)) { addDriverDynamicAttribute($driver, $attribute, $value); next; + } elsif (!defined($existing{$attribute})) { + print "-> WARNING: Driver '$driver' lacks the settable attribute ". + "'$attribute', ignoring.\n\n"; + next; } # already set, move on @@ -2257,8 +2427,8 @@ } sub setTargetAttribute { + my $driver = shift; my $target = shift; - my $driver = shift; my $attribute = shift; my $value = shift; @@ -2271,8 +2441,8 @@ } sub setTargetAttributes { + my $driver = shift; my $target = shift; - my $driver = shift; my $attributes = shift; my $deletions = shift; my %toset; @@ -2316,6 +2486,10 @@ $driverCap && !$SCST->checkTargetDynamicAttributes($driver, $attribute)) { addTargetDynamicAttribute($driver, $target, $attribute, $value); next; + } elsif (!defined($existing{$attribute})) { + print "-> WARNING: Driver/target '$driver/$target' lacks the settable attribute ". + "'$attribute', ignoring.\n\n"; + next; } # already set, move on @@ -2328,7 +2502,7 @@ if ($driverCap && !$SCST->checkTargetDynamicAttributes($driver, $attribute)) { addTargetDynamicAttribute($driver, $target, $attribute, $value); } else { - setTargetAttribute($target, $driver, $attribute, $value); + setTargetAttribute($driver, $target, $attribute, $value); } $existing{$attribute}->{$value} = TRUE; @@ -2380,104 +2554,11 @@ immediateExit($SCST->errorString($rc)) if ($rc); } -sub setGroupAttributes { - my $target = shift; - my $driver = shift; - my $group = shift; - my $attributes = shift; - - my $_attributes = $SCST->groupAttributes($driver, $target, $group); - - foreach my $attribute (sort keys %{$attributes}) { - if (defined($$_attributes{$attribute}) && - !$$_attributes{$attribute}->{'static'}) { - my $value = $$attributes{$attribute}; - - next if ($$_attributes{$attribute}->{'value'} eq $value); - - print "-> Setting group attribute '$attribute' to value '$value' for ". - "driver/target/group '$driver/$target/$group': "; - - my $rc = $SCST->setGroupAttribute($driver, $target, $group, $attribute, $value); - - print "done.\n"; - - immediateExit($SCST->errorString($rc)) if ($rc); - } else { - print "-> WARNING: Driver/target/group '$driver/$target/$group' lacks the settable ". - "attribute '$attribute', ignoring.\n\n"; - } - } -} - -sub setLunAttributes { - my $lun = shift; - my $driver = shift; - my $target = shift; - my $attributes = shift; - my $group = shift; - - my $_attributes = $SCST->lunAttributes($driver, $target, $lun, $group); - - foreach my $attribute (sort keys %{$attributes}) { - if (defined($$_attributes{$attribute}) && - !$$_attributes{$attribute}->{'static'}) { - my $value = $$attributes{$attribute}; - - next if ($$_attributes{$attribute}->{'value'} eq $value); - - print "-> Setting LUN attribute '$attribute' to value '$value' for ". - "driver/target/group/lun '$driver/$target/$group/$lun': "; - - my $rc = $SCST->setLunAttribute($driver, $target, $lun, $attribute, $value, $group); - - print "done.\n"; - - immediateExit($SCST->errorString($rc)) if ($rc); - } else { - print "-> WARNING: Driver/target/group/lun '$driver/$target/$group/$lun' lacks the settable ". - "attribute '$attribute', ignoring.\n\n"; - } - } -} - -sub setInitiatorAttributes { - my $initiator = shift; - my $driver = shift; - my $target = shift; - my $group = shift; - my $attributes = shift; - - my $_attributes = $SCST->initiatorAttributes($driver, $target, $group, $initiator); - - foreach my $attribute (sort keys %{$attributes}) { - if (defined($$_attributes{$attribute}) && - !$$_attributes{$attribute}->{'static'}) { - my $value = $$attributes{$attribute}; - - next if ($$_attributes{$attribute}->{'value'} eq $value); - - print "-> Setting initiator attribute '$attribute' to value '$value' for ". - "driver/target/group/initiator '$driver/$target/$group/$initiator': "; - - my $rc = $SCST->setInitiatorAttribute($driver, $target, $group, $initiator, - $attribute, $value); - - print "done.\n"; - - immediateExit($SCST->errorString($rc)) if ($rc); - } else { - print "-> WARNING: Driver/target/group/initiator '$driver/$target/$group/$initiator' ". - "lacks the settable attribute '$attribute', ignoring.\n\n"; - } - } -} - #################################################################### sub openDevice { + my $handler = shift; my $device = shift; - my $handler = shift; my $attributes = shift; print "-> Opening device '$device' using handler '$handler': "; @@ -2490,8 +2571,8 @@ } sub closeDevice { + my $handler = shift; my $device = shift; - my $handler = shift; my $force = shift; my $attributes = $SCST->deviceAttributes($device); @@ -2527,9 +2608,9 @@ #################################################################### sub addGroup { - my $group = shift; my $driver = shift; my $target = shift; + my $group = shift; print "-> Adding new group '$group' to driver/target '$driver/$target': "; @@ -2541,9 +2622,9 @@ } sub removeGroup { - my $group = shift; my $driver = shift; my $target = shift; + my $group = shift; my $force = shift; if (!$force) { @@ -2568,10 +2649,10 @@ #################################################################### sub addInitiator { - my $initiator = shift; my $driver = shift; my $target = shift; my $group = shift; + my $initiator = shift; print "-> Adding new initiator '$initiator' to driver/target/group ". "'$driver/$target/$group': "; @@ -2584,10 +2665,10 @@ } sub removeInitiator { - my $initiator = shift; my $driver = shift; my $target = shift; my $group = shift; + my $initiator = shift; print "-> Removing initiator '$initiator' from driver/target/group ". "'$driver/$target/$group': "; @@ -2600,10 +2681,10 @@ } sub moveInitiator { - my $initiator = shift; my $driver = shift; my $target = shift; my $group = shift; + my $initiator = shift; my $to = shift; print "-> Moving initiator '$initiator' from group '$group' to group '$to': "; @@ -2632,10 +2713,10 @@ #################################################################### sub addLun { - my $lun = shift; my $driver = shift; my $target = shift; my $device = shift; + my $lun = shift; my $attributes = shift; my $group = shift; @@ -2655,10 +2736,10 @@ } sub removeLun { - my $lun = shift; my $driver = shift; my $target = shift; my $device = shift; + my $lun = shift; my $group = shift; if ($group) { @@ -2677,10 +2758,10 @@ } sub replaceLun { - my $lun = shift; my $driver = shift; my $target = shift; my $group = shift; + my $lun = shift; my $device = shift; my $attributes = shift; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |