- atime = super.ctime;
- printf(" Creation Time : %.24s\n", ctime(&atime));
- c=map_num(pers, super.level);
- printf(" Raid Level : %s\n", c?c:"-unknown-");
- printf(" Size : %d\n", super.size);
- printf(" Raid Disks : %d\n", super.raid_disks);
- printf(" Total Disks : %d\n", super.nr_disks);
- printf("Preferred Minor : %d\n", super.md_minor);
- printf("\n");
- atime = super.utime;
- printf(" Update Time : %.24s\n", ctime(&atime));
- printf(" State : %s, %serrors\n",
- (super.state&(1<<MD_SB_CLEAN))?"clean":"dirty",
- (super.state&(1<<MD_SB_ERRORS))?"":"no-");
- printf(" Active Drives : %d\n", super.active_disks);
- printf(" Working Drives : %d\n", super.working_disks);
- printf(" Failed Drives : %d\n", super.failed_disks);
- printf(" Spare Drives : %d\n", super.spare_disks);
- if (calc_sb_csum(&super) == super.sb_csum)
- printf(" Checksum : %x - correct\n", super.sb_csum);
- else
- printf(" Checksum : %x - expected %x\n", super.sb_csum, calc_sb_csum(&super));
- printf(" Events : %d.%d\n", super.events_hi, super.events_lo);
- printf("\n");
- if (super.level == 5) {
- c = map_num(r5layout, super.layout);
- printf(" Layout : %s\n", c?c:"-unknown-");
- }
- switch(super.level) {
- case 0:
- case 4:
- case 5:
- printf(" Chunk Size : %dK\n", super.chunk_size/1024);
- break;
- case -1:
- printf(" Rounding : %dK\n", super.chunk_size/1024);
- break;
- default: break;
+ fd = dev_open(devlist->devname, O_RDONLY);
+ if (fd < 0) {
+ 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,
+ (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 (SparcAdjust)
+ 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->st, st)==0)
+ break;
+ }
+ if (!ap) {
+ ap = malloc(sizeof(*ap));
+ ap->devs = dl_head();
+ ap->next = arrays;
+ ap->spares = 0;
+ ap->st = st;
+ arrays = ap;
+ st->ss->getinfo_super(st, &ap->info);
+ } else {
+ st->ss->getinfo_super(st, &ap->info);
+ st->ss->free_super(st);
+ }
+ if (!(ap->info.disk.state & (1<<MD_DISK_SYNC)))
+ ap->spares++;
+ d = dl_strdup(devlist->devname);
+ dl_add(ap->devs, d);
+ } else if (export) {
+ if (st->ss->export_examine_super)
+ st->ss->export_examine_super(st);
+ } else {
+ printf("%s:\n",devlist->devname);
+ st->ss->examine_super(st, homehost);
+ st->ss->free_super(st);
+ }