From: NeilBrown Date: Sun, 26 Oct 2008 23:10:08 +0000 (+1100) Subject: Merge branch 'master' into devel-3.0 X-Git-Tag: mdadm-3.0-devel2~69 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b01b06bda8dce132e6eb3c3826ad0f4b94ebdf43;p=thirdparty%2Fmdadm.git Merge branch 'master' into devel-3.0 Conflicts: Create.c Manage.c --- b01b06bda8dce132e6eb3c3826ad0f4b94ebdf43 diff --cc Create.c index 7a4a81df,9e65d0a9..8bcdc3bf --- a/Create.c +++ 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<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<writemostly == 1) - info.disk.state |= (1<disk.state = 0; + - if (dv->writemostly) ++ if (dv->writemostly == 1) + inf->disk.state |= (1<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<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 0018d8d3,160778ed..6b9825b4 --- a/Manage.c +++ 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. @@@ -596,54 -489,9 +598,54 @@@ 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;