X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Examine.c;h=953b8eee236008127f590ac77cad263e0d9d360d;hb=d31d0f5218e96a2a3a0c9b4418bb387ec211dd0d;hp=a5b3229352603e9d5141406572354334e1a683cb;hpb=ca3b66960301eb5d87e9b2ee99d3728c877ed111;p=thirdparty%2Fmdadm.git diff --git a/Examine.c b/Examine.c index a5b32293..953b8eee 100644 --- a/Examine.c +++ b/Examine.c @@ -1,7 +1,7 @@ /* * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2001-2012 Neil Brown + * Copyright (C) 2001-2013 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -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; +}