]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Assemble: add --update=no-bitmap
authorNeilBrown <neilb@suse.de>
Tue, 30 Nov 2010 05:46:01 +0000 (16:46 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 10 Mar 2011 06:21:43 +0000 (17:21 +1100)
This allows an array with a corrupt internal bitmap to be assembled
without the bitmap.

Signed-off-by: NeilBrown <neilb@suse.de>
mdadm.8.in
mdadm.c
super0.c
super1.c

index a5d37b7e2d0420d9df332d932c3d1fef68afa2c2..08e425584725997b337455f43b5a14309c24b46f 100644 (file)
@@ -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 78a4d3d6d5c52ebfce7708fedb8c573083a9b3e3..efba8dd84cd512a74aad7b70f26324935a2cd5b7 100644 (file)
--- 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):
index b141b7461b1f37bc4d56c3e36a067c9b3672aaa3..e855541369e797db7a420c2000bdf27c65a71229 100644 (file)
--- 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<<MD_SB_BITMAP_PRESENT);
        }
        if (strcmp(update, "_reshape_progress")==0)
                sb->reshape_position = info->reshape_progress;
index e8f59c6a1132afaf4dfa90a9975d2f4cf2cba619..457e2d6e0f034b45deca157486ca40f7c878160b 100644 (file)
--- 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) {