]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Monitor.c
mdadm-1.0.9
[thirdparty/mdadm.git] / Monitor.c
index fa0d7088df03425535eb7323c13af1ae21e0e7f2..d994dbe95445d0e694a1196ae35e49b136b4a2e8 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -182,6 +182,14 @@ int Monitor(mddev_dev_t devlist,
                                close(fd);
                                continue;
                        }
+                       if (array.level != 1 && array.level != 5 && array.level != -4) {
+                               if (!st->err)
+                                       alert("DeviceDisappeared", dev, "Wrong-Level",
+                                             mailaddr, alert_cmd);
+                               st->err = 1;
+                               close(fd);
+                               continue;
+                       }
                        if (st->devnum < 0) {
                                struct stat stb;
                                if (fstat(fd, &stb) == 0 &&
@@ -229,7 +237,7 @@ int Monitor(mddev_dev_t devlist,
                                if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
                                        newstate = disc.state;
                                        dv = map_dev(disc.major, disc.minor);
-                               } else if (mse && i < strlen(mse->pattern))
+                               } else if (mse &&  mse->pattern && i < strlen(mse->pattern))
                                        switch(mse->pattern[i]) {
                                        case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
                                        case '_': newstate = 0; break;
@@ -271,7 +279,11 @@ int Monitor(mddev_dev_t devlist,
                if (scan) {
                        struct mdstat_ent *mse;
                        for (mse=mdstat; mse; mse=mse->next) 
-                               if (mse->devnum > 0) {
+                               if (mse->devnum >= 0 &&
+                                   (strcmp(mse->level, "raid1")==0 ||
+                                    strcmp(mse->level, "raid5")==0 ||
+                                    strcmp(mse->level, "multipath")==0)
+                                       ) {
                                        struct state *st = malloc(sizeof *st);
                                        if (st == NULL)
                                                continue;