From 1f9476aaf86cb465566b5a1cd5a2fb493531c2eb Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 30 Nov 2010 16:46:01 +1100 Subject: [PATCH] Assemble: add --update=no-bitmap This allows an array with a corrupt internal bitmap to be assembled without the bitmap. Signed-off-by: NeilBrown --- mdadm.8.in | 9 ++++++++- mdadm.c | 5 ++++- super0.c | 7 +++++-- super1.c | 7 +++++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/mdadm.8.in b/mdadm.8.in index a5d37b7..08e4255 100644 --- a/mdadm.8.in +++ b/mdadm.8.in @@ -921,6 +921,7 @@ argument given to this flag can be one of .BR resync , .BR byteorder , .BR devicesize , +.BR no\-bitmap , or .BR super\-minor . @@ -1003,7 +1004,7 @@ counts of total, working, active, failed, and spare devices. The .B devicesize -will rarely be of use. It applies to version 1.1 and 1.2 metadata +option will rarely be of use. It applies to version 1.1 and 1.2 metadata only (where the metadata is at the start of the device) and is only useful when the component device has changed size (typically become larger). The version 1 metadata records the amount of the device that @@ -1017,6 +1018,12 @@ This will cause to determine the maximum usable amount of space on each device and update the relevant field in the metadata. +The +.B no\-bitmap +option can be used when an array has an internal bitmap which is +corrupt in some way so that assembling the array normally fails. It +will cause any internal bitmap to be ignored. + .ig .TP .B \-\-auto\-update\-homehost diff --git a/mdadm.c b/mdadm.c index 78a4d3d..efba8dd 100644 --- a/mdadm.c +++ b/mdadm.c @@ -660,6 +660,8 @@ int main(int argc, char *argv[]) continue; if (strcmp(update, "devicesize")==0) continue; + if (strcmp(update, "no-bitmap")==0) + continue; if (strcmp(update, "byteorder")==0) { if (ss) { fprintf(stderr, Name ": must not set metadata type with --update=byteorder.\n"); @@ -686,7 +688,8 @@ int main(int argc, char *argv[]) } fprintf(outf, "Valid --update options are:\n" " 'sparc2.2', 'super-minor', 'uuid', 'name', 'resync',\n" - " 'summaries', 'homehost', 'byteorder', 'devicesize'.\n"); + " 'summaries', 'homehost', 'byteorder', 'devicesize',\n" + " 'no-bitmap'\n"); exit(outf == stdout ? 0 : 2); case O(INCREMENTAL,NoDegraded): diff --git a/super0.c b/super0.c index b141b74..e855541 100644 --- a/super0.c +++ b/super0.c @@ -402,8 +402,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info, char *devname, int verbose, int uuid_set, char *homehost) { - /* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made. - * For others, the return value is ignored. + /* NOTE: for 'assemble' and 'force' we need to return non-zero + * if any change was made. For others, the return value is + * ignored. */ int rv = 0; mdp_super_t *sb = st->sb; @@ -556,6 +557,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, bm = (struct bitmap_super_s*)(sb+1); uuid_from_super0(st, (int*)bm->uuid); } + } else if (strcmp(update, "no-bitmap") == 0) { + sb->state &= ~(1<reshape_position = info->reshape_progress; diff --git a/super1.c b/super1.c index e8f59c6..457e2d6 100644 --- a/super1.c +++ b/super1.c @@ -643,8 +643,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info, char *devname, int verbose, int uuid_set, char *homehost) { - /* NOTE: for 'assemble' and 'force' we need to return non-zero if any change was made. - * For others, the return value is ignored. + /* NOTE: for 'assemble' and 'force' we need to return non-zero + * if any change was made. For others, the return value is + * ignored. */ int rv = 0; struct mdp_superblock_1 *sb = st->sb; @@ -755,6 +756,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info, bm = (struct bitmap_super_s*)(st->sb+1024); memcpy(bm->uuid, sb->set_uuid, 16); } + } else if (strcmp(update, "no-bitmap") == 0) { + sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); } if (strcmp(update, "homehost") == 0 && homehost) {