From 5d8a5636485786c02797b63690acb4867b972eaf Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Mon, 21 Oct 2013 18:36:01 +0000 Subject: [PATCH] scstadmin: Reduce the time needed to save or restore a configuration git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5075 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- .../scst-0.9.10/lib/SCST/SCST.pm | 2499 ++++++++--------- 1 file changed, 1149 insertions(+), 1350 deletions(-) diff --git a/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm b/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm index 613fc8f4a..d9de2362d 100644 --- a/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm +++ b/scstadmin/scstadmin.sysfs/scst-0.9.10/lib/SCST/SCST.pm @@ -501,15 +501,26 @@ sub scstAttributes { $attributes{$attribute}->{'value'} = $value; } } + close $io; $attributes{$attribute}->{'static'} = $is_static; } } } + close $pHandle; + return \%attributes; } +sub setAttrFailed { + my $path = shift; + my $no_such_attr = shift; + my $is_static = shift; + + return (-f $path) && (-r $path) ? $is_static : $no_such_attr; +} + sub setScstAttribute { my $self = shift; my $attribute = shift; @@ -517,29 +528,20 @@ sub setScstAttribute { return TRUE if (!defined($attribute) || !defined($value)); - my $attributes = $self->scstAttributes(); - - return SCST_C_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my $path = make_path(SCST_ROOT_DIR(), $attribute); - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_BAD_ATTRIBUTES, + SCST_C_ATTRIBUTE_STATIC); } my @_drivers; @@ -570,76 +572,70 @@ sub drivers { sub targets { my $self = shift; my $driver = shift; - my @targets; return undef if (!defined($driver)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "targets(): Driver '$driver' is not available"; - return undef; - } - my $tHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver); - if (!(opendir $tHandle, $_path)) { - $self->{'err_string'} = "targets(): Unable to read directory '$_path': $!"; - return undef; - } + if (opendir $tHandle, $_path) { + my @targets; - foreach my $target (readdir($tHandle)) { - next if ($target eq '.' || $target eq '..' || - $target eq 'module'); + foreach my $target (readdir($tHandle)) { + next if ($target eq '.' || $target eq '..' || + $target eq 'module'); - if (-d make_path(SCST_TARGETS_DIR(), $driver, $target)) { - push @targets, $target; + if (-d make_path(SCST_TARGETS_DIR(), $driver, + $target)) { + push @targets, $target; + } } + close $tHandle; + @targets = sort(@targets); + return \@targets; + } + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "targets(): Driver '$driver' is not available"; + } else { + $self->{'err_string'} = "targets(): Unable to read directory '$_path': $!"; } - close $tHandle; - - @targets = sort(@targets); - - return \@targets; + return undef; } sub groups { my $self = shift; my $driver = shift; my $target = shift; - my @groups; return undef if (!defined($driver) || !defined($target)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "groups(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "groups(): Target '$target' is not available"; - return undef; - } - my $gHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS); - if (!(opendir $gHandle, $_path)) { - $self->{'err_string'} = "groups(): Unable to read directory '$_path': $!"; - return undef; - } - foreach my $group (readdir($gHandle)) { - next if (($group eq '.') || ($group eq '..')); + if (opendir $gHandle, $_path) { + my @groups; - if (-d make_path(SCST_TARGETS_DIR(), $driver, - $target, SCST_GROUPS, $group)) { - push @groups, $group; + foreach my $group (readdir($gHandle)) { + next if ($group eq '.' || $group eq '..'); + + if (-d make_path(SCST_TARGETS_DIR(), $driver, + $target, SCST_GROUPS, $group)) { + push @groups, $group; + } } + close $gHandle; + return \@groups; } - close $gHandle; - - return \@groups; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "groups(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "groups(): Target '$target' is not available"; + } else { + $self->{'err_string'} = "groups(): Unable to read directory '$_path': $!"; + } + return undef; } sub initiators { @@ -652,26 +648,19 @@ sub initiators { return undef if (!defined($driver) || !defined($target) || !defined($group)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "initiators(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "initiators(): Target '$target' is not available"; - return undef; - } - - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "initiators(): Group '$group' does not exist"; - return undef; - } - my $iHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_INITIATORS); if (!(opendir $iHandle, $_path)) { - $self->{'err_string'} = "initiators(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "initiators(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "initiators(): Target '$target' is not available"; + } elsif ($self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "initiators(): Group '$group' does not exist"; + } else { + $self->{'err_string'} = "initiators(): Unable to read directory '$_path': $!"; + } return undef; } @@ -692,28 +681,12 @@ sub luns { my $driver = shift; my $target = shift; my $group = shift; - my %luns; return undef if (!defined($driver) || !defined($target)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "luns(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "luns(): Target '$target' is not available"; - return undef; - } - my $_path; if (defined($group)) { - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "initiators(): Group '$group' does not exist"; - return undef; - } - $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS); } else { @@ -724,10 +697,20 @@ sub luns { my $lHandle = new IO::Handle; if (!(opendir $lHandle, $_path)) { - $self->{'err_string'} = "luns(): Unable to read directory '$_path': $!"; + if (defined($group) && $self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "initiators(): Group '$group' does not exist"; + } elsif ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "luns(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "luns(): Target '$target' is not available"; + } else { + $self->{'err_string'} = "luns(): Unable to read directory '$_path': $!"; + } return undef; } + my %luns; + foreach my $lun (readdir($lHandle)) { next if (($lun eq '.') || ($lun eq '..')); @@ -750,6 +733,8 @@ sub luns { $luns{$lun} = $linked; } } + + close $_lHandle; } } @@ -802,10 +787,14 @@ sub aluaAttributes { } else { $attributes{$attribute}->{'value'} = $value; } + close $io; + $attributes{$attribute}->{'static'} = $is_static; } } + close $pHandle; + return \%attributes; } @@ -840,15 +829,14 @@ sub deviceGroupDevices { return undef if (!defined($group)); - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "deviceGroupDevices(): Device group '$group' does not exist"; - return undef; - } - my $dHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES); if (!(opendir $dHandle, $_path)) { - $self->{'err_string'} = "deviceGroupDevices(): Unable to read directory '$_path': $!"; + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "deviceGroupDevices(): Device group '$group' does not exist"; + } else { + $self->{'err_string'} = "deviceGroupDevices(): Unable to read directory '$_path': $!"; + } return undef; } @@ -872,15 +860,14 @@ sub targetGroups { return undef if (!defined($group)); - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroups(): Device group '$group' does not exist"; - return undef; - } - my $dHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS); if (!(opendir $dHandle, $_path)) { - $self->{'err_string'} = "targetGroups(): Unable to read directory '$_path': $!"; + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "targetGroups(): Device group '$group' does not exist"; + } else { + $self->{'err_string'} = "targetGroups(): Unable to read directory '$_path': $!"; + } return undef; } @@ -905,20 +892,16 @@ sub targetGroupTargets { return undef if (!defined($group) || !defined($tgroup)); - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroupTargets(): Device group '$group' does not exist"; - return undef; - } - - if ($self->targetGroupExists($group, $tgroup) != TRUE) { - $self->{'err_string'} = "targetGroupTargets(): Target group '$tgroup' does not exist"; - return undef; - } - my $dHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup); if (!(opendir $dHandle, $_path)) { - $self->{'err_string'} = "targetGroupTargets(): Unable to read directory '$_path': $!"; + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "targetGroupTargets(): Device group '$group' does not exist"; + } elsif ($self->targetGroupExists($group, $tgroup) != TRUE) { + $self->{'err_string'} = "targetGroupTargets(): Target group '$tgroup' does not exist"; + } else { + $self->{'err_string'} = "targetGroupTargets(): Unable to read directory '$_path': $!"; + } return undef; } @@ -960,12 +943,6 @@ sub driverDynamicAttributes { return undef if (!defined($driver)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "driverDynamicAttributes(): Driver '$driver' ". - "is not available"; - return undef; - } - if (new_sysfs_interface()) { my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_TGTT_ATTR), O_RDONLY; @@ -974,14 +951,20 @@ sub driverDynamicAttributes { chomp($attribute); $attributes{$attribute} = ''; } + close $io; } } else { my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO), O_RDONLY; if (!$io) { - $self->{'err_string'} = "driverDynamicAttributes(): Unable to open mgmt ". - "interface for driver '$driver': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "driverDynamicAttributes(): Driver '$driver' ". + "is not available"; + } else { + $self->{'err_string'} = "driverDynamicAttributes(): Unable to open mgmt ". + "interface for driver '$driver': $!"; + } return undef; } @@ -991,6 +974,7 @@ sub driverDynamicAttributes { $available =~ s/\.$//; } } + close $io; if ($available) { foreach my $attribute (split(/\,/, $available)) { @@ -1009,13 +993,15 @@ sub checkDriverDynamicAttributes { my $driver = shift; my $check = shift; - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if (!$rc > 1); - my $available = $self->driverDynamicAttributes($driver); - return SCST_C_FATAL_ERROR if (!defined($available)); + if (!defined($available)) { + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if (!$rc > 1); + + return SCST_C_FATAL_ERROR; + } return FALSE if (!defined($check)); @@ -1043,16 +1029,6 @@ sub addDriverDynamicAttribute { return SCST_C_DRV_ADDATTR_FAIL if (!defined($driver) || !defined($attribute) || !defined($value)); - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if ($rc > 1); - - return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - - $rc = $self->checkDriverDynamicAttributes($driver, $attribute); - return SCST_C_DRV_BAD_ATTRIBUTES if ($rc == 1); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -1063,22 +1039,28 @@ sub addDriverDynamicAttribute { $cmd .= "add_attribute $attribute $value"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DRV_ADDATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); + + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); + + $rc = $self->checkDriverDynamicAttributes($driver, $attribute); + return SCST_C_DRV_BAD_ATTRIBUTES if ($rc == 1); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_DRV_ADDATTR_FAIL; - } sub removeDriverDynamicAttribute { @@ -1090,16 +1072,6 @@ sub removeDriverDynamicAttribute { return SCST_C_DRV_REMATTR_FAIL if (!defined($driver) || !defined($attribute) || !defined($value)); - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if ($rc > 1); - - return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - - $rc = $self->checkDriverDynamicAttributes($driver, $attribute); - return SCST_C_DRV_BAD_ATTRIBUTES if ($rc == 1); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -1110,20 +1082,27 @@ sub removeDriverDynamicAttribute { $cmd .= "del_attribute $attribute $value"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DRV_REMATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); + + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); + + $rc = $self->checkDriverDynamicAttributes($driver, $attribute); + return SCST_C_DRV_BAD_ATTRIBUTES if ($rc == 1); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_DRV_REMATTR_FAIL; } @@ -1132,37 +1111,21 @@ sub targetExists { my $driver = shift; my $target = shift; - return FALSE if (!defined($target)); - - my $rc = $self->driverExists($driver); - - return FALSE if (!$rc); - return $rc if ($rc > 1); - - my $targets = $self->targets($driver); - - return SCST_C_FATAL_ERROR if (!defined($targets)); - - foreach my $_target (@{$targets}) { - return TRUE if ($target eq $_target); - } - - return FALSE; + return defined($driver) && defined($target) && + $target ne '.' && $target ne '..' && $target ne 'module' && + (-d make_path(SCST_TARGETS_DIR(), $driver, $target)) ? TRUE : FALSE; } sub driverIsVirtualCapable { my $self = shift; my $driver = shift; - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if ($rc > 1); - if (new_sysfs_interface()) { my $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_ADD_TGT); my $io = new IO::File $path, O_RDONLY; if ($io) { my $line = <$io>; + close $io; chomp($line); return $line eq '1'; } @@ -1200,20 +1163,6 @@ sub addVirtualTarget { my $target = shift; my $attributes = shift; - 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); - - return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - - $rc = $self->checkTargetCreateAttributes($driver, $attributes); - return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == TRUE); - return $rc if ($rc > 1); - my $o_string = ""; foreach my $attribute (keys %{$attributes}) { if (ref($$attributes{$attribute}) eq 'ARRAY') { @@ -1238,20 +1187,31 @@ sub addVirtualTarget { $cmd .= "add_target $target $o_string"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGT_ADD_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + 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); + + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); + + $rc = $self->checkTargetCreateAttributes($driver, $attributes); + return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == TRUE); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_TGT_ADD_FAIL; } @@ -1263,12 +1223,6 @@ sub targetDynamicAttributes { return undef if (!defined($driver)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "targetDynamicAttributes(): Driver '$driver' ". - "is not available"; - return undef; - } - if (new_sysfs_interface()) { my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_TGT_ATTR), O_RDONLY; @@ -1277,14 +1231,20 @@ sub targetDynamicAttributes { chomp($attribute); $attributes{$attribute} = ''; } + close $io; } } else { my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO), O_RDONLY; if (!$io) { - $self->{'err_string'} = "targetDynamicAttributes(): Unable to open mgmt ". - "interface for driver '$driver': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "targetDynamicAttributes(): Driver '$driver' ". + "is not available"; + } else { + $self->{'err_string'} = "targetDynamicAttributes(): Unable to open mgmt ". + "interface for driver '$driver': $!"; + } return undef; } @@ -1294,6 +1254,7 @@ sub targetDynamicAttributes { $available =~ s/\.$//; } } + close $io; if ($available) { foreach my $attribute (split(/\,/, $available)) { @@ -1312,13 +1273,15 @@ sub checkTargetDynamicAttributes { my $driver = shift; my $check = shift; - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if (!$rc > 1); - my $available = $self->targetDynamicAttributes($driver); - return SCST_C_FATAL_ERROR if (!defined($available)); + if (!defined($available)) { + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if (!$rc > 1); + + return SCST_C_FATAL_ERROR; + } return FALSE if (!defined($check)); @@ -1348,6 +1311,27 @@ sub addTargetDynamicAttribute { if (!defined($driver) || !defined($target) || !defined($attribute) || !defined($value)); + my ($path, $cmd); + if (new_sysfs_interface()) { + $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); + $cmd = "in " . make_path(IN_SCST_TARGETS, $driver) . " "; + } else { + $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); + } + $cmd .= "add_target_attribute $target $attribute $value"; + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); @@ -1362,30 +1346,6 @@ sub addTargetDynamicAttribute { return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == 1); return $rc if ($rc > 1); - my ($path, $cmd); - if (new_sysfs_interface()) { - $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); - $cmd = "in " . make_path(IN_SCST_TARGETS, $driver) . " "; - } else { - $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); - } - $cmd .= "add_target_attribute $target $attribute $value"; - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGT_ADDATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_TGT_ADDATTR_FAIL; } @@ -1400,6 +1360,27 @@ sub removeTargetDynamicAttribute { if (!defined($driver) || !defined($target) || !defined($attribute) || !defined($value)); + my ($path, $cmd); + if (new_sysfs_interface()) { + $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); + $cmd = "in " . make_path(IN_SCST_TARGETS, $driver) . " "; + } else { + $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); + } + $cmd .= "del_target_attribute $target $attribute $value"; + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); @@ -1414,30 +1395,6 @@ sub removeTargetDynamicAttribute { return SCST_C_TGT_BAD_ATTRIBUTES if ($rc == 1); return $rc if ($rc > 1); - my ($path, $cmd); - if (new_sysfs_interface()) { - $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); - $cmd = "in " . make_path(IN_SCST_TARGETS, $driver) . " "; - } else { - $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); - } - $cmd .= "del_target_attribute $target $attribute $value"; - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGT_REMATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_TGT_REMATTR_FAIL; } @@ -1446,16 +1403,8 @@ sub removeVirtualTarget { my $driver = shift; my $target = shift; - 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_NO_TARGET if (!$rc); - return $rc if ($rc > 1); - - return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - + # May fail if the target does not have an 'enabled' attribute as is the + # case for e.g. the 'scst_local' driver. $self->enableTarget($driver, $target, FALSE); my $sessions = $self->sessions($driver, $target); @@ -1498,20 +1447,27 @@ sub removeVirtualTarget { $cmd .= "del_target $target"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGT_REM_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + 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_NO_TARGET if (!$rc); + return $rc if ($rc > 1); + + return SCST_C_DRV_NOTVIRT if (!$self->driverIsVirtualCapable($driver)); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_TGT_REM_FAIL; } @@ -1523,14 +1479,15 @@ sub groupExists { return FALSE if (!defined($driver) || !defined($target) || !defined($group)); - my $rc = $self->targetExists($driver, $target); - - return FALSE if (!$rc); - return $rc if ($rc > 1); - my $groups = $self->groups($driver, $target); - return SCST_C_FATAL_ERROR if (!defined($groups)); + if (!defined($groups)) { + my $rc = $self->targetExists($driver, $target); + return FALSE if (!$rc); + return $rc if ($rc > 1); + + return SCST_C_FATAL_ERROR; + } foreach my $_group (@{$groups}) { return TRUE if ($group eq $_group); @@ -1549,14 +1506,15 @@ sub initiatorExists { return FALSE if (!defined($driver) || !defined($target) || !defined($group) || !defined($initiator)); - my $rc = $self->groupExists($driver, $target, $group); - - return FALSE if (!$rc); - return $rc if ($rc > 1); - my $initiators = $self->initiators($driver, $target, $group); - return SCST_C_FATAL_ERROR if (!defined($initiators)); + if (!defined($initiators)) { + my $rc = $self->groupExists($driver, $target, $group); + return FALSE if (!$rc); + return $rc if ($rc > 1); + + return SCST_C_FATAL_ERROR; + } foreach my $_initiator (@{$initiators}) { return TRUE if ($initiator eq $_initiator); @@ -1575,24 +1533,24 @@ sub lunExists { return FALSE if (!defined($driver) || !defined($target) || !defined($lun)); - - 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_NO_TARGET if (!$rc); - return $rc if ($rc > 1); - - if (defined($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)); + if (!defined($luns)) { + 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_NO_TARGET if (!$rc); + return $rc if ($rc > 1); + + if (defined($group)) { + my $rc = $self->groupExists($driver, $target, $group); + return SCST_C_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + } + return SCST_C_FATAL_ERROR; + } foreach my $_lun (keys %{$luns}) { return TRUE if ($lun == $_lun); @@ -1610,18 +1568,6 @@ sub addGroup { return SCST_C_GRP_ADD_FAIL if (!defined($driver) || !defined($target) || !defined($group)); - 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_NO_TARGET if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->groupExists($driver, $target, $group); - return SCST_C_GRP_EXISTS if ($rc == TRUE); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -1634,20 +1580,29 @@ sub addGroup { $cmd .= "create $group"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_ADD_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + 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_NO_TARGET if (!$rc); + return $rc if ($rc > 1); + + $rc = $self->groupExists($driver, $target, $group); + return SCST_C_GRP_EXISTS if ($rc == TRUE); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_GRP_ADD_FAIL; } @@ -1660,6 +1615,29 @@ sub removeGroup { return SCST_C_GRP_REM_FAIL if (!defined($driver) || !defined($target) || !defined($group)); + my ($path, $cmd); + if (new_sysfs_interface()) { + $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); + $cmd = "in " . make_path(IN_SCST_TARGETS, $driver, $target, + SCST_GROUPS) . " "; + } else { + $path = make_path(SCST_TARGETS_DIR(), $driver, $target, + SCST_GROUPS, SCST_MGMT_IO); + } + $cmd .= "del $group"; + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); @@ -1672,32 +1650,6 @@ sub removeGroup { return SCST_C_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); - my ($path, $cmd); - if (new_sysfs_interface()) { - $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); - $cmd = "in " . make_path(IN_SCST_TARGETS, $driver, $target, - SCST_GROUPS) . " "; - } else { - $path = make_path(SCST_TARGETS_DIR(), $driver, $target, - SCST_GROUPS, SCST_MGMT_IO); - } - $cmd .= "del $group"; - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_REM_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_GRP_REM_FAIL; } @@ -1707,10 +1659,6 @@ sub addDeviceGroup { return SCST_C_DEV_GRP_ADD_FAIL if (!defined($group)); - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_EXISTS if ($rc == TRUE); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -1721,21 +1669,20 @@ sub addDeviceGroup { $cmd .= "create $group"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DEV_GRP_ADD_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; - - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DEV_GRP_ADD_FAIL; + my $rc = $self->deviceGroupExists($group); + return $rc == TRUE ? SCST_C_DEV_GRP_EXISTS : $rc > 1 ? $rc : + SCST_C_DEV_GRP_ADD_FAIL; } sub removeDeviceGroup { @@ -1744,10 +1691,6 @@ sub removeDeviceGroup { return SCST_C_DEV_GRP_REM_FAIL if (!defined($group)); - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -1758,20 +1701,21 @@ sub removeDeviceGroup { $cmd .= "del $group"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DEV_GRP_REM_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceGroupExists($group); + return SCST_C_DEV_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_DEV_GRP_REM_FAIL; } @@ -1782,6 +1726,28 @@ sub addDeviceGroupDevice { return SCST_C_DGRP_ADD_DEV_FAIL if (!defined($group) || !defined($device)); + my ($path, $cmd); + if (new_sysfs_interface()) { + $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); + $cmd = "in " . make_path(IN_SCST_DEV_GROUPS, $group, + SCST_DG_DEVICES) . " "; + } else { + $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES, SCST_MGMT_IO); + } + $cmd .= "add $device"; + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->deviceGroupExists($group); return SCST_C_DEV_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); @@ -1805,31 +1771,6 @@ sub addDeviceGroupDevice { } } - my ($path, $cmd); - if (new_sysfs_interface()) { - $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); - $cmd = "in " . make_path(IN_SCST_DEV_GROUPS, $group, - SCST_DG_DEVICES) . " "; - } else { - $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES, SCST_MGMT_IO); - } - $cmd .= "add $device"; - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DGRP_ADD_DEV_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_DGRP_ADD_DEV_FAIL; } @@ -1838,15 +1779,8 @@ sub addTargetGroup { my $group = shift; my $tgroup = shift; - return SCST_C_DGRP_ADD_GRP_FAIL if (!defined($group) || !defined($tgroup)); - - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->targetGroupExists($group, $tgroup); - return SCST_C_DGRP_GROUP_EXISTS if ($rc == TRUE); - return $rc if ($rc > 1); + return SCST_C_DGRP_ADD_GRP_FAIL if (!defined($group) || + !defined($tgroup)); my ($path, $cmd); if (new_sysfs_interface()) { @@ -1859,21 +1793,24 @@ sub addTargetGroup { $cmd .= "add $tgroup"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DGRP_ADD_GRP_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceGroupExists($group); + return SCST_C_DEV_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DGRP_ADD_GRP_FAIL; + $rc = $self->targetGroupExists($group, $tgroup); + return SCST_C_DGRP_GROUP_EXISTS if ($rc == TRUE); + return $rc > 1 ? $rc : SCST_C_DGRP_ADD_GRP_FAIL; } sub addTargetGroupTarget { @@ -1882,19 +1819,9 @@ sub addTargetGroupTarget { my $tgroup = shift; my $tgt = shift; - return SCST_C_TGRP_ADD_TGT_FAIL if (!defined($group) || !defined($tgroup) || !defined($tgt)); - - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->targetGroupExists($group, $tgroup); - return SCST_C_DGRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->targetGroupTargetExists($group, $tgroup, $tgt); - return SCST_C_TGRP_TGT_EXISTS if ($rc == TRUE); - return $rc if ($rc > 1); + return SCST_C_TGRP_ADD_TGT_FAIL if (!defined($group) || + !defined($tgroup) || + !defined($tgt)); my ($path, $cmd); if (new_sysfs_interface()) { @@ -1908,21 +1835,27 @@ sub addTargetGroupTarget { $cmd .= "add $tgt"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGRP_ADD_TGT_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceGroupExists($group); + return SCST_C_DEV_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_TGRP_ADD_TGT_FAIL; + $rc = $self->targetGroupExists($group, $tgroup); + return SCST_C_DGRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + + $rc = $self->targetGroupTargetExists($group, $tgroup, $tgt); + return $rc == TRUE ? SCST_C_TGRP_TGT_EXISTS : $rc > 1 ? $rc : SCST_C_TGRP_ADD_TGT_FAIL; } sub removeDeviceGroupDevice { @@ -1932,6 +1865,28 @@ sub removeDeviceGroupDevice { return SCST_C_DGRP_REM_DEV_FAIL if (!defined($group) || !defined($device)); + my ($path, $cmd); + if (new_sysfs_interface()) { + $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); + $cmd = "in " . make_path(IN_SCST_DEV_GROUPS, $group, + SCST_DG_DEVICES) . " "; + } else { + $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES, SCST_MGMT_IO); + } + $cmd .= "del $device"; + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->deviceGroupExists($group); return SCST_C_DEV_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); @@ -1944,31 +1899,6 @@ sub removeDeviceGroupDevice { return SCST_C_DGRP_NO_DEVICE if (!$rc); return $rc if ($rc > 1); - my ($path, $cmd); - if (new_sysfs_interface()) { - $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); - $cmd = "in " . make_path(IN_SCST_DEV_GROUPS, $group, - SCST_DG_DEVICES) . " "; - } else { - $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES, SCST_MGMT_IO); - } - $cmd .= "del $device"; - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DGRP_REM_DEV_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_DGRP_REM_DEV_FAIL; } @@ -1979,14 +1909,6 @@ sub removeTargetGroup { return SCST_C_DGRP_REM_GRP_FAIL if (!defined($group) || !defined($tgroup)); - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->targetGroupExists($group, $tgroup); - return SCST_C_DGRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -1998,20 +1920,25 @@ sub removeTargetGroup { $cmd .= "del $tgroup"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DGRP_REM_GRP_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceGroupExists($group); + return SCST_C_DEV_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + + $rc = $self->targetGroupExists($group, $tgroup); + return SCST_C_DGRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_DGRP_REM_GRP_FAIL; } @@ -2023,18 +1950,6 @@ sub removeTargetGroupTarget { return SCST_C_TGRP_REM_TGT_FAIL if (!defined($group) || !defined($tgroup) || !defined($tgt)); - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->targetGroupExists($group, $tgroup); - return SCST_C_DGRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->targetGroupTargetExists($group, $tgroup, $tgt); - return SCST_C_TGRP_NO_TGT if (!$rc); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -2047,20 +1962,29 @@ sub removeTargetGroupTarget { $cmd .= "del $tgt"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGRP_REM_TGT_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceGroupExists($group); + return SCST_C_DEV_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + + $rc = $self->targetGroupExists($group, $tgroup); + return SCST_C_DGRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + + $rc = $self->targetGroupTargetExists($group, $tgroup, $tgt); + return SCST_C_TGRP_NO_TGT if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_TGRP_REM_TGT_FAIL; } @@ -2075,22 +1999,6 @@ sub addInitiator { if (!defined($driver) || !defined($target) || !defined($group) || !defined($initiator)); - 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_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->initiatorExists($driver, $target, $group, $initiator); - return SCST_C_GRP_INI_EXISTS if ($rc == TRUE); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -2105,30 +2013,17 @@ sub addInitiator { $cmd .= "add $initiator"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_ADD_INI_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; - - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_GRP_ADD_INI_FAIL; -} - -sub removeInitiator { - my $self = shift; - my $driver = shift; - my $target = shift; - my $group = shift; - my $initiator = shift; - return SCST_C_GRP_REM_INI_FAIL if (!defined($driver) || !defined($target) || !defined($initiator)); @@ -2146,9 +2041,21 @@ sub removeInitiator { return $rc if ($rc > 1); $rc = $self->initiatorExists($driver, $target, $group, $initiator); - return SCST_C_GRP_NO_INI if (!$rc); + return SCST_C_GRP_INI_EXISTS if ($rc == TRUE); return $rc if ($rc > 1); + return SCST_C_GRP_ADD_INI_FAIL; +} + +sub removeInitiator { + my $self = shift; + my $driver = shift; + my $target = shift; + my $group = shift; + my $initiator = shift; + + return SCST_C_GRP_REM_INI_FAIL if (!defined($driver) || !defined($target) || !defined($group) || !defined($initiator)); + my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -2163,20 +2070,33 @@ sub removeInitiator { $cmd .= "del $initiator"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_REM_INI_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + 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_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->initiatorExists($driver, $target, $group, $initiator); + return SCST_C_GRP_NO_INI if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_GRP_REM_INI_FAIL; } @@ -2188,6 +2108,31 @@ sub moveInitiator { my $to = shift; my $initiator = shift; + my ($path, $cmd); + if (new_sysfs_interface()) { + $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); + $cmd = "in " . make_path(IN_SCST_TARGETS, $driver, $target, + SCST_GROUPS, $from, SCST_INITIATORS) . + " "; + } else { + $path = make_path(SCST_TARGETS_DIR(), $driver, $target, + SCST_GROUPS, $from, SCST_INITIATORS, + SCST_MGMT_IO); + } + $cmd .= "move $initiator $to"; + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); @@ -2212,34 +2157,6 @@ sub moveInitiator { return SCST_C_GRP_INI_EXISTS if ($rc == TRUE); return $rc if ($rc > 1); - my ($path, $cmd); - if (new_sysfs_interface()) { - $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); - $cmd = "in " . make_path(IN_SCST_TARGETS, $driver, $target, - SCST_GROUPS, $from, SCST_INITIATORS) . - " "; - } else { - $path = make_path(SCST_TARGETS_DIR(), $driver, $target, - SCST_GROUPS, $from, SCST_INITIATORS, - SCST_MGMT_IO); - } - $cmd .= "move $initiator $to"; - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_MOV_INI_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_GRP_MOV_INI_FAIL; } @@ -2249,18 +2166,6 @@ sub clearInitiators { my $target = shift; my $group = shift; - 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_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, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -2275,20 +2180,29 @@ sub clearInitiators { $cmd .= "clear"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_CLR_INI_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + 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_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); - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_GRP_CLR_INI_FAIL; } @@ -2308,41 +2222,6 @@ sub addLun { !defined($device) || !defined($lun) || !defined($attributes)); - 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_NO_TARGET 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->checkLunCreateAttributes($driver, $target, $attributes, $group); - return SCST_C_LUN_BAD_ATTRIBUTES if ($rc == TRUE); - return $rc if ($rc > 1); - - my $err2; - - if (defined($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; - - } else { - $err = SCST_C_TGT_ADD_LUN_FAIL; - $err2 = SCST_C_TGT_LUN_EXISTS; - } - - $rc = $self->lunExists($driver, $target, $lun, $group); - return $err2 if ($rc == TRUE); - return $rc if ($rc > 1); - my $o_string = ""; foreach my $attribute (keys %{$attributes}) { my $value = $$attributes{$attribute}; @@ -2376,20 +2255,44 @@ sub addLun { $cmd .= "add $device $lun $o_string"; my $io = new IO::File $path, O_WRONLY; - - return $err if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + if (defined($group)) { + my $rc = $self->groupExists($driver, $target, $group); + return SCST_C_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + } + + my $rc = $self->lunExists($driver, $target, $lun, $group); + return (defined($group) ? SCST_C_GRP_LUN_EXISTS : + SCST_C_TGT_LUN_EXISTS) if ($rc == TRUE); + return $rc if ($rc > 1); + + $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_NO_TARGET 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->checkLunCreateAttributes($driver, $target, $attributes, $group); + return SCST_C_LUN_BAD_ATTRIBUTES if ($rc == TRUE); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return $err; } @@ -2403,33 +2306,8 @@ sub removeLun { my $err = defined($group) ? SCST_C_GRP_REM_LUN_FAIL : SCST_C_TGT_ADD_LUN_FAIL; - return $err if (!defined($driver) || !defined($target) || !defined($lun)); - - 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_NO_TARGET if (!$rc); - return $rc if ($rc > 1); - - my $err2; - - if (defined($group)) { - $rc = $self->groupExists($driver, $target, $group); - return SCST_C_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - - $err2 = SCST_C_GRP_NO_LUN; - } else { - $err2 = SCST_C_TGT_NO_LUN; - } - - return $err if (!defined($lun)); - - $rc = $self->lunExists($driver, $target, $lun, $group); - return $err2 if (!$rc); - return $rc if ($rc > 1); + return $err if (!defined($driver) || !defined($target) || + !defined($lun)); my ($path, $cmd); if (new_sysfs_interface()) { @@ -2455,20 +2333,36 @@ sub removeLun { $cmd .= "del $lun"; my $io = new IO::File $path, O_WRONLY; - - return $err if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + 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_NO_TARGET if (!$rc); + return $rc if ($rc > 1); + + if (defined($group)) { + $rc = $self->groupExists($driver, $target, $group); + return SCST_C_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + } + + $rc = $self->lunExists($driver, $target, $lun, $group); + return (defined($group) ? SCST_C_GRP_NO_LUN : SCST_C_TGT_NO_LUN) + if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); return $err; } @@ -2551,20 +2445,17 @@ sub replaceLun { $cmd .= "replace $device $lun $o_string"; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_LUN_RPL_DEV_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_LUN_RPL_DEV_FAIL; } @@ -2579,20 +2470,6 @@ sub clearLuns { return $err if (!defined($driver) || !defined($target)); - 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_NO_TARGET if (!$rc); - return $rc if ($rc > 1); - - if (defined($group)) { - $rc = $self->groupExists($driver, $target, $group); - return SCST_C_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - } - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -2617,21 +2494,32 @@ sub clearLuns { $cmd .= "clear"; my $io = new IO::File $path, O_WRONLY; - - return $err if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_GRP_CLR_LUN_FAIL; + $rc = $self->targetExists($driver, $target); + return SCST_C_TGT_NO_TARGET if (!$rc); + return $rc if ($rc > 1); + + if (defined($group)) { + $rc = $self->groupExists($driver, $target, $group); + return SCST_C_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); + } + + return $err; } sub deviceHandler { @@ -2695,15 +2583,14 @@ sub deviceAttributes { my $device = shift; my %attributes; - if ($self->deviceOpen($device) != TRUE) { - $self->{'err_string'} = "deviceAttributes(): Device '$device' is not open"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_DEVICES_DIR(), $device); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "deviceAttributes(): Unable to read directory '$_path': $!"; + if ($self->deviceOpen($device) != TRUE) { + $self->{'err_string'} = "deviceAttributes(): Device '$device' is not open"; + } else { + $self->{'err_string'} = "deviceAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -2739,6 +2626,7 @@ sub deviceAttributes { $attributes{$attribute}->{'static'} = TRUE; } + close $eHandle; } elsif ($attribute eq 'handler') { my $linked = readlink $pPath; @@ -2776,7 +2664,7 @@ sub deviceAttributes { } my ($value, $is_key) = split("\n", _sysread($io) , 2); - + close $io; chomp $value; $is_key = new_sysfs_interface() && @@ -2811,6 +2699,8 @@ sub deviceAttributes { } } + close $pHandle; + return \%attributes; } @@ -2819,15 +2709,14 @@ sub driverAttributes { my $driver = shift; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "driverAttributes(): Driver '$driver' is not available"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "driverAttributes(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "driverAttributes(): Driver '$driver' is not available"; + } else { + $self->{'err_string'} = "driverAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -2903,12 +2792,15 @@ sub driverAttributes { $attributes{$attribute}->{'value'} = $value; } } + close $io; $attributes{$attribute}->{'static'} = $is_static; } } } + close $pHandle; + return \%attributes; } @@ -2918,35 +2810,28 @@ sub setDriverAttribute { my $attribute = shift; my $value = shift; - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if ($rc > 1); - return TRUE if (!defined($attribute) || !defined($value)); - my $attributes = $self->driverAttributes($driver); - - return SCST_C_DRV_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_DRV_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my $path = make_path(SCST_TARGETS_DIR(), $driver, $attribute); my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DRV_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DRV_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_DRV_BAD_ATTRIBUTES, + SCST_C_DRV_ATTRIBUTE_STATIC); } sub targetAttributes { @@ -2957,20 +2842,16 @@ sub targetAttributes { return undef if (!defined($driver) || !defined($target)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "targetAttributes(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "targetAttributes(): Target '$target' is not available"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "targetAttributes(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "targetAttributes(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "targetAttributes(): Target '$target' is not available"; + } else { + $self->{'err_string'} = "targetAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3028,6 +2909,7 @@ sub targetAttributes { chomp $value if (defined($value)); my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && !$is_static || $is_key && $is_key =~ /\[key\]/; @@ -3052,6 +2934,8 @@ sub targetAttributes { } } + close $pHandle; + return \%attributes; } @@ -3062,21 +2946,8 @@ sub setTargetAttribute { my $attribute = shift; my $value = shift; - 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_NO_TARGET if (!$rc); - return $rc if ($rc > 1); - return TRUE if (!defined($attribute) || !defined($value)); - my $attributes = $self->targetAttributes($driver, $target); - - return SCST_C_TGT_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_TGT_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my ($path, $cmd); if (new_sysfs_interface() && ($attribute eq 'enabled' || $attribute eq 'cpu_mask')) { @@ -3092,21 +2963,27 @@ sub setTargetAttribute { } my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGT_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $cmd > $path\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $cmd > $path\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_TGT_SETATTR_FAIL; + $rc = $self->targetExists($driver, $target); + return SCST_C_TGT_NO_TARGET if (!$rc); + return $rc if ($rc > 1); + + return setAttrFailed($path, SCST_C_TGT_BAD_ATTRIBUTES, + SCST_C_TGT_ATTRIBUTE_STATIC); } sub groupAttributes { @@ -3116,26 +2993,19 @@ sub groupAttributes { my $group = shift; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "groupAttributes(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "groupAttributes(): Target '$target' is not available"; - return undef; - } - - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "groupAttributes(): Group '$group' does not exist"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "groupAttributes(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "groupAttributes(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "groupAttributes(): Target '$target' is not available"; + } elsif ($self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "groupAttributes(): Group '$group' does not exist"; + } else { + $self->{'err_string'} = "groupAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3173,6 +3043,7 @@ sub groupAttributes { chomp $value; my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && !$is_static || $is_key && $is_key =~ /\[key\]/; @@ -3197,6 +3068,8 @@ sub groupAttributes { } } + close $pHandle; + return \%attributes; } @@ -3208,25 +3081,8 @@ sub setGroupAttribute { my $attribute = shift; my $value = shift; - 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_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); - return TRUE if (!defined($attribute) || !defined($value)); - my $attributes = $self->groupAttributes($driver, $target, $group); - - return SCST_C_GRP_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_GRP_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my ($path, $cmd); if (new_sysfs_interface() && $attribute eq 'cpu_mask') { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -3240,21 +3096,31 @@ sub setGroupAttribute { $cmd .= $value; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_GRP_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $cmd > $path\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $cmd > $path\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_GRP_SETATTR_FAIL; + $rc = $self->targetExists($driver, $target); + 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); + + return setAttrFailed($path, SCST_C_GRP_BAD_ATTRIBUTES, + SCST_C_GRP_ATTRIBUTE_STATIC); } sub lunAttributes { @@ -3265,24 +3131,9 @@ sub lunAttributes { my $group = shift; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "lunAttributes(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "lunAttributes(): Target '$target' is not available"; - return undef; - } - my ($_path, $luncrattr); if (defined($group)) { - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "lunAttributes(): Group '$group' does not exist"; - return undef; - } - $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, $lun); $luncrattr = $self->lunCreateAttributes($driver, $target, @@ -3293,14 +3144,19 @@ sub lunAttributes { $luncrattr = $self->lunCreateAttributes($driver, $target); } - if ($self->lunExists($driver, $target, $lun, $group) != TRUE) { - $self->{'err_string'} = "lunAttributes(): LUN '$lun' does not exist"; - return undef; - } - my $pHandle = new IO::Handle; if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "lunAttributes(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "lunAttributes(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "lunAttributes(): Target '$target' is not available"; + } elsif (defined($group) && $self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "lunAttributes(): Group '$group' does not exist"; + } elsif ($self->lunExists($driver, $target, $lun, $group) != TRUE) { + $self->{'err_string'} = "lunAttributes(): LUN '$lun' does not exist"; + } else { + $self->{'err_string'} = "lunAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3342,6 +3198,7 @@ sub lunAttributes { chomp $value; my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && (!$is_static || defined($$luncrattr{$attribute})) || @@ -3368,6 +3225,8 @@ sub lunAttributes { } } + close $pHandle; + return \%attributes; } @@ -3384,6 +3243,29 @@ sub setLunAttribute { if (!defined($driver) || !defined($target) || !defined($lun) || !defined($attribute) || !defined($value)); + my $path; + + if (defined($group)) { + $path = make_path(SCST_TARGETS_DIR(), $driver, $target, + SCST_GROUPS, $group, SCST_LUNS, $lun, + $attribute); + } else { + $path = make_path(SCST_TARGETS_DIR(), $driver, $target, + SCST_LUNS, $lun, $attribute); + } + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); @@ -3392,19 +3274,10 @@ sub setLunAttribute { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - my $path; - if (defined($group)) { $rc = $self->groupExists($driver, $target, $group); return SCST_C_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); - - $path = make_path(SCST_TARGETS_DIR(), $driver, $target, - SCST_GROUPS, $group, SCST_LUNS, $lun, - $attribute); - } else { - $path = make_path(SCST_TARGETS_DIR(), $driver, $target, - SCST_LUNS, $lun, $attribute); } $rc = $self->lunExists($driver, $target, $lun, $group); @@ -3417,21 +3290,6 @@ sub setLunAttribute { return SCST_C_LUN_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); return SCST_C_LUN_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_LUN_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_LUN_SETATTR_FAIL; } @@ -3443,31 +3301,21 @@ sub initiatorAttributes { my $initiator = shift; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "initiatorAttributes(): Driver '$driver' is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "initiatorAttributes(): Target '$target' is not available"; - return undef; - } - - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "initiatorAttributes(): Group '$group' does not exist"; - return undef; - } - - if ($self->initiatorExists($driver, $target, $group, $initiator) != TRUE) { - $self->{'err_string'} = "initiatorAttributes(): Initiator '$initiator' does not exist"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_INITIATORS, $initiator); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "initiatorAttributes(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "initiatorAttributes(): Driver '$driver' is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "initiatorAttributes(): Target '$target' is not available"; + } elsif ($self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "initiatorAttributes(): Group '$group' does not exist"; + } elsif ($self->initiatorExists($driver, $target, $group, $initiator) != TRUE) { + $self->{'err_string'} = "initiatorAttributes(): Initiator '$initiator' does not exist"; + } else { + $self->{'err_string'} = "initiatorAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3504,6 +3352,7 @@ sub initiatorAttributes { chomp $value; my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && !$is_static || $is_key && $is_key =~ /\[key\]/; @@ -3528,6 +3377,8 @@ sub initiatorAttributes { } } + close $pHandle; + return \%attributes; } @@ -3540,6 +3391,23 @@ sub setInitiatorAttribute { my $attribute = shift; my $value = shift; + return TRUE if (!defined($attribute) || !defined($value)); + + my $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, + $group, SCST_LUNS, $initiator, $attribute); + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); return $rc if ($rc > 1); @@ -3556,31 +3424,6 @@ sub setInitiatorAttribute { return SCST_C_GRP_NO_INI if (!$rc); return $rc if ($rc > 1); - return TRUE if (!defined($attribute) || !defined($value)); - - my $attributes = $self->initiatorAttributes($driver, $target, $group, $initiator); - - return SCST_C_INI_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_INI_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - - my $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, - $group, SCST_LUNS, $initiator, $attribute); - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_INI_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_INI_SETATTR_FAIL; } @@ -3589,15 +3432,14 @@ sub deviceGroupAttributes { my $group = shift; my %attributes; - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroupAttributes(): Device group '$group' does not exist"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "deviceGroupAttributes(): Unable to read directory '$_path': $!"; + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "deviceGroupAttributes(): Device group '$group' does not exist"; + } else { + $self->{'err_string'} = "deviceGroupAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3632,6 +3474,7 @@ sub deviceGroupAttributes { chomp $value; my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && !$is_static || $is_key && $is_key =~ /\[key\]/; @@ -3656,6 +3499,8 @@ sub deviceGroupAttributes { } } + close $pHandle; + return \%attributes; } @@ -3665,20 +3510,16 @@ sub targetGroupAttributes { my $tgroup = shift; my %attributes; - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroupAttributes(): Device group '$group' does not exist"; - return undef; - } - - if ($self->targetGroupExists($group, $tgroup) != TRUE) { - $self->{'err_string'} = "targetGroupAttributes(): Target Group '$tgroup' does not exist"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup); if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "targetGroupAttributes(): Unable to read directory '$_path': $!"; + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "targetGroupAttributes(): Device group '$group' does not exist"; + } elsif ($self->targetGroupExists($group, $tgroup) != TRUE) { + $self->{'err_string'} = "targetGroupAttributes(): Target Group '$tgroup' does not exist"; + } else { + $self->{'err_string'} = "targetGroupAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3713,6 +3554,7 @@ sub targetGroupAttributes { chomp $value; my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && !$is_static || $is_key && $is_key =~ /\[key\]/; @@ -3737,6 +3579,8 @@ sub targetGroupAttributes { } } + close $pHandle; + return \%attributes; } @@ -3747,21 +3591,6 @@ sub targetGroupTargetAttributes { my $tgt = shift; my %attributes; - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroupTargetAttributes(): Device group '$group' does not exist"; - return undef; - } - - if ($self->targetGroupExists($group, $tgroup) != TRUE) { - $self->{'err_string'} = "targetGroupTargetAttributes(): Target Group '$tgroup' does not exist"; - return undef; - } - - if ($self->targetGroupTargetExists($group, $tgroup, $tgt) != TRUE) { - $self->{'err_string'} = "targetGroupTargetAttributes(): Target '$tgt' does not exist"; - return undef; - } - my $pHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup, $tgt); if (-l $_path) { @@ -3769,7 +3598,15 @@ sub targetGroupTargetAttributes { } if (!(opendir $pHandle, $_path)) { - $self->{'err_string'} = "targetGroupTargetAttributes(): Unable to read directory '$_path': $!"; + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "targetGroupTargetAttributes(): Device group '$group' does not exist"; + } elsif ($self->targetGroupExists($group, $tgroup) != TRUE) { + $self->{'err_string'} = "targetGroupTargetAttributes(): Target Group '$tgroup' does not exist"; + } elsif ($self->targetGroupTargetExists($group, $tgroup, $tgt) != TRUE) { + $self->{'err_string'} = "targetGroupTargetAttributes(): Target '$tgt' does not exist"; + } else { + $self->{'err_string'} = "targetGroupTargetAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -3805,6 +3642,7 @@ sub targetGroupTargetAttributes { chomp $value; my $is_key = <$io>; + close $io; $is_key = new_sysfs_interface() && !$is_static || $is_key && $is_key =~ /\[key\]/; @@ -3829,6 +3667,8 @@ sub targetGroupTargetAttributes { } } + close $pHandle; + return \%attributes; } @@ -3839,27 +3679,21 @@ sub setAluaAttribute { return TRUE if (!defined($attribute) || !defined($value)); - my $attributes = $self->aluaAttributes(); - - return SCST_C_ALUA_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_ALUA_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my $path = make_path(SCST_DEV_GROUP_DIR(), $attribute); my $io = new IO::File $path, O_WRONLY; - - return SCST_C_ALUA_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $value > $path\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $value > $path\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; - - return ($self->{'debug'} || $bytes) ? 0 : SCST_C_ALUA_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_ALUA_BAD_ATTRIBUTES, + SCST_C_ALUA_ATTRIBUTE_STATIC); } sub setDeviceGroupAttribute { @@ -3868,35 +3702,28 @@ sub setDeviceGroupAttribute { my $attribute = shift; my $value = shift; - my $rc = $self->deviceGroupExists($group); - return SCST_C_DEV_GRP_NO_GROUP if (!$rc); - return $rc if ($rc > 1); - return TRUE if (!defined($attribute) || !defined($value)); - my $attributes = $self->deviceGroupAttributes($group); - - return SCST_C_DGRP_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_DGRP_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my $path = make_path(SCST_DEV_GROUP_DIR(), $group, $attribute); my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DGRP_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceGroupExists($group); + return SCST_C_DEV_GRP_NO_GROUP if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DGRP_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_DGRP_BAD_ATTRIBUTES, + SCST_C_DGRP_ATTRIBUTE_STATIC); } sub setTargetGroupAttribute { @@ -3909,6 +3736,20 @@ sub setTargetGroupAttribute { return TRUE if (!defined($group) || !defined($tgroup) || !defined($attribute) || !defined($value)); + my $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup, $attribute); + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->deviceGroupExists($group); return SCST_C_DEV_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); @@ -3917,31 +3758,8 @@ sub setTargetGroupAttribute { return SCST_C_DGRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); - return TRUE if (!defined($attribute) || !defined($value)); - - my $attributes = $self->targetGroupAttributes($group, $tgroup); - - return SCST_C_TGRP_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_TGRP_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - - my $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup, $attribute); - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGRP_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_TGRP_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_TGRP_BAD_ATTRIBUTES, + SCST_C_TGRP_ATTRIBUTE_STATIC); } sub setTargetGroupTargetAttribute { @@ -3956,6 +3774,21 @@ sub setTargetGroupTargetAttribute { !defined($tgt) || !defined($attribute) || !defined($value)); + my $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, + $tgroup, $tgt, $attribute); + + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->deviceGroupExists($group); return SCST_C_DEV_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); @@ -3968,30 +3801,8 @@ sub setTargetGroupTargetAttribute { return SCST_C_TGRP_NO_TGT if (!$rc); return $rc if ($rc > 1); - my $attributes = $self->targetGroupTargetAttributes($group, $tgroup, $tgt); - - return SCST_C_TGRP_TGT_BAD_ATTR if (!defined($$attributes{$attribute})); - return SCST_C_TGRP_TGT_ATTR_STATIC if ($$attributes{$attribute}->{'static'}); - - my $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, - $tgroup, $tgt, $attribute); - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_TGRP_TGT_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_TGRP_TGT_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_TGRP_TGT_BAD_ATTR, + SCST_C_TGRP_TGT_ATTR_STATIC); } sub handlers { @@ -4041,35 +3852,27 @@ sub setHandlerAttribute { my $attribute = shift; my $value = shift; + return TRUE if (!defined($attribute) || !defined($value)); + + my $path = make_path(SCST_HANDLERS_DIR(), $handler, $attribute); + my $io = new IO::File $path, O_WRONLY; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $path -> $attribute = $value\n"; + } else { + $bytes = _syswrite($io, $value, length($value)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); + } + my $rc = $self->handlerExists($handler); return SCST_C_HND_NO_HANDLER if (!$rc); return $rc if ($rc > 1); - return TRUE if (!defined($attribute) || !defined($value)); - - my $attributes = $self->handlerAttributes($handler); - - return SCST_C_HND_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_HND_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - - my $path = make_path(SCST_HANDLERS_DIR(), $handler, $attribute); - - my $io = new IO::File $path, O_WRONLY; - - return SCST_C_HND_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $path -> $attribute = $value\n"; - } else { - $bytes = _syswrite($io, $value, length($value)); - } - - close $io; - - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_HND_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_HND_BAD_ATTRIBUTES, + SCST_C_HND_ATTRIBUTE_STATIC); } sub handlerAttributes { @@ -4077,17 +3880,16 @@ sub handlerAttributes { my $handler = shift; my %attributes; - if ($self->handlerExists($handler) != TRUE) { - $self->{'err_string'} = "handlerAttributes(): Handler '$handler' is not available"; - return undef; - } - $attributes{'devices'}->{'value'} = devices($self, $handler); my $hHandle = new IO::Handle; my $_path = make_path(SCST_HANDLERS_DIR(), $handler); if (!(opendir $hHandle, $_path)) { - $self->{'err_string'} = "handlerAttributes(): Unable to read directory '$_path': $!"; + if ($self->handlerExists($handler) != TRUE) { + $self->{'err_string'} = "handlerAttributes(): Handler '$handler' is not available"; + } else { + $self->{'err_string'} = "handlerAttributes(): Unable to read directory '$_path': $!"; + } return undef; } @@ -4173,6 +3975,8 @@ sub handlerAttributes { close $io; } + close $hHandle; + $attributes{'devices'}->{'static'} = TRUE; return \%attributes; @@ -4198,14 +4002,15 @@ sub handlerDeviceExists { my $handler = shift; my $device = shift; - my $rc = $self->handlerExists($handler); - - return FALSE if (!$rc); - return $rc if ($rc > 1); - my $devices = $self->devicesByHandler($handler); - return SCST_C_FATAL_ERROR if (!defined($devices)); + if (!defined($devices)) { + my $rc = $self->handlerExists($handler); + return FALSE if (!$rc); + return $rc if ($rc > 1); + + return SCST_C_FATAL_ERROR; + } foreach my $_device (@{$devices}) { return TRUE if ($_device eq $device); @@ -4218,14 +4023,15 @@ sub devicesByHandler { my $self = shift; my $handler = shift; - if ($self->handlerExists($handler) != TRUE) { - $self->{'err_string'} = "devicesByHandler(): Handler '$handler' is not available"; + my $attributes = $self->handlerAttributes($handler); + + if (!defined($attributes)) { + if ($self->handlerExists($handler) != TRUE) { + $self->{'err_string'} = "devicesByHandler(): Handler '$handler' is not available"; + } return undef; } - my $attributes = $self->handlerAttributes($handler); - - return undef if (!defined($attributes)); return \@{$$attributes{'devices'}->{'value'}}; } @@ -4236,13 +4042,14 @@ sub checkDeviceCreateAttributes { return FALSE if (!defined($check)); - my $rc = $self->handlerExists($handler); - return SCST_C_HND_NO_HANDLER if (!$rc); - return $rc if (!$rc > 1); - my $available = $self->deviceCreateAttributes($handler); - return SCST_C_FATAL_ERROR if (!defined($available)); + if (!defined($available)) { + my $rc = $self->handlerExists($handler); + return SCST_C_HND_NO_HANDLER if (!$rc); + return $rc if (!$rc > 1); + return SCST_C_FATAL_ERROR; + } if (ref($check) eq 'HASH') { foreach my $attribute (keys %{$check}) { @@ -4265,12 +4072,6 @@ sub deviceCreateAttributes { my $available; my %attributes; - if ($self->handlerExists($handler) != TRUE) { - $self->{'err_string'} = "deviceCreateAttributes(): Handler '$handler' ". - "is not available"; - return undef; - } - if (new_sysfs_interface()) { my $io = new IO::File make_path(SCST_HANDLERS_DIR(), $handler, SCST_ADD_DEV_PARAMS), O_RDONLY; @@ -4279,13 +4080,19 @@ sub deviceCreateAttributes { chomp($attribute); $attributes{$attribute} = ''; } + close $io; } else { my $io = new IO::File make_path(SCST_HANDLERS_DIR(), $handler, SCST_MGMT_IO), O_RDONLY; if (!$io) { - $self->{'err_string'} = "deviceCreateAttributes(): Unable to open mgmt ". - "interface for handler '$handler': $!"; + if ($self->handlerExists($handler) != TRUE) { + $self->{'err_string'} = "deviceCreateAttributes(): Handler '$handler' ". + "is not available"; + } else { + $self->{'err_string'} = "deviceCreateAttributes(): Unable to open mgmt ". + "interface for handler '$handler': $!"; + } return undef; } @@ -4295,6 +4102,7 @@ sub deviceCreateAttributes { $available =~ s/\.$//; } } + close $io; if ($available) { foreach my $attribute (split(/\,/, $available)) { @@ -4318,18 +4126,6 @@ sub openDevice { !defined($device) || !defined($attributes)); - my $rc = $self->handlerExists($handler); - return SCST_C_HND_NO_HANDLER if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->checkDeviceCreateAttributes($handler, $attributes); - return SCST_C_DEV_BAD_ATTRIBUTES if ($rc == TRUE); - return $rc if ($rc > 1); - - $rc = $self->handlerDeviceExists($handler, $device); - return SCST_C_DEV_EXISTS if ($rc == TRUE); - return $rc if ($rc > 1); - my $o_string = ""; foreach my $attribute (keys %{$attributes}) { my $value = $$attributes{$attribute}; @@ -4348,23 +4144,36 @@ sub openDevice { $cmd .= "add_device $device $o_string"; my $io = new IO::File $path, O_WRONLY; - - if (!$io) { - $self->{'err_string'} = "openDevice(): Unable to open mgmt interface for ". - "handler '$handler': $!"; - return SCST_C_FATAL_ERROR; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - my $bytes; + my $errno = $!; - if ($self->{'debug'}) { - print "DBG($$): $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } + my $rc = $self->handlerExists($handler); + return SCST_C_HND_NO_HANDLER if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DEV_OPEN_FAIL; + $rc = $self->checkDeviceCreateAttributes($handler, $attributes); + return SCST_C_DEV_BAD_ATTRIBUTES if ($rc == TRUE); + return $rc if ($rc > 1); + + $rc = $self->handlerDeviceExists($handler, $device); + return SCST_C_DEV_EXISTS if ($rc == TRUE); + return $rc if ($rc > 1); + + return SCST_C_DEV_OPEN_FAIL if ($errno == EINVAL); + + $self->{'err_string'} = "openDevice(): Unable to open mgmt interface for ". + "handler '$handler': $errno"; + return SCST_C_FATAL_ERROR; } sub closeDevice { @@ -4375,14 +4184,6 @@ sub closeDevice { return SCST_C_DEV_CLOSE_FAIL if (!defined($handler) || !defined($device)); - my $rc = $self->handlerExists($handler); - return SCST_C_HND_NO_HANDLER if (!$rc); - return $rc if ($rc > 1); - - $rc = $self->handlerDeviceExists($handler, $device); - return SCST_C_DEV_NO_DEVICE if ($rc != TRUE); - return $rc if ($rc > 1); - my ($path, $cmd); if (new_sysfs_interface()) { $path = make_path(SCST_ROOT_DIR(), SCST_MGMT_IO); @@ -4393,23 +4194,30 @@ sub closeDevice { $cmd .= "del_device $device"; my $io = new IO::File $path, O_WRONLY; - - if (!$io) { - $self->{'err_string'} = "closeDevice(): Unable to open mgmt interface for handler ". - "'$handler': $!"; - return SCST_C_FATAL_ERROR; + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - my $bytes; + my $errno = $!; - if ($self->{'debug'}) { - print "DBG($$): $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); - } + my $rc = $self->handlerExists($handler); + return SCST_C_HND_NO_HANDLER if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DEV_CLOSE_FAIL; + $rc = $self->handlerDeviceExists($handler, $device); + return SCST_C_DEV_NO_DEVICE if ($rc != TRUE); + return $rc if ($rc > 1); + + $self->{'err_string'} = "closeDevice(): Unable to open mgmt interface for handler ". + "'$handler': $errno"; + return SCST_C_FATAL_ERROR; } sub setDeviceAttribute { @@ -4418,17 +4226,6 @@ sub setDeviceAttribute { my $attribute = shift; my $value = shift; - my $rc = $self->deviceOpen($device); - return SCST_C_DEV_NO_DEVICE if (!$rc); - return $rc if ($rc > 1); - - my $attributes = $self->deviceAttributes($device); - - return SCST_C_FATAL_ERROR if (!defined($attributes)); - - return SCST_C_DEV_BAD_ATTRIBUTES if (!defined($$attributes{$attribute})); - return SCST_C_DEV_ATTRIBUTE_STATIC if ($$attributes{$attribute}->{'static'}); - my ($path, $cmd); if (new_sysfs_interface() && ($attribute eq 'filename' || @@ -4442,21 +4239,23 @@ sub setDeviceAttribute { $cmd .= $value; my $io = new IO::File $path, O_WRONLY; - - return SCST_C_DEV_SETATTR_FAIL if (!$io); - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $cmd > $path\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $cmd > $path\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - close $io; + my $rc = $self->deviceOpen($device); + return SCST_C_DEV_NO_DEVICE if (!$rc); + return $rc if ($rc > 1); - return FALSE if ($self->{'debug'} || $bytes); - return SCST_C_DEV_SETATTR_FAIL; + return setAttrFailed($path, SCST_C_DEV_BAD_ATTRIBUTES, + SCST_C_DEV_ATTRIBUTE_STATIC); } sub checkTargetCreateAttributes { @@ -4466,13 +4265,14 @@ sub checkTargetCreateAttributes { return FALSE if (!defined($check)); - my $rc = $self->driverExists($driver); - return SCST_C_DRV_NO_DRIVER if (!$rc); - return $rc if ($rc > 1); - my $available = $self->targetCreateAttributes($driver); - return SCST_C_FATAL_ERROR if (!defined($available)); + if (!defined($available)) { + my $rc = $self->driverExists($driver); + return SCST_C_DRV_NO_DRIVER if (!$rc); + return $rc if ($rc > 1); + return SCST_C_FATAL_ERROR; + } if (ref($check) eq 'HASH') { foreach my $attribute (keys %{$check}) { @@ -4495,12 +4295,6 @@ sub targetCreateAttributes { my $available; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "targetCreateAttributes(): Driver '$driver' ". - "is not available"; - return undef; - } - if (new_sysfs_interface()) { my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_ADD_TGT_PARAMS), O_RDONLY; @@ -4508,13 +4302,19 @@ sub targetCreateAttributes { chomp($attribute); $attributes{$attribute} = ''; } + close $io; } else { my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO), O_RDONLY; if (!$io) { - $self->{'err_string'} = "targetCreateAttributes(): Unable to open driver mgmt ". - "interface for driver '$driver': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "targetCreateAttributes(): Driver '$driver' ". + "is not available"; + } else { + $self->{'err_string'} = "targetCreateAttributes(): Unable to open driver mgmt ". + "interface for driver '$driver': $!"; + } return undef; } @@ -4524,6 +4324,7 @@ sub targetCreateAttributes { $available =~ s/\.$//; } } + close $io; if ($available) { foreach my $attribute (split(/\,/, $available)) { @@ -4583,14 +4384,15 @@ sub deviceGroupDeviceExists { my $group = shift; my $device = shift; - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "deviceGroupDeviceExists(): Device group '$group' does not exist"; - return undef; - } - my $devices = $self->deviceGroupDevices($group); - return SCST_C_FATAL_ERROR if (!defined($devices)); + if (!defined($devices)) { + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "deviceGroupDeviceExists(): Device group '$group' does not exist"; + return undef; + } + return SCST_C_FATAL_ERROR; + } foreach my $_device (@{$devices}) { return TRUE if ($device eq $_device); @@ -4604,14 +4406,15 @@ sub targetGroupExists { my $group = shift; my $tgroup = shift; - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroupExists(): Device group '$group' does not exist"; - return undef; - } - my $tgroups = $self->targetGroups($group); - return SCST_C_FATAL_ERROR if (!defined($tgroups)); + if (!defined($tgroups)) { + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "targetGroupExists(): Device group '$group' does not exist"; + return undef; + } + return SCST_C_FATAL_ERROR; + } foreach my $_tgroup (@{$tgroups}) { return TRUE if ($tgroup eq $_tgroup); @@ -4626,19 +4429,19 @@ sub targetGroupTargetExists { my $tgroup = shift; my $tgt = shift; - if ($self->deviceGroupExists($group) != TRUE) { - $self->{'err_string'} = "targetGroupTargetExists(): Device group '$group' does not exist"; - return undef; - } - - if ($self->targetGroupExists($group, $tgroup) != TRUE) { - $self->{'err_string'} = "targetGroupTargetExists(): Target group '$tgroup' does not exist"; - return undef; - } - my $targets = $self->targetGroupTargets($group, $tgroup); - return SCST_C_FATAL_ERROR if (!defined($targets)); + if (!defined($targets)) { + if ($self->deviceGroupExists($group) != TRUE) { + $self->{'err_string'} = "targetGroupTargetExists(): Device group '$group' does not exist"; + return undef; + } elsif ($self->targetGroupExists($group, $tgroup) != TRUE) { + $self->{'err_string'} = "targetGroupTargetExists(): Target group '$tgroup' does not exist"; + return undef; + } else { + return SCST_C_FATAL_ERROR; + } + } foreach my $_tgt (@{$targets}) { return TRUE if ($tgt eq $_tgt); @@ -4656,23 +4459,25 @@ sub checkLunCreateAttributes { return FALSE if (!defined($check)); - 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_NO_TARGET 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->lunCreateAttributes($driver, $target, $group); - return SCST_C_FATAL_ERROR if (!defined($available)); + if (!defined($available)) { + 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_NO_TARGET 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); + } + + return SCST_C_FATAL_ERROR; + } if (ref($check) eq 'HASH') { foreach my $attribute (keys %{$check}) { @@ -4697,18 +4502,6 @@ sub lunCreateAttributes { my $available; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "lunCreateAttributes(): Driver '$driver' ". - "is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "lunCreateAttributes(): Target '$target' ". - "is not available"; - return undef; - } - my $_path; if (new_sysfs_interface()) { @@ -4732,14 +4525,9 @@ sub lunCreateAttributes { chomp($attribute); $attributes{$attribute} = ''; } + close $io; } else { if (defined($group)) { - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "lunCreateAttributes(): Group '$group' ". - "does not exist"; - return undef; - } - $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO); @@ -4751,8 +4539,19 @@ sub lunCreateAttributes { my $io = new IO::File $_path, O_RDONLY; if (!$io) { - $self->{'err_string'} = "lunCreateAttributes(): Unable to open luns mgmt ". - "interface for group '$group': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "lunCreateAttributes(): Driver '$driver' ". + "is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "lunCreateAttributes(): Target '$target' ". + "is not available"; + } elsif (defined($group) && $self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "lunCreateAttributes(): Group '$group' ". + "does not exist"; + } else { + $self->{'err_string'} = "lunCreateAttributes(): Unable to open luns mgmt ". + "interface for group '$group': $!"; + } return undef; } @@ -4762,6 +4561,7 @@ sub lunCreateAttributes { $available =~ s/\.$//; } } + close $io; if ($available) { foreach my $attribute (split(/\,/, $available)) { @@ -4783,21 +4583,23 @@ sub checkInitiatorCreateAttributes { return FALSE if (!defined($check)); - 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_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 $available = $self->initiatorCreateAttributes($driver, $target, $group); - return SCST_C_FATAL_ERROR if (!defined($available)); + if (!defined($available)) { + 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_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); + + return SCST_C_FATAL_ERROR; + } if (ref($check) eq 'HASH') { foreach my $attribute (keys %{$check}) { @@ -4822,24 +4624,6 @@ sub initiatorCreateAttributes { my $available; my %attributes; - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "initiatorCreateAttributes(): Driver '$driver' ". - "is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "initiatorCreateAttributes(): Target '$target' ". - "is not available"; - return undef; - } - - if ($self->groupExists($driver, $target, $group) != TRUE) { - $self->{'err_string'} = "initiatorCreateAttributes(): Group '$group' ". - "does not exist"; - return undef; - } - if (new_sysfs_interface()) { # Do nothing - there are no initiator attributes (yet). } else { @@ -4849,8 +4633,20 @@ sub initiatorCreateAttributes { O_RDONLY; if (!$io) { - $self->{'err_string'} = "initiatorCreateAttributes(): Unable to open initiators mgmt ". - "interface for group '$group': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "initiatorCreateAttributes(): Driver '$driver' ". + "is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "initiatorCreateAttributes(): Target '$target' ". + "is not available"; + return undef; + } elsif ($self->groupExists($driver, $target, $group) != TRUE) { + $self->{'err_string'} = "initiatorCreateAttributes(): Group '$group' ". + "does not exist"; + } else { + $self->{'err_string'} = "initiatorCreateAttributes(): Unable to open initiators mgmt ". + "interface for group '$group': $!"; + } return undef; } @@ -4860,6 +4656,7 @@ sub initiatorCreateAttributes { $available =~ s/\.$//; } } + close $io; if ($available) { foreach my $attribute (split(/\,/, $available)) { @@ -4881,23 +4678,19 @@ sub sessions { return undef if (!defined($driver) || !defined($target)); - if ($self->driverExists($driver) != TRUE) { - $self->{'err_string'} = "sessions(): Driver '$driver' ". - "is not available"; - return undef; - } - - if ($self->targetExists($driver, $target) != TRUE) { - $self->{'err_string'} = "sessions(): Target '$target' ". - "is not available"; - return undef; - } - my $sHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_SESSIONS); if (!(opendir $sHandle, $_path)) { - $self->{'err_string'} = "sessions(): Unable to read directory '$_path': $!"; + if ($self->driverExists($driver) != TRUE) { + $self->{'err_string'} = "sessions(): Driver '$driver' ". + "is not available"; + } elsif ($self->targetExists($driver, $target) != TRUE) { + $self->{'err_string'} = "sessions(): Target '$target' ". + "is not available"; + } else { + $self->{'err_string'} = "sessions(): Unable to read directory '$_path': $!"; + } return undef; } @@ -4949,6 +4742,7 @@ sub sessions { } my $value = <$io>; + close $io; chomp $value; $_sessions{$session}->{$attribute}->{'value'} = $value; @@ -4957,7 +4751,9 @@ sub sessions { } } } + close $pHandle; } + close $sHandle; return \%_sessions; } @@ -4979,18 +4775,17 @@ sub closeSession { SCST_SESSIONS, $session, 'force_close'); my $io = new IO::File $path, O_WRONLY; - - my $cmd = "1"; - - my $bytes; - - if ($self->{'debug'}) { - print "DBG($$): $cmd\n"; - } else { - $bytes = _syswrite($io, $cmd, length($cmd)); + if ($io) { + my $cmd = "1"; + my $bytes; + if ($self->{'debug'}) { + print "DBG($$): $cmd\n"; + } else { + $bytes = _syswrite($io, $cmd, length($cmd)); + } + close $io; + return FALSE if ($self->{'debug'} || $bytes); } - - return FALSE if ($self->{'debug'} || $bytes); return SCST_C_SESSION_CLOSE_FAIL; } @@ -5032,9 +4827,11 @@ sub sgvStats { while (my $value = <$io>) { $buffer .= $value; } + close $io; $stats{$stat}->{$lief} = $buffer; } + close $lHandle; } else { my $io = new IO::File $sPath, O_RDONLY; @@ -5048,10 +4845,12 @@ sub sgvStats { while (my $value = <$io>) { $buffer .= $value; } + close $io; $stats{$stat} = $buffer; } } + close $sHandle; return \%stats; }