]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdmon.c
Kill subarray v2
[thirdparty/mdadm.git] / mdmon.c
diff --git a/mdmon.c b/mdmon.c
index ef1872acec85565f8b4b7395116387447c240a83..beb39cfcf0be284383b83fda036aaceffe74af37 100644 (file)
--- a/mdmon.c
+++ b/mdmon.c
@@ -104,15 +104,6 @@ int __clone2(int (*fn)(void *),
        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;
-}
-
 static int make_pidfile(char *devname)
 {
        char path[100];
@@ -120,7 +111,7 @@ static int make_pidfile(char *devname)
        int fd;
        int n;
 
-       if (mkdir(pid_dir, 0600) < 0 &&
+       if (mkdir(pid_dir, 0700) < 0 &&
            errno != EEXIST)
                return -errno;
        sprintf(path, "%s/%s.pid", pid_dir, devname);
@@ -136,18 +127,6 @@ static int make_pidfile(char *devname)
        return 0;
 }
 
-int is_container_member(struct mdstat_ent *mdstat, char *container)
-{
-       if (mdstat->metadata_version == NULL ||
-           strncmp(mdstat->metadata_version, "external:", 9) != 0 ||
-           !is_subarray(mdstat->metadata_version+9) ||
-           strncmp(mdstat->metadata_version+10, container, strlen(container)) != 0 ||
-           mdstat->metadata_version[10+strlen(container)] != '/')
-               return 0;
-
-       return 1;
-}
-
 static void try_kill_monitor(pid_t pid, char *devname, int sock)
 {
        char buf[100];
@@ -414,9 +393,9 @@ static int mdmon(char *devname, int devnum, int must_fork, int takeover)
                exit(3);
        }
 
-       container->ss = find_metadata_methods(mdi->text_version);
+       container->ss = version_to_superswitch(mdi->text_version);
        if (container->ss == NULL) {
-               fprintf(stderr, "mdmon: %s uses unknown metadata: %s\n",
+               fprintf(stderr, "mdmon: %s uses unsupported metadata: %s\n",
                        devname, mdi->text_version);
                exit(3);
        }
@@ -445,26 +424,23 @@ static int mdmon(char *devname, int devnum, int must_fork, int takeover)
        act.sa_handler = SIG_IGN;
        sigaction(SIGPIPE, &act, NULL);
 
-       if (takeover) {
-               pid_dir = VAR_RUN;
+       pid_dir = VAR_RUN;
+       victim = mdmon_pid(container->devnum);
+       if (victim < 0) {
+               pid_dir = ALT_RUN;
                victim = mdmon_pid(container->devnum);
-               if (victim < 0) {
-                       pid_dir = ALT_RUN;
-                       victim = mdmon_pid(container->devnum);
-               }
-               if (victim >= 0)
-                       victim_sock = connect_monitor(container->devname);
        }
+       if (victim >= 0)
+               victim_sock = connect_monitor(container->devname);
 
        ignore = chdir("/");
-       if (victim < 0) {
-               if (ping_monitor(container->devname) == 0) {
+       if (!takeover && victim > 0 && victim_sock >= 0) {
+               if (fping_monitor(victim_sock) == 0) {
                        fprintf(stderr, "mdmon: %s already managed\n",
                                container->devname);
                        exit(3);
                }
-               /* if there is a pid file, kill whoever is there just in case */
-               victim = mdmon_pid(container->devnum);
+               close(victim_sock);
        }
        if (container->ss->load_super(container, mdfd, devname)) {
                fprintf(stderr, "mdmon: Cannot load metadata for %s\n",