mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-17 10:41:26 +00:00
- 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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user