aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r--drivers/md/raid5.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 355dafb98aac..bb16ac231a40 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -1805,6 +1805,15 @@ static int make_request(request_queue_t *q, struct bio * bi)
1805 goto retry; 1805 goto retry;
1806 } 1806 }
1807 } 1807 }
1808 /* FIXME what if we get a false positive because these
1809 * are being updated.
1810 */
1811 if (logical_sector >= mddev->suspend_lo &&
1812 logical_sector < mddev->suspend_hi) {
1813 release_stripe(sh);
1814 schedule();
1815 goto retry;
1816 }
1808 1817
1809 if (test_bit(STRIPE_EXPANDING, &sh->state) || 1818 if (test_bit(STRIPE_EXPANDING, &sh->state) ||
1810 !add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK))) { 1819 !add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK))) {
@@ -2725,6 +2734,10 @@ static void raid5_quiesce(mddev_t *mddev, int state)
2725 raid5_conf_t *conf = mddev_to_conf(mddev); 2734 raid5_conf_t *conf = mddev_to_conf(mddev);
2726 2735
2727 switch(state) { 2736 switch(state) {
2737 case 2: /* resume for a suspend */
2738 wake_up(&conf->wait_for_overlap);
2739 break;
2740
2728 case 1: /* stop all writes */ 2741 case 1: /* stop all writes */
2729 spin_lock_irq(&conf->device_lock); 2742 spin_lock_irq(&conf->device_lock);
2730 conf->quiesce = 1; 2743 conf->quiesce = 1;
@@ -2738,6 +2751,7 @@ static void raid5_quiesce(mddev_t *mddev, int state)
2738 spin_lock_irq(&conf->device_lock); 2751 spin_lock_irq(&conf->device_lock);
2739 conf->quiesce = 0; 2752 conf->quiesce = 0;
2740 wake_up(&conf->wait_for_stripe); 2753 wake_up(&conf->wait_for_stripe);
2754 wake_up(&conf->wait_for_overlap);
2741 spin_unlock_irq(&conf->device_lock); 2755 spin_unlock_irq(&conf->device_lock);
2742 break; 2756 break;
2743 } 2757 }