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:4.155 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site