]> git.neil.brown.name Git - mdadm.git/commitdiff
Merge branch 'master' into devel-3.0
authorNeilBrown <neilb@suse.de>
Sun, 26 Oct 2008 23:10:08 +0000 (10:10 +1100)
committerNeilBrown <neilb@suse.de>
Sun, 26 Oct 2008 23:10:08 +0000 (10:10 +1100)
Conflicts:

Create.c
Manage.c

1  2 
Create.c
Manage.c
mdadm.8
mdadm.c
mdadm.h

diff --cc Create.c
index 7a4a81dfa674912b32a6e5d7494bb83535a4e200,9e65d0a9f6516d125cfb5f1c96efb7106a678f46..8bcdc3bfc9de7e8067b9320102c24aa971e26bf1
+++ b/Create.c
@@@ -653,33 -528,24 +653,33 @@@ int Create(struct supertype *st, char *
                        if (dnum == insert_point) {
                                moved_disk = dv;
                        }
 -                      info.disk.raid_disk = info.disk.number;
 -                      if (info.disk.raid_disk < raiddisks)
 -                              info.disk.state = (1<<MD_DISK_ACTIVE) |
 +                      if (dnum == insert_point ||
 +                          strcasecmp(dv->devname, "missing")==0)
 +                              continue;
 +
 +                      switch(pass) {
 +                      case 1:
 +                              *inf = info;
 +
 +                              inf->disk.number = dnum;
 +                              inf->disk.raid_disk = dnum;
 +                              if (inf->disk.raid_disk < raiddisks)
 +                                      inf->disk.state = (1<<MD_DISK_ACTIVE) |
                                                (1<<MD_DISK_SYNC);
 -                      else
 -                              info.disk.state = 0;
 -                      if (dv->writemostly == 1)
 -                              info.disk.state |= (1<<MD_DISK_WRITEMOSTLY);
 +                              else
 +                                      inf->disk.state = 0;
 +
-                               if (dv->writemostly)
++                              if (dv->writemostly == 1)
 +                                      inf->disk.state |= (1<<MD_DISK_WRITEMOSTLY);
 +
 +                              if (st->ss->external && st->subarray[0])
 +                                      fd = open(dv->devname, O_RDWR);
 +                              else
 +                                      fd = open(dv->devname, O_RDWR|O_EXCL);
  
 -                      if (dnum == insert_point ||
 -                          strcasecmp(dv->devname, "missing")==0) {
 -                              info.disk.major = 0;
 -                              info.disk.minor = 0;
 -                              info.disk.state = (1<<MD_DISK_FAULTY);
 -                      } else {
 -                              fd = open(dv->devname, O_RDONLY|O_EXCL);
                                if (fd < 0) {
 -                                      fprintf(stderr, Name ": failed to open %s after earlier success - aborting\n",
 +                                      fprintf(stderr, Name ": failed to open %s "
 +                                              "after earlier success - aborting\n",
                                                dv->devname);
                                        return 1;
                                }
diff --cc Manage.c
index 0018d8d37854f0d23912ac26d3a5e4fa4732f72d,160778ed03125d4fd80fb9793bc81214619d9445..6b9825b41b0689065eb19f04afdd5cbb3cfd184d
+++ b/Manage.c
@@@ -554,18 -453,12 +556,18 @@@ int Manage_subdevs(char *devname, int f
                        disc.minor = minor(stb.st_rdev);
                        disc.number =j;
                        disc.state = 0;
 -                      if (array.not_persistent==0) {
 +                      if (array.not_persistent==0 || tst->ss->external) {
 +                              int dfd;
-                               if (dv->writemostly)
+                               if (dv->writemostly == 1)
                                        disc.state |= 1 << MD_DISK_WRITEMOSTLY;
 -                              tst->ss->add_to_super(tst, &disc);
 -                              if (tst->ss->write_init_super(tst, &disc,
 -                                                            dv->devname))
 +                              dfd = open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
 +                              tst->ss->add_to_super(tst, &disc, dfd,
 +                                                    dv->devname);
 +                              /* write_init_super will close 'dfd' */
 +                              if (tst->ss->external)
 +                                      /* mdmon will write the metadata */
 +                                      close(dfd);
 +                              else if (tst->ss->write_init_super(tst))
                                        return 1;
                        } else if (dv->re_add) {
                                /*  this had better be raid1.
                                                break;
                                        }
                        }
-                       if (dv->writemostly)
+                       if (dv->writemostly == 1)
                                disc.state |= (1 << MD_DISK_WRITEMOSTLY);
 -                      if (ioctl(fd,ADD_NEW_DISK, &disc)) {
 +                      if (tst->ss->external) {
 +                              /* add a disk to an external metadata container
 +                               * only if mdmon is around to see it
 +                               */
 +                              struct mdinfo new_mdi;
 +                              struct mdinfo *sra;
 +                              int container_fd;
 +                              int devnum = fd2devnum(fd);
 +
 +                              container_fd = open_dev_excl(devnum);
 +                              if (container_fd < 0) {
 +                                      fprintf(stderr, Name ": add failed for %s:"
 +                                              " could not get exclusive access to container\n",
 +                                              dv->devname);
 +                                      return 1;
 +                              }
 +
 +                              if (!mdmon_running(devnum)) {
 +                                      fprintf(stderr, Name ": add failed for %s: mdmon not running\n",
 +                                              dv->devname);
 +                                      close(container_fd);
 +                                      return 1;
 +                              }
 +
 +                              sra = sysfs_read(container_fd, -1, 0);
 +                              if (!sra) {
 +                                      fprintf(stderr, Name ": add failed for %s: sysfs_read failed\n",
 +                                              dv->devname);
 +                                      close(container_fd);
 +                                      return 1;
 +                              }
 +                              sra->array.level = LEVEL_CONTAINER;
 +                              /* Need to set data_offset and component_size */
 +                              tst->ss->getinfo_super(tst, &new_mdi);
 +                              new_mdi.disk.major = disc.major;
 +                              new_mdi.disk.minor = disc.minor;
 +                              if (sysfs_add_disk(sra, &new_mdi) != 0) {
 +                                      fprintf(stderr, Name ": add new device to external metadata"
 +                                              " failed for %s\n", dv->devname);
 +                                      close(container_fd);
 +                                      return 1;
 +                              }
 +                              ping_monitor(devnum2devname(devnum));
 +                              sysfs_free(sra);
 +                              close(container_fd);
 +                      } else if (ioctl(fd, ADD_NEW_DISK, &disc)) {
                                fprintf(stderr, Name ": add new device failed for %s as %d: %s\n",
                                        dv->devname, j, strerror(errno));
                                return 1;
diff --cc mdadm.8
Simple merge
diff --cc mdadm.c
Simple merge
diff --cc mdadm.h
Simple merge