]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Monitor.c
Use struct align_fd to cache fd's block size for aligned reads/writes
[thirdparty/mdadm.git] / Monitor.c
index 55aebeba7360f4bd245f51089fe06a4e7ee7cd06..7ed5282b2c33a85da756f9330cff88d5de2488ee 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -124,6 +124,7 @@ int Monitor(struct mddev_dev *devlist,
         */
 
        struct state *statelist = NULL;
+       struct state *st2;
        int finished = 0;
        struct mdstat_ent *mdstat = NULL;
        char *mailfrom = NULL;
@@ -242,6 +243,11 @@ int Monitor(struct mddev_dev *devlist,
                }
                test = 0;
        }
+       for (st2 = statelist; st2; st2 = statelist) {
+               statelist = st2->next;
+               free(st2);
+       }
+
        if (pidfile)
                unlink(pidfile);
        return 0;
@@ -288,8 +294,10 @@ static int check_one_sharer(int scan)
        int pid, rv;
        FILE *fp;
        char dir[20];
+       char path[100];
        struct stat buf;
-       fp = fopen("/var/run/mdadm/autorebuild.pid", "r");
+       sprintf(path, "%s/autorebuild.pid", MDMON_DIR);
+       fp = fopen(path, "r");
        if (fp) {
                if (fscanf(fp, "%d", &pid) != 1)
                        pid = -1;
@@ -311,12 +319,12 @@ static int check_one_sharer(int scan)
                fclose(fp);
        }
        if (scan) {
-               if (mkdir("/var/run/mdadm", S_IRWXU) < 0 &&
+               if (mkdir(MDMON_DIR, S_IRWXU) < 0 &&
                    errno != EEXIST) {
                        fprintf(stderr, Name ": Can't create "
                                "autorebuild.pid file\n");
                } else {
-                       fp = fopen("/var/run/mdadm/autorebuild.pid", "w");
+                       fp = fopen(path, "w");
                        if (!fp)
                                fprintf(stderr, Name ": Cannot create"
                                        " autorebuild.pid"
@@ -449,6 +457,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        char *dev = st->devname;
        int fd;
        int i;
+       int remaining_disks;
+       int last_disk;
 
        if (test)
                alert("TestMessage", dev, NULL, ainfo);
@@ -555,8 +565,10 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                struct mdinfo *sra =
                        sysfs_read(-1, st->devnum, GET_MISMATCH);
                if (sra && sra->mismatch_cnt > 0) {
-                       char cnt[40];
-                       sprintf(cnt, " mismatches found: %d", sra->mismatch_cnt);
+                       char cnt[80];
+                       snprintf(cnt, sizeof(cnt),
+                                " mismatches found: %d (on raid level %d)",
+                               sra->mismatch_cnt, array.level);
                        alert("RebuildFinished", dev, cnt, ainfo);
                } else
                        alert("RebuildFinished", dev, NULL, ainfo);
@@ -565,7 +577,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        }
        st->percent = mse->percent;
 
-       for (i=0; i<MaxDisks && i <= array.raid_disks + array.nr_disks;
+       remaining_disks = array.nr_disks;
+       for (i=0; i<MaxDisks && remaining_disks > 0;
             i++) {
                mdu_disk_info_t disc;
                disc.number = i;
@@ -573,9 +586,12 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                        info[i].state = disc.state;
                        info[i].major = disc.major;
                        info[i].minor = disc.minor;
+                       if (disc.major || disc.minor)
+                               remaining_disks --;
                } else
                        info[i].major = info[i].minor = 0;
        }
+       last_disk = i;
 
        if (mse->metadata_version &&
            strncmp(mse->metadata_version, "external:", 9) == 0 &&
@@ -596,7 +612,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                int change;
                char *dv = NULL;
                disc.number = i;
-               if (i > array.raid_disks + array.nr_disks) {
+               if (i >= last_disk) {
                        newstate = 0;
                        disc.major = disc.minor = 0;
                } else if (info[i].major || info[i].minor) {