| From 74a6eeb44ca6174d9cc93b9b8b4d58211c57bc80 Mon Sep 17 00:00:00 2001 |
| From: Peng Tao <bergwolf@gmail.com> |
| Date: Thu, 12 Jan 2012 23:18:48 +0800 |
| Subject: pnfsblock: limit bio page count |
| |
| From: Peng Tao <bergwolf@gmail.com> |
| |
| commit 74a6eeb44ca6174d9cc93b9b8b4d58211c57bc80 upstream. |
| |
| One bio can have at most BIO_MAX_PAGES pages. We should limit it bec otherwise |
| bio_alloc will fail when there are many pages in one read/write_pagelist. |
| |
| Signed-off-by: Peng Tao <peng_tao@emc.com> |
| Signed-off-by: Benny Halevy <bhalevy@tonian.com> |
| Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/nfs/blocklayout/blocklayout.c | 17 +++++++++++------ |
| 1 file changed, 11 insertions(+), 6 deletions(-) |
| |
| --- a/fs/nfs/blocklayout/blocklayout.c |
| +++ b/fs/nfs/blocklayout/blocklayout.c |
| @@ -146,14 +146,19 @@ static struct bio *bl_alloc_init_bio(int |
| { |
| struct bio *bio; |
| |
| + npg = min(npg, BIO_MAX_PAGES); |
| bio = bio_alloc(GFP_NOIO, npg); |
| - if (!bio) |
| - return NULL; |
| + if (!bio && (current->flags & PF_MEMALLOC)) { |
| + while (!bio && (npg /= 2)) |
| + bio = bio_alloc(GFP_NOIO, npg); |
| + } |
| |
| - bio->bi_sector = isect - be->be_f_offset + be->be_v_offset; |
| - bio->bi_bdev = be->be_mdev; |
| - bio->bi_end_io = end_io; |
| - bio->bi_private = par; |
| + if (bio) { |
| + bio->bi_sector = isect - be->be_f_offset + be->be_v_offset; |
| + bio->bi_bdev = be->be_mdev; |
| + bio->bi_end_io = end_io; |
| + bio->bi_private = par; |
| + } |
| return bio; |
| } |
| |