MD: add a new disk role to present write journal device
authorSong Liu <songliubraving@fb.com>
Thu, 13 Aug 2015 21:31:55 +0000 (14:31 -0700)
committerNeilBrown <neilb@suse.com>
Sat, 24 Oct 2015 06:16:18 +0000 (17:16 +1100)
Next patches will use a disk as raid5/6 journaling. We need a new disk
role to present the journal device and add MD_FEATURE_JOURNAL to
feature_map for backward compability.

Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/md.c
drivers/md/md.h
include/uapi/linux/raid/md_p.h

index cfe5c8704a26268c41597d9a86bd483f6d733d6a..391341a772c78fa8e697143cb6570a50af4faf49 100644 (file)
@@ -1638,6 +1638,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
                case MD_DISK_ROLE_FAULTY: /* faulty */
                        set_bit(Faulty, &rdev->flags);
                        break;
+               case MD_DISK_ROLE_JOURNAL: /* journal device */
+                       if (!(le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL)) {
+                               /* journal device without journal feature */
+                               printk(KERN_WARNING
+                                 "md: journal device provided without journal feature, ignoring the device\n");
+                               return -EINVAL;
+                       }
+                       set_bit(Journal, &rdev->flags);
+                       break;
                default:
                        rdev->saved_raid_disk = role;
                        if ((le32_to_cpu(sb->feature_map) &
@@ -1796,7 +1805,10 @@ retry:
                        sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_FAULTY);
                else if (test_bit(In_sync, &rdev2->flags))
                        sb->dev_roles[i] = cpu_to_le16(rdev2->raid_disk);
-               else if (rdev2->raid_disk >= 0)
+               else if (test_bit(Journal, &rdev2->flags)) {
+                       sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_JOURNAL);
+                       sb->feature_map |= cpu_to_le32(MD_FEATURE_JOURNAL);
+               } else if (rdev2->raid_disk >= 0)
                        sb->dev_roles[i] = cpu_to_le16(rdev2->raid_disk);
                else
                        sb->dev_roles[i] = cpu_to_le16(MD_DISK_ROLE_SPARE);
@@ -5840,7 +5852,8 @@ static int get_disk_info(struct mddev *mddev, void __user * arg)
                else if (test_bit(In_sync, &rdev->flags)) {
                        info.state |= (1<<MD_DISK_ACTIVE);
                        info.state |= (1<<MD_DISK_SYNC);
-               }
+               } else if (test_bit(Journal, &rdev->flags))
+                       info.state |= (1<<MD_DISK_JOURNAL);
                if (test_bit(WriteMostly, &rdev->flags))
                        info.state |= (1<<MD_DISK_WRITEMOSTLY);
        } else {
@@ -5955,6 +5968,8 @@ static int add_new_disk(struct mddev *mddev, mdu_disk_info_t *info)
                else
                        clear_bit(WriteMostly, &rdev->flags);
 
+               if (info->state & (1<<MD_DISK_JOURNAL))
+                       set_bit(Journal, &rdev->flags);
                /*
                 * check whether the device shows up in other nodes
                 */
@@ -7330,6 +7345,10 @@ static int md_seq_show(struct seq_file *seq, void *v)
                                seq_printf(seq, "(F)");
                                continue;
                        }
+                       if (test_bit(Journal, &rdev->flags)) {
+                               seq_printf(seq, "(J)");
+                               continue;
+                       }
                        if (rdev->raid_disk < 0)
                                seq_printf(seq, "(S)"); /* spare */
                        if (test_bit(Replacement, &rdev->flags))
index 2ea00356bb2331da7afeb23535df981f3bafdc47..88dc6312f5d5307a2f3057da3ecfe6fb5eb8056b 100644 (file)
@@ -172,6 +172,11 @@ enum flag_bits {
                                 * This device is seen locally but not
                                 * by the whole cluster
                                 */
+       Journal,                /* This device is used as journal for
+                                * raid-5/6.
+                                * Usually, this device should be faster
+                                * than other devices in the array
+                                */
 };
 
 #define BB_LEN_MASK    (0x00000000000001FFULL)
index d1fc8a637368ac704bccbdc094ad0c825293a1cf..eaaab52077a38065e79c1cb3c47755386019805f 100644 (file)
                                   * read requests will only be sent here in
                                   * dire need
                                   */
+#define MD_DISK_JOURNAL                18 /* disk is used as the write journal in RAID-5/6 */
 
 #define MD_DISK_ROLE_SPARE     0xffff
 #define MD_DISK_ROLE_FAULTY    0xfffe
+#define MD_DISK_ROLE_JOURNAL   0xfffd
 #define MD_DISK_ROLE_MAX       0xff00 /* max value of regular disk role */
 
 typedef struct mdp_device_descriptor_s {
@@ -307,6 +309,7 @@ struct mdp_superblock_1 {
                                             * is guided by bitmap.
                                             */
 #define MD_FEATURE_CLUSTERED           256 /* clustered MD */
+#define        MD_FEATURE_JOURNAL              512 /* support write cache */
 #define        MD_FEATURE_ALL                  (MD_FEATURE_BITMAP_OFFSET       \
                                        |MD_FEATURE_RECOVERY_OFFSET     \
                                        |MD_FEATURE_RESHAPE_ACTIVE      \