]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Monitor.c
Don't list device= in --examine --scan output.
[thirdparty/mdadm.git] / Monitor.c
index 2d3693bd8120808be37db429d3a9852e9235ae3d..16a39b491f89732868ee330c624bdad12e02603a 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -47,7 +47,7 @@ static char *percentalerts[] = {
 int Monitor(mddev_dev_t devlist,
            char *mailaddr, char *alert_cmd,
            int period, int daemonise, int scan, int oneshot,
-           char *config, int test)
+           char *config, int test, char* pidfile)
 {
        /*
         * Every few seconds, scan every md device looking for changes
@@ -127,7 +127,18 @@ int Monitor(mddev_dev_t devlist,
        if (daemonise) {
                int pid = fork();
                if (pid > 0) {
-                       printf("%d\n", pid);
+                       if (!pidfile)
+                               printf("%d\n", pid);
+                       else {
+                               FILE *pid_file;
+                               pid_file=fopen(pidfile, "w");
+                               if (!pid_file)
+                                       perror("cannot create pid file");
+                               else {
+                                       fprintf(pid_file,"%d\n", pid);
+                                       fclose(pid_file);
+                               }
+                       }
                        return 0;
                }
                if (pid < 0) {
@@ -163,6 +174,7 @@ int Monitor(mddev_dev_t devlist,
        } else {
                mddev_dev_t dv;
                for (dv=devlist ; dv; dv=dv->next) {
+                       mddev_ident_t mdlist = conf_get_ident(config, dv->devname);
                        struct state *st = malloc(sizeof *st);
                        if (st == NULL)
                                continue;
@@ -174,6 +186,11 @@ int Monitor(mddev_dev_t devlist,
                        st->percent = -2;
                        st->expected_spares = -1;
                        st->spare_group = NULL;
+                       if (mdlist) {
+                               st->expected_spares = mdlist->spare_disks;
+                               if (mdlist->spare_group)
+                                       st->spare_group = strdup(mdlist->spare_group);
+                       }
                        statelist = st;
                }
        }
@@ -185,11 +202,11 @@ int Monitor(mddev_dev_t devlist,
 
                if (mdstat)
                        free_mdstat(mdstat);
-               mdstat = mdstat_read();
+               mdstat = mdstat_read(oneshot?0:1);
 
                for (st=statelist; st; st=st->next) {
                        mdu_array_info_t array;
-                       struct mdstat_ent *mse;
+                       struct mdstat_ent *mse = NULL, *mse2;
                        char *dev = st->devname;
                        int fd;
                        unsigned int i;
@@ -216,7 +233,8 @@ int Monitor(mddev_dev_t devlist,
                                close(fd);
                                continue;
                        }
-                       if (array.level != 1 && array.level != 5 && array.level != -4) {
+                       if (array.level != 1 && array.level != 5 && array.level != -4 &&
+                               array.level != 6 && array.level != 10) {
                                if (!st->err)
                                        alert("DeviceDisappeared", dev, "Wrong-Level",
                                              mailaddr, alert_cmd);
@@ -228,16 +246,18 @@ int Monitor(mddev_dev_t devlist,
                                struct stat stb;
                                if (fstat(fd, &stb) == 0 &&
                                    (S_IFMT&stb.st_mode)==S_IFBLK) {
-                                       if (MINOR(stb.st_rdev) == 9)
-                                               st->devnum = MINOR(stb.st_rdev);
+                                       if (major(stb.st_rdev) == MD_MAJOR)
+                                               st->devnum = minor(stb.st_rdev);
                                        else
-                                               st->devnum = -1- (MINOR(stb.st_rdev)>>6);
+                                               st->devnum = -1- (minor(stb.st_rdev)>>6);
                                }
                        }
 
-                       for (mse = mdstat ; mse ; mse=mse->next)
-                               if (mse->devnum == st->devnum)
-                                       mse->devnum = MAXINT; /* flag it as "used" */
+                       for (mse2 = mdstat ; mse2 ; mse2=mse2->next)
+                               if (mse2->devnum == st->devnum) {
+                                       mse2->devnum = MAXINT; /* flag it as "used" */
+                                       mse = mse2;
+                               }
 
                        if (st->utime == array.utime &&
                            st->failed == array.failed_disks &&
@@ -303,7 +323,7 @@ int Monitor(mddev_dev_t devlist,
                                                alert("Fail", dev, dv, mailaddr, alert_cmd);
                                        else if (i >= (unsigned)array.raid_disks &&
                                                 (disc.major || disc.minor) &&
-                                                st->devid[i] == MKDEV(disc.major, disc.minor) &&
+                                                st->devid[i] == makedev(disc.major, disc.minor) &&
                                                 ((newstate&change)&(1<<MD_DISK_FAULTY))
                                                )
                                                alert("FailSpare", dev, dv, mailaddr, alert_cmd);
@@ -315,7 +335,7 @@ int Monitor(mddev_dev_t devlist,
                                                alert("SpareActive", dev, dv, mailaddr, alert_cmd);
                                }
                                st->devstate[i] = disc.state;
-                               st->devid[i] = MKDEV(disc.major, disc.minor);
+                               st->devid[i] = makedev(disc.major, disc.minor);
                        }
                        close(fd);
                        st->active = array.active_disks;
@@ -349,6 +369,7 @@ int Monitor(mddev_dev_t devlist,
                                                free(st);
                                                continue;
                                        }
+                                       close(fd);
                                        st->utime = 0;
                                        st->next = statelist;
                                        st->err = 1;
@@ -414,10 +435,12 @@ int Monitor(mddev_dev_t devlist,
                        if (oneshot)
                                break;
                        else
-                               sleep(period);
+                               mdstat_wait(period);
                }
                test = 0;
        }
+       if (pidfile)
+               unlink(pidfile);
        return 0;
 }