aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r--drivers/md/raid1.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index f2db7a9d5964..5208e9d1aff0 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -890,17 +890,17 @@ static void allow_barrier(struct r1conf *conf)
890 wake_up(&conf->wait_barrier); 890 wake_up(&conf->wait_barrier);
891} 891}
892 892
893static void freeze_array(struct r1conf *conf) 893static void freeze_array(struct r1conf *conf, int extra)
894{ 894{
895 /* stop syncio and normal IO and wait for everything to 895 /* stop syncio and normal IO and wait for everything to
896 * go quite. 896 * go quite.
897 * We increment barrier and nr_waiting, and then 897 * We increment barrier and nr_waiting, and then
898 * wait until nr_pending match nr_queued+1 898 * wait until nr_pending match nr_queued+extra
899 * This is called in the context of one normal IO request 899 * This is called in the context of one normal IO request
900 * that has failed. Thus any sync request that might be pending 900 * that has failed. Thus any sync request that might be pending
901 * will be blocked by nr_pending, and we need to wait for 901 * will be blocked by nr_pending, and we need to wait for
902 * pending IO requests to complete or be queued for re-try. 902 * pending IO requests to complete or be queued for re-try.
903 * Thus the number queued (nr_queued) plus this request (1) 903 * Thus the number queued (nr_queued) plus this request (extra)
904 * must match the number of pending IOs (nr_pending) before 904 * must match the number of pending IOs (nr_pending) before
905 * we continue. 905 * we continue.
906 */ 906 */
@@ -908,7 +908,7 @@ static void freeze_array(struct r1conf *conf)
908 conf->barrier++; 908 conf->barrier++;
909 conf->nr_waiting++; 909 conf->nr_waiting++;
910 wait_event_lock_irq_cmd(conf->wait_barrier, 910 wait_event_lock_irq_cmd(conf->wait_barrier,
911 conf->nr_pending == conf->nr_queued+1, 911 conf->nr_pending == conf->nr_queued+extra,
912 conf->resync_lock, 912 conf->resync_lock,
913 flush_pending_writes(conf)); 913 flush_pending_writes(conf));
914 spin_unlock_irq(&conf->resync_lock); 914 spin_unlock_irq(&conf->resync_lock);
@@ -1568,8 +1568,8 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
1568 * we wait for all outstanding requests to complete. 1568 * we wait for all outstanding requests to complete.
1569 */ 1569 */
1570 synchronize_sched(); 1570 synchronize_sched();
1571 raise_barrier(conf); 1571 freeze_array(conf, 0);
1572 lower_barrier(conf); 1572 unfreeze_array(conf);
1573 clear_bit(Unmerged, &rdev->flags); 1573 clear_bit(Unmerged, &rdev->flags);
1574 } 1574 }
1575 md_integrity_add_rdev(rdev, mddev); 1575 md_integrity_add_rdev(rdev, mddev);
@@ -1619,11 +1619,11 @@ static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev)
1619 */ 1619 */
1620 struct md_rdev *repl = 1620 struct md_rdev *repl =
1621 conf->mirrors[conf->raid_disks + number].rdev; 1621 conf->mirrors[conf->raid_disks + number].rdev;
1622 raise_barrier(conf); 1622 freeze_array(conf, 0);
1623 clear_bit(Replacement, &repl->flags); 1623 clear_bit(Replacement, &repl->flags);
1624 p->rdev = repl; 1624 p->rdev = repl;
1625 conf->mirrors[conf->raid_disks + number].rdev = NULL; 1625 conf->mirrors[conf->raid_disks + number].rdev = NULL;
1626 lower_barrier(conf); 1626 unfreeze_array(conf);
1627 clear_bit(WantReplacement, &rdev->flags); 1627 clear_bit(WantReplacement, &rdev->flags);
1628 } else 1628 } else
1629 clear_bit(WantReplacement, &rdev->flags); 1629 clear_bit(WantReplacement, &rdev->flags);
@@ -2240,7 +2240,7 @@ static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio)
2240 * frozen 2240 * frozen
2241 */ 2241 */
2242 if (mddev->ro == 0) { 2242 if (mddev->ro == 0) {
2243 freeze_array(conf); 2243 freeze_array(conf, 1);
2244 fix_read_error(conf, r1_bio->read_disk, 2244 fix_read_error(conf, r1_bio->read_disk,
2245 r1_bio->sector, r1_bio->sectors); 2245 r1_bio->sector, r1_bio->sectors);
2246 unfreeze_array(conf); 2246 unfreeze_array(conf);
@@ -3020,7 +3020,7 @@ static int raid1_reshape(struct mddev *mddev)
3020 return -ENOMEM; 3020 return -ENOMEM;
3021 } 3021 }
3022 3022
3023 raise_barrier(conf); 3023 freeze_array(conf, 0);
3024 3024
3025 /* ok, everything is stopped */ 3025 /* ok, everything is stopped */
3026 oldpool = conf->r1bio_pool; 3026 oldpool = conf->r1bio_pool;
@@ -3051,7 +3051,7 @@ static int raid1_reshape(struct mddev *mddev)
3051 conf->raid_disks = mddev->raid_disks = raid_disks; 3051 conf->raid_disks = mddev->raid_disks = raid_disks;
3052 mddev->delta_disks = 0; 3052 mddev->delta_disks = 0;
3053 3053
3054 lower_barrier(conf); 3054 unfreeze_array(conf);
3055 3055
3056 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 3056 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
3057 md_wakeup_thread(mddev->thread); 3057 md_wakeup_thread(mddev->thread);