diff mbox series

[SRU,K:master-next,1/1] block: handle bio_split_to_limits() NULL return

Message ID 20230530172517.659713-2-aleksandr.mikhalitsyn@canonical.com
State New
Headers show
Series block: handle bio_split_to_limits() NULL return | expand

Commit Message

Aleksandr Mikhalitsyn May 30, 2023, 5:25 p.m. UTC
From: Jens Axboe <axboe@kernel.dk>

BugLink: https://bugs.launchpad.net/bugs/2020901

commit 613b14884b8595e20b9fac4126bf627313827fbe upstream.

This can't happen right now, but in preparation for allowing
bio_split_to_limits() returning NULL if it ended the bio, check for it
in all the callers.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(backported from commit 613b14884b8595e20b9fac4126bf627313827fbe)
Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
---
 block/blk-merge.c             | 4 +++-
 block/blk-mq.c                | 3 +++
 drivers/block/drbd/drbd_req.c | 2 ++
 drivers/block/pktcdvd.c       | 2 ++
 drivers/block/ps3vram.c       | 2 ++
 drivers/md/dm.c               | 2 ++
 drivers/md/md.c               | 2 ++
 drivers/nvme/host/multipath.c | 2 ++
 drivers/s390/block/dcssblk.c  | 2 ++
 9 files changed, 20 insertions(+), 1 deletion(-)

Comments

Roxana Nicolescu May 31, 2023, 10:04 a.m. UTC | #1
On 30/05/2023 19:25, Alexander Mikhalitsyn wrote:
> From: Jens Axboe <axboe@kernel.dk>
>
> BugLink: https://bugs.launchpad.net/bugs/2020901
>
> commit 613b14884b8595e20b9fac4126bf627313827fbe upstream.
>
> This can't happen right now, but in preparation for allowing
> bio_split_to_limits() returning NULL if it ended the bio, check for it
> in all the callers.
>
> Signed-off-by: Jens Axboe <axboe@kernel.dk>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> (backported from commit 613b14884b8595e20b9fac4126bf627313827fbe)

This commit message is actually 7ec9a45fc4ee7fc1054c2cabf8b09a6bc708472e 
from the stable tree. I see it has the sob of Greg. The one in mainline 
does not have it.
But the commit in the stable tree does not contain drivers/md/dm.c 
changes, so I am not sure which commit you actually applied here.

And this is not a clean cherry-pick, hence it needs some explanation on 
how you solved it.

Format is:

[axboe: <Your explanation>]
Something like "Context adjustment due to missing commits ..."

> Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
> ---
>   block/blk-merge.c             | 4 +++-
>   block/blk-mq.c                | 3 +++
>   drivers/block/drbd/drbd_req.c | 2 ++
>   drivers/block/pktcdvd.c       | 2 ++
>   drivers/block/ps3vram.c       | 2 ++
>   drivers/md/dm.c               | 2 ++
>   drivers/md/md.c               | 2 ++
>   drivers/nvme/host/multipath.c | 2 ++
>   drivers/s390/block/dcssblk.c  | 2 ++
>   9 files changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/block/blk-merge.c b/block/blk-merge.c
> index 88e39b955bd6..1af8043900f4 100644
> --- a/block/blk-merge.c
> +++ b/block/blk-merge.c
> @@ -348,11 +348,13 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio,
>   		break;
>   	default:
>   		split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs);
> +		if (IS_ERR(split))
> +			*bio = split = NULL;
>   		break;
>   	}
>   
>   	if (split) {
> -		/* there isn't chance to merge the splitted bio */
> +		/* there isn't chance to merge the split bio */
>   		split->bi_opf |= REQ_NOMERGE;
>   
>   		blkcg_bio_issue_init(split);
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 7c7e632871e7..8b22429cf94e 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -2818,6 +2818,9 @@ void blk_mq_submit_bio(struct bio *bio)
>   	if (blk_may_split(q, bio))
>   		__blk_queue_split(q, &bio, &nr_segs);
>   
> +	if (!bio)
> +		return;
> +
>   	if (!bio_integrity_prep(bio))
>   		return;
>   
> diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
> index e60d3c6314c6..f323a4714f6a 100644
> --- a/drivers/block/drbd/drbd_req.c
> +++ b/drivers/block/drbd/drbd_req.c
> @@ -1609,6 +1609,8 @@ void drbd_submit_bio(struct bio *bio)
>   	struct drbd_device *device = bio->bi_bdev->bd_disk->private_data;
>   
>   	blk_queue_split(&bio);
> +	if (!bio)
> +		return;
>   
>   	/*
>   	 * what we "blindly" assume:
> diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> index 789093375344..1988bb05c0c7 100644
> --- a/drivers/block/pktcdvd.c
> +++ b/drivers/block/pktcdvd.c
> @@ -2400,6 +2400,8 @@ static void pkt_submit_bio(struct bio *bio)
>   	struct bio *split;
>   
>   	blk_queue_split(&bio);
> +	if (!bio)
> +		return;
>   
>   	pkt_dbg(2, pd, "start = %6llx stop = %6llx\n",
>   		(unsigned long long)bio->bi_iter.bi_sector,
> diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
> index 4f90819e245e..2a431178dc7e 100644
> --- a/drivers/block/ps3vram.c
> +++ b/drivers/block/ps3vram.c
> @@ -587,6 +587,8 @@ static void ps3vram_submit_bio(struct bio *bio)
>   	dev_dbg(&dev->core, "%s\n", __func__);
>   
>   	blk_queue_split(&bio);
> +	if (!bio)
> +		return;
>   
>   	spin_lock_irq(&priv->lock);
>   	busy = !bio_list_empty(&priv->list);
> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index 5acee96b5a7b..bf904c153d41 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -1674,6 +1674,8 @@ static void dm_split_and_process_bio(struct mapped_device *md,
>   		 * otherwise associated queue_limits won't be imposed.
>   		 */
>   		blk_queue_split(&bio);
> +		if (!bio)
> +			return;
>   	}
>   
>   	init_clone_info(&ci, md, map, bio, is_abnormal);
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 946434ced070..772a89843226 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -465,6 +465,8 @@ static void md_submit_bio(struct bio *bio)
>   	}
>   
>   	blk_queue_split(&bio);
> +	if (!bio)
> +		return;
>   
>   	if (mddev->ro == 1 && unlikely(rw == WRITE)) {
>   		if (bio_sectors(bio) != 0)
> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> index d62c4a0f89ab..571c4791faa8 100644
> --- a/drivers/nvme/host/multipath.c
> +++ b/drivers/nvme/host/multipath.c
> @@ -351,6 +351,8 @@ static void nvme_ns_head_submit_bio(struct bio *bio)
>   	 * pool from the original queue to allocate the bvecs from.
>   	 */
>   	blk_queue_split(&bio);
> +	if (!bio)
> +		return;
>   
>   	srcu_idx = srcu_read_lock(&head->srcu);
>   	ns = nvme_find_path(head);
> diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
> index f4401b2d30e0..18506cc222ba 100644
> --- a/drivers/s390/block/dcssblk.c
> +++ b/drivers/s390/block/dcssblk.c
> @@ -865,6 +865,8 @@ dcssblk_submit_bio(struct bio *bio)
>   	unsigned long bytes_done;
>   
>   	blk_queue_split(&bio);
> +	if (!bio)
> +		return;
>   
>   	bytes_done = 0;
>   	dev_info = bio->bi_bdev->bd_disk->private_data;
Hey,

I have some comments inline.

Thanks,
Roxana
Aleksandr Mikhalitsyn May 31, 2023, 2:59 p.m. UTC | #2
On Wed, May 31, 2023 at 12:04 PM Roxana Nicolescu
<roxana.nicolescu@canonical.com> wrote:
>
>
> On 30/05/2023 19:25, Alexander Mikhalitsyn wrote:
> > From: Jens Axboe <axboe@kernel.dk>
> >
> > BugLink: https://bugs.launchpad.net/bugs/2020901
> >
> > commit 613b14884b8595e20b9fac4126bf627313827fbe upstream.
> >
> > This can't happen right now, but in preparation for allowing
> > bio_split_to_limits() returning NULL if it ended the bio, check for it
> > in all the callers.
> >
> > Signed-off-by: Jens Axboe <axboe@kernel.dk>
> > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > (backported from commit 613b14884b8595e20b9fac4126bf627313827fbe)
>
> This commit message is actually 7ec9a45fc4ee7fc1054c2cabf8b09a6bc708472e

ah, yep, SOB of Greg is incorrect, but commit hash
613b14884b8595e20b9fac4126bf627313827fbe is the right one.
Just take a look:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=613b14884b8595e20b9fac4126bf627313827fbe
and compare changes.

> from the stable tree. I see it has the sob of Greg. The one in mainline
> does not have it.
> But the commit in the stable tree does not contain drivers/md/dm.c
> changes, so I am not sure which commit you actually applied here.

yes, because our kernel tree is not the same as any -stable or
upstream. I've ported changes properly.
drivers/md/dm.c contains a call to blk_queue_split and we have to
check if (!bio) ... there too.

>
> And this is not a clean cherry-pick, hence it needs some explanation on
> how you solved it.
>
> Format is:
>
> [axboe: <Your explanation>]
> Something like "Context adjustment due to missing commits ..."

[amikhalitsyn: added a BIO presence checks to all blk_queue_split() callers]

>
> > Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
> > ---
> >   block/blk-merge.c             | 4 +++-
> >   block/blk-mq.c                | 3 +++
> >   drivers/block/drbd/drbd_req.c | 2 ++
> >   drivers/block/pktcdvd.c       | 2 ++
> >   drivers/block/ps3vram.c       | 2 ++
> >   drivers/md/dm.c               | 2 ++
> >   drivers/md/md.c               | 2 ++
> >   drivers/nvme/host/multipath.c | 2 ++
> >   drivers/s390/block/dcssblk.c  | 2 ++
> >   9 files changed, 20 insertions(+), 1 deletion(-)
> >
> > diff --git a/block/blk-merge.c b/block/blk-merge.c
> > index 88e39b955bd6..1af8043900f4 100644
> > --- a/block/blk-merge.c
> > +++ b/block/blk-merge.c
> > @@ -348,11 +348,13 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio,
> >               break;
> >       default:
> >               split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs);
> > +             if (IS_ERR(split))
> > +                     *bio = split = NULL;
> >               break;
> >       }
> >
> >       if (split) {
> > -             /* there isn't chance to merge the splitted bio */
> > +             /* there isn't chance to merge the split bio */
> >               split->bi_opf |= REQ_NOMERGE;
> >
> >               blkcg_bio_issue_init(split);
> > diff --git a/block/blk-mq.c b/block/blk-mq.c
> > index 7c7e632871e7..8b22429cf94e 100644
> > --- a/block/blk-mq.c
> > +++ b/block/blk-mq.c
> > @@ -2818,6 +2818,9 @@ void blk_mq_submit_bio(struct bio *bio)
> >       if (blk_may_split(q, bio))
> >               __blk_queue_split(q, &bio, &nr_segs);
> >
> > +     if (!bio)
> > +             return;
> > +
> >       if (!bio_integrity_prep(bio))
> >               return;
> >
> > diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
> > index e60d3c6314c6..f323a4714f6a 100644
> > --- a/drivers/block/drbd/drbd_req.c
> > +++ b/drivers/block/drbd/drbd_req.c
> > @@ -1609,6 +1609,8 @@ void drbd_submit_bio(struct bio *bio)
> >       struct drbd_device *device = bio->bi_bdev->bd_disk->private_data;
> >
> >       blk_queue_split(&bio);
> > +     if (!bio)
> > +             return;
> >
> >       /*
> >        * what we "blindly" assume:
> > diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
> > index 789093375344..1988bb05c0c7 100644
> > --- a/drivers/block/pktcdvd.c
> > +++ b/drivers/block/pktcdvd.c
> > @@ -2400,6 +2400,8 @@ static void pkt_submit_bio(struct bio *bio)
> >       struct bio *split;
> >
> >       blk_queue_split(&bio);
> > +     if (!bio)
> > +             return;
> >
> >       pkt_dbg(2, pd, "start = %6llx stop = %6llx\n",
> >               (unsigned long long)bio->bi_iter.bi_sector,
> > diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
> > index 4f90819e245e..2a431178dc7e 100644
> > --- a/drivers/block/ps3vram.c
> > +++ b/drivers/block/ps3vram.c
> > @@ -587,6 +587,8 @@ static void ps3vram_submit_bio(struct bio *bio)
> >       dev_dbg(&dev->core, "%s\n", __func__);
> >
> >       blk_queue_split(&bio);
> > +     if (!bio)
> > +             return;
> >
> >       spin_lock_irq(&priv->lock);
> >       busy = !bio_list_empty(&priv->list);
> > diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> > index 5acee96b5a7b..bf904c153d41 100644
> > --- a/drivers/md/dm.c
> > +++ b/drivers/md/dm.c
> > @@ -1674,6 +1674,8 @@ static void dm_split_and_process_bio(struct mapped_device *md,
> >                * otherwise associated queue_limits won't be imposed.
> >                */
> >               blk_queue_split(&bio);
> > +             if (!bio)
> > +                     return;
> >       }
> >
> >       init_clone_info(&ci, md, map, bio, is_abnormal);
> > diff --git a/drivers/md/md.c b/drivers/md/md.c
> > index 946434ced070..772a89843226 100644
> > --- a/drivers/md/md.c
> > +++ b/drivers/md/md.c
> > @@ -465,6 +465,8 @@ static void md_submit_bio(struct bio *bio)
> >       }
> >
> >       blk_queue_split(&bio);
> > +     if (!bio)
> > +             return;
> >
> >       if (mddev->ro == 1 && unlikely(rw == WRITE)) {
> >               if (bio_sectors(bio) != 0)
> > diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
> > index d62c4a0f89ab..571c4791faa8 100644
> > --- a/drivers/nvme/host/multipath.c
> > +++ b/drivers/nvme/host/multipath.c
> > @@ -351,6 +351,8 @@ static void nvme_ns_head_submit_bio(struct bio *bio)
> >        * pool from the original queue to allocate the bvecs from.
> >        */
> >       blk_queue_split(&bio);
> > +     if (!bio)
> > +             return;
> >
> >       srcu_idx = srcu_read_lock(&head->srcu);
> >       ns = nvme_find_path(head);
> > diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
> > index f4401b2d30e0..18506cc222ba 100644
> > --- a/drivers/s390/block/dcssblk.c
> > +++ b/drivers/s390/block/dcssblk.c
> > @@ -865,6 +865,8 @@ dcssblk_submit_bio(struct bio *bio)
> >       unsigned long bytes_done;
> >
> >       blk_queue_split(&bio);
> > +     if (!bio)
> > +             return;
> >
> >       bytes_done = 0;
> >       dev_info = bio->bi_bdev->bd_disk->private_data;
> Hey,
>
> I have some comments inline.

Hi Roxana,

I've replied inline. Do I need to resend this or you fix a commit
message by yourself?

Kind regards,
Alex

>
> Thanks,
> Roxana
>
> --
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Roxana Nicolescu May 31, 2023, 3:57 p.m. UTC | #3
On 31/05/2023 16:59, Aleksandr Mikhalitsyn wrote:
> On Wed, May 31, 2023 at 12:04 PM Roxana Nicolescu
> <roxana.nicolescu@canonical.com> wrote:
>>
>> On 30/05/2023 19:25, Alexander Mikhalitsyn wrote:
>>> From: Jens Axboe <axboe@kernel.dk>
>>>
>>> BugLink: https://bugs.launchpad.net/bugs/2020901
>>>
>>> commit 613b14884b8595e20b9fac4126bf627313827fbe upstream.
>>>
>>> This can't happen right now, but in preparation for allowing
>>> bio_split_to_limits() returning NULL if it ended the bio, check for it
>>> in all the callers.
>>>
>>> Signed-off-by: Jens Axboe <axboe@kernel.dk>
>>> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
>>> (backported from commit 613b14884b8595e20b9fac4126bf627313827fbe)
>> This commit message is actually 7ec9a45fc4ee7fc1054c2cabf8b09a6bc708472e
> ah, yep, SOB of Greg is incorrect, but commit hash
> 613b14884b8595e20b9fac4126bf627313827fbe is the right one.
> Just take a look:
> https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=613b14884b8595e20b9fac4126bf627313827fbe
> and compare changes.
>> from the stable tree. I see it has the sob of Greg. The one in mainline
>> does not have it.
>> But the commit in the stable tree does not contain drivers/md/dm.c
>> changes, so I am not sure which commit you actually applied here.
Apologize, I think I meant pktcdvd here in my previous reply.

As discussed in private, the check in drivers/block/pktcdvd.c  is added 
in a separate commit,

so a separate submission that includes that patch as well will be sent.

> yes, because our kernel tree is not the same as any -stable or
> upstream. I've ported changes properly.
> drivers/md/dm.c contains a call to blk_queue_split and we have to
> check if (!bio) ... there too.
>
>> And this is not a clean cherry-pick, hence it needs some explanation on
>> how you solved it.
>>
>> Format is:
>>
>> [axboe: <Your explanation>]
>> Something like "Context adjustment due to missing commits ..."
> [amikhalitsyn: added a BIO presence checks to all blk_queue_split() callers]

>>> Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
>>> ---
>>>    block/blk-merge.c             | 4 +++-
>>>    block/blk-mq.c                | 3 +++
>>>    drivers/block/drbd/drbd_req.c | 2 ++
>>>    drivers/block/pktcdvd.c       | 2 ++
>>>    drivers/block/ps3vram.c       | 2 ++
>>>    drivers/md/dm.c               | 2 ++
>>>    drivers/md/md.c               | 2 ++
>>>    drivers/nvme/host/multipath.c | 2 ++
>>>    drivers/s390/block/dcssblk.c  | 2 ++
>>>    9 files changed, 20 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/block/blk-merge.c b/block/blk-merge.c
>>> index 88e39b955bd6..1af8043900f4 100644
>>> --- a/block/blk-merge.c
>>> +++ b/block/blk-merge.c
>>> @@ -348,11 +348,13 @@ void __blk_queue_split(struct request_queue *q, struct bio **bio,
>>>                break;
>>>        default:
>>>                split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs);
>>> +             if (IS_ERR(split))
>>> +                     *bio = split = NULL;
>>>                break;
>>>        }
>>>
>>>        if (split) {
>>> -             /* there isn't chance to merge the splitted bio */
>>> +             /* there isn't chance to merge the split bio */
>>>                split->bi_opf |= REQ_NOMERGE;
>>>
>>>                blkcg_bio_issue_init(split);
>>> diff --git a/block/blk-mq.c b/block/blk-mq.c
>>> index 7c7e632871e7..8b22429cf94e 100644
>>> --- a/block/blk-mq.c
>>> +++ b/block/blk-mq.c
>>> @@ -2818,6 +2818,9 @@ void blk_mq_submit_bio(struct bio *bio)
>>>        if (blk_may_split(q, bio))
>>>                __blk_queue_split(q, &bio, &nr_segs);
>>>
>>> +     if (!bio)
>>> +             return;
>>> +
>>>        if (!bio_integrity_prep(bio))
>>>                return;
>>>
>>> diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
>>> index e60d3c6314c6..f323a4714f6a 100644
>>> --- a/drivers/block/drbd/drbd_req.c
>>> +++ b/drivers/block/drbd/drbd_req.c
>>> @@ -1609,6 +1609,8 @@ void drbd_submit_bio(struct bio *bio)
>>>        struct drbd_device *device = bio->bi_bdev->bd_disk->private_data;
>>>
>>>        blk_queue_split(&bio);
>>> +     if (!bio)
>>> +             return;
>>>
>>>        /*
>>>         * what we "blindly" assume:
>>> diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
>>> index 789093375344..1988bb05c0c7 100644
>>> --- a/drivers/block/pktcdvd.c
>>> +++ b/drivers/block/pktcdvd.c
>>> @@ -2400,6 +2400,8 @@ static void pkt_submit_bio(struct bio *bio)
>>>        struct bio *split;
>>>
>>>        blk_queue_split(&bio);
>>> +     if (!bio)
>>> +             return;
>>>
>>>        pkt_dbg(2, pd, "start = %6llx stop = %6llx\n",
>>>                (unsigned long long)bio->bi_iter.bi_sector,
>>> diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
>>> index 4f90819e245e..2a431178dc7e 100644
>>> --- a/drivers/block/ps3vram.c
>>> +++ b/drivers/block/ps3vram.c
>>> @@ -587,6 +587,8 @@ static void ps3vram_submit_bio(struct bio *bio)
>>>        dev_dbg(&dev->core, "%s\n", __func__);
>>>
>>>        blk_queue_split(&bio);
>>> +     if (!bio)
>>> +             return;
>>>
>>>        spin_lock_irq(&priv->lock);
>>>        busy = !bio_list_empty(&priv->list);
>>> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
>>> index 5acee96b5a7b..bf904c153d41 100644
>>> --- a/drivers/md/dm.c
>>> +++ b/drivers/md/dm.c
>>> @@ -1674,6 +1674,8 @@ static void dm_split_and_process_bio(struct mapped_device *md,
>>>                 * otherwise associated queue_limits won't be imposed.
>>>                 */
>>>                blk_queue_split(&bio);
>>> +             if (!bio)
>>> +                     return;
>>>        }
>>>
>>>        init_clone_info(&ci, md, map, bio, is_abnormal);
>>> diff --git a/drivers/md/md.c b/drivers/md/md.c
>>> index 946434ced070..772a89843226 100644
>>> --- a/drivers/md/md.c
>>> +++ b/drivers/md/md.c
>>> @@ -465,6 +465,8 @@ static void md_submit_bio(struct bio *bio)
>>>        }
>>>
>>>        blk_queue_split(&bio);
>>> +     if (!bio)
>>> +             return;
>>>
>>>        if (mddev->ro == 1 && unlikely(rw == WRITE)) {
>>>                if (bio_sectors(bio) != 0)
>>> diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
>>> index d62c4a0f89ab..571c4791faa8 100644
>>> --- a/drivers/nvme/host/multipath.c
>>> +++ b/drivers/nvme/host/multipath.c
>>> @@ -351,6 +351,8 @@ static void nvme_ns_head_submit_bio(struct bio *bio)
>>>         * pool from the original queue to allocate the bvecs from.
>>>         */
>>>        blk_queue_split(&bio);
>>> +     if (!bio)
>>> +             return;
>>>
>>>        srcu_idx = srcu_read_lock(&head->srcu);
>>>        ns = nvme_find_path(head);
>>> diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
>>> index f4401b2d30e0..18506cc222ba 100644
>>> --- a/drivers/s390/block/dcssblk.c
>>> +++ b/drivers/s390/block/dcssblk.c
>>> @@ -865,6 +865,8 @@ dcssblk_submit_bio(struct bio *bio)
>>>        unsigned long bytes_done;
>>>
>>>        blk_queue_split(&bio);
>>> +     if (!bio)
>>> +             return;
>>>
>>>        bytes_done = 0;
>>>        dev_info = bio->bi_bdev->bd_disk->private_data;
>> Hey,
>>
>> I have some comments inline.
> Hi Roxana,
>
> I've replied inline. Do I need to resend this or you fix a commit
> message by yourself?
>
> Kind regards,
> Alex
>
>> Thanks,
>> Roxana
>>
>> --
>> kernel-team mailing list
>> kernel-team@lists.ubuntu.com
>> https://lists.ubuntu.com/mailman/listinfo/kernel-team
diff mbox series

Patch

diff --git a/block/blk-merge.c b/block/blk-merge.c
index 88e39b955bd6..1af8043900f4 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -348,11 +348,13 @@  void __blk_queue_split(struct request_queue *q, struct bio **bio,
 		break;
 	default:
 		split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs);
+		if (IS_ERR(split))
+			*bio = split = NULL;
 		break;
 	}
 
 	if (split) {
-		/* there isn't chance to merge the splitted bio */
+		/* there isn't chance to merge the split bio */
 		split->bi_opf |= REQ_NOMERGE;
 
 		blkcg_bio_issue_init(split);
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 7c7e632871e7..8b22429cf94e 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2818,6 +2818,9 @@  void blk_mq_submit_bio(struct bio *bio)
 	if (blk_may_split(q, bio))
 		__blk_queue_split(q, &bio, &nr_segs);
 
+	if (!bio)
+		return;
+
 	if (!bio_integrity_prep(bio))
 		return;
 
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index e60d3c6314c6..f323a4714f6a 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -1609,6 +1609,8 @@  void drbd_submit_bio(struct bio *bio)
 	struct drbd_device *device = bio->bi_bdev->bd_disk->private_data;
 
 	blk_queue_split(&bio);
+	if (!bio)
+		return;
 
 	/*
 	 * what we "blindly" assume:
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 789093375344..1988bb05c0c7 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -2400,6 +2400,8 @@  static void pkt_submit_bio(struct bio *bio)
 	struct bio *split;
 
 	blk_queue_split(&bio);
+	if (!bio)
+		return;
 
 	pkt_dbg(2, pd, "start = %6llx stop = %6llx\n",
 		(unsigned long long)bio->bi_iter.bi_sector,
diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
index 4f90819e245e..2a431178dc7e 100644
--- a/drivers/block/ps3vram.c
+++ b/drivers/block/ps3vram.c
@@ -587,6 +587,8 @@  static void ps3vram_submit_bio(struct bio *bio)
 	dev_dbg(&dev->core, "%s\n", __func__);
 
 	blk_queue_split(&bio);
+	if (!bio)
+		return;
 
 	spin_lock_irq(&priv->lock);
 	busy = !bio_list_empty(&priv->list);
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 5acee96b5a7b..bf904c153d41 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1674,6 +1674,8 @@  static void dm_split_and_process_bio(struct mapped_device *md,
 		 * otherwise associated queue_limits won't be imposed.
 		 */
 		blk_queue_split(&bio);
+		if (!bio)
+			return;
 	}
 
 	init_clone_info(&ci, md, map, bio, is_abnormal);
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 946434ced070..772a89843226 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -465,6 +465,8 @@  static void md_submit_bio(struct bio *bio)
 	}
 
 	blk_queue_split(&bio);
+	if (!bio)
+		return;
 
 	if (mddev->ro == 1 && unlikely(rw == WRITE)) {
 		if (bio_sectors(bio) != 0)
diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index d62c4a0f89ab..571c4791faa8 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -351,6 +351,8 @@  static void nvme_ns_head_submit_bio(struct bio *bio)
 	 * pool from the original queue to allocate the bvecs from.
 	 */
 	blk_queue_split(&bio);
+	if (!bio)
+		return;
 
 	srcu_idx = srcu_read_lock(&head->srcu);
 	ns = nvme_find_path(head);
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index f4401b2d30e0..18506cc222ba 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -865,6 +865,8 @@  dcssblk_submit_bio(struct bio *bio)
 	unsigned long bytes_done;
 
 	blk_queue_split(&bio);
+	if (!bio)
+		return;
 
 	bytes_done = 0;
 	dev_info = bio->bi_bdev->bd_disk->private_data;