summaryrefslogtreecommitdiffstats
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2008-05-15 16:48:18 +1000
committerNeil Brown <neilb@suse.de>2008-05-15 16:48:18 +1000
commita19c88b83db3cc25affb75fe2d5531c964379d96 (patch)
tree99c2e32201d2a68e3a803bbf83fe9319e7131e7b /Assemble.c
parent2503d23b5a113adee89b2631770a8dbfd9ca1351 (diff)
downloadmdadm-a19c88b83db3cc25affb75fe2d5531c964379d96.tar.gz
mdadm-a19c88b83db3cc25affb75fe2d5531c964379d96.tar.xz
mdadm-a19c88b83db3cc25affb75fe2d5531c964379d96.zip
Start on --assemble support for DDF
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/Assemble.c b/Assemble.c
index 8621203..16dec24 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -843,6 +843,24 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
/* Almost ready to actually *do* something */
if (!old_linux) {
int rv;
+
+#ifndef MDASSEMBLE
+ struct mdinfo *sra;
+ if (st->ss->external) {
+ char ver[100];
+ strcat(strcpy(ver, "external:"), st->ss->text_version);
+ sra = sysfs_read(mdfd, 0, 0);
+ if ((vers % 100) < 2 ||
+ sra == NULL ||
+ sysfs_set_str(sra, NULL, "metadata_version",
+ ver) < 0) {
+ fprintf(stderr, Name ": This kernel does not "
+ "support external metadata.\n");
+ return 1;
+ }
+ rv = sysfs_set_array(sra, &info);
+ } else
+#endif
if ((vers % 100) >= 1) { /* can use different versions */
mdu_array_info_t inf;
memset(&inf, 0, sizeof(inf));
@@ -893,8 +911,22 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
j = chosen_drive;
if (j >= 0 /* && devices[j].uptodate */) {
- if (ioctl(mdfd, ADD_NEW_DISK,
- &devices[j].i.disk)!=0) {
+#ifndef MDASSEMBLE
+ if (st->ss->external) {
+ int fd = dev_open(devices[j].devname,
+ O_RDONLY);
+ if (fd < 0)
+ rv = 1;
+ else {
+ rv = sysfs_add_disk(sra, fd,
+ &devices[j].i);
+ close(fd);
+ }
+ } else
+#endif
+ rv = ioctl(mdfd, ADD_NEW_DISK,
+ &devices[j].i.disk);
+ if (rv) {
fprintf(stderr, Name ": failed to add "
"%s to %s: %s\n",
devices[j].devname,