diff options
125 files changed, 792 insertions, 1478 deletions
diff --git a/Documentation/printk-formats.txt b/Documentation/printk-formats.txt index b784c270105f..6389551bbad6 100644 --- a/Documentation/printk-formats.txt +++ b/Documentation/printk-formats.txt | |||
@@ -250,6 +250,12 @@ dentry names: | |||
250 | 250 | ||
251 | Passed by reference. | 251 | Passed by reference. |
252 | 252 | ||
253 | block_device names: | ||
254 | |||
255 | %pg sda, sda1 or loop0p1 | ||
256 | |||
257 | For printing name of block_device pointers. | ||
258 | |||
253 | struct va_format: | 259 | struct va_format: |
254 | 260 | ||
255 | %pV | 261 | %pV |
diff --git a/arch/blackfin/include/asm/uaccess.h b/arch/blackfin/include/asm/uaccess.h index 90612a7f2cf3..12f5d6851bbc 100644 --- a/arch/blackfin/include/asm/uaccess.h +++ b/arch/blackfin/include/asm/uaccess.h | |||
@@ -168,12 +168,6 @@ static inline int bad_user_access_length(void) | |||
168 | #define __copy_to_user_inatomic __copy_to_user | 168 | #define __copy_to_user_inatomic __copy_to_user |
169 | #define __copy_from_user_inatomic __copy_from_user | 169 | #define __copy_from_user_inatomic __copy_from_user |
170 | 170 | ||
171 | #define copy_to_user_ret(to, from, n, retval) ({ if (copy_to_user(to, from, n))\ | ||
172 | return retval; }) | ||
173 | |||
174 | #define copy_from_user_ret(to, from, n, retval) ({ if (copy_from_user(to, from, n))\ | ||
175 | return retval; }) | ||
176 | |||
177 | static inline unsigned long __must_check | 171 | static inline unsigned long __must_check |
178 | copy_from_user(void *to, const void __user *from, unsigned long n) | 172 | copy_from_user(void *to, const void __user *from, unsigned long n) |
179 | { | 173 | { |
diff --git a/arch/m68k/include/asm/uaccess_no.h b/arch/m68k/include/asm/uaccess_no.h index 68bbe9b312f1..1bdf15263754 100644 --- a/arch/m68k/include/asm/uaccess_no.h +++ b/arch/m68k/include/asm/uaccess_no.h | |||
@@ -135,10 +135,6 @@ extern int __get_user_bad(void); | |||
135 | #define __copy_to_user_inatomic __copy_to_user | 135 | #define __copy_to_user_inatomic __copy_to_user |
136 | #define __copy_from_user_inatomic __copy_from_user | 136 | #define __copy_from_user_inatomic __copy_from_user |
137 | 137 | ||
138 | #define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; }) | ||
139 | |||
140 | #define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; }) | ||
141 | |||
142 | /* | 138 | /* |
143 | * Copy a null terminated string from userspace. | 139 | * Copy a null terminated string from userspace. |
144 | */ | 140 | */ |
diff --git a/arch/mips/lasat/picvue_proc.c b/arch/mips/lasat/picvue_proc.c index 2bcd8391bc93..b42095880667 100644 --- a/arch/mips/lasat/picvue_proc.c +++ b/arch/mips/lasat/picvue_proc.c | |||
@@ -22,7 +22,6 @@ | |||
22 | static DEFINE_MUTEX(pvc_mutex); | 22 | static DEFINE_MUTEX(pvc_mutex); |
23 | static char pvc_lines[PVC_NLINES][PVC_LINELEN+1]; | 23 | static char pvc_lines[PVC_NLINES][PVC_LINELEN+1]; |
24 | static int pvc_linedata[PVC_NLINES]; | 24 | static int pvc_linedata[PVC_NLINES]; |
25 | static struct proc_dir_entry *pvc_display_dir; | ||
26 | static char *pvc_linename[PVC_NLINES] = {"line1", "line2"}; | 25 | static char *pvc_linename[PVC_NLINES] = {"line1", "line2"}; |
27 | #define DISPLAY_DIR_NAME "display" | 26 | #define DISPLAY_DIR_NAME "display" |
28 | static int scroll_dir, scroll_interval; | 27 | static int scroll_dir, scroll_interval; |
@@ -169,22 +168,17 @@ void pvc_proc_timerfunc(unsigned long data) | |||
169 | 168 | ||
170 | static void pvc_proc_cleanup(void) | 169 | static void pvc_proc_cleanup(void) |
171 | { | 170 | { |
172 | int i; | 171 | remove_proc_subtree(DISPLAY_DIR_NAME, NULL); |
173 | for (i = 0; i < PVC_NLINES; i++) | ||
174 | remove_proc_entry(pvc_linename[i], pvc_display_dir); | ||
175 | remove_proc_entry("scroll", pvc_display_dir); | ||
176 | remove_proc_entry(DISPLAY_DIR_NAME, NULL); | ||
177 | |||
178 | del_timer_sync(&timer); | 172 | del_timer_sync(&timer); |
179 | } | 173 | } |
180 | 174 | ||
181 | static int __init pvc_proc_init(void) | 175 | static int __init pvc_proc_init(void) |
182 | { | 176 | { |
183 | struct proc_dir_entry *proc_entry; | 177 | struct proc_dir_entry *dir, *proc_entry; |
184 | int i; | 178 | int i; |
185 | 179 | ||
186 | pvc_display_dir = proc_mkdir(DISPLAY_DIR_NAME, NULL); | 180 | dir = proc_mkdir(DISPLAY_DIR_NAME, NULL); |
187 | if (pvc_display_dir == NULL) | 181 | if (dir == NULL) |
188 | goto error; | 182 | goto error; |
189 | 183 | ||
190 | for (i = 0; i < PVC_NLINES; i++) { | 184 | for (i = 0; i < PVC_NLINES; i++) { |
@@ -192,12 +186,12 @@ static int __init pvc_proc_init(void) | |||
192 | pvc_linedata[i] = i; | 186 | pvc_linedata[i] = i; |
193 | } | 187 | } |
194 | for (i = 0; i < PVC_NLINES; i++) { | 188 | for (i = 0; i < PVC_NLINES; i++) { |
195 | proc_entry = proc_create_data(pvc_linename[i], 0644, pvc_display_dir, | 189 | proc_entry = proc_create_data(pvc_linename[i], 0644, dir, |
196 | &pvc_line_proc_fops, &pvc_linedata[i]); | 190 | &pvc_line_proc_fops, &pvc_linedata[i]); |
197 | if (proc_entry == NULL) | 191 | if (proc_entry == NULL) |
198 | goto error; | 192 | goto error; |
199 | } | 193 | } |
200 | proc_entry = proc_create("scroll", 0644, pvc_display_dir, | 194 | proc_entry = proc_create("scroll", 0644, dir, |
201 | &pvc_scroll_proc_fops); | 195 | &pvc_scroll_proc_fops); |
202 | if (proc_entry == NULL) | 196 | if (proc_entry == NULL) |
203 | goto error; | 197 | goto error; |
diff --git a/arch/mn10300/include/asm/uaccess.h b/arch/mn10300/include/asm/uaccess.h index 537278746a15..20f7bf6de384 100644 --- a/arch/mn10300/include/asm/uaccess.h +++ b/arch/mn10300/include/asm/uaccess.h | |||
@@ -110,21 +110,6 @@ extern int fixup_exception(struct pt_regs *regs); | |||
110 | #define __put_user(x, ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) | 110 | #define __put_user(x, ptr) __put_user_nocheck((x), (ptr), sizeof(*(ptr))) |
111 | #define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) | 111 | #define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr))) |
112 | 112 | ||
113 | /* | ||
114 | * The "xxx_ret" versions return constant specified in third argument, if | ||
115 | * something bad happens. These macros can be optimized for the | ||
116 | * case of just returning from the function xxx_ret is used. | ||
117 | */ | ||
118 | |||
119 | #define put_user_ret(x, ptr, ret) \ | ||
120 | ({ if (put_user((x), (ptr))) return (ret); }) | ||
121 | #define get_user_ret(x, ptr, ret) \ | ||
122 | ({ if (get_user((x), (ptr))) return (ret); }) | ||
123 | #define __put_user_ret(x, ptr, ret) \ | ||
124 | ({ if (__put_user((x), (ptr))) return (ret); }) | ||
125 | #define __get_user_ret(x, ptr, ret) \ | ||
126 | ({ if (__get_user((x), (ptr))) return (ret); }) | ||
127 | |||
128 | struct __large_struct { unsigned long buf[100]; }; | 113 | struct __large_struct { unsigned long buf[100]; }; |
129 | #define __m(x) (*(struct __large_struct *)(x)) | 114 | #define __m(x) (*(struct __large_struct *)(x)) |
130 | 115 | ||
diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h index 2a8ebae0936b..b7c20f0b8fbe 100644 --- a/arch/powerpc/include/asm/uaccess.h +++ b/arch/powerpc/include/asm/uaccess.h | |||
@@ -274,21 +274,6 @@ do { \ | |||
274 | __gu_err; \ | 274 | __gu_err; \ |
275 | }) | 275 | }) |
276 | 276 | ||
277 | #ifndef __powerpc64__ | ||
278 | #define __get_user64_nocheck(x, ptr, size) \ | ||
279 | ({ \ | ||
280 | long __gu_err; \ | ||
281 | long long __gu_val; \ | ||
282 | __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ | ||
283 | __chk_user_ptr(ptr); \ | ||
284 | if (!is_kernel_addr((unsigned long)__gu_addr)) \ | ||
285 | might_fault(); \ | ||
286 | __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ | ||
287 | (x) = (__force __typeof__(*(ptr)))__gu_val; \ | ||
288 | __gu_err; \ | ||
289 | }) | ||
290 | #endif /* __powerpc64__ */ | ||
291 | |||
292 | #define __get_user_check(x, ptr, size) \ | 277 | #define __get_user_check(x, ptr, size) \ |
293 | ({ \ | 278 | ({ \ |
294 | long __gu_err = -EFAULT; \ | 279 | long __gu_err = -EFAULT; \ |
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c index 32e26526f7e4..0cab9e8c3794 100644 --- a/arch/powerpc/kernel/nvram_64.c +++ b/arch/powerpc/kernel/nvram_64.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
29 | #include <linux/kmsg_dump.h> | 29 | #include <linux/kmsg_dump.h> |
30 | #include <linux/pagemap.h> | ||
30 | #include <linux/pstore.h> | 31 | #include <linux/pstore.h> |
31 | #include <linux/zlib.h> | 32 | #include <linux/zlib.h> |
32 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
@@ -733,24 +734,10 @@ static void oops_to_nvram(struct kmsg_dumper *dumper, | |||
733 | 734 | ||
734 | static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin) | 735 | static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin) |
735 | { | 736 | { |
736 | int size; | ||
737 | |||
738 | if (ppc_md.nvram_size == NULL) | 737 | if (ppc_md.nvram_size == NULL) |
739 | return -ENODEV; | 738 | return -ENODEV; |
740 | size = ppc_md.nvram_size(); | 739 | return generic_file_llseek_size(file, offset, origin, MAX_LFS_FILESIZE, |
741 | 740 | ppc_md.nvram_size()); | |
742 | switch (origin) { | ||
743 | case 1: | ||
744 | offset += file->f_pos; | ||
745 | break; | ||
746 | case 2: | ||
747 | offset += size; | ||
748 | break; | ||
749 | } | ||
750 | if (offset < 0) | ||
751 | return -EINVAL; | ||
752 | file->f_pos = offset; | ||
753 | return file->f_pos; | ||
754 | } | 741 | } |
755 | 742 | ||
756 | 743 | ||
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index d348f2c09a1e..32da0a6ecec2 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
@@ -366,8 +366,7 @@ static void *s390_dma_alloc(struct device *dev, size_t size, | |||
366 | pa = page_to_phys(page); | 366 | pa = page_to_phys(page); |
367 | memset((void *) pa, 0, size); | 367 | memset((void *) pa, 0, size); |
368 | 368 | ||
369 | map = s390_dma_map_pages(dev, page, pa % PAGE_SIZE, | 369 | map = s390_dma_map_pages(dev, page, 0, size, DMA_BIDIRECTIONAL, NULL); |
370 | size, DMA_BIDIRECTIONAL, NULL); | ||
371 | if (dma_mapping_error(dev, map)) { | 370 | if (dma_mapping_error(dev, map)) { |
372 | free_pages(pa, get_order(size)); | 371 | free_pages(pa, get_order(size)); |
373 | return NULL; | 372 | return NULL; |
diff --git a/arch/sparc/include/asm/uaccess_32.h b/arch/sparc/include/asm/uaccess_32.h index 64ee103dc29d..57aca2792d29 100644 --- a/arch/sparc/include/asm/uaccess_32.h +++ b/arch/sparc/include/asm/uaccess_32.h | |||
@@ -205,31 +205,6 @@ int __put_user_bad(void); | |||
205 | __gu_ret; \ | 205 | __gu_ret; \ |
206 | }) | 206 | }) |
207 | 207 | ||
208 | #define __get_user_check_ret(x, addr, size, type, retval) ({ \ | ||
209 | register unsigned long __gu_val __asm__ ("l1"); \ | ||
210 | if (__access_ok(addr, size)) { \ | ||
211 | switch (size) { \ | ||
212 | case 1: \ | ||
213 | __get_user_asm_ret(__gu_val, ub, addr, retval); \ | ||
214 | break; \ | ||
215 | case 2: \ | ||
216 | __get_user_asm_ret(__gu_val, uh, addr, retval); \ | ||
217 | break; \ | ||
218 | case 4: \ | ||
219 | __get_user_asm_ret(__gu_val, , addr, retval); \ | ||
220 | break; \ | ||
221 | case 8: \ | ||
222 | __get_user_asm_ret(__gu_val, d, addr, retval); \ | ||
223 | break; \ | ||
224 | default: \ | ||
225 | if (__get_user_bad()) \ | ||
226 | return retval; \ | ||
227 | } \ | ||
228 | x = (__force type) __gu_val; \ | ||
229 | } else \ | ||
230 | return retval; \ | ||
231 | }) | ||
232 | |||
233 | #define __get_user_nocheck(x, addr, size, type) ({ \ | 208 | #define __get_user_nocheck(x, addr, size, type) ({ \ |
234 | register int __gu_ret; \ | 209 | register int __gu_ret; \ |
235 | register unsigned long __gu_val; \ | 210 | register unsigned long __gu_val; \ |
@@ -247,20 +222,6 @@ int __put_user_bad(void); | |||
247 | __gu_ret; \ | 222 | __gu_ret; \ |
248 | }) | 223 | }) |
249 | 224 | ||
250 | #define __get_user_nocheck_ret(x, addr, size, type, retval) ({ \ | ||
251 | register unsigned long __gu_val __asm__ ("l1"); \ | ||
252 | switch (size) { \ | ||
253 | case 1: __get_user_asm_ret(__gu_val, ub, addr, retval); break; \ | ||
254 | case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \ | ||
255 | case 4: __get_user_asm_ret(__gu_val, , addr, retval); break; \ | ||
256 | case 8: __get_user_asm_ret(__gu_val, d, addr, retval); break; \ | ||
257 | default: \ | ||
258 | if (__get_user_bad()) \ | ||
259 | return retval; \ | ||
260 | } \ | ||
261 | x = (__force type) __gu_val; \ | ||
262 | }) | ||
263 | |||
264 | #define __get_user_asm(x, size, addr, ret) \ | 225 | #define __get_user_asm(x, size, addr, ret) \ |
265 | __asm__ __volatile__( \ | 226 | __asm__ __volatile__( \ |
266 | "/* Get user asm, inline. */\n" \ | 227 | "/* Get user asm, inline. */\n" \ |
@@ -281,32 +242,6 @@ __asm__ __volatile__( \ | |||
281 | : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)), \ | 242 | : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)), \ |
282 | "i" (-EFAULT)) | 243 | "i" (-EFAULT)) |
283 | 244 | ||
284 | #define __get_user_asm_ret(x, size, addr, retval) \ | ||
285 | if (__builtin_constant_p(retval) && retval == -EFAULT) \ | ||
286 | __asm__ __volatile__( \ | ||
287 | "/* Get user asm ret, inline. */\n" \ | ||
288 | "1:\t" "ld"#size " %1, %0\n\n\t" \ | ||
289 | ".section __ex_table,#alloc\n\t" \ | ||
290 | ".align 4\n\t" \ | ||
291 | ".word 1b,__ret_efault\n\n\t" \ | ||
292 | ".previous\n\t" \ | ||
293 | : "=&r" (x) : "m" (*__m(addr))); \ | ||
294 | else \ | ||
295 | __asm__ __volatile__( \ | ||
296 | "/* Get user asm ret, inline. */\n" \ | ||
297 | "1:\t" "ld"#size " %1, %0\n\n\t" \ | ||
298 | ".section .fixup,#alloc,#execinstr\n\t" \ | ||
299 | ".align 4\n" \ | ||
300 | "3:\n\t" \ | ||
301 | "ret\n\t" \ | ||
302 | " restore %%g0, %2, %%o0\n\n\t" \ | ||
303 | ".previous\n\t" \ | ||
304 | ".section __ex_table,#alloc\n\t" \ | ||
305 | ".align 4\n\t" \ | ||
306 | ".word 1b, 3b\n\n\t" \ | ||
307 | ".previous\n\t" \ | ||
308 | : "=&r" (x) : "m" (*__m(addr)), "i" (retval)) | ||
309 | |||
310 | int __get_user_bad(void); | 245 | int __get_user_bad(void); |
311 | 246 | ||
312 | unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size); | 247 | unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size); |
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index ea6e9a20f3ff..e9a51d64974d 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h | |||
@@ -179,20 +179,6 @@ int __put_user_bad(void); | |||
179 | __gu_ret; \ | 179 | __gu_ret; \ |
180 | }) | 180 | }) |
181 | 181 | ||
182 | #define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \ | ||
183 | register unsigned long __gu_val __asm__ ("l1"); \ | ||
184 | switch (size) { \ | ||
185 | case 1: __get_user_asm_ret(__gu_val, ub, addr, retval); break; \ | ||
186 | case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \ | ||
187 | case 4: __get_user_asm_ret(__gu_val, uw, addr, retval); break; \ | ||
188 | case 8: __get_user_asm_ret(__gu_val, x, addr, retval); break; \ | ||
189 | default: \ | ||
190 | if (__get_user_bad()) \ | ||
191 | return retval; \ | ||
192 | } \ | ||
193 | data = (__force type) __gu_val; \ | ||
194 | }) | ||
195 | |||
196 | #define __get_user_asm(x, size, addr, ret) \ | 182 | #define __get_user_asm(x, size, addr, ret) \ |
197 | __asm__ __volatile__( \ | 183 | __asm__ __volatile__( \ |
198 | "/* Get user asm, inline. */\n" \ | 184 | "/* Get user asm, inline. */\n" \ |
@@ -214,32 +200,6 @@ __asm__ __volatile__( \ | |||
214 | : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ | 200 | : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ |
215 | "i" (-EFAULT)) | 201 | "i" (-EFAULT)) |
216 | 202 | ||
217 | #define __get_user_asm_ret(x, size, addr, retval) \ | ||
218 | if (__builtin_constant_p(retval) && retval == -EFAULT) \ | ||
219 | __asm__ __volatile__( \ | ||
220 | "/* Get user asm ret, inline. */\n" \ | ||
221 | "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ | ||
222 | ".section __ex_table,\"a\"\n\t" \ | ||
223 | ".align 4\n\t" \ | ||
224 | ".word 1b,__ret_efault\n\n\t" \ | ||
225 | ".previous\n\t" \ | ||
226 | : "=r" (x) : "r" (__m(addr))); \ | ||
227 | else \ | ||
228 | __asm__ __volatile__( \ | ||
229 | "/* Get user asm ret, inline. */\n" \ | ||
230 | "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ | ||
231 | ".section .fixup,#alloc,#execinstr\n\t" \ | ||
232 | ".align 4\n" \ | ||
233 | "3:\n\t" \ | ||
234 | "ret\n\t" \ | ||
235 | " restore %%g0, %2, %%o0\n\n\t" \ | ||
236 | ".previous\n\t" \ | ||
237 | ".section __ex_table,\"a\"\n\t" \ | ||
238 | ".align 4\n\t" \ | ||
239 | ".word 1b, 3b\n\n\t" \ | ||
240 | ".previous\n\t" \ | ||
241 | : "=r" (x) : "r" (__m(addr)), "i" (retval)) | ||
242 | |||
243 | int __get_user_bad(void); | 203 | int __get_user_bad(void); |
244 | 204 | ||
245 | unsigned long __must_check ___copy_from_user(void *to, | 205 | unsigned long __must_check ___copy_from_user(void *to, |
diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index 6f80936e0eea..11228861d9b4 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c | |||
@@ -1033,25 +1033,9 @@ static ssize_t mdesc_read(struct file *file, char __user *buf, | |||
1033 | 1033 | ||
1034 | static loff_t mdesc_llseek(struct file *file, loff_t offset, int whence) | 1034 | static loff_t mdesc_llseek(struct file *file, loff_t offset, int whence) |
1035 | { | 1035 | { |
1036 | struct mdesc_handle *hp; | 1036 | struct mdesc_handle *hp = file->private_data; |
1037 | |||
1038 | switch (whence) { | ||
1039 | case SEEK_CUR: | ||
1040 | offset += file->f_pos; | ||
1041 | break; | ||
1042 | case SEEK_SET: | ||
1043 | break; | ||
1044 | default: | ||
1045 | return -EINVAL; | ||
1046 | } | ||
1047 | |||
1048 | hp = file->private_data; | ||
1049 | if (offset > hp->handle_size) | ||
1050 | return -EINVAL; | ||
1051 | else | ||
1052 | file->f_pos = offset; | ||
1053 | 1037 | ||
1054 | return offset; | 1038 | return no_seek_end_llseek_size(file, offset, whence, hp->handle_size); |
1055 | } | 1039 | } |
1056 | 1040 | ||
1057 | /* mdesc_close() - /dev/mdesc is being closed, release the reference to | 1041 | /* mdesc_close() - /dev/mdesc is being closed, release the reference to |
diff --git a/arch/um/drivers/hostaudio_kern.c b/arch/um/drivers/hostaudio_kern.c index f6b911cc3923..3a4b58730f5f 100644 --- a/arch/um/drivers/hostaudio_kern.c +++ b/arch/um/drivers/hostaudio_kern.c | |||
@@ -105,13 +105,9 @@ static ssize_t hostaudio_write(struct file *file, const char __user *buffer, | |||
105 | printk(KERN_DEBUG "hostaudio: write called, count = %d\n", count); | 105 | printk(KERN_DEBUG "hostaudio: write called, count = %d\n", count); |
106 | #endif | 106 | #endif |
107 | 107 | ||
108 | kbuf = kmalloc(count, GFP_KERNEL); | 108 | kbuf = memdup_user(buffer, count); |
109 | if (kbuf == NULL) | 109 | if (IS_ERR(kbuf)) |
110 | return -ENOMEM; | 110 | return PTR_ERR(kbuf); |
111 | |||
112 | err = -EFAULT; | ||
113 | if (copy_from_user(kbuf, buffer, count)) | ||
114 | goto out; | ||
115 | 111 | ||
116 | err = os_write_file(state->fd, kbuf, count); | 112 | err = os_write_file(state->fd, kbuf, count); |
117 | if (err < 0) | 113 | if (err < 0) |
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c index 29880c9b324e..b821b13d343a 100644 --- a/arch/um/drivers/mconsole_kern.c +++ b/arch/um/drivers/mconsole_kern.c | |||
@@ -748,19 +748,11 @@ static ssize_t mconsole_proc_write(struct file *file, | |||
748 | { | 748 | { |
749 | char *buf; | 749 | char *buf; |
750 | 750 | ||
751 | buf = kmalloc(count + 1, GFP_KERNEL); | 751 | buf = memdup_user_nul(buffer, count); |
752 | if (buf == NULL) | 752 | if (IS_ERR(buf)) |
753 | return -ENOMEM; | 753 | return PTR_ERR(buf); |
754 | |||
755 | if (copy_from_user(buf, buffer, count)) { | ||
756 | count = -EFAULT; | ||
757 | goto out; | ||
758 | } | ||
759 | |||
760 | buf[count] = '\0'; | ||
761 | 754 | ||
762 | mconsole_notify(notify_socket, MCONSOLE_USER_NOTIFY, buf, count); | 755 | mconsole_notify(notify_socket, MCONSOLE_USER_NOTIFY, buf, count); |
763 | out: | ||
764 | kfree(buf); | 756 | kfree(buf); |
765 | return count; | 757 | return count; |
766 | } | 758 | } |
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index bd3507da39f0..2836de390f95 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
@@ -58,28 +58,6 @@ static void cpuid_smp_cpuid(void *cmd_block) | |||
58 | &cmd->eax, &cmd->ebx, &cmd->ecx, &cmd->edx); | 58 | &cmd->eax, &cmd->ebx, &cmd->ecx, &cmd->edx); |
59 | } | 59 | } |
60 | 60 | ||
61 | static loff_t cpuid_seek(struct file *file, loff_t offset, int orig) | ||
62 | { | ||
63 | loff_t ret; | ||
64 | struct inode *inode = file->f_mapping->host; | ||
65 | |||
66 | mutex_lock(&inode->i_mutex); | ||
67 | switch (orig) { | ||
68 | case 0: | ||
69 | file->f_pos = offset; | ||
70 | ret = file->f_pos; | ||
71 | break; | ||
72 | case 1: | ||
73 | file->f_pos += offset; | ||
74 | ret = file->f_pos; | ||
75 | break; | ||
76 | default: | ||
77 | ret = -EINVAL; | ||
78 | } | ||
79 | mutex_unlock(&inode->i_mutex); | ||
80 | return ret; | ||
81 | } | ||
82 | |||
83 | static ssize_t cpuid_read(struct file *file, char __user *buf, | 61 | static ssize_t cpuid_read(struct file *file, char __user *buf, |
84 | size_t count, loff_t *ppos) | 62 | size_t count, loff_t *ppos) |
85 | { | 63 | { |
@@ -132,7 +110,7 @@ static int cpuid_open(struct inode *inode, struct file *file) | |||
132 | */ | 110 | */ |
133 | static const struct file_operations cpuid_fops = { | 111 | static const struct file_operations cpuid_fops = { |
134 | .owner = THIS_MODULE, | 112 | .owner = THIS_MODULE, |
135 | .llseek = cpuid_seek, | 113 | .llseek = no_seek_end_llseek, |
136 | .read = cpuid_read, | 114 | .read = cpuid_read, |
137 | .open = cpuid_open, | 115 | .open = cpuid_open, |
138 | }; | 116 | }; |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 113e70784854..64f9616f93f1 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -45,28 +45,6 @@ | |||
45 | 45 | ||
46 | static struct class *msr_class; | 46 | static struct class *msr_class; |
47 | 47 | ||
48 | static loff_t msr_seek(struct file *file, loff_t offset, int orig) | ||
49 | { | ||
50 | loff_t ret; | ||
51 | struct inode *inode = file_inode(file); | ||
52 | |||
53 | mutex_lock(&inode->i_mutex); | ||
54 | switch (orig) { | ||
55 | case SEEK_SET: | ||
56 | file->f_pos = offset; | ||
57 | ret = file->f_pos; | ||
58 | break; | ||
59 | case SEEK_CUR: | ||
60 | file->f_pos += offset; | ||
61 | ret = file->f_pos; | ||
62 | break; | ||
63 | default: | ||
64 | ret = -EINVAL; | ||
65 | } | ||
66 | mutex_unlock(&inode->i_mutex); | ||
67 | return ret; | ||
68 | } | ||
69 | |||
70 | static ssize_t msr_read(struct file *file, char __user *buf, | 48 | static ssize_t msr_read(struct file *file, char __user *buf, |
71 | size_t count, loff_t *ppos) | 49 | size_t count, loff_t *ppos) |
72 | { | 50 | { |
@@ -194,7 +172,7 @@ static int msr_open(struct inode *inode, struct file *file) | |||
194 | */ | 172 | */ |
195 | static const struct file_operations msr_fops = { | 173 | static const struct file_operations msr_fops = { |
196 | .owner = THIS_MODULE, | 174 | .owner = THIS_MODULE, |
197 | .llseek = msr_seek, | 175 | .llseek = no_seek_end_llseek, |
198 | .read = msr_read, | 176 | .read = msr_read, |
199 | .write = msr_write, | 177 | .write = msr_write, |
200 | .open = msr_open, | 178 | .open = msr_open, |
diff --git a/arch/xtensa/platforms/iss/simdisk.c b/arch/xtensa/platforms/iss/simdisk.c index 3c3ace2c46b6..f58a4e6472cb 100644 --- a/arch/xtensa/platforms/iss/simdisk.c +++ b/arch/xtensa/platforms/iss/simdisk.c | |||
@@ -227,16 +227,12 @@ static ssize_t proc_read_simdisk(struct file *file, char __user *buf, | |||
227 | static ssize_t proc_write_simdisk(struct file *file, const char __user *buf, | 227 | static ssize_t proc_write_simdisk(struct file *file, const char __user *buf, |
228 | size_t count, loff_t *ppos) | 228 | size_t count, loff_t *ppos) |
229 | { | 229 | { |
230 | char *tmp = kmalloc(count + 1, GFP_KERNEL); | 230 | char *tmp = memdup_user_nul(buf, count); |
231 | struct simdisk *dev = PDE_DATA(file_inode(file)); | 231 | struct simdisk *dev = PDE_DATA(file_inode(file)); |
232 | int err; | 232 | int err; |
233 | 233 | ||
234 | if (tmp == NULL) | 234 | if (IS_ERR(tmp)) |
235 | return -ENOMEM; | 235 | return PTR_ERR(tmp); |
236 | if (copy_from_user(tmp, buf, count)) { | ||
237 | err = -EFAULT; | ||
238 | goto out_free; | ||
239 | } | ||
240 | 236 | ||
241 | err = simdisk_detach(dev); | 237 | err = simdisk_detach(dev); |
242 | if (err != 0) | 238 | if (err != 0) |
@@ -244,8 +240,6 @@ static ssize_t proc_write_simdisk(struct file *file, const char __user *buf, | |||
244 | 240 | ||
245 | if (count > 0 && tmp[count - 1] == '\n') | 241 | if (count > 0 && tmp[count - 1] == '\n') |
246 | tmp[count - 1] = 0; | 242 | tmp[count - 1] = 0; |
247 | else | ||
248 | tmp[count] = 0; | ||
249 | 243 | ||
250 | if (tmp[0]) | 244 | if (tmp[0]) |
251 | err = simdisk_attach(dev, tmp); | 245 | err = simdisk_attach(dev, tmp); |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 0422c47261c3..b38bd06d564c 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -514,14 +514,9 @@ cciss_proc_write(struct file *file, const char __user *buf, | |||
514 | if (!buf || length > PAGE_SIZE - 1) | 514 | if (!buf || length > PAGE_SIZE - 1) |
515 | return -EINVAL; | 515 | return -EINVAL; |
516 | 516 | ||
517 | buffer = (char *)__get_free_page(GFP_KERNEL); | 517 | buffer = memdup_user_nul(buf, length); |
518 | if (!buffer) | 518 | if (IS_ERR(buffer)) |
519 | return -ENOMEM; | 519 | return PTR_ERR(buffer); |
520 | |||
521 | err = -EFAULT; | ||
522 | if (copy_from_user(buffer, buf, length)) | ||
523 | goto out; | ||
524 | buffer[length] = '\0'; | ||
525 | 520 | ||
526 | #ifdef CONFIG_CISS_SCSI_TAPE | 521 | #ifdef CONFIG_CISS_SCSI_TAPE |
527 | if (strncmp(ENGAGE_SCSI, buffer, sizeof ENGAGE_SCSI - 1) == 0) { | 522 | if (strncmp(ENGAGE_SCSI, buffer, sizeof ENGAGE_SCSI - 1) == 0) { |
@@ -537,8 +532,7 @@ cciss_proc_write(struct file *file, const char __user *buf, | |||
537 | /* might be nice to have "disengage" too, but it's not | 532 | /* might be nice to have "disengage" too, but it's not |
538 | safely possible. (only 1 module use count, lock issues.) */ | 533 | safely possible. (only 1 module use count, lock issues.) */ |
539 | 534 | ||
540 | out: | 535 | kfree(buffer); |
541 | free_page((unsigned long)buffer); | ||
542 | return err; | 536 | return err; |
543 | } | 537 | } |
544 | 538 | ||
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 3457ac8c03e2..34997d8ecd64 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
@@ -2029,13 +2029,10 @@ static int exec_drive_taskfile(struct driver_data *dd, | |||
2029 | } | 2029 | } |
2030 | 2030 | ||
2031 | if (taskout) { | 2031 | if (taskout) { |
2032 | outbuf = kzalloc(taskout, GFP_KERNEL); | 2032 | outbuf = memdup_user(buf + outtotal, taskout); |
2033 | if (outbuf == NULL) { | 2033 | if (IS_ERR(outbuf)) { |
2034 | err = -ENOMEM; | 2034 | err = PTR_ERR(outbuf); |
2035 | goto abort; | 2035 | outbuf = NULL; |
2036 | } | ||
2037 | if (copy_from_user(outbuf, buf + outtotal, taskout)) { | ||
2038 | err = -EFAULT; | ||
2039 | goto abort; | 2036 | goto abort; |
2040 | } | 2037 | } |
2041 | outbuf_dma = pci_map_single(dd->pdev, | 2038 | outbuf_dma = pci_map_single(dd->pdev, |
@@ -2050,14 +2047,10 @@ static int exec_drive_taskfile(struct driver_data *dd, | |||
2050 | } | 2047 | } |
2051 | 2048 | ||
2052 | if (taskin) { | 2049 | if (taskin) { |
2053 | inbuf = kzalloc(taskin, GFP_KERNEL); | 2050 | inbuf = memdup_user(buf + intotal, taskin); |
2054 | if (inbuf == NULL) { | 2051 | if (IS_ERR(inbuf)) { |
2055 | err = -ENOMEM; | 2052 | err = PTR_ERR(inbuf); |
2056 | goto abort; | 2053 | inbuf = NULL; |
2057 | } | ||
2058 | |||
2059 | if (copy_from_user(inbuf, buf + intotal, taskin)) { | ||
2060 | err = -EFAULT; | ||
2061 | goto abort; | 2054 | goto abort; |
2062 | } | 2055 | } |
2063 | inbuf_dma = pci_map_single(dd->pdev, | 2056 | inbuf_dma = pci_map_single(dd->pdev, |
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 93b3f99b6865..e4c5cc107934 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -827,6 +827,7 @@ static const struct block_device_operations nbd_fops = | |||
827 | { | 827 | { |
828 | .owner = THIS_MODULE, | 828 | .owner = THIS_MODULE, |
829 | .ioctl = nbd_ioctl, | 829 | .ioctl = nbd_ioctl, |
830 | .compat_ioctl = nbd_ioctl, | ||
830 | }; | 831 | }; |
831 | 832 | ||
832 | #if IS_ENABLED(CONFIG_DEBUG_FS) | 833 | #if IS_ENABLED(CONFIG_DEBUG_FS) |
diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c index d8b2488aaade..34997df132e2 100644 --- a/drivers/block/rsxx/core.c +++ b/drivers/block/rsxx/core.c | |||
@@ -203,14 +203,11 @@ static ssize_t rsxx_cram_write(struct file *fp, const char __user *ubuf, | |||
203 | char *buf; | 203 | char *buf; |
204 | ssize_t st; | 204 | ssize_t st; |
205 | 205 | ||
206 | buf = kzalloc(cnt, GFP_KERNEL); | 206 | buf = memdup_user(ubuf, cnt); |
207 | if (!buf) | 207 | if (IS_ERR(buf)) |
208 | return -ENOMEM; | 208 | return PTR_ERR(buf); |
209 | 209 | ||
210 | st = copy_from_user(buf, ubuf, cnt); | 210 | st = rsxx_creg_write(card, CREG_ADD_CRAM + (u32)*ppos, cnt, buf, 1); |
211 | if (!st) | ||
212 | st = rsxx_creg_write(card, CREG_ADD_CRAM + (u32)*ppos, cnt, | ||
213 | buf, 1); | ||
214 | kfree(buf); | 211 | kfree(buf); |
215 | if (st) | 212 | if (st) |
216 | return st; | 213 | return st; |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index c206ccda899b..1b257ea9776a 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -3186,15 +3186,11 @@ static noinline int mmc_ioctl_dvd_read_struct(struct cdrom_device_info *cdi, | |||
3186 | if (!CDROM_CAN(CDC_DVD)) | 3186 | if (!CDROM_CAN(CDC_DVD)) |
3187 | return -ENOSYS; | 3187 | return -ENOSYS; |
3188 | 3188 | ||
3189 | s = kmalloc(size, GFP_KERNEL); | 3189 | s = memdup_user(arg, size); |
3190 | if (!s) | 3190 | if (IS_ERR(s)) |
3191 | return -ENOMEM; | 3191 | return PTR_ERR(s); |
3192 | 3192 | ||
3193 | cd_dbg(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n"); | 3193 | cd_dbg(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n"); |
3194 | if (copy_from_user(s, arg, size)) { | ||
3195 | kfree(s); | ||
3196 | return -EFAULT; | ||
3197 | } | ||
3198 | 3194 | ||
3199 | ret = dvd_read_struct(cdi, s, cgc); | 3195 | ret = dvd_read_struct(cdi, s, cgc); |
3200 | if (ret) | 3196 | if (ret) |
diff --git a/drivers/char/generic_nvram.c b/drivers/char/generic_nvram.c index 6c4f4b5a9dd3..073db9558379 100644 --- a/drivers/char/generic_nvram.c +++ b/drivers/char/generic_nvram.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/fcntl.h> | 20 | #include <linux/fcntl.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/mutex.h> | 22 | #include <linux/mutex.h> |
23 | #include <linux/pagemap.h> | ||
23 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
24 | #include <asm/nvram.h> | 25 | #include <asm/nvram.h> |
25 | #ifdef CONFIG_PPC_PMAC | 26 | #ifdef CONFIG_PPC_PMAC |
@@ -33,24 +34,8 @@ static ssize_t nvram_len; | |||
33 | 34 | ||
34 | static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) | 35 | static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) |
35 | { | 36 | { |
36 | switch (origin) { | 37 | return generic_file_llseek_size(file, offset, origin, |
37 | case 0: | 38 | MAX_LFS_FILESIZE, nvram_len); |
38 | break; | ||
39 | case 1: | ||
40 | offset += file->f_pos; | ||
41 | break; | ||
42 | case 2: | ||
43 | offset += nvram_len; | ||
44 | break; | ||
45 | default: | ||
46 | offset = -1; | ||
47 | } | ||
48 | if (offset < 0) | ||
49 | return -EINVAL; | ||
50 | |||
51 | file->f_pos = offset; | ||
52 | |||
53 | return file->f_pos; | ||
54 | } | 39 | } |
55 | 40 | ||
56 | static ssize_t read_nvram(struct file *file, char __user *buf, | 41 | static ssize_t read_nvram(struct file *file, char __user *buf, |
diff --git a/drivers/char/mbcs.c b/drivers/char/mbcs.c index e5d3e3f7a49b..67d426470e53 100644 --- a/drivers/char/mbcs.c +++ b/drivers/char/mbcs.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/uio.h> | 26 | #include <linux/uio.h> |
27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/pagemap.h> | ||
29 | #include <asm/io.h> | 30 | #include <asm/io.h> |
30 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
31 | #include <asm/pgtable.h> | 32 | #include <asm/pgtable.h> |
@@ -451,31 +452,8 @@ mbcs_sram_write(struct file * fp, const char __user *buf, size_t len, loff_t * o | |||
451 | 452 | ||
452 | static loff_t mbcs_sram_llseek(struct file * filp, loff_t off, int whence) | 453 | static loff_t mbcs_sram_llseek(struct file * filp, loff_t off, int whence) |
453 | { | 454 | { |
454 | loff_t newpos; | 455 | return generic_file_llseek_size(filp, off, whence, MAX_LFS_FILESIZE, |
455 | 456 | MBCS_SRAM_SIZE); | |
456 | switch (whence) { | ||
457 | case SEEK_SET: | ||
458 | newpos = off; | ||
459 | break; | ||
460 | |||
461 | case SEEK_CUR: | ||
462 | newpos = filp->f_pos + off; | ||
463 | break; | ||
464 | |||
465 | case SEEK_END: | ||
466 | newpos = MBCS_SRAM_SIZE + off; | ||
467 | break; | ||
468 | |||
469 | default: /* can't happen */ | ||
470 | return -EINVAL; | ||
471 | } | ||
472 | |||
473 | if (newpos < 0) | ||
474 | return -EINVAL; | ||
475 | |||
476 | filp->f_pos = newpos; | ||
477 | |||
478 | return newpos; | ||
479 | } | 457 | } |
480 | 458 | ||
481 | static uint64_t mbcs_pioaddr(struct mbcs_soft *soft, uint64_t offset) | 459 | static uint64_t mbcs_pioaddr(struct mbcs_soft *soft, uint64_t offset) |
diff --git a/drivers/char/nvram.c b/drivers/char/nvram.c index 97c2d8d433d6..01292328a456 100644 --- a/drivers/char/nvram.c +++ b/drivers/char/nvram.c | |||
@@ -110,6 +110,7 @@ | |||
110 | #include <linux/io.h> | 110 | #include <linux/io.h> |
111 | #include <linux/uaccess.h> | 111 | #include <linux/uaccess.h> |
112 | #include <linux/mutex.h> | 112 | #include <linux/mutex.h> |
113 | #include <linux/pagemap.h> | ||
113 | 114 | ||
114 | 115 | ||
115 | static DEFINE_MUTEX(nvram_mutex); | 116 | static DEFINE_MUTEX(nvram_mutex); |
@@ -213,21 +214,8 @@ void nvram_set_checksum(void) | |||
213 | 214 | ||
214 | static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) | 215 | static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) |
215 | { | 216 | { |
216 | switch (origin) { | 217 | return generic_file_llseek_size(file, offset, origin, MAX_LFS_FILESIZE, |
217 | case 0: | 218 | NVRAM_BYTES); |
218 | /* nothing to do */ | ||
219 | break; | ||
220 | case 1: | ||
221 | offset += file->f_pos; | ||
222 | break; | ||
223 | case 2: | ||
224 | offset += NVRAM_BYTES; | ||
225 | break; | ||
226 | default: | ||
227 | return -EINVAL; | ||
228 | } | ||
229 | |||
230 | return (offset >= 0) ? (file->f_pos = offset) : -EINVAL; | ||
231 | } | 219 | } |
232 | 220 | ||
233 | static ssize_t nvram_read(struct file *file, char __user *buf, | 221 | static ssize_t nvram_read(struct file *file, char __user *buf, |
diff --git a/drivers/char/nwflash.c b/drivers/char/nwflash.c index e371480d3639..dbe598de9b74 100644 --- a/drivers/char/nwflash.c +++ b/drivers/char/nwflash.c | |||
@@ -277,36 +277,7 @@ static loff_t flash_llseek(struct file *file, loff_t offset, int orig) | |||
277 | printk(KERN_DEBUG "flash_llseek: offset=0x%X, orig=0x%X.\n", | 277 | printk(KERN_DEBUG "flash_llseek: offset=0x%X, orig=0x%X.\n", |
278 | (unsigned int) offset, orig); | 278 | (unsigned int) offset, orig); |
279 | 279 | ||
280 | switch (orig) { | 280 | ret = no_seek_end_llseek_size(file, offset, orig, gbFlashSize); |
281 | case 0: | ||
282 | if (offset < 0) { | ||
283 | ret = -EINVAL; | ||
284 | break; | ||
285 | } | ||
286 | |||
287 | if ((unsigned int) offset > gbFlashSize) { | ||
288 | ret = -EINVAL; | ||
289 | break; | ||
290 | } | ||
291 | |||
292 | file->f_pos = (unsigned int) offset; | ||
293 | ret = file->f_pos; | ||
294 | break; | ||
295 | case 1: | ||
296 | if ((file->f_pos + offset) > gbFlashSize) { | ||
297 | ret = -EINVAL; | ||
298 | break; | ||
299 | } | ||
300 | if ((file->f_pos + offset) < 0) { | ||
301 | ret = -EINVAL; | ||
302 | break; | ||
303 | } | ||
304 | file->f_pos += offset; | ||
305 | ret = file->f_pos; | ||
306 | break; | ||
307 | default: | ||
308 | ret = -EINVAL; | ||
309 | } | ||
310 | mutex_unlock(&flash_mutex); | 281 | mutex_unlock(&flash_mutex); |
311 | return ret; | 282 | return ret; |
312 | } | 283 | } |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index c6a1b4cc6458..d321222fd92e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | |||
@@ -559,19 +559,10 @@ static int kfd_ioctl_dbg_address_watch(struct file *filep, | |||
559 | 559 | ||
560 | /* this is the actual buffer to work with */ | 560 | /* this is the actual buffer to work with */ |
561 | 561 | ||
562 | args_buff = kmalloc(args->buf_size_in_bytes - | 562 | args_buff = memdup_user(args_buff, |
563 | sizeof(*args), GFP_KERNEL); | ||
564 | if (args_buff == NULL) | ||
565 | return -ENOMEM; | ||
566 | |||
567 | status = copy_from_user(args_buff, cmd_from_user, | ||
568 | args->buf_size_in_bytes - sizeof(*args)); | 563 | args->buf_size_in_bytes - sizeof(*args)); |
569 | 564 | if (IS_ERR(args_buff)) | |
570 | if (status != 0) { | 565 | return PTR_ERR(args_buff); |
571 | pr_debug("Failed to copy address watch user data\n"); | ||
572 | kfree(args_buff); | ||
573 | return -EINVAL; | ||
574 | } | ||
575 | 566 | ||
576 | aw_info.process = p; | 567 | aw_info.process = p; |
577 | 568 | ||
@@ -677,22 +668,12 @@ static int kfd_ioctl_dbg_wave_control(struct file *filep, | |||
677 | if (cmd_from_user == NULL) | 668 | if (cmd_from_user == NULL) |
678 | return -EINVAL; | 669 | return -EINVAL; |
679 | 670 | ||
680 | /* this is the actual buffer to work with */ | 671 | /* copy the entire buffer from user */ |
681 | 672 | ||
682 | args_buff = kmalloc(args->buf_size_in_bytes - sizeof(*args), | 673 | args_buff = memdup_user(cmd_from_user, |
683 | GFP_KERNEL); | ||
684 | |||
685 | if (args_buff == NULL) | ||
686 | return -ENOMEM; | ||
687 | |||
688 | /* Now copy the entire buffer from user */ | ||
689 | status = copy_from_user(args_buff, cmd_from_user, | ||
690 | args->buf_size_in_bytes - sizeof(*args)); | 674 | args->buf_size_in_bytes - sizeof(*args)); |
691 | if (status != 0) { | 675 | if (IS_ERR(args_buff)) |
692 | pr_debug("Failed to copy wave control user data\n"); | 676 | return PTR_ERR(args_buff); |
693 | kfree(args_buff); | ||
694 | return -EINVAL; | ||
695 | } | ||
696 | 677 | ||
697 | /* move ptr to the start of the "pay-load" area */ | 678 | /* move ptr to the start of the "pay-load" area */ |
698 | wac_info.process = p; | 679 | wac_info.process = p; |
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index 9abcaa53bd25..f17cb0431833 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c | |||
@@ -1163,12 +1163,8 @@ done: | |||
1163 | 1163 | ||
1164 | static unsigned int vga_arb_fpoll(struct file *file, poll_table *wait) | 1164 | static unsigned int vga_arb_fpoll(struct file *file, poll_table *wait) |
1165 | { | 1165 | { |
1166 | struct vga_arb_private *priv = file->private_data; | ||
1167 | |||
1168 | pr_debug("%s\n", __func__); | 1166 | pr_debug("%s\n", __func__); |
1169 | 1167 | ||
1170 | if (priv == NULL) | ||
1171 | return -ENODEV; | ||
1172 | poll_wait(file, &vga_wait_queue, wait); | 1168 | poll_wait(file, &vga_wait_queue, wait); |
1173 | return POLLIN; | 1169 | return POLLIN; |
1174 | } | 1170 | } |
@@ -1209,9 +1205,6 @@ static int vga_arb_release(struct inode *inode, struct file *file) | |||
1209 | 1205 | ||
1210 | pr_debug("%s\n", __func__); | 1206 | pr_debug("%s\n", __func__); |
1211 | 1207 | ||
1212 | if (priv == NULL) | ||
1213 | return -ENODEV; | ||
1214 | |||
1215 | spin_lock_irqsave(&vga_user_lock, flags); | 1208 | spin_lock_irqsave(&vga_user_lock, flags); |
1216 | list_del(&priv->list); | 1209 | list_del(&priv->list); |
1217 | for (i = 0; i < MAX_USER_CARDS; i++) { | 1210 | for (i = 0; i < MAX_USER_CARDS; i++) { |
diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c index db3ae4c2b223..dde6172f3f10 100644 --- a/drivers/md/bcache/util.c +++ b/drivers/md/bcache/util.c | |||
@@ -230,7 +230,7 @@ void bch_bio_map(struct bio *bio, void *base) | |||
230 | BUG_ON(!bio->bi_iter.bi_size); | 230 | BUG_ON(!bio->bi_iter.bi_size); |
231 | BUG_ON(bio->bi_vcnt); | 231 | BUG_ON(bio->bi_vcnt); |
232 | 232 | ||
233 | bv->bv_offset = base ? ((unsigned long) base) % PAGE_SIZE : 0; | 233 | bv->bv_offset = base ? offset_in_page(base) : 0; |
234 | goto start; | 234 | goto start; |
235 | 235 | ||
236 | for (; size; bio->bi_vcnt++, bv++) { | 236 | for (; size; bio->bi_vcnt++, bv++) { |
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index 6b832e06580d..cd77216beff1 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c | |||
@@ -650,7 +650,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block, | |||
650 | do { | 650 | do { |
651 | if (!bio_add_page(&b->bio, virt_to_page(ptr), | 651 | if (!bio_add_page(&b->bio, virt_to_page(ptr), |
652 | len < PAGE_SIZE ? len : PAGE_SIZE, | 652 | len < PAGE_SIZE ? len : PAGE_SIZE, |
653 | virt_to_phys(ptr) & (PAGE_SIZE - 1))) { | 653 | offset_in_page(ptr))) { |
654 | BUG_ON(b->c->block_size <= PAGE_SIZE); | 654 | BUG_ON(b->c->block_size <= PAGE_SIZE); |
655 | use_dmio(b, rw, block, end_io); | 655 | use_dmio(b, rw, block, end_io); |
656 | return; | 656 | return; |
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 81c5e1a1f363..06d426eb5a30 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
@@ -246,7 +246,7 @@ static void vm_dp_init(struct dpages *dp, void *data) | |||
246 | { | 246 | { |
247 | dp->get_page = vm_get_page; | 247 | dp->get_page = vm_get_page; |
248 | dp->next_page = vm_next_page; | 248 | dp->next_page = vm_next_page; |
249 | dp->context_u = ((unsigned long) data) & (PAGE_SIZE - 1); | 249 | dp->context_u = offset_in_page(data); |
250 | dp->context_ptr = data; | 250 | dp->context_ptr = data; |
251 | } | 251 | } |
252 | 252 | ||
@@ -271,7 +271,7 @@ static void km_dp_init(struct dpages *dp, void *data) | |||
271 | { | 271 | { |
272 | dp->get_page = km_get_page; | 272 | dp->get_page = km_get_page; |
273 | dp->next_page = km_next_page; | 273 | dp->next_page = km_next_page; |
274 | dp->context_u = ((unsigned long) data) & (PAGE_SIZE - 1); | 274 | dp->context_u = offset_in_page(data); |
275 | dp->context_ptr = data; | 275 | dp->context_ptr = data; |
276 | } | 276 | } |
277 | 277 | ||
diff --git a/drivers/mtd/maps/pcmciamtd.c b/drivers/mtd/maps/pcmciamtd.c index 3dad2111b7e3..70bb403f69f7 100644 --- a/drivers/mtd/maps/pcmciamtd.c +++ b/drivers/mtd/maps/pcmciamtd.c | |||
@@ -30,7 +30,7 @@ | |||
30 | 30 | ||
31 | struct pcmciamtd_dev { | 31 | struct pcmciamtd_dev { |
32 | struct pcmcia_device *p_dev; | 32 | struct pcmcia_device *p_dev; |
33 | caddr_t win_base; /* ioremapped address of PCMCIA window */ | 33 | void __iomem *win_base; /* ioremapped address of PCMCIA window */ |
34 | unsigned int win_size; /* size of window */ | 34 | unsigned int win_size; /* size of window */ |
35 | unsigned int offset; /* offset into card the window currently points at */ | 35 | unsigned int offset; /* offset into card the window currently points at */ |
36 | struct map_info pcmcia_map; | 36 | struct map_info pcmcia_map; |
@@ -80,7 +80,7 @@ MODULE_PARM_DESC(mem_type, "Set Memory type (0=Flash, 1=RAM, 2=ROM, default=0)") | |||
80 | /* read/write{8,16} copy_{from,to} routines with window remapping | 80 | /* read/write{8,16} copy_{from,to} routines with window remapping |
81 | * to access whole card | 81 | * to access whole card |
82 | */ | 82 | */ |
83 | static caddr_t remap_window(struct map_info *map, unsigned long to) | 83 | static void __iomem *remap_window(struct map_info *map, unsigned long to) |
84 | { | 84 | { |
85 | struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; | 85 | struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; |
86 | struct resource *win = (struct resource *) map->map_priv_2; | 86 | struct resource *win = (struct resource *) map->map_priv_2; |
@@ -107,7 +107,7 @@ static caddr_t remap_window(struct map_info *map, unsigned long to) | |||
107 | 107 | ||
108 | static map_word pcmcia_read8_remap(struct map_info *map, unsigned long ofs) | 108 | static map_word pcmcia_read8_remap(struct map_info *map, unsigned long ofs) |
109 | { | 109 | { |
110 | caddr_t addr; | 110 | void __iomem *addr; |
111 | map_word d = {{0}}; | 111 | map_word d = {{0}}; |
112 | 112 | ||
113 | addr = remap_window(map, ofs); | 113 | addr = remap_window(map, ofs); |
@@ -122,7 +122,7 @@ static map_word pcmcia_read8_remap(struct map_info *map, unsigned long ofs) | |||
122 | 122 | ||
123 | static map_word pcmcia_read16_remap(struct map_info *map, unsigned long ofs) | 123 | static map_word pcmcia_read16_remap(struct map_info *map, unsigned long ofs) |
124 | { | 124 | { |
125 | caddr_t addr; | 125 | void __iomem *addr; |
126 | map_word d = {{0}}; | 126 | map_word d = {{0}}; |
127 | 127 | ||
128 | addr = remap_window(map, ofs); | 128 | addr = remap_window(map, ofs); |
@@ -143,7 +143,7 @@ static void pcmcia_copy_from_remap(struct map_info *map, void *to, unsigned long | |||
143 | pr_debug("to = %p from = %lu len = %zd\n", to, from, len); | 143 | pr_debug("to = %p from = %lu len = %zd\n", to, from, len); |
144 | while(len) { | 144 | while(len) { |
145 | int toread = win_size - (from & (win_size-1)); | 145 | int toread = win_size - (from & (win_size-1)); |
146 | caddr_t addr; | 146 | void __iomem *addr; |
147 | 147 | ||
148 | if(toread > len) | 148 | if(toread > len) |
149 | toread = len; | 149 | toread = len; |
@@ -163,7 +163,7 @@ static void pcmcia_copy_from_remap(struct map_info *map, void *to, unsigned long | |||
163 | 163 | ||
164 | static void pcmcia_write8_remap(struct map_info *map, map_word d, unsigned long adr) | 164 | static void pcmcia_write8_remap(struct map_info *map, map_word d, unsigned long adr) |
165 | { | 165 | { |
166 | caddr_t addr = remap_window(map, adr); | 166 | void __iomem *addr = remap_window(map, adr); |
167 | 167 | ||
168 | if(!addr) | 168 | if(!addr) |
169 | return; | 169 | return; |
@@ -175,7 +175,7 @@ static void pcmcia_write8_remap(struct map_info *map, map_word d, unsigned long | |||
175 | 175 | ||
176 | static void pcmcia_write16_remap(struct map_info *map, map_word d, unsigned long adr) | 176 | static void pcmcia_write16_remap(struct map_info *map, map_word d, unsigned long adr) |
177 | { | 177 | { |
178 | caddr_t addr = remap_window(map, adr); | 178 | void __iomem *addr = remap_window(map, adr); |
179 | if(!addr) | 179 | if(!addr) |
180 | return; | 180 | return; |
181 | 181 | ||
@@ -192,7 +192,7 @@ static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const v | |||
192 | pr_debug("to = %lu from = %p len = %zd\n", to, from, len); | 192 | pr_debug("to = %lu from = %p len = %zd\n", to, from, len); |
193 | while(len) { | 193 | while(len) { |
194 | int towrite = win_size - (to & (win_size-1)); | 194 | int towrite = win_size - (to & (win_size-1)); |
195 | caddr_t addr; | 195 | void __iomem *addr; |
196 | 196 | ||
197 | if(towrite > len) | 197 | if(towrite > len) |
198 | towrite = len; | 198 | towrite = len; |
@@ -216,7 +216,7 @@ static void pcmcia_copy_to_remap(struct map_info *map, unsigned long to, const v | |||
216 | 216 | ||
217 | static map_word pcmcia_read8(struct map_info *map, unsigned long ofs) | 217 | static map_word pcmcia_read8(struct map_info *map, unsigned long ofs) |
218 | { | 218 | { |
219 | caddr_t win_base = (caddr_t)map->map_priv_2; | 219 | void __iomem *win_base = (void __iomem *)map->map_priv_2; |
220 | map_word d = {{0}}; | 220 | map_word d = {{0}}; |
221 | 221 | ||
222 | if(DEV_REMOVED(map)) | 222 | if(DEV_REMOVED(map)) |
@@ -231,7 +231,7 @@ static map_word pcmcia_read8(struct map_info *map, unsigned long ofs) | |||
231 | 231 | ||
232 | static map_word pcmcia_read16(struct map_info *map, unsigned long ofs) | 232 | static map_word pcmcia_read16(struct map_info *map, unsigned long ofs) |
233 | { | 233 | { |
234 | caddr_t win_base = (caddr_t)map->map_priv_2; | 234 | void __iomem *win_base = (void __iomem *)map->map_priv_2; |
235 | map_word d = {{0}}; | 235 | map_word d = {{0}}; |
236 | 236 | ||
237 | if(DEV_REMOVED(map)) | 237 | if(DEV_REMOVED(map)) |
@@ -246,7 +246,7 @@ static map_word pcmcia_read16(struct map_info *map, unsigned long ofs) | |||
246 | 246 | ||
247 | static void pcmcia_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len) | 247 | static void pcmcia_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len) |
248 | { | 248 | { |
249 | caddr_t win_base = (caddr_t)map->map_priv_2; | 249 | void __iomem *win_base = (void __iomem *)map->map_priv_2; |
250 | 250 | ||
251 | if(DEV_REMOVED(map)) | 251 | if(DEV_REMOVED(map)) |
252 | return; | 252 | return; |
@@ -258,7 +258,7 @@ static void pcmcia_copy_from(struct map_info *map, void *to, unsigned long from, | |||
258 | 258 | ||
259 | static void pcmcia_write8(struct map_info *map, map_word d, unsigned long adr) | 259 | static void pcmcia_write8(struct map_info *map, map_word d, unsigned long adr) |
260 | { | 260 | { |
261 | caddr_t win_base = (caddr_t)map->map_priv_2; | 261 | void __iomem *win_base = (void __iomem *)map->map_priv_2; |
262 | 262 | ||
263 | if(DEV_REMOVED(map)) | 263 | if(DEV_REMOVED(map)) |
264 | return; | 264 | return; |
@@ -271,7 +271,7 @@ static void pcmcia_write8(struct map_info *map, map_word d, unsigned long adr) | |||
271 | 271 | ||
272 | static void pcmcia_write16(struct map_info *map, map_word d, unsigned long adr) | 272 | static void pcmcia_write16(struct map_info *map, map_word d, unsigned long adr) |
273 | { | 273 | { |
274 | caddr_t win_base = (caddr_t)map->map_priv_2; | 274 | void __iomem *win_base = (void __iomem *)map->map_priv_2; |
275 | 275 | ||
276 | if(DEV_REMOVED(map)) | 276 | if(DEV_REMOVED(map)) |
277 | return; | 277 | return; |
@@ -284,7 +284,7 @@ static void pcmcia_write16(struct map_info *map, map_word d, unsigned long adr) | |||
284 | 284 | ||
285 | static void pcmcia_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len) | 285 | static void pcmcia_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len) |
286 | { | 286 | { |
287 | caddr_t win_base = (caddr_t)map->map_priv_2; | 287 | void __iomem *win_base = (void __iomem *)map->map_priv_2; |
288 | 288 | ||
289 | if(DEV_REMOVED(map)) | 289 | if(DEV_REMOVED(map)) |
290 | return; | 290 | return; |
diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c index 97bc186f9728..a1d10b85989f 100644 --- a/drivers/net/wireless/ath/wil6210/debugfs.c +++ b/drivers/net/wireless/ath/wil6210/debugfs.c | |||
@@ -580,16 +580,10 @@ static ssize_t wil_write_file_rxon(struct file *file, const char __user *buf, | |||
580 | long channel; | 580 | long channel; |
581 | bool on; | 581 | bool on; |
582 | 582 | ||
583 | char *kbuf = kmalloc(len + 1, GFP_KERNEL); | 583 | char *kbuf = memdup_user_nul(buf, len); |
584 | |||
585 | if (!kbuf) | ||
586 | return -ENOMEM; | ||
587 | if (copy_from_user(kbuf, buf, len)) { | ||
588 | kfree(kbuf); | ||
589 | return -EIO; | ||
590 | } | ||
591 | 584 | ||
592 | kbuf[len] = '\0'; | 585 | if (IS_ERR(kbuf)) |
586 | return PTR_ERR(kbuf); | ||
593 | rc = kstrtol(kbuf, 0, &channel); | 587 | rc = kstrtol(kbuf, 0, &channel); |
594 | kfree(kbuf); | 588 | kfree(kbuf); |
595 | if (rc) | 589 | if (rc) |
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c index 26cbf1dcc662..faed1823c58e 100644 --- a/drivers/net/wireless/libertas/debugfs.c +++ b/drivers/net/wireless/libertas/debugfs.c | |||
@@ -56,19 +56,15 @@ static ssize_t lbs_sleepparams_write(struct file *file, | |||
56 | loff_t *ppos) | 56 | loff_t *ppos) |
57 | { | 57 | { |
58 | struct lbs_private *priv = file->private_data; | 58 | struct lbs_private *priv = file->private_data; |
59 | ssize_t buf_size, ret; | 59 | ssize_t ret; |
60 | struct sleep_params sp; | 60 | struct sleep_params sp; |
61 | int p1, p2, p3, p4, p5, p6; | 61 | int p1, p2, p3, p4, p5, p6; |
62 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 62 | char *buf; |
63 | char *buf = (char *)addr; | 63 | |
64 | if (!buf) | 64 | buf = memdup_user_nul(user_buf, min(count, len - 1)); |
65 | return -ENOMEM; | 65 | if (IS_ERR(buf)) |
66 | return PTR_ERR(buf); | ||
66 | 67 | ||
67 | buf_size = min(count, len - 1); | ||
68 | if (copy_from_user(buf, user_buf, buf_size)) { | ||
69 | ret = -EFAULT; | ||
70 | goto out_unlock; | ||
71 | } | ||
72 | ret = sscanf(buf, "%d %d %d %d %d %d", &p1, &p2, &p3, &p4, &p5, &p6); | 68 | ret = sscanf(buf, "%d %d %d %d %d %d", &p1, &p2, &p3, &p4, &p5, &p6); |
73 | if (ret != 6) { | 69 | if (ret != 6) { |
74 | ret = -EINVAL; | 70 | ret = -EINVAL; |
@@ -88,7 +84,7 @@ static ssize_t lbs_sleepparams_write(struct file *file, | |||
88 | ret = -EINVAL; | 84 | ret = -EINVAL; |
89 | 85 | ||
90 | out_unlock: | 86 | out_unlock: |
91 | free_page(addr); | 87 | kfree(buf); |
92 | return ret; | 88 | return ret; |
93 | } | 89 | } |
94 | 90 | ||
@@ -125,18 +121,14 @@ static ssize_t lbs_host_sleep_write(struct file *file, | |||
125 | loff_t *ppos) | 121 | loff_t *ppos) |
126 | { | 122 | { |
127 | struct lbs_private *priv = file->private_data; | 123 | struct lbs_private *priv = file->private_data; |
128 | ssize_t buf_size, ret; | 124 | ssize_t ret; |
129 | int host_sleep; | 125 | int host_sleep; |
130 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 126 | char *buf; |
131 | char *buf = (char *)addr; | 127 | |
132 | if (!buf) | 128 | buf = memdup_user_nul(user_buf, min(count, len - 1)); |
133 | return -ENOMEM; | 129 | if (IS_ERR(buf)) |
130 | return PTR_ERR(buf); | ||
134 | 131 | ||
135 | buf_size = min(count, len - 1); | ||
136 | if (copy_from_user(buf, user_buf, buf_size)) { | ||
137 | ret = -EFAULT; | ||
138 | goto out_unlock; | ||
139 | } | ||
140 | ret = sscanf(buf, "%d", &host_sleep); | 132 | ret = sscanf(buf, "%d", &host_sleep); |
141 | if (ret != 1) { | 133 | if (ret != 1) { |
142 | ret = -EINVAL; | 134 | ret = -EINVAL; |
@@ -162,7 +154,7 @@ static ssize_t lbs_host_sleep_write(struct file *file, | |||
162 | ret = count; | 154 | ret = count; |
163 | 155 | ||
164 | out_unlock: | 156 | out_unlock: |
165 | free_page(addr); | 157 | kfree(buf); |
166 | return ret; | 158 | return ret; |
167 | } | 159 | } |
168 | 160 | ||
@@ -281,21 +273,15 @@ static ssize_t lbs_threshold_write(uint16_t tlv_type, uint16_t event_mask, | |||
281 | struct cmd_ds_802_11_subscribe_event *events; | 273 | struct cmd_ds_802_11_subscribe_event *events; |
282 | struct mrvl_ie_thresholds *tlv; | 274 | struct mrvl_ie_thresholds *tlv; |
283 | struct lbs_private *priv = file->private_data; | 275 | struct lbs_private *priv = file->private_data; |
284 | ssize_t buf_size; | ||
285 | int value, freq, new_mask; | 276 | int value, freq, new_mask; |
286 | uint16_t curr_mask; | 277 | uint16_t curr_mask; |
287 | char *buf; | 278 | char *buf; |
288 | int ret; | 279 | int ret; |
289 | 280 | ||
290 | buf = (char *)get_zeroed_page(GFP_KERNEL); | 281 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
291 | if (!buf) | 282 | if (IS_ERR(buf)) |
292 | return -ENOMEM; | 283 | return PTR_ERR(buf); |
293 | 284 | ||
294 | buf_size = min(count, len - 1); | ||
295 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
296 | ret = -EFAULT; | ||
297 | goto out_page; | ||
298 | } | ||
299 | ret = sscanf(buf, "%d %d %d", &value, &freq, &new_mask); | 285 | ret = sscanf(buf, "%d %d %d", &value, &freq, &new_mask); |
300 | if (ret != 3) { | 286 | if (ret != 3) { |
301 | ret = -EINVAL; | 287 | ret = -EINVAL; |
@@ -343,7 +329,7 @@ static ssize_t lbs_threshold_write(uint16_t tlv_type, uint16_t event_mask, | |||
343 | out_events: | 329 | out_events: |
344 | kfree(events); | 330 | kfree(events); |
345 | out_page: | 331 | out_page: |
346 | free_page((unsigned long)buf); | 332 | kfree(buf); |
347 | return ret; | 333 | return ret; |
348 | } | 334 | } |
349 | 335 | ||
@@ -472,22 +458,15 @@ static ssize_t lbs_rdmac_write(struct file *file, | |||
472 | size_t count, loff_t *ppos) | 458 | size_t count, loff_t *ppos) |
473 | { | 459 | { |
474 | struct lbs_private *priv = file->private_data; | 460 | struct lbs_private *priv = file->private_data; |
475 | ssize_t res, buf_size; | 461 | char *buf; |
476 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 462 | |
477 | char *buf = (char *)addr; | 463 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
478 | if (!buf) | 464 | if (IS_ERR(buf)) |
479 | return -ENOMEM; | 465 | return PTR_ERR(buf); |
480 | 466 | ||
481 | buf_size = min(count, len - 1); | ||
482 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
483 | res = -EFAULT; | ||
484 | goto out_unlock; | ||
485 | } | ||
486 | priv->mac_offset = simple_strtoul(buf, NULL, 16); | 467 | priv->mac_offset = simple_strtoul(buf, NULL, 16); |
487 | res = count; | 468 | kfree(buf); |
488 | out_unlock: | 469 | return count; |
489 | free_page(addr); | ||
490 | return res; | ||
491 | } | 470 | } |
492 | 471 | ||
493 | static ssize_t lbs_wrmac_write(struct file *file, | 472 | static ssize_t lbs_wrmac_write(struct file *file, |
@@ -496,18 +475,14 @@ static ssize_t lbs_wrmac_write(struct file *file, | |||
496 | { | 475 | { |
497 | 476 | ||
498 | struct lbs_private *priv = file->private_data; | 477 | struct lbs_private *priv = file->private_data; |
499 | ssize_t res, buf_size; | 478 | ssize_t res; |
500 | u32 offset, value; | 479 | u32 offset, value; |
501 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 480 | char *buf; |
502 | char *buf = (char *)addr; | 481 | |
503 | if (!buf) | 482 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
504 | return -ENOMEM; | 483 | if (IS_ERR(buf)) |
484 | return PTR_ERR(buf); | ||
505 | 485 | ||
506 | buf_size = min(count, len - 1); | ||
507 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
508 | res = -EFAULT; | ||
509 | goto out_unlock; | ||
510 | } | ||
511 | res = sscanf(buf, "%x %x", &offset, &value); | 486 | res = sscanf(buf, "%x %x", &offset, &value); |
512 | if (res != 2) { | 487 | if (res != 2) { |
513 | res = -EFAULT; | 488 | res = -EFAULT; |
@@ -520,7 +495,7 @@ static ssize_t lbs_wrmac_write(struct file *file, | |||
520 | if (!res) | 495 | if (!res) |
521 | res = count; | 496 | res = count; |
522 | out_unlock: | 497 | out_unlock: |
523 | free_page(addr); | 498 | kfree(buf); |
524 | return res; | 499 | return res; |
525 | } | 500 | } |
526 | 501 | ||
@@ -554,22 +529,16 @@ static ssize_t lbs_rdbbp_write(struct file *file, | |||
554 | size_t count, loff_t *ppos) | 529 | size_t count, loff_t *ppos) |
555 | { | 530 | { |
556 | struct lbs_private *priv = file->private_data; | 531 | struct lbs_private *priv = file->private_data; |
557 | ssize_t res, buf_size; | 532 | char *buf; |
558 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 533 | |
559 | char *buf = (char *)addr; | 534 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
560 | if (!buf) | 535 | if (IS_ERR(buf)) |
561 | return -ENOMEM; | 536 | return PTR_ERR(buf); |
562 | 537 | ||
563 | buf_size = min(count, len - 1); | ||
564 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
565 | res = -EFAULT; | ||
566 | goto out_unlock; | ||
567 | } | ||
568 | priv->bbp_offset = simple_strtoul(buf, NULL, 16); | 538 | priv->bbp_offset = simple_strtoul(buf, NULL, 16); |
569 | res = count; | 539 | kfree(buf); |
570 | out_unlock: | 540 | |
571 | free_page(addr); | 541 | return count; |
572 | return res; | ||
573 | } | 542 | } |
574 | 543 | ||
575 | static ssize_t lbs_wrbbp_write(struct file *file, | 544 | static ssize_t lbs_wrbbp_write(struct file *file, |
@@ -578,18 +547,14 @@ static ssize_t lbs_wrbbp_write(struct file *file, | |||
578 | { | 547 | { |
579 | 548 | ||
580 | struct lbs_private *priv = file->private_data; | 549 | struct lbs_private *priv = file->private_data; |
581 | ssize_t res, buf_size; | 550 | ssize_t res; |
582 | u32 offset, value; | 551 | u32 offset, value; |
583 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 552 | char *buf; |
584 | char *buf = (char *)addr; | 553 | |
585 | if (!buf) | 554 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
586 | return -ENOMEM; | 555 | if (IS_ERR(buf)) |
556 | return PTR_ERR(buf); | ||
587 | 557 | ||
588 | buf_size = min(count, len - 1); | ||
589 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
590 | res = -EFAULT; | ||
591 | goto out_unlock; | ||
592 | } | ||
593 | res = sscanf(buf, "%x %x", &offset, &value); | 558 | res = sscanf(buf, "%x %x", &offset, &value); |
594 | if (res != 2) { | 559 | if (res != 2) { |
595 | res = -EFAULT; | 560 | res = -EFAULT; |
@@ -602,7 +567,7 @@ static ssize_t lbs_wrbbp_write(struct file *file, | |||
602 | if (!res) | 567 | if (!res) |
603 | res = count; | 568 | res = count; |
604 | out_unlock: | 569 | out_unlock: |
605 | free_page(addr); | 570 | kfree(buf); |
606 | return res; | 571 | return res; |
607 | } | 572 | } |
608 | 573 | ||
@@ -636,22 +601,15 @@ static ssize_t lbs_rdrf_write(struct file *file, | |||
636 | size_t count, loff_t *ppos) | 601 | size_t count, loff_t *ppos) |
637 | { | 602 | { |
638 | struct lbs_private *priv = file->private_data; | 603 | struct lbs_private *priv = file->private_data; |
639 | ssize_t res, buf_size; | 604 | char *buf; |
640 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 605 | |
641 | char *buf = (char *)addr; | 606 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
642 | if (!buf) | 607 | if (IS_ERR(buf)) |
643 | return -ENOMEM; | 608 | return PTR_ERR(buf); |
644 | 609 | ||
645 | buf_size = min(count, len - 1); | ||
646 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
647 | res = -EFAULT; | ||
648 | goto out_unlock; | ||
649 | } | ||
650 | priv->rf_offset = simple_strtoul(buf, NULL, 16); | 610 | priv->rf_offset = simple_strtoul(buf, NULL, 16); |
651 | res = count; | 611 | kfree(buf); |
652 | out_unlock: | 612 | return count; |
653 | free_page(addr); | ||
654 | return res; | ||
655 | } | 613 | } |
656 | 614 | ||
657 | static ssize_t lbs_wrrf_write(struct file *file, | 615 | static ssize_t lbs_wrrf_write(struct file *file, |
@@ -660,18 +618,14 @@ static ssize_t lbs_wrrf_write(struct file *file, | |||
660 | { | 618 | { |
661 | 619 | ||
662 | struct lbs_private *priv = file->private_data; | 620 | struct lbs_private *priv = file->private_data; |
663 | ssize_t res, buf_size; | 621 | ssize_t res; |
664 | u32 offset, value; | 622 | u32 offset, value; |
665 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 623 | char *buf; |
666 | char *buf = (char *)addr; | 624 | |
667 | if (!buf) | 625 | buf = memdup_user_nul(userbuf, min(count, len - 1)); |
668 | return -ENOMEM; | 626 | if (IS_ERR(buf)) |
627 | return PTR_ERR(buf); | ||
669 | 628 | ||
670 | buf_size = min(count, len - 1); | ||
671 | if (copy_from_user(buf, userbuf, buf_size)) { | ||
672 | res = -EFAULT; | ||
673 | goto out_unlock; | ||
674 | } | ||
675 | res = sscanf(buf, "%x %x", &offset, &value); | 629 | res = sscanf(buf, "%x %x", &offset, &value); |
676 | if (res != 2) { | 630 | if (res != 2) { |
677 | res = -EFAULT; | 631 | res = -EFAULT; |
@@ -684,7 +638,7 @@ static ssize_t lbs_wrrf_write(struct file *file, | |||
684 | if (!res) | 638 | if (!res) |
685 | res = count; | 639 | res = count; |
686 | out_unlock: | 640 | out_unlock: |
687 | free_page(addr); | 641 | kfree(buf); |
688 | return res; | 642 | return res; |
689 | } | 643 | } |
690 | 644 | ||
@@ -915,16 +869,9 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | |||
915 | if (cnt == 0) | 869 | if (cnt == 0) |
916 | return 0; | 870 | return 0; |
917 | 871 | ||
918 | pdata = kmalloc(cnt + 1, GFP_KERNEL); | 872 | pdata = memdup_user_nul(buf, cnt); |
919 | if (pdata == NULL) | 873 | if (IS_ERR(pdata)) |
920 | return 0; | 874 | return PTR_ERR(pdata); |
921 | |||
922 | if (copy_from_user(pdata, buf, cnt)) { | ||
923 | lbs_deb_debugfs("Copy from user failed\n"); | ||
924 | kfree(pdata); | ||
925 | return 0; | ||
926 | } | ||
927 | pdata[cnt] = '\0'; | ||
928 | 875 | ||
929 | p0 = pdata; | 876 | p0 = pdata; |
930 | for (i = 0; i < num_of_items; i++) { | 877 | for (i = 0; i < num_of_items; i++) { |
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c index 9824d8dd2b44..241e1c3fbf08 100644 --- a/drivers/net/wireless/mwifiex/debugfs.c +++ b/drivers/net/wireless/mwifiex/debugfs.c | |||
@@ -447,20 +447,13 @@ static ssize_t | |||
447 | mwifiex_regrdwr_write(struct file *file, | 447 | mwifiex_regrdwr_write(struct file *file, |
448 | const char __user *ubuf, size_t count, loff_t *ppos) | 448 | const char __user *ubuf, size_t count, loff_t *ppos) |
449 | { | 449 | { |
450 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 450 | char *buf; |
451 | char *buf = (char *) addr; | ||
452 | size_t buf_size = min_t(size_t, count, PAGE_SIZE - 1); | ||
453 | int ret; | 451 | int ret; |
454 | u32 reg_type = 0, reg_offset = 0, reg_value = UINT_MAX; | 452 | u32 reg_type = 0, reg_offset = 0, reg_value = UINT_MAX; |
455 | 453 | ||
456 | if (!buf) | 454 | buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); |
457 | return -ENOMEM; | 455 | if (IS_ERR(buf)) |
458 | 456 | return PTR_ERR(buf); | |
459 | |||
460 | if (copy_from_user(buf, ubuf, buf_size)) { | ||
461 | ret = -EFAULT; | ||
462 | goto done; | ||
463 | } | ||
464 | 457 | ||
465 | sscanf(buf, "%u %x %x", ®_type, ®_offset, ®_value); | 458 | sscanf(buf, "%u %x %x", ®_type, ®_offset, ®_value); |
466 | 459 | ||
@@ -474,7 +467,7 @@ mwifiex_regrdwr_write(struct file *file, | |||
474 | ret = count; | 467 | ret = count; |
475 | } | 468 | } |
476 | done: | 469 | done: |
477 | free_page(addr); | 470 | kfree(buf); |
478 | return ret; | 471 | return ret; |
479 | } | 472 | } |
480 | 473 | ||
@@ -572,17 +565,11 @@ mwifiex_debug_mask_write(struct file *file, const char __user *ubuf, | |||
572 | int ret; | 565 | int ret; |
573 | unsigned long debug_mask; | 566 | unsigned long debug_mask; |
574 | struct mwifiex_private *priv = (void *)file->private_data; | 567 | struct mwifiex_private *priv = (void *)file->private_data; |
575 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 568 | char *buf; |
576 | char *buf = (void *)addr; | ||
577 | size_t buf_size = min(count, (size_t)(PAGE_SIZE - 1)); | ||
578 | 569 | ||
579 | if (!buf) | 570 | buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); |
580 | return -ENOMEM; | 571 | if (IS_ERR(buf)) |
581 | 572 | return PTR_ERR(buf); | |
582 | if (copy_from_user(buf, ubuf, buf_size)) { | ||
583 | ret = -EFAULT; | ||
584 | goto done; | ||
585 | } | ||
586 | 573 | ||
587 | if (kstrtoul(buf, 0, &debug_mask)) { | 574 | if (kstrtoul(buf, 0, &debug_mask)) { |
588 | ret = -EINVAL; | 575 | ret = -EINVAL; |
@@ -592,7 +579,7 @@ mwifiex_debug_mask_write(struct file *file, const char __user *ubuf, | |||
592 | priv->adapter->debug_mask = debug_mask; | 579 | priv->adapter->debug_mask = debug_mask; |
593 | ret = count; | 580 | ret = count; |
594 | done: | 581 | done: |
595 | free_page(addr); | 582 | kfree(buf); |
596 | return ret; | 583 | return ret; |
597 | } | 584 | } |
598 | 585 | ||
@@ -609,17 +596,11 @@ mwifiex_memrw_write(struct file *file, const char __user *ubuf, size_t count, | |||
609 | struct mwifiex_ds_mem_rw mem_rw; | 596 | struct mwifiex_ds_mem_rw mem_rw; |
610 | u16 cmd_action; | 597 | u16 cmd_action; |
611 | struct mwifiex_private *priv = (void *)file->private_data; | 598 | struct mwifiex_private *priv = (void *)file->private_data; |
612 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 599 | char *buf; |
613 | char *buf = (void *)addr; | ||
614 | size_t buf_size = min(count, (size_t)(PAGE_SIZE - 1)); | ||
615 | |||
616 | if (!buf) | ||
617 | return -ENOMEM; | ||
618 | 600 | ||
619 | if (copy_from_user(buf, ubuf, buf_size)) { | 601 | buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); |
620 | ret = -EFAULT; | 602 | if (IS_ERR(buf)) |
621 | goto done; | 603 | return PTR_ERR(buf); |
622 | } | ||
623 | 604 | ||
624 | ret = sscanf(buf, "%c %x %x", &cmd, &mem_rw.addr, &mem_rw.value); | 605 | ret = sscanf(buf, "%c %x %x", &cmd, &mem_rw.addr, &mem_rw.value); |
625 | if (ret != 3) { | 606 | if (ret != 3) { |
@@ -645,7 +626,7 @@ mwifiex_memrw_write(struct file *file, const char __user *ubuf, size_t count, | |||
645 | ret = count; | 626 | ret = count; |
646 | 627 | ||
647 | done: | 628 | done: |
648 | free_page(addr); | 629 | kfree(buf); |
649 | return ret; | 630 | return ret; |
650 | } | 631 | } |
651 | 632 | ||
@@ -686,20 +667,13 @@ static ssize_t | |||
686 | mwifiex_rdeeprom_write(struct file *file, | 667 | mwifiex_rdeeprom_write(struct file *file, |
687 | const char __user *ubuf, size_t count, loff_t *ppos) | 668 | const char __user *ubuf, size_t count, loff_t *ppos) |
688 | { | 669 | { |
689 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 670 | char *buf; |
690 | char *buf = (char *) addr; | ||
691 | size_t buf_size = min_t(size_t, count, PAGE_SIZE - 1); | ||
692 | int ret = 0; | 671 | int ret = 0; |
693 | int offset = -1, bytes = -1; | 672 | int offset = -1, bytes = -1; |
694 | 673 | ||
695 | if (!buf) | 674 | buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); |
696 | return -ENOMEM; | 675 | if (IS_ERR(buf)) |
697 | 676 | return PTR_ERR(buf); | |
698 | |||
699 | if (copy_from_user(buf, ubuf, buf_size)) { | ||
700 | ret = -EFAULT; | ||
701 | goto done; | ||
702 | } | ||
703 | 677 | ||
704 | sscanf(buf, "%d %d", &offset, &bytes); | 678 | sscanf(buf, "%d %d", &offset, &bytes); |
705 | 679 | ||
@@ -712,7 +686,7 @@ mwifiex_rdeeprom_write(struct file *file, | |||
712 | ret = count; | 686 | ret = count; |
713 | } | 687 | } |
714 | done: | 688 | done: |
715 | free_page(addr); | 689 | kfree(buf); |
716 | return ret; | 690 | return ret; |
717 | } | 691 | } |
718 | 692 | ||
@@ -771,21 +745,15 @@ mwifiex_hscfg_write(struct file *file, const char __user *ubuf, | |||
771 | size_t count, loff_t *ppos) | 745 | size_t count, loff_t *ppos) |
772 | { | 746 | { |
773 | struct mwifiex_private *priv = (void *)file->private_data; | 747 | struct mwifiex_private *priv = (void *)file->private_data; |
774 | unsigned long addr = get_zeroed_page(GFP_KERNEL); | 748 | char *buf; |
775 | char *buf = (char *)addr; | ||
776 | size_t buf_size = min_t(size_t, count, PAGE_SIZE - 1); | ||
777 | int ret, arg_num; | 749 | int ret, arg_num; |
778 | struct mwifiex_ds_hs_cfg hscfg; | 750 | struct mwifiex_ds_hs_cfg hscfg; |
779 | int conditions = HS_CFG_COND_DEF; | 751 | int conditions = HS_CFG_COND_DEF; |
780 | u32 gpio = HS_CFG_GPIO_DEF, gap = HS_CFG_GAP_DEF; | 752 | u32 gpio = HS_CFG_GPIO_DEF, gap = HS_CFG_GAP_DEF; |
781 | 753 | ||
782 | if (!buf) | 754 | buf = memdup_user_nul(ubuf, min(count, (size_t)(PAGE_SIZE - 1))); |
783 | return -ENOMEM; | 755 | if (IS_ERR(buf)) |
784 | 756 | return PTR_ERR(buf); | |
785 | if (copy_from_user(buf, ubuf, buf_size)) { | ||
786 | ret = -EFAULT; | ||
787 | goto done; | ||
788 | } | ||
789 | 757 | ||
790 | arg_num = sscanf(buf, "%d %x %x", &conditions, &gpio, &gap); | 758 | arg_num = sscanf(buf, "%d %x %x", &conditions, &gpio, &gap); |
791 | 759 | ||
@@ -823,7 +791,7 @@ mwifiex_hscfg_write(struct file *file, const char __user *ubuf, | |||
823 | priv->adapter->hs_enabling = false; | 791 | priv->adapter->hs_enabling = false; |
824 | ret = count; | 792 | ret = count; |
825 | done: | 793 | done: |
826 | free_page(addr); | 794 | kfree(buf); |
827 | return ret; | 795 | return ret; |
828 | } | 796 | } |
829 | 797 | ||
diff --git a/drivers/net/wireless/ti/wlcore/debugfs.c b/drivers/net/wireless/ti/wlcore/debugfs.c index eb43f94a1597..be72306f8c69 100644 --- a/drivers/net/wireless/ti/wlcore/debugfs.c +++ b/drivers/net/wireless/ti/wlcore/debugfs.c | |||
@@ -1205,26 +1205,11 @@ err_out: | |||
1205 | 1205 | ||
1206 | static loff_t dev_mem_seek(struct file *file, loff_t offset, int orig) | 1206 | static loff_t dev_mem_seek(struct file *file, loff_t offset, int orig) |
1207 | { | 1207 | { |
1208 | loff_t ret; | ||
1209 | |||
1210 | /* only requests of dword-aligned size and offset are supported */ | 1208 | /* only requests of dword-aligned size and offset are supported */ |
1211 | if (offset % 4) | 1209 | if (offset % 4) |
1212 | return -EINVAL; | 1210 | return -EINVAL; |
1213 | 1211 | ||
1214 | switch (orig) { | 1212 | return no_seek_end_llseek(file, offset, orig); |
1215 | case SEEK_SET: | ||
1216 | file->f_pos = offset; | ||
1217 | ret = file->f_pos; | ||
1218 | break; | ||
1219 | case SEEK_CUR: | ||
1220 | file->f_pos += offset; | ||
1221 | ret = file->f_pos; | ||
1222 | break; | ||
1223 | default: | ||
1224 | ret = -EINVAL; | ||
1225 | } | ||
1226 | |||
1227 | return ret; | ||
1228 | } | 1213 | } |
1229 | 1214 | ||
1230 | static const struct file_operations dev_mem_ops = { | 1215 | static const struct file_operations dev_mem_ops = { |
diff --git a/drivers/s390/char/vmcp.c b/drivers/s390/char/vmcp.c index 0fdedadff7bc..2a67b496a9e2 100644 --- a/drivers/s390/char/vmcp.c +++ b/drivers/s390/char/vmcp.c | |||
@@ -88,14 +88,9 @@ vmcp_write(struct file *file, const char __user *buff, size_t count, | |||
88 | 88 | ||
89 | if (count > 240) | 89 | if (count > 240) |
90 | return -EINVAL; | 90 | return -EINVAL; |
91 | cmd = kmalloc(count + 1, GFP_KERNEL); | 91 | cmd = memdup_user_nul(buff, count); |
92 | if (!cmd) | 92 | if (IS_ERR(cmd)) |
93 | return -ENOMEM; | 93 | return PTR_ERR(cmd); |
94 | if (copy_from_user(cmd, buff, count)) { | ||
95 | kfree(cmd); | ||
96 | return -EFAULT; | ||
97 | } | ||
98 | cmd[count] = '\0'; | ||
99 | session = file->private_data; | 94 | session = file->private_data; |
100 | if (mutex_lock_interruptible(&session->mutex)) { | 95 | if (mutex_lock_interruptible(&session->mutex)) { |
101 | kfree(cmd); | 96 | kfree(cmd); |
diff --git a/drivers/s390/char/vmur.c b/drivers/s390/char/vmur.c index 0efb27f6f199..6c30e93ab8fa 100644 --- a/drivers/s390/char/vmur.c +++ b/drivers/s390/char/vmur.c | |||
@@ -782,24 +782,11 @@ static int ur_release(struct inode *inode, struct file *file) | |||
782 | 782 | ||
783 | static loff_t ur_llseek(struct file *file, loff_t offset, int whence) | 783 | static loff_t ur_llseek(struct file *file, loff_t offset, int whence) |
784 | { | 784 | { |
785 | loff_t newpos; | ||
786 | |||
787 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) | 785 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) |
788 | return -ESPIPE; /* seek allowed only for reader */ | 786 | return -ESPIPE; /* seek allowed only for reader */ |
789 | if (offset % PAGE_SIZE) | 787 | if (offset % PAGE_SIZE) |
790 | return -ESPIPE; /* only multiples of 4K allowed */ | 788 | return -ESPIPE; /* only multiples of 4K allowed */ |
791 | switch (whence) { | 789 | return no_seek_end_llseek(file, offset, whence); |
792 | case 0: /* SEEK_SET */ | ||
793 | newpos = offset; | ||
794 | break; | ||
795 | case 1: /* SEEK_CUR */ | ||
796 | newpos = file->f_pos + offset; | ||
797 | break; | ||
798 | default: | ||
799 | return -EINVAL; | ||
800 | } | ||
801 | file->f_pos = newpos; | ||
802 | return newpos; | ||
803 | } | 790 | } |
804 | 791 | ||
805 | static const struct file_operations ur_fops = { | 792 | static const struct file_operations ur_fops = { |
diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index 823f41fc4bbd..3339b862ec17 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c | |||
@@ -385,18 +385,7 @@ static loff_t zcore_lseek(struct file *file, loff_t offset, int orig) | |||
385 | loff_t rc; | 385 | loff_t rc; |
386 | 386 | ||
387 | mutex_lock(&zcore_mutex); | 387 | mutex_lock(&zcore_mutex); |
388 | switch (orig) { | 388 | rc = no_seek_end_llseek(file, offset, orig); |
389 | case 0: | ||
390 | file->f_pos = offset; | ||
391 | rc = file->f_pos; | ||
392 | break; | ||
393 | case 1: | ||
394 | file->f_pos += offset; | ||
395 | rc = file->f_pos; | ||
396 | break; | ||
397 | default: | ||
398 | rc = -EINVAL; | ||
399 | } | ||
400 | mutex_unlock(&zcore_mutex); | 389 | mutex_unlock(&zcore_mutex); |
401 | return rc; | 390 | return rc; |
402 | } | 391 | } |
diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index 5843288f64bc..e077ebd89319 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c | |||
@@ -390,16 +390,9 @@ static int copyin_string(char __user *user, size_t len, char **ptr) | |||
390 | if ((ssize_t)len < 0 || (ssize_t)(len + 1) < 0) | 390 | if ((ssize_t)len < 0 || (ssize_t)(len + 1) < 0) |
391 | return -EINVAL; | 391 | return -EINVAL; |
392 | 392 | ||
393 | tmp = kmalloc(len + 1, GFP_KERNEL); | 393 | tmp = memdup_user_nul(user, len); |
394 | if (!tmp) | 394 | if (IS_ERR(tmp)) |
395 | return -ENOMEM; | 395 | return PTR_ERR(tmp); |
396 | |||
397 | if (copy_from_user(tmp, user, len)) { | ||
398 | kfree(tmp); | ||
399 | return -EFAULT; | ||
400 | } | ||
401 | |||
402 | tmp[len] = '\0'; | ||
403 | 396 | ||
404 | *ptr = tmp; | 397 | *ptr = tmp; |
405 | 398 | ||
diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c index 02f27593013e..31cd6b323a39 100644 --- a/drivers/staging/lustre/lustre/llite/file.c +++ b/drivers/staging/lustre/lustre/llite/file.c | |||
@@ -3139,7 +3139,7 @@ struct file_operations ll_file_operations_noflock = { | |||
3139 | .lock = ll_file_noflock | 3139 | .lock = ll_file_noflock |
3140 | }; | 3140 | }; |
3141 | 3141 | ||
3142 | struct inode_operations ll_file_inode_operations = { | 3142 | const struct inode_operations ll_file_inode_operations = { |
3143 | .setattr = ll_setattr, | 3143 | .setattr = ll_setattr, |
3144 | .getattr = ll_getattr, | 3144 | .getattr = ll_getattr, |
3145 | .permission = ll_inode_permission, | 3145 | .permission = ll_inode_permission, |
diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h index 9096d311e45d..6102b29dbf30 100644 --- a/drivers/staging/lustre/lustre/llite/llite_internal.h +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h | |||
@@ -705,7 +705,7 @@ extern const struct address_space_operations ll_aops; | |||
705 | extern struct file_operations ll_file_operations; | 705 | extern struct file_operations ll_file_operations; |
706 | extern struct file_operations ll_file_operations_flock; | 706 | extern struct file_operations ll_file_operations_flock; |
707 | extern struct file_operations ll_file_operations_noflock; | 707 | extern struct file_operations ll_file_operations_noflock; |
708 | extern struct inode_operations ll_file_inode_operations; | 708 | extern const struct inode_operations ll_file_inode_operations; |
709 | int ll_have_md_lock(struct inode *inode, __u64 *bits, | 709 | int ll_have_md_lock(struct inode *inode, __u64 *bits, |
710 | ldlm_mode_t l_req_mode); | 710 | ldlm_mode_t l_req_mode); |
711 | ldlm_mode_t ll_take_md_lock(struct inode *inode, __u64 bits, | 711 | ldlm_mode_t ll_take_md_lock(struct inode *inode, __u64 bits, |
@@ -805,7 +805,7 @@ struct inode *search_inode_for_lustre(struct super_block *sb, | |||
805 | const struct lu_fid *fid); | 805 | const struct lu_fid *fid); |
806 | 806 | ||
807 | /* llite/symlink.c */ | 807 | /* llite/symlink.c */ |
808 | extern struct inode_operations ll_fast_symlink_inode_operations; | 808 | extern const struct inode_operations ll_fast_symlink_inode_operations; |
809 | 809 | ||
810 | /* llite/llite_close.c */ | 810 | /* llite/llite_close.c */ |
811 | struct ll_close_queue { | 811 | struct ll_close_queue { |
diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c index 2ca22001a534..64db5e86672f 100644 --- a/drivers/staging/lustre/lustre/llite/namei.c +++ b/drivers/staging/lustre/lustre/llite/namei.c | |||
@@ -126,9 +126,7 @@ struct inode *ll_iget(struct super_block *sb, ino_t hash, | |||
126 | rc = cl_file_inode_init(inode, md); | 126 | rc = cl_file_inode_init(inode, md); |
127 | } | 127 | } |
128 | if (rc != 0) { | 128 | if (rc != 0) { |
129 | make_bad_inode(inode); | 129 | iget_failed(inode); |
130 | unlock_new_inode(inode); | ||
131 | iput(inode); | ||
132 | inode = ERR_PTR(rc); | 130 | inode = ERR_PTR(rc); |
133 | } else | 131 | } else |
134 | unlock_new_inode(inode); | 132 | unlock_new_inode(inode); |
diff --git a/drivers/staging/lustre/lustre/llite/symlink.c b/drivers/staging/lustre/lustre/llite/symlink.c index e489a3271f06..2610348f6c72 100644 --- a/drivers/staging/lustre/lustre/llite/symlink.c +++ b/drivers/staging/lustre/lustre/llite/symlink.c | |||
@@ -149,7 +149,7 @@ static const char *ll_get_link(struct dentry *dentry, | |||
149 | return symname; | 149 | return symname; |
150 | } | 150 | } |
151 | 151 | ||
152 | struct inode_operations ll_fast_symlink_inode_operations = { | 152 | const struct inode_operations ll_fast_symlink_inode_operations = { |
153 | .readlink = generic_readlink, | 153 | .readlink = generic_readlink, |
154 | .setattr = ll_setattr, | 154 | .setattr = ll_setattr, |
155 | .get_link = ll_get_link, | 155 | .get_link = ll_get_link, |
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 2a3bbdf7eb94..cffa0a0d7de2 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c | |||
@@ -661,32 +661,8 @@ static unsigned int usb_device_poll(struct file *file, | |||
661 | return 0; | 661 | return 0; |
662 | } | 662 | } |
663 | 663 | ||
664 | static loff_t usb_device_lseek(struct file *file, loff_t offset, int orig) | ||
665 | { | ||
666 | loff_t ret; | ||
667 | |||
668 | mutex_lock(&file_inode(file)->i_mutex); | ||
669 | |||
670 | switch (orig) { | ||
671 | case 0: | ||
672 | file->f_pos = offset; | ||
673 | ret = file->f_pos; | ||
674 | break; | ||
675 | case 1: | ||
676 | file->f_pos += offset; | ||
677 | ret = file->f_pos; | ||
678 | break; | ||
679 | case 2: | ||
680 | default: | ||
681 | ret = -EINVAL; | ||
682 | } | ||
683 | |||
684 | mutex_unlock(&file_inode(file)->i_mutex); | ||
685 | return ret; | ||
686 | } | ||
687 | |||
688 | const struct file_operations usbfs_devices_fops = { | 664 | const struct file_operations usbfs_devices_fops = { |
689 | .llseek = usb_device_lseek, | 665 | .llseek = no_seek_end_llseek, |
690 | .read = usb_device_read, | 666 | .read = usb_device_read, |
691 | .poll = usb_device_poll, | 667 | .poll = usb_device_poll, |
692 | }; | 668 | }; |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 38ae877c46e3..dbc3e143453a 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -157,30 +157,6 @@ static int connected(struct usb_dev_state *ps) | |||
157 | ps->dev->state != USB_STATE_NOTATTACHED); | 157 | ps->dev->state != USB_STATE_NOTATTACHED); |
158 | } | 158 | } |
159 | 159 | ||
160 | static loff_t usbdev_lseek(struct file *file, loff_t offset, int orig) | ||
161 | { | ||
162 | loff_t ret; | ||
163 | |||
164 | mutex_lock(&file_inode(file)->i_mutex); | ||
165 | |||
166 | switch (orig) { | ||
167 | case 0: | ||
168 | file->f_pos = offset; | ||
169 | ret = file->f_pos; | ||
170 | break; | ||
171 | case 1: | ||
172 | file->f_pos += offset; | ||
173 | ret = file->f_pos; | ||
174 | break; | ||
175 | case 2: | ||
176 | default: | ||
177 | ret = -EINVAL; | ||
178 | } | ||
179 | |||
180 | mutex_unlock(&file_inode(file)->i_mutex); | ||
181 | return ret; | ||
182 | } | ||
183 | |||
184 | static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes, | 160 | static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes, |
185 | loff_t *ppos) | 161 | loff_t *ppos) |
186 | { | 162 | { |
@@ -2366,7 +2342,7 @@ static unsigned int usbdev_poll(struct file *file, | |||
2366 | 2342 | ||
2367 | const struct file_operations usbdev_file_operations = { | 2343 | const struct file_operations usbdev_file_operations = { |
2368 | .owner = THIS_MODULE, | 2344 | .owner = THIS_MODULE, |
2369 | .llseek = usbdev_lseek, | 2345 | .llseek = no_seek_end_llseek, |
2370 | .read = usbdev_read, | 2346 | .read = usbdev_read, |
2371 | .poll = usbdev_poll, | 2347 | .poll = usbdev_poll, |
2372 | .unlocked_ioctl = usbdev_ioctl, | 2348 | .unlocked_ioctl = usbdev_ioctl, |
diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index 1b28a000d5c6..9c6635d43db0 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c | |||
@@ -584,27 +584,8 @@ static int uhci_debug_open(struct inode *inode, struct file *file) | |||
584 | 584 | ||
585 | static loff_t uhci_debug_lseek(struct file *file, loff_t off, int whence) | 585 | static loff_t uhci_debug_lseek(struct file *file, loff_t off, int whence) |
586 | { | 586 | { |
587 | struct uhci_debug *up; | 587 | struct uhci_debug *up = file->private_data; |
588 | loff_t new = -1; | 588 | return no_seek_end_llseek_size(file, off, whence, up->size); |
589 | |||
590 | up = file->private_data; | ||
591 | |||
592 | /* | ||
593 | * XXX: atomic 64bit seek access, but that needs to be fixed in the VFS | ||
594 | */ | ||
595 | switch (whence) { | ||
596 | case 0: | ||
597 | new = off; | ||
598 | break; | ||
599 | case 1: | ||
600 | new = file->f_pos + off; | ||
601 | break; | ||
602 | } | ||
603 | |||
604 | if (new < 0 || new > up->size) | ||
605 | return -EINVAL; | ||
606 | |||
607 | return (file->f_pos = new); | ||
608 | } | 589 | } |
609 | 590 | ||
610 | static ssize_t uhci_debug_read(struct file *file, char __user *buf, | 591 | static ssize_t uhci_debug_read(struct file *file, char __user *buf, |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index 306d6852ebc7..8efbabacc84e 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
@@ -2825,21 +2825,7 @@ sisusb_lseek(struct file *file, loff_t offset, int orig) | |||
2825 | return -ENODEV; | 2825 | return -ENODEV; |
2826 | } | 2826 | } |
2827 | 2827 | ||
2828 | switch (orig) { | 2828 | ret = no_seek_end_llseek(file, offset, orig); |
2829 | case 0: | ||
2830 | file->f_pos = offset; | ||
2831 | ret = file->f_pos; | ||
2832 | /* never negative, no force_successful_syscall needed */ | ||
2833 | break; | ||
2834 | case 1: | ||
2835 | file->f_pos += offset; | ||
2836 | ret = file->f_pos; | ||
2837 | /* never negative, no force_successful_syscall needed */ | ||
2838 | break; | ||
2839 | default: | ||
2840 | /* seeking relative to "end of file" is not supported */ | ||
2841 | ret = -EINVAL; | ||
2842 | } | ||
2843 | 2829 | ||
2844 | mutex_unlock(&sisusb->lock); | 2830 | mutex_unlock(&sisusb->lock); |
2845 | return ret; | 2831 | return ret; |
diff --git a/fs/9p/cache.c b/fs/9p/cache.c index a69260f27555..103ca5e1267b 100644 --- a/fs/9p/cache.c +++ b/fs/9p/cache.c | |||
@@ -243,14 +243,14 @@ void v9fs_cache_inode_set_cookie(struct inode *inode, struct file *filp) | |||
243 | if (!v9inode->fscache) | 243 | if (!v9inode->fscache) |
244 | return; | 244 | return; |
245 | 245 | ||
246 | spin_lock(&v9inode->fscache_lock); | 246 | mutex_lock(&v9inode->fscache_lock); |
247 | 247 | ||
248 | if ((filp->f_flags & O_ACCMODE) != O_RDONLY) | 248 | if ((filp->f_flags & O_ACCMODE) != O_RDONLY) |
249 | v9fs_cache_inode_flush_cookie(inode); | 249 | v9fs_cache_inode_flush_cookie(inode); |
250 | else | 250 | else |
251 | v9fs_cache_inode_get_cookie(inode); | 251 | v9fs_cache_inode_get_cookie(inode); |
252 | 252 | ||
253 | spin_unlock(&v9inode->fscache_lock); | 253 | mutex_unlock(&v9inode->fscache_lock); |
254 | } | 254 | } |
255 | 255 | ||
256 | void v9fs_cache_inode_reset_cookie(struct inode *inode) | 256 | void v9fs_cache_inode_reset_cookie(struct inode *inode) |
@@ -264,7 +264,7 @@ void v9fs_cache_inode_reset_cookie(struct inode *inode) | |||
264 | 264 | ||
265 | old = v9inode->fscache; | 265 | old = v9inode->fscache; |
266 | 266 | ||
267 | spin_lock(&v9inode->fscache_lock); | 267 | mutex_lock(&v9inode->fscache_lock); |
268 | fscache_relinquish_cookie(v9inode->fscache, 1); | 268 | fscache_relinquish_cookie(v9inode->fscache, 1); |
269 | 269 | ||
270 | v9ses = v9fs_inode2v9ses(inode); | 270 | v9ses = v9fs_inode2v9ses(inode); |
@@ -274,7 +274,7 @@ void v9fs_cache_inode_reset_cookie(struct inode *inode) | |||
274 | p9_debug(P9_DEBUG_FSC, "inode %p revalidating cookie old %p new %p\n", | 274 | p9_debug(P9_DEBUG_FSC, "inode %p revalidating cookie old %p new %p\n", |
275 | inode, old, v9inode->fscache); | 275 | inode, old, v9inode->fscache); |
276 | 276 | ||
277 | spin_unlock(&v9inode->fscache_lock); | 277 | mutex_unlock(&v9inode->fscache_lock); |
278 | } | 278 | } |
279 | 279 | ||
280 | int __v9fs_fscache_release_page(struct page *page, gfp_t gfp) | 280 | int __v9fs_fscache_release_page(struct page *page, gfp_t gfp) |
diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index 0923f2cf3c80..6877050384a1 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h | |||
@@ -123,7 +123,7 @@ struct v9fs_session_info { | |||
123 | 123 | ||
124 | struct v9fs_inode { | 124 | struct v9fs_inode { |
125 | #ifdef CONFIG_9P_FSCACHE | 125 | #ifdef CONFIG_9P_FSCACHE |
126 | spinlock_t fscache_lock; | 126 | struct mutex fscache_lock; |
127 | struct fscache_cookie *fscache; | 127 | struct fscache_cookie *fscache; |
128 | #endif | 128 | #endif |
129 | struct p9_qid qid; | 129 | struct p9_qid qid; |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index c7cc7c30f0c8..3a08b3e6ff1d 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -244,7 +244,7 @@ struct inode *v9fs_alloc_inode(struct super_block *sb) | |||
244 | return NULL; | 244 | return NULL; |
245 | #ifdef CONFIG_9P_FSCACHE | 245 | #ifdef CONFIG_9P_FSCACHE |
246 | v9inode->fscache = NULL; | 246 | v9inode->fscache = NULL; |
247 | spin_lock_init(&v9inode->fscache_lock); | 247 | mutex_init(&v9inode->fscache_lock); |
248 | #endif | 248 | #endif |
249 | v9inode->writeback_fid = NULL; | 249 | v9inode->writeback_fid = NULL; |
250 | v9inode->cache_validity = 0; | 250 | v9inode->cache_validity = 0; |
diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h index 24575d9d882d..ea4aba56f29d 100644 --- a/fs/adfs/adfs.h +++ b/fs/adfs/adfs.h | |||
@@ -45,7 +45,7 @@ struct adfs_dir_ops; | |||
45 | struct adfs_sb_info { | 45 | struct adfs_sb_info { |
46 | union { struct { | 46 | union { struct { |
47 | struct adfs_discmap *s_map; /* bh list containing map */ | 47 | struct adfs_discmap *s_map; /* bh list containing map */ |
48 | struct adfs_dir_ops *s_dir; /* directory operations */ | 48 | const struct adfs_dir_ops *s_dir; /* directory operations */ |
49 | }; | 49 | }; |
50 | struct rcu_head rcu; /* used only at shutdown time */ | 50 | struct rcu_head rcu; /* used only at shutdown time */ |
51 | }; | 51 | }; |
@@ -168,8 +168,8 @@ void __adfs_error(struct super_block *sb, const char *function, | |||
168 | extern const struct inode_operations adfs_dir_inode_operations; | 168 | extern const struct inode_operations adfs_dir_inode_operations; |
169 | extern const struct file_operations adfs_dir_operations; | 169 | extern const struct file_operations adfs_dir_operations; |
170 | extern const struct dentry_operations adfs_dentry_operations; | 170 | extern const struct dentry_operations adfs_dentry_operations; |
171 | extern struct adfs_dir_ops adfs_f_dir_ops; | 171 | extern const struct adfs_dir_ops adfs_f_dir_ops; |
172 | extern struct adfs_dir_ops adfs_fplus_dir_ops; | 172 | extern const struct adfs_dir_ops adfs_fplus_dir_ops; |
173 | 173 | ||
174 | extern int adfs_dir_update(struct super_block *sb, struct object_info *obj, | 174 | extern int adfs_dir_update(struct super_block *sb, struct object_info *obj, |
175 | int wait); | 175 | int wait); |
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index 51c279a29845..fd4cf2c48e48 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c | |||
@@ -21,7 +21,7 @@ adfs_readdir(struct file *file, struct dir_context *ctx) | |||
21 | { | 21 | { |
22 | struct inode *inode = file_inode(file); | 22 | struct inode *inode = file_inode(file); |
23 | struct super_block *sb = inode->i_sb; | 23 | struct super_block *sb = inode->i_sb; |
24 | struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir; | 24 | const struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir; |
25 | struct object_info obj; | 25 | struct object_info obj; |
26 | struct adfs_dir dir; | 26 | struct adfs_dir dir; |
27 | int ret = 0; | 27 | int ret = 0; |
@@ -69,7 +69,7 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait) | |||
69 | { | 69 | { |
70 | int ret = -EINVAL; | 70 | int ret = -EINVAL; |
71 | #ifdef CONFIG_ADFS_FS_RW | 71 | #ifdef CONFIG_ADFS_FS_RW |
72 | struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir; | 72 | const struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir; |
73 | struct adfs_dir dir; | 73 | struct adfs_dir dir; |
74 | 74 | ||
75 | printk(KERN_INFO "adfs_dir_update: object %06X in dir %06X\n", | 75 | printk(KERN_INFO "adfs_dir_update: object %06X in dir %06X\n", |
@@ -129,7 +129,7 @@ static int | |||
129 | adfs_dir_lookup_byname(struct inode *inode, struct qstr *name, struct object_info *obj) | 129 | adfs_dir_lookup_byname(struct inode *inode, struct qstr *name, struct object_info *obj) |
130 | { | 130 | { |
131 | struct super_block *sb = inode->i_sb; | 131 | struct super_block *sb = inode->i_sb; |
132 | struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir; | 132 | const struct adfs_dir_ops *ops = ADFS_SB(sb)->s_dir; |
133 | struct adfs_dir dir; | 133 | struct adfs_dir dir; |
134 | int ret; | 134 | int ret; |
135 | 135 | ||
diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c index 4bbe853ee50a..0fbfd0b04ae0 100644 --- a/fs/adfs/dir_f.c +++ b/fs/adfs/dir_f.c | |||
@@ -476,7 +476,7 @@ adfs_f_free(struct adfs_dir *dir) | |||
476 | dir->sb = NULL; | 476 | dir->sb = NULL; |
477 | } | 477 | } |
478 | 478 | ||
479 | struct adfs_dir_ops adfs_f_dir_ops = { | 479 | const struct adfs_dir_ops adfs_f_dir_ops = { |
480 | .read = adfs_f_read, | 480 | .read = adfs_f_read, |
481 | .setpos = adfs_f_setpos, | 481 | .setpos = adfs_f_setpos, |
482 | .getnext = adfs_f_getnext, | 482 | .getnext = adfs_f_getnext, |
diff --git a/fs/adfs/dir_fplus.c b/fs/adfs/dir_fplus.c index 82d14cdf70f9..c92cfb638c18 100644 --- a/fs/adfs/dir_fplus.c +++ b/fs/adfs/dir_fplus.c | |||
@@ -256,7 +256,7 @@ adfs_fplus_free(struct adfs_dir *dir) | |||
256 | dir->sb = NULL; | 256 | dir->sb = NULL; |
257 | } | 257 | } |
258 | 258 | ||
259 | struct adfs_dir_ops adfs_fplus_dir_ops = { | 259 | const struct adfs_dir_ops adfs_fplus_dir_ops = { |
260 | .read = adfs_fplus_read, | 260 | .read = adfs_fplus_read, |
261 | .setpos = adfs_fplus_setpos, | 261 | .setpos = adfs_fplus_setpos, |
262 | .getnext = adfs_fplus_getnext, | 262 | .getnext = adfs_fplus_getnext, |
diff --git a/fs/affs/affs.h b/fs/affs/affs.h index c69a87eaf57d..cc2b2efc9211 100644 --- a/fs/affs/affs.h +++ b/fs/affs/affs.h | |||
@@ -138,7 +138,7 @@ extern int affs_remove_hash(struct inode *dir, struct buffer_head *rem_bh); | |||
138 | extern int affs_remove_header(struct dentry *dentry); | 138 | extern int affs_remove_header(struct dentry *dentry); |
139 | extern u32 affs_checksum_block(struct super_block *sb, struct buffer_head *bh); | 139 | extern u32 affs_checksum_block(struct super_block *sb, struct buffer_head *bh); |
140 | extern void affs_fix_checksum(struct super_block *sb, struct buffer_head *bh); | 140 | extern void affs_fix_checksum(struct super_block *sb, struct buffer_head *bh); |
141 | extern void secs_to_datestamp(time_t secs, struct affs_date *ds); | 141 | extern void secs_to_datestamp(time64_t secs, struct affs_date *ds); |
142 | extern umode_t prot_to_mode(u32 prot); | 142 | extern umode_t prot_to_mode(u32 prot); |
143 | extern void mode_to_prot(struct inode *inode); | 143 | extern void mode_to_prot(struct inode *inode); |
144 | __printf(3, 4) | 144 | __printf(3, 4) |
diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c index 5fa92bc790ef..d6c7a51c93e4 100644 --- a/fs/affs/amigaffs.c +++ b/fs/affs/amigaffs.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * Please send bug reports to: hjw@zvw.de | 8 | * Please send bug reports to: hjw@zvw.de |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/math64.h> | ||
11 | #include "affs.h" | 12 | #include "affs.h" |
12 | 13 | ||
13 | /* | 14 | /* |
@@ -366,22 +367,22 @@ affs_fix_checksum(struct super_block *sb, struct buffer_head *bh) | |||
366 | } | 367 | } |
367 | 368 | ||
368 | void | 369 | void |
369 | secs_to_datestamp(time_t secs, struct affs_date *ds) | 370 | secs_to_datestamp(time64_t secs, struct affs_date *ds) |
370 | { | 371 | { |
371 | u32 days; | 372 | u32 days; |
372 | u32 minute; | 373 | u32 minute; |
374 | s32 rem; | ||
373 | 375 | ||
374 | secs -= sys_tz.tz_minuteswest * 60 + ((8 * 365 + 2) * 24 * 60 * 60); | 376 | secs -= sys_tz.tz_minuteswest * 60 + ((8 * 365 + 2) * 24 * 60 * 60); |
375 | if (secs < 0) | 377 | if (secs < 0) |
376 | secs = 0; | 378 | secs = 0; |
377 | days = secs / 86400; | 379 | days = div_s64_rem(secs, 86400, &rem); |
378 | secs -= days * 86400; | 380 | minute = rem / 60; |
379 | minute = secs / 60; | 381 | rem -= minute * 60; |
380 | secs -= minute * 60; | ||
381 | 382 | ||
382 | ds->days = cpu_to_be32(days); | 383 | ds->days = cpu_to_be32(days); |
383 | ds->mins = cpu_to_be32(minute); | 384 | ds->mins = cpu_to_be32(minute); |
384 | ds->ticks = cpu_to_be32(secs * 50); | 385 | ds->ticks = cpu_to_be32(rem * 50); |
385 | } | 386 | } |
386 | 387 | ||
387 | umode_t | 388 | umode_t |
diff --git a/fs/affs/super.c b/fs/affs/super.c index 5b50c4ca43a7..8836df5f1e11 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
@@ -32,7 +32,7 @@ affs_commit_super(struct super_block *sb, int wait) | |||
32 | struct affs_root_tail *tail = AFFS_ROOT_TAIL(sb, bh); | 32 | struct affs_root_tail *tail = AFFS_ROOT_TAIL(sb, bh); |
33 | 33 | ||
34 | lock_buffer(bh); | 34 | lock_buffer(bh); |
35 | secs_to_datestamp(get_seconds(), &tail->disk_change); | 35 | secs_to_datestamp(ktime_get_real_seconds(), &tail->disk_change); |
36 | affs_fix_checksum(sb, bh); | 36 | affs_fix_checksum(sb, bh); |
37 | unlock_buffer(bh); | 37 | unlock_buffer(bh); |
38 | 38 | ||
diff --git a/fs/afs/proc.c b/fs/afs/proc.c index 24a905b076fd..2853b4095344 100644 --- a/fs/afs/proc.c +++ b/fs/afs/proc.c | |||
@@ -230,14 +230,9 @@ static ssize_t afs_proc_cells_write(struct file *file, const char __user *buf, | |||
230 | if (size <= 1 || size >= PAGE_SIZE) | 230 | if (size <= 1 || size >= PAGE_SIZE) |
231 | return -EINVAL; | 231 | return -EINVAL; |
232 | 232 | ||
233 | kbuf = kmalloc(size + 1, GFP_KERNEL); | 233 | kbuf = memdup_user_nul(buf, size); |
234 | if (!kbuf) | 234 | if (IS_ERR(kbuf)) |
235 | return -ENOMEM; | 235 | return PTR_ERR(kbuf); |
236 | |||
237 | ret = -EFAULT; | ||
238 | if (copy_from_user(kbuf, buf, size) != 0) | ||
239 | goto done; | ||
240 | kbuf[size] = 0; | ||
241 | 236 | ||
242 | /* trim to first NL */ | 237 | /* trim to first NL */ |
243 | name = memchr(kbuf, '\n', size); | 238 | name = memchr(kbuf, '\n', size); |
@@ -315,15 +310,9 @@ static ssize_t afs_proc_rootcell_write(struct file *file, | |||
315 | if (size <= 1 || size >= PAGE_SIZE) | 310 | if (size <= 1 || size >= PAGE_SIZE) |
316 | return -EINVAL; | 311 | return -EINVAL; |
317 | 312 | ||
318 | ret = -ENOMEM; | 313 | kbuf = memdup_user_nul(buf, size); |
319 | kbuf = kmalloc(size + 1, GFP_KERNEL); | 314 | if (IS_ERR(kbuf)) |
320 | if (!kbuf) | 315 | return PTR_ERR(kbuf); |
321 | goto nomem; | ||
322 | |||
323 | ret = -EFAULT; | ||
324 | if (copy_from_user(kbuf, buf, size) != 0) | ||
325 | goto infault; | ||
326 | kbuf[size] = 0; | ||
327 | 316 | ||
328 | /* trim to first NL */ | 317 | /* trim to first NL */ |
329 | s = memchr(kbuf, '\n', size); | 318 | s = memchr(kbuf, '\n', size); |
@@ -337,9 +326,7 @@ static ssize_t afs_proc_rootcell_write(struct file *file, | |||
337 | if (ret >= 0) | 326 | if (ret >= 0) |
338 | ret = size; /* consume everything, always */ | 327 | ret = size; /* consume everything, always */ |
339 | 328 | ||
340 | infault: | ||
341 | kfree(kbuf); | 329 | kfree(kbuf); |
342 | nomem: | ||
343 | _leave(" = %d", ret); | 330 | _leave(" = %d", ret); |
344 | return ret; | 331 | return ret; |
345 | } | 332 | } |
diff --git a/fs/bad_inode.c b/fs/bad_inode.c index 861b1e1c4777..103f5d7c3083 100644 --- a/fs/bad_inode.c +++ b/fs/bad_inode.c | |||
@@ -192,7 +192,7 @@ EXPORT_SYMBOL(make_bad_inode); | |||
192 | * Returns true if the inode in question has been marked as bad. | 192 | * Returns true if the inode in question has been marked as bad. |
193 | */ | 193 | */ |
194 | 194 | ||
195 | int is_bad_inode(struct inode *inode) | 195 | bool is_bad_inode(struct inode *inode) |
196 | { | 196 | { |
197 | return (inode->i_op == &bad_inode_ops); | 197 | return (inode->i_op == &bad_inode_ops); |
198 | } | 198 | } |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 44d4a1e9244e..01b8e0d4b4ff 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -1042,12 +1042,9 @@ EXPORT_SYMBOL_GPL(bd_unlink_disk_holder); | |||
1042 | static void flush_disk(struct block_device *bdev, bool kill_dirty) | 1042 | static void flush_disk(struct block_device *bdev, bool kill_dirty) |
1043 | { | 1043 | { |
1044 | if (__invalidate_device(bdev, kill_dirty)) { | 1044 | if (__invalidate_device(bdev, kill_dirty)) { |
1045 | char name[BDEVNAME_SIZE] = ""; | ||
1046 | |||
1047 | if (bdev->bd_disk) | ||
1048 | disk_name(bdev->bd_disk, 0, name); | ||
1049 | printk(KERN_WARNING "VFS: busy inodes on changed media or " | 1045 | printk(KERN_WARNING "VFS: busy inodes on changed media or " |
1050 | "resized disk %s\n", name); | 1046 | "resized disk %s\n", |
1047 | bdev->bd_disk ? bdev->bd_disk->disk_name : ""); | ||
1051 | } | 1048 | } |
1052 | 1049 | ||
1053 | if (!bdev->bd_disk) | 1050 | if (!bdev->bd_disk) |
@@ -1071,12 +1068,9 @@ void check_disk_size_change(struct gendisk *disk, struct block_device *bdev) | |||
1071 | disk_size = (loff_t)get_capacity(disk) << 9; | 1068 | disk_size = (loff_t)get_capacity(disk) << 9; |
1072 | bdev_size = i_size_read(bdev->bd_inode); | 1069 | bdev_size = i_size_read(bdev->bd_inode); |
1073 | if (disk_size != bdev_size) { | 1070 | if (disk_size != bdev_size) { |
1074 | char name[BDEVNAME_SIZE]; | ||
1075 | |||
1076 | disk_name(disk, 0, name); | ||
1077 | printk(KERN_INFO | 1071 | printk(KERN_INFO |
1078 | "%s: detected capacity change from %lld to %lld\n", | 1072 | "%s: detected capacity change from %lld to %lld\n", |
1079 | name, bdev_size, disk_size); | 1073 | disk->disk_name, bdev_size, disk_size); |
1080 | i_size_write(bdev->bd_inode, disk_size); | 1074 | i_size_write(bdev->bd_inode, disk_size); |
1081 | flush_disk(bdev, false); | 1075 | flush_disk(bdev, false); |
1082 | } | 1076 | } |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 24154e422945..a0434c179ea9 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -1514,9 +1514,7 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags, | |||
1514 | if ((flags ^ s->s_flags) & MS_RDONLY) | 1514 | if ((flags ^ s->s_flags) & MS_RDONLY) |
1515 | error = -EBUSY; | 1515 | error = -EBUSY; |
1516 | } else { | 1516 | } else { |
1517 | char b[BDEVNAME_SIZE]; | 1517 | snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev); |
1518 | |||
1519 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); | ||
1520 | btrfs_sb(s)->bdev_holder = fs_type; | 1518 | btrfs_sb(s)->bdev_holder = fs_type; |
1521 | error = btrfs_fill_super(s, fs_devices, data, | 1519 | error = btrfs_fill_super(s, fs_devices, data, |
1522 | flags & MS_SILENT ? 1 : 0); | 1520 | flags & MS_SILENT ? 1 : 0); |
diff --git a/fs/buffer.c b/fs/buffer.c index 4f4cd959da7c..e1632abb4ca9 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -134,13 +134,10 @@ __clear_page_buffers(struct page *page) | |||
134 | 134 | ||
135 | static void buffer_io_error(struct buffer_head *bh, char *msg) | 135 | static void buffer_io_error(struct buffer_head *bh, char *msg) |
136 | { | 136 | { |
137 | char b[BDEVNAME_SIZE]; | ||
138 | |||
139 | if (!test_bit(BH_Quiet, &bh->b_state)) | 137 | if (!test_bit(BH_Quiet, &bh->b_state)) |
140 | printk_ratelimited(KERN_ERR | 138 | printk_ratelimited(KERN_ERR |
141 | "Buffer I/O error on dev %s, logical block %llu%s\n", | 139 | "Buffer I/O error on dev %pg, logical block %llu%s\n", |
142 | bdevname(bh->b_bdev, b), | 140 | bh->b_bdev, (unsigned long long)bh->b_blocknr, msg); |
143 | (unsigned long long)bh->b_blocknr, msg); | ||
144 | } | 141 | } |
145 | 142 | ||
146 | /* | 143 | /* |
@@ -237,15 +234,13 @@ __find_get_block_slow(struct block_device *bdev, sector_t block) | |||
237 | * elsewhere, don't buffer_error if we had some unmapped buffers | 234 | * elsewhere, don't buffer_error if we had some unmapped buffers |
238 | */ | 235 | */ |
239 | if (all_mapped) { | 236 | if (all_mapped) { |
240 | char b[BDEVNAME_SIZE]; | ||
241 | |||
242 | printk("__find_get_block_slow() failed. " | 237 | printk("__find_get_block_slow() failed. " |
243 | "block=%llu, b_blocknr=%llu\n", | 238 | "block=%llu, b_blocknr=%llu\n", |
244 | (unsigned long long)block, | 239 | (unsigned long long)block, |
245 | (unsigned long long)bh->b_blocknr); | 240 | (unsigned long long)bh->b_blocknr); |
246 | printk("b_state=0x%08lx, b_size=%zu\n", | 241 | printk("b_state=0x%08lx, b_size=%zu\n", |
247 | bh->b_state, bh->b_size); | 242 | bh->b_state, bh->b_size); |
248 | printk("device %s blocksize: %d\n", bdevname(bdev, b), | 243 | printk("device %pg blocksize: %d\n", bdev, |
249 | 1 << bd_inode->i_blkbits); | 244 | 1 << bd_inode->i_blkbits); |
250 | } | 245 | } |
251 | out_unlock: | 246 | out_unlock: |
@@ -531,10 +526,8 @@ repeat: | |||
531 | 526 | ||
532 | static void do_thaw_one(struct super_block *sb, void *unused) | 527 | static void do_thaw_one(struct super_block *sb, void *unused) |
533 | { | 528 | { |
534 | char b[BDEVNAME_SIZE]; | ||
535 | while (sb->s_bdev && !thaw_bdev(sb->s_bdev, sb)) | 529 | while (sb->s_bdev && !thaw_bdev(sb->s_bdev, sb)) |
536 | printk(KERN_WARNING "Emergency Thaw on %s\n", | 530 | printk(KERN_WARNING "Emergency Thaw on %pg\n", sb->s_bdev); |
537 | bdevname(sb->s_bdev, b)); | ||
538 | } | 531 | } |
539 | 532 | ||
540 | static void do_thaw_all(struct work_struct *work) | 533 | static void do_thaw_all(struct work_struct *work) |
@@ -1074,12 +1067,10 @@ grow_buffers(struct block_device *bdev, sector_t block, int size, gfp_t gfp) | |||
1074 | * pagecache index. (this comparison is done using sector_t types). | 1067 | * pagecache index. (this comparison is done using sector_t types). |
1075 | */ | 1068 | */ |
1076 | if (unlikely(index != block >> sizebits)) { | 1069 | if (unlikely(index != block >> sizebits)) { |
1077 | char b[BDEVNAME_SIZE]; | ||
1078 | |||
1079 | printk(KERN_ERR "%s: requested out-of-range block %llu for " | 1070 | printk(KERN_ERR "%s: requested out-of-range block %llu for " |
1080 | "device %s\n", | 1071 | "device %pg\n", |
1081 | __func__, (unsigned long long)block, | 1072 | __func__, (unsigned long long)block, |
1082 | bdevname(bdev, b)); | 1073 | bdev); |
1083 | return -EIO; | 1074 | return -EIO; |
1084 | } | 1075 | } |
1085 | 1076 | ||
diff --git a/fs/cachefiles/daemon.c b/fs/cachefiles/daemon.c index f601def05bdf..452e98dd7560 100644 --- a/fs/cachefiles/daemon.c +++ b/fs/cachefiles/daemon.c | |||
@@ -226,15 +226,9 @@ static ssize_t cachefiles_daemon_write(struct file *file, | |||
226 | return -EOPNOTSUPP; | 226 | return -EOPNOTSUPP; |
227 | 227 | ||
228 | /* drag the command string into the kernel so we can parse it */ | 228 | /* drag the command string into the kernel so we can parse it */ |
229 | data = kmalloc(datalen + 1, GFP_KERNEL); | 229 | data = memdup_user_nul(_data, datalen); |
230 | if (!data) | 230 | if (IS_ERR(data)) |
231 | return -ENOMEM; | 231 | return PTR_ERR(data); |
232 | |||
233 | ret = -EFAULT; | ||
234 | if (copy_from_user(data, _data, datalen) != 0) | ||
235 | goto error; | ||
236 | |||
237 | data[datalen] = '\0'; | ||
238 | 232 | ||
239 | ret = -EINVAL; | 233 | ret = -EINVAL; |
240 | if (memchr(data, '\0', datalen)) | 234 | if (memchr(data, '\0', datalen)) |
diff --git a/fs/compat.c b/fs/compat.c index 6fd272d455e4..a71936a3f4cb 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -792,7 +792,7 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name, | |||
792 | const void __user *, data) | 792 | const void __user *, data) |
793 | { | 793 | { |
794 | char *kernel_type; | 794 | char *kernel_type; |
795 | unsigned long data_page; | 795 | void *options; |
796 | char *kernel_dev; | 796 | char *kernel_dev; |
797 | int retval; | 797 | int retval; |
798 | 798 | ||
@@ -806,26 +806,25 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name, | |||
806 | if (IS_ERR(kernel_dev)) | 806 | if (IS_ERR(kernel_dev)) |
807 | goto out1; | 807 | goto out1; |
808 | 808 | ||
809 | retval = copy_mount_options(data, &data_page); | 809 | options = copy_mount_options(data); |
810 | if (retval < 0) | 810 | retval = PTR_ERR(options); |
811 | if (IS_ERR(options)) | ||
811 | goto out2; | 812 | goto out2; |
812 | 813 | ||
813 | retval = -EINVAL; | 814 | if (kernel_type && options) { |
814 | |||
815 | if (kernel_type && data_page) { | ||
816 | if (!strcmp(kernel_type, NCPFS_NAME)) { | 815 | if (!strcmp(kernel_type, NCPFS_NAME)) { |
817 | do_ncp_super_data_conv((void *)data_page); | 816 | do_ncp_super_data_conv(options); |
818 | } else if (!strcmp(kernel_type, NFS4_NAME)) { | 817 | } else if (!strcmp(kernel_type, NFS4_NAME)) { |
819 | if (do_nfs4_super_data_conv((void *) data_page)) | 818 | retval = -EINVAL; |
819 | if (do_nfs4_super_data_conv(options)) | ||
820 | goto out3; | 820 | goto out3; |
821 | } | 821 | } |
822 | } | 822 | } |
823 | 823 | ||
824 | retval = do_mount(kernel_dev, dir_name, kernel_type, | 824 | retval = do_mount(kernel_dev, dir_name, kernel_type, flags, options); |
825 | flags, (void*)data_page); | ||
826 | 825 | ||
827 | out3: | 826 | out3: |
828 | free_page(data_page); | 827 | kfree(options); |
829 | out2: | 828 | out2: |
830 | kfree(kernel_dev); | 829 | kfree(kernel_dev); |
831 | out1: | 830 | out1: |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 647ee0b03dc0..a5b8eb69a8f4 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
@@ -1305,12 +1305,6 @@ COMPATIBLE_IOCTL(PCIIOC_CONTROLLER) | |||
1305 | COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_IO) | 1305 | COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_IO) |
1306 | COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_MEM) | 1306 | COMPATIBLE_IOCTL(PCIIOC_MMAP_IS_MEM) |
1307 | COMPATIBLE_IOCTL(PCIIOC_WRITE_COMBINE) | 1307 | COMPATIBLE_IOCTL(PCIIOC_WRITE_COMBINE) |
1308 | /* NBD */ | ||
1309 | COMPATIBLE_IOCTL(NBD_DO_IT) | ||
1310 | COMPATIBLE_IOCTL(NBD_CLEAR_SOCK) | ||
1311 | COMPATIBLE_IOCTL(NBD_CLEAR_QUE) | ||
1312 | COMPATIBLE_IOCTL(NBD_PRINT_DEBUG) | ||
1313 | COMPATIBLE_IOCTL(NBD_DISCONNECT) | ||
1314 | /* i2c */ | 1308 | /* i2c */ |
1315 | COMPATIBLE_IOCTL(I2C_SLAVE) | 1309 | COMPATIBLE_IOCTL(I2C_SLAVE) |
1316 | COMPATIBLE_IOCTL(I2C_SLAVE_FORCE) | 1310 | COMPATIBLE_IOCTL(I2C_SLAVE_FORCE) |
@@ -1529,11 +1523,6 @@ static long do_ioctl_trans(unsigned int cmd, | |||
1529 | case KDSKBMETA: | 1523 | case KDSKBMETA: |
1530 | case KDSKBLED: | 1524 | case KDSKBLED: |
1531 | case KDSETLED: | 1525 | case KDSETLED: |
1532 | /* NBD */ | ||
1533 | case NBD_SET_SOCK: | ||
1534 | case NBD_SET_BLKSIZE: | ||
1535 | case NBD_SET_SIZE: | ||
1536 | case NBD_SET_SIZE_BLOCKS: | ||
1537 | return vfs_ioctl(file, cmd, arg); | 1526 | return vfs_ioctl(file, cmd, arg); |
1538 | } | 1527 | } |
1539 | 1528 | ||
diff --git a/fs/coredump.c b/fs/coredump.c index 1777331eee76..b3c153ca435d 100644 --- a/fs/coredump.c +++ b/fs/coredump.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/pipe_fs_i.h> | 32 | #include <linux/pipe_fs_i.h> |
33 | #include <linux/oom.h> | 33 | #include <linux/oom.h> |
34 | #include <linux/compat.h> | 34 | #include <linux/compat.h> |
35 | #include <linux/timekeeping.h> | ||
35 | 36 | ||
36 | #include <asm/uaccess.h> | 37 | #include <asm/uaccess.h> |
37 | #include <asm/mmu_context.h> | 38 | #include <asm/mmu_context.h> |
@@ -232,9 +233,10 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm) | |||
232 | break; | 233 | break; |
233 | /* UNIX time of coredump */ | 234 | /* UNIX time of coredump */ |
234 | case 't': { | 235 | case 't': { |
235 | struct timeval tv; | 236 | time64_t time; |
236 | do_gettimeofday(&tv); | 237 | |
237 | err = cn_printf(cn, "%lu", tv.tv_sec); | 238 | time = ktime_get_real_seconds(); |
239 | err = cn_printf(cn, "%lld", time); | ||
238 | break; | 240 | break; |
239 | } | 241 | } |
240 | /* hostname */ | 242 | /* hostname */ |
diff --git a/fs/dcache.c b/fs/dcache.c index d27f0909d9f6..8d38cd07b207 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -3303,18 +3303,18 @@ out: | |||
3303 | * @new_dentry: new dentry | 3303 | * @new_dentry: new dentry |
3304 | * @old_dentry: old dentry | 3304 | * @old_dentry: old dentry |
3305 | * | 3305 | * |
3306 | * Returns 1 if new_dentry is a subdirectory of the parent (at any depth). | 3306 | * Returns true if new_dentry is a subdirectory of the parent (at any depth). |
3307 | * Returns 0 otherwise. | 3307 | * Returns false otherwise. |
3308 | * Caller must ensure that "new_dentry" is pinned before calling is_subdir() | 3308 | * Caller must ensure that "new_dentry" is pinned before calling is_subdir() |
3309 | */ | 3309 | */ |
3310 | 3310 | ||
3311 | int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry) | 3311 | bool is_subdir(struct dentry *new_dentry, struct dentry *old_dentry) |
3312 | { | 3312 | { |
3313 | int result; | 3313 | bool result; |
3314 | unsigned seq; | 3314 | unsigned seq; |
3315 | 3315 | ||
3316 | if (new_dentry == old_dentry) | 3316 | if (new_dentry == old_dentry) |
3317 | return 1; | 3317 | return true; |
3318 | 3318 | ||
3319 | do { | 3319 | do { |
3320 | /* for restarting inner loop in case of seq retry */ | 3320 | /* for restarting inner loop in case of seq retry */ |
@@ -3325,9 +3325,9 @@ int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry) | |||
3325 | */ | 3325 | */ |
3326 | rcu_read_lock(); | 3326 | rcu_read_lock(); |
3327 | if (d_ancestor(old_dentry, new_dentry)) | 3327 | if (d_ancestor(old_dentry, new_dentry)) |
3328 | result = 1; | 3328 | result = true; |
3329 | else | 3329 | else |
3330 | result = 0; | 3330 | result = false; |
3331 | rcu_read_unlock(); | 3331 | rcu_read_unlock(); |
3332 | } while (read_seqretry(&rename_lock, seq)); | 3332 | } while (read_seqretry(&rename_lock, seq)); |
3333 | 3333 | ||
diff --git a/fs/dlm/user.c b/fs/dlm/user.c index 173b3873a4f4..1925d6d222b8 100644 --- a/fs/dlm/user.c +++ b/fs/dlm/user.c | |||
@@ -515,14 +515,9 @@ static ssize_t device_write(struct file *file, const char __user *buf, | |||
515 | if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN) | 515 | if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN) |
516 | return -EINVAL; | 516 | return -EINVAL; |
517 | 517 | ||
518 | kbuf = kzalloc(count + 1, GFP_NOFS); | 518 | kbuf = memdup_user_nul(buf, count); |
519 | if (!kbuf) | 519 | if (!IS_ERR(kbuf)) |
520 | return -ENOMEM; | 520 | return PTR_ERR(kbuf); |
521 | |||
522 | if (copy_from_user(kbuf, buf, count)) { | ||
523 | error = -EFAULT; | ||
524 | goto out_free; | ||
525 | } | ||
526 | 521 | ||
527 | if (check_version(kbuf)) { | 522 | if (check_version(kbuf)) { |
528 | error = -EBADE; | 523 | error = -EBADE; |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index a4dddc61594c..040aa879d634 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -282,9 +282,7 @@ ecryptfs_create(struct inode *directory_inode, struct dentry *ecryptfs_dentry, | |||
282 | if (rc) { | 282 | if (rc) { |
283 | ecryptfs_do_unlink(directory_inode, ecryptfs_dentry, | 283 | ecryptfs_do_unlink(directory_inode, ecryptfs_dentry, |
284 | ecryptfs_inode); | 284 | ecryptfs_inode); |
285 | make_bad_inode(ecryptfs_inode); | 285 | iget_failed(ecryptfs_inode); |
286 | unlock_new_inode(ecryptfs_inode); | ||
287 | iput(ecryptfs_inode); | ||
288 | goto out; | 286 | goto out; |
289 | } | 287 | } |
290 | unlock_new_inode(ecryptfs_inode); | 288 | unlock_new_inode(ecryptfs_inode); |
@@ -119,7 +119,7 @@ SYSCALL_DEFINE1(uselib, const char __user *, library) | |||
119 | int error = PTR_ERR(tmp); | 119 | int error = PTR_ERR(tmp); |
120 | static const struct open_flags uselib_flags = { | 120 | static const struct open_flags uselib_flags = { |
121 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, | 121 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, |
122 | .acc_mode = MAY_READ | MAY_EXEC | MAY_OPEN, | 122 | .acc_mode = MAY_READ | MAY_EXEC, |
123 | .intent = LOOKUP_OPEN, | 123 | .intent = LOOKUP_OPEN, |
124 | .lookup_flags = LOOKUP_FOLLOW, | 124 | .lookup_flags = LOOKUP_FOLLOW, |
125 | }; | 125 | }; |
@@ -763,7 +763,7 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) | |||
763 | int err; | 763 | int err; |
764 | struct open_flags open_exec_flags = { | 764 | struct open_flags open_exec_flags = { |
765 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, | 765 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, |
766 | .acc_mode = MAY_EXEC | MAY_OPEN, | 766 | .acc_mode = MAY_EXEC, |
767 | .intent = LOOKUP_OPEN, | 767 | .intent = LOOKUP_OPEN, |
768 | .lookup_flags = LOOKUP_FOLLOW, | 768 | .lookup_flags = LOOKUP_FOLLOW, |
769 | }; | 769 | }; |
diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index cd95d14f9cc2..f57a7aba32eb 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c | |||
@@ -77,10 +77,8 @@ | |||
77 | printk("\n"); \ | 77 | printk("\n"); \ |
78 | } while (0) | 78 | } while (0) |
79 | # define ea_bdebug(bh, f...) do { \ | 79 | # define ea_bdebug(bh, f...) do { \ |
80 | char b[BDEVNAME_SIZE]; \ | 80 | printk(KERN_DEBUG "block %pg:%lu: ", \ |
81 | printk(KERN_DEBUG "block %s:%lu: ", \ | 81 | bh->b_bdev, (unsigned long) bh->b_blocknr); \ |
82 | bdevname(bh->b_bdev, b), \ | ||
83 | (unsigned long) bh->b_blocknr); \ | ||
84 | printk(f); \ | 82 | printk(f); \ |
85 | printk("\n"); \ | 83 | printk("\n"); \ |
86 | } while (0) | 84 | } while (0) |
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 17fbe3882b8e..090b3498638e 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c | |||
@@ -52,9 +52,8 @@ void ext4_exit_pageio(void) | |||
52 | */ | 52 | */ |
53 | static void buffer_io_error(struct buffer_head *bh) | 53 | static void buffer_io_error(struct buffer_head *bh) |
54 | { | 54 | { |
55 | char b[BDEVNAME_SIZE]; | 55 | printk_ratelimited(KERN_ERR "Buffer I/O error on device %pg, logical block %llu\n", |
56 | printk_ratelimited(KERN_ERR "Buffer I/O error on device %s, logical block %llu\n", | 56 | bh->b_bdev, |
57 | bdevname(bh->b_bdev, b), | ||
58 | (unsigned long long)bh->b_blocknr); | 57 | (unsigned long long)bh->b_blocknr); |
59 | } | 58 | } |
60 | 59 | ||
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index e9b9afdd1d96..a95151e875bd 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c | |||
@@ -68,10 +68,8 @@ | |||
68 | printk("\n"); \ | 68 | printk("\n"); \ |
69 | } while (0) | 69 | } while (0) |
70 | # define ea_bdebug(bh, f...) do { \ | 70 | # define ea_bdebug(bh, f...) do { \ |
71 | char b[BDEVNAME_SIZE]; \ | 71 | printk(KERN_DEBUG "block %pg:%lu: ", \ |
72 | printk(KERN_DEBUG "block %s:%lu: ", \ | 72 | bh->b_bdev, (unsigned long) bh->b_blocknr); \ |
73 | bdevname(bh->b_bdev, b), \ | ||
74 | (unsigned long) bh->b_blocknr); \ | ||
75 | printk(f); \ | 73 | printk(f); \ |
76 | printk("\n"); \ | 74 | printk("\n"); \ |
77 | } while (0) | 75 | } while (0) |
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c index 478e5d54154f..ad1b18a7705b 100644 --- a/fs/f2fs/debug.c +++ b/fs/f2fs/debug.c | |||
@@ -211,12 +211,10 @@ static int stat_show(struct seq_file *s, void *v) | |||
211 | 211 | ||
212 | mutex_lock(&f2fs_stat_mutex); | 212 | mutex_lock(&f2fs_stat_mutex); |
213 | list_for_each_entry(si, &f2fs_stat_list, stat_list) { | 213 | list_for_each_entry(si, &f2fs_stat_list, stat_list) { |
214 | char devname[BDEVNAME_SIZE]; | ||
215 | |||
216 | update_general_status(si->sbi); | 214 | update_general_status(si->sbi); |
217 | 215 | ||
218 | seq_printf(s, "\n=====[ partition info(%s). #%d ]=====\n", | 216 | seq_printf(s, "\n=====[ partition info(%pg). #%d ]=====\n", |
219 | bdevname(si->sbi->sb->s_bdev, devname), i++); | 217 | si->sbi->sb->s_bdev, i++); |
220 | seq_printf(s, "[SB: 1] [CP: 2] [SIT: %d] [NAT: %d] ", | 218 | seq_printf(s, "[SB: 1] [CP: 2] [SIT: %d] [NAT: %d] ", |
221 | si->sit_area_segs, si->nat_area_segs); | 219 | si->sit_area_segs, si->nat_area_segs); |
222 | seq_printf(s, "[SSA: %d] [MAIN: %d", | 220 | seq_printf(s, "[SSA: %d] [MAIN: %d", |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 9db5500d63d9..ec6067c33a3f 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -1602,13 +1602,11 @@ static inline bool is_dot_dotdot(const struct qstr *str) | |||
1602 | 1602 | ||
1603 | static inline bool f2fs_may_extent_tree(struct inode *inode) | 1603 | static inline bool f2fs_may_extent_tree(struct inode *inode) |
1604 | { | 1604 | { |
1605 | mode_t mode = inode->i_mode; | ||
1606 | |||
1607 | if (!test_opt(F2FS_I_SB(inode), EXTENT_CACHE) || | 1605 | if (!test_opt(F2FS_I_SB(inode), EXTENT_CACHE) || |
1608 | is_inode_flag_set(F2FS_I(inode), FI_NO_EXTENT)) | 1606 | is_inode_flag_set(F2FS_I(inode), FI_NO_EXTENT)) |
1609 | return false; | 1607 | return false; |
1610 | 1608 | ||
1611 | return S_ISREG(mode); | 1609 | return S_ISREG(inode->i_mode); |
1612 | } | 1610 | } |
1613 | 1611 | ||
1614 | static inline void *f2fs_kvmalloc(size_t size, gfp_t flags) | 1612 | static inline void *f2fs_kvmalloc(size_t size, gfp_t flags) |
@@ -2121,7 +2119,7 @@ static inline int f2fs_sb_has_crypto(struct super_block *sb) | |||
2121 | static inline bool f2fs_may_encrypt(struct inode *inode) | 2119 | static inline bool f2fs_may_encrypt(struct inode *inode) |
2122 | { | 2120 | { |
2123 | #ifdef CONFIG_F2FS_FS_ENCRYPTION | 2121 | #ifdef CONFIG_F2FS_FS_ENCRYPTION |
2124 | mode_t mode = inode->i_mode; | 2122 | umode_t mode = inode->i_mode; |
2125 | 2123 | ||
2126 | return (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)); | 2124 | return (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)); |
2127 | #else | 2125 | #else |
diff --git a/fs/fcntl.c b/fs/fcntl.c index ee85cd4e136a..350a2c8cfd28 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c | |||
@@ -51,7 +51,8 @@ static int setfl(int fd, struct file * filp, unsigned long arg) | |||
51 | if (arg & O_NDELAY) | 51 | if (arg & O_NDELAY) |
52 | arg |= O_NONBLOCK; | 52 | arg |= O_NONBLOCK; |
53 | 53 | ||
54 | if (arg & O_DIRECT) { | 54 | /* Pipe packetized mode is controlled by O_DIRECT flag */ |
55 | if (!S_ISFIFO(filp->f_inode->i_mode) && (arg & O_DIRECT)) { | ||
55 | if (!filp->f_mapping || !filp->f_mapping->a_ops || | 56 | if (!filp->f_mapping || !filp->f_mapping->a_ops || |
56 | !filp->f_mapping->a_ops->direct_IO) | 57 | !filp->f_mapping->a_ops->direct_IO) |
57 | return -EINVAL; | 58 | return -EINVAL; |
@@ -25,9 +25,9 @@ | |||
25 | 25 | ||
26 | int sysctl_nr_open __read_mostly = 1024*1024; | 26 | int sysctl_nr_open __read_mostly = 1024*1024; |
27 | int sysctl_nr_open_min = BITS_PER_LONG; | 27 | int sysctl_nr_open_min = BITS_PER_LONG; |
28 | /* our max() is unusable in constant expressions ;-/ */ | 28 | /* our min() is unusable in constant expressions ;-/ */ |
29 | #define __const_max(x, y) ((x) < (y) ? (x) : (y)) | 29 | #define __const_min(x, y) ((x) < (y) ? (x) : (y)) |
30 | int sysctl_nr_open_max = __const_max(INT_MAX, ~(size_t)0/sizeof(void *)) & | 30 | int sysctl_nr_open_max = __const_min(INT_MAX, ~(size_t)0/sizeof(void *)) & |
31 | -BITS_PER_LONG; | 31 | -BITS_PER_LONG; |
32 | 32 | ||
33 | static void *alloc_fdmem(size_t size) | 33 | static void *alloc_fdmem(size_t size) |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index baab99b69d8a..001c66641243 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -1315,9 +1315,7 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | |||
1315 | if ((flags ^ s->s_flags) & MS_RDONLY) | 1315 | if ((flags ^ s->s_flags) & MS_RDONLY) |
1316 | goto error_super; | 1316 | goto error_super; |
1317 | } else { | 1317 | } else { |
1318 | char b[BDEVNAME_SIZE]; | 1318 | snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev); |
1319 | |||
1320 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); | ||
1321 | sb_set_blocksize(s, block_size(bdev)); | 1319 | sb_set_blocksize(s, block_size(bdev)); |
1322 | error = fill_super(s, &args, flags & MS_SILENT ? 1 : 0); | 1320 | error = fill_super(s, &args, flags & MS_SILENT ? 1 : 0); |
1323 | if (error) | 1321 | if (error) |
diff --git a/fs/hfs/mdb.c b/fs/hfs/mdb.c index aa3f0d6d043c..a3ec3ae7d347 100644 --- a/fs/hfs/mdb.c +++ b/fs/hfs/mdb.c | |||
@@ -166,7 +166,7 @@ int hfs_mdb_get(struct super_block *sb) | |||
166 | pr_warn("continuing without an alternate MDB\n"); | 166 | pr_warn("continuing without an alternate MDB\n"); |
167 | } | 167 | } |
168 | 168 | ||
169 | HFS_SB(sb)->bitmap = (__be32 *)__get_free_pages(GFP_KERNEL, PAGE_SIZE < 8192 ? 1 : 0); | 169 | HFS_SB(sb)->bitmap = kmalloc(8192, GFP_KERNEL); |
170 | if (!HFS_SB(sb)->bitmap) | 170 | if (!HFS_SB(sb)->bitmap) |
171 | goto out; | 171 | goto out; |
172 | 172 | ||
@@ -360,7 +360,7 @@ void hfs_mdb_put(struct super_block *sb) | |||
360 | unload_nls(HFS_SB(sb)->nls_io); | 360 | unload_nls(HFS_SB(sb)->nls_io); |
361 | unload_nls(HFS_SB(sb)->nls_disk); | 361 | unload_nls(HFS_SB(sb)->nls_disk); |
362 | 362 | ||
363 | free_pages((unsigned long)HFS_SB(sb)->bitmap, PAGE_SIZE < 8192 ? 1 : 0); | 363 | kfree(HFS_SB(sb)->bitmap); |
364 | kfree(HFS_SB(sb)); | 364 | kfree(HFS_SB(sb)); |
365 | sb->s_fs_info = NULL; | 365 | sb->s_fs_info = NULL; |
366 | } | 366 | } |
diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c index a69bbc1e87f8..a136929189f0 100644 --- a/fs/hpfs/map.c +++ b/fs/hpfs/map.c | |||
@@ -133,7 +133,7 @@ __le32 *hpfs_load_bitmap_directory(struct super_block *s, secno bmp) | |||
133 | void hpfs_load_hotfix_map(struct super_block *s, struct hpfs_spare_block *spareblock) | 133 | void hpfs_load_hotfix_map(struct super_block *s, struct hpfs_spare_block *spareblock) |
134 | { | 134 | { |
135 | struct quad_buffer_head qbh; | 135 | struct quad_buffer_head qbh; |
136 | u32 *directory; | 136 | __le32 *directory; |
137 | u32 n_hotfixes, n_used_hotfixes; | 137 | u32 n_hotfixes, n_used_hotfixes; |
138 | unsigned i; | 138 | unsigned i; |
139 | 139 | ||
diff --git a/fs/internal.h b/fs/internal.h index e38c08ca437d..b71deeecea17 100644 --- a/fs/internal.h +++ b/fs/internal.h | |||
@@ -55,7 +55,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *, | |||
55 | /* | 55 | /* |
56 | * namespace.c | 56 | * namespace.c |
57 | */ | 57 | */ |
58 | extern int copy_mount_options(const void __user *, unsigned long *); | 58 | extern void *copy_mount_options(const void __user *); |
59 | extern char *copy_mount_string(const void __user *); | 59 | extern char *copy_mount_string(const void __user *); |
60 | 60 | ||
61 | extern struct vfsmount *lookup_mnt(struct path *); | 61 | extern struct vfsmount *lookup_mnt(struct path *); |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index ca181e81c765..081dff087fc0 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -764,13 +764,11 @@ void jbd2_journal_unlock_updates (journal_t *journal) | |||
764 | 764 | ||
765 | static void warn_dirty_buffer(struct buffer_head *bh) | 765 | static void warn_dirty_buffer(struct buffer_head *bh) |
766 | { | 766 | { |
767 | char b[BDEVNAME_SIZE]; | ||
768 | |||
769 | printk(KERN_WARNING | 767 | printk(KERN_WARNING |
770 | "JBD2: Spotted dirty metadata buffer (dev = %s, blocknr = %llu). " | 768 | "JBD2: Spotted dirty metadata buffer (dev = %pg, blocknr = %llu). " |
771 | "There's a risk of filesystem corruption in case of system " | 769 | "There's a risk of filesystem corruption in case of system " |
772 | "crash.\n", | 770 | "crash.\n", |
773 | bdevname(bh->b_bdev, b), (unsigned long long)bh->b_blocknr); | 771 | bh->b_bdev, (unsigned long long)bh->b_blocknr); |
774 | } | 772 | } |
775 | 773 | ||
776 | /* Call t_frozen trigger and copy buffer data into jh->b_frozen_data. */ | 774 | /* Call t_frozen trigger and copy buffer data into jh->b_frozen_data. */ |
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index a69bdf2a1085..a270cb7ff4e0 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c | |||
@@ -1835,17 +1835,16 @@ static int lbmLogInit(struct jfs_log * log) | |||
1835 | for (i = 0; i < LOGPAGES;) { | 1835 | for (i = 0; i < LOGPAGES;) { |
1836 | char *buffer; | 1836 | char *buffer; |
1837 | uint offset; | 1837 | uint offset; |
1838 | struct page *page; | 1838 | struct page *page = alloc_page(GFP_KERNEL | __GFP_ZERO); |
1839 | 1839 | ||
1840 | buffer = (char *) get_zeroed_page(GFP_KERNEL); | 1840 | if (!page) |
1841 | if (buffer == NULL) | ||
1842 | goto error; | 1841 | goto error; |
1843 | page = virt_to_page(buffer); | 1842 | buffer = page_address(page); |
1844 | for (offset = 0; offset < PAGE_SIZE; offset += LOGPSIZE) { | 1843 | for (offset = 0; offset < PAGE_SIZE; offset += LOGPSIZE) { |
1845 | lbuf = kmalloc(sizeof(struct lbuf), GFP_KERNEL); | 1844 | lbuf = kmalloc(sizeof(struct lbuf), GFP_KERNEL); |
1846 | if (lbuf == NULL) { | 1845 | if (lbuf == NULL) { |
1847 | if (offset == 0) | 1846 | if (offset == 0) |
1848 | free_page((unsigned long) buffer); | 1847 | __free_page(page); |
1849 | goto error; | 1848 | goto error; |
1850 | } | 1849 | } |
1851 | if (offset) /* we already have one reference */ | 1850 | if (offset) /* we already have one reference */ |
diff --git a/fs/logfs/logfs.h b/fs/logfs/logfs.h index 209a26d84c38..39d91f86cd35 100644 --- a/fs/logfs/logfs.h +++ b/fs/logfs/logfs.h | |||
@@ -302,7 +302,7 @@ struct logfs_block { | |||
302 | struct inode *inode; | 302 | struct inode *inode; |
303 | struct logfs_transaction *ta; | 303 | struct logfs_transaction *ta; |
304 | unsigned long alias_map[LOGFS_BLOCK_FACTOR / BITS_PER_LONG]; | 304 | unsigned long alias_map[LOGFS_BLOCK_FACTOR / BITS_PER_LONG]; |
305 | struct logfs_block_ops *ops; | 305 | const struct logfs_block_ops *ops; |
306 | int full; | 306 | int full; |
307 | int partial; | 307 | int partial; |
308 | int reserved_bytes; | 308 | int reserved_bytes; |
@@ -578,7 +578,7 @@ int logfs_exist_block(struct inode *inode, u64 bix); | |||
578 | int get_page_reserve(struct inode *inode, struct page *page); | 578 | int get_page_reserve(struct inode *inode, struct page *page); |
579 | void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock); | 579 | void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock); |
580 | void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock); | 580 | void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock); |
581 | extern struct logfs_block_ops indirect_block_ops; | 581 | extern const struct logfs_block_ops indirect_block_ops; |
582 | 582 | ||
583 | /* segment.c */ | 583 | /* segment.c */ |
584 | int logfs_erase_segment(struct super_block *sb, u32 ofs, int ensure_erase); | 584 | int logfs_erase_segment(struct super_block *sb, u32 ofs, int ensure_erase); |
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index 380d86e1ab45..20973c9e52f8 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c | |||
@@ -569,13 +569,13 @@ static void indirect_free_block(struct super_block *sb, | |||
569 | } | 569 | } |
570 | 570 | ||
571 | 571 | ||
572 | static struct logfs_block_ops inode_block_ops = { | 572 | static const struct logfs_block_ops inode_block_ops = { |
573 | .write_block = inode_write_block, | 573 | .write_block = inode_write_block, |
574 | .free_block = inode_free_block, | 574 | .free_block = inode_free_block, |
575 | .write_alias = inode_write_alias, | 575 | .write_alias = inode_write_alias, |
576 | }; | 576 | }; |
577 | 577 | ||
578 | struct logfs_block_ops indirect_block_ops = { | 578 | const struct logfs_block_ops indirect_block_ops = { |
579 | .write_block = indirect_write_block, | 579 | .write_block = indirect_write_block, |
580 | .free_block = indirect_free_block, | 580 | .free_block = indirect_free_block, |
581 | .write_alias = indirect_write_alias, | 581 | .write_alias = indirect_write_alias, |
diff --git a/fs/logfs/segment.c b/fs/logfs/segment.c index 6de0fbfc6c00..d270e4b2ab6b 100644 --- a/fs/logfs/segment.c +++ b/fs/logfs/segment.c | |||
@@ -197,7 +197,7 @@ static int btree_write_alias(struct super_block *sb, struct logfs_block *block, | |||
197 | return 0; | 197 | return 0; |
198 | } | 198 | } |
199 | 199 | ||
200 | static struct logfs_block_ops btree_block_ops = { | 200 | static const struct logfs_block_ops btree_block_ops = { |
201 | .write_block = btree_write_block, | 201 | .write_block = btree_write_block, |
202 | .free_block = __free_block, | 202 | .free_block = __free_block, |
203 | .write_alias = btree_write_alias, | 203 | .write_alias = btree_write_alias, |
diff --git a/fs/minix/itree_v1.c b/fs/minix/itree_v1.c index 282e15ad8cd8..46ca39d6c735 100644 --- a/fs/minix/itree_v1.c +++ b/fs/minix/itree_v1.c | |||
@@ -24,16 +24,15 @@ static inline block_t *i_data(struct inode *inode) | |||
24 | static int block_to_path(struct inode * inode, long block, int offsets[DEPTH]) | 24 | static int block_to_path(struct inode * inode, long block, int offsets[DEPTH]) |
25 | { | 25 | { |
26 | int n = 0; | 26 | int n = 0; |
27 | char b[BDEVNAME_SIZE]; | ||
28 | 27 | ||
29 | if (block < 0) { | 28 | if (block < 0) { |
30 | printk("MINIX-fs: block_to_path: block %ld < 0 on dev %s\n", | 29 | printk("MINIX-fs: block_to_path: block %ld < 0 on dev %pg\n", |
31 | block, bdevname(inode->i_sb->s_bdev, b)); | 30 | block, inode->i_sb->s_bdev); |
32 | } else if (block >= (minix_sb(inode->i_sb)->s_max_size/BLOCK_SIZE)) { | 31 | } else if (block >= (minix_sb(inode->i_sb)->s_max_size/BLOCK_SIZE)) { |
33 | if (printk_ratelimit()) | 32 | if (printk_ratelimit()) |
34 | printk("MINIX-fs: block_to_path: " | 33 | printk("MINIX-fs: block_to_path: " |
35 | "block %ld too big on dev %s\n", | 34 | "block %ld too big on dev %pg\n", |
36 | block, bdevname(inode->i_sb->s_bdev, b)); | 35 | block, inode->i_sb->s_bdev); |
37 | } else if (block < 7) { | 36 | } else if (block < 7) { |
38 | offsets[n++] = block; | 37 | offsets[n++] = block; |
39 | } else if ((block -= 7) < 512) { | 38 | } else if ((block -= 7) < 512) { |
diff --git a/fs/minix/itree_v2.c b/fs/minix/itree_v2.c index 78e2d93e5c83..1ee101352586 100644 --- a/fs/minix/itree_v2.c +++ b/fs/minix/itree_v2.c | |||
@@ -26,18 +26,17 @@ static inline block_t *i_data(struct inode *inode) | |||
26 | static int block_to_path(struct inode * inode, long block, int offsets[DEPTH]) | 26 | static int block_to_path(struct inode * inode, long block, int offsets[DEPTH]) |
27 | { | 27 | { |
28 | int n = 0; | 28 | int n = 0; |
29 | char b[BDEVNAME_SIZE]; | ||
30 | struct super_block *sb = inode->i_sb; | 29 | struct super_block *sb = inode->i_sb; |
31 | 30 | ||
32 | if (block < 0) { | 31 | if (block < 0) { |
33 | printk("MINIX-fs: block_to_path: block %ld < 0 on dev %s\n", | 32 | printk("MINIX-fs: block_to_path: block %ld < 0 on dev %pg\n", |
34 | block, bdevname(sb->s_bdev, b)); | 33 | block, sb->s_bdev); |
35 | } else if ((u64)block * (u64)sb->s_blocksize >= | 34 | } else if ((u64)block * (u64)sb->s_blocksize >= |
36 | minix_sb(sb)->s_max_size) { | 35 | minix_sb(sb)->s_max_size) { |
37 | if (printk_ratelimit()) | 36 | if (printk_ratelimit()) |
38 | printk("MINIX-fs: block_to_path: " | 37 | printk("MINIX-fs: block_to_path: " |
39 | "block %ld too big on dev %s\n", | 38 | "block %ld too big on dev %pg\n", |
40 | block, bdevname(sb->s_bdev, b)); | 39 | block, sb->s_bdev); |
41 | } else if (block < DIRCOUNT) { | 40 | } else if (block < DIRCOUNT) { |
42 | offsets[n++] = block; | 41 | offsets[n++] = block; |
43 | } else if ((block -= DIRCOUNT) < INDIRCOUNT(sb)) { | 42 | } else if ((block -= DIRCOUNT) < INDIRCOUNT(sb)) { |
diff --git a/fs/namei.c b/fs/namei.c index 3c909aebef70..bceefd5588a2 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -534,10 +534,8 @@ static void restore_nameidata(void) | |||
534 | current->nameidata = old; | 534 | current->nameidata = old; |
535 | if (old) | 535 | if (old) |
536 | old->total_link_count = now->total_link_count; | 536 | old->total_link_count = now->total_link_count; |
537 | if (now->stack != now->internal) { | 537 | if (now->stack != now->internal) |
538 | kfree(now->stack); | 538 | kfree(now->stack); |
539 | now->stack = now->internal; | ||
540 | } | ||
541 | } | 539 | } |
542 | 540 | ||
543 | static int __nd_alloc_stack(struct nameidata *nd) | 541 | static int __nd_alloc_stack(struct nameidata *nd) |
@@ -654,7 +652,7 @@ static bool legitimize_links(struct nameidata *nd) | |||
654 | * Path walking has 2 modes, rcu-walk and ref-walk (see | 652 | * Path walking has 2 modes, rcu-walk and ref-walk (see |
655 | * Documentation/filesystems/path-lookup.txt). In situations when we can't | 653 | * Documentation/filesystems/path-lookup.txt). In situations when we can't |
656 | * continue in RCU mode, we attempt to drop out of rcu-walk mode and grab | 654 | * continue in RCU mode, we attempt to drop out of rcu-walk mode and grab |
657 | * normal reference counts on dentries and vfsmounts to transition to rcu-walk | 655 | * normal reference counts on dentries and vfsmounts to transition to ref-walk |
658 | * mode. Refcounts are grabbed at the last known good point before rcu-walk | 656 | * mode. Refcounts are grabbed at the last known good point before rcu-walk |
659 | * got stuck, so ref-walk may continue from there. If this is not successful | 657 | * got stuck, so ref-walk may continue from there. If this is not successful |
660 | * (eg. a seqcount has changed), then failure is returned and it's up to caller | 658 | * (eg. a seqcount has changed), then failure is returned and it's up to caller |
@@ -804,19 +802,19 @@ static int complete_walk(struct nameidata *nd) | |||
804 | 802 | ||
805 | static void set_root(struct nameidata *nd) | 803 | static void set_root(struct nameidata *nd) |
806 | { | 804 | { |
807 | get_fs_root(current->fs, &nd->root); | ||
808 | } | ||
809 | |||
810 | static void set_root_rcu(struct nameidata *nd) | ||
811 | { | ||
812 | struct fs_struct *fs = current->fs; | 805 | struct fs_struct *fs = current->fs; |
813 | unsigned seq; | ||
814 | 806 | ||
815 | do { | 807 | if (nd->flags & LOOKUP_RCU) { |
816 | seq = read_seqcount_begin(&fs->seq); | 808 | unsigned seq; |
817 | nd->root = fs->root; | 809 | |
818 | nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); | 810 | do { |
819 | } while (read_seqcount_retry(&fs->seq, seq)); | 811 | seq = read_seqcount_begin(&fs->seq); |
812 | nd->root = fs->root; | ||
813 | nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); | ||
814 | } while (read_seqcount_retry(&fs->seq, seq)); | ||
815 | } else { | ||
816 | get_fs_root(fs, &nd->root); | ||
817 | } | ||
820 | } | 818 | } |
821 | 819 | ||
822 | static void path_put_conditional(struct path *path, struct nameidata *nd) | 820 | static void path_put_conditional(struct path *path, struct nameidata *nd) |
@@ -838,6 +836,26 @@ static inline void path_to_nameidata(const struct path *path, | |||
838 | nd->path.dentry = path->dentry; | 836 | nd->path.dentry = path->dentry; |
839 | } | 837 | } |
840 | 838 | ||
839 | static int nd_jump_root(struct nameidata *nd) | ||
840 | { | ||
841 | if (nd->flags & LOOKUP_RCU) { | ||
842 | struct dentry *d; | ||
843 | nd->path = nd->root; | ||
844 | d = nd->path.dentry; | ||
845 | nd->inode = d->d_inode; | ||
846 | nd->seq = nd->root_seq; | ||
847 | if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq))) | ||
848 | return -ECHILD; | ||
849 | } else { | ||
850 | path_put(&nd->path); | ||
851 | nd->path = nd->root; | ||
852 | path_get(&nd->path); | ||
853 | nd->inode = nd->path.dentry->d_inode; | ||
854 | } | ||
855 | nd->flags |= LOOKUP_JUMPED; | ||
856 | return 0; | ||
857 | } | ||
858 | |||
841 | /* | 859 | /* |
842 | * Helper to directly jump to a known parsed path from ->get_link, | 860 | * Helper to directly jump to a known parsed path from ->get_link, |
843 | * caller must have taken a reference to path beforehand. | 861 | * caller must have taken a reference to path beforehand. |
@@ -1016,25 +1034,10 @@ const char *get_link(struct nameidata *nd) | |||
1016 | return res; | 1034 | return res; |
1017 | } | 1035 | } |
1018 | if (*res == '/') { | 1036 | if (*res == '/') { |
1019 | if (nd->flags & LOOKUP_RCU) { | 1037 | if (!nd->root.mnt) |
1020 | struct dentry *d; | 1038 | set_root(nd); |
1021 | if (!nd->root.mnt) | 1039 | if (unlikely(nd_jump_root(nd))) |
1022 | set_root_rcu(nd); | 1040 | return ERR_PTR(-ECHILD); |
1023 | nd->path = nd->root; | ||
1024 | d = nd->path.dentry; | ||
1025 | nd->inode = d->d_inode; | ||
1026 | nd->seq = nd->root_seq; | ||
1027 | if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq))) | ||
1028 | return ERR_PTR(-ECHILD); | ||
1029 | } else { | ||
1030 | if (!nd->root.mnt) | ||
1031 | set_root(nd); | ||
1032 | path_put(&nd->path); | ||
1033 | nd->path = nd->root; | ||
1034 | path_get(&nd->root); | ||
1035 | nd->inode = nd->path.dentry->d_inode; | ||
1036 | } | ||
1037 | nd->flags |= LOOKUP_JUMPED; | ||
1038 | while (unlikely(*++res == '/')) | 1041 | while (unlikely(*++res == '/')) |
1039 | ; | 1042 | ; |
1040 | } | 1043 | } |
@@ -1295,8 +1298,6 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, | |||
1295 | static int follow_dotdot_rcu(struct nameidata *nd) | 1298 | static int follow_dotdot_rcu(struct nameidata *nd) |
1296 | { | 1299 | { |
1297 | struct inode *inode = nd->inode; | 1300 | struct inode *inode = nd->inode; |
1298 | if (!nd->root.mnt) | ||
1299 | set_root_rcu(nd); | ||
1300 | 1301 | ||
1301 | while (1) { | 1302 | while (1) { |
1302 | if (path_equal(&nd->path, &nd->root)) | 1303 | if (path_equal(&nd->path, &nd->root)) |
@@ -1416,9 +1417,6 @@ static void follow_mount(struct path *path) | |||
1416 | 1417 | ||
1417 | static int follow_dotdot(struct nameidata *nd) | 1418 | static int follow_dotdot(struct nameidata *nd) |
1418 | { | 1419 | { |
1419 | if (!nd->root.mnt) | ||
1420 | set_root(nd); | ||
1421 | |||
1422 | while(1) { | 1420 | while(1) { |
1423 | struct dentry *old = nd->path.dentry; | 1421 | struct dentry *old = nd->path.dentry; |
1424 | 1422 | ||
@@ -1656,6 +1654,8 @@ static inline int may_lookup(struct nameidata *nd) | |||
1656 | static inline int handle_dots(struct nameidata *nd, int type) | 1654 | static inline int handle_dots(struct nameidata *nd, int type) |
1657 | { | 1655 | { |
1658 | if (type == LAST_DOTDOT) { | 1656 | if (type == LAST_DOTDOT) { |
1657 | if (!nd->root.mnt) | ||
1658 | set_root(nd); | ||
1659 | if (nd->flags & LOOKUP_RCU) { | 1659 | if (nd->flags & LOOKUP_RCU) { |
1660 | return follow_dotdot_rcu(nd); | 1660 | return follow_dotdot_rcu(nd); |
1661 | } else | 1661 | } else |
@@ -2021,18 +2021,19 @@ static const char *path_init(struct nameidata *nd, unsigned flags) | |||
2021 | } | 2021 | } |
2022 | 2022 | ||
2023 | nd->root.mnt = NULL; | 2023 | nd->root.mnt = NULL; |
2024 | nd->path.mnt = NULL; | ||
2025 | nd->path.dentry = NULL; | ||
2024 | 2026 | ||
2025 | nd->m_seq = read_seqbegin(&mount_lock); | 2027 | nd->m_seq = read_seqbegin(&mount_lock); |
2026 | if (*s == '/') { | 2028 | if (*s == '/') { |
2027 | if (flags & LOOKUP_RCU) { | 2029 | if (flags & LOOKUP_RCU) |
2028 | rcu_read_lock(); | 2030 | rcu_read_lock(); |
2029 | set_root_rcu(nd); | 2031 | set_root(nd); |
2030 | nd->seq = nd->root_seq; | 2032 | if (likely(!nd_jump_root(nd))) |
2031 | } else { | 2033 | return s; |
2032 | set_root(nd); | 2034 | nd->root.mnt = NULL; |
2033 | path_get(&nd->root); | 2035 | rcu_read_unlock(); |
2034 | } | 2036 | return ERR_PTR(-ECHILD); |
2035 | nd->path = nd->root; | ||
2036 | } else if (nd->dfd == AT_FDCWD) { | 2037 | } else if (nd->dfd == AT_FDCWD) { |
2037 | if (flags & LOOKUP_RCU) { | 2038 | if (flags & LOOKUP_RCU) { |
2038 | struct fs_struct *fs = current->fs; | 2039 | struct fs_struct *fs = current->fs; |
@@ -2043,11 +2044,14 @@ static const char *path_init(struct nameidata *nd, unsigned flags) | |||
2043 | do { | 2044 | do { |
2044 | seq = read_seqcount_begin(&fs->seq); | 2045 | seq = read_seqcount_begin(&fs->seq); |
2045 | nd->path = fs->pwd; | 2046 | nd->path = fs->pwd; |
2047 | nd->inode = nd->path.dentry->d_inode; | ||
2046 | nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); | 2048 | nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); |
2047 | } while (read_seqcount_retry(&fs->seq, seq)); | 2049 | } while (read_seqcount_retry(&fs->seq, seq)); |
2048 | } else { | 2050 | } else { |
2049 | get_fs_pwd(current->fs, &nd->path); | 2051 | get_fs_pwd(current->fs, &nd->path); |
2052 | nd->inode = nd->path.dentry->d_inode; | ||
2050 | } | 2053 | } |
2054 | return s; | ||
2051 | } else { | 2055 | } else { |
2052 | /* Caller must check execute permissions on the starting path component */ | 2056 | /* Caller must check execute permissions on the starting path component */ |
2053 | struct fd f = fdget_raw(nd->dfd); | 2057 | struct fd f = fdget_raw(nd->dfd); |
@@ -2077,16 +2081,6 @@ static const char *path_init(struct nameidata *nd, unsigned flags) | |||
2077 | fdput(f); | 2081 | fdput(f); |
2078 | return s; | 2082 | return s; |
2079 | } | 2083 | } |
2080 | |||
2081 | nd->inode = nd->path.dentry->d_inode; | ||
2082 | if (!(flags & LOOKUP_RCU)) | ||
2083 | return s; | ||
2084 | if (likely(!read_seqcount_retry(&nd->path.dentry->d_seq, nd->seq))) | ||
2085 | return s; | ||
2086 | if (!(nd->flags & LOOKUP_ROOT)) | ||
2087 | nd->root.mnt = NULL; | ||
2088 | rcu_read_unlock(); | ||
2089 | return ERR_PTR(-ECHILD); | ||
2090 | } | 2084 | } |
2091 | 2085 | ||
2092 | static const char *trailing_symlink(struct nameidata *nd) | 2086 | static const char *trailing_symlink(struct nameidata *nd) |
@@ -2279,6 +2273,8 @@ EXPORT_SYMBOL(vfs_path_lookup); | |||
2279 | * | 2273 | * |
2280 | * Note that this routine is purely a helper for filesystem usage and should | 2274 | * Note that this routine is purely a helper for filesystem usage and should |
2281 | * not be called by generic code. | 2275 | * not be called by generic code. |
2276 | * | ||
2277 | * The caller must hold base->i_mutex. | ||
2282 | */ | 2278 | */ |
2283 | struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) | 2279 | struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) |
2284 | { | 2280 | { |
@@ -2322,6 +2318,75 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) | |||
2322 | } | 2318 | } |
2323 | EXPORT_SYMBOL(lookup_one_len); | 2319 | EXPORT_SYMBOL(lookup_one_len); |
2324 | 2320 | ||
2321 | /** | ||
2322 | * lookup_one_len_unlocked - filesystem helper to lookup single pathname component | ||
2323 | * @name: pathname component to lookup | ||
2324 | * @base: base directory to lookup from | ||
2325 | * @len: maximum length @len should be interpreted to | ||
2326 | * | ||
2327 | * Note that this routine is purely a helper for filesystem usage and should | ||
2328 | * not be called by generic code. | ||
2329 | * | ||
2330 | * Unlike lookup_one_len, it should be called without the parent | ||
2331 | * i_mutex held, and will take the i_mutex itself if necessary. | ||
2332 | */ | ||
2333 | struct dentry *lookup_one_len_unlocked(const char *name, | ||
2334 | struct dentry *base, int len) | ||
2335 | { | ||
2336 | struct qstr this; | ||
2337 | unsigned int c; | ||
2338 | int err; | ||
2339 | struct dentry *ret; | ||
2340 | |||
2341 | this.name = name; | ||
2342 | this.len = len; | ||
2343 | this.hash = full_name_hash(name, len); | ||
2344 | if (!len) | ||
2345 | return ERR_PTR(-EACCES); | ||
2346 | |||
2347 | if (unlikely(name[0] == '.')) { | ||
2348 | if (len < 2 || (len == 2 && name[1] == '.')) | ||
2349 | return ERR_PTR(-EACCES); | ||
2350 | } | ||
2351 | |||
2352 | while (len--) { | ||
2353 | c = *(const unsigned char *)name++; | ||
2354 | if (c == '/' || c == '\0') | ||
2355 | return ERR_PTR(-EACCES); | ||
2356 | } | ||
2357 | /* | ||
2358 | * See if the low-level filesystem might want | ||
2359 | * to use its own hash.. | ||
2360 | */ | ||
2361 | if (base->d_flags & DCACHE_OP_HASH) { | ||
2362 | int err = base->d_op->d_hash(base, &this); | ||
2363 | if (err < 0) | ||
2364 | return ERR_PTR(err); | ||
2365 | } | ||
2366 | |||
2367 | err = inode_permission(base->d_inode, MAY_EXEC); | ||
2368 | if (err) | ||
2369 | return ERR_PTR(err); | ||
2370 | |||
2371 | /* | ||
2372 | * __d_lookup() is used to try to get a quick answer and avoid the | ||
2373 | * mutex. A false-negative does no harm. | ||
2374 | */ | ||
2375 | ret = __d_lookup(base, &this); | ||
2376 | if (ret && unlikely(ret->d_flags & DCACHE_OP_REVALIDATE)) { | ||
2377 | dput(ret); | ||
2378 | ret = NULL; | ||
2379 | } | ||
2380 | if (ret) | ||
2381 | return ret; | ||
2382 | |||
2383 | mutex_lock(&base->d_inode->i_mutex); | ||
2384 | ret = __lookup_hash(&this, base, 0); | ||
2385 | mutex_unlock(&base->d_inode->i_mutex); | ||
2386 | return ret; | ||
2387 | } | ||
2388 | EXPORT_SYMBOL(lookup_one_len_unlocked); | ||
2389 | |||
2325 | int user_path_at_empty(int dfd, const char __user *name, unsigned flags, | 2390 | int user_path_at_empty(int dfd, const char __user *name, unsigned flags, |
2326 | struct path *path, int *empty) | 2391 | struct path *path, int *empty) |
2327 | { | 2392 | { |
@@ -2670,10 +2735,6 @@ static int may_open(struct path *path, int acc_mode, int flag) | |||
2670 | struct inode *inode = dentry->d_inode; | 2735 | struct inode *inode = dentry->d_inode; |
2671 | int error; | 2736 | int error; |
2672 | 2737 | ||
2673 | /* O_PATH? */ | ||
2674 | if (!acc_mode) | ||
2675 | return 0; | ||
2676 | |||
2677 | if (!inode) | 2738 | if (!inode) |
2678 | return -ENOENT; | 2739 | return -ENOENT; |
2679 | 2740 | ||
@@ -2695,7 +2756,7 @@ static int may_open(struct path *path, int acc_mode, int flag) | |||
2695 | break; | 2756 | break; |
2696 | } | 2757 | } |
2697 | 2758 | ||
2698 | error = inode_permission(inode, acc_mode); | 2759 | error = inode_permission(inode, MAY_OPEN | acc_mode); |
2699 | if (error) | 2760 | if (error) |
2700 | return error; | 2761 | return error; |
2701 | 2762 | ||
@@ -2887,7 +2948,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, | |||
2887 | if (*opened & FILE_CREATED) { | 2948 | if (*opened & FILE_CREATED) { |
2888 | WARN_ON(!(open_flag & O_CREAT)); | 2949 | WARN_ON(!(open_flag & O_CREAT)); |
2889 | fsnotify_create(dir, dentry); | 2950 | fsnotify_create(dir, dentry); |
2890 | acc_mode = MAY_OPEN; | 2951 | acc_mode = 0; |
2891 | } | 2952 | } |
2892 | error = may_open(&file->f_path, acc_mode, open_flag); | 2953 | error = may_open(&file->f_path, acc_mode, open_flag); |
2893 | if (error) | 2954 | if (error) |
@@ -3100,7 +3161,7 @@ retry_lookup: | |||
3100 | /* Don't check for write permission, don't truncate */ | 3161 | /* Don't check for write permission, don't truncate */ |
3101 | open_flag &= ~O_TRUNC; | 3162 | open_flag &= ~O_TRUNC; |
3102 | will_truncate = false; | 3163 | will_truncate = false; |
3103 | acc_mode = MAY_OPEN; | 3164 | acc_mode = 0; |
3104 | path_to_nameidata(&path, nd); | 3165 | path_to_nameidata(&path, nd); |
3105 | goto finish_open_created; | 3166 | goto finish_open_created; |
3106 | } | 3167 | } |
@@ -3184,10 +3245,11 @@ finish_open: | |||
3184 | got_write = true; | 3245 | got_write = true; |
3185 | } | 3246 | } |
3186 | finish_open_created: | 3247 | finish_open_created: |
3187 | error = may_open(&nd->path, acc_mode, open_flag); | 3248 | if (likely(!(open_flag & O_PATH))) { |
3188 | if (error) | 3249 | error = may_open(&nd->path, acc_mode, open_flag); |
3189 | goto out; | 3250 | if (error) |
3190 | 3251 | goto out; | |
3252 | } | ||
3191 | BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */ | 3253 | BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */ |
3192 | error = vfs_open(&nd->path, file, current_cred()); | 3254 | error = vfs_open(&nd->path, file, current_cred()); |
3193 | if (!error) { | 3255 | if (!error) { |
@@ -3274,7 +3336,7 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags, | |||
3274 | goto out2; | 3336 | goto out2; |
3275 | audit_inode(nd->name, child, 0); | 3337 | audit_inode(nd->name, child, 0); |
3276 | /* Don't check for other permissions, the inode was just created */ | 3338 | /* Don't check for other permissions, the inode was just created */ |
3277 | error = may_open(&path, MAY_OPEN, op->open_flag); | 3339 | error = may_open(&path, 0, op->open_flag); |
3278 | if (error) | 3340 | if (error) |
3279 | goto out2; | 3341 | goto out2; |
3280 | file->f_path.mnt = path.mnt; | 3342 | file->f_path.mnt = path.mnt; |
diff --git a/fs/namespace.c b/fs/namespace.c index 4d2c8f64b7bf..a830e1463704 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -2609,18 +2609,18 @@ static long exact_copy_from_user(void *to, const void __user * from, | |||
2609 | return n; | 2609 | return n; |
2610 | } | 2610 | } |
2611 | 2611 | ||
2612 | int copy_mount_options(const void __user * data, unsigned long *where) | 2612 | void *copy_mount_options(const void __user * data) |
2613 | { | 2613 | { |
2614 | int i; | 2614 | int i; |
2615 | unsigned long page; | ||
2616 | unsigned long size; | 2615 | unsigned long size; |
2616 | char *copy; | ||
2617 | 2617 | ||
2618 | *where = 0; | ||
2619 | if (!data) | 2618 | if (!data) |
2620 | return 0; | 2619 | return NULL; |
2621 | 2620 | ||
2622 | if (!(page = __get_free_page(GFP_KERNEL))) | 2621 | copy = kmalloc(PAGE_SIZE, GFP_KERNEL); |
2623 | return -ENOMEM; | 2622 | if (!copy) |
2623 | return ERR_PTR(-ENOMEM); | ||
2624 | 2624 | ||
2625 | /* We only care that *some* data at the address the user | 2625 | /* We only care that *some* data at the address the user |
2626 | * gave us is valid. Just in case, we'll zero | 2626 | * gave us is valid. Just in case, we'll zero |
@@ -2631,15 +2631,14 @@ int copy_mount_options(const void __user * data, unsigned long *where) | |||
2631 | if (size > PAGE_SIZE) | 2631 | if (size > PAGE_SIZE) |
2632 | size = PAGE_SIZE; | 2632 | size = PAGE_SIZE; |
2633 | 2633 | ||
2634 | i = size - exact_copy_from_user((void *)page, data, size); | 2634 | i = size - exact_copy_from_user(copy, data, size); |
2635 | if (!i) { | 2635 | if (!i) { |
2636 | free_page(page); | 2636 | kfree(copy); |
2637 | return -EFAULT; | 2637 | return ERR_PTR(-EFAULT); |
2638 | } | 2638 | } |
2639 | if (i != PAGE_SIZE) | 2639 | if (i != PAGE_SIZE) |
2640 | memset((char *)page + i, 0, PAGE_SIZE - i); | 2640 | memset(copy + i, 0, PAGE_SIZE - i); |
2641 | *where = page; | 2641 | return copy; |
2642 | return 0; | ||
2643 | } | 2642 | } |
2644 | 2643 | ||
2645 | char *copy_mount_string(const void __user *data) | 2644 | char *copy_mount_string(const void __user *data) |
@@ -2906,7 +2905,7 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, | |||
2906 | int ret; | 2905 | int ret; |
2907 | char *kernel_type; | 2906 | char *kernel_type; |
2908 | char *kernel_dev; | 2907 | char *kernel_dev; |
2909 | unsigned long data_page; | 2908 | void *options; |
2910 | 2909 | ||
2911 | kernel_type = copy_mount_string(type); | 2910 | kernel_type = copy_mount_string(type); |
2912 | ret = PTR_ERR(kernel_type); | 2911 | ret = PTR_ERR(kernel_type); |
@@ -2918,14 +2917,14 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, | |||
2918 | if (IS_ERR(kernel_dev)) | 2917 | if (IS_ERR(kernel_dev)) |
2919 | goto out_dev; | 2918 | goto out_dev; |
2920 | 2919 | ||
2921 | ret = copy_mount_options(data, &data_page); | 2920 | options = copy_mount_options(data); |
2922 | if (ret < 0) | 2921 | ret = PTR_ERR(options); |
2922 | if (IS_ERR(options)) | ||
2923 | goto out_data; | 2923 | goto out_data; |
2924 | 2924 | ||
2925 | ret = do_mount(kernel_dev, dir_name, kernel_type, flags, | 2925 | ret = do_mount(kernel_dev, dir_name, kernel_type, flags, options); |
2926 | (void *) data_page); | ||
2927 | 2926 | ||
2928 | free_page(data_page); | 2927 | kfree(options); |
2929 | out_data: | 2928 | out_data: |
2930 | kfree(kernel_dev); | 2929 | kfree(kernel_dev); |
2931 | out_dev: | 2930 | out_dev: |
@@ -2949,9 +2948,9 @@ bool is_path_reachable(struct mount *mnt, struct dentry *dentry, | |||
2949 | return &mnt->mnt == root->mnt && is_subdir(dentry, root->dentry); | 2948 | return &mnt->mnt == root->mnt && is_subdir(dentry, root->dentry); |
2950 | } | 2949 | } |
2951 | 2950 | ||
2952 | int path_is_under(struct path *path1, struct path *path2) | 2951 | bool path_is_under(struct path *path1, struct path *path2) |
2953 | { | 2952 | { |
2954 | int res; | 2953 | bool res; |
2955 | read_seqlock_excl(&mount_lock); | 2954 | read_seqlock_excl(&mount_lock); |
2956 | res = is_path_reachable(real_mount(path1->mnt), path1->dentry, path2); | 2955 | res = is_path_reachable(real_mount(path1->mnt), path1->dentry, path2); |
2957 | read_sequnlock_excl(&mount_lock); | 2956 | read_sequnlock_excl(&mount_lock); |
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 00575d776d91..2246454dec76 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c | |||
@@ -823,7 +823,7 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp, | |||
823 | } else | 823 | } else |
824 | dchild = dget(dparent); | 824 | dchild = dget(dparent); |
825 | } else | 825 | } else |
826 | dchild = lookup_one_len(name, dparent, namlen); | 826 | dchild = lookup_one_len_unlocked(name, dparent, namlen); |
827 | if (IS_ERR(dchild)) | 827 | if (IS_ERR(dchild)) |
828 | return rv; | 828 | return rv; |
829 | if (d_mountpoint(dchild)) | 829 | if (d_mountpoint(dchild)) |
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 924416f91fdd..d6ef0955a979 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -2858,14 +2858,14 @@ nfsd4_encode_dirent_fattr(struct xdr_stream *xdr, struct nfsd4_readdir *cd, | |||
2858 | __be32 nfserr; | 2858 | __be32 nfserr; |
2859 | int ignore_crossmnt = 0; | 2859 | int ignore_crossmnt = 0; |
2860 | 2860 | ||
2861 | dentry = lookup_one_len(name, cd->rd_fhp->fh_dentry, namlen); | 2861 | dentry = lookup_one_len_unlocked(name, cd->rd_fhp->fh_dentry, namlen); |
2862 | if (IS_ERR(dentry)) | 2862 | if (IS_ERR(dentry)) |
2863 | return nfserrno(PTR_ERR(dentry)); | 2863 | return nfserrno(PTR_ERR(dentry)); |
2864 | if (d_really_is_negative(dentry)) { | 2864 | if (d_really_is_negative(dentry)) { |
2865 | /* | 2865 | /* |
2866 | * nfsd_buffered_readdir drops the i_mutex between | 2866 | * we're not holding the i_mutex here, so there's |
2867 | * readdir and calling this callback, leaving a window | 2867 | * a window where this directory entry could have gone |
2868 | * where this directory entry could have gone away. | 2868 | * away. |
2869 | */ | 2869 | */ |
2870 | dput(dentry); | 2870 | dput(dentry); |
2871 | return nfserr_noent; | 2871 | return nfserr_noent; |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 5411bf09b810..d41c149fae75 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -218,10 +218,16 @@ nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
218 | host_err = PTR_ERR(dentry); | 218 | host_err = PTR_ERR(dentry); |
219 | if (IS_ERR(dentry)) | 219 | if (IS_ERR(dentry)) |
220 | goto out_nfserr; | 220 | goto out_nfserr; |
221 | /* | ||
222 | * check if we have crossed a mount point ... | ||
223 | */ | ||
224 | if (nfsd_mountpoint(dentry, exp)) { | 221 | if (nfsd_mountpoint(dentry, exp)) { |
222 | /* | ||
223 | * We don't need the i_mutex after all. It's | ||
224 | * still possible we could open this (regular | ||
225 | * files can be mountpoints too), but the | ||
226 | * i_mutex is just there to prevent renames of | ||
227 | * something that we might be about to delegate, | ||
228 | * and a mountpoint won't be renamed: | ||
229 | */ | ||
230 | fh_unlock(fhp); | ||
225 | if ((host_err = nfsd_cross_mnt(rqstp, &dentry, &exp))) { | 231 | if ((host_err = nfsd_cross_mnt(rqstp, &dentry, &exp))) { |
226 | dput(dentry); | 232 | dput(dentry); |
227 | goto out_nfserr; | 233 | goto out_nfserr; |
@@ -1817,7 +1823,6 @@ static __be32 nfsd_buffered_readdir(struct file *file, nfsd_filldir_t func, | |||
1817 | offset = *offsetp; | 1823 | offset = *offsetp; |
1818 | 1824 | ||
1819 | while (1) { | 1825 | while (1) { |
1820 | struct inode *dir_inode = file_inode(file); | ||
1821 | unsigned int reclen; | 1826 | unsigned int reclen; |
1822 | 1827 | ||
1823 | cdp->err = nfserr_eof; /* will be cleared on successful read */ | 1828 | cdp->err = nfserr_eof; /* will be cleared on successful read */ |
@@ -1836,15 +1841,6 @@ static __be32 nfsd_buffered_readdir(struct file *file, nfsd_filldir_t func, | |||
1836 | if (!size) | 1841 | if (!size) |
1837 | break; | 1842 | break; |
1838 | 1843 | ||
1839 | /* | ||
1840 | * Various filldir functions may end up calling back into | ||
1841 | * lookup_one_len() and the file system's ->lookup() method. | ||
1842 | * These expect i_mutex to be held, as it would within readdir. | ||
1843 | */ | ||
1844 | host_err = mutex_lock_killable(&dir_inode->i_mutex); | ||
1845 | if (host_err) | ||
1846 | break; | ||
1847 | |||
1848 | de = (struct buffered_dirent *)buf.dirent; | 1844 | de = (struct buffered_dirent *)buf.dirent; |
1849 | while (size > 0) { | 1845 | while (size > 0) { |
1850 | offset = de->offset; | 1846 | offset = de->offset; |
@@ -1861,7 +1857,6 @@ static __be32 nfsd_buffered_readdir(struct file *file, nfsd_filldir_t func, | |||
1861 | size -= reclen; | 1857 | size -= reclen; |
1862 | de = (struct buffered_dirent *)((char *)de + reclen); | 1858 | de = (struct buffered_dirent *)((char *)de + reclen); |
1863 | } | 1859 | } |
1864 | mutex_unlock(&dir_inode->i_mutex); | ||
1865 | if (size > 0) /* We bailed out early */ | 1860 | if (size > 0) /* We bailed out early */ |
1866 | break; | 1861 | break; |
1867 | 1862 | ||
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 354013ea22ec..c7343844e6b6 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -1316,13 +1316,11 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1316 | } | 1316 | } |
1317 | 1317 | ||
1318 | if (!s->s_root) { | 1318 | if (!s->s_root) { |
1319 | char b[BDEVNAME_SIZE]; | 1319 | s_new = true; |
1320 | |||
1321 | s_new = true; | ||
1322 | 1320 | ||
1323 | /* New superblock instance created */ | 1321 | /* New superblock instance created */ |
1324 | s->s_mode = mode; | 1322 | s->s_mode = mode; |
1325 | strlcpy(s->s_id, bdevname(sd.bdev, b), sizeof(s->s_id)); | 1323 | snprintf(s->s_id, sizeof(s->s_id), "%pg", sd.bdev); |
1326 | sb_set_blocksize(s, block_size(sd.bdev)); | 1324 | sb_set_blocksize(s, block_size(sd.bdev)); |
1327 | 1325 | ||
1328 | err = nilfs_fill_super(s, data, flags & MS_SILENT ? 1 : 0); | 1326 | err = nilfs_fill_super(s, data, flags & MS_SILENT ? 1 : 0); |
@@ -887,7 +887,7 @@ EXPORT_SYMBOL(dentry_open); | |||
887 | static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) | 887 | static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) |
888 | { | 888 | { |
889 | int lookup_flags = 0; | 889 | int lookup_flags = 0; |
890 | int acc_mode; | 890 | int acc_mode = ACC_MODE(flags); |
891 | 891 | ||
892 | if (flags & (O_CREAT | __O_TMPFILE)) | 892 | if (flags & (O_CREAT | __O_TMPFILE)) |
893 | op->mode = (mode & S_IALLUGO) | S_IFREG; | 893 | op->mode = (mode & S_IALLUGO) | S_IFREG; |
@@ -909,7 +909,6 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o | |||
909 | if (flags & __O_TMPFILE) { | 909 | if (flags & __O_TMPFILE) { |
910 | if ((flags & O_TMPFILE_MASK) != O_TMPFILE) | 910 | if ((flags & O_TMPFILE_MASK) != O_TMPFILE) |
911 | return -EINVAL; | 911 | return -EINVAL; |
912 | acc_mode = MAY_OPEN | ACC_MODE(flags); | ||
913 | if (!(acc_mode & MAY_WRITE)) | 912 | if (!(acc_mode & MAY_WRITE)) |
914 | return -EINVAL; | 913 | return -EINVAL; |
915 | } else if (flags & O_PATH) { | 914 | } else if (flags & O_PATH) { |
@@ -919,8 +918,6 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o | |||
919 | */ | 918 | */ |
920 | flags &= O_DIRECTORY | O_NOFOLLOW | O_PATH; | 919 | flags &= O_DIRECTORY | O_NOFOLLOW | O_PATH; |
921 | acc_mode = 0; | 920 | acc_mode = 0; |
922 | } else { | ||
923 | acc_mode = MAY_OPEN | ACC_MODE(flags); | ||
924 | } | 921 | } |
925 | 922 | ||
926 | op->open_flag = flags; | 923 | op->open_flag = flags; |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 55e01f88eac9..2cf5d7e37375 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -2365,7 +2365,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, | |||
2365 | size_t count, loff_t *ppos) | 2365 | size_t count, loff_t *ppos) |
2366 | { | 2366 | { |
2367 | struct inode * inode = file_inode(file); | 2367 | struct inode * inode = file_inode(file); |
2368 | char *page; | 2368 | void *page; |
2369 | ssize_t length; | 2369 | ssize_t length; |
2370 | struct task_struct *task = get_proc_task(inode); | 2370 | struct task_struct *task = get_proc_task(inode); |
2371 | 2371 | ||
@@ -2380,14 +2380,11 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, | |||
2380 | if (*ppos != 0) | 2380 | if (*ppos != 0) |
2381 | goto out; | 2381 | goto out; |
2382 | 2382 | ||
2383 | length = -ENOMEM; | 2383 | page = memdup_user(buf, count); |
2384 | page = (char*)__get_free_page(GFP_TEMPORARY); | 2384 | if (IS_ERR(page)) { |
2385 | if (!page) | 2385 | length = PTR_ERR(page); |
2386 | goto out; | 2386 | goto out; |
2387 | 2387 | } | |
2388 | length = -EFAULT; | ||
2389 | if (copy_from_user(page, buf, count)) | ||
2390 | goto out_free; | ||
2391 | 2388 | ||
2392 | /* Guard against adverse ptrace interaction */ | 2389 | /* Guard against adverse ptrace interaction */ |
2393 | length = mutex_lock_interruptible(&task->signal->cred_guard_mutex); | 2390 | length = mutex_lock_interruptible(&task->signal->cred_guard_mutex); |
@@ -2396,10 +2393,10 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, | |||
2396 | 2393 | ||
2397 | length = security_setprocattr(task, | 2394 | length = security_setprocattr(task, |
2398 | (char*)file->f_path.dentry->d_name.name, | 2395 | (char*)file->f_path.dentry->d_name.name, |
2399 | (void*)page, count); | 2396 | page, count); |
2400 | mutex_unlock(&task->signal->cred_guard_mutex); | 2397 | mutex_unlock(&task->signal->cred_guard_mutex); |
2401 | out_free: | 2398 | out_free: |
2402 | free_page((unsigned long) page); | 2399 | kfree(page); |
2403 | out: | 2400 | out: |
2404 | put_task_struct(task); | 2401 | put_task_struct(task); |
2405 | out_no_task: | 2402 | out_no_task: |
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index 3c2a915c695a..56afa5ef08f2 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c | |||
@@ -258,6 +258,7 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx, | |||
258 | name, len, instantiate, p, | 258 | name, len, instantiate, p, |
259 | (void *)(unsigned long)fd)) | 259 | (void *)(unsigned long)fd)) |
260 | goto out_fd_loop; | 260 | goto out_fd_loop; |
261 | cond_resched(); | ||
261 | rcu_read_lock(); | 262 | rcu_read_lock(); |
262 | } | 263 | } |
263 | rcu_read_unlock(); | 264 | rcu_read_unlock(); |
diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 8ebd9a334085..2256e7e23e67 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c | |||
@@ -95,9 +95,9 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) | |||
95 | { | 95 | { |
96 | struct proc_mounts *p = m->private; | 96 | struct proc_mounts *p = m->private; |
97 | struct mount *r = real_mount(mnt); | 97 | struct mount *r = real_mount(mnt); |
98 | int err = 0; | ||
99 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; | 98 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; |
100 | struct super_block *sb = mnt_path.dentry->d_sb; | 99 | struct super_block *sb = mnt_path.dentry->d_sb; |
100 | int err; | ||
101 | 101 | ||
102 | if (sb->s_op->show_devname) { | 102 | if (sb->s_op->show_devname) { |
103 | err = sb->s_op->show_devname(m, mnt_path.dentry); | 103 | err = sb->s_op->show_devname(m, mnt_path.dentry); |
@@ -131,16 +131,17 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) | |||
131 | struct mount *r = real_mount(mnt); | 131 | struct mount *r = real_mount(mnt); |
132 | struct super_block *sb = mnt->mnt_sb; | 132 | struct super_block *sb = mnt->mnt_sb; |
133 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; | 133 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; |
134 | int err = 0; | 134 | int err; |
135 | 135 | ||
136 | seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id, | 136 | seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id, |
137 | MAJOR(sb->s_dev), MINOR(sb->s_dev)); | 137 | MAJOR(sb->s_dev), MINOR(sb->s_dev)); |
138 | if (sb->s_op->show_path) | 138 | if (sb->s_op->show_path) { |
139 | err = sb->s_op->show_path(m, mnt->mnt_root); | 139 | err = sb->s_op->show_path(m, mnt->mnt_root); |
140 | else | 140 | if (err) |
141 | goto out; | ||
142 | } else { | ||
141 | seq_dentry(m, mnt->mnt_root, " \t\n\\"); | 143 | seq_dentry(m, mnt->mnt_root, " \t\n\\"); |
142 | if (err) | 144 | } |
143 | goto out; | ||
144 | seq_putc(m, ' '); | 145 | seq_putc(m, ' '); |
145 | 146 | ||
146 | /* mountpoints outside of chroot jail will give SEQ_SKIP on this */ | 147 | /* mountpoints outside of chroot jail will give SEQ_SKIP on this */ |
@@ -168,12 +169,13 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) | |||
168 | seq_puts(m, " - "); | 169 | seq_puts(m, " - "); |
169 | show_type(m, sb); | 170 | show_type(m, sb); |
170 | seq_putc(m, ' '); | 171 | seq_putc(m, ' '); |
171 | if (sb->s_op->show_devname) | 172 | if (sb->s_op->show_devname) { |
172 | err = sb->s_op->show_devname(m, mnt->mnt_root); | 173 | err = sb->s_op->show_devname(m, mnt->mnt_root); |
173 | else | 174 | if (err) |
175 | goto out; | ||
176 | } else { | ||
174 | mangle(m, r->mnt_devname ? r->mnt_devname : "none"); | 177 | mangle(m, r->mnt_devname ? r->mnt_devname : "none"); |
175 | if (err) | 178 | } |
176 | goto out; | ||
177 | seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw"); | 179 | seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw"); |
178 | err = show_sb_opts(m, sb); | 180 | err = show_sb_opts(m, sb); |
179 | if (err) | 181 | if (err) |
@@ -191,7 +193,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) | |||
191 | struct mount *r = real_mount(mnt); | 193 | struct mount *r = real_mount(mnt); |
192 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; | 194 | struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; |
193 | struct super_block *sb = mnt_path.dentry->d_sb; | 195 | struct super_block *sb = mnt_path.dentry->d_sb; |
194 | int err = 0; | 196 | int err; |
195 | 197 | ||
196 | /* device */ | 198 | /* device */ |
197 | if (sb->s_op->show_devname) { | 199 | if (sb->s_op->show_devname) { |
@@ -220,8 +222,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) | |||
220 | /* optional statistics */ | 222 | /* optional statistics */ |
221 | if (sb->s_op->show_stats) { | 223 | if (sb->s_op->show_stats) { |
222 | seq_putc(m, ' '); | 224 | seq_putc(m, ' '); |
223 | if (!err) | 225 | err = sb->s_op->show_stats(m, mnt_path.dentry); |
224 | err = sb->s_op->show_stats(m, mnt_path.dentry); | ||
225 | } | 226 | } |
226 | 227 | ||
227 | seq_putc(m, '\n'); | 228 | seq_putc(m, '\n'); |
diff --git a/fs/read_write.c b/fs/read_write.c index 2116e74a83d3..06b07d5a08fe 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -172,6 +172,45 @@ loff_t fixed_size_llseek(struct file *file, loff_t offset, int whence, loff_t si | |||
172 | EXPORT_SYMBOL(fixed_size_llseek); | 172 | EXPORT_SYMBOL(fixed_size_llseek); |
173 | 173 | ||
174 | /** | 174 | /** |
175 | * no_seek_end_llseek - llseek implementation for fixed-sized devices | ||
176 | * @file: file structure to seek on | ||
177 | * @offset: file offset to seek to | ||
178 | * @whence: type of seek | ||
179 | * | ||
180 | */ | ||
181 | loff_t no_seek_end_llseek(struct file *file, loff_t offset, int whence) | ||
182 | { | ||
183 | switch (whence) { | ||
184 | case SEEK_SET: case SEEK_CUR: | ||
185 | return generic_file_llseek_size(file, offset, whence, | ||
186 | ~0ULL, 0); | ||
187 | default: | ||
188 | return -EINVAL; | ||
189 | } | ||
190 | } | ||
191 | EXPORT_SYMBOL(no_seek_end_llseek); | ||
192 | |||
193 | /** | ||
194 | * no_seek_end_llseek_size - llseek implementation for fixed-sized devices | ||
195 | * @file: file structure to seek on | ||
196 | * @offset: file offset to seek to | ||
197 | * @whence: type of seek | ||
198 | * @size: maximal offset allowed | ||
199 | * | ||
200 | */ | ||
201 | loff_t no_seek_end_llseek_size(struct file *file, loff_t offset, int whence, loff_t size) | ||
202 | { | ||
203 | switch (whence) { | ||
204 | case SEEK_SET: case SEEK_CUR: | ||
205 | return generic_file_llseek_size(file, offset, whence, | ||
206 | size, 0); | ||
207 | default: | ||
208 | return -EINVAL; | ||
209 | } | ||
210 | } | ||
211 | EXPORT_SYMBOL(no_seek_end_llseek_size); | ||
212 | |||
213 | /** | ||
175 | * noop_llseek - No Operation Performed llseek implementation | 214 | * noop_llseek - No Operation Performed llseek implementation |
176 | * @file: file structure to seek on | 215 | * @file: file structure to seek on |
177 | * @offset: file offset to seek to | 216 | * @offset: file offset to seek to |
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index 9d6486d416a3..44c2bdced1c8 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
@@ -618,12 +618,10 @@ static void release_buffer_page(struct buffer_head *bh) | |||
618 | 618 | ||
619 | static void reiserfs_end_buffer_io_sync(struct buffer_head *bh, int uptodate) | 619 | static void reiserfs_end_buffer_io_sync(struct buffer_head *bh, int uptodate) |
620 | { | 620 | { |
621 | char b[BDEVNAME_SIZE]; | ||
622 | |||
623 | if (buffer_journaled(bh)) { | 621 | if (buffer_journaled(bh)) { |
624 | reiserfs_warning(NULL, "clm-2084", | 622 | reiserfs_warning(NULL, "clm-2084", |
625 | "pinned buffer %lu:%s sent to disk", | 623 | "pinned buffer %lu:%pg sent to disk", |
626 | bh->b_blocknr, bdevname(bh->b_bdev, b)); | 624 | bh->b_blocknr, bh->b_bdev); |
627 | } | 625 | } |
628 | if (uptodate) | 626 | if (uptodate) |
629 | set_buffer_uptodate(bh); | 627 | set_buffer_uptodate(bh); |
@@ -2387,11 +2385,10 @@ static int journal_read(struct super_block *sb) | |||
2387 | int replay_count = 0; | 2385 | int replay_count = 0; |
2388 | int continue_replay = 1; | 2386 | int continue_replay = 1; |
2389 | int ret; | 2387 | int ret; |
2390 | char b[BDEVNAME_SIZE]; | ||
2391 | 2388 | ||
2392 | cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb); | 2389 | cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb); |
2393 | reiserfs_info(sb, "checking transaction log (%s)\n", | 2390 | reiserfs_info(sb, "checking transaction log (%pg)\n", |
2394 | bdevname(journal->j_dev_bd, b)); | 2391 | journal->j_dev_bd); |
2395 | start = get_seconds(); | 2392 | start = get_seconds(); |
2396 | 2393 | ||
2397 | /* | 2394 | /* |
@@ -2651,8 +2648,8 @@ static int journal_init_dev(struct super_block *super, | |||
2651 | 2648 | ||
2652 | set_blocksize(journal->j_dev_bd, super->s_blocksize); | 2649 | set_blocksize(journal->j_dev_bd, super->s_blocksize); |
2653 | reiserfs_info(super, | 2650 | reiserfs_info(super, |
2654 | "journal_init_dev: journal device: %s\n", | 2651 | "journal_init_dev: journal device: %pg\n", |
2655 | bdevname(journal->j_dev_bd, b)); | 2652 | journal->j_dev_bd); |
2656 | return 0; | 2653 | return 0; |
2657 | } | 2654 | } |
2658 | 2655 | ||
@@ -2724,7 +2721,6 @@ int journal_init(struct super_block *sb, const char *j_dev_name, | |||
2724 | struct reiserfs_journal_header *jh; | 2721 | struct reiserfs_journal_header *jh; |
2725 | struct reiserfs_journal *journal; | 2722 | struct reiserfs_journal *journal; |
2726 | struct reiserfs_journal_list *jl; | 2723 | struct reiserfs_journal_list *jl; |
2727 | char b[BDEVNAME_SIZE]; | ||
2728 | int ret; | 2724 | int ret; |
2729 | 2725 | ||
2730 | journal = SB_JOURNAL(sb) = vzalloc(sizeof(struct reiserfs_journal)); | 2726 | journal = SB_JOURNAL(sb) = vzalloc(sizeof(struct reiserfs_journal)); |
@@ -2794,10 +2790,10 @@ int journal_init(struct super_block *sb, const char *j_dev_name, | |||
2794 | && (le32_to_cpu(jh->jh_journal.jp_journal_magic) != | 2790 | && (le32_to_cpu(jh->jh_journal.jp_journal_magic) != |
2795 | sb_jp_journal_magic(rs))) { | 2791 | sb_jp_journal_magic(rs))) { |
2796 | reiserfs_warning(sb, "sh-460", | 2792 | reiserfs_warning(sb, "sh-460", |
2797 | "journal header magic %x (device %s) does " | 2793 | "journal header magic %x (device %pg) does " |
2798 | "not match to magic found in super block %x", | 2794 | "not match to magic found in super block %x", |
2799 | jh->jh_journal.jp_journal_magic, | 2795 | jh->jh_journal.jp_journal_magic, |
2800 | bdevname(journal->j_dev_bd, b), | 2796 | journal->j_dev_bd, |
2801 | sb_jp_journal_magic(rs)); | 2797 | sb_jp_journal_magic(rs)); |
2802 | brelse(bhjh); | 2798 | brelse(bhjh); |
2803 | goto free_and_return; | 2799 | goto free_and_return; |
@@ -2818,10 +2814,10 @@ int journal_init(struct super_block *sb, const char *j_dev_name, | |||
2818 | journal->j_max_trans_age = commit_max_age; | 2814 | journal->j_max_trans_age = commit_max_age; |
2819 | } | 2815 | } |
2820 | 2816 | ||
2821 | reiserfs_info(sb, "journal params: device %s, size %u, " | 2817 | reiserfs_info(sb, "journal params: device %pg, size %u, " |
2822 | "journal first block %u, max trans len %u, max batch %u, " | 2818 | "journal first block %u, max trans len %u, max batch %u, " |
2823 | "max commit age %u, max trans age %u\n", | 2819 | "max commit age %u, max trans age %u\n", |
2824 | bdevname(journal->j_dev_bd, b), | 2820 | journal->j_dev_bd, |
2825 | SB_ONDISK_JOURNAL_SIZE(sb), | 2821 | SB_ONDISK_JOURNAL_SIZE(sb), |
2826 | SB_ONDISK_JOURNAL_1st_BLOCK(sb), | 2822 | SB_ONDISK_JOURNAL_1st_BLOCK(sb), |
2827 | journal->j_trans_max, | 2823 | journal->j_trans_max, |
diff --git a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c index ae1dc841db3a..4f3f928076f3 100644 --- a/fs/reiserfs/prints.c +++ b/fs/reiserfs/prints.c | |||
@@ -139,11 +139,9 @@ static void sprintf_block_head(char *buf, struct buffer_head *bh) | |||
139 | 139 | ||
140 | static void sprintf_buffer_head(char *buf, struct buffer_head *bh) | 140 | static void sprintf_buffer_head(char *buf, struct buffer_head *bh) |
141 | { | 141 | { |
142 | char b[BDEVNAME_SIZE]; | ||
143 | |||
144 | sprintf(buf, | 142 | sprintf(buf, |
145 | "dev %s, size %zd, blocknr %llu, count %d, state 0x%lx, page %p, (%s, %s, %s)", | 143 | "dev %pg, size %zd, blocknr %llu, count %d, state 0x%lx, page %p, (%s, %s, %s)", |
146 | bdevname(bh->b_bdev, b), bh->b_size, | 144 | bh->b_bdev, bh->b_size, |
147 | (unsigned long long)bh->b_blocknr, atomic_read(&(bh->b_count)), | 145 | (unsigned long long)bh->b_blocknr, atomic_read(&(bh->b_count)), |
148 | bh->b_state, bh->b_page, | 146 | bh->b_state, bh->b_page, |
149 | buffer_uptodate(bh) ? "UPTODATE" : "!UPTODATE", | 147 | buffer_uptodate(bh) ? "UPTODATE" : "!UPTODATE", |
@@ -530,7 +528,6 @@ static int print_super_block(struct buffer_head *bh) | |||
530 | (struct reiserfs_super_block *)(bh->b_data); | 528 | (struct reiserfs_super_block *)(bh->b_data); |
531 | int skipped, data_blocks; | 529 | int skipped, data_blocks; |
532 | char *version; | 530 | char *version; |
533 | char b[BDEVNAME_SIZE]; | ||
534 | 531 | ||
535 | if (is_reiserfs_3_5(rs)) { | 532 | if (is_reiserfs_3_5(rs)) { |
536 | version = "3.5"; | 533 | version = "3.5"; |
@@ -543,7 +540,7 @@ static int print_super_block(struct buffer_head *bh) | |||
543 | return 1; | 540 | return 1; |
544 | } | 541 | } |
545 | 542 | ||
546 | printk("%s\'s super block is in block %llu\n", bdevname(bh->b_bdev, b), | 543 | printk("%pg\'s super block is in block %llu\n", bh->b_bdev, |
547 | (unsigned long long)bh->b_blocknr); | 544 | (unsigned long long)bh->b_blocknr); |
548 | printk("Reiserfs version %s\n", version); | 545 | printk("Reiserfs version %s\n", version); |
549 | printk("Block count %u\n", sb_block_count(rs)); | 546 | printk("Block count %u\n", sb_block_count(rs)); |
diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index 621b9f381fe1..fe999157dd97 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c | |||
@@ -303,11 +303,10 @@ static int show_journal(struct seq_file *m, void *unused) | |||
303 | struct reiserfs_sb_info *r = REISERFS_SB(sb); | 303 | struct reiserfs_sb_info *r = REISERFS_SB(sb); |
304 | struct reiserfs_super_block *rs = r->s_rs; | 304 | struct reiserfs_super_block *rs = r->s_rs; |
305 | struct journal_params *jp = &rs->s_v1.s_journal; | 305 | struct journal_params *jp = &rs->s_v1.s_journal; |
306 | char b[BDEVNAME_SIZE]; | ||
307 | 306 | ||
308 | seq_printf(m, /* on-disk fields */ | 307 | seq_printf(m, /* on-disk fields */ |
309 | "jp_journal_1st_block: \t%i\n" | 308 | "jp_journal_1st_block: \t%i\n" |
310 | "jp_journal_dev: \t%s[%x]\n" | 309 | "jp_journal_dev: \t%pg[%x]\n" |
311 | "jp_journal_size: \t%i\n" | 310 | "jp_journal_size: \t%i\n" |
312 | "jp_journal_trans_max: \t%i\n" | 311 | "jp_journal_trans_max: \t%i\n" |
313 | "jp_journal_magic: \t%i\n" | 312 | "jp_journal_magic: \t%i\n" |
@@ -348,7 +347,7 @@ static int show_journal(struct seq_file *m, void *unused) | |||
348 | "prepare: \t%12lu\n" | 347 | "prepare: \t%12lu\n" |
349 | "prepare_retry: \t%12lu\n", | 348 | "prepare_retry: \t%12lu\n", |
350 | DJP(jp_journal_1st_block), | 349 | DJP(jp_journal_1st_block), |
351 | bdevname(SB_JOURNAL(sb)->j_dev_bd, b), | 350 | SB_JOURNAL(sb)->j_dev_bd, |
352 | DJP(jp_journal_dev), | 351 | DJP(jp_journal_dev), |
353 | DJP(jp_journal_size), | 352 | DJP(jp_journal_size), |
354 | DJP(jp_journal_trans_max), | 353 | DJP(jp_journal_trans_max), |
diff --git a/fs/select.c b/fs/select.c index 015547330e88..79d0d4953cad 100644 --- a/fs/select.c +++ b/fs/select.c | |||
@@ -778,8 +778,8 @@ static inline unsigned int do_pollfd(struct pollfd *pollfd, poll_table *pwait, | |||
778 | return mask; | 778 | return mask; |
779 | } | 779 | } |
780 | 780 | ||
781 | static int do_poll(unsigned int nfds, struct poll_list *list, | 781 | static int do_poll(struct poll_list *list, struct poll_wqueues *wait, |
782 | struct poll_wqueues *wait, struct timespec *end_time) | 782 | struct timespec *end_time) |
783 | { | 783 | { |
784 | poll_table* pt = &wait->pt; | 784 | poll_table* pt = &wait->pt; |
785 | ktime_t expire, *to = NULL; | 785 | ktime_t expire, *to = NULL; |
@@ -908,7 +908,7 @@ int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, | |||
908 | } | 908 | } |
909 | 909 | ||
910 | poll_initwait(&table); | 910 | poll_initwait(&table); |
911 | fdcount = do_poll(nfds, head, &table, end_time); | 911 | fdcount = do_poll(head, &table, end_time); |
912 | poll_freewait(&table); | 912 | poll_freewait(&table); |
913 | 913 | ||
914 | for (walk = head; walk; walk = walk->next) { | 914 | for (walk = head; walk; walk = walk->next) { |
diff --git a/fs/splice.c b/fs/splice.c index 4cf700d50b40..82bc0d64fc38 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -415,6 +415,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
415 | */ | 415 | */ |
416 | if (!page->mapping) { | 416 | if (!page->mapping) { |
417 | unlock_page(page); | 417 | unlock_page(page); |
418 | retry_lookup: | ||
418 | page = find_or_create_page(mapping, index, | 419 | page = find_or_create_page(mapping, index, |
419 | mapping_gfp_mask(mapping)); | 420 | mapping_gfp_mask(mapping)); |
420 | 421 | ||
@@ -439,13 +440,10 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
439 | error = mapping->a_ops->readpage(in, page); | 440 | error = mapping->a_ops->readpage(in, page); |
440 | if (unlikely(error)) { | 441 | if (unlikely(error)) { |
441 | /* | 442 | /* |
442 | * We really should re-lookup the page here, | 443 | * Re-lookup the page |
443 | * but it complicates things a lot. Instead | ||
444 | * lets just do what we already stored, and | ||
445 | * we'll get it the next time we are called. | ||
446 | */ | 444 | */ |
447 | if (error == AOP_TRUNCATED_PAGE) | 445 | if (error == AOP_TRUNCATED_PAGE) |
448 | error = 0; | 446 | goto retry_lookup; |
449 | 447 | ||
450 | break; | 448 | break; |
451 | } | 449 | } |
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 5056babe00df..dded920cbc8f 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c | |||
@@ -80,7 +80,6 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent) | |||
80 | { | 80 | { |
81 | struct squashfs_sb_info *msblk; | 81 | struct squashfs_sb_info *msblk; |
82 | struct squashfs_super_block *sblk = NULL; | 82 | struct squashfs_super_block *sblk = NULL; |
83 | char b[BDEVNAME_SIZE]; | ||
84 | struct inode *root; | 83 | struct inode *root; |
85 | long long root_inode; | 84 | long long root_inode; |
86 | unsigned short flags; | 85 | unsigned short flags; |
@@ -124,8 +123,8 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent) | |||
124 | sb->s_magic = le32_to_cpu(sblk->s_magic); | 123 | sb->s_magic = le32_to_cpu(sblk->s_magic); |
125 | if (sb->s_magic != SQUASHFS_MAGIC) { | 124 | if (sb->s_magic != SQUASHFS_MAGIC) { |
126 | if (!silent) | 125 | if (!silent) |
127 | ERROR("Can't find a SQUASHFS superblock on %s\n", | 126 | ERROR("Can't find a SQUASHFS superblock on %pg\n", |
128 | bdevname(sb->s_bdev, b)); | 127 | sb->s_bdev); |
129 | goto failed_mount; | 128 | goto failed_mount; |
130 | } | 129 | } |
131 | 130 | ||
@@ -178,7 +177,7 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent) | |||
178 | msblk->inodes = le32_to_cpu(sblk->inodes); | 177 | msblk->inodes = le32_to_cpu(sblk->inodes); |
179 | flags = le16_to_cpu(sblk->flags); | 178 | flags = le16_to_cpu(sblk->flags); |
180 | 179 | ||
181 | TRACE("Found valid superblock on %s\n", bdevname(sb->s_bdev, b)); | 180 | TRACE("Found valid superblock on %pg\n", sb->s_bdev); |
182 | TRACE("Inodes are %scompressed\n", SQUASHFS_UNCOMPRESSED_INODES(flags) | 181 | TRACE("Inodes are %scompressed\n", SQUASHFS_UNCOMPRESSED_INODES(flags) |
183 | ? "un" : ""); | 182 | ? "un" : ""); |
184 | TRACE("Data is %scompressed\n", SQUASHFS_UNCOMPRESSED_DATA(flags) | 183 | TRACE("Data is %scompressed\n", SQUASHFS_UNCOMPRESSED_DATA(flags) |
diff --git a/fs/super.c b/fs/super.c index 954aeb80e202..cc658a20a29e 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -1012,10 +1012,8 @@ struct dentry *mount_bdev(struct file_system_type *fs_type, | |||
1012 | blkdev_put(bdev, mode); | 1012 | blkdev_put(bdev, mode); |
1013 | down_write(&s->s_umount); | 1013 | down_write(&s->s_umount); |
1014 | } else { | 1014 | } else { |
1015 | char b[BDEVNAME_SIZE]; | ||
1016 | |||
1017 | s->s_mode = mode; | 1015 | s->s_mode = mode; |
1018 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); | 1016 | snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev); |
1019 | sb_set_blocksize(s, block_size(bdev)); | 1017 | sb_set_blocksize(s, block_size(bdev)); |
1020 | error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); | 1018 | error = fill_super(s, data, flags & MS_SILENT ? 1 : 0); |
1021 | if (error) { | 1019 | if (error) { |
diff --git a/fs/xattr.c b/fs/xattr.c index d7f5037a17b5..d5dd6c8b82a7 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -305,7 +305,6 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
305 | { | 305 | { |
306 | int error; | 306 | int error; |
307 | void *kvalue = NULL; | 307 | void *kvalue = NULL; |
308 | void *vvalue = NULL; /* If non-NULL, we used vmalloc() */ | ||
309 | char kname[XATTR_NAME_MAX + 1]; | 308 | char kname[XATTR_NAME_MAX + 1]; |
310 | 309 | ||
311 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) | 310 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) |
@@ -322,10 +321,9 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
322 | return -E2BIG; | 321 | return -E2BIG; |
323 | kvalue = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); | 322 | kvalue = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); |
324 | if (!kvalue) { | 323 | if (!kvalue) { |
325 | vvalue = vmalloc(size); | 324 | kvalue = vmalloc(size); |
326 | if (!vvalue) | 325 | if (!kvalue) |
327 | return -ENOMEM; | 326 | return -ENOMEM; |
328 | kvalue = vvalue; | ||
329 | } | 327 | } |
330 | if (copy_from_user(kvalue, value, size)) { | 328 | if (copy_from_user(kvalue, value, size)) { |
331 | error = -EFAULT; | 329 | error = -EFAULT; |
@@ -338,10 +336,8 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
338 | 336 | ||
339 | error = vfs_setxattr(d, kname, kvalue, size, flags); | 337 | error = vfs_setxattr(d, kname, kvalue, size, flags); |
340 | out: | 338 | out: |
341 | if (vvalue) | 339 | kvfree(kvalue); |
342 | vfree(vvalue); | 340 | |
343 | else | ||
344 | kfree(kvalue); | ||
345 | return error; | 341 | return error; |
346 | } | 342 | } |
347 | 343 | ||
@@ -409,7 +405,6 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, | |||
409 | { | 405 | { |
410 | ssize_t error; | 406 | ssize_t error; |
411 | void *kvalue = NULL; | 407 | void *kvalue = NULL; |
412 | void *vvalue = NULL; | ||
413 | char kname[XATTR_NAME_MAX + 1]; | 408 | char kname[XATTR_NAME_MAX + 1]; |
414 | 409 | ||
415 | error = strncpy_from_user(kname, name, sizeof(kname)); | 410 | error = strncpy_from_user(kname, name, sizeof(kname)); |
@@ -423,10 +418,9 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, | |||
423 | size = XATTR_SIZE_MAX; | 418 | size = XATTR_SIZE_MAX; |
424 | kvalue = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); | 419 | kvalue = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); |
425 | if (!kvalue) { | 420 | if (!kvalue) { |
426 | vvalue = vmalloc(size); | 421 | kvalue = vmalloc(size); |
427 | if (!vvalue) | 422 | if (!kvalue) |
428 | return -ENOMEM; | 423 | return -ENOMEM; |
429 | kvalue = vvalue; | ||
430 | } | 424 | } |
431 | } | 425 | } |
432 | 426 | ||
@@ -442,10 +436,9 @@ getxattr(struct dentry *d, const char __user *name, void __user *value, | |||
442 | than XATTR_SIZE_MAX bytes. Not possible. */ | 436 | than XATTR_SIZE_MAX bytes. Not possible. */ |
443 | error = -E2BIG; | 437 | error = -E2BIG; |
444 | } | 438 | } |
445 | if (vvalue) | 439 | |
446 | vfree(vvalue); | 440 | kvfree(kvalue); |
447 | else | 441 | |
448 | kfree(kvalue); | ||
449 | return error; | 442 | return error; |
450 | } | 443 | } |
451 | 444 | ||
@@ -502,17 +495,15 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
502 | { | 495 | { |
503 | ssize_t error; | 496 | ssize_t error; |
504 | char *klist = NULL; | 497 | char *klist = NULL; |
505 | char *vlist = NULL; /* If non-NULL, we used vmalloc() */ | ||
506 | 498 | ||
507 | if (size) { | 499 | if (size) { |
508 | if (size > XATTR_LIST_MAX) | 500 | if (size > XATTR_LIST_MAX) |
509 | size = XATTR_LIST_MAX; | 501 | size = XATTR_LIST_MAX; |
510 | klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL); | 502 | klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL); |
511 | if (!klist) { | 503 | if (!klist) { |
512 | vlist = vmalloc(size); | 504 | klist = vmalloc(size); |
513 | if (!vlist) | 505 | if (!klist) |
514 | return -ENOMEM; | 506 | return -ENOMEM; |
515 | klist = vlist; | ||
516 | } | 507 | } |
517 | } | 508 | } |
518 | 509 | ||
@@ -525,10 +516,9 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
525 | than XATTR_LIST_MAX bytes. Not possible. */ | 516 | than XATTR_LIST_MAX bytes. Not possible. */ |
526 | error = -E2BIG; | 517 | error = -E2BIG; |
527 | } | 518 | } |
528 | if (vlist) | 519 | |
529 | vfree(vlist); | 520 | kvfree(klist); |
530 | else | 521 | |
531 | kfree(klist); | ||
532 | return error; | 522 | return error; |
533 | } | 523 | } |
534 | 524 | ||
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 3243cdf97f33..ace91e7c713e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
@@ -1632,13 +1632,9 @@ xfs_setsize_buftarg( | |||
1632 | btp->bt_meta_sectormask = sectorsize - 1; | 1632 | btp->bt_meta_sectormask = sectorsize - 1; |
1633 | 1633 | ||
1634 | if (set_blocksize(btp->bt_bdev, sectorsize)) { | 1634 | if (set_blocksize(btp->bt_bdev, sectorsize)) { |
1635 | char name[BDEVNAME_SIZE]; | ||
1636 | |||
1637 | bdevname(btp->bt_bdev, name); | ||
1638 | |||
1639 | xfs_warn(btp->bt_mount, | 1635 | xfs_warn(btp->bt_mount, |
1640 | "Cannot set_blocksize to %u on device %s", | 1636 | "Cannot set_blocksize to %u on device %pg", |
1641 | sectorsize, name); | 1637 | sectorsize, btp->bt_bdev); |
1642 | return -EINVAL; | 1638 | return -EINVAL; |
1643 | } | 1639 | } |
1644 | 1640 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index ec43a24bf63d..731262c3fbb7 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -2307,9 +2307,9 @@ static inline void iterate_bdevs(void (*f)(struct block_device *, void *), void | |||
2307 | { | 2307 | { |
2308 | } | 2308 | } |
2309 | 2309 | ||
2310 | static inline int sb_is_blkdev_sb(struct super_block *sb) | 2310 | static inline bool sb_is_blkdev_sb(struct super_block *sb) |
2311 | { | 2311 | { |
2312 | return 0; | 2312 | return false; |
2313 | } | 2313 | } |
2314 | #endif | 2314 | #endif |
2315 | extern int sync_filesystem(struct super_block *); | 2315 | extern int sync_filesystem(struct super_block *); |
@@ -2387,7 +2387,7 @@ extern void init_special_inode(struct inode *, umode_t, dev_t); | |||
2387 | 2387 | ||
2388 | /* Invalid inode operations -- fs/bad_inode.c */ | 2388 | /* Invalid inode operations -- fs/bad_inode.c */ |
2389 | extern void make_bad_inode(struct inode *); | 2389 | extern void make_bad_inode(struct inode *); |
2390 | extern int is_bad_inode(struct inode *); | 2390 | extern bool is_bad_inode(struct inode *); |
2391 | 2391 | ||
2392 | #ifdef CONFIG_BLOCK | 2392 | #ifdef CONFIG_BLOCK |
2393 | /* | 2393 | /* |
@@ -2548,8 +2548,8 @@ extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *); | |||
2548 | extern struct file * open_exec(const char *); | 2548 | extern struct file * open_exec(const char *); |
2549 | 2549 | ||
2550 | /* fs/dcache.c -- generic fs support functions */ | 2550 | /* fs/dcache.c -- generic fs support functions */ |
2551 | extern int is_subdir(struct dentry *, struct dentry *); | 2551 | extern bool is_subdir(struct dentry *, struct dentry *); |
2552 | extern int path_is_under(struct path *, struct path *); | 2552 | extern bool path_is_under(struct path *, struct path *); |
2553 | 2553 | ||
2554 | extern char *file_path(struct file *, char *, int); | 2554 | extern char *file_path(struct file *, char *, int); |
2555 | 2555 | ||
@@ -2676,6 +2676,8 @@ extern loff_t generic_file_llseek_size(struct file *file, loff_t offset, | |||
2676 | int whence, loff_t maxsize, loff_t eof); | 2676 | int whence, loff_t maxsize, loff_t eof); |
2677 | extern loff_t fixed_size_llseek(struct file *file, loff_t offset, | 2677 | extern loff_t fixed_size_llseek(struct file *file, loff_t offset, |
2678 | int whence, loff_t size); | 2678 | int whence, loff_t size); |
2679 | extern loff_t no_seek_end_llseek_size(struct file *, loff_t, int, loff_t); | ||
2680 | extern loff_t no_seek_end_llseek(struct file *, loff_t, int); | ||
2679 | extern int generic_file_open(struct inode * inode, struct file * filp); | 2681 | extern int generic_file_open(struct inode * inode, struct file * filp); |
2680 | extern int nonseekable_open(struct inode * inode, struct file * filp); | 2682 | extern int nonseekable_open(struct inode * inode, struct file * filp); |
2681 | 2683 | ||
@@ -2978,7 +2980,7 @@ int __init get_filesystem_list(char *buf); | |||
2978 | #define OPEN_FMODE(flag) ((__force fmode_t)(((flag + 1) & O_ACCMODE) | \ | 2980 | #define OPEN_FMODE(flag) ((__force fmode_t)(((flag + 1) & O_ACCMODE) | \ |
2979 | (flag & __FMODE_NONOTIFY))) | 2981 | (flag & __FMODE_NONOTIFY))) |
2980 | 2982 | ||
2981 | static inline int is_sxid(umode_t mode) | 2983 | static inline bool is_sxid(umode_t mode) |
2982 | { | 2984 | { |
2983 | return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP)); | 2985 | return (mode & S_ISUID) || ((mode & S_ISGID) && (mode & S_IXGRP)); |
2984 | } | 2986 | } |
diff --git a/include/linux/namei.h b/include/linux/namei.h index d8c6334cd150..d0f25d81b46a 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
@@ -77,6 +77,7 @@ extern struct dentry *kern_path_locked(const char *, struct path *); | |||
77 | extern int kern_path_mountpoint(int, const char *, struct path *, unsigned int); | 77 | extern int kern_path_mountpoint(int, const char *, struct path *, unsigned int); |
78 | 78 | ||
79 | extern struct dentry *lookup_one_len(const char *, struct dentry *, int); | 79 | extern struct dentry *lookup_one_len(const char *, struct dentry *, int); |
80 | extern struct dentry *lookup_one_len_unlocked(const char *, struct dentry *, int); | ||
80 | 81 | ||
81 | extern int follow_down_one(struct path *); | 82 | extern int follow_down_one(struct path *); |
82 | extern int follow_down(struct path *); | 83 | extern int follow_down(struct path *); |
diff --git a/include/linux/string.h b/include/linux/string.h index 9ef7795e65e4..9eebc66d957a 100644 --- a/include/linux/string.h +++ b/include/linux/string.h | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | extern char *strndup_user(const char __user *, long); | 11 | extern char *strndup_user(const char __user *, long); |
12 | extern void *memdup_user(const void __user *, size_t); | 12 | extern void *memdup_user(const void __user *, size_t); |
13 | extern void *memdup_user_nul(const void __user *, size_t); | ||
13 | 14 | ||
14 | /* | 15 | /* |
15 | * Include machine specific inline routines | 16 | * Include machine specific inline routines |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index dc6858d6639e..5faf89ac9ec0 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -2047,9 +2047,8 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, | |||
2047 | void *data) | 2047 | void *data) |
2048 | { | 2048 | { |
2049 | int *i, vleft, first = 1, err = 0; | 2049 | int *i, vleft, first = 1, err = 0; |
2050 | unsigned long page = 0; | ||
2051 | size_t left; | 2050 | size_t left; |
2052 | char *kbuf; | 2051 | char *kbuf = NULL, *p; |
2053 | 2052 | ||
2054 | if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) { | 2053 | if (!tbl_data || !table->maxlen || !*lenp || (*ppos && !write)) { |
2055 | *lenp = 0; | 2054 | *lenp = 0; |
@@ -2078,15 +2077,9 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, | |||
2078 | 2077 | ||
2079 | if (left > PAGE_SIZE - 1) | 2078 | if (left > PAGE_SIZE - 1) |
2080 | left = PAGE_SIZE - 1; | 2079 | left = PAGE_SIZE - 1; |
2081 | page = __get_free_page(GFP_TEMPORARY); | 2080 | p = kbuf = memdup_user_nul(buffer, left); |
2082 | kbuf = (char *) page; | 2081 | if (IS_ERR(kbuf)) |
2083 | if (!kbuf) | 2082 | return PTR_ERR(kbuf); |
2084 | return -ENOMEM; | ||
2085 | if (copy_from_user(kbuf, buffer, left)) { | ||
2086 | err = -EFAULT; | ||
2087 | goto free; | ||
2088 | } | ||
2089 | kbuf[left] = 0; | ||
2090 | } | 2083 | } |
2091 | 2084 | ||
2092 | for (; left && vleft--; i++, first=0) { | 2085 | for (; left && vleft--; i++, first=0) { |
@@ -2094,11 +2087,11 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, | |||
2094 | bool neg; | 2087 | bool neg; |
2095 | 2088 | ||
2096 | if (write) { | 2089 | if (write) { |
2097 | left -= proc_skip_spaces(&kbuf); | 2090 | left -= proc_skip_spaces(&p); |
2098 | 2091 | ||
2099 | if (!left) | 2092 | if (!left) |
2100 | break; | 2093 | break; |
2101 | err = proc_get_long(&kbuf, &left, &lval, &neg, | 2094 | err = proc_get_long(&p, &left, &lval, &neg, |
2102 | proc_wspace_sep, | 2095 | proc_wspace_sep, |
2103 | sizeof(proc_wspace_sep), NULL); | 2096 | sizeof(proc_wspace_sep), NULL); |
2104 | if (err) | 2097 | if (err) |
@@ -2125,10 +2118,9 @@ static int __do_proc_dointvec(void *tbl_data, struct ctl_table *table, | |||
2125 | if (!write && !first && left && !err) | 2118 | if (!write && !first && left && !err) |
2126 | err = proc_put_char(&buffer, &left, '\n'); | 2119 | err = proc_put_char(&buffer, &left, '\n'); |
2127 | if (write && !err && left) | 2120 | if (write && !err && left) |
2128 | left -= proc_skip_spaces(&kbuf); | 2121 | left -= proc_skip_spaces(&p); |
2129 | free: | ||
2130 | if (write) { | 2122 | if (write) { |
2131 | free_page(page); | 2123 | kfree(kbuf); |
2132 | if (first) | 2124 | if (first) |
2133 | return err ? : -EINVAL; | 2125 | return err ? : -EINVAL; |
2134 | } | 2126 | } |
@@ -2310,9 +2302,8 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int | |||
2310 | { | 2302 | { |
2311 | unsigned long *i, *min, *max; | 2303 | unsigned long *i, *min, *max; |
2312 | int vleft, first = 1, err = 0; | 2304 | int vleft, first = 1, err = 0; |
2313 | unsigned long page = 0; | ||
2314 | size_t left; | 2305 | size_t left; |
2315 | char *kbuf; | 2306 | char *kbuf = NULL, *p; |
2316 | 2307 | ||
2317 | if (!data || !table->maxlen || !*lenp || (*ppos && !write)) { | 2308 | if (!data || !table->maxlen || !*lenp || (*ppos && !write)) { |
2318 | *lenp = 0; | 2309 | *lenp = 0; |
@@ -2340,15 +2331,9 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int | |||
2340 | 2331 | ||
2341 | if (left > PAGE_SIZE - 1) | 2332 | if (left > PAGE_SIZE - 1) |
2342 | left = PAGE_SIZE - 1; | 2333 | left = PAGE_SIZE - 1; |
2343 | page = __get_free_page(GFP_TEMPORARY); | 2334 | p = kbuf = memdup_user_nul(buffer, left); |
2344 | kbuf = (char *) page; | 2335 | if (IS_ERR(kbuf)) |
2345 | if (!kbuf) | 2336 | return PTR_ERR(kbuf); |
2346 | return -ENOMEM; | ||
2347 | if (copy_from_user(kbuf, buffer, left)) { | ||
2348 | err = -EFAULT; | ||
2349 | goto free; | ||
2350 | } | ||
2351 | kbuf[left] = 0; | ||
2352 | } | 2337 | } |
2353 | 2338 | ||
2354 | for (; left && vleft--; i++, first = 0) { | 2339 | for (; left && vleft--; i++, first = 0) { |
@@ -2357,9 +2342,9 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int | |||
2357 | if (write) { | 2342 | if (write) { |
2358 | bool neg; | 2343 | bool neg; |
2359 | 2344 | ||
2360 | left -= proc_skip_spaces(&kbuf); | 2345 | left -= proc_skip_spaces(&p); |
2361 | 2346 | ||
2362 | err = proc_get_long(&kbuf, &left, &val, &neg, | 2347 | err = proc_get_long(&p, &left, &val, &neg, |
2363 | proc_wspace_sep, | 2348 | proc_wspace_sep, |
2364 | sizeof(proc_wspace_sep), NULL); | 2349 | sizeof(proc_wspace_sep), NULL); |
2365 | if (err) | 2350 | if (err) |
@@ -2385,10 +2370,9 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int | |||
2385 | if (!write && !first && left && !err) | 2370 | if (!write && !first && left && !err) |
2386 | err = proc_put_char(&buffer, &left, '\n'); | 2371 | err = proc_put_char(&buffer, &left, '\n'); |
2387 | if (write && !err) | 2372 | if (write && !err) |
2388 | left -= proc_skip_spaces(&kbuf); | 2373 | left -= proc_skip_spaces(&p); |
2389 | free: | ||
2390 | if (write) { | 2374 | if (write) { |
2391 | free_page(page); | 2375 | kfree(kbuf); |
2392 | if (first) | 2376 | if (first) |
2393 | return err ? : -EINVAL; | 2377 | return err ? : -EINVAL; |
2394 | } | 2378 | } |
@@ -2650,34 +2634,27 @@ int proc_do_large_bitmap(struct ctl_table *table, int write, | |||
2650 | } | 2634 | } |
2651 | 2635 | ||
2652 | if (write) { | 2636 | if (write) { |
2653 | unsigned long page = 0; | 2637 | char *kbuf, *p; |
2654 | char *kbuf; | ||
2655 | 2638 | ||
2656 | if (left > PAGE_SIZE - 1) | 2639 | if (left > PAGE_SIZE - 1) |
2657 | left = PAGE_SIZE - 1; | 2640 | left = PAGE_SIZE - 1; |
2658 | 2641 | ||
2659 | page = __get_free_page(GFP_TEMPORARY); | 2642 | p = kbuf = memdup_user_nul(buffer, left); |
2660 | kbuf = (char *) page; | 2643 | if (IS_ERR(kbuf)) |
2661 | if (!kbuf) | 2644 | return PTR_ERR(kbuf); |
2662 | return -ENOMEM; | ||
2663 | if (copy_from_user(kbuf, buffer, left)) { | ||
2664 | free_page(page); | ||
2665 | return -EFAULT; | ||
2666 | } | ||
2667 | kbuf[left] = 0; | ||
2668 | 2645 | ||
2669 | tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long), | 2646 | tmp_bitmap = kzalloc(BITS_TO_LONGS(bitmap_len) * sizeof(unsigned long), |
2670 | GFP_KERNEL); | 2647 | GFP_KERNEL); |
2671 | if (!tmp_bitmap) { | 2648 | if (!tmp_bitmap) { |
2672 | free_page(page); | 2649 | kfree(kbuf); |
2673 | return -ENOMEM; | 2650 | return -ENOMEM; |
2674 | } | 2651 | } |
2675 | proc_skip_char(&kbuf, &left, '\n'); | 2652 | proc_skip_char(&p, &left, '\n'); |
2676 | while (!err && left) { | 2653 | while (!err && left) { |
2677 | unsigned long val_a, val_b; | 2654 | unsigned long val_a, val_b; |
2678 | bool neg; | 2655 | bool neg; |
2679 | 2656 | ||
2680 | err = proc_get_long(&kbuf, &left, &val_a, &neg, tr_a, | 2657 | err = proc_get_long(&p, &left, &val_a, &neg, tr_a, |
2681 | sizeof(tr_a), &c); | 2658 | sizeof(tr_a), &c); |
2682 | if (err) | 2659 | if (err) |
2683 | break; | 2660 | break; |
@@ -2688,12 +2665,12 @@ int proc_do_large_bitmap(struct ctl_table *table, int write, | |||
2688 | 2665 | ||
2689 | val_b = val_a; | 2666 | val_b = val_a; |
2690 | if (left) { | 2667 | if (left) { |
2691 | kbuf++; | 2668 | p++; |
2692 | left--; | 2669 | left--; |
2693 | } | 2670 | } |
2694 | 2671 | ||
2695 | if (c == '-') { | 2672 | if (c == '-') { |
2696 | err = proc_get_long(&kbuf, &left, &val_b, | 2673 | err = proc_get_long(&p, &left, &val_b, |
2697 | &neg, tr_b, sizeof(tr_b), | 2674 | &neg, tr_b, sizeof(tr_b), |
2698 | &c); | 2675 | &c); |
2699 | if (err) | 2676 | if (err) |
@@ -2704,16 +2681,16 @@ int proc_do_large_bitmap(struct ctl_table *table, int write, | |||
2704 | break; | 2681 | break; |
2705 | } | 2682 | } |
2706 | if (left) { | 2683 | if (left) { |
2707 | kbuf++; | 2684 | p++; |
2708 | left--; | 2685 | left--; |
2709 | } | 2686 | } |
2710 | } | 2687 | } |
2711 | 2688 | ||
2712 | bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1); | 2689 | bitmap_set(tmp_bitmap, val_a, val_b - val_a + 1); |
2713 | first = 0; | 2690 | first = 0; |
2714 | proc_skip_char(&kbuf, &left, '\n'); | 2691 | proc_skip_char(&p, &left, '\n'); |
2715 | } | 2692 | } |
2716 | free_page(page); | 2693 | kfree(kbuf); |
2717 | } else { | 2694 | } else { |
2718 | unsigned long bit_a, bit_b = 0; | 2695 | unsigned long bit_a, bit_b = 0; |
2719 | 2696 | ||
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index a990824c8604..2aeb6ffc0a1e 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
@@ -349,16 +349,10 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | |||
349 | if (count >= BLK_TN_MAX_MSG) | 349 | if (count >= BLK_TN_MAX_MSG) |
350 | return -EINVAL; | 350 | return -EINVAL; |
351 | 351 | ||
352 | msg = kmalloc(count + 1, GFP_KERNEL); | 352 | msg = memdup_user_nul(buffer, count); |
353 | if (msg == NULL) | 353 | if (IS_ERR(msg)) |
354 | return -ENOMEM; | 354 | return PTR_ERR(msg); |
355 | |||
356 | if (copy_from_user(msg, buffer, count)) { | ||
357 | kfree(msg); | ||
358 | return -EFAULT; | ||
359 | } | ||
360 | 355 | ||
361 | msg[count] = '\0'; | ||
362 | bt = filp->private_data; | 356 | bt = filp->private_data; |
363 | __trace_note_message(bt, "%s", msg); | 357 | __trace_note_message(bt, "%s", msg); |
364 | kfree(msg); | 358 | kfree(msg); |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 4f6ef6912e00..f333e57c4614 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -1340,15 +1340,9 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, | |||
1340 | if (cnt >= PAGE_SIZE) | 1340 | if (cnt >= PAGE_SIZE) |
1341 | return -EINVAL; | 1341 | return -EINVAL; |
1342 | 1342 | ||
1343 | buf = (char *)__get_free_page(GFP_TEMPORARY); | 1343 | buf = memdup_user_nul(ubuf, cnt); |
1344 | if (!buf) | 1344 | if (IS_ERR(buf)) |
1345 | return -ENOMEM; | 1345 | return PTR_ERR(buf); |
1346 | |||
1347 | if (copy_from_user(buf, ubuf, cnt)) { | ||
1348 | free_page((unsigned long) buf); | ||
1349 | return -EFAULT; | ||
1350 | } | ||
1351 | buf[cnt] = '\0'; | ||
1352 | 1346 | ||
1353 | mutex_lock(&event_mutex); | 1347 | mutex_lock(&event_mutex); |
1354 | file = event_file_data(filp); | 1348 | file = event_file_data(filp); |
@@ -1356,7 +1350,7 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, | |||
1356 | err = apply_event_filter(file, buf); | 1350 | err = apply_event_filter(file, buf); |
1357 | mutex_unlock(&event_mutex); | 1351 | mutex_unlock(&event_mutex); |
1358 | 1352 | ||
1359 | free_page((unsigned long) buf); | 1353 | kfree(buf); |
1360 | if (err < 0) | 1354 | if (err < 0) |
1361 | return err; | 1355 | return err; |
1362 | 1356 | ||
@@ -1507,18 +1501,12 @@ subsystem_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, | |||
1507 | if (cnt >= PAGE_SIZE) | 1501 | if (cnt >= PAGE_SIZE) |
1508 | return -EINVAL; | 1502 | return -EINVAL; |
1509 | 1503 | ||
1510 | buf = (char *)__get_free_page(GFP_TEMPORARY); | 1504 | buf = memdup_user_nul(ubuf, cnt); |
1511 | if (!buf) | 1505 | if (IS_ERR(buf)) |
1512 | return -ENOMEM; | 1506 | return PTR_ERR(buf); |
1513 | |||
1514 | if (copy_from_user(buf, ubuf, cnt)) { | ||
1515 | free_page((unsigned long) buf); | ||
1516 | return -EFAULT; | ||
1517 | } | ||
1518 | buf[cnt] = '\0'; | ||
1519 | 1507 | ||
1520 | err = apply_subsystem_event_filter(dir, buf); | 1508 | err = apply_subsystem_event_filter(dir, buf); |
1521 | free_page((unsigned long) buf); | 1509 | kfree(buf); |
1522 | if (err < 0) | 1510 | if (err < 0) |
1523 | return err; | 1511 | return err; |
1524 | 1512 | ||
diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c index 42a4009fd75a..4b5e8ed68d77 100644 --- a/kernel/trace/trace_events_trigger.c +++ b/kernel/trace/trace_events_trigger.c | |||
@@ -237,28 +237,23 @@ static ssize_t event_trigger_regex_write(struct file *file, | |||
237 | if (cnt >= PAGE_SIZE) | 237 | if (cnt >= PAGE_SIZE) |
238 | return -EINVAL; | 238 | return -EINVAL; |
239 | 239 | ||
240 | buf = (char *)__get_free_page(GFP_TEMPORARY); | 240 | buf = memdup_user_nul(ubuf, cnt); |
241 | if (!buf) | 241 | if (IS_ERR(buf)) |
242 | return -ENOMEM; | 242 | return PTR_ERR(buf); |
243 | 243 | ||
244 | if (copy_from_user(buf, ubuf, cnt)) { | ||
245 | free_page((unsigned long)buf); | ||
246 | return -EFAULT; | ||
247 | } | ||
248 | buf[cnt] = '\0'; | ||
249 | strim(buf); | 244 | strim(buf); |
250 | 245 | ||
251 | mutex_lock(&event_mutex); | 246 | mutex_lock(&event_mutex); |
252 | event_file = event_file_data(file); | 247 | event_file = event_file_data(file); |
253 | if (unlikely(!event_file)) { | 248 | if (unlikely(!event_file)) { |
254 | mutex_unlock(&event_mutex); | 249 | mutex_unlock(&event_mutex); |
255 | free_page((unsigned long)buf); | 250 | kfree(buf); |
256 | return -ENODEV; | 251 | return -ENODEV; |
257 | } | 252 | } |
258 | ret = trigger_process_regex(event_file, buf); | 253 | ret = trigger_process_regex(event_file, buf); |
259 | mutex_unlock(&event_mutex); | 254 | mutex_unlock(&event_mutex); |
260 | 255 | ||
261 | free_page((unsigned long)buf); | 256 | kfree(buf); |
262 | if (ret < 0) | 257 | if (ret < 0) |
263 | goto out; | 258 | goto out; |
264 | 259 | ||
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 88fefa68c516..9bafc211930c 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
@@ -602,8 +602,7 @@ static ssize_t map_write(struct file *file, const char __user *buf, | |||
602 | struct uid_gid_map new_map; | 602 | struct uid_gid_map new_map; |
603 | unsigned idx; | 603 | unsigned idx; |
604 | struct uid_gid_extent *extent = NULL; | 604 | struct uid_gid_extent *extent = NULL; |
605 | unsigned long page = 0; | 605 | char *kbuf = NULL, *pos, *next_line; |
606 | char *kbuf, *pos, *next_line; | ||
607 | ssize_t ret = -EINVAL; | 606 | ssize_t ret = -EINVAL; |
608 | 607 | ||
609 | /* | 608 | /* |
@@ -638,23 +637,18 @@ static ssize_t map_write(struct file *file, const char __user *buf, | |||
638 | if (cap_valid(cap_setid) && !file_ns_capable(file, ns, CAP_SYS_ADMIN)) | 637 | if (cap_valid(cap_setid) && !file_ns_capable(file, ns, CAP_SYS_ADMIN)) |
639 | goto out; | 638 | goto out; |
640 | 639 | ||
641 | /* Get a buffer */ | ||
642 | ret = -ENOMEM; | ||
643 | page = __get_free_page(GFP_TEMPORARY); | ||
644 | kbuf = (char *) page; | ||
645 | if (!page) | ||
646 | goto out; | ||
647 | |||
648 | /* Only allow < page size writes at the beginning of the file */ | 640 | /* Only allow < page size writes at the beginning of the file */ |
649 | ret = -EINVAL; | 641 | ret = -EINVAL; |
650 | if ((*ppos != 0) || (count >= PAGE_SIZE)) | 642 | if ((*ppos != 0) || (count >= PAGE_SIZE)) |
651 | goto out; | 643 | goto out; |
652 | 644 | ||
653 | /* Slurp in the user data */ | 645 | /* Slurp in the user data */ |
654 | ret = -EFAULT; | 646 | kbuf = memdup_user_nul(buf, count); |
655 | if (copy_from_user(kbuf, buf, count)) | 647 | if (IS_ERR(kbuf)) { |
648 | ret = PTR_ERR(kbuf); | ||
649 | kbuf = NULL; | ||
656 | goto out; | 650 | goto out; |
657 | kbuf[count] = '\0'; | 651 | } |
658 | 652 | ||
659 | /* Parse the user data */ | 653 | /* Parse the user data */ |
660 | ret = -EINVAL; | 654 | ret = -EINVAL; |
@@ -756,8 +750,7 @@ static ssize_t map_write(struct file *file, const char __user *buf, | |||
756 | ret = count; | 750 | ret = count; |
757 | out: | 751 | out: |
758 | mutex_unlock(&userns_state_mutex); | 752 | mutex_unlock(&userns_state_mutex); |
759 | if (page) | 753 | kfree(kbuf); |
760 | free_page(page); | ||
761 | return ret; | 754 | return ret; |
762 | } | 755 | } |
763 | 756 | ||
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index e3952e9c8ec0..fe42b6ec3f0c 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
@@ -657,14 +657,9 @@ static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf, | |||
657 | pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE); | 657 | pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE); |
658 | return -E2BIG; | 658 | return -E2BIG; |
659 | } | 659 | } |
660 | tmpbuf = kmalloc(len + 1, GFP_KERNEL); | 660 | tmpbuf = memdup_user_nul(ubuf, len); |
661 | if (!tmpbuf) | 661 | if (IS_ERR(tmpbuf)) |
662 | return -ENOMEM; | 662 | return PTR_ERR(tmpbuf); |
663 | if (copy_from_user(tmpbuf, ubuf, len)) { | ||
664 | kfree(tmpbuf); | ||
665 | return -EFAULT; | ||
666 | } | ||
667 | tmpbuf[len] = '\0'; | ||
668 | vpr_info("read %d bytes from userspace\n", (int)len); | 663 | vpr_info("read %d bytes from userspace\n", (int)len); |
669 | 664 | ||
670 | ret = ddebug_exec_queries(tmpbuf, NULL); | 665 | ret = ddebug_exec_queries(tmpbuf, NULL); |
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index f9cee8e1233c..ac3f9476b776 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -31,6 +31,9 @@ | |||
31 | #include <linux/dcache.h> | 31 | #include <linux/dcache.h> |
32 | #include <linux/cred.h> | 32 | #include <linux/cred.h> |
33 | #include <net/addrconf.h> | 33 | #include <net/addrconf.h> |
34 | #ifdef CONFIG_BLOCK | ||
35 | #include <linux/blkdev.h> | ||
36 | #endif | ||
34 | 37 | ||
35 | #include <asm/page.h> /* for PAGE_SIZE */ | 38 | #include <asm/page.h> /* for PAGE_SIZE */ |
36 | #include <asm/sections.h> /* for dereference_function_descriptor() */ | 39 | #include <asm/sections.h> /* for dereference_function_descriptor() */ |
@@ -613,6 +616,26 @@ char *dentry_name(char *buf, char *end, const struct dentry *d, struct printf_sp | |||
613 | return buf; | 616 | return buf; |
614 | } | 617 | } |
615 | 618 | ||
619 | #ifdef CONFIG_BLOCK | ||
620 | static noinline_for_stack | ||
621 | char *bdev_name(char *buf, char *end, struct block_device *bdev, | ||
622 | struct printf_spec spec, const char *fmt) | ||
623 | { | ||
624 | struct gendisk *hd = bdev->bd_disk; | ||
625 | |||
626 | buf = string(buf, end, hd->disk_name, spec); | ||
627 | if (bdev->bd_part->partno) { | ||
628 | if (isdigit(hd->disk_name[strlen(hd->disk_name)-1])) { | ||
629 | if (buf < end) | ||
630 | *buf = 'p'; | ||
631 | buf++; | ||
632 | } | ||
633 | buf = number(buf, end, bdev->bd_part->partno, spec); | ||
634 | } | ||
635 | return buf; | ||
636 | } | ||
637 | #endif | ||
638 | |||
616 | static noinline_for_stack | 639 | static noinline_for_stack |
617 | char *symbol_string(char *buf, char *end, void *ptr, | 640 | char *symbol_string(char *buf, char *end, void *ptr, |
618 | struct printf_spec spec, const char *fmt) | 641 | struct printf_spec spec, const char *fmt) |
@@ -1443,6 +1466,7 @@ int kptr_restrict __read_mostly; | |||
1443 | * (default assumed to be phys_addr_t, passed by reference) | 1466 | * (default assumed to be phys_addr_t, passed by reference) |
1444 | * - 'd[234]' For a dentry name (optionally 2-4 last components) | 1467 | * - 'd[234]' For a dentry name (optionally 2-4 last components) |
1445 | * - 'D[234]' Same as 'd' but for a struct file | 1468 | * - 'D[234]' Same as 'd' but for a struct file |
1469 | * - 'g' For block_device name (gendisk + partition number) | ||
1446 | * - 'C' For a clock, it prints the name (Common Clock Framework) or address | 1470 | * - 'C' For a clock, it prints the name (Common Clock Framework) or address |
1447 | * (legacy clock framework) of the clock | 1471 | * (legacy clock framework) of the clock |
1448 | * - 'Cn' For a clock, it prints the name (Common Clock Framework) or address | 1472 | * - 'Cn' For a clock, it prints the name (Common Clock Framework) or address |
@@ -1600,6 +1624,11 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
1600 | return dentry_name(buf, end, | 1624 | return dentry_name(buf, end, |
1601 | ((const struct file *)ptr)->f_path.dentry, | 1625 | ((const struct file *)ptr)->f_path.dentry, |
1602 | spec, fmt); | 1626 | spec, fmt); |
1627 | #ifdef CONFIG_BLOCK | ||
1628 | case 'g': | ||
1629 | return bdev_name(buf, end, ptr, spec, fmt); | ||
1630 | #endif | ||
1631 | |||
1603 | } | 1632 | } |
1604 | spec.flags |= SMALL; | 1633 | spec.flags |= SMALL; |
1605 | if (spec.field_width == -1) { | 1634 | if (spec.field_width == -1) { |
@@ -176,6 +176,37 @@ char *strndup_user(const char __user *s, long n) | |||
176 | } | 176 | } |
177 | EXPORT_SYMBOL(strndup_user); | 177 | EXPORT_SYMBOL(strndup_user); |
178 | 178 | ||
179 | /** | ||
180 | * memdup_user_nul - duplicate memory region from user space and NUL-terminate | ||
181 | * | ||
182 | * @src: source address in user space | ||
183 | * @len: number of bytes to copy | ||
184 | * | ||
185 | * Returns an ERR_PTR() on failure. | ||
186 | */ | ||
187 | void *memdup_user_nul(const void __user *src, size_t len) | ||
188 | { | ||
189 | char *p; | ||
190 | |||
191 | /* | ||
192 | * Always use GFP_KERNEL, since copy_from_user() can sleep and | ||
193 | * cause pagefault, which makes it pointless to use GFP_NOFS | ||
194 | * or GFP_ATOMIC. | ||
195 | */ | ||
196 | p = kmalloc_track_caller(len + 1, GFP_KERNEL); | ||
197 | if (!p) | ||
198 | return ERR_PTR(-ENOMEM); | ||
199 | |||
200 | if (copy_from_user(p, src, len)) { | ||
201 | kfree(p); | ||
202 | return ERR_PTR(-EFAULT); | ||
203 | } | ||
204 | p[len] = '\0'; | ||
205 | |||
206 | return p; | ||
207 | } | ||
208 | EXPORT_SYMBOL(memdup_user_nul); | ||
209 | |||
179 | void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma, | 210 | void __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma, |
180 | struct vm_area_struct *prev, struct rb_node *rb_parent) | 211 | struct vm_area_struct *prev, struct rb_node *rb_parent) |
181 | { | 212 | { |
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 6e70ddb158b4..199bc76202d2 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
@@ -105,7 +105,7 @@ static struct list_head virtio_chan_list; | |||
105 | /* How many bytes left in this page. */ | 105 | /* How many bytes left in this page. */ |
106 | static unsigned int rest_of_page(void *data) | 106 | static unsigned int rest_of_page(void *data) |
107 | { | 107 | { |
108 | return PAGE_SIZE - ((unsigned long)data % PAGE_SIZE); | 108 | return PAGE_SIZE - offset_in_page(data); |
109 | } | 109 | } |
110 | 110 | ||
111 | /** | 111 | /** |
@@ -143,7 +143,6 @@ static void p9_virtio_close(struct p9_client *client) | |||
143 | static void req_done(struct virtqueue *vq) | 143 | static void req_done(struct virtqueue *vq) |
144 | { | 144 | { |
145 | struct virtio_chan *chan = vq->vdev->priv; | 145 | struct virtio_chan *chan = vq->vdev->priv; |
146 | struct p9_fcall *rc; | ||
147 | unsigned int len; | 146 | unsigned int len; |
148 | struct p9_req_t *req; | 147 | struct p9_req_t *req; |
149 | unsigned long flags; | 148 | unsigned long flags; |
@@ -152,8 +151,8 @@ static void req_done(struct virtqueue *vq) | |||
152 | 151 | ||
153 | while (1) { | 152 | while (1) { |
154 | spin_lock_irqsave(&chan->lock, flags); | 153 | spin_lock_irqsave(&chan->lock, flags); |
155 | rc = virtqueue_get_buf(chan->vq, &len); | 154 | req = virtqueue_get_buf(chan->vq, &len); |
156 | if (rc == NULL) { | 155 | if (req == NULL) { |
157 | spin_unlock_irqrestore(&chan->lock, flags); | 156 | spin_unlock_irqrestore(&chan->lock, flags); |
158 | break; | 157 | break; |
159 | } | 158 | } |
@@ -161,9 +160,6 @@ static void req_done(struct virtqueue *vq) | |||
161 | spin_unlock_irqrestore(&chan->lock, flags); | 160 | spin_unlock_irqrestore(&chan->lock, flags); |
162 | /* Wakeup if anyone waiting for VirtIO ring space. */ | 161 | /* Wakeup if anyone waiting for VirtIO ring space. */ |
163 | wake_up(chan->vc_wq); | 162 | wake_up(chan->vc_wq); |
164 | p9_debug(P9_DEBUG_TRANS, ": rc %p\n", rc); | ||
165 | p9_debug(P9_DEBUG_TRANS, ": lookup tag %d\n", rc->tag); | ||
166 | req = p9_tag_lookup(chan->client, rc->tag); | ||
167 | p9_client_cb(chan->client, req, REQ_STATUS_RCVD); | 163 | p9_client_cb(chan->client, req, REQ_STATUS_RCVD); |
168 | } | 164 | } |
169 | } | 165 | } |
@@ -284,7 +280,7 @@ req_retry: | |||
284 | if (in) | 280 | if (in) |
285 | sgs[out_sgs + in_sgs++] = chan->sg + out; | 281 | sgs[out_sgs + in_sgs++] = chan->sg + out; |
286 | 282 | ||
287 | err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req->tc, | 283 | err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req, |
288 | GFP_ATOMIC); | 284 | GFP_ATOMIC); |
289 | if (err < 0) { | 285 | if (err < 0) { |
290 | if (err == -ENOSPC) { | 286 | if (err == -ENOSPC) { |
@@ -369,7 +365,7 @@ static int p9_get_mapped_pages(struct virtio_chan *chan, | |||
369 | return -ENOMEM; | 365 | return -ENOMEM; |
370 | 366 | ||
371 | *need_drop = 0; | 367 | *need_drop = 0; |
372 | p -= (*offs = (unsigned long)p % PAGE_SIZE); | 368 | p -= (*offs = offset_in_page(p)); |
373 | for (index = 0; index < nr_pages; index++) { | 369 | for (index = 0; index < nr_pages; index++) { |
374 | if (is_vmalloc_addr(p)) | 370 | if (is_vmalloc_addr(p)) |
375 | (*pages)[index] = vmalloc_to_page(p); | 371 | (*pages)[index] = vmalloc_to_page(p); |
@@ -469,7 +465,7 @@ req_retry_pinned: | |||
469 | } | 465 | } |
470 | 466 | ||
471 | BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs)); | 467 | BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs)); |
472 | err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req->tc, | 468 | err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req, |
473 | GFP_ATOMIC); | 469 | GFP_ATOMIC); |
474 | if (err < 0) { | 470 | if (err < 0) { |
475 | if (err == -ENOSPC) { | 471 | if (err == -ENOSPC) { |
diff --git a/net/rxrpc/ar-key.c b/net/rxrpc/ar-key.c index da3cc09f683e..3f6571651d32 100644 --- a/net/rxrpc/ar-key.c +++ b/net/rxrpc/ar-key.c | |||
@@ -896,15 +896,9 @@ int rxrpc_request_key(struct rxrpc_sock *rx, char __user *optval, int optlen) | |||
896 | if (optlen <= 0 || optlen > PAGE_SIZE - 1) | 896 | if (optlen <= 0 || optlen > PAGE_SIZE - 1) |
897 | return -EINVAL; | 897 | return -EINVAL; |
898 | 898 | ||
899 | description = kmalloc(optlen + 1, GFP_KERNEL); | 899 | description = memdup_user_nul(optval, optlen); |
900 | if (!description) | 900 | if (IS_ERR(description)) |
901 | return -ENOMEM; | 901 | return PTR_ERR(description); |
902 | |||
903 | if (copy_from_user(description, optval, optlen)) { | ||
904 | kfree(description); | ||
905 | return -EFAULT; | ||
906 | } | ||
907 | description[optlen] = 0; | ||
908 | 902 | ||
909 | key = request_key(&key_type_rxrpc, description, NULL); | 903 | key = request_key(&key_type_rxrpc, description, NULL); |
910 | if (IS_ERR(key)) { | 904 | if (IS_ERR(key)) { |
@@ -933,15 +927,9 @@ int rxrpc_server_keyring(struct rxrpc_sock *rx, char __user *optval, | |||
933 | if (optlen <= 0 || optlen > PAGE_SIZE - 1) | 927 | if (optlen <= 0 || optlen > PAGE_SIZE - 1) |
934 | return -EINVAL; | 928 | return -EINVAL; |
935 | 929 | ||
936 | description = kmalloc(optlen + 1, GFP_KERNEL); | 930 | description = memdup_user_nul(optval, optlen); |
937 | if (!description) | 931 | if (IS_ERR(description)) |
938 | return -ENOMEM; | 932 | return PTR_ERR(description); |
939 | |||
940 | if (copy_from_user(description, optval, optlen)) { | ||
941 | kfree(description); | ||
942 | return -EFAULT; | ||
943 | } | ||
944 | description[optlen] = 0; | ||
945 | 933 | ||
946 | key = request_key(&key_type_keyring, description, NULL); | 934 | key = request_key(&key_type_keyring, description, NULL); |
947 | if (IS_ERR(key)) { | 935 | if (IS_ERR(key)) { |
diff --git a/security/integrity/iint.c b/security/integrity/iint.c index 3d2f5b45c8cb..c2e3ccd4b510 100644 --- a/security/integrity/iint.c +++ b/security/integrity/iint.c | |||
@@ -234,12 +234,13 @@ int __init integrity_read_file(const char *path, char **data) | |||
234 | } | 234 | } |
235 | 235 | ||
236 | rc = integrity_kernel_read(file, 0, buf, size); | 236 | rc = integrity_kernel_read(file, 0, buf, size); |
237 | if (rc < 0) | 237 | if (rc == size) { |
238 | kfree(buf); | ||
239 | else if (rc != size) | ||
240 | rc = -EIO; | ||
241 | else | ||
242 | *data = buf; | 238 | *data = buf; |
239 | } else { | ||
240 | kfree(buf); | ||
241 | if (rc >= 0) | ||
242 | rc = -EIO; | ||
243 | } | ||
243 | out: | 244 | out: |
244 | fput(file); | 245 | fput(file); |
245 | return rc; | 246 | return rc; |
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index c02da25d7b63..73c60baa90a4 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c | |||
@@ -147,23 +147,16 @@ static ssize_t sel_write_enforce(struct file *file, const char __user *buf, | |||
147 | ssize_t length; | 147 | ssize_t length; |
148 | int new_value; | 148 | int new_value; |
149 | 149 | ||
150 | length = -ENOMEM; | ||
151 | if (count >= PAGE_SIZE) | 150 | if (count >= PAGE_SIZE) |
152 | goto out; | 151 | return -ENOMEM; |
153 | 152 | ||
154 | /* No partial writes. */ | 153 | /* No partial writes. */ |
155 | length = -EINVAL; | ||
156 | if (*ppos != 0) | 154 | if (*ppos != 0) |
157 | goto out; | 155 | return -EINVAL; |
158 | |||
159 | length = -ENOMEM; | ||
160 | page = (char *)get_zeroed_page(GFP_KERNEL); | ||
161 | if (!page) | ||
162 | goto out; | ||
163 | 156 | ||
164 | length = -EFAULT; | 157 | page = memdup_user_nul(buf, count); |
165 | if (copy_from_user(page, buf, count)) | 158 | if (IS_ERR(page)) |
166 | goto out; | 159 | return PTR_ERR(page); |
167 | 160 | ||
168 | length = -EINVAL; | 161 | length = -EINVAL; |
169 | if (sscanf(page, "%d", &new_value) != 1) | 162 | if (sscanf(page, "%d", &new_value) != 1) |
@@ -186,7 +179,7 @@ static ssize_t sel_write_enforce(struct file *file, const char __user *buf, | |||
186 | } | 179 | } |
187 | length = count; | 180 | length = count; |
188 | out: | 181 | out: |
189 | free_page((unsigned long) page); | 182 | kfree(page); |
190 | return length; | 183 | return length; |
191 | } | 184 | } |
192 | #else | 185 | #else |
@@ -275,27 +268,20 @@ static ssize_t sel_write_disable(struct file *file, const char __user *buf, | |||
275 | size_t count, loff_t *ppos) | 268 | size_t count, loff_t *ppos) |
276 | 269 | ||
277 | { | 270 | { |
278 | char *page = NULL; | 271 | char *page; |
279 | ssize_t length; | 272 | ssize_t length; |
280 | int new_value; | 273 | int new_value; |
281 | 274 | ||
282 | length = -ENOMEM; | ||
283 | if (count >= PAGE_SIZE) | 275 | if (count >= PAGE_SIZE) |
284 | goto out; | 276 | return -ENOMEM; |
285 | 277 | ||
286 | /* No partial writes. */ | 278 | /* No partial writes. */ |
287 | length = -EINVAL; | ||
288 | if (*ppos != 0) | 279 | if (*ppos != 0) |
289 | goto out; | 280 | return -EINVAL; |
290 | |||
291 | length = -ENOMEM; | ||
292 | page = (char *)get_zeroed_page(GFP_KERNEL); | ||
293 | if (!page) | ||
294 | goto out; | ||
295 | 281 | ||
296 | length = -EFAULT; | 282 | page = memdup_user_nul(buf, count); |
297 | if (copy_from_user(page, buf, count)) | 283 | if (IS_ERR(page)) |
298 | goto out; | 284 | return PTR_ERR(page); |
299 | 285 | ||
300 | length = -EINVAL; | 286 | length = -EINVAL; |
301 | if (sscanf(page, "%d", &new_value) != 1) | 287 | if (sscanf(page, "%d", &new_value) != 1) |
@@ -313,7 +299,7 @@ static ssize_t sel_write_disable(struct file *file, const char __user *buf, | |||
313 | 299 | ||
314 | length = count; | 300 | length = count; |
315 | out: | 301 | out: |
316 | free_page((unsigned long) page); | 302 | kfree(page); |
317 | return length; | 303 | return length; |
318 | } | 304 | } |
319 | #else | 305 | #else |
@@ -611,31 +597,24 @@ static ssize_t sel_read_checkreqprot(struct file *filp, char __user *buf, | |||
611 | static ssize_t sel_write_checkreqprot(struct file *file, const char __user *buf, | 597 | static ssize_t sel_write_checkreqprot(struct file *file, const char __user *buf, |
612 | size_t count, loff_t *ppos) | 598 | size_t count, loff_t *ppos) |
613 | { | 599 | { |
614 | char *page = NULL; | 600 | char *page; |
615 | ssize_t length; | 601 | ssize_t length; |
616 | unsigned int new_value; | 602 | unsigned int new_value; |
617 | 603 | ||
618 | length = task_has_security(current, SECURITY__SETCHECKREQPROT); | 604 | length = task_has_security(current, SECURITY__SETCHECKREQPROT); |
619 | if (length) | 605 | if (length) |
620 | goto out; | 606 | return length; |
621 | 607 | ||
622 | length = -ENOMEM; | ||
623 | if (count >= PAGE_SIZE) | 608 | if (count >= PAGE_SIZE) |
624 | goto out; | 609 | return -ENOMEM; |
625 | 610 | ||
626 | /* No partial writes. */ | 611 | /* No partial writes. */ |
627 | length = -EINVAL; | ||
628 | if (*ppos != 0) | 612 | if (*ppos != 0) |
629 | goto out; | 613 | return -EINVAL; |
630 | |||
631 | length = -ENOMEM; | ||
632 | page = (char *)get_zeroed_page(GFP_KERNEL); | ||
633 | if (!page) | ||
634 | goto out; | ||
635 | 614 | ||
636 | length = -EFAULT; | 615 | page = memdup_user_nul(buf, count); |
637 | if (copy_from_user(page, buf, count)) | 616 | if (IS_ERR(page)) |
638 | goto out; | 617 | return PTR_ERR(page); |
639 | 618 | ||
640 | length = -EINVAL; | 619 | length = -EINVAL; |
641 | if (sscanf(page, "%u", &new_value) != 1) | 620 | if (sscanf(page, "%u", &new_value) != 1) |
@@ -644,7 +623,7 @@ static ssize_t sel_write_checkreqprot(struct file *file, const char __user *buf, | |||
644 | selinux_checkreqprot = new_value ? 1 : 0; | 623 | selinux_checkreqprot = new_value ? 1 : 0; |
645 | length = count; | 624 | length = count; |
646 | out: | 625 | out: |
647 | free_page((unsigned long) page); | 626 | kfree(page); |
648 | return length; | 627 | return length; |
649 | } | 628 | } |
650 | static const struct file_operations sel_checkreqprot_ops = { | 629 | static const struct file_operations sel_checkreqprot_ops = { |
@@ -1100,14 +1079,12 @@ static ssize_t sel_write_bool(struct file *filep, const char __user *buf, | |||
1100 | if (*ppos != 0) | 1079 | if (*ppos != 0) |
1101 | goto out; | 1080 | goto out; |
1102 | 1081 | ||
1103 | length = -ENOMEM; | 1082 | page = memdup_user_nul(buf, count); |
1104 | page = (char *)get_zeroed_page(GFP_KERNEL); | 1083 | if (IS_ERR(page)) { |
1105 | if (!page) | 1084 | length = PTR_ERR(page); |
1106 | goto out; | 1085 | page = NULL; |
1107 | |||
1108 | length = -EFAULT; | ||
1109 | if (copy_from_user(page, buf, count)) | ||
1110 | goto out; | 1086 | goto out; |
1087 | } | ||
1111 | 1088 | ||
1112 | length = -EINVAL; | 1089 | length = -EINVAL; |
1113 | if (sscanf(page, "%d", &new_value) != 1) | 1090 | if (sscanf(page, "%d", &new_value) != 1) |
@@ -1121,7 +1098,7 @@ static ssize_t sel_write_bool(struct file *filep, const char __user *buf, | |||
1121 | 1098 | ||
1122 | out: | 1099 | out: |
1123 | mutex_unlock(&sel_mutex); | 1100 | mutex_unlock(&sel_mutex); |
1124 | free_page((unsigned long) page); | 1101 | kfree(page); |
1125 | return length; | 1102 | return length; |
1126 | } | 1103 | } |
1127 | 1104 | ||
@@ -1154,14 +1131,12 @@ static ssize_t sel_commit_bools_write(struct file *filep, | |||
1154 | if (*ppos != 0) | 1131 | if (*ppos != 0) |
1155 | goto out; | 1132 | goto out; |
1156 | 1133 | ||
1157 | length = -ENOMEM; | 1134 | page = memdup_user_nul(buf, count); |
1158 | page = (char *)get_zeroed_page(GFP_KERNEL); | 1135 | if (IS_ERR(page)) { |
1159 | if (!page) | 1136 | length = PTR_ERR(page); |
1160 | goto out; | 1137 | page = NULL; |
1161 | |||
1162 | length = -EFAULT; | ||
1163 | if (copy_from_user(page, buf, count)) | ||
1164 | goto out; | 1138 | goto out; |
1139 | } | ||
1165 | 1140 | ||
1166 | length = -EINVAL; | 1141 | length = -EINVAL; |
1167 | if (sscanf(page, "%d", &new_value) != 1) | 1142 | if (sscanf(page, "%d", &new_value) != 1) |
@@ -1176,7 +1151,7 @@ static ssize_t sel_commit_bools_write(struct file *filep, | |||
1176 | 1151 | ||
1177 | out: | 1152 | out: |
1178 | mutex_unlock(&sel_mutex); | 1153 | mutex_unlock(&sel_mutex); |
1179 | free_page((unsigned long) page); | 1154 | kfree(page); |
1180 | return length; | 1155 | return length; |
1181 | } | 1156 | } |
1182 | 1157 | ||
@@ -1292,31 +1267,24 @@ static ssize_t sel_write_avc_cache_threshold(struct file *file, | |||
1292 | size_t count, loff_t *ppos) | 1267 | size_t count, loff_t *ppos) |
1293 | 1268 | ||
1294 | { | 1269 | { |
1295 | char *page = NULL; | 1270 | char *page; |
1296 | ssize_t ret; | 1271 | ssize_t ret; |
1297 | int new_value; | 1272 | int new_value; |
1298 | 1273 | ||
1299 | ret = task_has_security(current, SECURITY__SETSECPARAM); | 1274 | ret = task_has_security(current, SECURITY__SETSECPARAM); |
1300 | if (ret) | 1275 | if (ret) |
1301 | goto out; | 1276 | return ret; |
1302 | 1277 | ||
1303 | ret = -ENOMEM; | ||
1304 | if (count >= PAGE_SIZE) | 1278 | if (count >= PAGE_SIZE) |
1305 | goto out; | 1279 | return -ENOMEM; |
1306 | 1280 | ||
1307 | /* No partial writes. */ | 1281 | /* No partial writes. */ |
1308 | ret = -EINVAL; | ||
1309 | if (*ppos != 0) | 1282 | if (*ppos != 0) |
1310 | goto out; | 1283 | return -EINVAL; |
1311 | |||
1312 | ret = -ENOMEM; | ||
1313 | page = (char *)get_zeroed_page(GFP_KERNEL); | ||
1314 | if (!page) | ||
1315 | goto out; | ||
1316 | 1284 | ||
1317 | ret = -EFAULT; | 1285 | page = memdup_user_nul(buf, count); |
1318 | if (copy_from_user(page, buf, count)) | 1286 | if (IS_ERR(page)) |
1319 | goto out; | 1287 | return PTR_ERR(page); |
1320 | 1288 | ||
1321 | ret = -EINVAL; | 1289 | ret = -EINVAL; |
1322 | if (sscanf(page, "%u", &new_value) != 1) | 1290 | if (sscanf(page, "%u", &new_value) != 1) |
@@ -1326,7 +1294,7 @@ static ssize_t sel_write_avc_cache_threshold(struct file *file, | |||
1326 | 1294 | ||
1327 | ret = count; | 1295 | ret = count; |
1328 | out: | 1296 | out: |
1329 | free_page((unsigned long)page); | 1297 | kfree(page); |
1330 | return ret; | 1298 | return ret; |
1331 | } | 1299 | } |
1332 | 1300 | ||
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index 94bd9e41c9ec..e249a66db533 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c | |||
@@ -497,14 +497,9 @@ static ssize_t smk_write_rules_list(struct file *file, const char __user *buf, | |||
497 | } | 497 | } |
498 | } | 498 | } |
499 | 499 | ||
500 | data = kmalloc(count + 1, GFP_KERNEL); | 500 | data = memdup_user_nul(buf, count); |
501 | if (data == NULL) | 501 | if (IS_ERR(data)) |
502 | return -ENOMEM; | 502 | return PTR_ERR(data); |
503 | |||
504 | if (copy_from_user(data, buf, count) != 0) { | ||
505 | rc = -EFAULT; | ||
506 | goto out; | ||
507 | } | ||
508 | 503 | ||
509 | /* | 504 | /* |
510 | * In case of parsing only part of user buf, | 505 | * In case of parsing only part of user buf, |
@@ -884,16 +879,10 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf, | |||
884 | (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX)) | 879 | (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX)) |
885 | return -EINVAL; | 880 | return -EINVAL; |
886 | 881 | ||
887 | data = kzalloc(count + 1, GFP_KERNEL); | 882 | data = memdup_user_nul(buf, count); |
888 | if (data == NULL) | 883 | if (IS_ERR(data)) |
889 | return -ENOMEM; | 884 | return PTR_ERR(data); |
890 | |||
891 | if (copy_from_user(data, buf, count) != 0) { | ||
892 | rc = -EFAULT; | ||
893 | goto unlockedout; | ||
894 | } | ||
895 | 885 | ||
896 | data[count] = '\0'; | ||
897 | rule = data; | 886 | rule = data; |
898 | /* | 887 | /* |
899 | * Only allow one writer at a time. Writes should be | 888 | * Only allow one writer at a time. Writes should be |
@@ -946,7 +935,6 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf, | |||
946 | 935 | ||
947 | out: | 936 | out: |
948 | mutex_unlock(&smack_cipso_lock); | 937 | mutex_unlock(&smack_cipso_lock); |
949 | unlockedout: | ||
950 | kfree(data); | 938 | kfree(data); |
951 | return rc; | 939 | return rc; |
952 | } | 940 | } |
@@ -1187,14 +1175,9 @@ static ssize_t smk_write_net4addr(struct file *file, const char __user *buf, | |||
1187 | if (count < SMK_NETLBLADDRMIN) | 1175 | if (count < SMK_NETLBLADDRMIN) |
1188 | return -EINVAL; | 1176 | return -EINVAL; |
1189 | 1177 | ||
1190 | data = kzalloc(count + 1, GFP_KERNEL); | 1178 | data = memdup_user_nul(buf, count); |
1191 | if (data == NULL) | 1179 | if (IS_ERR(data)) |
1192 | return -ENOMEM; | 1180 | return PTR_ERR(data); |
1193 | |||
1194 | if (copy_from_user(data, buf, count) != 0) { | ||
1195 | rc = -EFAULT; | ||
1196 | goto free_data_out; | ||
1197 | } | ||
1198 | 1181 | ||
1199 | smack = kzalloc(count + 1, GFP_KERNEL); | 1182 | smack = kzalloc(count + 1, GFP_KERNEL); |
1200 | if (smack == NULL) { | 1183 | if (smack == NULL) { |
@@ -1202,8 +1185,6 @@ static ssize_t smk_write_net4addr(struct file *file, const char __user *buf, | |||
1202 | goto free_data_out; | 1185 | goto free_data_out; |
1203 | } | 1186 | } |
1204 | 1187 | ||
1205 | data[count] = '\0'; | ||
1206 | |||
1207 | rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%u %s", | 1188 | rc = sscanf(data, "%hhd.%hhd.%hhd.%hhd/%u %s", |
1208 | &host[0], &host[1], &host[2], &host[3], &masks, smack); | 1189 | &host[0], &host[1], &host[2], &host[3], &masks, smack); |
1209 | if (rc != 6) { | 1190 | if (rc != 6) { |
@@ -1454,14 +1435,9 @@ static ssize_t smk_write_net6addr(struct file *file, const char __user *buf, | |||
1454 | if (count < SMK_NETLBLADDRMIN) | 1435 | if (count < SMK_NETLBLADDRMIN) |
1455 | return -EINVAL; | 1436 | return -EINVAL; |
1456 | 1437 | ||
1457 | data = kzalloc(count + 1, GFP_KERNEL); | 1438 | data = memdup_user_nul(buf, count); |
1458 | if (data == NULL) | 1439 | if (IS_ERR(data)) |
1459 | return -ENOMEM; | 1440 | return PTR_ERR(data); |
1460 | |||
1461 | if (copy_from_user(data, buf, count) != 0) { | ||
1462 | rc = -EFAULT; | ||
1463 | goto free_data_out; | ||
1464 | } | ||
1465 | 1441 | ||
1466 | smack = kzalloc(count + 1, GFP_KERNEL); | 1442 | smack = kzalloc(count + 1, GFP_KERNEL); |
1467 | if (smack == NULL) { | 1443 | if (smack == NULL) { |
@@ -1469,8 +1445,6 @@ static ssize_t smk_write_net6addr(struct file *file, const char __user *buf, | |||
1469 | goto free_data_out; | 1445 | goto free_data_out; |
1470 | } | 1446 | } |
1471 | 1447 | ||
1472 | data[count] = '\0'; | ||
1473 | |||
1474 | i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x/%u %s", | 1448 | i = sscanf(data, "%x:%x:%x:%x:%x:%x:%x:%x/%u %s", |
1475 | &scanned[0], &scanned[1], &scanned[2], &scanned[3], | 1449 | &scanned[0], &scanned[1], &scanned[2], &scanned[3], |
1476 | &scanned[4], &scanned[5], &scanned[6], &scanned[7], | 1450 | &scanned[4], &scanned[5], &scanned[6], &scanned[7], |
@@ -1865,14 +1839,9 @@ static ssize_t smk_write_ambient(struct file *file, const char __user *buf, | |||
1865 | if (!smack_privileged(CAP_MAC_ADMIN)) | 1839 | if (!smack_privileged(CAP_MAC_ADMIN)) |
1866 | return -EPERM; | 1840 | return -EPERM; |
1867 | 1841 | ||
1868 | data = kzalloc(count + 1, GFP_KERNEL); | 1842 | data = memdup_user_nul(buf, count); |
1869 | if (data == NULL) | 1843 | if (IS_ERR(data)) |
1870 | return -ENOMEM; | 1844 | return PTR_ERR(data); |
1871 | |||
1872 | if (copy_from_user(data, buf, count) != 0) { | ||
1873 | rc = -EFAULT; | ||
1874 | goto out; | ||
1875 | } | ||
1876 | 1845 | ||
1877 | skp = smk_import_entry(data, count); | 1846 | skp = smk_import_entry(data, count); |
1878 | if (IS_ERR(skp)) { | 1847 | if (IS_ERR(skp)) { |
@@ -2041,14 +2010,9 @@ static ssize_t smk_write_onlycap(struct file *file, const char __user *buf, | |||
2041 | if (!smack_privileged(CAP_MAC_ADMIN)) | 2010 | if (!smack_privileged(CAP_MAC_ADMIN)) |
2042 | return -EPERM; | 2011 | return -EPERM; |
2043 | 2012 | ||
2044 | data = kzalloc(count + 1, GFP_KERNEL); | 2013 | data = memdup_user_nul(buf, count); |
2045 | if (data == NULL) | 2014 | if (IS_ERR(data)) |
2046 | return -ENOMEM; | 2015 | return PTR_ERR(data); |
2047 | |||
2048 | if (copy_from_user(data, buf, count) != 0) { | ||
2049 | kfree(data); | ||
2050 | return -EFAULT; | ||
2051 | } | ||
2052 | 2016 | ||
2053 | rc = smk_parse_label_list(data, &list_tmp); | 2017 | rc = smk_parse_label_list(data, &list_tmp); |
2054 | kfree(data); | 2018 | kfree(data); |
@@ -2133,14 +2097,9 @@ static ssize_t smk_write_unconfined(struct file *file, const char __user *buf, | |||
2133 | if (!smack_privileged(CAP_MAC_ADMIN)) | 2097 | if (!smack_privileged(CAP_MAC_ADMIN)) |
2134 | return -EPERM; | 2098 | return -EPERM; |
2135 | 2099 | ||
2136 | data = kzalloc(count + 1, GFP_KERNEL); | 2100 | data = memdup_user_nul(buf, count); |
2137 | if (data == NULL) | 2101 | if (IS_ERR(data)) |
2138 | return -ENOMEM; | 2102 | return PTR_ERR(data); |
2139 | |||
2140 | if (copy_from_user(data, buf, count) != 0) { | ||
2141 | rc = -EFAULT; | ||
2142 | goto freeout; | ||
2143 | } | ||
2144 | 2103 | ||
2145 | /* | 2104 | /* |
2146 | * Clear the smack_unconfined on invalid label errors. This means | 2105 | * Clear the smack_unconfined on invalid label errors. This means |
@@ -2696,19 +2655,15 @@ static ssize_t smk_write_syslog(struct file *file, const char __user *buf, | |||
2696 | if (!smack_privileged(CAP_MAC_ADMIN)) | 2655 | if (!smack_privileged(CAP_MAC_ADMIN)) |
2697 | return -EPERM; | 2656 | return -EPERM; |
2698 | 2657 | ||
2699 | data = kzalloc(count + 1, GFP_KERNEL); | 2658 | data = memdup_user_nul(buf, count); |
2700 | if (data == NULL) | 2659 | if (IS_ERR(data)) |
2701 | return -ENOMEM; | 2660 | return PTR_ERR(data); |
2702 | 2661 | ||
2703 | if (copy_from_user(data, buf, count) != 0) | 2662 | skp = smk_import_entry(data, count); |
2704 | rc = -EFAULT; | 2663 | if (IS_ERR(skp)) |
2705 | else { | 2664 | rc = PTR_ERR(skp); |
2706 | skp = smk_import_entry(data, count); | 2665 | else |
2707 | if (IS_ERR(skp)) | 2666 | smack_syslog_label = skp; |
2708 | rc = PTR_ERR(skp); | ||
2709 | else | ||
2710 | smack_syslog_label = skp; | ||
2711 | } | ||
2712 | 2667 | ||
2713 | kfree(data); | 2668 | kfree(data); |
2714 | return rc; | 2669 | return rc; |
@@ -2798,14 +2753,9 @@ static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf, | |||
2798 | if (*ppos != 0) | 2753 | if (*ppos != 0) |
2799 | return -EINVAL; | 2754 | return -EINVAL; |
2800 | 2755 | ||
2801 | data = kzalloc(count + 1, GFP_KERNEL); | 2756 | data = memdup_user_nul(buf, count); |
2802 | if (data == NULL) | 2757 | if (IS_ERR(data)) |
2803 | return -ENOMEM; | 2758 | return PTR_ERR(data); |
2804 | |||
2805 | if (copy_from_user(data, buf, count) != 0) { | ||
2806 | kfree(data); | ||
2807 | return -EFAULT; | ||
2808 | } | ||
2809 | 2759 | ||
2810 | rc = smk_parse_label_list(data, &list_tmp); | 2760 | rc = smk_parse_label_list(data, &list_tmp); |
2811 | kfree(data); | 2761 | kfree(data); |
diff --git a/security/tomoyo/securityfs_if.c b/security/tomoyo/securityfs_if.c index 179a955b319d..06ab41b1ff28 100644 --- a/security/tomoyo/securityfs_if.c +++ b/security/tomoyo/securityfs_if.c | |||
@@ -43,13 +43,9 @@ static ssize_t tomoyo_write_self(struct file *file, const char __user *buf, | |||
43 | int error; | 43 | int error; |
44 | if (!count || count >= TOMOYO_EXEC_TMPSIZE - 10) | 44 | if (!count || count >= TOMOYO_EXEC_TMPSIZE - 10) |
45 | return -ENOMEM; | 45 | return -ENOMEM; |
46 | data = kzalloc(count + 1, GFP_NOFS); | 46 | data = memdup_user_nul(buf, count); |
47 | if (!data) | 47 | if (IS_ERR(data)) |
48 | return -ENOMEM; | 48 | return PTR_ERR(data); |
49 | if (copy_from_user(data, buf, count)) { | ||
50 | error = -EFAULT; | ||
51 | goto out; | ||
52 | } | ||
53 | tomoyo_normalize_line(data); | 49 | tomoyo_normalize_line(data); |
54 | if (tomoyo_correct_domain(data)) { | 50 | if (tomoyo_correct_domain(data)) { |
55 | const int idx = tomoyo_read_lock(); | 51 | const int idx = tomoyo_read_lock(); |
@@ -87,7 +83,6 @@ static ssize_t tomoyo_write_self(struct file *file, const char __user *buf, | |||
87 | tomoyo_read_unlock(idx); | 83 | tomoyo_read_unlock(idx); |
88 | } else | 84 | } else |
89 | error = -EINVAL; | 85 | error = -EINVAL; |
90 | out: | ||
91 | kfree(data); | 86 | kfree(data); |
92 | return error ? error : count; | 87 | return error ? error : count; |
93 | } | 88 | } |