pnfsblock: limit bio page count
authorPeng Tao <bergwolf@gmail.com>
Thu, 12 Jan 2012 15:18:48 +0000 (23:18 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 26 Jan 2012 00:13:37 +0000 (16:13 -0800)
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

index ce8129d..3db6b82 100644 (file)
@@ -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;
 }