summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Majchrzak <tomasz.majchrzak@intel.com>2016-11-29 14:02:34 +0100
committerJes Sorensen <Jes.Sorensen@redhat.com>2016-12-02 17:02:48 +0100
commit27156a57ddb8d56215092c0f221de177a4d8582d (patch)
treed10b02c1d6c5bdfffeaee2558824d577fe2f3c53
parentimsm: provide list of bad blocks for an array (diff)
downloadmdadm-27156a57ddb8d56215092c0f221de177a4d8582d.tar.xz
mdadm-27156a57ddb8d56215092c0f221de177a4d8582d.zip
imsm: implement "--examine-badblocks" command
Implement "--examine-badblocks" command to provide list of bad blocks in metadata for a disk. Signed-off-by: Tomasz Majchrzak <tomasz.majchrzak@intel.com> Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
-rw-r--r--super-intel.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/super-intel.c b/super-intel.c
index f4cb89cb..560d2173 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -9920,6 +9920,61 @@ static struct md_bb *imsm_get_badblocks(struct active_array *a, int slot)
return &super->bb;
}
/*******************************************************************************
+* Function: examine_badblocks_imsm
+* Description: Prints list of bad blocks on a disk to the standard output
+*
+* Parameters:
+* st : metadata handler
+* fd : open file descriptor for device
+* devname : device name
+* Returns:
+* 0 : Success
+* 1 : Error
+******************************************************************************/
+static int examine_badblocks_imsm(struct supertype *st, int fd, char *devname)
+{
+ struct intel_super *super = st->sb;
+ struct bbm_log *log = super->bbm_log;
+ struct dl *d = NULL;
+ int any = 0;
+
+ for (d = super->disks; d ; d = d->next) {
+ if (strcmp(d->devname, devname) == 0)
+ break;
+ }
+
+ if ((d == NULL) || (d->index < 0)) { /* serial mismatch probably */
+ pr_err("%s doesn't appear to be part of a raid array\n",
+ devname);
+ return 1;
+ }
+
+ if (log != NULL) {
+ unsigned int i;
+ struct bbm_log_entry *entry = &log->marked_block_entries[0];
+
+ for (i = 0; i < log->entry_count; i++) {
+ if (entry[i].disk_ordinal == d->index) {
+ unsigned long long sector = __le48_to_cpu(
+ &entry[i].defective_block_start);
+ int cnt = entry[i].marked_count + 1;
+
+ if (!any) {
+ printf("Bad-blocks on %s:\n", devname);
+ any = 1;
+ }
+
+ printf("%20llu for %d sectors\n", sector, cnt);
+ }
+ }
+ }
+
+ if (!any)
+ printf("No bad-blocks list configured on %s\n", devname);
+
+ return 0;
+}
+/*******************************************************************************
* Function: init_migr_record_imsm
* Description: Function inits imsm migration record
* Parameters:
@@ -11440,6 +11495,7 @@ struct superswitch super_imsm = {
.manage_reshape = imsm_manage_reshape,
.recover_backup = recover_backup_imsm,
.copy_metadata = copy_metadata_imsm,
+ .examine_badblocks = examine_badblocks_imsm,
#endif
.match_home = match_home_imsm,
.uuid_from_super= uuid_from_super_imsm,