From: Tomasz Majchrzak Date: Tue, 29 Nov 2016 13:02:31 +0000 (+0100) Subject: imsm: clear bad block from bad block log X-Git-Tag: mdadm-4.0~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c07a5a4f410afac03132080a1f8342bc791590fd;p=thirdparty%2Fmdadm.git imsm: clear bad block from bad block log Signed-off-by: Tomasz Majchrzak Signed-off-by: Jes Sorensen --- diff --git a/super-intel.c b/super-intel.c index 54dafac0..5c7f4d07 100644 --- a/super-intel.c +++ b/super-intel.c @@ -904,6 +904,28 @@ static int record_new_badblock(struct bbm_log *log, const __u8 idx, unsigned return new_bb; } + +/* clear given bad block */ +static int clear_badblock(struct bbm_log *log, const __u8 idx, const unsigned + long long sector, const int length) { + __u32 i = 0; + + while (i < log->entry_count) { + struct bbm_log_entry *entries = log->marked_block_entries; + + if ((entries[i].disk_ordinal == idx) && + (__le48_to_cpu(&entries[i].defective_block_start) == + sector) && (entries[i].marked_count + 1 == length)) { + if (i < log->entry_count - 1) + entries[i] = entries[log->entry_count - 1]; + log->entry_count--; + break; + } + i++; + } + + return 1; +} #endif /* MDASSEMBLE */ /* allocate and load BBM log from metadata */ @@ -9797,6 +9819,36 @@ static int imsm_record_badblock(struct active_array *a, int slot, return ret; } +/******************************************************************************* +* Function: imsm_clear_badblock +* Description: This routine clears bad block record from BBM log +* +* Parameters: +* a : array containing a bad block +* slot : disk number containing a bad block +* sector : bad block sector +* length : bad block sectors range +* Returns: +* 1 : Success +* 0 : Error +******************************************************************************/ +static int imsm_clear_badblock(struct active_array *a, int slot, + unsigned long long sector, int length) +{ + struct intel_super *super = a->container->sb; + int ord; + int ret; + + ord = imsm_disk_slot_to_ord(a, slot); + if (ord < 0) + return 0; + + ret = clear_badblock(super->bbm_log, ord_to_idx(ord), sector, length); + if (ret) + super->updates_pending++; + + return ret; +} /******************************************************************************* * Function: init_migr_record_imsm * Description: Function inits imsm migration record @@ -11351,5 +11403,6 @@ struct superswitch super_imsm = { .process_update = imsm_process_update, .prepare_update = imsm_prepare_update, .record_bad_block = imsm_record_badblock, + .clear_bad_block = imsm_clear_badblock, #endif /* MDASSEMBLE */ };