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

Commit 143a87f4 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

block: improve flush bio completion



bio's for flush are completed twice - once during the data phase and
one more time after the whole sequence is complete.  The first
completion shouldn't notify completion to the issuer.

This was achieved by skipping all bio completion steps in
req_bio_endio() for the first completion; however, this has two
drawbacks.

* Error is not recorded in bio and must be tracked somewhere else.

* Partial completion is not supported.

Both don't cause problems for the current users; however, they make
further improvements difficult.  Change req_bio_endio() such that it
only skips the actual notification part for the first completion.  bio
completion is implemented with partial completions on mind anyway so
this is as simple as moving the REQ_FLUSH_SEQ conditional such that
only calling of bio_endio() is skipped.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 414b4ff5
Loading
Loading
Loading
Loading
+21 −27
Original line number Diff line number Diff line
@@ -136,7 +136,6 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
{
	struct request_queue *q = rq->q;

	if (!(rq->cmd_flags & REQ_FLUSH_SEQ)) {
	if (error)
		clear_bit(BIO_UPTODATE, &bio->bi_flags);
	else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
@@ -157,17 +156,12 @@ static void req_bio_endio(struct request *rq, struct bio *bio,
	if (bio_integrity(bio))
		bio_integrity_advance(bio, nbytes);

		if (bio->bi_size == 0)
	/* don't actually finish bio if it's part of flush sequence */
	if (bio->bi_size == 0 && !(rq->cmd_flags & REQ_FLUSH_SEQ))
		bio_endio(bio, error);
	} else {
		/*
		 * Okay, this is the sequenced flush request in
		 * progress, just record the error;
		 */
		if (error && !q->flush_err)
	else if (error && !q->flush_err)
		q->flush_err = error;
}
}

void blk_dump_rq_flags(struct request *rq, char *msg)
{