]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdstat.c
main: factor out code to parse layout for raid10 and faulty.
[thirdparty/mdadm.git] / mdstat.c
index c75260e83d6af76a0b919795d74e2e1e7f06ef40..8de51cf755fa0e718f321d54c3714abd92f04cd9 100644 (file)
--- a/mdstat.c
+++ b/mdstat.c
@@ -95,6 +95,7 @@ void free_mdstat(struct mdstat_ent *ms)
                if (ms->dev) free(ms->dev);
                if (ms->level) free(ms->level);
                if (ms->pattern) free(ms->pattern);
+               if (ms->metadata_version) free(ms->metadata_version);
                t = ms;
                ms = ms->next;
                free(t);
@@ -190,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)
@@ -263,25 +260,43 @@ 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)
+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;
 
-       select(mdstat_fd >2 ? mdstat_fd+1:3, &rfds, NULL, &fds, NULL);
+       pselect(maxfd + 1, &rfds, NULL, &fds,
+               NULL, sigmask);
 }
 
 int mddev_busy(int devnum)