]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Grow: fix problem with reshaping RAID4 to RAID0.
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index fc9043bf2345e6ef8debe15cde317533226e8452..8817a3e22ac35bbd235a2e995dd39ac1df1e2698 100644 (file)
--- a/util.c
+++ b/util.c
@@ -32,8 +32,6 @@
 #include       <dirent.h>
 #include       <signal.h>
 
-int __offroot;
-
 /*
  * following taken from linux/blkpg.h because they aren't
  * anywhere else and it isn't safe to #include linux/ * stuff.
@@ -1662,6 +1660,34 @@ int start_mdmon(int devnum)
        } else
                pathbuf[0] = '\0';
 
+       /* First try to run systemctl */
+       switch(fork()) {
+       case 0:
+               /* FIXME yuk. CLOSE_EXEC?? */
+               skipped = 0;
+               for (i = 3; skipped < 20; i++)
+                       if (close(i) < 0)
+                               skipped++;
+                       else
+                               skipped = 0;
+
+               snprintf(pathbuf, sizeof(pathbuf), "mdmon@%s.service",
+                        devnum2devname(devnum));
+               status = execl("/usr/bin/systemctl", "systemctl", "start",
+                              pathbuf, NULL);
+               status = execl("/bin/systemctl", "systemctl", "start",
+                              pathbuf, NULL);
+               exit(1);
+       case -1: pr_err("cannot run mdmon. "
+                        "Array remains readonly\n");
+               return -1;
+       default: /* parent - good */
+               pid = wait(&status);
+               if (pid >= 0 && status == 0)
+                       return 0;
+       }
+
+       /* That failed, try running mdmon directly */
        switch(fork()) {
        case 0:
                /* FIXME yuk. CLOSE_EXEC?? */
@@ -1674,15 +1700,8 @@ int start_mdmon(int devnum)
 
                for (i = 0; paths[i]; i++)
                        if (paths[i][0]) {
-                               if (__offroot) {
-                                       execl(paths[i], "mdmon", "--offroot",
-                                             devnum2devname(devnum),
-                                             NULL);
-                               } else {
-                                       execl(paths[i], "mdmon",
-                                             devnum2devname(devnum),
-                                             NULL);
-                               }
+                               execl(paths[i], "mdmon",
+                                     devnum2devname(devnum), NULL);
                        }
                exit(1);
        case -1: pr_err("cannot run mdmon. "
@@ -1690,8 +1709,11 @@ int start_mdmon(int devnum)
                return -1;
        default: /* parent - good */
                pid = wait(&status);
-               if (pid < 0 || status != 0)
+               if (pid < 0 || status != 0) {
+                       pr_err("failed to launch mdmon. "
+                              "Array remains readonly\n");
                        return -1;
+               }
        }
        return 0;
 }