- Finish up handling LUNs outside of groups. This should now

work with iscsi (and any driver/target which supports not
  using ini_groups).
- Add support for creating/deleting targets.



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1732 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Mark Buechler
2010-06-01 18:25:45 +00:00
parent 0007914f1d
commit 2fe68c6554
2 changed files with 253 additions and 110 deletions

View File

@@ -67,9 +67,13 @@ SCST_C_TGT_EXISTS => 41,
SCST_C_TGT_ADD_FAIL => 42,
SCST_C_TGT_REM_FAIL => 43,
SCST_C_TGT_SETATTR_FAIL => 44,
SCST_C_TGT_NO_LUN => 54,
SCST_C_TGT_ADD_LUN_FAIL => 45,
SCST_C_TGT_LUN_EXISTS => 46,
SCST_C_TGT_BAD_PARAMETERS => 47,
SCST_C_TGT_PARAMETER_STATIC => 48,
SCST_C_TGT_SETPARAM_FAIL => 49,
SCST_C_TGT_CLR_LUN_FAIL => 55,
SCST_C_GRP_NO_GROUP => 50,
SCST_C_GRP_EXISTS => 51,
@@ -132,9 +136,14 @@ my %VERBOSE_ERROR = (
(SCST_C_TGT_EXISTS) => 'Target already exists.',
(SCST_C_TGT_ADD_FAIL) => 'Failed to add target. See "dmesg" for more information.',
(SCST_C_TGT_REM_FAIL) => 'Failed to remove target. See "dmesg" for more information.',
(SCST_C_TGT_SETATTR_FAIL) => 'Failed to set target attribute. See "dmesg" for more information.',
(SCST_C_TGT_NO_LUN) => 'No such LUN exists.',
(SCST_C_TGT_ADD_LUN_FAIL) => 'Failed to add LUN. See "dmesg" for more information.',
(SCST_C_TGT_LUN_EXISTS) => 'LUN already exists.',
(SCST_C_TGT_BAD_PARAMETERS) => 'Bad parameters given for target.',
(SCST_C_TGT_PARAMETER_STATIC) => 'Target parameter specified is static.',
(SCST_C_TGT_SETPARAM_FAIL) => 'Failed to set target parameter. See "dmesg" for more information.',
(SCST_C_TGT_CLR_LUN_FAIL) => 'Failed to clear LUNs from target. See "dmesg" for more information.',
(SCST_C_GRP_NO_GROUP) => 'No such group exists.',
(SCST_C_GRP_EXISTS) => 'Group already exists.',
@@ -464,14 +473,22 @@ sub luns {
return undef;
}
if ($self->groupExists($driver, $target, $group) != TRUE) {
$self->{'err_string'} = "initiators(): Group '$group' does not exist";
return undef;
my $_path;
if ($group) {
if ($self->groupExists($driver, $target, $group) != TRUE) {
$self->{'err_string'} = "initiators(): Group '$group' does not exist";
return undef;
}
$_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS);
} else {
$_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS);
}
my $lHandle = new IO::Handle;
my $_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS);
if (!(opendir $lHandle, $_path)) {
$self->{'err_string'} = "luns(): Unable to read directory '$_path': $!";
return undef;
@@ -480,11 +497,9 @@ sub luns {
foreach my $lun (readdir($lHandle)) {
next if (($lun eq '.') || ($lun eq '..'));
if (-d mkpath(SCST_ROOT, SCST_TARGETS, $driver,
$target, SCST_GROUPS, $group, SCST_LUNS, $lun)) {
my $lPath = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target,
SCST_GROUPS, $group, SCST_LUNS, $lun);
my $lPath = mkpath($_path, $lun);
if (-d $lPath) {
my $_lHandle = new IO::Handle;
if (!(opendir $_lHandle, $lPath)) {
@@ -493,8 +508,7 @@ sub luns {
}
foreach my $parameter (readdir($_lHandle)) {
my $pPath = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target,
SCST_GROUPS, $group, SCST_LUNS, $lun, $parameter);
my $pPath = mkpath($lPath, $parameter);
if (-l $pPath) {
my $linked = readlink($pPath);
@@ -543,7 +557,7 @@ sub addDriverAttribute {
my $io = new IO::File $path, O_WRONLY;
return SCST_C_TGT_ADD_FAIL if (!$io);
return SCST_C_TGT_ADD_FAIL if (!$io); # FIXME
}
@@ -597,12 +611,12 @@ sub addTarget {
return $rc if ($rc > 1);
$rc = $self->targetExists($driver, $target);
return SCST_C_TGT_EXISTS if (!$rc);
return SCST_C_TGT_EXISTS if ($rc);
return $rc if ($rc > 1);
return SCST_C_DRV_STATIC if ($self->driverIsStatic($driver));
$rc = $self->checkTargetCreateParameters($driver, $target, $parameters);
$rc = $self->checkTargetCreateParameters($driver, $parameters);
return SCST_C_TGT_BAD_PARAMETERS if ($rc == TRUE);
return $rc if ($rc > 1);
@@ -635,7 +649,7 @@ sub addTarget {
}
sub addTargetAttribute {
print "NOT YET IMPLEMENTED\n";
}
sub removeTarget {
@@ -727,16 +741,26 @@ sub lunExists {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $lun = shift;
my $group = shift;
return FALSE if (!defined($lun));
my $rc = $self->groupExists($driver, $target, $group);
return FALSE if (!$rc);
my $rc = $self->driverExists($driver);
return SCST_C_DRV_NO_DRIVER if (!$rc);
return $rc if ($rc > 1);
$rc = $self->targetExists($driver, $target);
return SCST_C_TGT_EXISTS if (!$rc);
return $rc if ($rc > 1);
if ($group) {
my $rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
}
my $luns = $self->luns($driver, $target, $group);
return SCST_C_FATAL_ERROR if (!defined($luns));
@@ -1016,12 +1040,13 @@ sub addLun {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $device = shift;
my $lun = shift;
my $parameters = shift;
my $group = shift;
return SCST_C_GRP_ADD_LUN_FAIL if (!defined($lun));
my $err = SCST_C_TGT_ADD_LUN_FAIL;
my $err2 = SCST_C_TGT_LUN_EXISTS;
my $rc = $self->driverExists($driver);
return SCST_C_DRV_NO_DRIVER if (!$rc);
@@ -1031,28 +1056,39 @@ sub addLun {
return SCST_C_TGT_NO_TARGET if (!$rc);
return $rc if ($rc > 1);
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
$rc = $self->lunExists($driver, $target, $group, $lun);
return SCST_C_GRP_LUN_EXISTS if ($rc == TRUE);
return $rc if ($rc > 1);
$rc = $self->deviceOpen($device);
return SCST_C_DEV_NO_DEVICE if (!$rc);
return $rc if ($rc > 1);
$rc = $self->checkLunCreateParameters($driver, $target, $group, $parameters);
$rc = $self->checkLunCreateParameters($driver, $target, $parameters, $group);
return SCST_C_LUN_BAD_PARAMETERS if ($rc == TRUE);
return $rc if ($rc > 1);
my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
my $path;
if ($group) {
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
$err = SCST_C_GRP_ADD_LUN_FAIL;
$err2 = SCST_C_GRP_LUN_EXISTS;
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
} else {
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS, SCST_MGMT_IO);
}
return $err if (!defined($lun));
$rc = $self->lunExists($driver, $target, $lun, $group);
return $err2 if ($rc == TRUE);
return $rc if ($rc > 1);
my $io = new IO::File $path, O_WRONLY;
return SCST_C_GRP_ADD_LUN_FAIL if (!$io);
return $err if (!$io);
my $o_string;
foreach my $parameter (keys %{$parameters}) {
@@ -1074,16 +1110,19 @@ sub addLun {
close $io;
return FALSE if ($self->{'debug'} || $bytes);
return SCST_C_GRP_ADD_LUN_FAIL;
return $err;
}
sub removeLun {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $device = shift;
my $lun = shift;
my $group = shift;
my $err = SCST_C_TGT_ADD_LUN_FAIL;
my $err2 = SCST_C_TGT_NO_LUN;
my $rc = $self->driverExists($driver);
return SCST_C_DRV_NO_DRIVER if (!$rc);
@@ -1093,24 +1132,35 @@ sub removeLun {
return SCST_C_TGT_NO_TARGET if (!$rc);
return $rc if ($rc > 1);
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
my $path;
$rc = $self->lunExists($driver, $target, $group, $lun);
return SCST_C_GRP_NO_LUN if (!$rc);
if ($group) {
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
$err = SCST_C_GRP_REM_LUN_FAIL;
$err2 = SCST_C_GRP_NO_LUN;
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
} else {
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS, SCST_MGMT_IO);
}
return $err if (!defined($lun));
$rc = $self->lunExists($driver, $target, $lun, $group);
return $err2 if (!$rc);
return $rc if ($rc > 1);
my $luns = $self->luns($driver, $target, $group);
return SCST_C_GRP_REM_LUN_FAIL if ($$luns{$lun} ne $device);
my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
return $err if ($$luns{$lun} ne $device);
my $io = new IO::File $path, O_WRONLY;
return SCST_C_GRP_REM_LUN_FAIL if (!$io);
return $err if (!$io);
my $cmd = "del $device $lun\n";
my $bytes;
@@ -1124,17 +1174,19 @@ sub removeLun {
close $io;
return FALSE if ($self->{'debug'} || $bytes);
return SCST_C_GRP_REM_LUN_FAIL;
return $err;
}
sub replaceLun {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $lun = shift;
my $device = shift;
my $parameters = shift;
my $group = shift;
my $err = SCST_C_TGT_NO_LUN;
return TRUE if (!defined($lun));
@@ -1146,19 +1198,30 @@ sub replaceLun {
return SCST_C_TGT_NO_TARGET if (!$rc);
return $rc if ($rc > 1);
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
my $path;
$rc = $self->lunExists($driver, $target, $group, $lun);
return SCST_C_GRP_NO_LUN if (!$rc);
if ($group) {
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
$err = SCST_C_GRP_NO_LUN;
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
} else {
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS, SCST_MGMT_IO);
}
$rc = $self->lunExists($driver, $target, $lun, $group);
return $err if (!$rc);
return $rc if ($rc > 1);
$rc = $self->deviceOpen($device);
return SCST_C_DEV_NO_DEVICE if (!$rc);
return $rc if ($rc > 1);
$rc = $self->checkLunCreateParameters($driver, $target, $group, $parameters);
$rc = $self->checkLunCreateParameters($driver, $target, $parameters, $group);
return SCST_C_LUN_BAD_PARAMETERS if ($rc == TRUE);
return $rc if ($rc > 1);
@@ -1166,9 +1229,6 @@ sub replaceLun {
return SCST_C_LUN_DEV_EXISTS if ($$luns{$lun} eq $device);
my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
my $io = new IO::File $path, O_WRONLY;
return SCST_C_LUN_RPL_DEV_FAIL if (!$io);
@@ -1201,6 +1261,8 @@ sub clearLuns {
my $target = shift;
my $group = shift;
my $err = SCST_C_TGT_CLR_LUN_FAIL;
my $rc = $self->driverExists($driver);
return SCST_C_DRV_NO_DRIVER if (!$rc);
return $rc if ($rc > 1);
@@ -1209,16 +1271,24 @@ sub clearLuns {
return SCST_C_TGT_NO_TARGET if (!$rc);
return $rc if ($rc > 1);
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
my $path;
my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
if ($group) {
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
$err = SCST_C_GRP_CLR_LUN_FAIL;
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, SCST_MGMT_IO);
} else {
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS, SCST_MGMT_IO);
}
my $io = new IO::File $path, O_WRONLY;
return SCST_C_GRP_CLR_LUN_FAIL if (!$io);
return $err if (!$io);
my $cmd = "clear\n";
my $bytes;
@@ -1716,8 +1786,8 @@ sub lunParameters {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $lun = shift;
my $group = shift;
my %parameters;
if ($self->driverExists($driver) != TRUE) {
@@ -1730,19 +1800,26 @@ sub lunParameters {
return undef;
}
if ($self->groupExists($driver, $target, $group) != TRUE) {
$self->{'err_string'} = "lunParameters(): Group '$group' does not exist";
return undef;
my $_path;
if ($group) {
if ($self->groupExists($driver, $target, $group) != TRUE) {
$self->{'err_string'} = "lunParameters(): Group '$group' does not exist";
return undef;
}
$_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, $lun);
} else {
$_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS, $lun);
}
if ($self->lunExists($driver, $target, $group, $lun) != TRUE) {
if ($self->lunExists($driver, $target, $lun, $group) != TRUE) {
$self->{'err_string'} = "lunParameters(): LUN '$lun' does not exist";
return undef;
}
my $pHandle = new IO::Handle;
my $_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, $lun);
if (!(opendir $pHandle, $_path)) {
$self->{'err_string'} = "lunParameters(): Unable to read directory '$_path': $!";
return undef;
@@ -1750,8 +1827,7 @@ sub lunParameters {
foreach my $parameter (readdir($pHandle)) {
next if (($parameter eq '.') || ($parameter eq '..'));
my $pPath = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, $lun, $parameter);
my $pPath = mkpath($_path, $parameter);
my $mode = (stat($pPath))[2];
if ($parameter eq 'device') {
@@ -1801,10 +1877,10 @@ sub setLunParameter {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $lun = shift;
my $parameter = shift;
my $value = shift;
my $group = shift;
my $rc = $self->driverExists($driver);
return SCST_C_DRV_NO_DRIVER if (!$rc);
@@ -1814,11 +1890,20 @@ sub setLunParameter {
return SCST_C_TGT_NO_TARGET if (!$rc);
return $rc if ($rc > 1);
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
my $path;
$rc = $self->lunExists($driver, $target, $group, $lun);
if ($group) {
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, $lun, $parameter);
} else {
$path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_LUNS, $lun, $parameter);
}
$rc = $self->lunExists($driver, $target, $lun, $group);
return SCST_C_GRP_NO_LUN if (!$rc);
return $rc if ($rc > 1);
@@ -1829,9 +1914,6 @@ sub setLunParameter {
return SCST_C_LUN_BAD_PARAMETERS if (!defined($$parameters{$parameter}));
return SCST_C_LUN_PARAMETER_STATIC if ($$parameters{$parameter}->{'static'});
my $path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target, SCST_GROUPS,
$group, SCST_LUNS, $lun, $parameter);
my $io = new IO::File $path, O_WRONLY;
return SCST_C_LUN_SETPARAM_FAIL if (!$io);
@@ -2442,8 +2524,8 @@ sub checkLunCreateParameters {
my $self = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $check = shift;
my $group = shift;
return FALSE if (!defined($check));
@@ -2455,9 +2537,11 @@ sub checkLunCreateParameters {
return SCST_C_TGT_NO_TARGET if (!$rc);
return $rc if ($rc > 1);
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
if ($group) {
$rc = $self->groupExists($driver, $target, $group);
return SCST_C_GRP_NO_GROUP if (!$rc);
return $rc if ($rc > 1);
}
my $available = $self->lunCreateParameters($driver, $target, $group);
@@ -2492,14 +2576,23 @@ sub lunCreateParameters {
return undef;
}
if ($self->groupExists($driver, $target, $group) != TRUE) {
$self->{'err_string'} = "lunCreateParameters(): Group '$group' ".
"does not exist";
return undef;
my $_path;
if ($group) {
if ($self->groupExists($driver, $target, $group) != TRUE) {
$self->{'err_string'} = "lunCreateParameters(): Group '$group' ".
"does not exist";
return undef;
}
$_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target,
SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO), O_RDONLY;
} else {
$_path = mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target,
SCST_LUNS, SCST_MGMT_IO), O_RDONLY;
}
my $io = new IO::File mkpath(SCST_ROOT, SCST_TARGETS, $driver, $target,
SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO), O_RDONLY;
my $io = new IO::File $_path;
if (!$io) {
$self->{'err_string'} = "lunCreateParameters(): Unable to open luns mgmt ".

View File

@@ -597,7 +597,7 @@ sub main {
last SWITCH;
};
$setLunParm && do {
$rc = setLunParameters($setLunParm, $driver, $target, $group, $parameters);
$rc = setLunParameters($setLunParm, $driver, $target, $parameters, $group);
last SWITCH;
};
$setInitiatorParm && do {
@@ -641,11 +641,11 @@ sub main {
last SWITCH;
};
$addLun && do {
$rc = addLun($addLun, $driver, $target, $group, $device, $parameters);
$rc = addLun($addLun, $driver, $target, $device, $parameters, $group);
last SWITCH;
};
$removeLun && do {
$rc = removeLun($removeLun, $driver, $target, $group, $device);
$rc = removeLun($removeLun, $driver, $target, $device, $group);
last SWITCH;
};
$replaceLun && do {
@@ -710,6 +710,10 @@ sub readWorkingConfig {
foreach my $target (@{$targets}) {
my %empty;
$CURRENT{'assign'}->{$driver}->{$target} = \%empty;
my $luns = $SCST->luns($driver, $target);
$CURRENT{'assign'}->{$driver}->{$target}->{'LUNS'} = $luns if (defined($luns));
my $groups = $SCST->groups($driver, $target);
immediateExit($SCST->errorString());
foreach my $group (@{$groups}) {
@@ -886,7 +890,7 @@ sub writeConfiguration {
$lun_buff .= "\t\t\tLUN $lun $lun_dev";
$parameters = $SCST->lunParameters($driver, $target, $group, $lun);
$parameters = $SCST->lunParameters($driver, $target, $lun, $group);
my $parameter_buff;
foreach my $parameter (sort keys %{$parameters}) {
@@ -1045,7 +1049,7 @@ sub checkConfiguration {
foreach my $target (keys %{$$CONFIG{'TARGET_DRIVER'}->{$driver}->{'TARGET'}}) {
if (!defined($CURRENT{'assign'}->{$driver}->{$target})) {
print "\t-> WARNING: Target '$target' for driver '$driver' ".
"does not exist.\n";
"does not exist.\n" if ($SCST->driverIsStatic($driver));
}
}
}
@@ -1140,7 +1144,28 @@ sub applyConfigAssignments {
foreach my $driver (keys %{$assignments}) {
foreach my $target (keys %{$$assignments{$driver}}) {
my $luns = $$assignments{$driver}->{$target}->{'LUNS'};
my $def_group = $$config{'TARGET_DRIVER'}->{$driver}->{'TARGET'}->{$target};
foreach my $lun (keys %{$luns}) {
my $device = $$luns{$lun};
if (!defined($$def_group{'LUN'}) ||
!defined($$def_group{'LUN'}->{$lun}) ||
!defined($$def_group{'LUN'}->{$lun}->{$device})) {
if ($deletions) {
removeLun($lun, $driver, $target, $device);
} else {
print "\t-> Device '$device' at LUN '$lun' is not in configuration ".
"for driver/target '$driver/$target'. ".
"Use -force to remove it.\n";
}
}
}
foreach my $group (keys %{$$assignments{$driver}->{$target}}) {
next if ($group eq 'LUNS');
my $luns = $$assignments{$driver}->{$target}->{$group}->{'LUNS'};
my $inits = $$assignments{$driver}->{$target}->{$group}->{'INITIATORS'};
@@ -1168,7 +1193,7 @@ sub applyConfigAssignments {
!defined($$def_group{'LUN'}->{$lun}) ||
!defined($$def_group{'LUN'}->{$lun}->{$device})) {
if ($deletions) {
removeLun($lun, $driver, $target, $group, $device);
removeLun($lun, $driver, $target, $device, $group);
} else {
print "\t-> Device '$device' at LUN '$lun' is not in configuration ".
"for driver/target/group '$driver/$target/$group'. ".
@@ -1221,7 +1246,16 @@ sub applyTargetAssignments {
foreach my $target (sort keys %{$targets}) {
if (!defined($CURRENT{'assign'}->{$driver}->{$target})) {
immediateExit("Target '$target' for driver '$driver' does not exist.");
if ($SCST->driverIsStatic($driver)) {
immediateExit("Target '$target' for driver '$driver' does not exist.");
} else {
# TODO: Add $parameters
print "-> Creating target '$target' for driver '$driver': ";
my $rc = $SCST->addTarget($driver, $target);
print "done.\n";
immediateExit($SCST->errorString($rc)) if ($rc);
}
}
my %_parameters;
@@ -1229,7 +1263,7 @@ sub applyTargetAssignments {
if ($item eq 'GROUP') {
applyGroupAssignments($driver, $target, $$targets{$target}->{$item});
} elsif ($item eq 'LUN') {
applyLunAssignments($driver, $target, $$targets{$target}->{$item});
applyLunAssignments($driver, $target, undef, $$targets{$target}->{$item});
} else {
$_parameters{$item} = $$targets{$target}->{$item};
}
@@ -1276,9 +1310,15 @@ sub applyLunAssignments {
my $target = shift;
my $group = shift;
my $luns = shift;
my $c_luns;
my $c_luns = $CURRENT{'assign'}->{$driver}->{$target}->{$group}->{'LUNS'};
if ($group) {
$c_luns = $CURRENT{'assign'}->{$driver}->{$target}->{$group}->{'LUNS'};
} else {
$c_luns = $CURRENT{'assign'}->{$driver}->{$target}->{'LUNS'};
}
#use Data::Dumper;
#print Dumper(\%CURRENT);
foreach my $lun (sort keys %{$luns}) {
if (!defined($$c_luns{$lun})) {
if ((scalar keys %{$$luns{$lun}}) > 1) {
@@ -1289,7 +1329,7 @@ sub applyLunAssignments {
foreach my $device (sort keys %{$$luns{$lun}}) {
my $parameters = configToParm($$luns{$lun}->{$device});
addLun($lun, $driver, $target, $group, $device, $parameters);
addLun($lun, $driver, $target, $device, $parameters, $group);
}
}
}
@@ -1866,10 +1906,10 @@ sub setLunParameters {
my $lun = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $parameters = shift;
my $group = shift;
my $_parameters = $SCST->lunParameters($driver, $target, $group, $lun);
my $_parameters = $SCST->lunParameters($driver, $target, $lun, $group);
foreach my $parameter (sort keys %{$parameters}) {
if (defined($$_parameters{$parameter}) &&
@@ -1881,7 +1921,7 @@ sub setLunParameters {
print "-> Setting LUN parameter '$parameter' to value '$value' for ".
"driver/target/group/lun '$driver/$target/$group/$lun': ";
my $rc = $SCST->setLunParameter($driver, $target, $group, $lun, $parameter, $value);
my $rc = $SCST->setLunParameter($driver, $target, $lun, $parameter, $value, $group);
print "done.\n";
@@ -2087,14 +2127,19 @@ sub addLun {
my $lun = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $device = shift;
my $parameters = shift;
my $group = shift;
print "-> Adding device '$device' at LUN $lun to driver/target/group ".
"'$driver/$target/$group': ";
if ($group) {
print "-> Adding device '$device' at LUN $lun to driver/target/group ".
"'$driver/$target/$group': ";
} else {
print "-> Adding device '$device' at LUN $lun to driver/target ".
"'$driver/$target': ";
}
my $rc = $SCST->addLun($driver, $target, $group, $device, $lun, $parameters);
my $rc = $SCST->addLun($driver, $target, $device, $lun, $parameters, $group);
print "done.\n";
@@ -2105,13 +2150,18 @@ sub removeLun {
my $lun = shift;
my $driver = shift;
my $target = shift;
my $group = shift;
my $device = shift;
my $group = shift;
print "-> Removing device '$device' at LUN $lun from driver/target/group ".
"'$driver/$target/$group': ";
if ($group) {
print "-> Removing device '$device' at LUN $lun from driver/target/group ".
"'$driver/$target/$group': ";
} else {
print "-> Removing device '$device' at LUN $lun from driver/target ".
"'$driver/$target': ";
}
my $rc = $SCST->removeLun($driver, $target, $group, $device, $lun);
my $rc = $SCST->removeLun($driver, $target, $device, $lun, $group);
print "done.\n";