diff options
author | NeilBrown <neilb@suse.de> | 2013-05-23 15:48:48 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2013-05-28 16:44:23 +1000 |
commit | 199f1a1fadcd0fb5efba656ad92a44c51f8cc8ea (patch) | |
tree | 5f85a1db5fb927b5a33643c621ff64f60ffb4c3f /super1.c | |
parent | afa368f49ac0a12185f243eeedfa8242f2c7a036 (diff) |
Assemble: allow --update=revert-reshape
This will cause a reshape to start going backwards.
Diffstat (limited to 'super1.c')
-rw-r--r-- | super1.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -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) |