diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-03-16 19:27:08 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-03-16 19:27:08 -0500 |
| commit | abc71c46dc0a12ab7fddc18cfe4f4aa26808c79b (patch) | |
| tree | b0c846052b994d57d58713a0cc8da30a22baaf1c /fs/nfs/direct.c | |
| parent | 30dcbf29cc6d92d70fa262e79e84011fe6913bed (diff) | |
| parent | 232a347a444e687b5f8cf0f6485704db1c6024d3 (diff) | |
Merge branch 'upstream-fixes'
Diffstat (limited to 'fs/nfs/direct.c')
| -rw-r--r-- | fs/nfs/direct.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 04ab2fc360e7..4e9b3a1b36c5 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
| @@ -57,6 +57,7 @@ | |||
| 57 | #define NFSDBG_FACILITY NFSDBG_VFS | 57 | #define NFSDBG_FACILITY NFSDBG_VFS |
| 58 | #define MAX_DIRECTIO_SIZE (4096UL << PAGE_SHIFT) | 58 | #define MAX_DIRECTIO_SIZE (4096UL << PAGE_SHIFT) |
| 59 | 59 | ||
| 60 | static void nfs_free_user_pages(struct page **pages, int npages, int do_dirty); | ||
| 60 | static kmem_cache_t *nfs_direct_cachep; | 61 | static kmem_cache_t *nfs_direct_cachep; |
| 61 | 62 | ||
| 62 | /* | 63 | /* |
| @@ -107,6 +108,15 @@ nfs_get_user_pages(int rw, unsigned long user_addr, size_t size, | |||
| 107 | page_count, (rw == READ), 0, | 108 | page_count, (rw == READ), 0, |
| 108 | *pages, NULL); | 109 | *pages, NULL); |
| 109 | up_read(¤t->mm->mmap_sem); | 110 | up_read(¤t->mm->mmap_sem); |
| 111 | /* | ||
| 112 | * If we got fewer pages than expected from get_user_pages(), | ||
| 113 | * the user buffer runs off the end of a mapping; return EFAULT. | ||
| 114 | */ | ||
| 115 | if (result >= 0 && result < page_count) { | ||
| 116 | nfs_free_user_pages(*pages, result, 0); | ||
| 117 | *pages = NULL; | ||
| 118 | result = -EFAULT; | ||
| 119 | } | ||
| 110 | } | 120 | } |
| 111 | return result; | 121 | return result; |
| 112 | } | 122 | } |
