X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=Examine.c;h=5de92028acd4c0bf971a859203bd363ca371ddae;hp=cd79583a827b452045c3ff87c3c7dd6b4a074d09;hb=3b0896f89988923c314cfb07454dde23b1b401fc;hpb=4b1ac34b51a3783ab528b1af307156fab057b543 diff --git a/Examine.c b/Examine.c index cd79583a..5de92028 100644 --- a/Examine.c +++ b/Examine.c @@ -1,7 +1,7 @@ /* * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2001-2002 Neil Brown + * Copyright (C) 2001-2006 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -35,7 +35,9 @@ #endif #include "md_u.h" #include "md_p.h" -int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust) +int Examine(mddev_dev_t devlist, int brief, int export, int scan, + int SparcAdjust, struct supertype *forcest, + char *homehost) { /* Read the raid superblock from a device and @@ -51,15 +53,14 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust) * utime, state etc * * If (brief) gather devices for same array and just print a mdadm.conf line including devices= - * if devlist==NULL, use conf_get_devs( + * if devlist==NULL, use conf_get_devs() */ - int fd; - void *super = NULL; + int fd; int rv = 0; - int err; + int err = 0; struct array { - void *super; + struct supertype *st; struct mdinfo info; void *devs; struct array *next; @@ -67,51 +68,71 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust) } *arrays = NULL; for (; devlist ; devlist=devlist->next) { - fd = open(devlist->devname, O_RDONLY); + struct supertype *st = forcest; + + fd = dev_open(devlist->devname, O_RDONLY); if (fd < 0) { - if (!scan) + if (!scan) { fprintf(stderr,Name ": cannot open %s: %s\n", devlist->devname, strerror(errno)); + rv = 1; + } err = 1; } else { - err = load_super0(fd, &super, (brief||scan)?NULL:devlist->devname); + if (!st) + st = guess_super(fd); + if (st) + err = st->ss->load_super(st, fd, + (brief||scan) ? NULL + :devlist->devname); + else { + if (!brief) { + fprintf(stderr, Name ": No md superblock detected on %s.\n", devlist->devname); + rv = 1; + } + err = 1; + } close(fd); } if (err) continue; - if (err) rv =1; if (SparcAdjust) - update_super0(NULL, super, "sparc2.2", devlist->devname, 0); + st->ss->update_super(st, NULL, "sparc2.2", + devlist->devname, 0, 0, NULL); /* Ok, its good enough to try, though the checksum could be wrong */ + if (brief) { struct array *ap; char *d; for (ap=arrays; ap; ap=ap->next) { - if (compare_super0(&ap->super, super)==0) + if (st->ss == ap->st->ss && + st->ss->compare_super(ap->st, st)==0) break; } if (!ap) { ap = malloc(sizeof(*ap)); - ap->super = super; ap->devs = dl_head(); ap->next = arrays; ap->spares = 0; + ap->st = st; arrays = ap; - getinfo_super0(&ap->info, super); + st->ss->getinfo_super(st, &ap->info); } else { - getinfo_super0(&ap->info, super); - free(super); + st->ss->getinfo_super(st, &ap->info); + st->ss->free_super(st); } if (!(ap->info.disk.state & MD_DISK_SYNC)) ap->spares++; d = dl_strdup(devlist->devname); dl_add(ap->devs, d); + } else if (export) { + st->ss->export_examine_super(st); } else { printf("%s:\n",devlist->devname); - examine_super0(super); - free(super); + st->ss->examine_super(st, homehost); + st->ss->free_super(st); } } if (brief) { @@ -119,16 +140,19 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust) for (ap=arrays; ap; ap=ap->next) { char sep='='; char *d; - brief_examine_super0(ap->super); + ap->st->ss->brief_examine_super(ap->st); if (ap->spares) printf(" spares=%d", ap->spares); - printf(" devices"); - for (d=dl_next(ap->devs); d!= ap->devs; d=dl_next(d)) { - printf("%c%s", sep, d); - sep=','; + if (brief > 1) { + printf(" devices"); + for (d=dl_next(ap->devs); d!= ap->devs; d=dl_next(d)) { + printf("%c%s", sep, d); + sep=','; + } } - free(ap->super); + ap->st->ss->free_super(ap->st); /* FIXME free ap */ - printf("\n"); + if (ap->spares || brief > 1) + printf("\n"); } } return rv;