summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-05-03 23:44:40 +0000
committerNeil Brown <neilb@suse.de>2005-05-03 23:44:40 +0000
commit82d9eba687c952a9919f756203706285d6c42f07 (patch)
tree53d8a29cc1e532aa0f05f888cfd6603dd9f4715f /util.c
parentf9ce90ba509d0b624cc38635861b9c27550fbefc (diff)
downloadmdadm-82d9eba687c952a9919f756203706285d6c42f07.tar.gz
mdadm-82d9eba687c952a9919f756203706285d6c42f07.tar.xz
mdadm-82d9eba687c952a9919f756203706285d6c42f07.zip
super1
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au> Fix raid5 creation with new code. Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Diffstat (limited to 'util.c')
-rw-r--r--util.c62
1 files changed, 31 insertions, 31 deletions
diff --git a/util.c b/util.c
index f243d88..bb4a479 100644
--- a/util.c
+++ b/util.c
@@ -210,25 +210,21 @@ int check_raid(int fd, char *name)
void *super;
struct mdinfo info;
time_t crtime;
+ struct supertype *st = guess_super(fd);
- int i;
- for (i=0; superlist[i]; i++) {
- if (superlist[i]->load_super(fd, &super, name))
- continue;
- /* Looks like a raid array .. */
- fprintf(stderr, Name ": %s appears to be part of a raid array:\n",
- name);
- superlist[i]->getinfo_super(&info, super);
- free(super);
- crtime = info.array.ctime;
- fprintf(stderr, " level=%d devices=%d ctime=%s",
- info.array.level, info.array.raid_disks, ctime(&crtime));
- return 1;
- }
- return 0;
+ if (!st) return 0;
+ st->ss->load_super(st, fd, &super, name);
+ /* Looks like a raid array .. */
+ fprintf(stderr, Name ": %s appears to be part of a raid array:\n",
+ name);
+ st->ss->getinfo_super(&info, super);
+ free(super);
+ crtime = info.array.ctime;
+ fprintf(stderr, " level=%d devices=%d ctime=%s",
+ info.array.level, info.array.raid_disks, ctime(&crtime));
+ return 1;
}
-
int ask(char *mesg)
{
char *add = "";
@@ -526,38 +522,42 @@ void put_md_name(char *name)
-struct superswitch *superlist[] = { &super0, NULL };
+struct superswitch *superlist[] = { &super0, &super1, NULL };
-struct superswitch *super_by_version(int vers)
+struct supertype *super_by_version(int vers, int minor)
{
- if (vers == 0) return &super0;
- return NULL;
+ struct supertype *st = malloc(sizeof(*st));
+ if (!st) return st;
+ if (vers == 0)
+ st->ss = &super0;
+
+ if (vers == 1)
+ st->ss = &super1;
+ st->minor_version = minor;
+ return st;
}
-struct superswitch *guess_super(int fd, char *dev)
+struct supertype *guess_super(int fd)
{
/* try each load_super to find the best match,
* and return the best superswitch
*/
- struct superswitch *best = NULL, *ss;
- int bestrv = 0;
+ struct superswitch *ss;
+ struct supertype *st;
+
void *sbp = NULL;
int i;
+ st = malloc(sizeof(*st));
+ memset(st, 0, sizeof(*st));
for (i=0 ; superlist[i]; i++) {
int rv;
ss = superlist[i];
- rv = ss->load_super(fd, &sbp, NULL);
+ rv = ss->load_super(st, fd, &sbp, NULL);
if (rv == 0) {
free(sbp);
- return ss;
- }
- if (rv > bestrv) {
- bestrv = rv;
- best = ss;
+ return st;
}
}
- if (bestrv > 2) /* FIXME */
- return best;
return NULL;
}