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 dbfe3726d..175c55c53 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 @@ -2621,9 +2621,12 @@ sub deviceAttributes { my $group = $3; my $lun = $4; + next if ($target eq 'copy_manager'); $attributes{$attribute}->{'value'}->{$driver}->{$target}->{$group} = $lun; } + } + if ($attributes{$attribute}->{'value'}) { $attributes{$attribute}->{'static'} = TRUE; } close $eHandle; diff --git a/scstadmin/scstadmin.sysfs/scst-1.0.0/t/07-scstadmin-args.t b/scstadmin/scstadmin.sysfs/scst-1.0.0/t/07-scstadmin-args.t index 754fd7d1f..724f7ce1f 100644 --- a/scstadmin/scstadmin.sysfs/scst-1.0.0/t/07-scstadmin-args.t +++ b/scstadmin/scstadmin.sysfs/scst-1.0.0/t/07-scstadmin-args.t @@ -12,7 +12,7 @@ my $redirect_file; my $redirect; BEGIN { - $redirect_file = "/tmp/07-output.txt"; + $redirect_file = "/tmp/scstadmin-test-07-output.txt"; unlink($redirect_file); $testdir = dirname(abs_path($0)); my $scstadmin_pm_dir = dirname($testdir); diff --git a/scstadmin/scstadmin.sysfs/scst-1.0.0/t/08-scstadmin-close-dev.t b/scstadmin/scstadmin.sysfs/scst-1.0.0/t/08-scstadmin-close-dev.t new file mode 100644 index 000000000..0036fddf1 --- /dev/null +++ b/scstadmin/scstadmin.sysfs/scst-1.0.0/t/08-scstadmin-close-dev.t @@ -0,0 +1,125 @@ +#!perl + +use strict; +use Cwd qw(abs_path); +use File::Basename; +use File::Spec; +use Test; + +my $testdir; +my $scstadmin; +my $redirect_file; +my $redirect; + +BEGIN { + $redirect_file = "/tmp/scstadmin-test-08-output.txt"; + unlink($redirect_file); + $testdir = dirname(abs_path($0)); + my $scstadmin_pm_dir = dirname($testdir); + my $scstadmin_dir = dirname($scstadmin_pm_dir); + $scstadmin = File::Spec->catfile($scstadmin_dir, "scstadmin"); + unless(grep /blib/, @INC) { + unshift(@INC, File::Spec->catdir($scstadmin_pm_dir, "lib")); + } + plan tests => 5; +} + +use Data::Dumper; +use SCST::SCST; +use File::Temp qw/tempfile/; + +sub setup { + my $SCST = shift; + + my ($drivers, $errorString) = $SCST->drivers(); + my %drivers = map { $_ => 1 } @{$drivers}; + ok(exists($drivers{'scst_local'})); + system("dd if=/dev/zero of=/dev/scstadmin-regression-test-vdisk bs=1M count=1 >/dev/null 2>&1"); +} + +sub teardown { + unlink("/dev/scstadmin-regression-test-vdisk"); +} + +sub filterScstLocal { + my $in = shift; + my $out = shift; + + system("awk 'BEGIN { t = 0 } /^# Automatically generated by SCST Configurator v/ { \$0 = \"# Automatically generated by SCST Configurator v...\" } /^TARGET_DRIVER.*{\$/ { if (match(\$0, \"TARGET_DRIVER ([^ ]*) {\", d) && d[1] != \"scst_local\") t = 1 } /^}\$/ { if (t == 1) t = 2 } /^\$/ { if (t == 2) { t = 3 } } /^./ { if (t == 3) { t = 0 } } { if (t == 0) print }' <" . '"' . "$in" . '" >"' . "$out" . '"'); +} + +sub closeDevs { + my $cmd; + + foreach my $dev (@_) { + if ($cmd) { + $cmd .= " && "; + } + $cmd .= "$scstadmin -noprompt -handler vdisk_nullio -close_dev $dev"; + } + return system("{ echo " . '"' . "$cmd" . '"' . "; $cmd; } $redirect"); +} + +sub closeDevTest { + my $tmpfilename1 = File::Spec->catfile(File::Spec->tmpdir(), + "scstadmin-test-08-$$-1"); + my $tmpfilename2 = File::Spec->catfile(File::Spec->tmpdir(), + "scstadmin-test-08-$$-2"); + my $rc; + + system("$scstadmin -clear_config -force -noprompt -no_lip $redirect"); + system("$scstadmin -open_dev nodev -handler vdisk_nullio -attributes dummy=1 $redirect"); + system("$scstadmin -open_dev disk0 -handler vdisk_fileio -attributes filename=/dev/scstadmin-regression-test-vdisk,read_only=1 $redirect"); + system("$scstadmin -open_dev disk1 -handler vdisk_fileio -attributes filename=/dev/scstadmin-regression-test-vdisk,nv_cache=1 $redirect"); + system("$scstadmin -driver scst_local -add_target local $redirect"); + system("$scstadmin -driver scst_local -target local " . + "-add_lun 0 -device nodev $redirect"); + system("$scstadmin -driver scst_local -target local -add_group ig " . + "$redirect"); + system("$scstadmin -driver scst_local -target local -group ig " . + "-add_init ini1 $redirect"); + system("$scstadmin -driver scst_local -target local -group ig " . + "-add_init ini2 $redirect"); + system("$scstadmin -driver scst_local -target local -group ig " . + "-add_lun 0 -device disk0 $redirect"); + system("$scstadmin -driver scst_local -target local -group ig " . + "-add_lun 1 -device disk1 $redirect"); + system("$scstadmin -write_config $tmpfilename1 >/dev/null"); + # Keep only the scst_local target driver information. + filterScstLocal("$tmpfilename1", "$tmpfilename2"); + system("cd /sys/kernel/scst_tgt && find -ls $redirect"); + $rc = system("$scstadmin -dumpAttrs $redirect"); + ok($rc, 0); + $rc = closeDevs("nodev"); + ok($rc, 0); + $rc = closeDevs("disk0", "disk1"); + ok($rc, 256); + system("$scstadmin -noprompt -driver scst_local -target local -group ig " . + "-rem_lun 0 -device disk0 $redirect"); + system("$scstadmin -noprompt -driver scst_local -target local -group ig " . + "-rem_lun 1 -device disk1 $redirect"); + $rc = closeDevs("disk0", "disk1"); + ok($rc, 0); + if ($rc == 0) { + unlink($tmpfilename2); + unlink($tmpfilename1); + } +} + +my $_DEBUG_ = 0; +if ($_DEBUG_) { + $redirect = ">>$redirect_file 2>&1"; + open(my $logfile, '>>', $redirect_file); + select $logfile; +} else { + $redirect = ">/dev/null"; +} + +my $SCST = eval { new SCST::SCST($_DEBUG_) }; +die("Creation of SCST object failed") if (!defined($SCST)); + +setup($SCST); + +closeDevTest(); + +teardown(); diff --git a/scstadmin/scstadmin.sysfs/scstadmin b/scstadmin/scstadmin.sysfs/scstadmin index 48c4fa90d..540d371e3 100755 --- a/scstadmin/scstadmin.sysfs/scstadmin +++ b/scstadmin/scstadmin.sysfs/scstadmin @@ -259,6 +259,7 @@ BEGIN { } use SCST::SCST 1.0.0; +use Data::Dumper; use Getopt::Long; use IO::File; use IO::Dir; @@ -383,6 +384,7 @@ sub getArgs { my $show_usage; my $nonkey; my $force; + my $dumpAttrs; my $p = new Getopt::Long::Parser; @@ -483,6 +485,7 @@ sub getArgs { 'noprompt' => \$_NOPROMPT_, 'cont_on_err' => \$_CONT_ON_ERR_, 'force' => \$force, + 'dumpAttrs' => \$dumpAttrs, 'debug' => \$_DEBUG_)) { exit 1; @@ -823,6 +826,7 @@ sub getArgs { nonkey => $nonkey, force => $force, + dumpAttrs => $dumpAttrs, ); return \%args; } @@ -932,6 +936,7 @@ sub main { my $nonkey = $args->{nonkey}; my $force = $args->{force}; + my $dumpAttrs = $args->{dumpAttrs}; $SCST = new SCST::SCST($_DEBUG_); @@ -1326,6 +1331,18 @@ sub main { print "\t-> Done.\n"; last SWITCH; }; + defined($dumpAttrs) && do { + print "SCST attributes:\n"; + print Dumper($SCST->scstAttributes()); + foreach my $handler (sort keys %{$CURRENT{'handler'}}) { + my $devices = $CURRENT{'handler'}->{$handler}; + foreach my $device (sort @{$devices}) { + print "Device $device attributes:\n"; + print Dumper($SCST->deviceAttributes($device)); + } + } + last SWITCH; + }; if (!$all_good) { print "No valid operations specified.\n";