- 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
This commit is contained in:
Mark Buechler
2010-06-15 19:06:38 +00:00
parent 2cab37c2c2
commit ef331b97d5
2 changed files with 191 additions and 71 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}