]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Grow.c
Grow: split continue_via_systemd into a separate function.
[thirdparty/mdadm.git] / Grow.c
diff --git a/Grow.c b/Grow.c
index 2f171521d3b143e3858964b35818b43294114671..0588590e877b8febd2aa31e6d7596846f89cd6e3 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -2753,6 +2753,48 @@ static void catch_term(int sig)
        sigterm = 1;
 }
 
+static int continue_via_systemd(char *devnm)
+{
+       int skipped, i, pid, status;
+       char pathbuf[1024];
+       /* In a systemd/udev world, it is best to get systemd to
+        * run "mdadm --grow --continue" rather than running in the
+        * background.
+        */
+       switch(fork()) {
+       case  0:
+               /* FIXME yuk. CLOSE_EXEC?? */
+               skipped = 0;
+               for (i = 3; skipped < 20; i++)
+                       if (close(i) < 0)
+                               skipped++;
+                       else
+                               skipped = 0;
+
+               /* Don't want to see error messages from
+                * systemctl.  If the service doesn't exist,
+                * we fork ourselves.
+                */
+               close(2);
+               open("/dev/null", O_WRONLY);
+               snprintf(pathbuf, sizeof(pathbuf), "mdadm-grow-continue@%s.service",
+                        devnm);
+               status = execl("/usr/bin/systemctl", "systemctl",
+                              "start",
+                              pathbuf, NULL);
+               status = execl("/bin/systemctl", "systemctl", "start",
+                              pathbuf, NULL);
+               exit(1);
+       case -1: /* Just do it ourselves. */
+               break;
+       default: /* parent - good */
+               pid = wait(&status);
+               if (pid >= 0 && status == 0)
+                       return 1;
+       }
+       return 0;
+}
+
 static int reshape_array(char *container, int fd, char *devname,
                         struct supertype *st, struct mdinfo *info,
                         int force, struct mddev_dev *devlist,
@@ -3232,54 +3274,13 @@ started:
                return 1;
        }
 
-       if (!forked && !check_env("MDADM_NO_SYSTEMCTL")) {
-               int skipped, i, pid, status;
-               char pathbuf[1024];
-               char *devnm;
-               /* In a systemd/udev world, it is best to get systemd to
-                * run "mdadm --grow --continue" rather than running in the
-                * background.
-                */
-               if (container)
-                       devnm = container;
-               else
-                       devnm = sra->sys_name;
-               switch(fork()) {
-               case  0:
-                       /* FIXME yuk. CLOSE_EXEC?? */
-                       skipped = 0;
-                       for (i = 3; skipped < 20; i++)
-                               if (close(i) < 0)
-                                       skipped++;
-                               else
-                                       skipped = 0;
-
-                       /* Don't want to see error messages from
-                        * systemctl.  If the service doesn't exist,
-                        * we fork ourselves.
-                        */
-                       close(2);
-                       open("/dev/null", O_WRONLY);
-                       snprintf(pathbuf, sizeof(pathbuf), "mdadm-grow-continue@%s.service",
-                                devnm);
-                       status = execl("/usr/bin/systemctl", "systemctl",
-                                      "start",
-                                      pathbuf, NULL);
-                       status = execl("/bin/systemctl", "systemctl", "start",
-                                      pathbuf, NULL);
-                       exit(1);
-               case -1: /* Just do it ourselves. */
-                       break;
-               default: /* parent - good */
-                       pid = wait(&status);
-                       if (pid >= 0 && status == 0) {
-                               free(fdlist);
-                               free(offsets);
-                               sysfs_free(sra);
-                               return 0;
-                       }
+       if (!forked && !check_env("MDADM_NO_SYSTEMCTL"))
+               if (continue_via_systemd(container ?: sra->sys_name)) {
+                       free(fdlist);
+                       free(offsets);
+                       sysfs_free(sra);
+                       return 0;
                }
-       }
 
        /* Now we just need to kick off the reshape and watch, while
         * handling backups of the data...