View | Details | Raw Unified | Return to bug 149905
Collapse All | Expand All

(-)build/fs/nfs/direct.c (-7 / +6 lines)
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) {

Return to bug 149905