]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
md: add serialize_policy sysfs node for raid1
authorGuoqing Jiang <guoqing.jiang@cloud.ionos.com>
Mon, 23 Dec 2019 09:48:56 +0000 (10:48 +0100)
committerSong Liu <songliubraving@fb.com>
Mon, 13 Jan 2020 19:44:09 +0000 (11:44 -0800)
With the new sysfs node, we can use it to control if raid1 array
wants io serialization or not. So mddev_create_serial_pool and
mddev_destroy_serial_pool are called in serialize_policy_store
to enable or disable the serialization.

Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
drivers/md/md.c
drivers/md/md.h

index b9b041b7e196b993be3af1037851cbc097310786..796cf70e1c9fe01eb693eec7b9181805eaac7a97 100644 (file)
@@ -5304,6 +5304,57 @@ static struct md_sysfs_entry md_fail_last_dev =
 __ATTR(fail_last_dev, S_IRUGO | S_IWUSR, fail_last_dev_show,
        fail_last_dev_store);
 
+static ssize_t serialize_policy_show(struct mddev *mddev, char *page)
+{
+       if (mddev->pers == NULL || (mddev->pers->level != 1))
+               return sprintf(page, "n/a\n");
+       else
+               return sprintf(page, "%d\n", mddev->serialize_policy);
+}
+
+/*
+ * Setting serialize_policy to true to enforce write IO is not reordered
+ * for raid1.
+ */
+static ssize_t
+serialize_policy_store(struct mddev *mddev, const char *buf, size_t len)
+{
+       int err;
+       bool value;
+
+       err = kstrtobool(buf, &value);
+       if (err)
+               return err;
+
+       if (value == mddev->serialize_policy)
+               return len;
+
+       err = mddev_lock(mddev);
+       if (err)
+               return err;
+       if (mddev->pers == NULL || (mddev->pers->level != 1)) {
+               pr_err("md: serialize_policy is only effective for raid1\n");
+               err = -EINVAL;
+               goto unlock;
+       }
+
+       mddev_suspend(mddev);
+       if (value)
+               mddev_create_serial_pool(mddev, NULL, true);
+       else
+               mddev_destroy_serial_pool(mddev, NULL, true);
+       mddev->serialize_policy = value;
+       mddev_resume(mddev);
+unlock:
+       mddev_unlock(mddev);
+       return err ?: len;
+}
+
+static struct md_sysfs_entry md_serialize_policy =
+__ATTR(serialize_policy, S_IRUGO | S_IWUSR, serialize_policy_show,
+       serialize_policy_store);
+
+
 static struct attribute *md_default_attrs[] = {
        &md_level.attr,
        &md_layout.attr,
@@ -5321,6 +5372,7 @@ static struct attribute *md_default_attrs[] = {
        &max_corr_read_errors.attr,
        &md_consistency_policy.attr,
        &md_fail_last_dev.attr,
+       &md_serialize_policy.attr,
        NULL,
 };
 
index de04a8d3a67a55d4b450dd2130587e7f374dc802..f51a3afaee1b93ad8ec9721528a24ba319e6decc 100644 (file)
@@ -494,6 +494,7 @@ struct mddev {
 
        bool    has_superblocks:1;
        bool    fail_last_dev:1;
+       bool    serialize_policy:1;
 };
 
 enum recovery_flags {