X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=Assemble.c;h=3c0986171097a6cfe1af929f2b51c51ce4ff739d;hp=e762c693e502321a7c1e87d495a07f521714f11b;hb=f9ce90ba509d0b624cc38635861b9c27550fbefc;hpb=4b1ac34b51a3783ab528b1af307156fab057b543 diff --git a/Assemble.c b/Assemble.c index e762c693..3c098617 100644 --- a/Assemble.c +++ b/Assemble.c @@ -29,7 +29,7 @@ #include "mdadm.h" -int Assemble(char *mddev, int mdfd, +int Assemble(struct superswitch *ss, char *mddev, int mdfd, mddev_ident_t ident, char *conffile, mddev_dev_t devlist, int readonly, int runstop, @@ -164,6 +164,7 @@ int Assemble(char *mddev, int mdfd, } devices = malloc(num_devs * sizeof(*devices)); + if (!ss && ident->ss) ss = ident->ss; if (verbose) fprintf(stderr, Name ": looking for devices for %s\n", @@ -173,6 +174,7 @@ int Assemble(char *mddev, int mdfd, char *devname; int dfd; struct stat stb; + struct superswitch *tss = ss; devname = devlist->devname; devlist = devlist->next; @@ -203,13 +205,16 @@ int Assemble(char *mddev, int mdfd, fprintf(stderr, Name ": %s is not a block device.\n", devname); close(dfd); - } else if (load_super0(dfd, &super, NULL)) { + } else if (!tss && (tss = guess_super(dfd, NULL)) == NULL) { + if (inargv || verbose) + fprintf(stderr, Name ": no recogniseable superblock\n"); + } else if (tss->load_super(dfd, &super, NULL)) { if (inargv || verbose) fprintf( stderr, Name ": no RAID superblock on %s\n", devname); close(dfd); } else { - getinfo_super0(&info, super); + tss->getinfo_super(&info, super); close(dfd); } @@ -253,7 +258,8 @@ int Assemble(char *mddev, int mdfd, free(first_super); return 1; } - if (compare_super0(&first_super, super)) { + ss = tss; /* commit to this format, if haven't already */ + if (ss->compare_super(&first_super, super)) { fprintf(stderr, Name ": superblock on %s doesn't match others - assembly aborted\n", devname); free(super); @@ -268,13 +274,13 @@ int Assemble(char *mddev, int mdfd, fstat(mdfd, &stb2); info.array.md_minor = minor(stb2.st_rdev); - update_super0(&info, super, update, devname, verbose); + ss->update_super(&info, super, update, devname, verbose); dfd = open(devname, O_RDWR|O_EXCL, 0); if (dfd < 0) fprintf(stderr, Name ": Cannot open %s for superblock update\n", devname); - else if (store_super0(dfd, super)) + else if (ss->store_super(dfd, super)) fprintf(stderr, Name ": Could not re-write superblock on %s.\n", devname); if (dfd >= 0) @@ -335,7 +341,7 @@ int Assemble(char *mddev, int mdfd, return 1; } - getinfo_super0(&info, first_super); + ss->getinfo_super(&info, first_super); /* now we have some devices that might be suitable. * I wonder how many @@ -393,7 +399,7 @@ int Assemble(char *mddev, int mdfd, devices[chosen_drive].events = 0; continue; } - if (load_super0(fd, &super, NULL)) { + if (ss->load_super(fd, &super, NULL)) { close(fd); fprintf(stderr, Name ": RAID superblock disappeared from %s - not updating.\n", devices[chosen_drive].devname); @@ -401,9 +407,9 @@ int Assemble(char *mddev, int mdfd, continue; } info.events = devices[most_recent].events; - update_super0(&info, super, "force", devices[chosen_drive].devname, verbose); + ss->update_super(&info, super, "force", devices[chosen_drive].devname, verbose); - if (store_super0(fd, super)) { + if (ss->store_super(fd, super)) { close(fd); fprintf(stderr, Name ": Could not re-write superblock on %s\n", devices[chosen_drive].devname); @@ -440,7 +446,7 @@ int Assemble(char *mddev, int mdfd, devices[j].devname, strerror(errno)); return 1; } - if (load_super0(fd, &super, NULL)) { + if (ss->load_super(fd, &super, NULL)) { close(fd); fprintf(stderr, Name ": RAID superblock has disappeared from %s\n", devices[j].devname); @@ -452,7 +458,7 @@ int Assemble(char *mddev, int mdfd, fprintf(stderr, Name ": No suitable drives found for %s\n", mddev); return 1; } - getinfo_super0(&info, super); + ss->getinfo_super(&info, super); for (i=0; iupdate_super(&info, super, "assemble", NULL, 0)) { if (force) { fprintf(stderr, Name ": " "clearing FAULTY flag for device %d in %s for %s\n", @@ -492,7 +498,7 @@ int Assemble(char *mddev, int mdfd, } if (force && okcnt == info.array.raid_disks-1) { /* FIXME check event count */ - change += update_super0(&info, super, "force", + change += ss->update_super(&info, super, "force", devices[chosen_drive].devname, 0); } @@ -504,7 +510,7 @@ int Assemble(char *mddev, int mdfd, devices[chosen_drive].devname); return 1; } - if (store_super0(fd, super)) { + if (ss->store_super(fd, super)) { close(fd); fprintf(stderr, Name ": Could not re-write superblock on %s\n", devices[chosen_drive].devname);