Assemble: add --update=no-bitmap

This allows an array with a corrupt internal bitmap to be assembled
without the bitmap.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2010-11-30 16:46:01 +11:00
parent 321e575910
commit 1f9476aaf8
4 changed files with 22 additions and 6 deletions

View 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

View File

@ -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):

View File

@ -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;

View File

@ -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) {