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

Commit ed72a3d1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for-linus' of git://neil.brown.name/md

* 'for-linus' of git://neil.brown.name/md:
  md/raid5: STRIPE_ACTIVE has lock semantics, add barriers
  md/raid5: abort any pending parity operations when array fails.
parents c8c27c95 257a4b42
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -3110,7 +3110,7 @@ static void handle_stripe(struct stripe_head *sh)
	struct r5dev *pdev, *qdev;

	clear_bit(STRIPE_HANDLE, &sh->state);
	if (test_and_set_bit(STRIPE_ACTIVE, &sh->state)) {
	if (test_and_set_bit_lock(STRIPE_ACTIVE, &sh->state)) {
		/* already being handled, ensure it gets handled
		 * again when current action finishes */
		set_bit(STRIPE_HANDLE, &sh->state);
@@ -3159,10 +3159,14 @@ static void handle_stripe(struct stripe_head *sh)
	/* check if the array has lost more than max_degraded devices and,
	 * if so, some requests might need to be failed.
	 */
	if (s.failed > conf->max_degraded && s.to_read+s.to_write+s.written)
	if (s.failed > conf->max_degraded) {
		sh->check_state = 0;
		sh->reconstruct_state = 0;
		if (s.to_read+s.to_write+s.written)
			handle_failed_stripe(conf, sh, &s, disks, &s.return_bi);
	if (s.failed > conf->max_degraded && s.syncing)
		if (s.syncing)
			handle_failed_sync(conf, sh, &s);
	}

	/*
	 * might be able to return some write requests if the parity blocks
@@ -3371,7 +3375,7 @@ finish:

	return_io(s.return_bi);

	clear_bit(STRIPE_ACTIVE, &sh->state);
	clear_bit_unlock(STRIPE_ACTIVE, &sh->state);
}

static void raid5_activate_delayed(struct r5conf *conf)