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

Commit ca64cae9 authored by NeilBrown's avatar NeilBrown
Browse files

md/raid5: Make sure we clear R5_Discard when discard is finished.



commit 9e444768
    MD: raid5 avoid unnecessary zero page for trim

change raid5 to clear R5_Discard when the complete request is
handled rather than when submitting the per-device discard request.
However it did not clear R5_Discard for the parity device.

This means that if the stripe_head was reused before it expired from
the cache, the setting would be wrong and a hang would result.

Also if the R5_Uptodate bit happens to be set, R5_Discard again
won't be cleared.  But R5_Uptodate really should be clear at this point.

So make sure R5_Discard is cleared in all cases, and clear
R5_Uptodate when a 'discard' completes.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent ef5b7c69
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -2774,10 +2774,12 @@ static void handle_stripe_clean_event(struct r5conf *conf,
			dev = &sh->dev[i];
			if (!test_bit(R5_LOCKED, &dev->flags) &&
			    (test_bit(R5_UPTODATE, &dev->flags) ||
			     test_and_clear_bit(R5_Discard, &dev->flags))) {
			     test_bit(R5_Discard, &dev->flags))) {
				/* We can return any write requests */
				struct bio *wbi, *wbi2;
				pr_debug("Return write for disc %d\n", i);
				if (test_and_clear_bit(R5_Discard, &dev->flags))
					clear_bit(R5_UPTODATE, &dev->flags);
				wbi = dev->written;
				dev->written = NULL;
				while (wbi && wbi->bi_sector <
@@ -2795,7 +2797,8 @@ static void handle_stripe_clean_event(struct r5conf *conf,
					 !test_bit(STRIPE_DEGRADED, &sh->state),
						0);
			}
		}
		} else if (test_bit(R5_Discard, &sh->dev[i].flags))
			clear_bit(R5_Discard, &sh->dev[i].flags);

	if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state))
		if (atomic_dec_and_test(&conf->pending_full_writes))