diff options
57 files changed, 534 insertions, 329 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 76efe5b71d7d..3120f8dd2c31 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -512,16 +512,24 @@ locking rules: | |||
512 | BKL mmap_sem PageLocked(page) | 512 | BKL mmap_sem PageLocked(page) |
513 | open: no yes | 513 | open: no yes |
514 | close: no yes | 514 | close: no yes |
515 | fault: no yes | 515 | fault: no yes can return with page locked |
516 | page_mkwrite: no yes no | 516 | page_mkwrite: no yes can return with page locked |
517 | access: no yes | 517 | access: no yes |
518 | 518 | ||
519 | ->page_mkwrite() is called when a previously read-only page is | 519 | ->fault() is called when a previously not present pte is about |
520 | about to become writeable. The file system is responsible for | 520 | to be faulted in. The filesystem must find and return the page associated |
521 | protecting against truncate races. Once appropriate action has been | 521 | with the passed in "pgoff" in the vm_fault structure. If it is possible that |
522 | taking to lock out truncate, the page range should be verified to be | 522 | the page may be truncated and/or invalidated, then the filesystem must lock |
523 | within i_size. The page mapping should also be checked that it is not | 523 | the page, then ensure it is not already truncated (the page lock will block |
524 | NULL. | 524 | subsequent truncate), and then return with VM_FAULT_LOCKED, and the page |
525 | locked. The VM will unlock the page. | ||
526 | |||
527 | ->page_mkwrite() is called when a previously read-only pte is | ||
528 | about to become writeable. The filesystem again must ensure that there are | ||
529 | no truncate/invalidate races, and then return with the page locked. If | ||
530 | the page has been truncated, the filesystem should not look up a new page | ||
531 | like the ->fault() handler, but simply return with VM_FAULT_NOPAGE, which | ||
532 | will cause the VM to retry the fault. | ||
525 | 533 | ||
526 | ->access() is called when get_user_pages() fails in | 534 | ->access() is called when get_user_pages() fails in |
527 | acces_process_vm(), typically used to debug a process through | 535 | acces_process_vm(), typically used to debug a process through |
diff --git a/Documentation/kernel-doc-nano-HOWTO.txt b/Documentation/kernel-doc-nano-HOWTO.txt index 026ec7d57384..4d04572b6549 100644 --- a/Documentation/kernel-doc-nano-HOWTO.txt +++ b/Documentation/kernel-doc-nano-HOWTO.txt | |||
@@ -269,7 +269,10 @@ Use the argument mechanism to document members or constants. | |||
269 | 269 | ||
270 | Inside a struct description, you can use the "private:" and "public:" | 270 | Inside a struct description, you can use the "private:" and "public:" |
271 | comment tags. Structure fields that are inside a "private:" area | 271 | comment tags. Structure fields that are inside a "private:" area |
272 | are not listed in the generated output documentation. | 272 | are not listed in the generated output documentation. The "private:" |
273 | and "public:" tags must begin immediately following a "/*" comment | ||
274 | marker. They may optionally include comments between the ":" and the | ||
275 | ending "*/" marker. | ||
273 | 276 | ||
274 | Example: | 277 | Example: |
275 | 278 | ||
@@ -283,7 +286,7 @@ Example: | |||
283 | struct my_struct { | 286 | struct my_struct { |
284 | int a; | 287 | int a; |
285 | int b; | 288 | int b; |
286 | /* private: */ | 289 | /* private: internal use only */ |
287 | int c; | 290 | int c; |
288 | }; | 291 | }; |
289 | 292 | ||
diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index 97c4b3284329..b716d33912d8 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt | |||
@@ -90,6 +90,10 @@ will itself start writeback. | |||
90 | If dirty_bytes is written, dirty_ratio becomes a function of its value | 90 | If dirty_bytes is written, dirty_ratio becomes a function of its value |
91 | (dirty_bytes / the amount of dirtyable system memory). | 91 | (dirty_bytes / the amount of dirtyable system memory). |
92 | 92 | ||
93 | Note: the minimum value allowed for dirty_bytes is two pages (in bytes); any | ||
94 | value lower than this limit will be ignored and the old configuration will be | ||
95 | retained. | ||
96 | |||
93 | ============================================================== | 97 | ============================================================== |
94 | 98 | ||
95 | dirty_expire_centisecs | 99 | dirty_expire_centisecs |
diff --git a/MAINTAINERS b/MAINTAINERS index c547f4a2bb62..9de961bd1214 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -4189,7 +4189,7 @@ P: Joel Becker | |||
4189 | M: joel.becker@oracle.com | 4189 | M: joel.becker@oracle.com |
4190 | L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers) | 4190 | L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers) |
4191 | W: http://oss.oracle.com/projects/ocfs2/ | 4191 | W: http://oss.oracle.com/projects/ocfs2/ |
4192 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2.git | 4192 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2.git |
4193 | S: Supported | 4193 | S: Supported |
4194 | F: Documentation/filesystems/ocfs2.txt | 4194 | F: Documentation/filesystems/ocfs2.txt |
4195 | F: Documentation/filesystems/dlmfs.txt | 4195 | F: Documentation/filesystems/dlmfs.txt |
@@ -4521,6 +4521,19 @@ M: jim@jtan.com | |||
4521 | L: cbe-oss-dev@ozlabs.org | 4521 | L: cbe-oss-dev@ozlabs.org |
4522 | S: Maintained | 4522 | S: Maintained |
4523 | 4523 | ||
4524 | PTRACE SUPPORT | ||
4525 | P: Roland McGrath | ||
4526 | M: roland@redhat.com | ||
4527 | P: Oleg Nesterov | ||
4528 | M: oleg@redhat.com | ||
4529 | L: linux-kernel@vger.kernel.org | ||
4530 | S: Maintained | ||
4531 | F: include/asm-generic/syscall.h | ||
4532 | F: include/linux/ptrace.h | ||
4533 | F: include/linux/regset.h | ||
4534 | F: include/linux/tracehook.h | ||
4535 | F: kernel/ptrace.c | ||
4536 | |||
4524 | PVRUSB2 VIDEO4LINUX DRIVER | 4537 | PVRUSB2 VIDEO4LINUX DRIVER |
4525 | P: Mike Isely | 4538 | P: Mike Isely |
4526 | M: isely@pobox.com | 4539 | M: isely@pobox.com |
@@ -4666,13 +4679,13 @@ F: kernel/rcutorture.c | |||
4666 | 4679 | ||
4667 | RDC R-321X SoC | 4680 | RDC R-321X SoC |
4668 | P: Florian Fainelli | 4681 | P: Florian Fainelli |
4669 | M: florian.fainelli@telecomint.eu | 4682 | M: florian@openwrt.org |
4670 | L: linux-kernel@vger.kernel.org | 4683 | L: linux-kernel@vger.kernel.org |
4671 | S: Maintained | 4684 | S: Maintained |
4672 | 4685 | ||
4673 | RDC R6040 FAST ETHERNET DRIVER | 4686 | RDC R6040 FAST ETHERNET DRIVER |
4674 | P: Florian Fainelli | 4687 | P: Florian Fainelli |
4675 | M: florian.fainelli@telecomint.eu | 4688 | M: florian@openwrt.org |
4676 | L: netdev@vger.kernel.org | 4689 | L: netdev@vger.kernel.org |
4677 | S: Maintained | 4690 | S: Maintained |
4678 | F: drivers/net/r6040.c | 4691 | F: drivers/net/r6040.c |
diff --git a/arch/alpha/include/asm/barrier.h b/arch/alpha/include/asm/barrier.h index ac78eba909bc..ce8860a0b32d 100644 --- a/arch/alpha/include/asm/barrier.h +++ b/arch/alpha/include/asm/barrier.h | |||
@@ -16,11 +16,13 @@ __asm__ __volatile__("wmb": : :"memory") | |||
16 | __asm__ __volatile__("mb": : :"memory") | 16 | __asm__ __volatile__("mb": : :"memory") |
17 | 17 | ||
18 | #ifdef CONFIG_SMP | 18 | #ifdef CONFIG_SMP |
19 | #define __ASM_SMP_MB "\tmb\n" | ||
19 | #define smp_mb() mb() | 20 | #define smp_mb() mb() |
20 | #define smp_rmb() rmb() | 21 | #define smp_rmb() rmb() |
21 | #define smp_wmb() wmb() | 22 | #define smp_wmb() wmb() |
22 | #define smp_read_barrier_depends() read_barrier_depends() | 23 | #define smp_read_barrier_depends() read_barrier_depends() |
23 | #else | 24 | #else |
25 | #define __ASM_SMP_MB | ||
24 | #define smp_mb() barrier() | 26 | #define smp_mb() barrier() |
25 | #define smp_rmb() barrier() | 27 | #define smp_rmb() barrier() |
26 | #define smp_wmb() barrier() | 28 | #define smp_wmb() barrier() |
diff --git a/arch/alpha/include/asm/futex.h b/arch/alpha/include/asm/futex.h index 6a332a9f099c..945de222ab91 100644 --- a/arch/alpha/include/asm/futex.h +++ b/arch/alpha/include/asm/futex.h | |||
@@ -1,6 +1,116 @@ | |||
1 | #ifndef _ASM_FUTEX_H | 1 | #ifndef _ASM_ALPHA_FUTEX_H |
2 | #define _ASM_FUTEX_H | 2 | #define _ASM_ALPHA_FUTEX_H |
3 | 3 | ||
4 | #include <asm-generic/futex.h> | 4 | #ifdef __KERNEL__ |
5 | 5 | ||
6 | #endif | 6 | #include <linux/futex.h> |
7 | #include <linux/uaccess.h> | ||
8 | #include <asm/errno.h> | ||
9 | #include <asm/barrier.h> | ||
10 | |||
11 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | ||
12 | __asm__ __volatile__( \ | ||
13 | __ASM_SMP_MB \ | ||
14 | "1: ldl_l %0,0(%2)\n" \ | ||
15 | insn \ | ||
16 | "2: stl_c %1,0(%2)\n" \ | ||
17 | " beq %1,4f\n" \ | ||
18 | " mov $31,%1\n" \ | ||
19 | "3: .subsection 2\n" \ | ||
20 | "4: br 1b\n" \ | ||
21 | " .previous\n" \ | ||
22 | " .section __ex_table,\"a\"\n" \ | ||
23 | " .long 1b-.\n" \ | ||
24 | " lda $31,3b-1b(%1)\n" \ | ||
25 | " .long 2b-.\n" \ | ||
26 | " lda $31,3b-2b(%1)\n" \ | ||
27 | " .previous\n" \ | ||
28 | : "=&r" (oldval), "=&r"(ret) \ | ||
29 | : "r" (uaddr), "r"(oparg) \ | ||
30 | : "memory") | ||
31 | |||
32 | static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | ||
33 | { | ||
34 | int op = (encoded_op >> 28) & 7; | ||
35 | int cmp = (encoded_op >> 24) & 15; | ||
36 | int oparg = (encoded_op << 8) >> 20; | ||
37 | int cmparg = (encoded_op << 20) >> 20; | ||
38 | int oldval = 0, ret; | ||
39 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | ||
40 | oparg = 1 << oparg; | ||
41 | |||
42 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | ||
43 | return -EFAULT; | ||
44 | |||
45 | pagefault_disable(); | ||
46 | |||
47 | switch (op) { | ||
48 | case FUTEX_OP_SET: | ||
49 | __futex_atomic_op("mov %3,%1\n", ret, oldval, uaddr, oparg); | ||
50 | break; | ||
51 | case FUTEX_OP_ADD: | ||
52 | __futex_atomic_op("addl %0,%3,%1\n", ret, oldval, uaddr, oparg); | ||
53 | break; | ||
54 | case FUTEX_OP_OR: | ||
55 | __futex_atomic_op("or %0,%3,%1\n", ret, oldval, uaddr, oparg); | ||
56 | break; | ||
57 | case FUTEX_OP_ANDN: | ||
58 | __futex_atomic_op("andnot %0,%3,%1\n", ret, oldval, uaddr, oparg); | ||
59 | break; | ||
60 | case FUTEX_OP_XOR: | ||
61 | __futex_atomic_op("xor %0,%3,%1\n", ret, oldval, uaddr, oparg); | ||
62 | break; | ||
63 | default: | ||
64 | ret = -ENOSYS; | ||
65 | } | ||
66 | |||
67 | pagefault_enable(); | ||
68 | |||
69 | if (!ret) { | ||
70 | switch (cmp) { | ||
71 | case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; | ||
72 | case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; | ||
73 | case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; | ||
74 | case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; | ||
75 | case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; | ||
76 | case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; | ||
77 | default: ret = -ENOSYS; | ||
78 | } | ||
79 | } | ||
80 | return ret; | ||
81 | } | ||
82 | |||
83 | static inline int | ||
84 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | ||
85 | { | ||
86 | int prev, cmp; | ||
87 | |||
88 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | ||
89 | return -EFAULT; | ||
90 | |||
91 | __asm__ __volatile__ ( | ||
92 | __ASM_SMP_MB | ||
93 | "1: ldl_l %0,0(%2)\n" | ||
94 | " cmpeq %0,%3,%1\n" | ||
95 | " beq %1,3f\n" | ||
96 | " mov %4,%1\n" | ||
97 | "2: stl_c %1,0(%2)\n" | ||
98 | " beq %1,4f\n" | ||
99 | "3: .subsection 2\n" | ||
100 | "4: br 1b\n" | ||
101 | " .previous\n" | ||
102 | " .section __ex_table,\"a\"\n" | ||
103 | " .long 1b-.\n" | ||
104 | " lda $31,3b-1b(%0)\n" | ||
105 | " .long 2b-.\n" | ||
106 | " lda $31,3b-2b(%0)\n" | ||
107 | " .previous\n" | ||
108 | : "=&r"(prev), "=&r"(cmp) | ||
109 | : "r"(uaddr), "r"((long)oldval), "r"(newval) | ||
110 | : "memory"); | ||
111 | |||
112 | return prev; | ||
113 | } | ||
114 | |||
115 | #endif /* __KERNEL__ */ | ||
116 | #endif /* _ASM_ALPHA_FUTEX_H */ | ||
diff --git a/arch/alpha/include/asm/uaccess.h b/arch/alpha/include/asm/uaccess.h index 163f3053001c..b49ec2f8d6e3 100644 --- a/arch/alpha/include/asm/uaccess.h +++ b/arch/alpha/include/asm/uaccess.h | |||
@@ -507,5 +507,7 @@ struct exception_table_entry | |||
507 | (pc) + (_fixup)->fixup.bits.nextinsn; \ | 507 | (pc) + (_fixup)->fixup.bits.nextinsn; \ |
508 | }) | 508 | }) |
509 | 509 | ||
510 | #define ARCH_HAS_SORT_EXTABLE | ||
511 | #define ARCH_HAS_SEARCH_EXTABLE | ||
510 | 512 | ||
511 | #endif /* __ALPHA_UACCESS_H */ | 513 | #endif /* __ALPHA_UACCESS_H */ |
diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile index a427538252f8..7739a62440a7 100644 --- a/arch/alpha/kernel/Makefile +++ b/arch/alpha/kernel/Makefile | |||
@@ -8,7 +8,7 @@ EXTRA_CFLAGS := -Werror -Wno-sign-compare | |||
8 | 8 | ||
9 | obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ | 9 | obj-y := entry.o traps.o process.o init_task.o osf_sys.o irq.o \ |
10 | irq_alpha.o signal.o setup.o ptrace.o time.o \ | 10 | irq_alpha.o signal.o setup.o ptrace.o time.o \ |
11 | alpha_ksyms.o systbls.o err_common.o io.o binfmt_loader.o | 11 | alpha_ksyms.o systbls.o err_common.o io.o |
12 | 12 | ||
13 | obj-$(CONFIG_VGA_HOSE) += console.o | 13 | obj-$(CONFIG_VGA_HOSE) += console.o |
14 | obj-$(CONFIG_SMP) += smp.o | 14 | obj-$(CONFIG_SMP) += smp.o |
@@ -43,6 +43,10 @@ else | |||
43 | # Misc support | 43 | # Misc support |
44 | obj-$(CONFIG_ALPHA_SRM) += srmcons.o | 44 | obj-$(CONFIG_ALPHA_SRM) += srmcons.o |
45 | 45 | ||
46 | ifdef CONFIG_BINFMT_AOUT | ||
47 | obj-y += binfmt_loader.o | ||
48 | endif | ||
49 | |||
46 | # Core logic support | 50 | # Core logic support |
47 | obj-$(CONFIG_ALPHA_APECS) += core_apecs.o | 51 | obj-$(CONFIG_ALPHA_APECS) += core_apecs.o |
48 | obj-$(CONFIG_ALPHA_CIA) += core_cia.o | 52 | obj-$(CONFIG_ALPHA_CIA) += core_cia.o |
diff --git a/arch/alpha/kernel/binfmt_loader.c b/arch/alpha/kernel/binfmt_loader.c index 4a0af906b00a..3fcfad410130 100644 --- a/arch/alpha/kernel/binfmt_loader.c +++ b/arch/alpha/kernel/binfmt_loader.c | |||
@@ -46,6 +46,6 @@ static struct linux_binfmt loader_format = { | |||
46 | 46 | ||
47 | static int __init init_loader_binfmt(void) | 47 | static int __init init_loader_binfmt(void) |
48 | { | 48 | { |
49 | return register_binfmt(&loader_format); | 49 | return insert_binfmt(&loader_format); |
50 | } | 50 | } |
51 | arch_initcall(init_loader_binfmt); | 51 | arch_initcall(init_loader_binfmt); |
diff --git a/arch/alpha/kernel/err_ev6.c b/arch/alpha/kernel/err_ev6.c index 985e5c1681ac..8ca6345bf131 100644 --- a/arch/alpha/kernel/err_ev6.c +++ b/arch/alpha/kernel/err_ev6.c | |||
@@ -229,7 +229,7 @@ ev6_process_logout_frame(struct el_common *mchk_header, int print) | |||
229 | } | 229 | } |
230 | 230 | ||
231 | void | 231 | void |
232 | ev6_machine_check(u64 vector, u64 la_ptr) | 232 | ev6_machine_check(unsigned long vector, unsigned long la_ptr) |
233 | { | 233 | { |
234 | struct el_common *mchk_header = (struct el_common *)la_ptr; | 234 | struct el_common *mchk_header = (struct el_common *)la_ptr; |
235 | 235 | ||
diff --git a/arch/alpha/kernel/err_ev7.c b/arch/alpha/kernel/err_ev7.c index 73770c6ca013..d738a67112d4 100644 --- a/arch/alpha/kernel/err_ev7.c +++ b/arch/alpha/kernel/err_ev7.c | |||
@@ -117,7 +117,7 @@ ev7_collect_logout_frame_subpackets(struct el_subpacket *el_ptr, | |||
117 | } | 117 | } |
118 | 118 | ||
119 | void | 119 | void |
120 | ev7_machine_check(u64 vector, u64 la_ptr) | 120 | ev7_machine_check(unsigned long vector, unsigned long la_ptr) |
121 | { | 121 | { |
122 | struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr; | 122 | struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr; |
123 | char *saved_err_prefix = err_print_prefix; | 123 | char *saved_err_prefix = err_print_prefix; |
@@ -246,7 +246,7 @@ ev7_process_pal_subpacket(struct el_subpacket *header) | |||
246 | 246 | ||
247 | switch(header->type) { | 247 | switch(header->type) { |
248 | case EL_TYPE__PAL__LOGOUT_FRAME: | 248 | case EL_TYPE__PAL__LOGOUT_FRAME: |
249 | printk("%s*** MCHK occurred on LPID %ld (RBOX %llx)\n", | 249 | printk("%s*** MCHK occurred on LPID %lld (RBOX %llx)\n", |
250 | err_print_prefix, | 250 | err_print_prefix, |
251 | packet->by_type.logout.whami, | 251 | packet->by_type.logout.whami, |
252 | packet->by_type.logout.rbox_whami); | 252 | packet->by_type.logout.rbox_whami); |
diff --git a/arch/alpha/kernel/err_impl.h b/arch/alpha/kernel/err_impl.h index 3c12258158e6..0c010ca4611e 100644 --- a/arch/alpha/kernel/err_impl.h +++ b/arch/alpha/kernel/err_impl.h | |||
@@ -60,26 +60,26 @@ extern struct ev7_lf_subpackets * | |||
60 | ev7_collect_logout_frame_subpackets(struct el_subpacket *, | 60 | ev7_collect_logout_frame_subpackets(struct el_subpacket *, |
61 | struct ev7_lf_subpackets *); | 61 | struct ev7_lf_subpackets *); |
62 | extern void ev7_register_error_handlers(void); | 62 | extern void ev7_register_error_handlers(void); |
63 | extern void ev7_machine_check(u64, u64); | 63 | extern void ev7_machine_check(unsigned long, unsigned long); |
64 | 64 | ||
65 | /* | 65 | /* |
66 | * err_ev6.c | 66 | * err_ev6.c |
67 | */ | 67 | */ |
68 | extern void ev6_register_error_handlers(void); | 68 | extern void ev6_register_error_handlers(void); |
69 | extern int ev6_process_logout_frame(struct el_common *, int); | 69 | extern int ev6_process_logout_frame(struct el_common *, int); |
70 | extern void ev6_machine_check(u64, u64); | 70 | extern void ev6_machine_check(unsigned long, unsigned long); |
71 | 71 | ||
72 | /* | 72 | /* |
73 | * err_marvel.c | 73 | * err_marvel.c |
74 | */ | 74 | */ |
75 | extern void marvel_machine_check(u64, u64); | 75 | extern void marvel_machine_check(unsigned long, unsigned long); |
76 | extern void marvel_register_error_handlers(void); | 76 | extern void marvel_register_error_handlers(void); |
77 | 77 | ||
78 | /* | 78 | /* |
79 | * err_titan.c | 79 | * err_titan.c |
80 | */ | 80 | */ |
81 | extern int titan_process_logout_frame(struct el_common *, int); | 81 | extern int titan_process_logout_frame(struct el_common *, int); |
82 | extern void titan_machine_check(u64, u64); | 82 | extern void titan_machine_check(unsigned long, unsigned long); |
83 | extern void titan_register_error_handlers(void); | 83 | extern void titan_register_error_handlers(void); |
84 | extern int privateer_process_logout_frame(struct el_common *, int); | 84 | extern int privateer_process_logout_frame(struct el_common *, int); |
85 | extern void privateer_machine_check(u64, u64); | 85 | extern void privateer_machine_check(unsigned long, unsigned long); |
diff --git a/arch/alpha/kernel/err_marvel.c b/arch/alpha/kernel/err_marvel.c index 6bfd243efba3..52a79dfc13c6 100644 --- a/arch/alpha/kernel/err_marvel.c +++ b/arch/alpha/kernel/err_marvel.c | |||
@@ -1042,7 +1042,7 @@ marvel_process_logout_frame(struct ev7_lf_subpackets *lf_subpackets, int print) | |||
1042 | } | 1042 | } |
1043 | 1043 | ||
1044 | void | 1044 | void |
1045 | marvel_machine_check(u64 vector, u64 la_ptr) | 1045 | marvel_machine_check(unsigned long vector, unsigned long la_ptr) |
1046 | { | 1046 | { |
1047 | struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr; | 1047 | struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr; |
1048 | int (*process_frame)(struct ev7_lf_subpackets *, int) = NULL; | 1048 | int (*process_frame)(struct ev7_lf_subpackets *, int) = NULL; |
diff --git a/arch/alpha/kernel/err_titan.c b/arch/alpha/kernel/err_titan.c index c7e28a88d6e3..f7ed97ce0dfd 100644 --- a/arch/alpha/kernel/err_titan.c +++ b/arch/alpha/kernel/err_titan.c | |||
@@ -380,7 +380,7 @@ titan_process_logout_frame(struct el_common *mchk_header, int print) | |||
380 | } | 380 | } |
381 | 381 | ||
382 | void | 382 | void |
383 | titan_machine_check(u64 vector, u64 la_ptr) | 383 | titan_machine_check(unsigned long vector, unsigned long la_ptr) |
384 | { | 384 | { |
385 | struct el_common *mchk_header = (struct el_common *)la_ptr; | 385 | struct el_common *mchk_header = (struct el_common *)la_ptr; |
386 | struct el_TITAN_sysdata_mcheck *tmchk = | 386 | struct el_TITAN_sysdata_mcheck *tmchk = |
@@ -702,7 +702,7 @@ privateer_process_logout_frame(struct el_common *mchk_header, int print) | |||
702 | } | 702 | } |
703 | 703 | ||
704 | void | 704 | void |
705 | privateer_machine_check(u64 vector, u64 la_ptr) | 705 | privateer_machine_check(unsigned long vector, unsigned long la_ptr) |
706 | { | 706 | { |
707 | struct el_common *mchk_header = (struct el_common *)la_ptr; | 707 | struct el_common *mchk_header = (struct el_common *)la_ptr; |
708 | struct el_TITAN_sysdata_mcheck *tmchk = | 708 | struct el_TITAN_sysdata_mcheck *tmchk = |
diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h index 567f2598d090..3d2627ec9860 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h | |||
@@ -36,7 +36,6 @@ extern void cia_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); | |||
36 | extern struct pci_ops irongate_pci_ops; | 36 | extern struct pci_ops irongate_pci_ops; |
37 | extern int irongate_pci_clr_err(void); | 37 | extern int irongate_pci_clr_err(void); |
38 | extern void irongate_init_arch(void); | 38 | extern void irongate_init_arch(void); |
39 | extern void irongate_machine_check(u64, u64); | ||
40 | #define irongate_pci_tbi ((void *)0) | 39 | #define irongate_pci_tbi ((void *)0) |
41 | 40 | ||
42 | /* core_lca.c */ | 41 | /* core_lca.c */ |
@@ -49,7 +48,7 @@ extern void lca_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); | |||
49 | extern struct pci_ops marvel_pci_ops; | 48 | extern struct pci_ops marvel_pci_ops; |
50 | extern void marvel_init_arch(void); | 49 | extern void marvel_init_arch(void); |
51 | extern void marvel_kill_arch(int); | 50 | extern void marvel_kill_arch(int); |
52 | extern void marvel_machine_check(u64, u64); | 51 | extern void marvel_machine_check(unsigned long, unsigned long); |
53 | extern void marvel_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); | 52 | extern void marvel_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); |
54 | extern int marvel_pa_to_nid(unsigned long); | 53 | extern int marvel_pa_to_nid(unsigned long); |
55 | extern int marvel_cpuid_to_nid(int); | 54 | extern int marvel_cpuid_to_nid(int); |
@@ -86,7 +85,7 @@ extern void t2_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); | |||
86 | extern struct pci_ops titan_pci_ops; | 85 | extern struct pci_ops titan_pci_ops; |
87 | extern void titan_init_arch(void); | 86 | extern void titan_init_arch(void); |
88 | extern void titan_kill_arch(int); | 87 | extern void titan_kill_arch(int); |
89 | extern void titan_machine_check(u64, u64); | 88 | extern void titan_machine_check(unsigned long, unsigned long); |
90 | extern void titan_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); | 89 | extern void titan_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); |
91 | extern struct _alpha_agp_info *titan_agp_info(void); | 90 | extern struct _alpha_agp_info *titan_agp_info(void); |
92 | 91 | ||
diff --git a/arch/alpha/mm/extable.c b/arch/alpha/mm/extable.c index dc7aeda15773..62dc379d301a 100644 --- a/arch/alpha/mm/extable.c +++ b/arch/alpha/mm/extable.c | |||
@@ -3,11 +3,49 @@ | |||
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/module.h> | 5 | #include <linux/module.h> |
6 | #include <linux/sort.h> | ||
6 | #include <asm/uaccess.h> | 7 | #include <asm/uaccess.h> |
7 | 8 | ||
9 | static inline unsigned long ex_to_addr(const struct exception_table_entry *x) | ||
10 | { | ||
11 | return (unsigned long)&x->insn + x->insn; | ||
12 | } | ||
13 | |||
14 | static void swap_ex(void *a, void *b, int size) | ||
15 | { | ||
16 | struct exception_table_entry *ex_a = a, *ex_b = b; | ||
17 | unsigned long addr_a = ex_to_addr(ex_a), addr_b = ex_to_addr(ex_b); | ||
18 | unsigned int t = ex_a->fixup.unit; | ||
19 | |||
20 | ex_a->fixup.unit = ex_b->fixup.unit; | ||
21 | ex_b->fixup.unit = t; | ||
22 | ex_a->insn = (int)(addr_b - (unsigned long)&ex_a->insn); | ||
23 | ex_b->insn = (int)(addr_a - (unsigned long)&ex_b->insn); | ||
24 | } | ||
25 | |||
26 | /* | ||
27 | * The exception table needs to be sorted so that the binary | ||
28 | * search that we use to find entries in it works properly. | ||
29 | * This is used both for the kernel exception table and for | ||
30 | * the exception tables of modules that get loaded. | ||
31 | */ | ||
32 | static int cmp_ex(const void *a, const void *b) | ||
33 | { | ||
34 | const struct exception_table_entry *x = a, *y = b; | ||
35 | |||
36 | /* avoid overflow */ | ||
37 | if (ex_to_addr(x) > ex_to_addr(y)) | ||
38 | return 1; | ||
39 | if (ex_to_addr(x) < ex_to_addr(y)) | ||
40 | return -1; | ||
41 | return 0; | ||
42 | } | ||
43 | |||
8 | void sort_extable(struct exception_table_entry *start, | 44 | void sort_extable(struct exception_table_entry *start, |
9 | struct exception_table_entry *finish) | 45 | struct exception_table_entry *finish) |
10 | { | 46 | { |
47 | sort(start, finish - start, sizeof(struct exception_table_entry), | ||
48 | cmp_ex, swap_ex); | ||
11 | } | 49 | } |
12 | 50 | ||
13 | const struct exception_table_entry * | 51 | const struct exception_table_entry * |
@@ -20,7 +58,7 @@ search_extable(const struct exception_table_entry *first, | |||
20 | unsigned long mid_value; | 58 | unsigned long mid_value; |
21 | 59 | ||
22 | mid = (last - first) / 2 + first; | 60 | mid = (last - first) / 2 + first; |
23 | mid_value = (unsigned long)&mid->insn + mid->insn; | 61 | mid_value = ex_to_addr(mid); |
24 | if (mid_value == value) | 62 | if (mid_value == value) |
25 | return mid; | 63 | return mid; |
26 | else if (mid_value < value) | 64 | else if (mid_value < value) |
diff --git a/arch/m32r/boot/compressed/Makefile b/arch/m32r/boot/compressed/Makefile index d908e1d3c07f..560484ae35ec 100644 --- a/arch/m32r/boot/compressed/Makefile +++ b/arch/m32r/boot/compressed/Makefile | |||
@@ -6,7 +6,6 @@ | |||
6 | 6 | ||
7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o \ | 7 | targets := vmlinux vmlinux.bin vmlinux.bin.gz head.o misc.o \ |
8 | piggy.o vmlinux.lds | 8 | piggy.o vmlinux.lds |
9 | EXTRA_AFLAGS := -traditional | ||
10 | 9 | ||
11 | OBJECTS = $(obj)/head.o $(obj)/misc.o | 10 | OBJECTS = $(obj)/head.o $(obj)/misc.o |
12 | 11 | ||
diff --git a/arch/m32r/include/asm/assembler.h b/arch/m32r/include/asm/assembler.h index 26351539b5ff..728799fc70aa 100644 --- a/arch/m32r/include/asm/assembler.h +++ b/arch/m32r/include/asm/assembler.h | |||
@@ -9,14 +9,15 @@ | |||
9 | * This file contains M32R architecture specific macro definitions. | 9 | * This file contains M32R architecture specific macro definitions. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/stringify.h> | ||
13 | |||
14 | #undef __STR | ||
12 | 15 | ||
13 | #ifndef __STR | ||
14 | #ifdef __ASSEMBLY__ | 16 | #ifdef __ASSEMBLY__ |
15 | #define __STR(x) x | 17 | #define __STR(x) x |
16 | #else | 18 | #else |
17 | #define __STR(x) #x | 19 | #define __STR(x) __stringify(x) |
18 | #endif | 20 | #endif |
19 | #endif /* __STR */ | ||
20 | 21 | ||
21 | #ifdef CONFIG_SMP | 22 | #ifdef CONFIG_SMP |
22 | #define M32R_LOCK __STR(lock) | 23 | #define M32R_LOCK __STR(lock) |
diff --git a/arch/m32r/kernel/Makefile b/arch/m32r/kernel/Makefile index 09200d4886e3..b1a4b6036591 100644 --- a/arch/m32r/kernel/Makefile +++ b/arch/m32r/kernel/Makefile | |||
@@ -9,5 +9,3 @@ obj-y := process.o entry.o traps.o align.o irq.o setup.o time.o \ | |||
9 | 9 | ||
10 | obj-$(CONFIG_SMP) += smp.o smpboot.o | 10 | obj-$(CONFIG_SMP) += smp.o smpboot.o |
11 | obj-$(CONFIG_MODULES) += module.o | 11 | obj-$(CONFIG_MODULES) += module.o |
12 | |||
13 | EXTRA_AFLAGS := -traditional | ||
diff --git a/arch/microblaze/include/asm/of_platform.h b/arch/microblaze/include/asm/of_platform.h index 187c0eedaece..37491276c6ca 100644 --- a/arch/microblaze/include/asm/of_platform.h +++ b/arch/microblaze/include/asm/of_platform.h | |||
@@ -36,16 +36,6 @@ static const struct of_device_id of_default_bus_ids[] = { | |||
36 | {}, | 36 | {}, |
37 | }; | 37 | }; |
38 | 38 | ||
39 | /* Platform drivers register/unregister */ | ||
40 | static inline int of_register_platform_driver(struct of_platform_driver *drv) | ||
41 | { | ||
42 | return of_register_driver(drv, &of_platform_bus_type); | ||
43 | } | ||
44 | static inline void of_unregister_platform_driver(struct of_platform_driver *drv) | ||
45 | { | ||
46 | of_unregister_driver(drv); | ||
47 | } | ||
48 | |||
49 | /* Platform devices and busses creation */ | 39 | /* Platform devices and busses creation */ |
50 | extern struct of_device *of_platform_device_create(struct device_node *np, | 40 | extern struct of_device *of_platform_device_create(struct device_node *np, |
51 | const char *bus_id, | 41 | const char *bus_id, |
diff --git a/arch/powerpc/include/asm/of_platform.h b/arch/powerpc/include/asm/of_platform.h index 53b46507ffde..d4aaa3489440 100644 --- a/arch/powerpc/include/asm/of_platform.h +++ b/arch/powerpc/include/asm/of_platform.h | |||
@@ -11,16 +11,6 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | /* Platform drivers register/unregister */ | ||
15 | static inline int of_register_platform_driver(struct of_platform_driver *drv) | ||
16 | { | ||
17 | return of_register_driver(drv, &of_platform_bus_type); | ||
18 | } | ||
19 | static inline void of_unregister_platform_driver(struct of_platform_driver *drv) | ||
20 | { | ||
21 | of_unregister_driver(drv); | ||
22 | } | ||
23 | |||
24 | /* Platform devices and busses creation */ | 14 | /* Platform devices and busses creation */ |
25 | extern struct of_device *of_platform_device_create(struct device_node *np, | 15 | extern struct of_device *of_platform_device_create(struct device_node *np, |
26 | const char *bus_id, | 16 | const char *bus_id, |
diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index b6667ff059e5..88b5a2c4814d 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c | |||
@@ -543,6 +543,13 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, | |||
543 | 543 | ||
544 | package_element = *top_object_list; | 544 | package_element = *top_object_list; |
545 | 545 | ||
546 | /* We must have a valid Package object */ | ||
547 | |||
548 | if (!package_element || | ||
549 | (package_element->common.type != ACPI_TYPE_PACKAGE)) { | ||
550 | return_ACPI_STATUS (AE_AML_OPERAND_TYPE); | ||
551 | } | ||
552 | |||
546 | /* | 553 | /* |
547 | * The sub_object_list will now point to an array of the | 554 | * The sub_object_list will now point to an array of the |
548 | * four IRQ elements: Address, Pin, Source and source_index | 555 | * four IRQ elements: Address, Pin, Source and source_index |
diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c index 7b7ddc2d51c9..420a96e7f2db 100644 --- a/drivers/firmware/iscsi_ibft.c +++ b/drivers/firmware/iscsi_ibft.c | |||
@@ -754,11 +754,11 @@ static int __init ibft_check_nic_for(struct ibft_nic *nic, int entry) | |||
754 | rc = 1; | 754 | rc = 1; |
755 | break; | 755 | break; |
756 | case ibft_eth_ip_addr: | 756 | case ibft_eth_ip_addr: |
757 | if (!memcmp(nic->dhcp, nulls, sizeof(nic->dhcp))) | 757 | if (memcmp(nic->ip_addr, nulls, sizeof(nic->ip_addr))) |
758 | rc = 1; | 758 | rc = 1; |
759 | break; | 759 | break; |
760 | case ibft_eth_subnet_mask: | 760 | case ibft_eth_subnet_mask: |
761 | if (!memcmp(nic->dhcp, nulls, sizeof(nic->dhcp))) | 761 | if (nic->subnet_mask_prefix) |
762 | rc = 1; | 762 | rc = 1; |
763 | break; | 763 | break; |
764 | case ibft_eth_origin: | 764 | case ibft_eth_origin: |
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index 7359d9d88e46..acbce5745b0c 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -151,7 +151,7 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, | |||
151 | if (fnmode) { | 151 | if (fnmode) { |
152 | int do_translate; | 152 | int do_translate; |
153 | 153 | ||
154 | trans = apple_find_translation((hid->product < 0x220 || | 154 | trans = apple_find_translation((hid->product < 0x21d || |
155 | hid->product >= 0x300) ? | 155 | hid->product >= 0x300) ? |
156 | powerbook_fn_keys : apple_fn_keys, | 156 | powerbook_fn_keys : apple_fn_keys, |
157 | usage->code); | 157 | usage->code); |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 5746a5903bce..8551693d645f 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1293,6 +1293,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1293 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) }, | 1293 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) }, |
1294 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) }, | 1294 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) }, |
1295 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) }, | 1295 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) }, |
1296 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) }, | ||
1296 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) }, | 1297 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) }, |
1297 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, | 1298 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) }, |
1298 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) }, | 1299 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) }, |
@@ -1824,6 +1825,9 @@ int hid_check_keys_pressed(struct hid_device *hid) | |||
1824 | struct hid_input *hidinput; | 1825 | struct hid_input *hidinput; |
1825 | int i; | 1826 | int i; |
1826 | 1827 | ||
1828 | if (!(hid->claimed & HID_CLAIMED_INPUT)) | ||
1829 | return 0; | ||
1830 | |||
1827 | list_for_each_entry(hidinput, &hid->inputs, list) { | 1831 | list_for_each_entry(hidinput, &hid->inputs, list) { |
1828 | for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++) | 1832 | for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++) |
1829 | if (hidinput->input->key[i]) | 1833 | if (hidinput->input->key[i]) |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index bdeda4c7cc13..aa1b995dd033 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -292,6 +292,7 @@ | |||
292 | #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 | 292 | #define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286 |
293 | #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 | 293 | #define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 |
294 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295 | 294 | #define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295 |
295 | #define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299 | ||
295 | #define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a | 296 | #define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a |
296 | #define USB_DEVICE_ID_S510_RECEIVER 0xc50c | 297 | #define USB_DEVICE_ID_S510_RECEIVER 0xc50c |
297 | #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 | 298 | #define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 |
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c index 7b80cb694982..7afbaa0efd18 100644 --- a/drivers/hid/hid-lg.c +++ b/drivers/hid/hid-lg.c | |||
@@ -297,6 +297,8 @@ static const struct hid_device_id lg_devices[] = { | |||
297 | .driver_data = LG_FF }, | 297 | .driver_data = LG_FF }, |
298 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2), | 298 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2), |
299 | .driver_data = LG_FF }, | 299 | .driver_data = LG_FF }, |
300 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL), | ||
301 | .driver_data = LG_FF }, | ||
300 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), | 302 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2), |
301 | .driver_data = LG_FF2 }, | 303 | .driver_data = LG_FF2 }, |
302 | { } | 304 | { } |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index e263d4731179..00ccf4b1985d 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -285,8 +285,10 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
285 | 285 | ||
286 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) { | 286 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) { |
287 | int len; | 287 | int len; |
288 | if (!hid->name) | 288 | if (!hid->name) { |
289 | return 0; | 289 | ret = 0; |
290 | break; | ||
291 | } | ||
290 | len = strlen(hid->name) + 1; | 292 | len = strlen(hid->name) + 1; |
291 | if (len > _IOC_SIZE(cmd)) | 293 | if (len > _IOC_SIZE(cmd)) |
292 | len = _IOC_SIZE(cmd); | 294 | len = _IOC_SIZE(cmd); |
@@ -297,8 +299,10 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
297 | 299 | ||
298 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) { | 300 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) { |
299 | int len; | 301 | int len; |
300 | if (!hid->phys) | 302 | if (!hid->phys) { |
301 | return 0; | 303 | ret = 0; |
304 | break; | ||
305 | } | ||
302 | len = strlen(hid->phys) + 1; | 306 | len = strlen(hid->phys) + 1; |
303 | if (len > _IOC_SIZE(cmd)) | 307 | if (len > _IOC_SIZE(cmd)) |
304 | len = _IOC_SIZE(cmd); | 308 | len = _IOC_SIZE(cmd); |
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 4306cb1b8ce5..900ce18dd549 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -662,8 +662,8 @@ void usbhid_close(struct hid_device *hid) | |||
662 | spin_lock_irq(&usbhid->lock); | 662 | spin_lock_irq(&usbhid->lock); |
663 | if (!--hid->open) { | 663 | if (!--hid->open) { |
664 | spin_unlock_irq(&usbhid->lock); | 664 | spin_unlock_irq(&usbhid->lock); |
665 | hid_cancel_delayed_stuff(usbhid); | ||
665 | usb_kill_urb(usbhid->urbin); | 666 | usb_kill_urb(usbhid->urbin); |
666 | flush_scheduled_work(); | ||
667 | usbhid->intf->needs_remote_wakeup = 0; | 667 | usbhid->intf->needs_remote_wakeup = 0; |
668 | } else { | 668 | } else { |
669 | spin_unlock_irq(&usbhid->lock); | 669 | spin_unlock_irq(&usbhid->lock); |
diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c index 7ba7d70f04d6..7be52fe288eb 100644 --- a/drivers/serial/crisv10.c +++ b/drivers/serial/crisv10.c | |||
@@ -23,16 +23,18 @@ static char *serial_version = "$Revision: 1.25 $"; | |||
23 | #include <linux/mm.h> | 23 | #include <linux/mm.h> |
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
26 | #include <asm/uaccess.h> | ||
27 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
28 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
29 | #include <linux/bitops.h> | 28 | #include <linux/bitops.h> |
29 | #include <linux/seq_file.h> | ||
30 | #include <linux/delay.h> | ||
31 | #include <linux/module.h> | ||
32 | #include <linux/uaccess.h> | ||
33 | #include <linux/io.h> | ||
30 | 34 | ||
31 | #include <asm/io.h> | ||
32 | #include <asm/irq.h> | 35 | #include <asm/irq.h> |
33 | #include <asm/dma.h> | 36 | #include <asm/dma.h> |
34 | #include <asm/system.h> | 37 | #include <asm/system.h> |
35 | #include <linux/delay.h> | ||
36 | 38 | ||
37 | #include <arch/svinto.h> | 39 | #include <arch/svinto.h> |
38 | 40 | ||
@@ -456,7 +458,6 @@ static struct e100_serial rs_table[] = { | |||
456 | 458 | ||
457 | #define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial)) | 459 | #define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial)) |
458 | 460 | ||
459 | static struct ktermios *serial_termios[NR_PORTS]; | ||
460 | #ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER | 461 | #ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER |
461 | static struct fast_timer fast_timers[NR_PORTS]; | 462 | static struct fast_timer fast_timers[NR_PORTS]; |
462 | #endif | 463 | #endif |
@@ -4257,151 +4258,132 @@ rs_open(struct tty_struct *tty, struct file * filp) | |||
4257 | return 0; | 4258 | return 0; |
4258 | } | 4259 | } |
4259 | 4260 | ||
4261 | #ifdef CONFIG_PROC_FS | ||
4260 | /* | 4262 | /* |
4261 | * /proc fs routines.... | 4263 | * /proc fs routines.... |
4262 | */ | 4264 | */ |
4263 | 4265 | ||
4264 | static int line_info(char *buf, struct e100_serial *info) | 4266 | static void seq_line_info(struct seq_file *m, struct e100_serial *info) |
4265 | { | 4267 | { |
4266 | char stat_buf[30]; | ||
4267 | int ret; | ||
4268 | unsigned long tmp; | 4268 | unsigned long tmp; |
4269 | 4269 | ||
4270 | ret = sprintf(buf, "%d: uart:E100 port:%lX irq:%d", | 4270 | seq_printf(m, "%d: uart:E100 port:%lX irq:%d", |
4271 | info->line, (unsigned long)info->ioport, info->irq); | 4271 | info->line, (unsigned long)info->ioport, info->irq); |
4272 | 4272 | ||
4273 | if (!info->ioport || (info->type == PORT_UNKNOWN)) { | 4273 | if (!info->ioport || (info->type == PORT_UNKNOWN)) { |
4274 | ret += sprintf(buf+ret, "\n"); | 4274 | seq_printf(m, "\n"); |
4275 | return ret; | 4275 | return; |
4276 | } | 4276 | } |
4277 | 4277 | ||
4278 | stat_buf[0] = 0; | 4278 | seq_printf(m, " baud:%d", info->baud); |
4279 | stat_buf[1] = 0; | 4279 | seq_printf(m, " tx:%lu rx:%lu", |
4280 | if (!E100_RTS_GET(info)) | ||
4281 | strcat(stat_buf, "|RTS"); | ||
4282 | if (!E100_CTS_GET(info)) | ||
4283 | strcat(stat_buf, "|CTS"); | ||
4284 | if (!E100_DTR_GET(info)) | ||
4285 | strcat(stat_buf, "|DTR"); | ||
4286 | if (!E100_DSR_GET(info)) | ||
4287 | strcat(stat_buf, "|DSR"); | ||
4288 | if (!E100_CD_GET(info)) | ||
4289 | strcat(stat_buf, "|CD"); | ||
4290 | if (!E100_RI_GET(info)) | ||
4291 | strcat(stat_buf, "|RI"); | ||
4292 | |||
4293 | ret += sprintf(buf+ret, " baud:%d", info->baud); | ||
4294 | |||
4295 | ret += sprintf(buf+ret, " tx:%lu rx:%lu", | ||
4296 | (unsigned long)info->icount.tx, | 4280 | (unsigned long)info->icount.tx, |
4297 | (unsigned long)info->icount.rx); | 4281 | (unsigned long)info->icount.rx); |
4298 | tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); | 4282 | tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); |
4299 | if (tmp) { | 4283 | if (tmp) |
4300 | ret += sprintf(buf+ret, " tx_pend:%lu/%lu", | 4284 | seq_printf(m, " tx_pend:%lu/%lu", |
4301 | (unsigned long)tmp, | 4285 | (unsigned long)tmp, |
4302 | (unsigned long)SERIAL_XMIT_SIZE); | 4286 | (unsigned long)SERIAL_XMIT_SIZE); |
4303 | } | ||
4304 | 4287 | ||
4305 | ret += sprintf(buf+ret, " rx_pend:%lu/%lu", | 4288 | seq_printf(m, " rx_pend:%lu/%lu", |
4306 | (unsigned long)info->recv_cnt, | 4289 | (unsigned long)info->recv_cnt, |
4307 | (unsigned long)info->max_recv_cnt); | 4290 | (unsigned long)info->max_recv_cnt); |
4308 | 4291 | ||
4309 | #if 1 | 4292 | #if 1 |
4310 | if (info->port.tty) { | 4293 | if (info->port.tty) { |
4311 | |||
4312 | if (info->port.tty->stopped) | 4294 | if (info->port.tty->stopped) |
4313 | ret += sprintf(buf+ret, " stopped:%i", | 4295 | seq_printf(m, " stopped:%i", |
4314 | (int)info->port.tty->stopped); | 4296 | (int)info->port.tty->stopped); |
4315 | if (info->port.tty->hw_stopped) | 4297 | if (info->port.tty->hw_stopped) |
4316 | ret += sprintf(buf+ret, " hw_stopped:%i", | 4298 | seq_printf(m, " hw_stopped:%i", |
4317 | (int)info->port.tty->hw_stopped); | 4299 | (int)info->port.tty->hw_stopped); |
4318 | } | 4300 | } |
4319 | 4301 | ||
4320 | { | 4302 | { |
4321 | unsigned char rstat = info->ioport[REG_STATUS]; | 4303 | unsigned char rstat = info->ioport[REG_STATUS]; |
4322 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) | 4304 | if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect)) |
4323 | ret += sprintf(buf+ret, " xoff_detect:1"); | 4305 | seq_printf(m, " xoff_detect:1"); |
4324 | } | 4306 | } |
4325 | 4307 | ||
4326 | #endif | 4308 | #endif |
4327 | 4309 | ||
4328 | |||
4329 | |||
4330 | |||
4331 | if (info->icount.frame) | 4310 | if (info->icount.frame) |
4332 | ret += sprintf(buf+ret, " fe:%lu", | 4311 | seq_printf(m, " fe:%lu", (unsigned long)info->icount.frame); |
4333 | (unsigned long)info->icount.frame); | ||
4334 | 4312 | ||
4335 | if (info->icount.parity) | 4313 | if (info->icount.parity) |
4336 | ret += sprintf(buf+ret, " pe:%lu", | 4314 | seq_printf(m, " pe:%lu", (unsigned long)info->icount.parity); |
4337 | (unsigned long)info->icount.parity); | ||
4338 | 4315 | ||
4339 | if (info->icount.brk) | 4316 | if (info->icount.brk) |
4340 | ret += sprintf(buf+ret, " brk:%lu", | 4317 | seq_printf(m, " brk:%lu", (unsigned long)info->icount.brk); |
4341 | (unsigned long)info->icount.brk); | ||
4342 | 4318 | ||
4343 | if (info->icount.overrun) | 4319 | if (info->icount.overrun) |
4344 | ret += sprintf(buf+ret, " oe:%lu", | 4320 | seq_printf(m, " oe:%lu", (unsigned long)info->icount.overrun); |
4345 | (unsigned long)info->icount.overrun); | ||
4346 | 4321 | ||
4347 | /* | 4322 | /* |
4348 | * Last thing is the RS-232 status lines | 4323 | * Last thing is the RS-232 status lines |
4349 | */ | 4324 | */ |
4350 | ret += sprintf(buf+ret, " %s\n", stat_buf+1); | 4325 | if (!E100_RTS_GET(info)) |
4351 | return ret; | 4326 | seq_puts(m, "|RTS"); |
4327 | if (!E100_CTS_GET(info)) | ||
4328 | seq_puts(m, "|CTS"); | ||
4329 | if (!E100_DTR_GET(info)) | ||
4330 | seq_puts(m, "|DTR"); | ||
4331 | if (!E100_DSR_GET(info)) | ||
4332 | seq_puts(m, "|DSR"); | ||
4333 | if (!E100_CD_GET(info)) | ||
4334 | seq_puts(m, "|CD"); | ||
4335 | if (!E100_RI_GET(info)) | ||
4336 | seq_puts(m, "|RI"); | ||
4337 | seq_puts(m, "\n"); | ||
4352 | } | 4338 | } |
4353 | 4339 | ||
4354 | int rs_read_proc(char *page, char **start, off_t off, int count, | 4340 | |
4355 | int *eof, void *data) | 4341 | static int crisv10_proc_show(struct seq_file *m, void *v) |
4356 | { | 4342 | { |
4357 | int i, len = 0, l; | 4343 | int i; |
4358 | off_t begin = 0; | ||
4359 | 4344 | ||
4360 | len += sprintf(page, "serinfo:1.0 driver:%s\n", | 4345 | seq_printf(m, "serinfo:1.0 driver:%s\n", serial_version); |
4361 | serial_version); | 4346 | |
4362 | for (i = 0; i < NR_PORTS && len < 4000; i++) { | 4347 | for (i = 0; i < NR_PORTS; i++) { |
4363 | if (!rs_table[i].enabled) | 4348 | if (!rs_table[i].enabled) |
4364 | continue; | 4349 | continue; |
4365 | l = line_info(page + len, &rs_table[i]); | 4350 | seq_line_info(m, &rs_table[i]); |
4366 | len += l; | ||
4367 | if (len+begin > off+count) | ||
4368 | goto done; | ||
4369 | if (len+begin < off) { | ||
4370 | begin += len; | ||
4371 | len = 0; | ||
4372 | } | ||
4373 | } | 4351 | } |
4374 | #ifdef DEBUG_LOG_INCLUDED | 4352 | #ifdef DEBUG_LOG_INCLUDED |
4375 | for (i = 0; i < debug_log_pos; i++) { | 4353 | for (i = 0; i < debug_log_pos; i++) { |
4376 | len += sprintf(page + len, "%-4i %lu.%lu ", i, debug_log[i].time, timer_data_to_ns(debug_log[i].timer_data)); | 4354 | seq_printf(m, "%-4i %lu.%lu ", |
4377 | len += sprintf(page + len, debug_log[i].string, debug_log[i].value); | 4355 | i, debug_log[i].time, |
4378 | if (len+begin > off+count) | 4356 | timer_data_to_ns(debug_log[i].timer_data)); |
4379 | goto done; | 4357 | seq_printf(m, debug_log[i].string, debug_log[i].value); |
4380 | if (len+begin < off) { | ||
4381 | begin += len; | ||
4382 | len = 0; | ||
4383 | } | ||
4384 | } | 4358 | } |
4385 | len += sprintf(page + len, "debug_log %i/%i %li bytes\n", | 4359 | seq_printf(m, "debug_log %i/%i\n", i, DEBUG_LOG_SIZE); |
4386 | i, DEBUG_LOG_SIZE, begin+len); | ||
4387 | debug_log_pos = 0; | 4360 | debug_log_pos = 0; |
4388 | #endif | 4361 | #endif |
4362 | return 0; | ||
4363 | } | ||
4389 | 4364 | ||
4390 | *eof = 1; | 4365 | static int crisv10_proc_open(struct inode *inode, struct file *file) |
4391 | done: | 4366 | { |
4392 | if (off >= len+begin) | 4367 | return single_open(file, crisv10_proc_show, NULL); |
4393 | return 0; | ||
4394 | *start = page + (off-begin); | ||
4395 | return ((count < begin+len-off) ? count : begin+len-off); | ||
4396 | } | 4368 | } |
4397 | 4369 | ||
4370 | static const struct file_operations crisv10_proc_fops = { | ||
4371 | .owner = THIS_MODULE, | ||
4372 | .open = crisv10_proc_open, | ||
4373 | .read = seq_read, | ||
4374 | .llseek = seq_lseek, | ||
4375 | .release = single_release, | ||
4376 | }; | ||
4377 | #endif | ||
4378 | |||
4379 | |||
4398 | /* Finally, routines used to initialize the serial driver. */ | 4380 | /* Finally, routines used to initialize the serial driver. */ |
4399 | 4381 | ||
4400 | static void | 4382 | static void show_serial_version(void) |
4401 | show_serial_version(void) | ||
4402 | { | 4383 | { |
4403 | printk(KERN_INFO | 4384 | printk(KERN_INFO |
4404 | "ETRAX 100LX serial-driver %s, (c) 2000-2004 Axis Communications AB\r\n", | 4385 | "ETRAX 100LX serial-driver %s, " |
4386 | "(c) 2000-2004 Axis Communications AB\r\n", | ||
4405 | &serial_version[11]); /* "$Revision: x.yy" */ | 4387 | &serial_version[11]); /* "$Revision: x.yy" */ |
4406 | } | 4388 | } |
4407 | 4389 | ||
@@ -4425,13 +4407,14 @@ static const struct tty_operations rs_ops = { | |||
4425 | .break_ctl = rs_break, | 4407 | .break_ctl = rs_break, |
4426 | .send_xchar = rs_send_xchar, | 4408 | .send_xchar = rs_send_xchar, |
4427 | .wait_until_sent = rs_wait_until_sent, | 4409 | .wait_until_sent = rs_wait_until_sent, |
4428 | .read_proc = rs_read_proc, | ||
4429 | .tiocmget = rs_tiocmget, | 4410 | .tiocmget = rs_tiocmget, |
4430 | .tiocmset = rs_tiocmset | 4411 | .tiocmset = rs_tiocmset, |
4412 | #ifdef CONFIG_PROC_FS | ||
4413 | .proc_fops = &crisv10_proc_fops, | ||
4414 | #endif | ||
4431 | }; | 4415 | }; |
4432 | 4416 | ||
4433 | static int __init | 4417 | static int __init rs_init(void) |
4434 | rs_init(void) | ||
4435 | { | 4418 | { |
4436 | int i; | 4419 | int i; |
4437 | struct e100_serial *info; | 4420 | struct e100_serial *info; |
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index d012edda6d11..38e86b84dce0 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c | |||
@@ -1282,7 +1282,7 @@ static int vgacon_font_get(struct vc_data *c, struct console_font *font) | |||
1282 | font->charcount = vga_512_chars ? 512 : 256; | 1282 | font->charcount = vga_512_chars ? 512 : 256; |
1283 | if (!font->data) | 1283 | if (!font->data) |
1284 | return 0; | 1284 | return 0; |
1285 | return vgacon_do_font_op(&state, font->data, 0, 0); | 1285 | return vgacon_do_font_op(&state, font->data, 0, vga_512_chars); |
1286 | } | 1286 | } |
1287 | 1287 | ||
1288 | #else | 1288 | #else |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index 75f7ddacf7d6..3077d8f16523 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
@@ -70,8 +70,10 @@ static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) | |||
70 | * Otherwise it's an offset mount and we need to check | 70 | * Otherwise it's an offset mount and we need to check |
71 | * if we can umount its mount, if there is one. | 71 | * if we can umount its mount, if there is one. |
72 | */ | 72 | */ |
73 | if (!d_mountpoint(dentry)) | 73 | if (!d_mountpoint(dentry)) { |
74 | status = 0; | ||
74 | goto done; | 75 | goto done; |
76 | } | ||
75 | } | 77 | } |
76 | 78 | ||
77 | /* Update the expiry counter if fs is busy */ | 79 | /* Update the expiry counter if fs is busy */ |
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c index 70cfc4b84ae0..fdb66faa24f1 100644 --- a/fs/binfmt_elf_fdpic.c +++ b/fs/binfmt_elf_fdpic.c | |||
@@ -1388,7 +1388,7 @@ static void fill_prstatus(struct elf_prstatus *prstatus, | |||
1388 | prstatus->pr_sigpend = p->pending.signal.sig[0]; | 1388 | prstatus->pr_sigpend = p->pending.signal.sig[0]; |
1389 | prstatus->pr_sighold = p->blocked.sig[0]; | 1389 | prstatus->pr_sighold = p->blocked.sig[0]; |
1390 | prstatus->pr_pid = task_pid_vnr(p); | 1390 | prstatus->pr_pid = task_pid_vnr(p); |
1391 | prstatus->pr_ppid = task_pid_vnr(p->parent); | 1391 | prstatus->pr_ppid = task_pid_vnr(p->real_parent); |
1392 | prstatus->pr_pgrp = task_pgrp_vnr(p); | 1392 | prstatus->pr_pgrp = task_pgrp_vnr(p); |
1393 | prstatus->pr_sid = task_session_vnr(p); | 1393 | prstatus->pr_sid = task_session_vnr(p); |
1394 | if (thread_group_leader(p)) { | 1394 | if (thread_group_leader(p)) { |
@@ -1433,7 +1433,7 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p, | |||
1433 | psinfo->pr_psargs[len] = 0; | 1433 | psinfo->pr_psargs[len] = 0; |
1434 | 1434 | ||
1435 | psinfo->pr_pid = task_pid_vnr(p); | 1435 | psinfo->pr_pid = task_pid_vnr(p); |
1436 | psinfo->pr_ppid = task_pid_vnr(p->parent); | 1436 | psinfo->pr_ppid = task_pid_vnr(p->real_parent); |
1437 | psinfo->pr_pgrp = task_pgrp_vnr(p); | 1437 | psinfo->pr_pgrp = task_pgrp_vnr(p); |
1438 | psinfo->pr_sid = task_session_vnr(p); | 1438 | psinfo->pr_sid = task_session_vnr(p); |
1439 | 1439 | ||
diff --git a/fs/buffer.c b/fs/buffer.c index b3e5be7514f5..aed297739eb0 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -2397,7 +2397,8 @@ block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, | |||
2397 | if ((page->mapping != inode->i_mapping) || | 2397 | if ((page->mapping != inode->i_mapping) || |
2398 | (page_offset(page) > size)) { | 2398 | (page_offset(page) > size)) { |
2399 | /* page got truncated out from underneath us */ | 2399 | /* page got truncated out from underneath us */ |
2400 | goto out_unlock; | 2400 | unlock_page(page); |
2401 | goto out; | ||
2401 | } | 2402 | } |
2402 | 2403 | ||
2403 | /* page is wholly or partially inside EOF */ | 2404 | /* page is wholly or partially inside EOF */ |
@@ -2411,14 +2412,15 @@ block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, | |||
2411 | ret = block_commit_write(page, 0, end); | 2412 | ret = block_commit_write(page, 0, end); |
2412 | 2413 | ||
2413 | if (unlikely(ret)) { | 2414 | if (unlikely(ret)) { |
2415 | unlock_page(page); | ||
2414 | if (ret == -ENOMEM) | 2416 | if (ret == -ENOMEM) |
2415 | ret = VM_FAULT_OOM; | 2417 | ret = VM_FAULT_OOM; |
2416 | else /* -ENOSPC, -EIO, etc */ | 2418 | else /* -ENOSPC, -EIO, etc */ |
2417 | ret = VM_FAULT_SIGBUS; | 2419 | ret = VM_FAULT_SIGBUS; |
2418 | } | 2420 | } else |
2421 | ret = VM_FAULT_LOCKED; | ||
2419 | 2422 | ||
2420 | out_unlock: | 2423 | out: |
2421 | unlock_page(page); | ||
2422 | return ret; | 2424 | return ret; |
2423 | } | 2425 | } |
2424 | 2426 | ||
@@ -69,17 +69,18 @@ int suid_dumpable = 0; | |||
69 | static LIST_HEAD(formats); | 69 | static LIST_HEAD(formats); |
70 | static DEFINE_RWLOCK(binfmt_lock); | 70 | static DEFINE_RWLOCK(binfmt_lock); |
71 | 71 | ||
72 | int register_binfmt(struct linux_binfmt * fmt) | 72 | int __register_binfmt(struct linux_binfmt * fmt, int insert) |
73 | { | 73 | { |
74 | if (!fmt) | 74 | if (!fmt) |
75 | return -EINVAL; | 75 | return -EINVAL; |
76 | write_lock(&binfmt_lock); | 76 | write_lock(&binfmt_lock); |
77 | list_add(&fmt->lh, &formats); | 77 | insert ? list_add(&fmt->lh, &formats) : |
78 | list_add_tail(&fmt->lh, &formats); | ||
78 | write_unlock(&binfmt_lock); | 79 | write_unlock(&binfmt_lock); |
79 | return 0; | 80 | return 0; |
80 | } | 81 | } |
81 | 82 | ||
82 | EXPORT_SYMBOL(register_binfmt); | 83 | EXPORT_SYMBOL(__register_binfmt); |
83 | 84 | ||
84 | void unregister_binfmt(struct linux_binfmt * fmt) | 85 | void unregister_binfmt(struct linux_binfmt * fmt) |
85 | { | 86 | { |
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 7d604480557a..b574431a031d 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c | |||
@@ -290,6 +290,21 @@ out_attach: | |||
290 | else | 290 | else |
291 | mlog_errno(ret); | 291 | mlog_errno(ret); |
292 | 292 | ||
293 | /* | ||
294 | * In case of error, manually free the allocation and do the iput(). | ||
295 | * We need to do this because error here means no d_instantiate(), | ||
296 | * which means iput() will not be called during dput(dentry). | ||
297 | */ | ||
298 | if (ret < 0 && !alias) { | ||
299 | ocfs2_lock_res_free(&dl->dl_lockres); | ||
300 | BUG_ON(dl->dl_count != 1); | ||
301 | spin_lock(&dentry_attach_lock); | ||
302 | dentry->d_fsdata = NULL; | ||
303 | spin_unlock(&dentry_attach_lock); | ||
304 | kfree(dl); | ||
305 | iput(inode); | ||
306 | } | ||
307 | |||
293 | dput(alias); | 308 | dput(alias); |
294 | 309 | ||
295 | return ret; | 310 | return ret; |
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index e71160cda110..c5752305627c 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
@@ -2697,7 +2697,7 @@ static int ocfs2_dx_dir_index_block(struct inode *dir, | |||
2697 | u32 *num_dx_entries, | 2697 | u32 *num_dx_entries, |
2698 | struct buffer_head *dirent_bh) | 2698 | struct buffer_head *dirent_bh) |
2699 | { | 2699 | { |
2700 | int ret, namelen, i; | 2700 | int ret = 0, namelen, i; |
2701 | char *de_buf, *limit; | 2701 | char *de_buf, *limit; |
2702 | struct ocfs2_dir_entry *de; | 2702 | struct ocfs2_dir_entry *de; |
2703 | struct buffer_head *dx_leaf_bh; | 2703 | struct buffer_head *dx_leaf_bh; |
@@ -2934,7 +2934,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, | |||
2934 | */ | 2934 | */ |
2935 | BUG_ON(alloc > 2); | 2935 | BUG_ON(alloc > 2); |
2936 | 2936 | ||
2937 | ret = ocfs2_reserve_clusters(osb, alloc, &data_ac); | 2937 | ret = ocfs2_reserve_clusters(osb, alloc + dx_alloc, &data_ac); |
2938 | if (ret) { | 2938 | if (ret) { |
2939 | mlog_errno(ret); | 2939 | mlog_errno(ret); |
2940 | goto out; | 2940 | goto out; |
diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c index de3da8eb558c..15713cbb865c 100644 --- a/fs/ocfs2/export.c +++ b/fs/ocfs2/export.c | |||
@@ -100,7 +100,8 @@ static struct dentry *ocfs2_get_dentry(struct super_block *sb, | |||
100 | 100 | ||
101 | /* If the inode allocator bit is clear, this inode must be stale */ | 101 | /* If the inode allocator bit is clear, this inode must be stale */ |
102 | if (!set) { | 102 | if (!set) { |
103 | mlog(0, "inode %llu suballoc bit is clear\n", blkno); | 103 | mlog(0, "inode %llu suballoc bit is clear\n", |
104 | (unsigned long long)blkno); | ||
104 | status = -ESTALE; | 105 | status = -ESTALE; |
105 | goto unlock_nfs_sync; | 106 | goto unlock_nfs_sync; |
106 | } | 107 | } |
@@ -114,7 +115,7 @@ check_err: | |||
114 | if (status < 0) { | 115 | if (status < 0) { |
115 | if (status == -ESTALE) { | 116 | if (status == -ESTALE) { |
116 | mlog(0, "stale inode ino: %llu generation: %u\n", | 117 | mlog(0, "stale inode ino: %llu generation: %u\n", |
117 | blkno, handle->ih_generation); | 118 | (unsigned long long)blkno, handle->ih_generation); |
118 | } | 119 | } |
119 | result = ERR_PTR(status); | 120 | result = ERR_PTR(status); |
120 | goto bail; | 121 | goto bail; |
@@ -129,8 +130,8 @@ check_err: | |||
129 | check_gen: | 130 | check_gen: |
130 | if (handle->ih_generation != inode->i_generation) { | 131 | if (handle->ih_generation != inode->i_generation) { |
131 | iput(inode); | 132 | iput(inode); |
132 | mlog(0, "stale inode ino: %llu generation: %u\n", blkno, | 133 | mlog(0, "stale inode ino: %llu generation: %u\n", |
133 | handle->ih_generation); | 134 | (unsigned long long)blkno, handle->ih_generation); |
134 | result = ERR_PTR(-ESTALE); | 135 | result = ERR_PTR(-ESTALE); |
135 | goto bail; | 136 | goto bail; |
136 | } | 137 | } |
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index 619dd7f6c053..eb7b76331eb7 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h | |||
@@ -437,8 +437,9 @@ static inline int ocfs2_unlink_credits(struct super_block *sb) | |||
437 | } | 437 | } |
438 | 438 | ||
439 | /* dinode + orphan dir dinode + inode alloc dinode + orphan dir entry + | 439 | /* dinode + orphan dir dinode + inode alloc dinode + orphan dir entry + |
440 | * inode alloc group descriptor + orphan dir index leaf */ | 440 | * inode alloc group descriptor + orphan dir index root + |
441 | #define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3) | 441 | * orphan dir index leaf */ |
442 | #define OCFS2_DELETE_INODE_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 4) | ||
442 | 443 | ||
443 | /* dinode update, old dir dinode update, new dir dinode update, old | 444 | /* dinode update, old dir dinode update, new dir dinode update, old |
444 | * dir dir entry, new dir dir entry, dir entry update for renaming | 445 | * dir dir entry, new dir dir entry, dir entry update for renaming |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 2220f93f668b..33464c6b60a2 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -1025,10 +1025,8 @@ static int ocfs2_rename(struct inode *old_dir, | |||
1025 | struct inode *orphan_dir = NULL; | 1025 | struct inode *orphan_dir = NULL; |
1026 | struct ocfs2_dinode *newfe = NULL; | 1026 | struct ocfs2_dinode *newfe = NULL; |
1027 | char orphan_name[OCFS2_ORPHAN_NAMELEN + 1]; | 1027 | char orphan_name[OCFS2_ORPHAN_NAMELEN + 1]; |
1028 | struct buffer_head *orphan_entry_bh = NULL; | ||
1029 | struct buffer_head *newfe_bh = NULL; | 1028 | struct buffer_head *newfe_bh = NULL; |
1030 | struct buffer_head *old_inode_bh = NULL; | 1029 | struct buffer_head *old_inode_bh = NULL; |
1031 | struct buffer_head *insert_entry_bh = NULL; | ||
1032 | struct ocfs2_super *osb = NULL; | 1030 | struct ocfs2_super *osb = NULL; |
1033 | u64 newfe_blkno, old_de_ino; | 1031 | u64 newfe_blkno, old_de_ino; |
1034 | handle_t *handle = NULL; | 1032 | handle_t *handle = NULL; |
@@ -1455,8 +1453,6 @@ bail: | |||
1455 | brelse(old_inode_bh); | 1453 | brelse(old_inode_bh); |
1456 | brelse(old_dir_bh); | 1454 | brelse(old_dir_bh); |
1457 | brelse(new_dir_bh); | 1455 | brelse(new_dir_bh); |
1458 | brelse(orphan_entry_bh); | ||
1459 | brelse(insert_entry_bh); | ||
1460 | 1456 | ||
1461 | mlog_exit(status); | 1457 | mlog_exit(status); |
1462 | 1458 | ||
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index b4ca5911caaf..8439f6b324b9 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -2197,26 +2197,29 @@ static int ocfs2_get_suballoc_slot_bit(struct ocfs2_super *osb, u64 blkno, | |||
2197 | struct buffer_head *inode_bh = NULL; | 2197 | struct buffer_head *inode_bh = NULL; |
2198 | struct ocfs2_dinode *inode_fe; | 2198 | struct ocfs2_dinode *inode_fe; |
2199 | 2199 | ||
2200 | mlog_entry("blkno: %llu\n", blkno); | 2200 | mlog_entry("blkno: %llu\n", (unsigned long long)blkno); |
2201 | 2201 | ||
2202 | /* dirty read disk */ | 2202 | /* dirty read disk */ |
2203 | status = ocfs2_read_blocks_sync(osb, blkno, 1, &inode_bh); | 2203 | status = ocfs2_read_blocks_sync(osb, blkno, 1, &inode_bh); |
2204 | if (status < 0) { | 2204 | if (status < 0) { |
2205 | mlog(ML_ERROR, "read block %llu failed %d\n", blkno, status); | 2205 | mlog(ML_ERROR, "read block %llu failed %d\n", |
2206 | (unsigned long long)blkno, status); | ||
2206 | goto bail; | 2207 | goto bail; |
2207 | } | 2208 | } |
2208 | 2209 | ||
2209 | inode_fe = (struct ocfs2_dinode *) inode_bh->b_data; | 2210 | inode_fe = (struct ocfs2_dinode *) inode_bh->b_data; |
2210 | if (!OCFS2_IS_VALID_DINODE(inode_fe)) { | 2211 | if (!OCFS2_IS_VALID_DINODE(inode_fe)) { |
2211 | mlog(ML_ERROR, "invalid inode %llu requested\n", blkno); | 2212 | mlog(ML_ERROR, "invalid inode %llu requested\n", |
2213 | (unsigned long long)blkno); | ||
2212 | status = -EINVAL; | 2214 | status = -EINVAL; |
2213 | goto bail; | 2215 | goto bail; |
2214 | } | 2216 | } |
2215 | 2217 | ||
2216 | if (le16_to_cpu(inode_fe->i_suballoc_slot) != OCFS2_INVALID_SLOT && | 2218 | if (le16_to_cpu(inode_fe->i_suballoc_slot) != (u16)OCFS2_INVALID_SLOT && |
2217 | (u32)le16_to_cpu(inode_fe->i_suballoc_slot) > osb->max_slots - 1) { | 2219 | (u32)le16_to_cpu(inode_fe->i_suballoc_slot) > osb->max_slots - 1) { |
2218 | mlog(ML_ERROR, "inode %llu has invalid suballoc slot %u\n", | 2220 | mlog(ML_ERROR, "inode %llu has invalid suballoc slot %u\n", |
2219 | blkno, (u32)le16_to_cpu(inode_fe->i_suballoc_slot)); | 2221 | (unsigned long long)blkno, |
2222 | (u32)le16_to_cpu(inode_fe->i_suballoc_slot)); | ||
2220 | status = -EINVAL; | 2223 | status = -EINVAL; |
2221 | goto bail; | 2224 | goto bail; |
2222 | } | 2225 | } |
@@ -2251,7 +2254,8 @@ static int ocfs2_test_suballoc_bit(struct ocfs2_super *osb, | |||
2251 | u64 bg_blkno; | 2254 | u64 bg_blkno; |
2252 | int status; | 2255 | int status; |
2253 | 2256 | ||
2254 | mlog_entry("blkno: %llu bit: %u\n", blkno, (unsigned int)bit); | 2257 | mlog_entry("blkno: %llu bit: %u\n", (unsigned long long)blkno, |
2258 | (unsigned int)bit); | ||
2255 | 2259 | ||
2256 | alloc_fe = (struct ocfs2_dinode *)alloc_bh->b_data; | 2260 | alloc_fe = (struct ocfs2_dinode *)alloc_bh->b_data; |
2257 | if ((bit + 1) > ocfs2_bits_per_group(&alloc_fe->id2.i_chain)) { | 2261 | if ((bit + 1) > ocfs2_bits_per_group(&alloc_fe->id2.i_chain)) { |
@@ -2266,7 +2270,8 @@ static int ocfs2_test_suballoc_bit(struct ocfs2_super *osb, | |||
2266 | status = ocfs2_read_group_descriptor(suballoc, alloc_fe, bg_blkno, | 2270 | status = ocfs2_read_group_descriptor(suballoc, alloc_fe, bg_blkno, |
2267 | &group_bh); | 2271 | &group_bh); |
2268 | if (status < 0) { | 2272 | if (status < 0) { |
2269 | mlog(ML_ERROR, "read group %llu failed %d\n", bg_blkno, status); | 2273 | mlog(ML_ERROR, "read group %llu failed %d\n", |
2274 | (unsigned long long)bg_blkno, status); | ||
2270 | goto bail; | 2275 | goto bail; |
2271 | } | 2276 | } |
2272 | 2277 | ||
@@ -2300,7 +2305,7 @@ int ocfs2_test_inode_bit(struct ocfs2_super *osb, u64 blkno, int *res) | |||
2300 | struct inode *inode_alloc_inode; | 2305 | struct inode *inode_alloc_inode; |
2301 | struct buffer_head *alloc_bh = NULL; | 2306 | struct buffer_head *alloc_bh = NULL; |
2302 | 2307 | ||
2303 | mlog_entry("blkno: %llu", blkno); | 2308 | mlog_entry("blkno: %llu", (unsigned long long)blkno); |
2304 | 2309 | ||
2305 | status = ocfs2_get_suballoc_slot_bit(osb, blkno, &suballoc_slot, | 2310 | status = ocfs2_get_suballoc_slot_bit(osb, blkno, &suballoc_slot, |
2306 | &suballoc_bit); | 2311 | &suballoc_bit); |
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c index 74ea974f5ca6..c6b0302af4c4 100644 --- a/fs/proc/meminfo.c +++ b/fs/proc/meminfo.c | |||
@@ -35,7 +35,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v) | |||
35 | #define K(x) ((x) << (PAGE_SHIFT - 10)) | 35 | #define K(x) ((x) << (PAGE_SHIFT - 10)) |
36 | si_meminfo(&i); | 36 | si_meminfo(&i); |
37 | si_swapinfo(&i); | 37 | si_swapinfo(&i); |
38 | committed = atomic_long_read(&vm_committed_space); | 38 | committed = percpu_counter_read_positive(&vm_committed_as); |
39 | allowed = ((totalram_pages - hugetlb_total_pages()) | 39 | allowed = ((totalram_pages - hugetlb_total_pages()) |
40 | * sysctl_overcommit_ratio / 100) + total_swap_pages; | 40 | * sysctl_overcommit_ratio / 100) + total_swap_pages; |
41 | 41 | ||
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 39e4ad4f59f4..6f61b7cc32e0 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -665,6 +665,10 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
665 | goto out_task; | 665 | goto out_task; |
666 | 666 | ||
667 | ret = 0; | 667 | ret = 0; |
668 | |||
669 | if (!count) | ||
670 | goto out_task; | ||
671 | |||
668 | mm = get_task_mm(task); | 672 | mm = get_task_mm(task); |
669 | if (!mm) | 673 | if (!mm) |
670 | goto out_task; | 674 | goto out_task; |
diff --git a/include/asm-generic/atomic.h b/include/asm-generic/atomic.h index 7abdaa91ccd3..3673a13b6703 100644 --- a/include/asm-generic/atomic.h +++ b/include/asm-generic/atomic.h | |||
@@ -132,9 +132,9 @@ static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u) | |||
132 | #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l)) | 132 | #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l)) |
133 | 133 | ||
134 | #define atomic_long_cmpxchg(l, old, new) \ | 134 | #define atomic_long_cmpxchg(l, old, new) \ |
135 | (atomic_cmpxchg((atomic64_t *)(l), (old), (new))) | 135 | (atomic64_cmpxchg((atomic64_t *)(l), (old), (new))) |
136 | #define atomic_long_xchg(v, new) \ | 136 | #define atomic_long_xchg(v, new) \ |
137 | (atomic_xchg((atomic64_t *)(l), (new))) | 137 | (atomic64_xchg((atomic64_t *)(l), (new))) |
138 | 138 | ||
139 | #else /* BITS_PER_LONG == 64 */ | 139 | #else /* BITS_PER_LONG == 64 */ |
140 | 140 | ||
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index 6638b8148de7..61ee18c1bdb4 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h | |||
@@ -82,7 +82,19 @@ struct linux_binfmt { | |||
82 | int hasvdso; | 82 | int hasvdso; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | extern int register_binfmt(struct linux_binfmt *); | 85 | extern int __register_binfmt(struct linux_binfmt *fmt, int insert); |
86 | |||
87 | /* Registration of default binfmt handlers */ | ||
88 | static inline int register_binfmt(struct linux_binfmt *fmt) | ||
89 | { | ||
90 | return __register_binfmt(fmt, 0); | ||
91 | } | ||
92 | /* Same as above, but adds a new binfmt at the top of the list */ | ||
93 | static inline int insert_binfmt(struct linux_binfmt *fmt) | ||
94 | { | ||
95 | return __register_binfmt(fmt, 1); | ||
96 | } | ||
97 | |||
86 | extern void unregister_binfmt(struct linux_binfmt *); | 98 | extern void unregister_binfmt(struct linux_binfmt *); |
87 | 99 | ||
88 | extern int prepare_binprm(struct linux_binprm *); | 100 | extern int prepare_binprm(struct linux_binprm *); |
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index a9e3b76aa884..25b9ca93d232 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -56,7 +56,7 @@ extern void mem_cgroup_move_lists(struct page *page, | |||
56 | enum lru_list from, enum lru_list to); | 56 | enum lru_list from, enum lru_list to); |
57 | extern void mem_cgroup_uncharge_page(struct page *page); | 57 | extern void mem_cgroup_uncharge_page(struct page *page); |
58 | extern void mem_cgroup_uncharge_cache_page(struct page *page); | 58 | extern void mem_cgroup_uncharge_cache_page(struct page *page); |
59 | extern int mem_cgroup_shrink_usage(struct page *page, | 59 | extern int mem_cgroup_shmem_charge_fallback(struct page *page, |
60 | struct mm_struct *mm, gfp_t gfp_mask); | 60 | struct mm_struct *mm, gfp_t gfp_mask); |
61 | 61 | ||
62 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, | 62 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, |
@@ -155,7 +155,7 @@ static inline void mem_cgroup_uncharge_cache_page(struct page *page) | |||
155 | { | 155 | { |
156 | } | 156 | } |
157 | 157 | ||
158 | static inline int mem_cgroup_shrink_usage(struct page *page, | 158 | static inline int mem_cgroup_shmem_charge_fallback(struct page *page, |
159 | struct mm_struct *mm, gfp_t gfp_mask) | 159 | struct mm_struct *mm, gfp_t gfp_mask) |
160 | { | 160 | { |
161 | return 0; | 161 | return 0; |
diff --git a/include/linux/mman.h b/include/linux/mman.h index 30d1073bac3b..9872d6ca58ae 100644 --- a/include/linux/mman.h +++ b/include/linux/mman.h | |||
@@ -12,21 +12,18 @@ | |||
12 | 12 | ||
13 | #ifdef __KERNEL__ | 13 | #ifdef __KERNEL__ |
14 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
15 | #include <linux/percpu_counter.h> | ||
15 | 16 | ||
16 | #include <asm/atomic.h> | 17 | #include <asm/atomic.h> |
17 | 18 | ||
18 | extern int sysctl_overcommit_memory; | 19 | extern int sysctl_overcommit_memory; |
19 | extern int sysctl_overcommit_ratio; | 20 | extern int sysctl_overcommit_ratio; |
20 | extern atomic_long_t vm_committed_space; | 21 | extern struct percpu_counter vm_committed_as; |
21 | 22 | ||
22 | #ifdef CONFIG_SMP | ||
23 | extern void vm_acct_memory(long pages); | ||
24 | #else | ||
25 | static inline void vm_acct_memory(long pages) | 23 | static inline void vm_acct_memory(long pages) |
26 | { | 24 | { |
27 | atomic_long_add(pages, &vm_committed_space); | 25 | percpu_counter_add(&vm_committed_as, pages); |
28 | } | 26 | } |
29 | #endif | ||
30 | 27 | ||
31 | static inline void vm_unacct_memory(long pages) | 28 | static inline void vm_unacct_memory(long pages) |
32 | { | 29 | { |
diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h index 3d327b67d7e2..908406651330 100644 --- a/include/linux/of_platform.h +++ b/include/linux/of_platform.h | |||
@@ -51,6 +51,16 @@ extern int of_register_driver(struct of_platform_driver *drv, | |||
51 | struct bus_type *bus); | 51 | struct bus_type *bus); |
52 | extern void of_unregister_driver(struct of_platform_driver *drv); | 52 | extern void of_unregister_driver(struct of_platform_driver *drv); |
53 | 53 | ||
54 | /* Platform drivers register/unregister */ | ||
55 | static inline int of_register_platform_driver(struct of_platform_driver *drv) | ||
56 | { | ||
57 | return of_register_driver(drv, &of_platform_bus_type); | ||
58 | } | ||
59 | static inline void of_unregister_platform_driver(struct of_platform_driver *drv) | ||
60 | { | ||
61 | of_unregister_driver(drv); | ||
62 | } | ||
63 | |||
54 | #include <asm/of_platform.h> | 64 | #include <asm/of_platform.h> |
55 | 65 | ||
56 | extern struct of_device *of_find_device_by_node(struct device_node *np); | 66 | extern struct of_device *of_find_device_by_node(struct device_node *np); |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e3d2c7dd59b9..ea78fa101ad6 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -103,6 +103,9 @@ static unsigned long one_ul = 1; | |||
103 | static int one_hundred = 100; | 103 | static int one_hundred = 100; |
104 | static int one_thousand = 1000; | 104 | static int one_thousand = 1000; |
105 | 105 | ||
106 | /* this is needed for the proc_doulongvec_minmax of vm_dirty_bytes */ | ||
107 | static unsigned long dirty_bytes_min = 2 * PAGE_SIZE; | ||
108 | |||
106 | /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ | 109 | /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ |
107 | static int maxolduid = 65535; | 110 | static int maxolduid = 65535; |
108 | static int minolduid; | 111 | static int minolduid; |
@@ -1006,7 +1009,7 @@ static struct ctl_table vm_table[] = { | |||
1006 | .mode = 0644, | 1009 | .mode = 0644, |
1007 | .proc_handler = &dirty_bytes_handler, | 1010 | .proc_handler = &dirty_bytes_handler, |
1008 | .strategy = &sysctl_intvec, | 1011 | .strategy = &sysctl_intvec, |
1009 | .extra1 = &one_ul, | 1012 | .extra1 = &dirty_bytes_min, |
1010 | }, | 1013 | }, |
1011 | { | 1014 | { |
1012 | .procname = "dirty_writeback_centisecs", | 1015 | .procname = "dirty_writeback_centisecs", |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e44fb0fbb80e..01c2d8f14685 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1024,9 +1024,7 @@ static struct mem_cgroup *try_get_mem_cgroup_from_swapcache(struct page *page) | |||
1024 | return NULL; | 1024 | return NULL; |
1025 | 1025 | ||
1026 | pc = lookup_page_cgroup(page); | 1026 | pc = lookup_page_cgroup(page); |
1027 | /* | 1027 | lock_page_cgroup(pc); |
1028 | * Used bit of swapcache is solid under page lock. | ||
1029 | */ | ||
1030 | if (PageCgroupUsed(pc)) { | 1028 | if (PageCgroupUsed(pc)) { |
1031 | mem = pc->mem_cgroup; | 1029 | mem = pc->mem_cgroup; |
1032 | if (mem && !css_tryget(&mem->css)) | 1030 | if (mem && !css_tryget(&mem->css)) |
@@ -1040,6 +1038,7 @@ static struct mem_cgroup *try_get_mem_cgroup_from_swapcache(struct page *page) | |||
1040 | mem = NULL; | 1038 | mem = NULL; |
1041 | rcu_read_unlock(); | 1039 | rcu_read_unlock(); |
1042 | } | 1040 | } |
1041 | unlock_page_cgroup(pc); | ||
1043 | return mem; | 1042 | return mem; |
1044 | } | 1043 | } |
1045 | 1044 | ||
@@ -1618,37 +1617,28 @@ void mem_cgroup_end_migration(struct mem_cgroup *mem, | |||
1618 | } | 1617 | } |
1619 | 1618 | ||
1620 | /* | 1619 | /* |
1621 | * A call to try to shrink memory usage under specified resource controller. | 1620 | * A call to try to shrink memory usage on charge failure at shmem's swapin. |
1622 | * This is typically used for page reclaiming for shmem for reducing side | 1621 | * Calling hierarchical_reclaim is not enough because we should update |
1623 | * effect of page allocation from shmem, which is used by some mem_cgroup. | 1622 | * last_oom_jiffies to prevent pagefault_out_of_memory from invoking global OOM. |
1623 | * Moreover considering hierarchy, we should reclaim from the mem_over_limit, | ||
1624 | * not from the memcg which this page would be charged to. | ||
1625 | * try_charge_swapin does all of these works properly. | ||
1624 | */ | 1626 | */ |
1625 | int mem_cgroup_shrink_usage(struct page *page, | 1627 | int mem_cgroup_shmem_charge_fallback(struct page *page, |
1626 | struct mm_struct *mm, | 1628 | struct mm_struct *mm, |
1627 | gfp_t gfp_mask) | 1629 | gfp_t gfp_mask) |
1628 | { | 1630 | { |
1629 | struct mem_cgroup *mem = NULL; | 1631 | struct mem_cgroup *mem = NULL; |
1630 | int progress = 0; | 1632 | int ret; |
1631 | int retry = MEM_CGROUP_RECLAIM_RETRIES; | ||
1632 | 1633 | ||
1633 | if (mem_cgroup_disabled()) | 1634 | if (mem_cgroup_disabled()) |
1634 | return 0; | 1635 | return 0; |
1635 | if (page) | ||
1636 | mem = try_get_mem_cgroup_from_swapcache(page); | ||
1637 | if (!mem && mm) | ||
1638 | mem = try_get_mem_cgroup_from_mm(mm); | ||
1639 | if (unlikely(!mem)) | ||
1640 | return 0; | ||
1641 | 1636 | ||
1642 | do { | 1637 | ret = mem_cgroup_try_charge_swapin(mm, page, gfp_mask, &mem); |
1643 | progress = mem_cgroup_hierarchical_reclaim(mem, | 1638 | if (!ret) |
1644 | gfp_mask, true, false); | 1639 | mem_cgroup_cancel_charge_swapin(mem); /* it does !mem check */ |
1645 | progress += mem_cgroup_check_under_limit(mem); | ||
1646 | } while (!progress && --retry); | ||
1647 | 1640 | ||
1648 | css_put(&mem->css); | 1641 | return ret; |
1649 | if (!retry) | ||
1650 | return -ENOMEM; | ||
1651 | return 0; | ||
1652 | } | 1642 | } |
1653 | 1643 | ||
1654 | static DEFINE_MUTEX(set_limit_mutex); | 1644 | static DEFINE_MUTEX(set_limit_mutex); |
diff --git a/mm/memory.c b/mm/memory.c index cf6873e91c6a..4126dd16778c 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -1971,6 +1971,15 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1971 | ret = tmp; | 1971 | ret = tmp; |
1972 | goto unwritable_page; | 1972 | goto unwritable_page; |
1973 | } | 1973 | } |
1974 | if (unlikely(!(tmp & VM_FAULT_LOCKED))) { | ||
1975 | lock_page(old_page); | ||
1976 | if (!old_page->mapping) { | ||
1977 | ret = 0; /* retry the fault */ | ||
1978 | unlock_page(old_page); | ||
1979 | goto unwritable_page; | ||
1980 | } | ||
1981 | } else | ||
1982 | VM_BUG_ON(!PageLocked(old_page)); | ||
1974 | 1983 | ||
1975 | /* | 1984 | /* |
1976 | * Since we dropped the lock we need to revalidate | 1985 | * Since we dropped the lock we need to revalidate |
@@ -1980,9 +1989,11 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
1980 | */ | 1989 | */ |
1981 | page_table = pte_offset_map_lock(mm, pmd, address, | 1990 | page_table = pte_offset_map_lock(mm, pmd, address, |
1982 | &ptl); | 1991 | &ptl); |
1983 | page_cache_release(old_page); | 1992 | if (!pte_same(*page_table, orig_pte)) { |
1984 | if (!pte_same(*page_table, orig_pte)) | 1993 | unlock_page(old_page); |
1994 | page_cache_release(old_page); | ||
1985 | goto unlock; | 1995 | goto unlock; |
1996 | } | ||
1986 | 1997 | ||
1987 | page_mkwrite = 1; | 1998 | page_mkwrite = 1; |
1988 | } | 1999 | } |
@@ -2094,9 +2105,6 @@ gotten: | |||
2094 | unlock: | 2105 | unlock: |
2095 | pte_unmap_unlock(page_table, ptl); | 2106 | pte_unmap_unlock(page_table, ptl); |
2096 | if (dirty_page) { | 2107 | if (dirty_page) { |
2097 | if (vma->vm_file) | ||
2098 | file_update_time(vma->vm_file); | ||
2099 | |||
2100 | /* | 2108 | /* |
2101 | * Yes, Virginia, this is actually required to prevent a race | 2109 | * Yes, Virginia, this is actually required to prevent a race |
2102 | * with clear_page_dirty_for_io() from clearing the page dirty | 2110 | * with clear_page_dirty_for_io() from clearing the page dirty |
@@ -2105,16 +2113,41 @@ unlock: | |||
2105 | * | 2113 | * |
2106 | * do_no_page is protected similarly. | 2114 | * do_no_page is protected similarly. |
2107 | */ | 2115 | */ |
2108 | wait_on_page_locked(dirty_page); | 2116 | if (!page_mkwrite) { |
2109 | set_page_dirty_balance(dirty_page, page_mkwrite); | 2117 | wait_on_page_locked(dirty_page); |
2118 | set_page_dirty_balance(dirty_page, page_mkwrite); | ||
2119 | } | ||
2110 | put_page(dirty_page); | 2120 | put_page(dirty_page); |
2121 | if (page_mkwrite) { | ||
2122 | struct address_space *mapping = dirty_page->mapping; | ||
2123 | |||
2124 | set_page_dirty(dirty_page); | ||
2125 | unlock_page(dirty_page); | ||
2126 | page_cache_release(dirty_page); | ||
2127 | if (mapping) { | ||
2128 | /* | ||
2129 | * Some device drivers do not set page.mapping | ||
2130 | * but still dirty their pages | ||
2131 | */ | ||
2132 | balance_dirty_pages_ratelimited(mapping); | ||
2133 | } | ||
2134 | } | ||
2135 | |||
2136 | /* file_update_time outside page_lock */ | ||
2137 | if (vma->vm_file) | ||
2138 | file_update_time(vma->vm_file); | ||
2111 | } | 2139 | } |
2112 | return ret; | 2140 | return ret; |
2113 | oom_free_new: | 2141 | oom_free_new: |
2114 | page_cache_release(new_page); | 2142 | page_cache_release(new_page); |
2115 | oom: | 2143 | oom: |
2116 | if (old_page) | 2144 | if (old_page) { |
2145 | if (page_mkwrite) { | ||
2146 | unlock_page(old_page); | ||
2147 | page_cache_release(old_page); | ||
2148 | } | ||
2117 | page_cache_release(old_page); | 2149 | page_cache_release(old_page); |
2150 | } | ||
2118 | return VM_FAULT_OOM; | 2151 | return VM_FAULT_OOM; |
2119 | 2152 | ||
2120 | unwritable_page: | 2153 | unwritable_page: |
@@ -2458,8 +2491,7 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2458 | 2491 | ||
2459 | if (mem_cgroup_try_charge_swapin(mm, page, GFP_KERNEL, &ptr)) { | 2492 | if (mem_cgroup_try_charge_swapin(mm, page, GFP_KERNEL, &ptr)) { |
2460 | ret = VM_FAULT_OOM; | 2493 | ret = VM_FAULT_OOM; |
2461 | unlock_page(page); | 2494 | goto out_page; |
2462 | goto out; | ||
2463 | } | 2495 | } |
2464 | 2496 | ||
2465 | /* | 2497 | /* |
@@ -2521,6 +2553,7 @@ out: | |||
2521 | out_nomap: | 2553 | out_nomap: |
2522 | mem_cgroup_cancel_charge_swapin(ptr); | 2554 | mem_cgroup_cancel_charge_swapin(ptr); |
2523 | pte_unmap_unlock(page_table, ptl); | 2555 | pte_unmap_unlock(page_table, ptl); |
2556 | out_page: | ||
2524 | unlock_page(page); | 2557 | unlock_page(page); |
2525 | page_cache_release(page); | 2558 | page_cache_release(page); |
2526 | return ret; | 2559 | return ret; |
@@ -2664,27 +2697,22 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2664 | int tmp; | 2697 | int tmp; |
2665 | 2698 | ||
2666 | unlock_page(page); | 2699 | unlock_page(page); |
2667 | vmf.flags |= FAULT_FLAG_MKWRITE; | 2700 | vmf.flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE; |
2668 | tmp = vma->vm_ops->page_mkwrite(vma, &vmf); | 2701 | tmp = vma->vm_ops->page_mkwrite(vma, &vmf); |
2669 | if (unlikely(tmp & | 2702 | if (unlikely(tmp & |
2670 | (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) { | 2703 | (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) { |
2671 | ret = tmp; | 2704 | ret = tmp; |
2672 | anon = 1; /* no anon but release vmf.page */ | 2705 | goto unwritable_page; |
2673 | goto out_unlocked; | ||
2674 | } | ||
2675 | lock_page(page); | ||
2676 | /* | ||
2677 | * XXX: this is not quite right (racy vs | ||
2678 | * invalidate) to unlock and relock the page | ||
2679 | * like this, however a better fix requires | ||
2680 | * reworking page_mkwrite locking API, which | ||
2681 | * is better done later. | ||
2682 | */ | ||
2683 | if (!page->mapping) { | ||
2684 | ret = 0; | ||
2685 | anon = 1; /* no anon but release vmf.page */ | ||
2686 | goto out; | ||
2687 | } | 2706 | } |
2707 | if (unlikely(!(tmp & VM_FAULT_LOCKED))) { | ||
2708 | lock_page(page); | ||
2709 | if (!page->mapping) { | ||
2710 | ret = 0; /* retry the fault */ | ||
2711 | unlock_page(page); | ||
2712 | goto unwritable_page; | ||
2713 | } | ||
2714 | } else | ||
2715 | VM_BUG_ON(!PageLocked(page)); | ||
2688 | page_mkwrite = 1; | 2716 | page_mkwrite = 1; |
2689 | } | 2717 | } |
2690 | } | 2718 | } |
@@ -2736,19 +2764,35 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2736 | pte_unmap_unlock(page_table, ptl); | 2764 | pte_unmap_unlock(page_table, ptl); |
2737 | 2765 | ||
2738 | out: | 2766 | out: |
2739 | unlock_page(vmf.page); | 2767 | if (dirty_page) { |
2740 | out_unlocked: | 2768 | struct address_space *mapping = page->mapping; |
2741 | if (anon) | ||
2742 | page_cache_release(vmf.page); | ||
2743 | else if (dirty_page) { | ||
2744 | if (vma->vm_file) | ||
2745 | file_update_time(vma->vm_file); | ||
2746 | 2769 | ||
2747 | set_page_dirty_balance(dirty_page, page_mkwrite); | 2770 | if (set_page_dirty(dirty_page)) |
2771 | page_mkwrite = 1; | ||
2772 | unlock_page(dirty_page); | ||
2748 | put_page(dirty_page); | 2773 | put_page(dirty_page); |
2774 | if (page_mkwrite && mapping) { | ||
2775 | /* | ||
2776 | * Some device drivers do not set page.mapping but still | ||
2777 | * dirty their pages | ||
2778 | */ | ||
2779 | balance_dirty_pages_ratelimited(mapping); | ||
2780 | } | ||
2781 | |||
2782 | /* file_update_time outside page_lock */ | ||
2783 | if (vma->vm_file) | ||
2784 | file_update_time(vma->vm_file); | ||
2785 | } else { | ||
2786 | unlock_page(vmf.page); | ||
2787 | if (anon) | ||
2788 | page_cache_release(vmf.page); | ||
2749 | } | 2789 | } |
2750 | 2790 | ||
2751 | return ret; | 2791 | return ret; |
2792 | |||
2793 | unwritable_page: | ||
2794 | page_cache_release(page); | ||
2795 | return ret; | ||
2752 | } | 2796 | } |
2753 | 2797 | ||
2754 | static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma, | 2798 | static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma, |
@@ -85,7 +85,7 @@ EXPORT_SYMBOL(vm_get_page_prot); | |||
85 | int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ | 85 | int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ |
86 | int sysctl_overcommit_ratio = 50; /* default is 50% */ | 86 | int sysctl_overcommit_ratio = 50; /* default is 50% */ |
87 | int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; | 87 | int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT; |
88 | atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0); | 88 | struct percpu_counter vm_committed_as; |
89 | 89 | ||
90 | /* | 90 | /* |
91 | * Check that a process has enough memory to allocate a new virtual | 91 | * Check that a process has enough memory to allocate a new virtual |
@@ -179,11 +179,7 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | |||
179 | if (mm) | 179 | if (mm) |
180 | allowed -= mm->total_vm / 32; | 180 | allowed -= mm->total_vm / 32; |
181 | 181 | ||
182 | /* | 182 | if (percpu_counter_read_positive(&vm_committed_as) < allowed) |
183 | * cast `allowed' as a signed long because vm_committed_space | ||
184 | * sometimes has a negative value | ||
185 | */ | ||
186 | if (atomic_long_read(&vm_committed_space) < (long)allowed) | ||
187 | return 0; | 183 | return 0; |
188 | error: | 184 | error: |
189 | vm_unacct_memory(pages); | 185 | vm_unacct_memory(pages); |
@@ -2481,4 +2477,8 @@ void mm_drop_all_locks(struct mm_struct *mm) | |||
2481 | */ | 2477 | */ |
2482 | void __init mmap_init(void) | 2478 | void __init mmap_init(void) |
2483 | { | 2479 | { |
2480 | int ret; | ||
2481 | |||
2482 | ret = percpu_counter_init(&vm_committed_as, 0); | ||
2483 | VM_BUG_ON(ret); | ||
2484 | } | 2484 | } |
diff --git a/mm/nommu.c b/mm/nommu.c index 72eda4aee2cb..809998aa7b50 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -62,7 +62,7 @@ void *high_memory; | |||
62 | struct page *mem_map; | 62 | struct page *mem_map; |
63 | unsigned long max_mapnr; | 63 | unsigned long max_mapnr; |
64 | unsigned long num_physpages; | 64 | unsigned long num_physpages; |
65 | atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0); | 65 | struct percpu_counter vm_committed_as; |
66 | int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ | 66 | int sysctl_overcommit_memory = OVERCOMMIT_GUESS; /* heuristic overcommit */ |
67 | int sysctl_overcommit_ratio = 50; /* default is 50% */ | 67 | int sysctl_overcommit_ratio = 50; /* default is 50% */ |
68 | int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; | 68 | int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; |
@@ -463,6 +463,10 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) | |||
463 | */ | 463 | */ |
464 | void __init mmap_init(void) | 464 | void __init mmap_init(void) |
465 | { | 465 | { |
466 | int ret; | ||
467 | |||
468 | ret = percpu_counter_init(&vm_committed_as, 0); | ||
469 | VM_BUG_ON(ret); | ||
466 | vm_region_jar = KMEM_CACHE(vm_region, SLAB_PANIC); | 470 | vm_region_jar = KMEM_CACHE(vm_region, SLAB_PANIC); |
467 | } | 471 | } |
468 | 472 | ||
@@ -1847,12 +1851,9 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | |||
1847 | if (mm) | 1851 | if (mm) |
1848 | allowed -= mm->total_vm / 32; | 1852 | allowed -= mm->total_vm / 32; |
1849 | 1853 | ||
1850 | /* | 1854 | if (percpu_counter_read_positive(&vm_committed_as) < allowed) |
1851 | * cast `allowed' as a signed long because vm_committed_space | ||
1852 | * sometimes has a negative value | ||
1853 | */ | ||
1854 | if (atomic_long_read(&vm_committed_space) < (long)allowed) | ||
1855 | return 0; | 1855 | return 0; |
1856 | |||
1856 | error: | 1857 | error: |
1857 | vm_unacct_memory(pages); | 1858 | vm_unacct_memory(pages); |
1858 | 1859 | ||
diff --git a/mm/shmem.c b/mm/shmem.c index f9cb20ebb990..b25f95ce3db7 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1340,8 +1340,12 @@ repeat: | |||
1340 | shmem_swp_unmap(entry); | 1340 | shmem_swp_unmap(entry); |
1341 | spin_unlock(&info->lock); | 1341 | spin_unlock(&info->lock); |
1342 | if (error == -ENOMEM) { | 1342 | if (error == -ENOMEM) { |
1343 | /* allow reclaim from this memory cgroup */ | 1343 | /* |
1344 | error = mem_cgroup_shrink_usage(swappage, | 1344 | * reclaim from proper memory cgroup and |
1345 | * call memcg's OOM if needed. | ||
1346 | */ | ||
1347 | error = mem_cgroup_shmem_charge_fallback( | ||
1348 | swappage, | ||
1345 | current->mm, | 1349 | current->mm, |
1346 | gfp); | 1350 | gfp); |
1347 | if (error) { | 1351 | if (error) { |
@@ -491,49 +491,6 @@ unsigned pagevec_lookup_tag(struct pagevec *pvec, struct address_space *mapping, | |||
491 | 491 | ||
492 | EXPORT_SYMBOL(pagevec_lookup_tag); | 492 | EXPORT_SYMBOL(pagevec_lookup_tag); |
493 | 493 | ||
494 | #ifdef CONFIG_SMP | ||
495 | /* | ||
496 | * We tolerate a little inaccuracy to avoid ping-ponging the counter between | ||
497 | * CPUs | ||
498 | */ | ||
499 | #define ACCT_THRESHOLD max(16, NR_CPUS * 2) | ||
500 | |||
501 | static DEFINE_PER_CPU(long, committed_space); | ||
502 | |||
503 | void vm_acct_memory(long pages) | ||
504 | { | ||
505 | long *local; | ||
506 | |||
507 | preempt_disable(); | ||
508 | local = &__get_cpu_var(committed_space); | ||
509 | *local += pages; | ||
510 | if (*local > ACCT_THRESHOLD || *local < -ACCT_THRESHOLD) { | ||
511 | atomic_long_add(*local, &vm_committed_space); | ||
512 | *local = 0; | ||
513 | } | ||
514 | preempt_enable(); | ||
515 | } | ||
516 | |||
517 | #ifdef CONFIG_HOTPLUG_CPU | ||
518 | |||
519 | /* Drop the CPU's cached committed space back into the central pool. */ | ||
520 | static int cpu_swap_callback(struct notifier_block *nfb, | ||
521 | unsigned long action, | ||
522 | void *hcpu) | ||
523 | { | ||
524 | long *committed; | ||
525 | |||
526 | committed = &per_cpu(committed_space, (long)hcpu); | ||
527 | if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) { | ||
528 | atomic_long_add(*committed, &vm_committed_space); | ||
529 | *committed = 0; | ||
530 | drain_cpu_pagevecs((long)hcpu); | ||
531 | } | ||
532 | return NOTIFY_OK; | ||
533 | } | ||
534 | #endif /* CONFIG_HOTPLUG_CPU */ | ||
535 | #endif /* CONFIG_SMP */ | ||
536 | |||
537 | /* | 494 | /* |
538 | * Perform any setup for the swap system | 495 | * Perform any setup for the swap system |
539 | */ | 496 | */ |
@@ -554,7 +511,4 @@ void __init swap_setup(void) | |||
554 | * Right now other parts of the system means that we | 511 | * Right now other parts of the system means that we |
555 | * _really_ don't want to cluster much more | 512 | * _really_ don't want to cluster much more |
556 | */ | 513 | */ |
557 | #ifdef CONFIG_HOTPLUG_CPU | ||
558 | hotcpu_notifier(cpu_swap_callback, 0); | ||
559 | #endif | ||
560 | } | 514 | } |
diff --git a/mm/vmscan.c b/mm/vmscan.c index eac9577941f9..5fa3eda1f03f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1471,7 +1471,7 @@ static void shrink_zone(int priority, struct zone *zone, | |||
1471 | 1471 | ||
1472 | for_each_evictable_lru(l) { | 1472 | for_each_evictable_lru(l) { |
1473 | int file = is_file_lru(l); | 1473 | int file = is_file_lru(l); |
1474 | int scan; | 1474 | unsigned long scan; |
1475 | 1475 | ||
1476 | scan = zone_nr_pages(zone, sc, l); | 1476 | scan = zone_nr_pages(zone, sc, l); |
1477 | if (priority) { | 1477 | if (priority) { |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index 0f11870116dc..3208a3a7e7fe 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -1411,7 +1411,8 @@ sub dump_struct($$) { | |||
1411 | my $file = shift; | 1411 | my $file = shift; |
1412 | my $nested; | 1412 | my $nested; |
1413 | 1413 | ||
1414 | if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) { | 1414 | if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) { |
1415 | #my $decl_type = $1; | ||
1415 | $declaration_name = $2; | 1416 | $declaration_name = $2; |
1416 | my $members = $3; | 1417 | my $members = $3; |
1417 | 1418 | ||
@@ -1420,8 +1421,8 @@ sub dump_struct($$) { | |||
1420 | $nested = $1; | 1421 | $nested = $1; |
1421 | 1422 | ||
1422 | # ignore members marked private: | 1423 | # ignore members marked private: |
1423 | $members =~ s/\/\*.*?private:.*?public:.*?\*\///gos; | 1424 | $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gos; |
1424 | $members =~ s/\/\*.*?private:.*//gos; | 1425 | $members =~ s/\/\*\s*private:.*//gos; |
1425 | # strip comments: | 1426 | # strip comments: |
1426 | $members =~ s/\/\*.*?\*\///gos; | 1427 | $members =~ s/\/\*.*?\*\///gos; |
1427 | $nested =~ s/\/\*.*?\*\///gos; | 1428 | $nested =~ s/\/\*.*?\*\///gos; |