Commit 6eef4b21 authored by NeilBrown's avatar NeilBrown

md: add honouring of suspend_{lo,hi} to raid1.

This will allow us to stop writeout to portions of the array
while  they are resynced by someone else - e.g. another node in
a cluster.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 729a1866
...@@ -801,6 +801,25 @@ static int make_request(struct request_queue *q, struct bio * bio) ...@@ -801,6 +801,25 @@ static int make_request(struct request_queue *q, struct bio * bio)
md_write_start(mddev, bio); /* wait on superblock update early */ md_write_start(mddev, bio); /* wait on superblock update early */
if (bio_data_dir(bio) == WRITE &&
bio->bi_sector + bio->bi_size/512 > mddev->suspend_lo &&
bio->bi_sector < mddev->suspend_hi) {
/* As the suspend_* range is controlled by
* userspace, we want an interruptible
* wait.
*/
DEFINE_WAIT(w);
for (;;) {
flush_signals(current);
prepare_to_wait(&conf->wait_barrier,
&w, TASK_INTERRUPTIBLE);
if (bio->bi_sector + bio->bi_size/512 <= mddev->suspend_lo ||
bio->bi_sector >= mddev->suspend_hi)
break;
schedule();
}
finish_wait(&conf->wait_barrier, &w);
}
if (unlikely(!mddev->barriers_work && if (unlikely(!mddev->barriers_work &&
bio_rw_flagged(bio, BIO_RW_BARRIER))) { bio_rw_flagged(bio, BIO_RW_BARRIER))) {
if (rw == WRITE) if (rw == WRITE)
...@@ -2271,6 +2290,9 @@ static void raid1_quiesce(mddev_t *mddev, int state) ...@@ -2271,6 +2290,9 @@ static void raid1_quiesce(mddev_t *mddev, int state)
conf_t *conf = mddev->private; conf_t *conf = mddev->private;
switch(state) { switch(state) {
case 2: /* wake for suspend */
wake_up(&conf->wait_barrier);
break;
case 1: case 1:
raise_barrier(conf); raise_barrier(conf);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment