Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6eef4b21 authored by NeilBrown's avatar NeilBrown
Browse files

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
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -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 */

	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 &&
		     bio_rw_flagged(bio, BIO_RW_BARRIER))) {
		if (rw == WRITE)
@@ -2271,6 +2290,9 @@ static void raid1_quiesce(mddev_t *mddev, int state)
	conf_t *conf = mddev->private;

	switch(state) {
	case 2: /* wake for suspend */
		wake_up(&conf->wait_barrier);
		break;
	case 1:
		raise_barrier(conf);
		break;