From d43494fc3c074fc589d928aaf227806437ef530b Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 21 Feb 2011 11:41:01 +1100 Subject: [PATCH] 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 --- super0.c | 14 ++++++++++++++ super1.c | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/super0.c b/super0.c index ae3e885..b141b74 100644 --- a/super0.c +++ b/super0.c @@ -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])); diff --git a/super1.c b/super1.c index 0eb0323..e8f59c6 100644 --- a/super1.c +++ b/super1.c @@ -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;