]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Start mdmon during incremental assembly of container
authorNeil Brown <neilb@suse.de>
Mon, 26 May 2008 23:18:52 +0000 (09:18 +1000)
committerNeil Brown <neilb@suse.de>
Mon, 26 May 2008 23:18:52 +0000 (09:18 +1000)
Incremental.c
super-ddf.c

index 18cdf3fae6f6de6012f541beed6b134937db5e0d..5c582bb304e7cf908fa3066e99c068856f42f70f 100644 (file)
@@ -849,11 +849,35 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
                        default:
                                sysfs_set_str(sra, NULL, "array_state",
                                              "readonly");
+                               /* start mdmon if needed. */
+                               if (mdmon_running(st->container_dev))
+                                       signal_mdmon(st->container_dev);
+                               else {
+                                       int dn = st->container_dev;
+                                       int i;
+                                       switch(fork()) {
+                                       case 0:
+                                               /* FIXME yuk. CLOSE_EXEC?? */
+                                               for (i=3; i < 100; i++)
+                                                       close(i);
+                                               execl("./mdmon", "mdmon",
+                                                     map_dev(dev2major(dn),
+                                                             dev2minor(dn),
+                                                             1), NULL);
+                                               exit(1);
+                                       case -1: fprintf(stderr, Name
+                                                        ": cannot fork. "
+                                                 "Array remains readonly\n");
+                                               return 1;
+                                       default: ; /* parent - good */
+                                       }
+                               }
                                break;
                        }
                        if (verbose >= 0)
                                printf("Started %s with %d devices\n",
                                       chosen_name, working);
+                       /* FIXME should have an O_EXCL and wait for read-auto */
                } else
                        if (verbose >= 0)
                                printf("%s assembled with %d devices but "
index f0cb1f1fe83dc4dbdac61b84956b4ea5c4ad635d..1e9101719f5d4970e746392fcdc49c635cd42f98 100644 (file)
@@ -2350,6 +2350,7 @@ static int load_super_ddf_all(struct supertype *st, int fd,
                st->ss = &super_ddf_container;
                st->minor_version = 0;
                st->max_devs = 512;
+               st->container_dev = fd2devnum(fd);
        }
        return 0;
 }