X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=mdstat.c;h=8de51cf755fa0e718f321d54c3714abd92f04cd9;hb=81062a36abd28d2354036da398c2e090fa759198;hp=040df150c74cec0eb5b64597ad604d0c80129fcb;hpb=1ed3f38758ff23dabfa3f67e2a02ff98d9d0fea8;p=thirdparty%2Fmdadm.git diff --git a/mdstat.c b/mdstat.c index 040df150..8de51cf7 100644 --- a/mdstat.c +++ b/mdstat.c @@ -191,11 +191,7 @@ struct mdstat_ent *mdstat_read(int hold, int start) * there. */ struct mdstat_ent **ih; - int dn2; - if (strncmp(w, "md_d", 4)==0) - dn2 = -1-strtoul(w+4, &ep, 10); - else - dn2 = strtoul(w+2, &ep, 10); + int dn2 = devname2devnum(w); ih = &all; while (ih != insert_here && *ih && (*ih)->devnum != dn2) @@ -264,25 +260,42 @@ void mdstat_wait(int seconds) { fd_set fds; struct timeval tm; + int maxfd = 0; FD_ZERO(&fds); - if (mdstat_fd >= 0) + if (mdstat_fd >= 0) { FD_SET(mdstat_fd, &fds); + maxfd = mdstat_fd; + } tm.tv_sec = seconds; tm.tv_usec = 0; - select(mdstat_fd >2 ? mdstat_fd+1:3, NULL, NULL, &fds, &tm); + select(maxfd + 1, NULL, NULL, &fds, &tm); } void mdstat_wait_fd(int fd, const sigset_t *sigmask) { fd_set fds, rfds; + int maxfd = fd; FD_ZERO(&fds); FD_ZERO(&rfds); if (mdstat_fd >= 0) FD_SET(mdstat_fd, &fds); - FD_SET(fd, &rfds); + if (fd >= 0) { + struct stat stb; + fstat(fd, &stb); + if ((stb.st_mode & S_IFMT) == S_IFREG) + /* Must be a /proc or /sys fd, so expect + * POLLPRI + * i.e. an 'exceptional' event. + */ + FD_SET(fd, &fds); + else + FD_SET(fd, &rfds); + } + if (mdstat_fd > maxfd) + maxfd = mdstat_fd; - pselect(mdstat_fd >2 ? mdstat_fd+1:3, &rfds, NULL, &fds, + pselect(maxfd + 1, &rfds, NULL, &fds, NULL, sigmask); }