]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - managemon.c
mdmon: ping will wait for manage_mon to catch up.
[thirdparty/mdadm.git] / managemon.c
index 9b93ce4ea72c5ca08135938c23eb7bb2e131cb3a..c947552eb7161d69a7aa7f358962ed46d3c84097 100644 (file)
@@ -289,7 +289,7 @@ static void manage_member(struct mdstat_ent *mdstat,
                         * and open files for each newdev */
                        for (d = newdev; d ; d = d->next) {
                                struct mdinfo *newd;
-                               if (sysfs_add_disk(&newa->info, d))
+                               if (sysfs_add_disk(&newa->info, d) < 0)
                                        continue;
                                newd = newa->info.devs;
                                newd->state_fd = sysfs_open(a->devnum,
@@ -336,7 +336,7 @@ static void manage_new(struct mdstat_ent *mdstat,
        inst = &mdstat->metadata_version[10+strlen(container->devname)+1];
 
        mdi = sysfs_read(-1, new->devnum,
-                        GET_LEVEL|GET_CHUNK|GET_DISKS|
+                        GET_LEVEL|GET_CHUNK|GET_DISKS|GET_COMPONENT|
                         GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE);
        if (!mdi) {
                /* Eeek. Cannot monitor this array.
@@ -348,6 +348,7 @@ static void manage_new(struct mdstat_ent *mdstat,
        }
 
        new->info.array = mdi->array;
+       new->info.component_size = mdi->component_size;
 
        for (i = 0; i < new->info.array.raid_disks; i++) {
                struct mdinfo *newd = malloc(sizeof(*newd));
@@ -378,7 +379,7 @@ static void manage_new(struct mdstat_ent *mdstat,
        new->action_fd = sysfs_open(new->devnum, NULL, "sync_action");
        new->info.state_fd = sysfs_open(new->devnum, NULL, "array_state");
        new->resync_start_fd = sysfs_open(new->devnum, NULL, "resync_start");
-       new->resync_start = 0;
+       get_resync_start(new);
        dprintf("%s: inst: %d action: %d state: %d\n", __func__, atoi(inst),
                new->action_fd, new->info.state_fd);
 
@@ -435,7 +436,15 @@ static void handle_message(struct supertype *container, struct metadata_update *
        struct metadata_update *mu;
 
        if (msg->len == 0) {
+               int cnt = monitor_loop_cnt;
+               if (cnt & 1)
+                       cnt += 2; /* wait until next pselect */
+               else
+                       cnt += 3; /* wait for 2 pselects */
+               wakeup_monitor();
                wait_update_handled();
+               while (monitor_loop_cnt - cnt < 0)
+                       usleep(10 * 1000);
        } else {
                mu = malloc(sizeof(*mu));
                mu->len = msg->len;