X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=managemon.c;h=447d8ea0001f19e51cbf7e6291b71783aff42a5f;hp=e7c60aa9b28fe6deea6aa7f16c9891f1a8712595;hb=103f2410ec581620367d6fde67a3a62f077062a7;hpb=2f64e61a507ee4c1a8e2fcdbc2ce0ec89fcb7902 diff --git a/managemon.c b/managemon.c index e7c60aa9..447d8ea0 100644 --- a/managemon.c +++ b/managemon.c @@ -85,6 +85,7 @@ #endif #include "mdadm.h" #include "mdmon.h" +#include #include #include @@ -143,15 +144,11 @@ static struct active_array *duplicate_aa(struct active_array *aa) return newa; } -static void write_wakeup(struct supertype *c) +static void wakeup_monitor(void) { - static struct md_generic_cmd cmd = { .action = md_action_ping_monitor }; - int err; - - active_cmd = &cmd; - - /* send the monitor thread a pointer to the ping action */ - write(c->mgr_pipe[1], &err, 1); + /* tgkill(getpid(), mon_tid, SIGUSR1); */ + int pid = getpid(); + syscall(SYS_tgkill, pid, mon_tid, SIGUSR1); } static void remove_old(void) @@ -162,6 +159,7 @@ static void remove_old(void) if (pending_discard == discard_this) pending_discard = NULL; discard_this = NULL; + wakeup_monitor(); } } @@ -177,7 +175,6 @@ static void replace_array(struct supertype *container, */ remove_old(); while (pending_discard) { - write_wakeup(container); while (discard_this == NULL) sleep(1); remove_old(); @@ -186,7 +183,7 @@ static void replace_array(struct supertype *container, new->replaces = old; new->next = container->arrays; container->arrays = new; - write_wakeup(container); + wakeup_monitor(); } struct metadata_update *update_queue = NULL; @@ -207,7 +204,7 @@ void check_update_queue(struct supertype *container) update_queue_pending) { update_queue = update_queue_pending; update_queue_pending = NULL; - write_wakeup(container); + wakeup_monitor(); } } @@ -292,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, @@ -339,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. @@ -351,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)); @@ -381,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); @@ -431,24 +429,31 @@ void manage(struct mdstat_ent *mdstat, struct supertype *container) } } -static int handle_message(struct supertype *container, struct md_message *msg) +static void handle_message(struct supertype *container, struct metadata_update *msg) { - struct md_generic_cmd *cmd = msg->buf; - - if (!cmd) - return 0; + /* queue this metadata update through to the monitor */ - switch (cmd->action) { + struct metadata_update *mu; - default: - return -1; + if (msg->len == 0) { + wait_update_handled(); + } else { + mu = malloc(sizeof(*mu)); + mu->len = msg->len; + mu->buf = msg->buf; + msg->buf = NULL; + mu->space = NULL; + mu->next = NULL; + if (container->ss->prepare_update) + container->ss->prepare_update(container, mu); + queue_metadata_update(mu); } } void read_sock(struct supertype *container) { int fd; - struct md_message msg; + struct metadata_update msg; int terminate = 0; long fl; int tmo = 3; /* 3 second timeout before hanging up the socket */ @@ -462,49 +467,32 @@ void read_sock(struct supertype *container) fcntl(fd, F_SETFL, fl); do { - int err; - msg.buf = NULL; /* read and validate the message */ if (receive_message(fd, &msg, tmo) == 0) { - err = handle_message(container, &msg); - if (!err) - ack(fd, msg.seq, tmo); - else - nack(fd, err, tmo); - } else { + handle_message(container, &msg); + if (ack(fd, tmo) < 0) + terminate = 1; + } else terminate = 1; - nack(fd, -1, tmo); - } - if (msg.buf) - free(msg.buf); } while (!terminate); close(fd); } -static int woke = 0; -void wake_me(int sig) -{ - woke = 1; -} - int exit_now = 0; int manager_ready = 0; void do_manager(struct supertype *container) { struct mdstat_ent *mdstat; - sigset_t block, orig; - - sigemptyset(&block); - sigaddset(&block, SIGUSR1); + sigset_t set; - signal(SIGUSR1, wake_me); + sigprocmask(SIG_UNBLOCK, NULL, &set); + sigdelset(&set, SIGUSR1); do { - woke = 0; if (exit_now) exit(0); @@ -522,9 +510,7 @@ void do_manager(struct supertype *container) check_update_queue(container); manager_ready = 1; - sigprocmask(SIG_SETMASK, &block, &orig); - if (woke == 0) - mdstat_wait_fd(container->sock, &orig); - sigprocmask(SIG_SETMASK, &orig, NULL); + + mdstat_wait_fd(container->sock, &set); } while(1); }