summaryrefslogtreecommitdiff
path: root/Examine.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-12-05 12:56:31 +1100
committerNeilBrown <neilb@suse.de>2012-12-05 12:56:31 +1100
commit6d388a88163a8f532513e73dd035892ea8a8ead2 (patch)
treec1ad00cb9ba406ca509654ed9d2883d78c1b5528 /Examine.c
parent8cf2eb96b2330b1507af2fa55d99f338eeff5ab5 (diff)
MISC: Add --examine-badblocks option
This will list the contents of the bad-blocks log, if one is present. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Examine.c')
-rw-r--r--Examine.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/Examine.c b/Examine.c
index a5b32293..90b25ec4 100644
--- a/Examine.c
+++ b/Examine.c
@@ -187,3 +187,39 @@ int Examine(struct mddev_dev *devlist,
}
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;
+}