diff options
Diffstat (limited to 'drivers/md/raid5-cache.c')
-rw-r--r-- | drivers/md/raid5-cache.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index f1c86d938502..39f31f07ffe9 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c | |||
@@ -2577,31 +2577,22 @@ static ssize_t r5c_journal_mode_show(struct mddev *mddev, char *page) | |||
2577 | int r5c_journal_mode_set(struct mddev *mddev, int mode) | 2577 | int r5c_journal_mode_set(struct mddev *mddev, int mode) |
2578 | { | 2578 | { |
2579 | struct r5conf *conf; | 2579 | struct r5conf *conf; |
2580 | int err; | ||
2581 | 2580 | ||
2582 | if (mode < R5C_JOURNAL_MODE_WRITE_THROUGH || | 2581 | if (mode < R5C_JOURNAL_MODE_WRITE_THROUGH || |
2583 | mode > R5C_JOURNAL_MODE_WRITE_BACK) | 2582 | mode > R5C_JOURNAL_MODE_WRITE_BACK) |
2584 | return -EINVAL; | 2583 | return -EINVAL; |
2585 | 2584 | ||
2586 | err = mddev_lock(mddev); | ||
2587 | if (err) | ||
2588 | return err; | ||
2589 | conf = mddev->private; | 2585 | conf = mddev->private; |
2590 | if (!conf || !conf->log) { | 2586 | if (!conf || !conf->log) |
2591 | mddev_unlock(mddev); | ||
2592 | return -ENODEV; | 2587 | return -ENODEV; |
2593 | } | ||
2594 | 2588 | ||
2595 | if (raid5_calc_degraded(conf) > 0 && | 2589 | if (raid5_calc_degraded(conf) > 0 && |
2596 | mode == R5C_JOURNAL_MODE_WRITE_BACK) { | 2590 | mode == R5C_JOURNAL_MODE_WRITE_BACK) |
2597 | mddev_unlock(mddev); | ||
2598 | return -EINVAL; | 2591 | return -EINVAL; |
2599 | } | ||
2600 | 2592 | ||
2601 | mddev_suspend(mddev); | 2593 | mddev_suspend(mddev); |
2602 | conf->log->r5c_journal_mode = mode; | 2594 | conf->log->r5c_journal_mode = mode; |
2603 | mddev_resume(mddev); | 2595 | mddev_resume(mddev); |
2604 | mddev_unlock(mddev); | ||
2605 | 2596 | ||
2606 | pr_debug("md/raid:%s: setting r5c cache mode to %d: %s\n", | 2597 | pr_debug("md/raid:%s: setting r5c cache mode to %d: %s\n", |
2607 | mdname(mddev), mode, r5c_journal_mode_str[mode]); | 2598 | mdname(mddev), mode, r5c_journal_mode_str[mode]); |
@@ -2614,6 +2605,7 @@ static ssize_t r5c_journal_mode_store(struct mddev *mddev, | |||
2614 | { | 2605 | { |
2615 | int mode = ARRAY_SIZE(r5c_journal_mode_str); | 2606 | int mode = ARRAY_SIZE(r5c_journal_mode_str); |
2616 | size_t len = length; | 2607 | size_t len = length; |
2608 | int ret; | ||
2617 | 2609 | ||
2618 | if (len < 2) | 2610 | if (len < 2) |
2619 | return -EINVAL; | 2611 | return -EINVAL; |
@@ -2625,8 +2617,12 @@ static ssize_t r5c_journal_mode_store(struct mddev *mddev, | |||
2625 | if (strlen(r5c_journal_mode_str[mode]) == len && | 2617 | if (strlen(r5c_journal_mode_str[mode]) == len && |
2626 | !strncmp(page, r5c_journal_mode_str[mode], len)) | 2618 | !strncmp(page, r5c_journal_mode_str[mode], len)) |
2627 | break; | 2619 | break; |
2628 | 2620 | ret = mddev_lock(mddev); | |
2629 | return r5c_journal_mode_set(mddev, mode) ?: length; | 2621 | if (ret) |
2622 | return ret; | ||
2623 | ret = r5c_journal_mode_set(mddev, mode); | ||
2624 | mddev_unlock(mddev); | ||
2625 | return ret ?: length; | ||
2630 | } | 2626 | } |
2631 | 2627 | ||
2632 | struct md_sysfs_entry | 2628 | struct md_sysfs_entry |