From 85fed6fa4a07368408d90ea06b7a4460ffd713b8 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 15 Sep 2020 03:43:05 +0000 Subject: [PATCH 1/3] scst: Restore compatibility with RHEL 6.x git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9160 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/scst_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scst/src/scst_main.c b/scst/src/scst_main.c index da00e9945..ac4474cee 100644 --- a/scst/src/scst_main.c +++ b/scst/src/scst_main.c @@ -578,7 +578,7 @@ void scst_unregister_target(struct scst_tgt *tgt) PRINT_INFO("Still waiting for session %s/%s; state %ld; refcnt %#lx", tgt->tgt_name, sess->sess_name, sess->shut_phase, - atomic_long_read(&sess->refcnt.count)); + percpu_ref_read(&sess->refcnt)); } mutex_unlock(&scst_mutex); } From 9d9ae0f153294e0d23f9216ac093b97f2875eb75 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 15 Sep 2020 03:44:03 +0000 Subject: [PATCH 2/3] scst: Restore compatibility with gcc 4.x (RHEL 7.x) git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9161 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/include/backport.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scst/include/backport.h b/scst/include/backport.h index 0358636d4..8ffa83254 100644 --- a/scst/include/backport.h +++ b/scst/include/backport.h @@ -246,7 +246,15 @@ static inline void cpu_to_be32_array(__be32 *dst, const u32 *src, size_t len) * pseudo keyword for switch/case use") # v5.4 */ #ifndef fallthrough +#ifdef __has_attribute +#if __has_attribute(__fallthrough__) #define fallthrough __attribute__((__fallthrough__)) +#else +#define fallthrough do {} while (0) /* fallthrough */ +#endif +#else +#define fallthrough do {} while (0) /* fallthrough */ +#endif #endif /* */ From 443c7ec5d960d61408f034c11444ae378a10b379 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 15 Sep 2020 03:47:40 +0000 Subject: [PATCH 3/3] scstadmin: Make argument checking more systematic Additionally, suppress warning messages about 'length(undefined)' on RHEL 6.x. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9162 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- .../scst-1.0.0/lib/SCST/SCST.pm | 201 +++++++++--------- .../scstadmin.sysfs/scst-1.0.0/t/05-dynattr.t | 12 +- scstadmin/scstadmin.sysfs/scstadmin | 37 ++-- 3 files changed, 127 insertions(+), 123 deletions(-) diff --git a/scstadmin/scstadmin.sysfs/scst-1.0.0/lib/SCST/SCST.pm b/scstadmin/scstadmin.sysfs/scst-1.0.0/lib/SCST/SCST.pm index ef638ca32..cedc44742 100644 --- a/scstadmin/scstadmin.sysfs/scst-1.0.0/lib/SCST/SCST.pm +++ b/scstadmin/scstadmin.sysfs/scst-1.0.0/lib/SCST/SCST.pm @@ -466,6 +466,15 @@ sub scstAttributes { return (\%attributes, undef); } +# Older Perl versions complain if the argument of length() is undefined. Hence +# this function that checks whether its arguments are defined and not empty. +sub valid { + for my $arg (@_) { + return FALSE if (!defined($arg) || $arg eq ""); + } + return TRUE; +} + # Convert e.g. EINVAL into "EINVAL". sub my_strerror { my ($errorcode) = @_; @@ -492,7 +501,7 @@ sub setScstAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); # There is a space between the unary minus sign and ENOENT because # without that space older Perl versions report the following warning: @@ -543,7 +552,7 @@ sub targets { my $self = shift; my $driver = shift; - return (undef, "Too few arguments") if (!length($driver)); + return (undef, "Too few arguments") if (!valid($driver)); my $tHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver); @@ -578,7 +587,7 @@ sub groups { my $driver = shift; my $target = shift; - return (undef, "Too few arguments") if (!length($driver) || !length($target)); + return (undef, "Too few arguments") if (!valid($driver, $target)); my $gHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, @@ -620,7 +629,7 @@ sub initiators { my $errorString; return (undef, "Too few arguments") - if (!length($driver) || !length($target) || !length($group)); + if (!valid($driver, $target, $group)); my $iHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, @@ -657,11 +666,11 @@ sub luns { my $group = shift; my $errorString; - return (undef, "Too few arguments") if (!length($driver) || !length($target)); + return (undef, "Too few arguments") if (!valid($driver, $target)); my $_path; - if (length($group)) { + if (valid($group)) { $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS); } else { @@ -672,7 +681,8 @@ sub luns { my $lHandle = new IO::Handle; if (!(opendir $lHandle, $_path)) { - if (length($group) && $self->groupExists($driver, $target, $group) != TRUE) { + if (valid($group) && + $self->groupExists($driver, $target, $group) != TRUE) { $errorString = "initiators(): Group '$group' does not exist"; } elsif ($self->driverExists($driver) != TRUE) { $errorString = "luns(): Driver '$driver' is not available"; @@ -800,7 +810,7 @@ sub deviceGroupDevices { my @devices; my $errorString; - return (undef, "Too few arguments") if (!length($group)); + return (undef, "Too few arguments") if (!valid($group)); my $dHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES); @@ -832,7 +842,7 @@ sub targetGroups { my @tgroups; my $errorString; - return (undef, "Too few arguments") if (!length($group)); + return (undef, "Too few arguments") if (!valid($group)); my $dHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS); @@ -865,7 +875,7 @@ sub targetGroupTargets { my @targets; my $errorString; - return (undef, "Too few arguments") if (!length($group) || !length($tgroup)); + return (undef, "Too few arguments") if (!valid($group, $tgroup)); my $dHandle = new IO::Handle; my $_path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup); @@ -901,7 +911,7 @@ sub driverExists { my $dHandle = new IO::Handle; my $result; - $result = length($driver) && + $result = valid($driver) && opendir($dHandle, make_path(SCST_TARGETS_DIR(), $driver)); close $dHandle if ($result); @@ -915,7 +925,7 @@ sub driverDynamicAttributes { my $available; my $errorString; - return (undef, "Too few arguments") if (!length($driver)); + return (undef, "Too few arguments") if (!valid($driver)); my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO), O_RDONLY; @@ -955,7 +965,7 @@ sub checkDriverDynamicAttributes { my $driver = shift; my $check = shift; - return TRUE if (!length($driver)); + return TRUE if (!valid($driver)); my ($available, $errorString) = $self->driverDynamicAttributes($driver); @@ -990,8 +1000,8 @@ sub addDriverDynamicAttribute { my $attribute = shift; my $value = shift; - return SCST_C_DRV_ADDATTR_FAIL - if (!length($driver) || !defined($attribute) || !defined($value)); + return SCST_C_DRV_ADDATTR_FAIL if (!valid($driver, $attribute) || + !defined($value)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); @@ -1028,8 +1038,8 @@ sub removeDriverDynamicAttribute { my $attribute = shift; my $value = shift; - return SCST_C_DRV_REMATTR_FAIL - if (!length($driver) || !defined($attribute) || !defined($value)); + return SCST_C_DRV_REMATTR_FAIL if (!valid($driver, $attribute) || + !defined($value)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); @@ -1065,7 +1075,7 @@ sub targetExists { my $driver = shift; my $target = shift; - return length($driver) && length($target) && + return valid($driver, $target) && $target ne '.' && $target ne '..' && $target ne 'module' && (-d make_path(SCST_TARGETS_DIR(), $driver, $target)) ? TRUE : FALSE; } @@ -1083,7 +1093,7 @@ sub targetType { my $target = shift; my $errorString; - return (undef, "Too few arguments") if (!length($driver) || !length($target)); + return (undef, "Too few arguments") if (!valid($driver, $target)); if ($self->driverIsVirtualCapable($driver)) { my $attribs; @@ -1160,7 +1170,7 @@ sub targetDynamicAttributes { my $available; my $errorString; - return (undef, "Too few arguments") if (!length($driver)); + return (undef, "Too few arguments") if (!valid($driver)); my $io = new IO::File make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO), O_RDONLY; @@ -1235,8 +1245,7 @@ sub addTargetDynamicAttribute { my $value = shift; return SCST_C_TGT_ADDATTR_FAIL - if (!length($driver) || !defined($target) || - !defined($attribute) || !defined($value)); + if (!valid($driver, $target, $attribute) || !defined($value)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); @@ -1279,8 +1288,7 @@ sub removeTargetDynamicAttribute { my $value = shift; return SCST_C_TGT_REMATTR_FAIL - if (!defined($driver) || !defined($target) || - !defined($attribute) || !defined($value)); + if (!valid($driver, $target, $attribute) || !defined($value)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, SCST_MGMT_IO); @@ -1389,7 +1397,7 @@ sub groupExists { my $target = shift; my $group = shift; - return FALSE if (!defined($driver) || !defined($target) || !defined($group)); + return FALSE if (!valid($driver, $target, $group)); my ($groups, $errorString) = $self->groups($driver, $target); @@ -1415,8 +1423,7 @@ sub initiatorExists { my $group = shift; my $initiator = shift; - return FALSE if (!defined($driver) || !defined($target) || - !defined($group) || !defined($initiator)); + return FALSE if (!valid($driver, $target, $group, $initiator)); my ($initiators, $errorString) = $self->initiators($driver, $target, $group); @@ -1442,8 +1449,7 @@ sub lunExists { my $lun = shift; my $group = shift; - return FALSE if (!defined($driver) || !defined($target) || - !defined($lun)); + return FALSE if (!valid($driver, $target, $lun)); my ($luns, $errorString) = $self->luns($driver, $target, $group); @@ -1477,8 +1483,7 @@ sub addGroup { my $target = shift; my $group = shift; - return SCST_C_GRP_ADD_FAIL if (!length($driver) || !length($target) || - !length($group)); + return SCST_C_GRP_ADD_FAIL if (!valid($driver, $target, $group)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, @@ -1518,8 +1523,7 @@ sub removeGroup { my $target = shift; my $group = shift; - return SCST_C_GRP_REM_FAIL if (!length($driver) || !length($target) || - !length($group)); + return SCST_C_GRP_REM_FAIL if (!valid($driver, $target, $group)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, @@ -1557,7 +1561,7 @@ sub addDeviceGroup { my $self = shift; my $group = shift; - return SCST_C_DEV_GRP_ADD_FAIL if (!defined($group)); + return SCST_C_DEV_GRP_ADD_FAIL if (!valid($group)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), SCST_MGMT_IO); @@ -1584,7 +1588,7 @@ sub removeDeviceGroup { my $self = shift; my $group = shift; - return SCST_C_DEV_GRP_REM_FAIL if (!defined($group)); + return SCST_C_DEV_GRP_REM_FAIL if (!valid($group)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), SCST_MGMT_IO); @@ -1616,7 +1620,7 @@ sub addDeviceGroupDevice { my $dgroups; my $errorString; - return SCST_C_DGRP_ADD_DEV_FAIL if (!length($group) || !length($device)); + return SCST_C_DGRP_ADD_DEV_FAIL if (!valid($group, $device)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES, @@ -1666,7 +1670,7 @@ sub addTargetGroup { my $group = shift; my $tgroup = shift; - return SCST_C_DGRP_ADD_GRP_FAIL if (!length($group) || !length($tgroup)); + return SCST_C_DGRP_ADD_GRP_FAIL if (!valid($group, $tgroup)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, @@ -1701,7 +1705,7 @@ sub addTargetGroupTarget { my $tgt = shift; return SCST_C_TGRP_ADD_TGT_FAIL - if (!length($group) || !length($tgroup) || !length($tgt)); + if (!valid($group, $tgroup, $tgt)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, @@ -1737,7 +1741,7 @@ sub removeDeviceGroupDevice { my $group = shift; my $device = shift; - return SCST_C_DGRP_REM_DEV_FAIL if (!length($group) || !length($device)); + return SCST_C_DGRP_REM_DEV_FAIL if (!valid($group, $device)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_DEVICES, @@ -1776,7 +1780,7 @@ sub removeTargetGroup { my $group = shift; my $tgroup = shift; - return SCST_C_DGRP_REM_GRP_FAIL if (!length($group) || !length($tgroup)); + return SCST_C_DGRP_REM_GRP_FAIL if (!valid($group, $tgroup)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, @@ -1812,7 +1816,7 @@ sub removeTargetGroupTarget { my $tgroup = shift; my $tgt = shift; - return SCST_C_TGRP_REM_TGT_FAIL if (!length($group) || !length($tgroup) || !length($tgt)); + return SCST_C_TGRP_REM_TGT_FAIL if (!valid($group, $tgroup, $tgt)); my ($path, $cmd); $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, @@ -1854,8 +1858,7 @@ sub addInitiator { my $initiator = shift; return SCST_C_GRP_ADD_INI_FAIL - if (!length($driver) || !length($target) || - !length($group) || !length($initiator)); + if (!valid($driver, $target, $group, $initiator)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, @@ -1874,9 +1877,8 @@ sub addInitiator { return FALSE if ($self->{'debug'} || $bytes > 0); } - return SCST_C_GRP_REM_INI_FAIL if (!length($driver) || - !length($target) || - !length($initiator)); + return SCST_C_GRP_REM_INI_FAIL + if (!valid($driver, $target, $initiator)); my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); @@ -1904,7 +1906,8 @@ sub removeInitiator { my $group = shift; my $initiator = shift; - return SCST_C_GRP_REM_INI_FAIL if (!length($driver) || !length($target) || !length($group) || !length($initiator)); + return SCST_C_GRP_REM_INI_FAIL + if (!valid($driver, $target, $group, $initiator)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, @@ -2041,12 +2044,10 @@ sub addLun { my $attributes = shift; my $group = shift; - my $err = length($group) ? SCST_C_GRP_ADD_LUN_FAIL : + my $err = valid($group) ? SCST_C_GRP_ADD_LUN_FAIL : SCST_C_TGT_ADD_LUN_FAIL; - return $err if (!length($driver) || !length($target) || - !length($device) || !length($lun) || - !length($attributes)); + return $err if (!valid($driver, $target, $device, $lun, $attributes)); my $o_string = ""; foreach my $attribute (keys %{$attributes}) { @@ -2057,7 +2058,7 @@ sub addLun { $o_string =~ s/\s$//; my ($path, $cmd); - if (length($group)) { + if (valid($group)) { $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO); } else { @@ -2079,14 +2080,14 @@ sub addLun { return FALSE if ($self->{'debug'} || $bytes > 0); } - if (length($group)) { + if (valid($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 (length($group) ? SCST_C_GRP_LUN_EXISTS : + return (valid($group) ? SCST_C_GRP_LUN_EXISTS : SCST_C_TGT_LUN_EXISTS) if ($rc == TRUE); return $rc if ($rc > 1); @@ -2116,14 +2117,13 @@ sub removeLun { my $lun = shift; my $group = shift; - my $err = length($group) ? SCST_C_GRP_REM_LUN_FAIL : + my $err = valid($group) ? SCST_C_GRP_REM_LUN_FAIL : SCST_C_TGT_ADD_LUN_FAIL; - return $err if (!length($driver) || !length($target) || - !length($lun)); + return $err if (!valid($driver, $target, $lun)); my ($path, $cmd); - if (length($group)) { + if (valid($group)) { $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO); @@ -2153,15 +2153,15 @@ sub removeLun { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - if (length($group)) { + if (valid($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 (length($group) ? SCST_C_GRP_NO_LUN : SCST_C_TGT_NO_LUN) - if (!$rc); + return (valid($group) ? SCST_C_GRP_NO_LUN : + SCST_C_TGT_NO_LUN) if (!$rc); return $rc if ($rc > 1); return $err; @@ -2178,7 +2178,7 @@ sub replaceLun { my $err; - return TRUE if (!length($lun)); + return TRUE if (!valid($lun)); my $rc = $self->driverExists($driver); return SCST_C_DRV_NO_DRIVER if (!$rc); @@ -2188,7 +2188,7 @@ sub replaceLun { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - if (length($group)) { + if (valid($group)) { $rc = $self->groupExists($driver, $target, $group); return SCST_C_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); @@ -2248,13 +2248,13 @@ sub clearLuns { my $target = shift; my $group = shift; - my $err = length($group) ? SCST_C_GRP_CLR_LUN_FAIL : + my $err = valid($group) ? SCST_C_GRP_CLR_LUN_FAIL : SCST_C_TGT_CLR_LUN_FAIL; - return $err if (!length($driver) || !length($target)); + return $err if (!valid($driver, $target)); my ($path, $cmd); - if (length($group)) { + if (valid($group)) { $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO); @@ -2284,7 +2284,7 @@ sub clearLuns { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - if (length($group)) { + if (valid($group)) { $rc = $self->groupExists($driver, $target, $group); return SCST_C_GRP_NO_GROUP if (!$rc); return $rc if ($rc > 1); @@ -2297,7 +2297,7 @@ sub deviceHandler { my $self = shift; my $device = shift; - return undef if (!length($device)); + return undef if (!valid($device)); my $handler = readlink(make_path(SCST_DEVICES_DIR(), $device, 'handler')); @@ -2311,7 +2311,7 @@ sub devices { my @devices; my $dHandle = new IO::Handle; - my $_path = !length($handler) ? SCST_DEVICES_DIR() : + my $_path = !valid($handler) ? SCST_DEVICES_DIR() : make_path(SCST_HANDLERS_DIR(), $handler); if (!(opendir $dHandle, $_path)) { return (undef, "devices(): Unable to read directory '$_path': $!"); @@ -2321,7 +2321,7 @@ sub devices { next if ($device eq '.' || $device eq '..'); my $isdev = (-d make_path(SCST_DEVICES_DIR(), $device)); - if ($isdev && (!length($handler) || + if ($isdev && (!valid($handler) || $handler eq $self->deviceHandler($device))) { push @devices, $device; } @@ -2336,11 +2336,11 @@ sub deviceOpen { my $self = shift; my $device = shift; - return FALSE if (!length($device)); + return FALSE if (!valid($device)); my ($devices, $errorString) = $self->devices(); - return SCST_C_FATAL_ERROR if (!length($devices)); + return SCST_C_FATAL_ERROR if (!valid($devices)); foreach my $_device (@{$devices}) { return TRUE if ($device eq $_device); @@ -2592,7 +2592,7 @@ sub setDriverAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); my $path = make_path(SCST_TARGETS_DIR(), $driver, $attribute); @@ -2625,7 +2625,7 @@ sub targetAttributes { my %attributes = ( ); my $errorString; - return (undef, "Too few arguments") if (!length($driver) || !length($target)); + return (undef, "Too few arguments") if (!valid($driver, $target)); my $pHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target); @@ -2729,8 +2729,8 @@ sub setTargetAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($driver) || !length($target) || - !length($attribute) || !defined($value)); + return TRUE if (!valid($driver, $target, $attribute) || + !defined($value)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, $target, $attribute); @@ -2856,7 +2856,7 @@ sub setGroupAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); my ($path, $cmd); $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, @@ -2904,7 +2904,7 @@ sub lunAttributes { my ($_path, $luncrattr); - if (length($group)) { + if (valid($group)) { $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, $lun); ($luncrattr, $errorString) = @@ -2921,7 +2921,8 @@ sub lunAttributes { $errorString = "lunAttributes(): Driver '$driver' is not available"; } elsif ($self->targetExists($driver, $target) != TRUE) { $errorString = "lunAttributes(): Target '$target' is not available"; - } elsif (length($group) && $self->groupExists($driver, $target, $group) != TRUE) { + } elsif (valid($group) && + $self->groupExists($driver, $target, $group) != TRUE) { $errorString = "lunAttributes(): Group '$group' does not exist"; } elsif ($self->lunExists($driver, $target, $lun, $group) != TRUE) { $errorString = "lunAttributes(): LUN '$lun' does not exist"; @@ -3008,12 +3009,11 @@ sub setLunAttribute { my $group = shift; return SCST_C_LUN_SETATTR_FAIL - if (!length($driver) || !length($target) || !length($lun) || - !length($attribute) || !defined($value)); + if (!valid($driver, $target, $lun, $attribute) || !defined($value)); my $path; - if (length($group)) { + if (valid($group)) { $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, $lun, $attribute); @@ -3043,15 +3043,15 @@ sub setLunAttribute { return SCST_C_TGT_NO_TARGET if (!$rc); return $rc if ($rc > 1); - if (length($group)) { + if (valid($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 (length($group) ? SCST_C_GRP_NO_LUN : SCST_C_TGT_NO_LUN) - if (!$rc); + return (valid($group) ? SCST_C_GRP_NO_LUN : + SCST_C_TGT_NO_LUN) if (!$rc); return $rc if ($rc > 1); my ($attributes, $errorString) = $self->lunAttributes($driver, $target, $lun, $group); @@ -3160,7 +3160,7 @@ sub setInitiatorAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); my $path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, $initiator, $attribute); @@ -3448,7 +3448,7 @@ sub setAluaAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); my $bytes = - ENOENT; my $path = make_path(SCST_DEV_GROUP_DIR(), $attribute); @@ -3475,7 +3475,7 @@ sub setDeviceGroupAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); my $bytes = - ENOENT; my $path = make_path(SCST_DEV_GROUP_DIR(), $group, $attribute); @@ -3507,8 +3507,7 @@ sub setTargetGroupAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($group) || !length($tgroup) || - !length($attribute) || !defined($value)); + return TRUE if !valid($group, $tgroup, $attribute) || !defined($value); my $bytes = - ENOENT; my $path = make_path(SCST_DEV_GROUP_DIR(), $group, SCST_DG_TGROUPS, $tgroup, $attribute); @@ -3545,8 +3544,7 @@ sub setTargetGroupTargetAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($group) || !length($tgroup) || - !length($tgt) || !length($attribute) || + return TRUE if (!valid($group, $tgroup, $tgt, $attribute) || !defined($value)); my $bytes = - ENOENT; @@ -3610,7 +3608,7 @@ sub handlerExists { my $self = shift; my $handler = shift; - return FALSE if (!length($handler)); + return FALSE if (!valid($handler)); my ($handlers, $errorString) = $self->handlers(); @@ -3629,7 +3627,7 @@ sub setHandlerAttribute { my $attribute = shift; my $value = shift; - return TRUE if (!length($attribute) || !defined($value)); + return TRUE if (!valid($attribute) || !defined($value)); my $bytes = - ENOENT; my $path = make_path(SCST_HANDLERS_DIR(), $handler, $attribute); @@ -3861,7 +3859,7 @@ sub deviceCreateAttributes { my %attributes = ( ); my $errorString; - return (undef, "missing handler argument") if (!length($handler)); + return (undef, "missing handler argument") if (!valid($handler)); my $io = new IO::File make_path(SCST_HANDLERS_DIR(), $handler, SCST_MGMT_IO), O_RDONLY; @@ -3903,7 +3901,7 @@ sub openDevice { my $attributes = shift; return SCST_C_DEV_OPEN_FAIL - if (!length($handler) || !length($device) || !length($attributes)); + if (!valid($handler, $device, $attributes)); my $o_string = ""; foreach my $attribute (keys %{$attributes}) { @@ -3953,7 +3951,7 @@ sub closeDevice { my $handler = shift; my $device = shift; - return SCST_C_DEV_CLOSE_FAIL if (!length($handler) || !length($device)); + return SCST_C_DEV_CLOSE_FAIL if (!valid($handler, $device)); my ($path, $cmd); $path = make_path(SCST_HANDLERS_DIR(), $handler, SCST_MGMT_IO); @@ -4237,7 +4235,7 @@ sub lunCreateAttributes { my $_path; - if (length($group)) { + if (valid($group)) { $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, SCST_GROUPS, $group, SCST_LUNS, SCST_MGMT_IO); @@ -4255,7 +4253,8 @@ sub lunCreateAttributes { } elsif ($self->targetExists($driver, $target) != TRUE) { $errorString = "lunCreateAttributes(): Target '$target' ". "is not available"; - } elsif (length($group) && $self->groupExists($driver, $target, $group) != TRUE) { + } elsif (valid($group) && + $self->groupExists($driver, $target, $group) != TRUE) { $errorString = "lunCreateAttributes(): Group '$group' ". "does not exist"; } else { @@ -4382,7 +4381,7 @@ sub sessions { my %_sessions; my $errorString; - return (undef, "Too few arguments") if (!length($driver) || !length($target)); + return (undef, "Too few arguments") if (!valid($driver, $target)); my $sHandle = new IO::Handle; my $_path = make_path(SCST_TARGETS_DIR(), $driver, $target, @@ -4636,7 +4635,7 @@ sub make_path { if ($path && rindex($path, '/') != length($path) - 1) { $path .= '/'; } - cluck("make_path: invalid argument") if !length($element); + cluck("make_path: invalid argument") if !valid($element); $path .= $element; } diff --git a/scstadmin/scstadmin.sysfs/scst-1.0.0/t/05-dynattr.t b/scstadmin/scstadmin.sysfs/scst-1.0.0/t/05-dynattr.t index c4cd84585..f9f5f187d 100644 --- a/scstadmin/scstadmin.sysfs/scst-1.0.0/t/05-dynattr.t +++ b/scstadmin/scstadmin.sysfs/scst-1.0.0/t/05-dynattr.t @@ -57,7 +57,7 @@ sub testDriverDynAttr { ok($SCST->addDriverDynamicAttribute(), $SCST->SCST_C_DRV_ADDATTR_FAIL); ok($SCST->addDriverDynamicAttribute('no-such-driver', '', ''), - $SCST->SCST_C_DRV_NO_DRIVER); + $SCST->SCST_C_DRV_ADDATTR_FAIL); ok($SCST->addDriverDynamicAttribute('iscsi', 'no-such-attribute', ''), $SCST->SCST_C_DRV_BAD_ATTRIBUTES); ok($SCST->addDriverDynamicAttribute('iscsi', 'IncomingUser', @@ -71,7 +71,7 @@ sub testDriverDynAttr { 'static' => 0 })); ok($SCST->removeDriverDynamicAttribute(), $SCST->SCST_C_DRV_REMATTR_FAIL); ok($SCST->removeDriverDynamicAttribute('no-such-driver', '', ''), - $SCST->SCST_C_DRV_NO_DRIVER); + $SCST->SCST_C_DRV_REMATTR_FAIL); ok($SCST->removeDriverDynamicAttribute('iscsi', 'no-such-attribute', ''), $SCST->SCST_C_DRV_BAD_ATTRIBUTES); ok($SCST->removeDriverDynamicAttribute('iscsi', 'IncomingUser', @@ -113,9 +113,9 @@ sub testTargetDynAttr { ok($SCST->addTargetDynamicAttribute(), $SCST->SCST_C_TGT_ADDATTR_FAIL); ok($SCST->addTargetDynamicAttribute('no-such-driver', '', '', ''), - $SCST->SCST_C_DRV_NO_DRIVER); + $SCST->SCST_C_TGT_ADDATTR_FAIL); ok($SCST->addTargetDynamicAttribute('iscsi', 'no-such-target', '', ''), - $SCST->SCST_C_TGT_NO_TARGET); + $SCST->SCST_C_TGT_ADDATTR_FAIL); ok($SCST->addTargetDynamicAttribute('iscsi', 'tgt1', 'no-such-attribute', '', ''), $SCST->SCST_C_TGT_BAD_ATTRIBUTES); @@ -130,9 +130,9 @@ sub testTargetDynAttr { 'static' => 0 })); ok($SCST->removeTargetDynamicAttribute(), $SCST->SCST_C_TGT_REMATTR_FAIL); ok($SCST->removeTargetDynamicAttribute('no-such-driver', '', '', ''), - $SCST->SCST_C_DRV_NO_DRIVER); + $SCST->SCST_C_TGT_REMATTR_FAIL); ok($SCST->removeTargetDynamicAttribute('iscsi', 'no-such-target', '', ''), - $SCST->SCST_C_TGT_NO_TARGET); + $SCST->SCST_C_TGT_REMATTR_FAIL); ok($SCST->removeTargetDynamicAttribute('iscsi', 'tgt1', 'no-such-attribute', ''), $SCST->SCST_C_TGT_BAD_ATTRIBUTES); diff --git a/scstadmin/scstadmin.sysfs/scstadmin b/scstadmin/scstadmin.sysfs/scstadmin index 0c4ee447e..792cab6ff 100755 --- a/scstadmin/scstadmin.sysfs/scstadmin +++ b/scstadmin/scstadmin.sysfs/scstadmin @@ -1464,6 +1464,12 @@ sub readWorkingConfig { return FALSE; } +# Older Perl versions complain if the argument of length() is undefined. Hence +# this function that checks whether its arguments are defined and not empty. +sub valid { + return $SCST->valid(@_); +} + # Escape metacharacters (space, backslash and hash sign). sub escapeMeta { my $value = shift; @@ -3079,7 +3085,7 @@ sub listHandler { my $handler = shift; my %toprint; - my $got_handler = defined($handler); + my $got_handler = valid($handler); my ($handlers, $errorString) = $SCST->handlers(); my $l_device = 0; @@ -3142,7 +3148,7 @@ sub listDevices { my $device = shift; my $nonkey = shift; - return listDevice($device, $nonkey) if (length($device)); + return listDevice($device, $nonkey) if (valid($device)); return listHandler(); } @@ -3166,7 +3172,7 @@ sub listDeviceGroups { my $group = shift; my $showall = shift; - return listDeviceGroup($group) if (length($group)); + return listDeviceGroup($group) if (valid($group)); my ($groups, $errorString) = $SCST->deviceGroups(); @@ -3245,8 +3251,8 @@ sub listTargetGroups { my $tgroup = shift; my $indent = shift; - return listDeviceGroups(undef, TRUE) if (!length($group)); - return listTargetGroup($group, $tgroup) if (length($tgroup)); + return listDeviceGroups(undef, TRUE) if (!valid($group)); + return listTargetGroup($group, $tgroup) if (valid($tgroup)); my ($tgroups, $errorString) = $SCST->targetGroups($group); @@ -3334,7 +3340,7 @@ sub listDeviceGroupDevices { sub listDrivers { my $driver = shift; - return listTargets($driver, undef) if (length($driver)); + return listTargets($driver, undef) if (valid($driver)); my ($drivers, $errorString) = $SCST->drivers(); @@ -3362,10 +3368,9 @@ sub listTargets { my $target = shift; my %toprint; - return listGroups($driver, $target, undef) - if (length($target) and length($driver)); + return listGroups($driver, $target, undef) if (valid($target, $driver)); - my $got_driver = !!length($driver); + my $got_driver = valid($driver); my ($drivers, $errorString) = $SCST->drivers(); @@ -3472,7 +3477,7 @@ sub listGroup { my $errorString; ($luns, $errorString) = $SCST->luns($driver, $target, $group) if (!$luns); - if (!length($initiators) && length($group)) { + if (!valid($initiators) && valid($group)) { ($initiators, $errorString) = $SCST->initiators($driver, $target, $group); return TRUE if issueWarning($errorString); } @@ -3507,7 +3512,7 @@ sub listGroup { print "\t(none)\n"; } - if (length($group)) { + if (valid($group)) { print "\nAssigned Initiators:\n\n"; if ($#{$initiators} > -1) { @@ -3526,7 +3531,7 @@ sub listGroup { } } } else { - if (length($group)) { + if (valid($group)) { print "Group '$group' has no associated LUNs or initiators.\n"; } else { print "Driver/target '$driver/$target' has no associated LUNs.\n"; @@ -3542,7 +3547,7 @@ sub listGroups { my $group = shift; my $found = FALSE; - if (length($group) and length($driver) and length($target)) { + if (valid($group, $driver, $target)) { return listGroup($driver, $target, $group); } @@ -3951,7 +3956,7 @@ sub listLunAttributes { return TRUE if issueWarning($errorString); if (!scalar(keys %{$attributes})) { - if (length($group)) { + if (valid($group)) { print "No such driver/target/group/lun '$driver/$target/$group/$lun' found.\n"; } else { print "No such driver/target/lun '$driver/$target/$lun' found.\n"; @@ -5163,7 +5168,7 @@ sub addLun { return FALSE; } - if (length($group)) { + if (valid($group)) { print "\t-> Adding device '$device' at LUN $lun to driver/target/group ". "'$driver/$target/$group': "; } else { @@ -5354,7 +5359,7 @@ sub issueLip { my $warn = shift; my $errorString; - if (length($driver) && length($target)) { + if (valid($driver, $target)) { return _issueLip($driver, $target, $warn); } else { my $drivers;