X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=mdmon.c;h=73c244af91bcbd92a657f250b8f8ba55b3af7b55;hp=fa5a0df9cd9452c1f15d445cfa52a1e6ff0d1308;hb=e8a70c89585ddca2bcb4160808f64506c64df13b;hpb=ce744c97bce1b34147be5e278d2b246743d89536 diff --git a/mdmon.c b/mdmon.c index fa5a0df9..73c244af 100644 --- a/mdmon.c +++ b/mdmon.c @@ -79,13 +79,25 @@ int run_child(void *v) return 0; } -int clone_monitor(struct supertype *container) +#ifdef __ia64__ +int __clone2(int (*fn)(void *), + void *child_stack_base, size_t stack_size, + int flags, void *arg, ... + /* pid_t *pid, struct user_desc *tls, pid_t *ctid */ ); +#endif + int clone_monitor(struct supertype *container) { static char stack[4096]; +#ifdef __ia64__ + mon_tid = __clone2(run_child, stack, sizeof(stack), + CLONE_FS|CLONE_FILES|CLONE_VM|CLONE_SIGHAND|CLONE_THREAD, + container); +#else mon_tid = clone(run_child, stack+4096-64, CLONE_FS|CLONE_FILES|CLONE_VM|CLONE_SIGHAND|CLONE_THREAD, container); +#endif mgr_tid = syscall(SYS_gettid); @@ -275,6 +287,8 @@ int main(int argc, char *argv[]) int ignore; char *container_name = NULL; char *switchroot = NULL; + int devnum; + char *devname; switch (argc) { case 2: @@ -292,7 +306,14 @@ int main(int argc, char *argv[]) usage(); } - mdfd = open(container_name, O_RDWR); + devnum = devname2devnum(container_name); + devname = devnum2devname(devnum); + if (strcmp(container_name, devname) != 0) { + fprintf(stderr, "mdmon: %s is not a valid md device name\n", + container_name); + exit(1); + } + mdfd = open_dev(devnum); if (mdfd < 0) { fprintf(stderr, "mdmon: %s: %s\n", container_name, strerror(errno)); @@ -330,9 +351,8 @@ int main(int argc, char *argv[]) pfd[0] = pfd[1] = -1; container = malloc(sizeof(*container)); - container->devnum = fd2devnum(mdfd); - container->devname = devnum2devname(container->devnum); - container->device_name = container_name; + container->devnum = devnum; + container->devname = devname; container->arrays = NULL; if (!container->devname) { @@ -450,6 +470,7 @@ int main(int argc, char *argv[]) container_name); exit(3); } + close(mdfd); /* Ok, this is close enough. We can say goodbye to our parent now. */