From mboxrd@z Thu Jan 1 00:00:00 1970 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 Message-ID: References: <1294977946.21790.20.camel@obelisk.thedillows.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org To: David Dillow Return-path: Received: from mx1.redhat.com ([209.132.183.28]:39922 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751928Ab1ANOoh (ORCPT ); Fri, 14 Jan 2011 09:44:37 -0500 In-Reply-To: <1294977946.21790.20.camel@obelisk.thedillows.org> (David Dillow's message of "Thu, 13 Jan 2011 23:05:46 -0500") Sender: linux-fsdevel-owner@vger.kernel.org List-ID: David Dillow 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 > -- > 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