]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdmon: exec(2) when the switchroot argument is not "/"
authorDan Williams <dan.j.williams@intel.com>
Wed, 14 Oct 2009 00:08:33 +0000 (17:08 -0700)
committerDan Williams <dan.j.williams@intel.com>
Wed, 14 Oct 2009 00:41:58 +0000 (17:41 -0700)
Try to execute mdmon from the target namespace.  When used for initramfs
handovers we need to drop all references to the initramfs filesystem for
that memory to be freed.

Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
mdmon.c

diff --git a/mdmon.c b/mdmon.c
index 5f87e786e68d6b04aa0e68c4084d360cab1c1179..d3e8be56259466d59773ada93630dd722a0990b3 100644 (file)
--- a/mdmon.c
+++ b/mdmon.c
@@ -369,6 +369,29 @@ int mdmon(char *devname, int devnum, int scan, char *switchroot)
 
        dprintf("starting mdmon for %s in %s\n",
                devname, switchroot ? : "/");
+
+       /* try to spawn mdmon instances from the target file system */
+       if (switchroot && strcmp(switchroot, "/") != 0) {
+               char path[1024];
+               pid_t pid;
+
+               sprintf(path, "%s/sbin/mdmon", switchroot);
+               switch (fork()) {
+               case 0:
+                       execl(path, "mdmon", devname, NULL);
+                       exit(1);
+               case -1:
+                       return 1;
+               default:
+                       pid = wait(&status);
+                       if (pid > -1 && WIFEXITED(status) &&
+                           WEXITSTATUS(status) == 0)
+                               return 0;
+                       else
+                               return 1;
+               }
+       }
+
        mdfd = open_dev(devnum);
        if (mdfd < 0) {
                fprintf(stderr, "mdmon: %s: %s\n", devname,