]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - managemon.c
Detail: clean up handing of the 'info' we load from superblock.
[thirdparty/mdadm.git] / managemon.c
index 2a73d4b050a2dc7afb6498fee43ff38e4fd0054e..bab0397921a7d30dc24e012cfa9decc8d5e877f5 100644 (file)
@@ -315,7 +315,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|SKIP_GONE_DEVS);
+               mdi = sysfs_read(-1, mdstat->devnum, GET_DEVS);
                if (!mdi) {
                        /* invalidate the current count so we can try again */
                        container->devcnt = -1;
@@ -361,6 +361,23 @@ static void manage_container(struct mdstat_ent *mdstat,
        }
 }
 
+static int disk_init_and_add(struct mdinfo *disk, struct mdinfo *clone,
+                            struct active_array *aa)
+{
+       if (!disk || !clone)
+               return -1;
+
+       *disk = *clone;
+       disk->recovery_fd = sysfs_open(aa->devnum, disk->sys_name, "recovery_start");
+       disk->state_fd = sysfs_open(aa->devnum, disk->sys_name, "state");
+       disk->prev_state = read_dev_state(disk->state_fd);
+       disk->curr_state = disk->prev_state;
+       disk->next = aa->info.devs;
+       aa->info.devs = disk;
+
+       return 0;
+}
+
 static void manage_member(struct mdstat_ent *mdstat,
                          struct active_array *a)
 {
@@ -414,14 +431,7 @@ static void manage_member(struct mdstat_ent *mdstat,
                                free(newd);
                                continue;
                        }
-                       *newd = *d;
-                       newd->next = newa->info.devs;
-                       newa->info.devs = newd;
-
-                       newd->state_fd = sysfs_open(a->devnum, newd->sys_name,
-                                                   "state");
-                       newd->prev_state = read_dev_state(newd->state_fd);
-                       newd->curr_state = newd->prev_state;
+                       disk_init_and_add(newd, d, newa);
                }
                queue_metadata_update(updates);
                updates = NULL;
@@ -513,19 +523,7 @@ static void manage_new(struct mdstat_ent *mdstat,
                        if (i == di->disk.raid_disk)
                                break;
 
-               if (di && newd) {
-                       memcpy(newd, di, sizeof(*newd));
-
-                       newd->state_fd = sysfs_open(new->devnum,
-                                                   newd->sys_name,
-                                                   "state");
-                       newd->recovery_fd = sysfs_open(new->devnum,
-                                                     newd->sys_name,
-                                                     "recovery_start");
-
-                       newd->prev_state = read_dev_state(newd->state_fd);
-                       newd->curr_state = newd->prev_state;
-               } else {
+               if (disk_init_and_add(newd, di, new) != 0) {
                        if (newd)
                                free(newd);
 
@@ -535,17 +533,14 @@ static void manage_new(struct mdstat_ent *mdstat,
                                new->container = NULL;
                                break;
                        }
-                       continue;
                }
-               sprintf(newd->sys_name, "rd%d", i);
-               newd->next = new->info.devs;
-               new->info.devs = newd;
        }
 
        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->metadata_fd = sysfs_open(new->devnum, NULL, "metadata_version");
+       new->sync_completed_fd = sysfs_open(new->devnum, NULL, "sync_completed");
        dprintf("%s: inst: %d action: %d state: %d\n", __func__, atoi(inst),
                new->action_fd, new->info.state_fd);
 
@@ -677,14 +672,10 @@ void do_manager(struct supertype *container)
 {
        struct mdstat_ent *mdstat;
        sigset_t set;
-       int proc_fd;
 
        sigprocmask(SIG_UNBLOCK, NULL, &set);
        sigdelset(&set, SIGUSR1);
-       sigdelset(&set, SIGHUP);
-       sigdelset(&set, SIGALRM);
        sigdelset(&set, SIGTERM);
-       proc_fd = open("/proc/mounts", O_RDONLY);
 
        do {
 
@@ -702,34 +693,6 @@ void do_manager(struct supertype *container)
 
                        read_sock(container);
 
-                       if (socket_hup_requested) {
-                               /* Try to create pid file and socket in
-                                * main or alternate RUN directory.
-                                */
-                               char *dir = VAR_RUN;
-                               if (mkdir(dir, 0600) < 0 && errno != EEXIST) {
-                                       char *dir = ALT_RUN;
-                                       if (mkdir(dir, 0600) < 0 && errno != EEXIST)
-                                               dir = NULL;
-                               } else {
-                                       if (proc_fd >= 0)
-                                               close(proc_fd);
-                                       proc_fd = -1;
-                               }
-                               if (dir && !sigterm &&
-                                   (container->sock < 0 ||
-                                    strcmp(dir, pid_dir) != 0)) {
-                                       close(container->sock);
-                                       remove_pidfile(container->devname);
-                                       pid_dir = dir;
-                                       container->sock = make_control_sock(container->devname);
-                                       make_pidfile(container->devname);
-                               }
-                               socket_hup_requested = 0;
-                       }
-                       if (container->sock < 0)
-                               alarm(30);
-
                        free_mdstat(mdstat);
                }
                remove_old();
@@ -742,7 +705,7 @@ void do_manager(struct supertype *container)
                        wakeup_monitor();
 
                if (update_queue == NULL)
-                       mdstat_wait_fd(container->sock, proc_fd, &set);
+                       mdstat_wait_fd(container->sock, &set);
                else
                        /* If an update is happening, just wait for signal */
                        pselect(0, NULL, NULL, NULL, NULL, &set);