From: Michael Wang <yun.wang@profitbricks.com>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
linux-block@vger.kernel.org, linux-raid@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>, Shaohua Li <shli@kernel.org>,
NeilBrown <neilb@suse.com>,
Jinpu Wang <jinpu.wang@profitbricks.com>
Subject: [RFC PATCH] blk: reset 'bi_next' when bio is done inside request
Date: Mon, 3 Apr 2017 14:05:16 +0200 [thread overview]
Message-ID: <9505ff12-7307-7dec-76b5-2a233a592634@profitbricks.com> (raw)
blk_attempt_plug_merge() try to merge bio into request and chain them
by 'bi_next', while after the bio is done inside request, we forgot to
reset the 'bi_next'.
This lead into BUG while removing all the underlying devices from md-raid1,
the bio once go through:
md_do_sync()
sync_request()
generic_make_request()
blk_queue_bio()
blk_attempt_plug_merge()
CHAINED HERE
will keep chained and reused by:
raid1d()
sync_request_write()
generic_make_request()
BUG_ON(bio->bi_next)
After reset the 'bi_next' this can no longer happen.
Signed-off-by: Michael Wang <yun.wang@profitbricks.com>
---
block/blk-core.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 43b7d06..91223b2 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -2619,8 +2619,10 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)
struct bio *bio = req->bio;
unsigned bio_bytes = min(bio->bi_iter.bi_size, nr_bytes);
- if (bio_bytes == bio->bi_iter.bi_size)
+ if (bio_bytes == bio->bi_iter.bi_size) {
req->bio = bio->bi_next;
+ bio->bi_next = NULL;
+ }
req_bio_endio(req, bio, bio_bytes, error);
--
2.5.0
next reply other threads:[~2017-04-03 12:05 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-03 12:05 Michael Wang [this message]
2017-04-03 21:25 ` [RFC PATCH] blk: reset 'bi_next' when bio is done inside request NeilBrown
2017-04-04 8:13 ` Michael Wang
2017-04-04 9:37 ` NeilBrown
2017-04-04 10:23 ` Michael Wang
2017-04-04 12:24 ` Michael Wang
2017-04-04 12:48 ` Michael Wang
2017-04-04 21:52 ` NeilBrown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9505ff12-7307-7dec-76b5-2a233a592634@profitbricks.com \
--to=yun.wang@profitbricks.com \
--cc=axboe@kernel.dk \
--cc=jinpu.wang@profitbricks.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-raid@vger.kernel.org \
--cc=neilb@suse.com \
--cc=shli@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox