Teach --assemble --force to handle reshapes a little better.

When we force-assemble an array which is in the middle of a reshape,
we should repeat the reshape of any parts that aren't recorded in
the oldest superblock.

This is unlikely to make a significant difference, but could make
a small difference, and is safer.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2011-02-21 11:41:01 +11:00
parent 47573b0015
commit d43494fc3c
2 changed files with 28 additions and 0 deletions

View File

@ -491,6 +491,20 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->disks[d].state = info->disk.state | wonly;
rv = 1;
}
if (info->reshape_active &&
sb->minor_version > 90 && (sb->reshape_position+1) != 0 &&
info->delta_disks >= 0 &&
info->reshape_progress < sb->reshape_position) {
sb->reshape_position = info->reshape_progress;
rv = 1;
}
if (info->reshape_active &&
sb->minor_version > 90 && (sb->reshape_position+1) != 0 &&
info->delta_disks < 0 &&
info->reshape_progress > sb->reshape_position) {
sb->reshape_position = info->reshape_progress;
rv = 1;
}
}
if (strcmp(update, "linear-grow-new") == 0) {
memset(&sb->disks[info->disk.number], 0, sizeof(sb->disks[0]));

View File

@ -680,6 +680,20 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
sb->dev_roles[d] = __cpu_to_le16(want);
rv = 1;
}
if (info->reshape_active &&
sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
info->delta_disks >= 0 &&
info->reshape_progress < __le64_to_cpu(sb->reshape_position)) {
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
rv = 1;
}
if (info->reshape_active &&
sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
info->delta_disks < 0 &&
info->reshape_progress > __le64_to_cpu(sb->reshape_position)) {
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
rv = 1;
}
}
if (strcmp(update, "linear-grow-new") == 0) {
unsigned int i;