]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Assemble.c
Add a 'super-switch' so that different format superblocks can be used.
[thirdparty/mdadm.git] / Assemble.c
index e762c693e502321a7c1e87d495a07f521714f11b..3c0986171097a6cfe1af929f2b51c51ce4ff739d 100644 (file)
@@ -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; i<bestcnt; i++) {
                int j = best[i];
                unsigned int desired_state;
@@ -470,7 +476,7 @@ int Assemble(char *mddev, int mdfd,
                info.disk.state = desired_state;
 
                if (devices[j].uptodate &&
-                   update_super0(&info, super, "assemble", NULL, 0)) {
+                   ss->update_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);