summaryrefslogtreecommitdiff
path: root/super1.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-05-23 15:48:48 +1000
committerNeilBrown <neilb@suse.de>2013-05-28 16:44:23 +1000
commit199f1a1fadcd0fb5efba656ad92a44c51f8cc8ea (patch)
tree5f85a1db5fb927b5a33643c621ff64f60ffb4c3f /super1.c
parentafa368f49ac0a12185f243eeedfa8242f2c7a036 (diff)
Assemble: allow --update=revert-reshape
This will cause a reshape to start going backwards.
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/super1.c b/super1.c
index a4677b9b..d92e5945 100644
--- a/super1.c
+++ b/super1.c
@@ -1252,6 +1252,35 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
misc->device_size - __le64_to_cpu(sb->data_offset));
printf("Size is %llu\n", (unsigned long long)
__le64_to_cpu(sb->data_size));
+ } else if (strcmp(update, "revert-reshape") == 0) {
+ rv = -2;
+ if (!(sb->feature_map & __cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)))
+ pr_err("No active reshape to revert on %s\n",
+ devname);
+ else {
+ rv = 0;
+ __u32 temp;
+ sb->raid_disks = __cpu_to_le32(__le32_to_cpu(sb->raid_disks) +
+ __le32_to_cpu(sb->delta_disks));
+ if (sb->delta_disks == 0)
+ sb->feature_map ^= __cpu_to_le32(MD_FEATURE_RESHAPE_BACKWARDS);
+ else
+ sb->delta_disks = __cpu_to_le32(-__le32_to_cpu(sb->delta_disks));
+
+ temp = sb->new_layout;
+ sb->new_layout = sb->layout;
+ sb->layout = temp;
+
+ temp = sb->new_chunk;
+ sb->new_chunk = sb->chunksize;
+ sb->chunksize = temp;
+
+ if (sb->feature_map & __cpu_to_le32(MD_FEATURE_NEW_OFFSET)) {
+ sb->data_offset = __cpu_to_le64(__le64_to_cpu(sb->data_offset) +
+ (long)(int32_t)__le32_to_cpu(sb->new_offset));
+ sb->new_offset = __cpu_to_le32(-(int32_t)__le32_to_cpu(sb->new_offset));
+ }
+ }
} else if (strcmp(update, "_reshape_progress")==0)
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
else if (strcmp(update, "writemostly")==0)