From: Ming Lei <ming.lei@redhat.com>
To: Mikulas Patocka <mpatocka@redhat.com>
Cc: Mike Snitzer <snitzer@kernel.org>, Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org, dm-devel@lists.linux.dev,
ming.lei@redhat.com
Subject: Re: block: fail unaligned bio from submit_bio_noacct()
Date: Fri, 22 Mar 2024 10:08:11 +0800 [thread overview]
Message-ID: <ZfzoC/V07nExJ+0x@fedora> (raw)
In-Reply-To: <ea8a13c-ee40-47f9-a7be-17b84bd1f686@redhat.com>
On Thu, Mar 21, 2024 at 06:01:41PM +0100, Mikulas Patocka wrote:
>
>
> On Thu, 21 Mar 2024, Mike Snitzer wrote:
>
> > On Thu, Mar 21 2024 at 9:16P -0400,
> > Ming Lei <ming.lei@redhat.com> wrote:
> >
> > > For any bio with data, its start sector and size have to be aligned with
> > > the queue's logical block size.
> > >
> > > This rule is obvious, but there is still user which may send unaligned
> > > bio to block layer, and it is observed that dm-integrity can do that,
> > > and cause double free of driver's dma meta buffer.
> > >
> > > So failfast unaligned bio from submit_bio_noacct() for avoiding more
> > > troubles.
> > >
> > > Cc: Mikulas Patocka <mpatocka@redhat.com>
> > > Cc: Mike Snitzer <snitzer@kernel.org>
> > > Signed-off-by: Ming Lei <ming.lei@redhat.com>
> > > ---
> > > block/blk-core.c | 17 +++++++++++++++++
> > > 1 file changed, 17 insertions(+)
> > >
> > > diff --git a/block/blk-core.c b/block/blk-core.c
> > > index a16b5abdbbf5..b1a10187ef74 100644
> > > --- a/block/blk-core.c
> > > +++ b/block/blk-core.c
> > > @@ -729,6 +729,20 @@ void submit_bio_noacct_nocheck(struct bio *bio)
> > > __submit_bio_noacct(bio);
> > > }
> > >
> > > +static bool bio_check_alignment(struct bio *bio, struct request_queue *q)
> > > +{
> > > + unsigned int bs = q->limits.logical_block_size;
> > > + unsigned int size = bio->bi_iter.bi_size;
> > > +
> > > + if (size & (bs - 1))
> > > + return false;
> > > +
> > > + if (size && ((bio->bi_iter.bi_sector << SECTOR_SHIFT) & (bs - 1)))
> > > + return false;
> > > +
> > > + return true;
> > > +}
>
> I would change it to
>
> if (unlikely(((bi_iter.bi_sector | bio_sectors(bio)) & ((queue_logical_block_size(q) >> 9) - 1)) != 0))
> return false;
What if bio->bi_iter.bi_size isn't aligned with 512? The above check
can't find that at all.
>
> > > /**
> > > * submit_bio_noacct - re-submit a bio to the block device layer for I/O
> > > * @bio: The bio describing the location in memory and on the device.
> > > @@ -780,6 +794,9 @@ void submit_bio_noacct(struct bio *bio)
> > > }
> > > }
> > >
> > > + if (WARN_ON_ONCE(!bio_check_alignment(bio, q)))
> > > + goto end_io;
> > > +
> > > if (!test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
> > > bio_clear_polled(bio);
> > >
> > > --
> > > 2.41.0
> > >
> > >
> >
> > This check would really help more quickly find buggy code, but it
> > would be unfortunate for these extra checks to be required in
> > production. It feels like this is the type of check that should be
> > wrapped by a debug CONFIG option (so only debug kernels have it).
> >
> > Do we already have an appropriate CONFIG option to use?
> >
> > Mike
>
> But then, the system would crash with the config option being 'n' and
> return an error with the config option being 'y' - which would be
> unfortunate.
Yes, the check is basically zero-cost, not necessary to add config to
make things more complicated.
Thanks,
Ming
next prev parent reply other threads:[~2024-03-22 2:08 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-21 13:16 [PATCH] block: fail unaligned bio from submit_bio_noacct() Ming Lei
2024-03-21 15:14 ` Bart Van Assche
2024-03-21 15:18 ` Ming Lei
2024-03-21 15:43 ` Mike Snitzer
2024-03-21 17:01 ` Mikulas Patocka
2024-03-21 22:07 ` Christoph Hellwig
2024-03-22 2:08 ` Ming Lei [this message]
2024-03-22 2:39 ` Keith Busch
2024-03-24 8:02 ` Ming Lei
2024-03-22 10:16 ` Mikulas Patocka
2024-03-21 17:09 ` [PATCH] " Jens Axboe
2024-03-21 22:09 ` Christoph Hellwig
2024-03-21 22:50 ` Jens Axboe
2024-03-22 0:31 ` Christoph Hellwig
2024-03-22 1:21 ` Ming Lei
2024-03-21 22:06 ` Christoph Hellwig
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=ZfzoC/V07nExJ+0x@fedora \
--to=ming.lei@redhat.com \
--cc=axboe@kernel.dk \
--cc=dm-devel@lists.linux.dev \
--cc=linux-block@vger.kernel.org \
--cc=mpatocka@redhat.com \
--cc=snitzer@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;
as well as URLs for NNTP newsgroup(s).