summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-05-21 09:42:26 +1000
committerNeilBrown <neilb@suse.de>2012-05-21 09:42:26 +1000
commit21f2f2235301ced5f3192f2b39e370762e82ab9d (patch)
tree44fc3008026baed94d9db72e32e5c2533748c228
parent79b1d38148b56480b32b8dc1032da552e44c169a (diff)
downloadmdadm-21f2f2235301ced5f3192f2b39e370762e82ab9d.tar.gz
super1: add new_offset field.
The 'new_offset' is used for reshaping to avoid the need for a backup file. For now we only report the value when it is set. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--super1.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/super1.c b/super1.c
index 004565c..3b4ec20 100644
--- a/super1.c
+++ b/super1.c
@@ -58,7 +58,10 @@ struct mdp_superblock_1 {
__u32 delta_disks; /* change in number of raid_disks */
__u32 new_layout; /* new layout */
__u32 new_chunk; /* new chunk size (bytes) */
- __u8 pad1[128-124]; /* set to 0 when written */
+ __u32 new_offset; /* signed number to add to data_offset in new
+ * layout. 0 == no-change. This can be
+ * different on each device in the array.
+ */
/* constant this-device information - 64 bytes */
__u64 data_offset; /* sector start of data, often 0 */
@@ -106,8 +109,24 @@ struct misc_dev_info {
* must be honoured
*/
#define MD_FEATURE_RESHAPE_ACTIVE 4
-
-#define MD_FEATURE_ALL (1|2|4)
+#define MD_FEATURE_BAD_BLOCKS 8 /* badblock list is not empty */
+#define MD_FEATURE_REPLACEMENT 16 /* This device is replacing an
+ * active device with same 'role'.
+ * 'recovery_offset' is also set.
+ */
+#define MD_FEATURE_RESHAPE_BACKWARDS 32 /* Reshape doesn't change number
+ * of devices, but is going
+ * backwards anyway.
+ */
+#define MD_FEATURE_NEW_OFFSET 64 /* new_offset must be honoured */
+#define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET \
+ |MD_FEATURE_RECOVERY_OFFSET \
+ |MD_FEATURE_RESHAPE_ACTIVE \
+ |MD_FEATURE_BAD_BLOCKS \
+ |MD_FEATURE_REPLACEMENT \
+ |MD_FEATURE_RESHAPE_BACKWARDS \
+ |MD_FEATURE_NEW_OFFSET \
+ )
#ifndef offsetof
#define offsetof(t,f) ((size_t)&(((t*)0)->f))
@@ -303,6 +322,11 @@ static void examine_super1(struct supertype *st, char *homehost)
if (sb->data_offset)
printf(" Data Offset : %llu sectors\n",
(unsigned long long)__le64_to_cpu(sb->data_offset));
+ if (sb->new_offset) {
+ unsigned long long offset = __le64_to_cpu(sb->data_offset);
+ offset += (signed)(int32_t)__le32_to_cpu(sb->new_offset);
+ printf(" New Offset : %llu sectors\n", offset);
+ }
printf(" Super Offset : %llu sectors\n",
(unsigned long long)__le64_to_cpu(sb->super_offset));
if (__le32_to_cpu(sb->feature_map) & MD_FEATURE_RECOVERY_OFFSET)