/*
* mdadm - manage Linux "md" devices aka RAID arrays.
*
- * Copyright (C) 2001-2009 Neil Brown <neilb@suse.de>
+ * Copyright (C) 2001-2013 Neil Brown <neilb@suse.de>
*
*
* This program is free software; you can redistribute it and/or modify
*
* utime, state etc
*
- * If (brief) gather devices for same array and just print a mdadm.conf line including devices=
+ * 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;
int spares;
} *arrays = NULL;
- for (; devlist ; devlist=devlist->next) {
+ for (; devlist ; devlist = devlist->next) {
struct supertype *st;
int have_container = 0;
} else if (c->brief) {
struct array *ap;
char *d;
- for (ap=arrays; ap; ap=ap->next) {
+ for (ap = arrays; ap; ap = ap->next) {
if (st->ss == ap->st->ss &&
- st->ss->compare_super(ap->st, st)==0)
+ st->ss->compare_super(ap->st, st) == 0)
break;
}
if (!ap) {
}
if (c->brief) {
struct array *ap;
- for (ap=arrays; ap; ap=ap->next) {
+ for (ap = arrays; ap; ap = ap->next) {
char sep='=';
char *d;
int newline = 0;
newline += printf(" spares=%d", ap->spares);
if (c->verbose > 0) {
newline += printf(" devices");
- for (d=dl_next(ap->devs); d!= ap->devs; d=dl_next(d)) {
+ for (d = dl_next(ap->devs);
+ d != ap->devs;
+ d=dl_next(d)) {
printf("%c%s", sep, d);
sep=',';
}
}
return rv;
}
+
+int ExamineBadblocks(char *devname, int brief, struct supertype *forcest)
+{
+ int fd = dev_open(devname, O_RDONLY);
+ struct supertype *st = forcest;
+ int err = 1;
+
+ if (fd < 0) {
+ pr_err("cannot open %s: %s\n", devname, strerror(errno));
+ return 1;
+ }
+ if (!st)
+ st = guess_super(fd);
+ if (!st) {
+ if (!brief)
+ pr_err("No md superblock detected on %s\n", devname);
+ goto out;
+ }
+ if (!st->ss->examine_badblocks) {
+ pr_err("%s metadata does not support badblocks\n", st->ss->name);
+ goto out;
+ }
+ err = st->ss->load_super(st, fd, brief ? NULL : devname);
+ if (err)
+ goto out;
+ err = st->ss->examine_badblocks(st, fd, devname);
+
+out:
+ if (fd >= 0)
+ close(fd);
+ if (st) {
+ st->ss->free_super(st);
+ free(st);
+ }
+ return err;
+}