]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - managemon.c
mdmon: update cmdline when scanning
[thirdparty/mdadm.git] / managemon.c
index c9b054ff4a0605953a28792a463e959a067c24f1..5f0a61b5ce106f56d44404ae08b7347f29a1a36f 100644 (file)
@@ -253,6 +253,9 @@ static void add_disk_to_container(struct supertype *st, struct mdinfo *sd)
        dprintf("%s: add %d:%d to container\n",
                __func__, sd->disk.major, sd->disk.minor);
 
+       sd->next = st->devs;
+       st->devs = sd;
+
        sprintf(nm, "%d:%d", sd->disk.major, sd->disk.minor);
        dfd = dev_open(nm, O_RDWR);
        if (dfd < 0)
@@ -283,7 +286,7 @@ static void manage_container(struct mdstat_ent *mdstat,
                 * To see what is removed and what is added.
                 * These need to be remove from, or added to, the array
                 */
-               mdi = sysfs_read(-1, mdstat->devnum, GET_DEVS);
+               mdi = sysfs_read(-1, mdstat->devnum, GET_DEVS|SKIP_GONE_DEVS);
                if (!mdi) {
                        /* invalidate the current count so we can try again */
                        container->devcnt = -1;
@@ -313,8 +316,16 @@ static void manage_container(struct mdstat_ent *mdstat,
                                if (di->disk.major == cd->disk.major &&
                                    di->disk.minor == cd->disk.minor)
                                        break;
-                       if (!cd)
-                               add_disk_to_container(container, di);
+                       if (!cd) {
+                               struct mdinfo *newd = malloc(sizeof(*newd));
+
+                               if (!newd) {
+                                       container->devcnt = -1;
+                                       continue;
+                               }
+                               *newd = *di;
+                               add_disk_to_container(container, newd);
+                       }
                }
                sysfs_free(mdi);
                container->devcnt = mdstat->devcnt;
@@ -460,7 +471,7 @@ static void manage_new(struct mdstat_ent *mdstat,
                        if (i == di->disk.raid_disk)
                                break;
 
-               if (di) {
+               if (di && newd) {
                        memcpy(newd, di, sizeof(*newd));
 
                        newd->state_fd = sysfs_open(new->devnum,
@@ -469,13 +480,16 @@ static void manage_new(struct mdstat_ent *mdstat,
 
                        newd->prev_state = read_dev_state(newd->state_fd);
                        newd->curr_state = newd->prev_state;
-               } else if (failed + 1 > new->info.array.failed_disks) {
-                       /* we cannot properly monitor without all working disks */
-                       new->container = NULL;
-                       break;
                } else {
+                       if (newd)
+                               free(newd);
+
                        failed++;
-                       free(newd);
+                       if (failed > new->info.array.failed_disks) {
+                               /* we cannot properly monitor without all working disks */
+                               new->container = NULL;
+                               break;
+                       }
                        continue;
                }
                sprintf(newd->sys_name, "rd%d", i);