diff options
Diffstat (limited to 'fs/direct-io.c')
| -rw-r--r-- | fs/direct-io.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/fs/direct-io.c b/fs/direct-io.c index 85882f6ba5f7..b044705eedd4 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -325,12 +325,16 @@ void dio_end_io(struct bio *bio, int error)  }  EXPORT_SYMBOL_GPL(dio_end_io); -static int +static void  dio_bio_alloc(struct dio *dio, struct block_device *bdev,  		sector_t first_sector, int nr_vecs)  {  	struct bio *bio; +	/* +	 * bio_alloc() is guaranteed to return a bio when called with +	 * __GFP_WAIT and we request a valid number of vectors. +	 */  	bio = bio_alloc(GFP_KERNEL, nr_vecs);  	bio->bi_bdev = bdev; @@ -342,7 +346,6 @@ dio_bio_alloc(struct dio *dio, struct block_device *bdev,  	dio->bio = bio;  	dio->logical_offset_in_bio = dio->cur_page_fs_offset; -	return 0;  }  /* @@ -583,8 +586,9 @@ 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_bio_alloc(dio, dio->map_bh.b_bdev, sector, nr_pages);  	dio->boundary = 0;  out:  	return ret; |