]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Increment version for clustered bitmaps
authorGoldwyn Rodrigues <rgoldwyn@suse.com>
Tue, 18 Aug 2015 21:38:27 +0000 (07:38 +1000)
committerNeilBrown <neilb@suse.com>
Mon, 28 Sep 2015 01:47:04 +0000 (11:47 +1000)
Add BITMAP_MAJOR_CLUSTERED as 5, in order to prevent older kernels
to assemble a clustered device.

In order to maximize compatibility, the major version is set to
BITMAP_MAJOR_CLUSTERED *only* if the bitmap is clustered.

Also, added MD_FEATURE_CLUSTERED in order to return error
for older kernels which would assemble MD in case bitmap is
corrupted.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Create.c
Grow.c
bitmap.c
bitmap.h
mdadm.c
super1.c

index b62d8d4c66bf66f52422294f4c342b067c6d8f9d..b200d9767bb616aeb44693ae322ef7dd77e76728 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -114,6 +114,8 @@ int Create(struct supertype *st, char *mddev,
        unsigned long long newsize;
 
        int major_num = BITMAP_MAJOR_HI;
+       if (s->bitmap_file && strcmp(s->bitmap_file, "clustered") == 0)
+               major_num = BITMAP_MAJOR_CLUSTERED;
 
        memset(&info, 0, sizeof(info));
        if (s->level == UnSet && st && st->ss->default_geometry)
diff --git a/Grow.c b/Grow.c
index a1f8e4c75e932009a4bbd72799636bf491df31c1..80d7b223e8ac0700ce9d43c7abc070ec5d36561c 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -297,6 +297,9 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
                        "  between different architectures.  Consider upgrading the Linux kernel.\n");
        }
 
+       if (s->bitmap_file && strcmp(s->bitmap_file, "clustered") == 0)
+               major = BITMAP_MAJOR_CLUSTERED;
+
        if (ioctl(fd, GET_BITMAP_FILE, &bmf) != 0) {
                if (errno == ENOMEM)
                        pr_err("Memory allocation failure.\n");
index 7beb80bbdb43238641cd20c2a9bb03e8f94e0bd2..803eda38a9c6ddfc9ce175a2b860cfb299433f27 100644 (file)
--- a/bitmap.c
+++ b/bitmap.c
@@ -287,7 +287,7 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st)
        }
        printf("         Version : %d\n", sb->version);
        if (sb->version < BITMAP_MAJOR_LO ||
-           sb->version > BITMAP_MAJOR_HI) {
+           sb->version > BITMAP_MAJOR_CLUSTERED) {
                pr_err("unknown bitmap version %d, either the bitmap file\n",
                       sb->version);
                pr_err("is corrupted or you need to upgrade your tools\n");
index adbf0b4b48bc097ee3df7e3eb6de02715e995e19..b8fb07147221fec975367a93dd7c7b8b05964eef 100644 (file)
--- a/bitmap.h
+++ b/bitmap.h
@@ -12,6 +12,7 @@
  */
 #define BITMAP_MAJOR_HI 4
 #define        BITMAP_MAJOR_HOSTENDIAN 3
+#define        BITMAP_MAJOR_CLUSTERED 5
 
 #define BITMAP_MINOR 39
 
diff --git a/mdadm.c b/mdadm.c
index 5d5a1b886750497e0bded1d4f139d8e994463645..cf3c360f779589ba7a24febbe56044aa6579c0ff 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -1409,8 +1409,9 @@ int main(int argc, char *argv[])
                }
 
                if (s.bitmap_file) {
-                       if (strcmp(s.bitmap_file, "internal")==0) {
-                               pr_err("'internal' bitmaps not supported with --build\n");
+                       if (strcmp(s.bitmap_file, "internal")==0 ||
+                           strcmp(s.bitmap_file, "clustered") == 0) {
+                               pr_err("'internal' and 'clustered' bitmaps not supported with --build\n");
                                rv |= 1;
                                break;
                        }
index 9b991e6c3e9ba9567d47dfb2d6108765c05d5fde..52952eb40e43749622ca845378d11deca4400c50 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -125,6 +125,7 @@ struct misc_dev_info {
                                            * backwards anyway.
                                            */
 #define        MD_FEATURE_NEW_OFFSET           64 /* new_offset must be honoured */
+#define        MD_FEATURE_BITMAP_VERSIONED     256 /* bitmap version number checked properly */
 #define        MD_FEATURE_ALL                  (MD_FEATURE_BITMAP_OFFSET       \
                                        |MD_FEATURE_RECOVERY_OFFSET     \
                                        |MD_FEATURE_RESHAPE_ACTIVE      \
@@ -132,6 +133,7 @@ struct misc_dev_info {
                                        |MD_FEATURE_REPLACEMENT         \
                                        |MD_FEATURE_RESHAPE_BACKWARDS   \
                                        |MD_FEATURE_NEW_OFFSET          \
+                                       |MD_FEATURE_BITMAP_VERSIONED    \
                                        )
 
 /* return how many bytes are needed for bitmap, for cluster-md each node
@@ -2163,6 +2165,9 @@ add_internal_bitmap1(struct supertype *st,
        bms->sync_size = __cpu_to_le64(size);
        bms->write_behind = __cpu_to_le32(write_behind);
        bms->nodes = __cpu_to_le32(st->nodes);
+       if (st->nodes)
+               sb->feature_map = __cpu_to_le32(__le32_to_cpu(sb->feature_map)
+                                               | MD_FEATURE_BITMAP_VERSIONED);
        if (st->cluster_name)
                strncpy((char *)bms->cluster_name,
                        st->cluster_name, strlen(st->cluster_name));