diff options
Diffstat (limited to 'recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.2/0079-pnfsblock-limit-bio-page-count.patch')
-rw-r--r-- | recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.2/0079-pnfsblock-limit-bio-page-count.patch | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.2/0079-pnfsblock-limit-bio-page-count.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.2/0079-pnfsblock-limit-bio-page-count.patch new file mode 100644 index 00000000..74d1d69d --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.2/0079-pnfsblock-limit-bio-page-count.patch | |||
@@ -0,0 +1,51 @@ | |||
1 | From 4ebc5f6665b0d03c9488fafb7ac6f8bd2f104d70 Mon Sep 17 00:00:00 2001 | ||
2 | From: Peng Tao <bergwolf@gmail.com> | ||
3 | Date: Thu, 12 Jan 2012 23:18:48 +0800 | ||
4 | Subject: [PATCH 079/130] pnfsblock: limit bio page count | ||
5 | |||
6 | commit 74a6eeb44ca6174d9cc93b9b8b4d58211c57bc80 upstream. | ||
7 | |||
8 | One bio can have at most BIO_MAX_PAGES pages. We should limit it bec otherwise | ||
9 | bio_alloc will fail when there are many pages in one read/write_pagelist. | ||
10 | |||
11 | Signed-off-by: Peng Tao <peng_tao@emc.com> | ||
12 | Signed-off-by: Benny Halevy <bhalevy@tonian.com> | ||
13 | Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> | ||
14 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | ||
15 | --- | ||
16 | fs/nfs/blocklayout/blocklayout.c | 17 +++++++++++------ | ||
17 | 1 files changed, 11 insertions(+), 6 deletions(-) | ||
18 | |||
19 | diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c | ||
20 | index ce8129d..3db6b82 100644 | ||
21 | --- a/fs/nfs/blocklayout/blocklayout.c | ||
22 | +++ b/fs/nfs/blocklayout/blocklayout.c | ||
23 | @@ -146,14 +146,19 @@ static struct bio *bl_alloc_init_bio(int npg, sector_t isect, | ||
24 | { | ||
25 | struct bio *bio; | ||
26 | |||
27 | + npg = min(npg, BIO_MAX_PAGES); | ||
28 | bio = bio_alloc(GFP_NOIO, npg); | ||
29 | - if (!bio) | ||
30 | - return NULL; | ||
31 | + if (!bio && (current->flags & PF_MEMALLOC)) { | ||
32 | + while (!bio && (npg /= 2)) | ||
33 | + bio = bio_alloc(GFP_NOIO, npg); | ||
34 | + } | ||
35 | |||
36 | - bio->bi_sector = isect - be->be_f_offset + be->be_v_offset; | ||
37 | - bio->bi_bdev = be->be_mdev; | ||
38 | - bio->bi_end_io = end_io; | ||
39 | - bio->bi_private = par; | ||
40 | + if (bio) { | ||
41 | + bio->bi_sector = isect - be->be_f_offset + be->be_v_offset; | ||
42 | + bio->bi_bdev = be->be_mdev; | ||
43 | + bio->bi_end_io = end_io; | ||
44 | + bio->bi_private = par; | ||
45 | + } | ||
46 | return bio; | ||
47 | } | ||
48 | |||
49 | -- | ||
50 | 1.7.7.4 | ||
51 | |||