Skip to contentSkip to conversation

fs/bio.c:363 bio_alloc_bioset() error: we previously assumed 'bs' could be nul

PATCH In review Fengguang Wu 3 participants 3 messages Sep 9, 2012 – Sep 17, 2012 Kernel janitors

lore
Share & tools
lore
#0 lore raw

PATCH 7/35 fs/bio.c:363 bio_alloc_bioset() error: we previously assumed 'bs' could be nul

Hi Kent,

FYI, there are new smatch warnings show up in

tree:   git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
head:   5611a9dbd54b993fe24f322a0c310a6605824c0f
commit: 3f86a82aeb03e6100f7ab39f4702e033a5e38166 [7/35] block: Consolidate bio_alloc_bioset(), bio_kmalloc()

All smatch warnings:

+ fs/bio.c:363 bio_alloc_bioset() error: we previously assumed 'bs' could be null (see line 327) arch/x86/include/asm/jump_label.h:25 arch_static_branch() info: ignoring unreachable code.

---
0-DAY kernel build testing backend Open Source Technology Centre
Fengguang Wu <[email protected]> Intel Corporation

#1 lore raw

Re: [block:for-next 7/35] fs/bio.c:363 bio_alloc_bioset() error: we previously assumed 'bs' could be

Quoted 7 lines · Fengguang Wu

Hi Kent,

FYI, there are new smatch warnings show up in

tree:   git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
head:   5611a9dbd54b993fe24f322a0c310a6605824c0f
commit: 3f86a82aeb03e6100f7ab39f4702e033a5e38166 [7/35] block: Consolidate bio_alloc_bioset(), bio_kmalloc()

The logic in there does look both confusing and broken.

For !bs, we should not enter the bvec_alloc_bs() part. We already have the vec, plus bvec_alloc_bs() would crap out for !bs. That would exclude us from hitting err_free as well.

Style issue on nr_iovecs check, too.

Signature · 1 line
Jens Axboe
#2 lore raw

Re: [block:for-next 7/35] fs/bio.c:363 bio_alloc_bioset() error: we previously assumed 'bs' could be

In reply to Fengguang Wu
Quoted 9 lines · Jens Axboe
Quoted 7 lines · Fengguang Wu

Hi Kent,

FYI, there are new smatch warnings show up in

tree:   git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next
head:   5611a9dbd54b993fe24f322a0c310a6605824c0f
commit: 3f86a82aeb03e6100f7ab39f4702e033a5e38166 [7/35] block: Consolidate bio_alloc_bioset(), bio_kmalloc()
Quoted 5 lines

The logic in there does look both confusing and broken.

For !bs, we should not enter the bvec_alloc_bs() part. We already have the vec, plus bvec_alloc_bs() would crap out for !bs. That would exclude us from hitting err_free as well.

Yeah, it is confusing, I wasn't entirely happy with that code but I wasn't able to come up with anything I really liked.

The reason I wrote it the way I did is that before, bio_kmalloc() would always set bio->bi_io_vec = bio->bi_inline_vecs, even when nr_iovecs was 0, while bio_alloc_bioset() would set it to NULL.

And this is what bio_has_data() checks, which is actually used in a decent number of places.

So I wanted to unify the behaviour as much as possible, and not have duplicated code that could get out of sync again.

Jens, what do you want to do? If you'd prefer I could always split out the two cases (bs and !bs) entirely and just note the bi_io_vec thing with a comment, though I do lean toward smaller code.

Also wondering whether it'd be feasible/worthwhile to just drop bio_kmalloc() entirely and always use a bio_set.

Quoted 1 line

Style issue on nr_iovecs check, too.

How so? Not aware of any formal style rule it breaks...