diff options
author | Neil Brown <neilb@suse.de> | 2007-12-14 20:14:33 +1100 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2007-12-14 20:14:33 +1100 |
commit | 3da92f272d017b1817b13f37f41c1ed4d6117291 (patch) | |
tree | b0013cdf438a640150e13388ebf7d64992be3737 /Manage.c | |
parent | 64557c33917a6f661d091e36ab00065d4107dcee (diff) | |
download | mdadm-3da92f272d017b1817b13f37f41c1ed4d6117291.tar.gz mdadm-3da92f272d017b1817b13f37f41c1ed4d6117291.tar.xz mdadm-3da92f272d017b1817b13f37f41c1ed4d6117291.zip |
Drop the superblock arg from all metadata methods.
It is now in the 'supertype'
Diffstat (limited to 'Manage.c')
-rw-r--r-- | Manage.c | 54 |
1 files changed, 30 insertions, 24 deletions
@@ -192,9 +192,7 @@ int Manage_subdevs(char *devname, int fd, struct stat stb; int j, jnext = 0; int tfd; - struct supertype *st; - void *dsuper = NULL; - void *osuper = NULL; /* original super */ + struct supertype *st, *tst; int duuid[4]; int ouuid[4]; @@ -203,6 +201,15 @@ int Manage_subdevs(char *devname, int fd, devname); return 1; } + + tst = super_by_version(array.major_version, + array.minor_version); + if (!tst) { + fprintf(stderr, Name ": unsupport array - version %d.%d\n", + array.major_version, array.minor_version); + return 1; + } + for (dv = devlist, j=0 ; dv; dv = next, j = jnext) { unsigned long long ldsize; char dvname[20]; @@ -291,13 +298,6 @@ int Manage_subdevs(char *devname, int fd, return 1; case 'a': /* add the device */ - st = super_by_version(array.major_version, - array.minor_version); - if (!st) { - fprintf(stderr, Name ": unsupport array - version %d.%d\n", - array.major_version, array.minor_version); - return 1; - } /* Make sure it isn't in use (in 2.6 or later) */ tfd = open(dv->devname, O_RDONLY|O_EXCL); @@ -307,9 +307,13 @@ int Manage_subdevs(char *devname, int fd, return 1; } remove_partitions(tfd); + + st = super_by_version(array.major_version, + array.minor_version); + if (array.not_persistent==0) - st->ss->load_super(st, tfd, &osuper, NULL); - /* will use osuper later */ + st->ss->load_super(st, tfd, NULL); + if (!get_dev_size(tfd, dv->devname, &ldsize)) { close(tfd); return 1; @@ -334,7 +338,7 @@ int Manage_subdevs(char *devname, int fd, if (array.not_persistent == 0) { /* Make sure device is large enough */ - if (st->ss->avail_size(st, ldsize/512) < + if (tst->ss->avail_size(tst, ldsize/512) < array.size) { fprintf(stderr, Name ": %s not large enough to join array\n", dv->devname); @@ -344,7 +348,7 @@ int Manage_subdevs(char *devname, int fd, /* need to find a sample superblock to copy, and * a spare slot to use */ - for (j=0; j<st->max_devs; j++) { + for (j = 0; j < tst->max_devs; j++) { char *dev; int dfd; disc.number = j; @@ -358,14 +362,15 @@ int Manage_subdevs(char *devname, int fd, if (!dev) continue; dfd = dev_open(dev, O_RDONLY); if (dfd < 0) continue; - if (st->ss->load_super(st, dfd, &dsuper, NULL)) { + if (tst->ss->load_super(tst, dfd, + NULL)) { close(dfd); continue; } close(dfd); break; } - if (!dsuper) { + if (!tst->sb) { fprintf(stderr, Name ": cannot find valid superblock in this array - HELP\n"); return 1; } @@ -373,7 +378,7 @@ int Manage_subdevs(char *devname, int fd, * and was temporarily removed, and is now being re-added. * If so, we can simply re-add it. */ - st->ss->uuid_from_super(st, duuid, dsuper); + tst->ss->uuid_from_super(tst, duuid); /* re-add doesn't work for version-1 superblocks * before 2.6.18 :-( @@ -381,15 +386,15 @@ int Manage_subdevs(char *devname, int fd, if (array.major_version == 1 && get_linux_version() <= 2006018) ; - else if (osuper) { - st->ss->uuid_from_super(st, ouuid, osuper); + else if (st->sb) { + st->ss->uuid_from_super(st, ouuid); if (memcmp(duuid, ouuid, sizeof(ouuid))==0) { /* looks close enough for now. Kernel * will worry about whether a bitmap * based reconstruction is possible. */ struct mdinfo mdi; - st->ss->getinfo_super(st, &mdi, osuper); + st->ss->getinfo_super(st, &mdi); disc.major = major(stb.st_rdev); disc.minor = minor(stb.st_rdev); disc.number = mdi.disk.number; @@ -420,7 +425,7 @@ int Manage_subdevs(char *devname, int fd, * we must choose the same free number, which requires * starting at 'raid_disks' and counting up */ - for (j = array.raid_disks; j< st->max_devs; j++) { + for (j = array.raid_disks; j< tst->max_devs; j++) { disc.number = j; if (ioctl(fd, GET_DISK_INFO, &disc)) break; @@ -436,8 +441,9 @@ int Manage_subdevs(char *devname, int fd, if (array.not_persistent==0) { if (dv->writemostly) disc.state |= 1 << MD_DISK_WRITEMOSTLY; - st->ss->add_to_super(st, dsuper, &disc); - if (st->ss->write_init_super(st, dsuper, &disc, dv->devname)) + tst->ss->add_to_super(tst, &disc); + if (tst->ss->write_init_super(tst, &disc, + dv->devname)) return 1; } else if (dv->re_add) { /* this had better be raid1. @@ -446,7 +452,7 @@ int Manage_subdevs(char *devname, int fd, */ char *used = malloc(array.raid_disks); memset(used, 0, array.raid_disks); - for (j=0; j< st->max_devs; j++) { + for (j=0; j< tst->max_devs; j++) { mdu_disk_info_t disc2; disc2.number = j; if (ioctl(fd, GET_DISK_INFO, &disc2)) |