diff options
Diffstat (limited to 'mm/process_vm_access.c')
-rw-r--r-- | mm/process_vm_access.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c index 07514d41ebcc..be8dc8d1edb9 100644 --- a/mm/process_vm_access.c +++ b/mm/process_vm_access.c | |||
@@ -88,12 +88,16 @@ static int process_vm_rw_single_vec(unsigned long addr, | |||
88 | ssize_t rc = 0; | 88 | ssize_t rc = 0; |
89 | unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES | 89 | unsigned long max_pages_per_loop = PVM_MAX_KMALLOC_PAGES |
90 | / sizeof(struct pages *); | 90 | / sizeof(struct pages *); |
91 | unsigned int flags = FOLL_REMOTE; | ||
91 | 92 | ||
92 | /* Work out address and page range required */ | 93 | /* Work out address and page range required */ |
93 | if (len == 0) | 94 | if (len == 0) |
94 | return 0; | 95 | return 0; |
95 | nr_pages = (addr + len - 1) / PAGE_SIZE - addr / PAGE_SIZE + 1; | 96 | nr_pages = (addr + len - 1) / PAGE_SIZE - addr / PAGE_SIZE + 1; |
96 | 97 | ||
98 | if (vm_write) | ||
99 | flags |= FOLL_WRITE; | ||
100 | |||
97 | while (!rc && nr_pages && iov_iter_count(iter)) { | 101 | while (!rc && nr_pages && iov_iter_count(iter)) { |
98 | int pages = min(nr_pages, max_pages_per_loop); | 102 | int pages = min(nr_pages, max_pages_per_loop); |
99 | size_t bytes; | 103 | size_t bytes; |
@@ -104,8 +108,7 @@ static int process_vm_rw_single_vec(unsigned long addr, | |||
104 | * current/current->mm | 108 | * current/current->mm |
105 | */ | 109 | */ |
106 | pages = __get_user_pages_unlocked(task, mm, pa, pages, | 110 | pages = __get_user_pages_unlocked(task, mm, pa, pages, |
107 | vm_write, 0, process_pages, | 111 | process_pages, flags); |
108 | FOLL_REMOTE); | ||
109 | if (pages <= 0) | 112 | if (pages <= 0) |
110 | return -EFAULT; | 113 | return -EFAULT; |
111 | 114 | ||