]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Factor out add-disk code
[thirdparty/mdadm.git] / Create.c
index b2edc7d6e7bcada0514854cc498fe105865f9ec9..20886d119c868609e15dd52d1f8dc65c4dfb278a 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -72,12 +72,13 @@ int Create(struct supertype *st, char *mddev, int mdfd,
        int rv;
        int bitmap_fd;
        int have_container = 0;
-       int container_fd;
+       int container_fd = -1;
        int need_mdmon = 0;
        unsigned long long bitmapsize;
        struct mdinfo *sra;
        struct mdinfo info, *infos;
        int did_default = 0;
+       unsigned long safe_mode_delay = 0;
 
        int major_num = BITMAP_MAJOR_HI;
 
@@ -139,7 +140,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                int fd;
 
                memset(&inf, 0, sizeof(inf));
-               fd = open(devlist->devname, O_RDONLY, 0);
+               fd = open(devlist->devname, O_RDONLY);
                if (fd >= 0 &&
                    ioctl(fd, GET_ARRAY_INFO, &inf) == 0 &&
                    inf.raid_disks == 0) {
@@ -333,7 +334,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                        minsize = freesize;
                }
                if (runstop != 1 || verbose >= 0) {
-                       int fd = open(dname, O_RDONLY, 0);
+                       int fd = open(dname, O_RDONLY);
                        if (fd <0 ) {
                                fprintf(stderr, Name ": Cannot open %s: %s\n",
                                        dname, strerror(errno));
@@ -523,7 +524,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
        st->ss->getinfo_super(st, &info);
 
        if (did_default && verbose >= 0) {
-               if (info.text_version[0] == '/') {
+               if (is_subarray(info.text_version)) {
                        int dnum = devname2devnum(info.text_version+1);
                        char *path;
                        int mdp = get_mdp_major();
@@ -685,9 +686,9 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                        inf->disk.state |= (1<<MD_DISK_WRITEMOSTLY);
 
                                if (st->ss->external && st->subarray[0])
-                                       fd = open(dv->devname, O_RDWR, 0);
+                                       fd = open(dv->devname, O_RDWR);
                                else
-                                       fd = open(dv->devname, O_RDWR|O_EXCL,0);
+                                       fd = open(dv->devname, O_RDWR|O_EXCL);
 
                                if (fd < 0) {
                                        fprintf(stderr, Name ": failed to open %s "
@@ -703,6 +704,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                st->ss->add_to_super(st, &inf->disk,
                                                     fd, dv->devname);
                                st->ss->getinfo_super(st, inf);
+                               safe_mode_delay = inf->safe_mode_delay;
 
                                /* getinfo_super might have lost these ... */
                                inf->disk.major = major(stb.st_rdev);
@@ -712,11 +714,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                inf->errors = 0;
                                rv = 0;
 
-                               if (st->ss->external)
-                                       rv = sysfs_add_disk(sra, inf);
-                               else
-                                       rv = ioctl(mdfd, ADD_NEW_DISK,
-                                                  &inf->disk);
+                               rv = add_disk(mdfd, st, sra, inf);
 
                                if (rv) {
                                        fprintf(stderr,
@@ -757,6 +755,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                              "readonly");
                                break;
                        }
+                       sysfs_set_safemode(sra, safe_mode_delay);
                } else {
                        mdu_param_t param;
                        if (ioctl(mdfd, RUN_ARRAY, &param)) {
@@ -769,28 +768,10 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                if (verbose >= 0)
                        fprintf(stderr, Name ": array %s started.\n", mddev);
                if (st->ss->external && st->subarray[0]) {
-                       if (need_mdmon && !env_no_mdmon()) {
-                               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 */
-                               }
-                       } else
-                               signal_mdmon(st->container_dev);
-                       /* FIXME wait for mdmon to set array to read-auto */
-                       sleep(1);
+                       if (need_mdmon)
+                               start_mdmon(st->container_dev);
+
+                       ping_monitor(devnum2devname(st->container_dev));
                        close(container_fd);
                }
        } else {