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);
return mon_tid;
}
+static struct superswitch *find_metadata_methods(char *vers)
+{
+ if (strcmp(vers, "ddf") == 0)
+ return &super_ddf;
+ if (strcmp(vers, "imsm") == 0)
+ return &super_imsm;
+ return NULL;
+}
+
int make_pidfile(char *devname, int o_excl)
{
static int do_fork(void)
{
#ifdef DEBUG
- if (env_no_mdmon())
+ if (check_env("MDADM_NO_MDMON"))
return 0;
#endif
int ignore;
char *container_name = NULL;
char *switchroot = NULL;
+ int devnum;
+ char *devname;
switch (argc) {
case 2:
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));
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) {
container_name);
exit(3);
}
+ close(mdfd);
/* Ok, this is close enough. We can say goodbye to our parent now.
*/