|
Lines 55-61
Link Here
|
| 55 |
#include <asm/atomic.h> |
55 |
#include <asm/atomic.h> |
| 56 |
|
56 |
|
| 57 |
#define NFSDBG_FACILITY NFSDBG_VFS |
57 |
#define NFSDBG_FACILITY NFSDBG_VFS |
| 58 |
#define MAX_DIRECTIO_SIZE (4096UL << PAGE_SHIFT) |
58 |
#define MAX_DIRECTIO_PAGES (1 << 24) |
| 59 |
|
59 |
|
| 60 |
static void nfs_free_user_pages(struct page **pages, int npages, int do_dirty); |
60 |
static void nfs_free_user_pages(struct page **pages, int npages, int do_dirty); |
| 61 |
static kmem_cache_t *nfs_direct_cachep; |
61 |
static kmem_cache_t *nfs_direct_cachep; |
|
Lines 90-105
nfs_get_user_pages(int rw, unsigned long
Link Here
|
| 90 |
unsigned long page_count; |
90 |
unsigned long page_count; |
| 91 |
size_t array_size; |
91 |
size_t array_size; |
| 92 |
|
92 |
|
|
|
93 |
page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT; |
| 94 |
page_count -= user_addr >> PAGE_SHIFT; |
| 95 |
|
| 93 |
/* set an arbitrary limit to prevent type overflow */ |
96 |
/* set an arbitrary limit to prevent type overflow */ |
| 94 |
/* XXX: this can probably be as large as INT_MAX */ |
97 |
if (page_count >= MAX_DIRECTIO_PAGES) { |
| 95 |
if (size > MAX_DIRECTIO_SIZE) { |
|
|
| 96 |
*pages = NULL; |
98 |
*pages = NULL; |
| 97 |
return -EFBIG; |
99 |
return -EINVAL; |
| 98 |
} |
100 |
} |
| 99 |
|
101 |
|
| 100 |
page_count = (user_addr + size + PAGE_SIZE - 1) >> PAGE_SHIFT; |
|
|
| 101 |
page_count -= user_addr >> PAGE_SHIFT; |
| 102 |
|
| 103 |
array_size = (page_count * sizeof(struct page *)); |
102 |
array_size = (page_count * sizeof(struct page *)); |
| 104 |
*pages = kmalloc(array_size, GFP_KERNEL); |
103 |
*pages = kmalloc(array_size, GFP_KERNEL); |
| 105 |
if (*pages) { |
104 |
if (*pages) { |