From 42deb13e3bc6a6bcc461366aece3a8bdf6cf3293 Mon Sep 17 00:00:00 2001 From: Peng Tao Date: Thu, 12 Jan 2012 23:18:48 +0800 Subject: [PATCH] --- yaml --- r: 285867 b: refs/heads/master c: 74a6eeb44ca6174d9cc93b9b8b4d58211c57bc80 h: refs/heads/master i: 285865: 17053d1b4ee3854ec4e452307302bb49aed8f60a 285863: 73eea20c18cc202dc21d97a4ad17b0ef1211ced8 v: v3 --- [refs] | 2 +- trunk/fs/nfs/blocklayout/blocklayout.c | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 470b8b9121ea..c16db689c184 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 93a3844ee0f843b05a1df4b52e1a19ff26b98d24 +refs/heads/master: 74a6eeb44ca6174d9cc93b9b8b4d58211c57bc80 diff --git a/trunk/fs/nfs/blocklayout/blocklayout.c b/trunk/fs/nfs/blocklayout/blocklayout.c index 6d39e9ab1e64..baf0bf2acbd4 100644 --- a/trunk/fs/nfs/blocklayout/blocklayout.c +++ b/trunk/fs/nfs/blocklayout/blocklayout.c @@ -146,14 +146,19 @@ static struct bio *bl_alloc_init_bio(int npg, sector_t isect, { 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; }