From e562179bab85834fcbe95d55b2de216255ed28c3 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sat, 3 Nov 2012 14:37:21 +0000 Subject: [PATCH] scstadmin: Handle -EAGAIN when reading from sysfs (merge r4498 from trunk) git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/2.2.x@4587 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- .../scst-0.9.10/lib/SCST/SCST.pm | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 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 f0f6d2d05..c48b28392 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 @@ -2614,10 +2614,10 @@ sub deviceAttributes { return undef; } - my $value = <$io>; + my ($value, $is_key) = split("\n", _sysread($io) , 2); + chomp $value; - my $is_key = <$io>; $is_key = new_sysfs_interface() && (!$is_static || defined($$dca{$attribute})) || ($is_key =~ /\[key\]/) ? TRUE : FALSE; @@ -4842,6 +4842,24 @@ sub errorString { return $string; } +# Read from the SCST sysfs file $1. Return either the data read or undef if +# reading failed. +sub _sysread { + my $io = shift; + my $deadline = time() + $TIMEOUT; + my $result; + + while (time() < $deadline) { + my $bytes = sysread($io, $result, 4096); + last if (defined($bytes) || $! != EAGAIN); + sleep 1; + } + + return $result; +} + +# Write the first $3 bytes of $2 into the SCST sysfs file $1. Return either +# the number of bytes written or undef if writing failed. sub _syswrite { my $io = shift; my $cmd = shift;