md: Increment version for clustered bitmaps
authorGoldwyn Rodrigues <rgoldwyn@suse.com>
Tue, 18 Aug 2015 21:35:54 +0000 (07:35 +1000)
committerGoldwyn Rodrigues <rgoldwyn@suse.com>
Mon, 12 Oct 2015 06:31:33 +0000 (01:31 -0500)
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.

Added MD_FEATURE_CLUSTERED in order to return error for older
kernels which would assemble MD even if the bitmap is corrupted.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/bitmap.c
drivers/md/bitmap.h
drivers/md/md.c
include/uapi/linux/raid/md_p.h

index 48b5890c28e35ad70484d67b29e12a70cb9a4b1b..e9d3ee703e6df8bdabd5d4e5c78dc07d3fbc478e 100644 (file)
@@ -613,12 +613,10 @@ re_read:
        daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
        write_behind = le32_to_cpu(sb->write_behind);
        sectors_reserved = le32_to_cpu(sb->sectors_reserved);
-       /* XXX: This is a hack to ensure that we don't use clustering
-        *  in case:
-        *      - dm-raid is in use and
-        *      - the nodes written in bitmap_sb is erroneous.
+       /* Setup nodes/clustername only if bitmap version is
+        * cluster-compatible
         */
-       if (!bitmap->mddev->sync_super) {
+       if (sb->version == cpu_to_le32(BITMAP_MAJOR_CLUSTERED)) {
                nodes = le32_to_cpu(sb->nodes);
                strlcpy(bitmap->mddev->bitmap_info.cluster_name,
                                sb->cluster_name, 64);
@@ -628,7 +626,7 @@ re_read:
        if (sb->magic != cpu_to_le32(BITMAP_MAGIC))
                reason = "bad magic";
        else if (le32_to_cpu(sb->version) < BITMAP_MAJOR_LO ||
-                le32_to_cpu(sb->version) > BITMAP_MAJOR_HI)
+                le32_to_cpu(sb->version) > BITMAP_MAJOR_CLUSTERED)
                reason = "unrecognized superblock version";
        else if (chunksize < 512)
                reason = "bitmap chunksize too small";
index f1f4dd01090d3782dc22743201c7b2f264ae256f..8731fa06855f693d4e7488b2ff44e3087281ab95 100644 (file)
@@ -9,8 +9,10 @@
 #define BITMAP_MAJOR_LO 3
 /* version 4 insists the bitmap is in little-endian order
  * with version 3, it is host-endian which is non-portable
+ * Version 5 is currently set only for clustered devices
  */
 #define BITMAP_MAJOR_HI 4
+#define BITMAP_MAJOR_CLUSTERED 5
 #define        BITMAP_MAJOR_HOSTENDIAN 3
 
 /*
index c702de18207ae76ab56f1235ed5c98a9095ed050..1e1bdd86f40c7a7d1c011b0d74e1662656bef14f 100644 (file)
@@ -1735,6 +1735,9 @@ static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev)
                }
        }
 
+       if (mddev_is_clustered(mddev))
+               sb->feature_map |= cpu_to_le32(MD_FEATURE_CLUSTERED);
+
        if (rdev->badblocks.count == 0)
                /* Nothing to do for bad blocks*/ ;
        else if (sb->bblog_offset == 0)
index 2ae6131e69a5ba766f8d3b8b4fecf8d770bf27ac..867ee874fa80f9b25eb13ed112e9ccc80657b5c2 100644 (file)
@@ -302,6 +302,7 @@ struct mdp_superblock_1 {
 #define        MD_FEATURE_RECOVERY_BITMAP      128 /* recovery that is happening
                                             * is guided by bitmap.
                                             */
+#define MD_FEATURE_CLUSTERED           256 /* clustered MD */
 #define        MD_FEATURE_ALL                  (MD_FEATURE_BITMAP_OFFSET       \
                                        |MD_FEATURE_RECOVERY_OFFSET     \
                                        |MD_FEATURE_RESHAPE_ACTIVE      \
@@ -310,6 +311,7 @@ struct mdp_superblock_1 {
                                        |MD_FEATURE_RESHAPE_BACKWARDS   \
                                        |MD_FEATURE_NEW_OFFSET          \
                                        |MD_FEATURE_RECOVERY_BITMAP     \
+                                       |MD_FEATURE_CLUSTERED           \
                                        )
 
 #endif