From a06d022db41ed624125e343f9a5de278c5d32ae3 Mon Sep 17 00:00:00 2001 From: Krzysztof Wojcik Date: Thu, 16 Dec 2010 14:34:54 +0100 Subject: [PATCH] FIX: Bad block verification during assembling array We need to refuse to assemble an arrays with bad blocks. Initially there was condition in container_content function that returns error value in the case when metadata store information about bad blocks. When the container_content function is called from functions NOT connected with assemble (Kill_subarray, Detail) we get faulty error return value. Patch introduces new flag in array.status - MD_SB_BBM_ERRORS. It is set in container_content when bad blocks are detected and can be checked by container_content caller. Signed-off-by: Krzysztof Wojcik Signed-off-by: NeilBrown --- Assemble.c | 7 +++++++ Incremental.c | 6 ++++++ md_p.h | 1 + super-intel.c | 14 ++++++++------ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Assemble.c b/Assemble.c index ac489e87..5405972e 100644 --- a/Assemble.c +++ b/Assemble.c @@ -435,6 +435,13 @@ int Assemble(struct supertype *st, char *mddev, content; content = content->next) { + /* do not assemble arrays that might have bad blocks */ + if (content->array.state & (1<used = 2; + goto loop; + } if (!ident_matches(ident, content, tst, homehost, update, report_missmatch ? devname : NULL)) diff --git a/Incremental.c b/Incremental.c index a4ac1b58..944ed661 100644 --- a/Incremental.c +++ b/Incremental.c @@ -1411,6 +1411,12 @@ static int Incremental_container(struct supertype *st, char *devname, if (map_lock(&map)) fprintf(stderr, Name ": failed to get exclusive lock on " "mapfile\n"); + /* do not assemble arrays that might have bad blocks */ + if (list->array.state & (1<next) { int mdfd; diff --git a/md_p.h b/md_p.h index 4594a36a..6c79a3d1 100644 --- a/md_p.h +++ b/md_p.h @@ -100,6 +100,7 @@ typedef struct mdp_device_descriptor_s { */ #define MD_SB_CLEAN 0 #define MD_SB_ERRORS 1 +#define MD_SB_BBM_ERRORS 2 #define MD_SB_BITMAP_PRESENT 8 /* bitmap may be present nearby */ diff --git a/super-intel.c b/super-intel.c index 3fc1c823..adb85b23 100644 --- a/super-intel.c +++ b/super-intel.c @@ -4520,13 +4520,11 @@ static struct mdinfo *container_content_imsm(struct supertype *st, char *subarra struct imsm_super *mpb = super->anchor; struct mdinfo *rest = NULL; unsigned int i; + int bbm_errors = 0; - /* do not assemble arrays that might have bad blocks */ - if (imsm_bbm_log_size(super->anchor)) { - fprintf(stderr, Name ": BBM log found in metadata. " - "Cannot activate array(s).\n"); - return NULL; - } + /* check for bad blocks */ + if (imsm_bbm_log_size(super->anchor)) + bbm_errors = 1; for (i = 0; i < mpb->num_raid_devs; i++) { struct imsm_dev *dev; @@ -4635,6 +4633,10 @@ static struct mdinfo *container_content_imsm(struct supertype *st, char *subarra rest = this; } + /* if array has bad blocks, set suitable bit in array status */ + if (bbm_errors) + rest->array.state |= (1<