* [PATCH v3] md/raid5: use consistency_policy to remove journal feature
@ 2017-03-27 17:51 Song Liu
2017-03-27 19:02 ` Shaohua Li
0 siblings, 1 reply; 2+ messages in thread
From: Song Liu @ 2017-03-27 17:51 UTC (permalink / raw)
To: linux-raid
Cc: shli, neilb, kernel-team, dan.j.williams, hch, jes.sorensen,
Song Liu
When journal device of an array fails, the array is forced into read-only
mode. To make the array normal without adding another journal device, we
need to remove journal _feature_ from the array.
This patch allows remove journal _feature_ from an array, For journal
existing journal should be either missing or faulty.
To remove journal feature, it is necessary to remove the journal device
first:
mdadm --fail /dev/md0 /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
mdadm --remove /dev/md0 /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md0
Then the journal feature can be removed by echoing into the sysfs file:
cat /sys/block/md0/md/consistency_policy
journal
echo resync > /sys/block/md0/md/consistency_policy
cat /sys/block/md0/md/consistency_policy
resync
Signed-off-by: Song Liu <songliubraving@fb.com>
---
drivers/md/raid5.c | 46 ++++++++++++++++++++++++++++++++++++----------
1 file changed, 36 insertions(+), 10 deletions(-)
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 266d661..6036d5e 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -8292,17 +8292,41 @@ static int raid5_change_consistency_policy(struct mddev *mddev, const char *buf)
}
if (strncmp(buf, "ppl", 3) == 0 && !raid5_has_ppl(conf)) {
- mddev_suspend(mddev);
- set_bit(MD_HAS_PPL, &mddev->flags);
- err = log_init(conf, NULL);
- if (!err)
+ /* ppl only works with RAID 5 */
+ if (conf->level == 5) {
+ mddev_suspend(mddev);
+ set_bit(MD_HAS_PPL, &mddev->flags);
+ err = log_init(conf, NULL);
+ if (!err)
+ raid5_reset_stripe_cache(mddev);
+ mddev_resume(mddev);
+ } else
+ err = -EINVAL;
+ } else if (strncmp(buf, "resync", 6) == 0) {
+ if (raid5_has_ppl(conf)) {
+ mddev_suspend(mddev);
+ log_exit(conf);
raid5_reset_stripe_cache(mddev);
- mddev_resume(mddev);
- } else if (strncmp(buf, "resync", 6) == 0 && raid5_has_ppl(conf)) {
- mddev_suspend(mddev);
- log_exit(conf);
- raid5_reset_stripe_cache(mddev);
- mddev_resume(mddev);
+ mddev_resume(mddev);
+ } else if (test_bit(MD_HAS_JOURNAL, &conf->mddev->flags) &&
+ r5l_log_disk_error(conf)) {
+ bool journal_dev_exists = false;
+ struct md_rdev *rdev;
+
+ rdev_for_each(rdev, mddev)
+ if (test_bit(Journal, &rdev->flags)) {
+ journal_dev_exists = true;
+ break;
+ }
+
+ if (!journal_dev_exists) {
+ mddev_suspend(mddev);
+ clear_bit(MD_HAS_JOURNAL, &mddev->flags);
+ mddev_resume(mddev);
+ } else /* need remove journal device first */
+ err = -EBUSY;
+ } else
+ err = -EINVAL;
} else {
err = -EINVAL;
}
@@ -8337,6 +8361,7 @@ static struct md_personality raid6_personality =
.quiesce = raid5_quiesce,
.takeover = raid6_takeover,
.congested = raid5_congested,
+ .change_consistency_policy = raid5_change_consistency_policy,
};
static struct md_personality raid5_personality =
{
@@ -8385,6 +8410,7 @@ static struct md_personality raid4_personality =
.quiesce = raid5_quiesce,
.takeover = raid4_takeover,
.congested = raid5_congested,
+ .change_consistency_policy = raid5_change_consistency_policy,
};
static int __init raid5_init(void)
--
2.9.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v3] md/raid5: use consistency_policy to remove journal feature
2017-03-27 17:51 [PATCH v3] md/raid5: use consistency_policy to remove journal feature Song Liu
@ 2017-03-27 19:02 ` Shaohua Li
0 siblings, 0 replies; 2+ messages in thread
From: Shaohua Li @ 2017-03-27 19:02 UTC (permalink / raw)
To: Song Liu
Cc: linux-raid, shli, neilb, kernel-team, dan.j.williams, hch,
jes.sorensen
On Mon, Mar 27, 2017 at 10:51:33AM -0700, Song Liu wrote:
> When journal device of an array fails, the array is forced into read-only
> mode. To make the array normal without adding another journal device, we
> need to remove journal _feature_ from the array.
>
> This patch allows remove journal _feature_ from an array, For journal
> existing journal should be either missing or faulty.
>
> To remove journal feature, it is necessary to remove the journal device
> first:
>
> mdadm --fail /dev/md0 /dev/sdb
> mdadm: set /dev/sdb faulty in /dev/md0
> mdadm --remove /dev/md0 /dev/sdb
> mdadm: hot removed /dev/sdb from /dev/md0
>
> Then the journal feature can be removed by echoing into the sysfs file:
>
> cat /sys/block/md0/md/consistency_policy
> journal
>
> echo resync > /sys/block/md0/md/consistency_policy
> cat /sys/block/md0/md/consistency_policy
> resync
Looks good, applied, thanks!
> Signed-off-by: Song Liu <songliubraving@fb.com>
> ---
> drivers/md/raid5.c | 46 ++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
> index 266d661..6036d5e 100644
> --- a/drivers/md/raid5.c
> +++ b/drivers/md/raid5.c
> @@ -8292,17 +8292,41 @@ static int raid5_change_consistency_policy(struct mddev *mddev, const char *buf)
> }
>
> if (strncmp(buf, "ppl", 3) == 0 && !raid5_has_ppl(conf)) {
> - mddev_suspend(mddev);
> - set_bit(MD_HAS_PPL, &mddev->flags);
> - err = log_init(conf, NULL);
> - if (!err)
> + /* ppl only works with RAID 5 */
> + if (conf->level == 5) {
> + mddev_suspend(mddev);
> + set_bit(MD_HAS_PPL, &mddev->flags);
> + err = log_init(conf, NULL);
> + if (!err)
> + raid5_reset_stripe_cache(mddev);
> + mddev_resume(mddev);
> + } else
> + err = -EINVAL;
> + } else if (strncmp(buf, "resync", 6) == 0) {
> + if (raid5_has_ppl(conf)) {
> + mddev_suspend(mddev);
> + log_exit(conf);
> raid5_reset_stripe_cache(mddev);
> - mddev_resume(mddev);
> - } else if (strncmp(buf, "resync", 6) == 0 && raid5_has_ppl(conf)) {
> - mddev_suspend(mddev);
> - log_exit(conf);
> - raid5_reset_stripe_cache(mddev);
> - mddev_resume(mddev);
> + mddev_resume(mddev);
> + } else if (test_bit(MD_HAS_JOURNAL, &conf->mddev->flags) &&
> + r5l_log_disk_error(conf)) {
> + bool journal_dev_exists = false;
> + struct md_rdev *rdev;
> +
> + rdev_for_each(rdev, mddev)
> + if (test_bit(Journal, &rdev->flags)) {
> + journal_dev_exists = true;
> + break;
> + }
> +
> + if (!journal_dev_exists) {
> + mddev_suspend(mddev);
> + clear_bit(MD_HAS_JOURNAL, &mddev->flags);
> + mddev_resume(mddev);
> + } else /* need remove journal device first */
> + err = -EBUSY;
> + } else
> + err = -EINVAL;
> } else {
> err = -EINVAL;
> }
> @@ -8337,6 +8361,7 @@ static struct md_personality raid6_personality =
> .quiesce = raid5_quiesce,
> .takeover = raid6_takeover,
> .congested = raid5_congested,
> + .change_consistency_policy = raid5_change_consistency_policy,
> };
> static struct md_personality raid5_personality =
> {
> @@ -8385,6 +8410,7 @@ static struct md_personality raid4_personality =
> .quiesce = raid5_quiesce,
> .takeover = raid4_takeover,
> .congested = raid5_congested,
> + .change_consistency_policy = raid5_change_consistency_policy,
> };
>
> static int __init raid5_init(void)
> --
> 2.9.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-raid" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-03-27 19:02 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-27 17:51 [PATCH v3] md/raid5: use consistency_policy to remove journal feature Song Liu
2017-03-27 19:02 ` Shaohua Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).