summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-07-27 17:26:12 +1000
committerNeilBrown <neilb@suse.de>2011-07-27 17:26:12 +1000
commit6560987b25a88f78ed53d37525d363c126a07b79 (patch)
treec75a1faafac1760242e49852211f9596f0fc4d5c
parent656b6b5a55adb1fd223d82478c333264af52877a (diff)
downloadmdadm-6560987b25a88f78ed53d37525d363c126a07b79.tar.gz
Grow: ensure clean abort if we cannot read the 'completed' file.
If a read of 'completed' returns an error, select will never fail, so this loop would never exit. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Grow.c10
-rw-r--r--sysfs.c2
2 files changed, 9 insertions, 3 deletions
diff --git a/Grow.c b/Grow.c
index e4fc222..1aab113 100644
--- a/Grow.c
+++ b/Grow.c
@@ -2725,15 +2725,21 @@ check_progress:
int rv = -2;
tv.tv_sec = 10;
tv.tv_usec = 0;
- while (fd >= 0 && rv < 0) {
+ while (fd >= 0 && rv < 0 && tv.tv_sec > 0) {
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
if (select(fd+1, NULL, NULL, &rfds, &tv) != 1)
break;
- if (sysfs_fd_get_ll(fd, &completed) >= 0)
+ switch (sysfs_fd_get_ll(fd, &completed)) {
+ case 0:
/* all good again */
rv = 1;
+ break;
+ case -2: /* read error - abort */
+ tv.tv_sec = 0;
+ break;
+ }
}
if (fd >= 0)
close(fd);
diff --git a/sysfs.c b/sysfs.c
index 44314ba..56813b7 100644
--- a/sysfs.c
+++ b/sysfs.c
@@ -470,7 +470,7 @@ int sysfs_fd_get_ll(int fd, unsigned long long *val)
lseek(fd, 0, 0);
n = read(fd, buf, sizeof(buf));
if (n <= 0)
- return -1;
+ return -2;
buf[n] = 0;
*val = strtoull(buf, &ep, 0);
if (ep == buf || (*ep != 0 && *ep != '\n' && *ep != ' '))