#include <unistd.h>
#include <stdlib.h>
+#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/mman.h>
+#include <sys/syscall.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
struct active_array *discard_this;
struct active_array *pending_discard;
-struct md_generic_cmd *active_cmd;
+
+int mon_tid, mgr_tid;
int run_child(void *v)
{
struct supertype *c = v;
- sigset_t set;
- /* SIGUSR is sent from child to parent, So child must block it */
- sigemptyset(&set);
- sigaddset(&set, SIGUSR1);
- sigprocmask(SIG_BLOCK, &set, NULL);
do_monitor(c);
return 0;
int clone_monitor(struct supertype *container)
{
static char stack[4096];
- int rv;
- rv = pipe(container->mgr_pipe);
- if (rv < 0)
- return rv;
- rv = pipe(container->mon_pipe);
- if (rv < 0)
- goto err_mon_pipe;
-
- rv = clone(run_child, stack+4096-64,
+ mon_tid = clone(run_child, stack+4096-64,
CLONE_FS|CLONE_FILES|CLONE_VM|CLONE_SIGHAND|CLONE_THREAD,
container);
- if (rv < 0)
- goto err_clone;
- else
- return rv;
-
- err_clone:
- close(container->mon_pipe[0]);
- close(container->mon_pipe[1]);
- err_mon_pipe:
- close(container->mgr_pipe[0]);
- close(container->mgr_pipe[1]);
-
- return rv;
+
+ mgr_tid = syscall(SYS_gettid);
+
+ return mon_tid;
}
static struct superswitch *find_metadata_methods(char *vers)
return sfd;
}
+static void wake_me(int sig)
+{
+
+}
+
int main(int argc, char *argv[])
{
int mdfd;
struct mdinfo *mdi, *di;
struct supertype *container;
+ sigset_t set;
+ struct sigaction act;
+
if (argc != 2) {
fprintf(stderr, "Usage: md-manage /device/name/for/container\n");
exit(2);
argv[1]);
exit(3);
}
- close(mdfd);
- close(mdfd);
mlockall(MCL_FUTURE);
+ /* SIGUSR is sent between parent and child. So both block it
+ * and enable it only with pselect.
+ */
+ sigemptyset(&set);
+ sigaddset(&set, SIGUSR1);
+ sigprocmask(SIG_BLOCK, &set, NULL);
+ act.sa_handler = wake_me;
+ act.sa_flags = 0;
+ sigaction(SIGUSR1, &act, NULL);
+ act.sa_handler = SIG_IGN;
+ sigaction(SIGPIPE, &act, NULL);
+
if (clone_monitor(container) < 0) {
fprintf(stderr, "md-manage: failed to start monitor process: %s\n",
strerror(errno));