diff options
Diffstat (limited to 'drivers/md/raid1.c')
| -rw-r--r-- | drivers/md/raid1.c | 20 | 
1 files changed, 16 insertions, 4 deletions
| diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index d34e238afa54..4efa50186a2a 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -539,7 +539,13 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect  	has_nonrot_disk = 0;  	choose_next_idle = 0; -	choose_first = (conf->mddev->recovery_cp < this_sector + sectors); +	if ((conf->mddev->recovery_cp < this_sector + sectors) || +	    (mddev_is_clustered(conf->mddev) && +	    md_cluster_ops->area_resyncing(conf->mddev, this_sector, +		    this_sector + sectors))) +		choose_first = 1; +	else +		choose_first = 0;  	for (disk = 0 ; disk < conf->raid_disks * 2 ; disk++) {  		sector_t dist; @@ -1102,8 +1108,10 @@ static void make_request(struct mddev *mddev, struct bio * bio)  	md_write_start(mddev, bio); /* wait on superblock update early */  	if (bio_data_dir(bio) == WRITE && -	    bio_end_sector(bio) > mddev->suspend_lo && -	    bio->bi_iter.bi_sector < mddev->suspend_hi) { +	    ((bio_end_sector(bio) > mddev->suspend_lo && +	    bio->bi_iter.bi_sector < mddev->suspend_hi) || +	    (mddev_is_clustered(mddev) && +	     md_cluster_ops->area_resyncing(mddev, bio->bi_iter.bi_sector, bio_end_sector(bio))))) {  		/* As the suspend_* range is controlled by  		 * userspace, we want an interruptible  		 * wait. @@ -1114,7 +1122,10 @@ static void make_request(struct mddev *mddev, struct bio * bio)  			prepare_to_wait(&conf->wait_barrier,  					&w, TASK_INTERRUPTIBLE);  			if (bio_end_sector(bio) <= mddev->suspend_lo || -			    bio->bi_iter.bi_sector >= mddev->suspend_hi) +			    bio->bi_iter.bi_sector >= mddev->suspend_hi || +			    (mddev_is_clustered(mddev) && +			     !md_cluster_ops->area_resyncing(mddev, +				     bio->bi_iter.bi_sector, bio_end_sector(bio))))  				break;  			schedule();  		} @@ -1561,6 +1572,7 @@ static int raid1_spare_active(struct mddev *mddev)  		struct md_rdev *rdev = conf->mirrors[i].rdev;  		struct md_rdev *repl = conf->mirrors[conf->raid_disks + i].rdev;  		if (repl +		    && !test_bit(Candidate, &repl->flags)  		    && repl->recovery_offset == MaxSector  		    && !test_bit(Faulty, &repl->flags)  		    && !test_and_set_bit(In_sync, &repl->flags)) { | 
