From: Jeff Mahoney <jeffm@suse.com>
To: Jens Axboe <axboe@kernel.dk>,
Linux Kernel Maling List <linux-kernel@vger.kernel.org>
Subject: [PATCH] block: copy bi_vcnt in __bio_clone_fast
Date: Wed, 08 Oct 2014 18:54:11 -0400 [thread overview]
Message-ID: <5435C093.5070405@suse.com> (raw)
Commit 05f1dd53152173 (block: add queue flag for disabling SG merging) uses
bi_vcnt to assign bio->bi_phys_segments if sg merging is disabled. When
using device mapper on top of a blk-mq device (virtio_blk in my test),
we'd end up overflowing the scatterlist in __blk_bios_map_sg.
__bio_clone_fast copies bi_iter and bi_io_vec but not bi_vcnt, so
blk_recount_segments would report bi_phys_segments as 0. Since
rq->nr_phys_segments is 0 as well, the checks to ensure that we don't
exceed the queue's segment limit end up allowing more bios (and segments) to
attach the a request until we finally map it. That also means we
pass the BUG_ON at the beginning of virtio_queue_rq, ultimately causing
memory corruption and a crash.
If we copy bi_vcnt in __bio_clone_fast, the bios and requests properly
report the number of segments and everything works as expected.
Originally reported at http://bugzilla.opensuse.org/show_bug.cgi?id=888259
Reported-by: Stephen Kulow <coolo@suse.com>
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
block/bio.c | 1 +
1 file changed, 1 insertion(+)
--- a/block/bio.c
+++ b/block/bio.c
@@ -564,6 +564,7 @@ void __bio_clone_fast(struct bio *bio, s
bio->bi_rw = bio_src->bi_rw;
bio->bi_iter = bio_src->bi_iter;
bio->bi_io_vec = bio_src->bi_io_vec;
+ bio->bi_vcnt = bio_src->bi_vcnt;
}
EXPORT_SYMBOL(__bio_clone_fast);
--
Jeff Mahoney
SUSE Labs
next reply other threads:[~2014-10-08 22:54 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-08 22:54 Jeff Mahoney [this message]
2014-10-09 13:53 ` [PATCH] block: copy bi_vcnt in __bio_clone_fast Jeff Moyer
2014-10-09 14:26 ` Jeff Mahoney
2014-10-09 15:25 ` Ming Lei
2014-10-09 16:13 ` Ming Lei
2014-10-09 17:58 ` Jeff Mahoney
2014-10-09 19:12 ` Jens Axboe
2014-10-10 1:24 ` Ming Lei
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=5435C093.5070405@suse.com \
--to=jeffm@suse.com \
--cc=axboe@kernel.dk \
--cc=linux-kernel@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.