diff options
author | Neil Brown <neilb@suse.de> | 2005-05-03 23:44:32 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2005-05-03 23:44:32 +0000 |
commit | f9ce90ba509d0b624cc38635861b9c27550fbefc (patch) | |
tree | de5576f6c939e0fd95f76030b4d273fdfc9f5945 /Assemble.c | |
parent | 4b1ac34b51a3783ab528b1af307156fab057b543 (diff) |
Add a 'super-switch' so that different format superblocks can be used.
This includes:
adding --metadata= option to choose metadata format
adding metadata= word to config file.
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Diffstat (limited to 'Assemble.c')
-rw-r--r-- | Assemble.c | 36 |
1 files changed, 21 insertions, 15 deletions
@@ -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); |