X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Examine.c;h=5de92028acd4c0bf971a859203bd363ca371ddae;hb=2df1f269113c687e0c23fad2ca9bcf3c4dcbb382;hp=e07b27e0590e54ac0177056579de05e07231c9b8;hpb=8b0dabea0762e2cd786c1539845823ecd914657a;p=thirdparty%2Fmdadm.git diff --git a/Examine.c b/Examine.c index e07b27e0..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, struct supertype *forcest) +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 @@ -53,16 +55,13 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust, struct su * If (brief) gather devices for same array and just print a mdadm.conf line including devices= * 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; - struct mddev_ident_s ident; void *devs; struct array *next; int spares; @@ -73,55 +72,67 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust, struct su 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 { if (!st) st = guess_super(fd); if (st) - err = st->ss->load_super(st, fd, &super, (brief||scan)?NULL:devlist->devname); - else + 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) - st->ss->update_super(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 (st->ss == ap->st->ss && st->ss->compare_super(&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; - st->ss->getinfo_super(&ap->info, &ap->ident, super); + st->ss->getinfo_super(st, &ap->info); } else { - st->ss->getinfo_super(&ap->info, &ap->ident, 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); - st->ss->examine_super(super); - free(super); + st->ss->examine_super(st, homehost); + st->ss->free_super(st); } } if (brief) { @@ -129,7 +140,7 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust, struct su for (ap=arrays; ap; ap=ap->next) { char sep='='; char *d; - ap->st->ss->brief_examine_super(ap->super); + ap->st->ss->brief_examine_super(ap->st); if (ap->spares) printf(" spares=%d", ap->spares); if (brief > 1) { printf(" devices"); @@ -138,7 +149,7 @@ int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust, struct su sep=','; } } - free(ap->super); + ap->st->ss->free_super(ap->st); /* FIXME free ap */ if (ap->spares || brief > 1) printf("\n");