diff options
-rw-r--r-- | drivers/md/md.c | 4 | ||||
-rw-r--r-- | drivers/md/raid1.c | 4 | ||||
-rw-r--r-- | drivers/md/raid10.c | 4 | ||||
-rw-r--r-- | drivers/md/raid5-cache.c | 22 | ||||
-rw-r--r-- | drivers/md/raid5.c | 2 |
5 files changed, 21 insertions, 15 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 41c050b59ec4..4e4dee0ec2de 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -7605,7 +7605,9 @@ static int status_resync(struct seq_file *seq, struct mddev *mddev) | |||
7605 | if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) | 7605 | if (test_bit(MD_RECOVERY_DONE, &mddev->recovery)) |
7606 | /* Still cleaning up */ | 7606 | /* Still cleaning up */ |
7607 | resync = max_sectors; | 7607 | resync = max_sectors; |
7608 | } else | 7608 | } else if (resync > max_sectors) |
7609 | resync = max_sectors; | ||
7610 | else | ||
7609 | resync -= atomic_read(&mddev->recovery_active); | 7611 | resync -= atomic_read(&mddev->recovery_active); |
7610 | 7612 | ||
7611 | if (resync == 0) { | 7613 | if (resync == 0) { |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index cc9d337a1ed3..6df398e3a008 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -809,11 +809,15 @@ static void flush_pending_writes(struct r1conf *conf) | |||
809 | spin_lock_irq(&conf->device_lock); | 809 | spin_lock_irq(&conf->device_lock); |
810 | 810 | ||
811 | if (conf->pending_bio_list.head) { | 811 | if (conf->pending_bio_list.head) { |
812 | struct blk_plug plug; | ||
812 | struct bio *bio; | 813 | struct bio *bio; |
814 | |||
813 | bio = bio_list_get(&conf->pending_bio_list); | 815 | bio = bio_list_get(&conf->pending_bio_list); |
814 | conf->pending_count = 0; | 816 | conf->pending_count = 0; |
815 | spin_unlock_irq(&conf->device_lock); | 817 | spin_unlock_irq(&conf->device_lock); |
818 | blk_start_plug(&plug); | ||
816 | flush_bio_list(conf, bio); | 819 | flush_bio_list(conf, bio); |
820 | blk_finish_plug(&plug); | ||
817 | } else | 821 | } else |
818 | spin_unlock_irq(&conf->device_lock); | 822 | spin_unlock_irq(&conf->device_lock); |
819 | } | 823 | } |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index b9edbc747a95..c131835cf008 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -894,10 +894,13 @@ static void flush_pending_writes(struct r10conf *conf) | |||
894 | spin_lock_irq(&conf->device_lock); | 894 | spin_lock_irq(&conf->device_lock); |
895 | 895 | ||
896 | if (conf->pending_bio_list.head) { | 896 | if (conf->pending_bio_list.head) { |
897 | struct blk_plug plug; | ||
897 | struct bio *bio; | 898 | struct bio *bio; |
899 | |||
898 | bio = bio_list_get(&conf->pending_bio_list); | 900 | bio = bio_list_get(&conf->pending_bio_list); |
899 | conf->pending_count = 0; | 901 | conf->pending_count = 0; |
900 | spin_unlock_irq(&conf->device_lock); | 902 | spin_unlock_irq(&conf->device_lock); |
903 | blk_start_plug(&plug); | ||
901 | /* flush any pending bitmap writes to disk | 904 | /* flush any pending bitmap writes to disk |
902 | * before proceeding w/ I/O */ | 905 | * before proceeding w/ I/O */ |
903 | bitmap_unplug(conf->mddev->bitmap); | 906 | bitmap_unplug(conf->mddev->bitmap); |
@@ -918,6 +921,7 @@ static void flush_pending_writes(struct r10conf *conf) | |||
918 | generic_make_request(bio); | 921 | generic_make_request(bio); |
919 | bio = next; | 922 | bio = next; |
920 | } | 923 | } |
924 | blk_finish_plug(&plug); | ||
921 | } else | 925 | } else |
922 | spin_unlock_irq(&conf->device_lock); | 926 | spin_unlock_irq(&conf->device_lock); |
923 | } | 927 | } |
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 |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 31dc25e2871a..98ce4272ace9 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2677,13 +2677,13 @@ static void raid5_error(struct mddev *mddev, struct md_rdev *rdev) | |||
2677 | pr_debug("raid456: error called\n"); | 2677 | pr_debug("raid456: error called\n"); |
2678 | 2678 | ||
2679 | spin_lock_irqsave(&conf->device_lock, flags); | 2679 | spin_lock_irqsave(&conf->device_lock, flags); |
2680 | set_bit(Faulty, &rdev->flags); | ||
2680 | clear_bit(In_sync, &rdev->flags); | 2681 | clear_bit(In_sync, &rdev->flags); |
2681 | mddev->degraded = raid5_calc_degraded(conf); | 2682 | mddev->degraded = raid5_calc_degraded(conf); |
2682 | spin_unlock_irqrestore(&conf->device_lock, flags); | 2683 | spin_unlock_irqrestore(&conf->device_lock, flags); |
2683 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); | 2684 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
2684 | 2685 | ||
2685 | set_bit(Blocked, &rdev->flags); | 2686 | set_bit(Blocked, &rdev->flags); |
2686 | set_bit(Faulty, &rdev->flags); | ||
2687 | set_mask_bits(&mddev->sb_flags, 0, | 2687 | set_mask_bits(&mddev->sb_flags, 0, |
2688 | BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING)); | 2688 | BIT(MD_SB_CHANGE_DEVS) | BIT(MD_SB_CHANGE_PENDING)); |
2689 | pr_crit("md/raid:%s: Disk failure on %s, disabling device.\n" | 2689 | pr_crit("md/raid:%s: Disk failure on %s, disabling device.\n" |