lkml.org 
[lkml]   [2011]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subjectfs/direct-io.c: don't try to allocate more than BIO_MAX_PAGES in a bio
From
Date
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.


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);
BUG_ON(nr_pages <= 0);
ret = dio_bio_alloc(dio, dio->map_bh.b_bdev, sector, nr_pages);
dio->boundary = 0;



\
 
 \ /
  Last update: 2011-01-14 05:39    [W:2.386 / U:0.168 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site