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>
This commit is contained in:
parent
656b6b5a55
commit
6560987b25
10
Grow.c
10
Grow.c
|
@ -2725,15 +2725,21 @@ check_progress:
|
||||||
int rv = -2;
|
int rv = -2;
|
||||||
tv.tv_sec = 10;
|
tv.tv_sec = 10;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
while (fd >= 0 && rv < 0) {
|
while (fd >= 0 && rv < 0 && tv.tv_sec > 0) {
|
||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
FD_SET(fd, &rfds);
|
FD_SET(fd, &rfds);
|
||||||
if (select(fd+1, NULL, NULL, &rfds, &tv) != 1)
|
if (select(fd+1, NULL, NULL, &rfds, &tv) != 1)
|
||||||
break;
|
break;
|
||||||
if (sysfs_fd_get_ll(fd, &completed) >= 0)
|
switch (sysfs_fd_get_ll(fd, &completed)) {
|
||||||
|
case 0:
|
||||||
/* all good again */
|
/* all good again */
|
||||||
rv = 1;
|
rv = 1;
|
||||||
|
break;
|
||||||
|
case -2: /* read error - abort */
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
2
sysfs.c
2
sysfs.c
|
@ -470,7 +470,7 @@ int sysfs_fd_get_ll(int fd, unsigned long long *val)
|
||||||
lseek(fd, 0, 0);
|
lseek(fd, 0, 0);
|
||||||
n = read(fd, buf, sizeof(buf));
|
n = read(fd, buf, sizeof(buf));
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return -1;
|
return -2;
|
||||||
buf[n] = 0;
|
buf[n] = 0;
|
||||||
*val = strtoull(buf, &ep, 0);
|
*val = strtoull(buf, &ep, 0);
|
||||||
if (ep == buf || (*ep != 0 && *ep != '\n' && *ep != ' '))
|
if (ep == buf || (*ep != 0 && *ep != '\n' && *ep != ' '))
|
||||||
|
|
Loading…
Reference in New Issue