diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 515554c7365b..f24a9e14021d 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -570,7 +570,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect | |||
570 | if (best_dist_disk < 0) { | 570 | if (best_dist_disk < 0) { |
571 | if (is_badblock(rdev, this_sector, sectors, | 571 | if (is_badblock(rdev, this_sector, sectors, |
572 | &first_bad, &bad_sectors)) { | 572 | &first_bad, &bad_sectors)) { |
573 | if (first_bad < this_sector) | 573 | if (first_bad <= this_sector) |
574 | /* Cannot use this */ | 574 | /* Cannot use this */ |
575 | continue; | 575 | continue; |
576 | best_good_sectors = first_bad - this_sector; | 576 | best_good_sectors = first_bad - this_sector; |
@@ -877,7 +877,8 @@ static sector_t wait_barrier(struct r1conf *conf, struct bio *bio) | |||
877 | ((conf->start_next_window < | 877 | ((conf->start_next_window < |
878 | conf->next_resync + RESYNC_SECTORS) && | 878 | conf->next_resync + RESYNC_SECTORS) && |
879 | current->bio_list && | 879 | current->bio_list && |
880 | !bio_list_empty(current->bio_list))), | 880 | (!bio_list_empty(¤t->bio_list[0]) || |
881 | !bio_list_empty(¤t->bio_list[1])))), | ||
881 | conf->resync_lock); | 882 | conf->resync_lock); |
882 | conf->nr_waiting--; | 883 | conf->nr_waiting--; |
883 | } | 884 | } |
@@ -1087,7 +1088,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) | |||
1087 | */ | 1088 | */ |
1088 | DEFINE_WAIT(w); | 1089 | DEFINE_WAIT(w); |
1089 | for (;;) { | 1090 | for (;;) { |
1090 | flush_signals(current); | 1091 | sigset_t full, old; |
1091 | prepare_to_wait(&conf->wait_barrier, | 1092 | prepare_to_wait(&conf->wait_barrier, |
1092 | &w, TASK_INTERRUPTIBLE); | 1093 | &w, TASK_INTERRUPTIBLE); |
1093 | if (bio_end_sector(bio) <= mddev->suspend_lo || | 1094 | if (bio_end_sector(bio) <= mddev->suspend_lo || |
@@ -1096,7 +1097,10 @@ static void make_request(struct mddev *mddev, struct bio * bio) | |||
1096 | !md_cluster_ops->area_resyncing(mddev, WRITE, | 1097 | !md_cluster_ops->area_resyncing(mddev, WRITE, |
1097 | bio->bi_iter.bi_sector, bio_end_sector(bio)))) | 1098 | bio->bi_iter.bi_sector, bio_end_sector(bio)))) |
1098 | break; | 1099 | break; |
1100 | sigfillset(&full); | ||
1101 | sigprocmask(SIG_BLOCK, &full, &old); | ||
1099 | schedule(); | 1102 | schedule(); |
1103 | sigprocmask(SIG_SETMASK, &old, NULL); | ||
1100 | } | 1104 | } |
1101 | finish_wait(&conf->wait_barrier, &w); | 1105 | finish_wait(&conf->wait_barrier, &w); |
1102 | } | 1106 | } |