From ef331b97d5aac9bc765a0c0b673697b072cf2b90 Mon Sep 17 00:00:00 2001 From: Mark Buechler Date: Tue, 15 Jun 2010 19:06:38 +0000 Subject: [PATCH] - More work on dynamic attributes. Both hardware and virtual targets/drivers should be working at this point. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1775 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scstadmin/scst-0.9.00/lib/SCST/SCST.pm | 96 +++++++++----- scstadmin/scstadmin.sysfs | 166 +++++++++++++++++++------ 2 files changed, 191 insertions(+), 71 deletions(-) diff --git a/scstadmin/scst-0.9.00/lib/SCST/SCST.pm b/scstadmin/scst-0.9.00/lib/SCST/SCST.pm index 911b9c063..8e36ae2e3 100644 --- a/scstadmin/scst-0.9.00/lib/SCST/SCST.pm +++ b/scstadmin/scst-0.9.00/lib/SCST/SCST.pm @@ -616,8 +616,14 @@ sub checkDriverDynamicAttributes { return SCST_C_FATAL_ERROR if (!defined($available)); - foreach my $attribute (keys %{$check}) { - if (!defined($$available{$attribute})) { + if (ref($check) eq 'HASH') { + foreach my $attribute (keys %{$check}) { + if (!defined($$available{$attribute})) { + return TRUE; + } + } + } else { + if (!defined($$available{$check})) { return TRUE; } } @@ -635,12 +641,10 @@ sub addDriverDynamicAttribute { return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); - return SCST_C_DRV_NOTVIRT if ($self->driverIsVirtualCapable($driver)); + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - my %attributes = ($attribute); - - $rc = $self->checkDriverDynamicAttributes($driver, \%attributes); - return SCST_C_DRV_BAD_ATTRIBUTES if (!$rc); + $rc = $self->checkDriverDynamicAttributes($driver, $attribute); + return SCST_C_DRV_BAD_ATTRIBUTES if ($rc == 1); return $rc if ($rc > 1); my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, SCST_MGMT_IO); @@ -675,12 +679,10 @@ sub removeDriverDynamicAttribute { return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); - return SCST_C_DRV_NOTVIRT if ($self->driverIsVirtualCapable($driver)); + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - my %attributes = ($attribute); - - $rc = $self->checkDriverDynamicAttributes($driver, \%attributes); - return SCST_C_DRV_BAD_ATTRIBUTES if (!$rc); + $rc = $self->checkDriverDynamicAttributes($driver, $attribute); + return SCST_C_DRV_BAD_ATTRIBUTES if ($rc == 1); return $rc if ($rc > 1); my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, SCST_MGMT_IO); @@ -775,7 +777,7 @@ sub addVirtualTarget { return SCST_C_TGT_EXISTS if ($rc); return $rc if ($rc > 1); - return SCST_C_DRV_NOTVIRT if ($self->driverIsVirtualCapable($driver)); + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); $rc = $self->checkTargetCreateAttributes($driver, $attributes); return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == TRUE); @@ -862,8 +864,14 @@ sub checkTargetDynamicAttributes { return SCST_C_FATAL_ERROR if (!defined($available)); - foreach my $attribute (keys %{$check}) { - if (!defined($$available{$attribute})) { + if (ref($check) eq 'HASH') { + foreach my $attribute (keys %{$check}) { + if (!defined($$available{$attribute})) { + return TRUE; + } + } + } else { + if (!defined($$available{$check})) { return TRUE; } } @@ -886,12 +894,10 @@ sub addTargetDynamicAttribute { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - return SCST_C_DRV_NOTVIRT if ($self->driverIsVirtualCapable($driver)); + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - my %attributes = ($attribute); - - $rc = $self->checkTargetDynamicAttributes($driver, \%attributes); - return SCST_C_TGT_BAD_ATTRIBUTES if (!$rc); + $rc = $self->checkTargetDynamicAttributes($driver, $attribute); + return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == 1); return $rc if ($rc > 1); my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, SCST_MGMT_IO); @@ -930,12 +936,10 @@ sub removeTargetDynamicAttribute { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - return SCST_C_DRV_NOTVIRT if ($self->driverIsVirtualCapable($driver)); + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - my %attributes = ($attribute); - - $rc = $self->checkTargetDynamicAttributes($driver, \%attributes); - return SCST_C_TGT_BAD_ATTRIBUTES if (!$rc); + $rc = $self->checkTargetDynamicAttributes($driver, $attribute); + return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == 1); return $rc if ($rc > 1); my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, SCST_MGMT_IO); @@ -972,7 +976,7 @@ sub removeVirtualTarget { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - return SCST_C_DRV_NOTVIRT if ($self->driverIsVirtualCapable($driver)); + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, SCST_MGMT_IO); @@ -2696,8 +2700,14 @@ sub checkDeviceCreateAttributes { return SCST_C_FATAL_ERROR if (!defined($available)); - foreach my $attribute (keys %{$check}) { - if (!defined($$available{$attribute})) { + if (ref($check) eq 'HASH') { + foreach my $attribute (keys %{$check}) { + if (!defined($$available{$attribute})) { + return TRUE; + } + } + } else { + if (!defined($$available{$check})) { return TRUE; } } @@ -2877,8 +2887,14 @@ sub checkTargetCreateAttributes { return SCST_C_FATAL_ERROR if (!defined($available)); - foreach my $attribute (keys %{$check}) { - if (!defined($$available{$attribute})) { + if (ref($check) eq 'HASH') { + foreach my $attribute (keys %{$check}) { + if (!defined($$available{$attribute})) { + return TRUE; + } + } + } else { + if (!defined($$available{$check})) { return TRUE; } } @@ -2977,8 +2993,14 @@ sub checkLunCreateAttributes { return SCST_C_FATAL_ERROR if (!defined($available)); - foreach my $attribute (keys %{$check}) { - if (!defined($$available{$attribute})) { + if (ref($check) eq 'HASH') { + foreach my $attribute (keys %{$check}) { + if (!defined($$available{$attribute})) { + return TRUE; + } + } + } else { + if (!defined($$available{$check})) { return TRUE; } } @@ -3073,8 +3095,14 @@ sub checkInitiatorCreateAttributes { return SCST_C_FATAL_ERROR if (!defined($available)); - foreach my $attribute (keys %{$check}) { - if (!defined($$available{$attribute})) { + if (ref($check) eq 'HASH') { + foreach my $attribute (keys %{$check}) { + if (!defined($$available{$attribute})) { + return TRUE; + } + } + } else { + if (!defined($$available{$check})) { return TRUE; } } diff --git a/scstadmin/scstadmin.sysfs b/scstadmin/scstadmin.sysfs index a46ed3cea..d34d4d4a6 100755 --- a/scstadmin/scstadmin.sysfs +++ b/scstadmin/scstadmin.sysfs @@ -1572,7 +1572,10 @@ sub clearConfiguration { } clearLuns($driver, $target); + removeTargetDynamicAttributes($driver, $target); } + + removeDriverDynamicAttributes($driver); } my $handlers = $CURRENT{'handler'}; @@ -2058,22 +2061,37 @@ sub setDriverAttributes { $$_attributes{$attribute}->{'keys'}); } } - } else { + } elsif ($SCST->driverIsVirtualCapable($driver) && + !$SCST->checkDriverDynamicAttributes($driver, $attribute)) { # Maybe we can add it.. - my $value = $$attributes{$attribute}; - my $rc = 1; - if ($SCST->driverIsVirtualCapable($driver)) { - print "-> Attempting to add driver attribute '$attribute' with value '$value' for driver '$driver': "; - $rc = $SCST->addDriverDynamicAttribute($driver, $attribute, $value); - print "done.\n"; + if (ref($$attributes{$attribute}) eq 'ARRAY') { + foreach my $value (@{$$attributes{$attribute}}) { + my $rc = addDriverDynamicAttribute($driver, $attribute, $value); + immediateExit($SCST->errorString($rc)) if ($rc); + } + } else { + my $rc = addDriverDynamicAttribute($driver, $attribute, $$attributes{$attribute}); + immediateExit($SCST->errorString($rc)) if ($rc); } - + } else { print "\t-> WARNING: Driver '$driver' lacks the settable ". - "attribute '$attribute', ignoring.\n" if ($rc); + "attribute '$attribute', ignoring.\n"; } } } +sub addDriverDynamicAttribute { + my $driver = shift; + my $attribute = shift; + my $value = shift; + + print "-> Attempting to add driver attribute '$attribute' with value '$value' for driver '$driver': "; + my $rc = $SCST->addDriverDynamicAttribute($driver, $attribute, $value); + print "done.\n"; + + return $rc; +} + sub checkDriverKeyAttributes { my $driver = shift; my $attribute = shift; @@ -2088,13 +2106,13 @@ sub checkDriverKeyAttributes { } } - if (!$found) { - print "-> Attempting to add driver attribute '$attribute' with value '$value' for driver '$driver': "; - my $rc = $SCST->addDriverAttribute($driver, $attribute, $value); - print "done.\n"; - - print "\t-> WARNING: Unable to add attribute '$attribute' with value ". - "'$value' to driver '$driver': ".$SCST->errorString($rc)."\n" if ($rc); + if (!$found && $SCST->driverIsVirtualCapable($driver) && + !$SCST->checkDriverDynamicAttributes($driver, $attribute)) { + my $rc = addDriverDynamicAttribute($driver, $attribute, $value); + immediateExit($SCST->errorString($rc)) if ($rc); + } elsif (!$found) { + print "\t-> WARNING: Driver '$driver' lacks the settable ". + "attribute '$attribute', ignoring.\n"; } } @@ -2133,23 +2151,41 @@ sub setTargetAttributes { $$_attributes{$attribute}->{'keys'}); } } - - } else { + } elsif ($SCST->driverIsVirtualCapable($driver) && + !$SCST->checkTargetDynamicAttributes($driver, $attribute)) { # Maybe we can add it.. - my $value = $$attributes{$attribute}; - my $rc = 1; - if ($SCST->driverIsVirtualCapable($driver)) { - print "-> Attempting to add driver attribute '$attribute' with value '$value' for driver/target '$driver/$target': "; - $rc = $SCST->addTargetDynamicAttribute($driver, $target, $attribute, $value); - print "done.\n"; + if (ref($$attributes{$attribute}) eq 'ARRAY') { + foreach my $value (@{$$attributes{$attribute}}) { + my $rc = addTargetDynamicAttribute($driver, $target, $attribute, $value); + immediateExit($SCST->errorString($rc)) if ($rc); + } + } else { + my $rc = addTargetDynamicAttribute($driver, $target, $attribute, + $$attributes{$attribute}); + immediateExit($SCST->errorString($rc)) if ($rc); } + } else { print "\t-> WARNING: Driver/target '$driver/$target' lacks the settable ". - "attribute '$attribute', ignoring.\n" if ($rc); + "attribute '$attribute', ignoring.\n"; } } } +sub addTargetDynamicAttribute { + my $driver = shift; + my $target = shift; + my $attribute = shift; + my $value = shift; + + print "-> Attempting to add driver attribute '$attribute' with value '$value' ". + "for driver/target '$driver/$target': "; + my $rc = $SCST->addTargetDynamicAttribute($driver, $target, $attribute, $value); + print "done.\n"; + + return $rc; +} + sub checkTargetKeyAttributes { my $driver = shift; my $target = shift; @@ -2165,14 +2201,17 @@ sub checkTargetKeyAttributes { } } - if (!$found) { - my $rc = $SCST->addTargetDynamicAttribute($driver, $target, $attribute, $value); - - print "-> WARNING: Unable to add attribute '$attribute' with value ". - "'$value' to driver/target '$driver/$target': ".$SCST->errorString($rc)."\n" if ($rc); + if (!$found && $SCST->driverIsVirtualCapable($driver) && + !$SCST->checkTargetDynamicAttributes($driver, $attribute)) { + my $rc = addTargetDynamicAttribute($driver, $target, $attribute, $value); + immediateExit($SCST->errorString($rc)) if ($rc); + } elsif (!$found) { + print "\t-> WARNING: Target '$target' lacks the settable ". + "attribute '$attribute', ignoring.\n"; } } + sub setGroupAttributes { my $target = shift; my $driver = shift; @@ -2501,6 +2540,59 @@ sub clearLuns { immediateExit($SCST->errorString($rc)) if ($rc); } +sub removeDriverDynamicAttributes { + my $driver = shift; + + return if (!$SCST->driverIsVirtualCapable($driver)); + + print "-> Removing all dynamic attributes from driver '$driver': "; + + my $attributes = $SCST->driverAttributes($driver); + my $dynamic = $SCST->driverDynamicAttributes($driver); + + foreach my $attribute (keys %{$attributes}) { + if (defined($$dynamic{$attribute})) { + if (defined($$attributes{$attribute}->{'keys'})) { + foreach my $key (keys %{$$attributes{$attribute}->{'keys'}}) { + my $value = $$attributes{$attribute}->{'keys'}->{$key}->{'value'}; + my $rc = $SCST->removeDriverDynamicAttribute($driver, $attribute, $value); + + immediateExit($SCST->errorString($rc)) if ($rc); + } + } + } + } + + print "done.\n"; +} + +sub removeTargetDynamicAttributes { + my $driver = shift; + my $target = shift; + + return if (!$SCST->driverIsVirtualCapable($driver)); + + print "-> Removing all dynamic attributes from driver/target '$driver/$target': "; + + my $attributes = $SCST->targetAttributes($driver, $target); + my $dynamic = $SCST->targetDynamicAttributes($driver); + + foreach my $attribute (keys %{$attributes}) { + if (defined($$dynamic{$attribute})) { + if (defined($$attributes{$attribute}->{'keys'})) { + foreach my $key (keys %{$$attributes{$attribute}->{'keys'}}) { + my $value = $$attributes{$attribute}->{'keys'}->{$key}->{'value'}; + my $rc = $SCST->removeTargetDynamicAttribute($driver, $target, $attribute, $value); + + immediateExit($SCST->errorString($rc)) if ($rc); + } + } + } + } + + print "done.\n"; +} + #################################################################### sub enableTarget { @@ -2813,15 +2905,15 @@ sub configToAttr { foreach my $value (keys %{$$config{$attr}}) { push @{$attributes{$attr}}, $value if ($value); } - } + } else { + foreach my $value (keys %{$$config{$attr}}) { + if (keys %{$$config{$attr}->{$value}}) { + immediateExit("Invalid configuration encountered. ". + "Attribute '$attr' has an invalid value."); + } - foreach my $value (keys %{$$config{$attr}}) { - if (keys %{$$config{$attr}->{$value}}) { - immediateExit("Invalid configuration encountered. ". - "Attribute '$attr' has an invalid value."); + $attributes{$attr} = $value; } - - $attributes{$attr} = $value; } }