From f709ef315039e7b2c3ab17c0d1477ce24d0b87c9 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Mon, 8 Apr 2013 07:30:06 +0000 Subject: [PATCH] scstadmin: Speed up restoring a configuration about 40% by caching certain /sys/kernel/scst_tgt/ query results git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@4833 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- .../scst-0.9.10/lib/SCST/SCST.pm | 94 ++++++++++++------- 1 file changed, 62 insertions(+), 32 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 3db066a51..7f273a253 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 @@ -296,52 +296,82 @@ my $_SCST_MIN_MAJOR_ = 2; my $_SCST_MIN_MINOR_ = 0; my $_SCST_MIN_RELEASE_ = 0; +my $_new_sysfs_interface; sub new_sysfs_interface { - return !(-d SCST_ROOT_OLD); + if (!defined($_new_sysfs_interface)) { + $_new_sysfs_interface = !(-d SCST_ROOT_OLD) ? TRUE : FALSE; + } + return $_new_sysfs_interface; } +my $_scst_root_dir; sub SCST_ROOT_DIR { - return -d SCST_ROOT_OLD ? SCST_ROOT_OLD : SCST_ROOT_NEW; + if (!defined($_scst_root_dir)) { + $_scst_root_dir = (-d SCST_ROOT_OLD ? SCST_ROOT_OLD : + SCST_ROOT_NEW); + } + return $_scst_root_dir; } +my $_scst_sgv_dir; sub SCST_SGV_DIR { - return SCST_ROOT_DIR() . '/sgv' + if (!defined($_scst_sgv_dir)) { + $_scst_sgv_dir = SCST_ROOT_DIR() . '/sgv'; + } + return $_scst_sgv_dir; } +my $_scst_queue_res_path = ""; sub SCST_QUEUE_RES_PATH { - return -d SCST_ROOT_OLD ? SCST_ROOT_OLD . '/' . SCST_QUEUE_RES : undef; + if ($_scst_queue_res_path = "") { + $_scst_queue_res_path = (-d SCST_ROOT_OLD ? + SCST_ROOT_OLD . '/' . SCST_QUEUE_RES : + undef); + } + return $_scst_queue_res_path; } # Device handlers. +my $_scst_handlers_dir; sub SCST_HANDLERS_DIR { - if (-d SCST_ROOT_OLD) { - return SCST_ROOT_OLD . '/' . SCST_HANDLERS; - } else { - return '/sys/bus/scst_tgt_dev/drivers'; + if (!defined($_scst_handlers_dir)) { + $_scst_handlers_dir = (-d SCST_ROOT_OLD ? + SCST_ROOT_OLD . '/' . SCST_HANDLERS : + '/sys/bus/scst_tgt_dev/drivers'); } + return $_scst_handlers_dir; } # Device instances. +my $_scst_devices_dir; sub SCST_DEVICES_DIR { - if (-d SCST_ROOT_OLD) { - return SCST_ROOT_OLD . '/' . SCST_DEVICES; - } else { - return '/sys/bus/scst_tgt_dev/devices'; + if (!defined($_scst_devices_dir)) { + $_scst_devices_dir = (-d SCST_ROOT_OLD ? + SCST_ROOT_OLD . '/' . SCST_DEVICES : + '/sys/bus/scst_tgt_dev/devices'); } + return $_scst_devices_dir; } # Target drivers. +my $_scst_targets_dir; sub SCST_TARGETS_DIR { - if (-d SCST_ROOT_OLD) { - return SCST_ROOT_OLD . '/' . SCST_TARGETS; - } else { - return '/sys/bus/scst_target/drivers'; + if (!defined($_scst_targets_dir)) { + $_scst_targets_dir = (-d SCST_ROOT_OLD ? + SCST_ROOT_OLD . '/' . SCST_TARGETS : + '/sys/bus/scst_target/drivers'); } + return $_scst_targets_dir; } # ALUA Device groups. +my $_scst_dev_group_dir; sub SCST_DEV_GROUP_DIR { - return make_path(SCST_ROOT_DIR(), SCST_DEV_GROUPS); + if (!defined($_scst_dev_group_dir)) { + $_scst_dev_group_dir = make_path(SCST_ROOT_DIR(), + SCST_DEV_GROUPS); + } + return $_scst_dev_group_dir; } sub new { @@ -508,28 +538,28 @@ sub setScstAttribute { return SCST_C_SETATTR_FAIL; } +my @_drivers; sub drivers { my $self = shift; - my @drivers; - my $dHandle = new IO::Handle; - my $_path = SCST_TARGETS_DIR(); - if (!(opendir $dHandle, $_path)) { - $self->{'err_string'} = "drivers(): Unable to read directory '$_path': $!"; - return undef; - } + if (!@_drivers) { + my $dHandle = new IO::Handle; + my $_path = SCST_TARGETS_DIR(); + if (opendir $dHandle, $_path) { + foreach my $driver (readdir($dHandle)) { + next if (($driver eq '.') || ($driver eq '..')); - foreach my $driver (readdir($dHandle)) { - next if (($driver eq '.') || ($driver eq '..')); - - if (-d make_path(SCST_TARGETS_DIR(), $driver)) { - push @drivers, $driver; + if (-d make_path(SCST_TARGETS_DIR(), $driver)) { + push @_drivers, $driver; + } + } + close $dHandle; + } else { + $self->{'err_string'} = "drivers(): Unable to read directory '$_path': $!"; } } - close $dHandle; - - return \@drivers; + return \@_drivers; }