Messages in this thread | | | From | Jeff Moyer <> | Subject | Re: fs/direct-io.c: don't try to allocate more than BIO_MAX_PAGES in a bio | Date | Fri, 14 Jan 2011 09:44:33 -0500 |
| |
David Dillow <dillowda@ornl.gov> writes:
> When using devices that support max_segments > BIO_MAX_PAGES (256), > direct IO tries to allocate a bio with more pages than allowed, which > leads to an oops in dio_bio_alloc(). Clamp that request to the supported > maximum. > > Signed-off-by: David Dillow <dillowda@ornl.gov> > -- > dio_bio_alloc() doesn't check the result of bio_alloc(), so it > dereferences a NULL pointer. bio_alloc(GFP_KERNEL, ...) doesn't fail > unless it gets called for an invalid number of pages, so it seems a bit > like overkill to check for failure in dio_bio_alloc(), though it would > have saved me some time tracking this down.
We should always be checking return values. Mind respinning the patch to include that?
> diff --git a/fs/direct-io.c b/fs/direct-io.c > index 85882f6..9eb0553 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -583,6 +583,7 @@ static int dio_new_bio(struct dio *dio, sector_t start_sector) > goto out; > sector = start_sector << (dio->blkbits - 9); > nr_pages = min(dio->pages_in_io, bio_get_nr_vecs(dio->map_bh.b_bdev)); > + nr_pages = min(nr_pages, BIO_MAX_PAGES);
This looks fine. Thanks for tracking it down!
Cheers, Jeff
| |