mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
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: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
729a18663a
commit
6eef4b21ff
1 changed files with 22 additions and 0 deletions
|
@ -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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue