diff options
author | NeilBrown <neilb@suse.de> | 2012-12-05 12:56:31 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-12-05 12:56:31 +1100 |
commit | 6d388a88163a8f532513e73dd035892ea8a8ead2 (patch) | |
tree | c1ad00cb9ba406ca509654ed9d2883d78c1b5528 /Examine.c | |
parent | 8cf2eb96b2330b1507af2fa55d99f338eeff5ab5 (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.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -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; +} |