Annotation of /trunk/kernel26-alx/patches-2.6.27-r3/0117-2.6.27.18-all-fixes.patch
Parent Directory | Revision Log
Revision 1176 -
(hide annotations)
(download)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 59641 byte(s)
Thu Oct 14 15:11:06 2010 UTC (13 years, 11 months ago) by niro
File size: 59641 byte(s)
-2.6.27-alx-r3: new magellan 0.5.2 kernel
1 | niro | 1176 | diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c |
2 | index 3e80aa3..a6a4310 100644 | ||
3 | --- a/arch/powerpc/kernel/signal_32.c | ||
4 | +++ b/arch/powerpc/kernel/signal_32.c | ||
5 | @@ -410,7 +410,7 @@ inline unsigned long copy_fpr_from_user(struct task_struct *task, | ||
6 | * altivec/spe instructions at some point. | ||
7 | */ | ||
8 | static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | ||
9 | - int sigret) | ||
10 | + int sigret, int ctx_has_vsx_region) | ||
11 | { | ||
12 | unsigned long msr = regs->msr; | ||
13 | |||
14 | @@ -451,7 +451,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | ||
15 | * the saved MSR value to indicate that frame->mc_vregs | ||
16 | * contains valid data | ||
17 | */ | ||
18 | - if (current->thread.used_vsr) { | ||
19 | + if (current->thread.used_vsr && ctx_has_vsx_region) { | ||
20 | __giveup_vsx(current); | ||
21 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) | ||
22 | return 1; | ||
23 | @@ -858,11 +858,11 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | ||
24 | frame = &rt_sf->uc.uc_mcontext; | ||
25 | addr = frame; | ||
26 | if (vdso32_rt_sigtramp && current->mm->context.vdso_base) { | ||
27 | - if (save_user_regs(regs, frame, 0)) | ||
28 | + if (save_user_regs(regs, frame, 0, 1)) | ||
29 | goto badframe; | ||
30 | regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp; | ||
31 | } else { | ||
32 | - if (save_user_regs(regs, frame, __NR_rt_sigreturn)) | ||
33 | + if (save_user_regs(regs, frame, __NR_rt_sigreturn, 1)) | ||
34 | goto badframe; | ||
35 | regs->link = (unsigned long) frame->tramp; | ||
36 | } | ||
37 | @@ -936,12 +936,13 @@ long sys_swapcontext(struct ucontext __user *old_ctx, | ||
38 | int ctx_size, int r6, int r7, int r8, struct pt_regs *regs) | ||
39 | { | ||
40 | unsigned char tmp; | ||
41 | + int ctx_has_vsx_region = 0; | ||
42 | |||
43 | #ifdef CONFIG_PPC64 | ||
44 | unsigned long new_msr = 0; | ||
45 | |||
46 | if (new_ctx && | ||
47 | - __get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR])) | ||
48 | + get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR])) | ||
49 | return -EFAULT; | ||
50 | /* | ||
51 | * Check that the context is not smaller than the original | ||
52 | @@ -956,16 +957,9 @@ long sys_swapcontext(struct ucontext __user *old_ctx, | ||
53 | if ((ctx_size < sizeof(struct ucontext)) && | ||
54 | (new_msr & MSR_VSX)) | ||
55 | return -EINVAL; | ||
56 | -#ifdef CONFIG_VSX | ||
57 | - /* | ||
58 | - * If userspace doesn't provide enough room for VSX data, | ||
59 | - * but current thread has used VSX, we don't have anywhere | ||
60 | - * to store the full context back into. | ||
61 | - */ | ||
62 | - if ((ctx_size < sizeof(struct ucontext)) && | ||
63 | - (current->thread.used_vsr && old_ctx)) | ||
64 | - return -EINVAL; | ||
65 | -#endif | ||
66 | + /* Does the context have enough room to store VSX data? */ | ||
67 | + if (ctx_size >= sizeof(struct ucontext)) | ||
68 | + ctx_has_vsx_region = 1; | ||
69 | #else | ||
70 | /* Context size is for future use. Right now, we only make sure | ||
71 | * we are passed something we understand | ||
72 | @@ -985,17 +979,17 @@ long sys_swapcontext(struct ucontext __user *old_ctx, | ||
73 | */ | ||
74 | mctx = (struct mcontext __user *) | ||
75 | ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL); | ||
76 | - if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx)) | ||
77 | - || save_user_regs(regs, mctx, 0) | ||
78 | + if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size) | ||
79 | + || save_user_regs(regs, mctx, 0, ctx_has_vsx_region) | ||
80 | || put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked) | ||
81 | || __put_user(to_user_ptr(mctx), &old_ctx->uc_regs)) | ||
82 | return -EFAULT; | ||
83 | } | ||
84 | if (new_ctx == NULL) | ||
85 | return 0; | ||
86 | - if (!access_ok(VERIFY_READ, new_ctx, sizeof(*new_ctx)) | ||
87 | + if (!access_ok(VERIFY_READ, new_ctx, ctx_size) | ||
88 | || __get_user(tmp, (u8 __user *) new_ctx) | ||
89 | - || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1)) | ||
90 | + || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1)) | ||
91 | return -EFAULT; | ||
92 | |||
93 | /* | ||
94 | @@ -1196,11 +1190,11 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka, | ||
95 | goto badframe; | ||
96 | |||
97 | if (vdso32_sigtramp && current->mm->context.vdso_base) { | ||
98 | - if (save_user_regs(regs, &frame->mctx, 0)) | ||
99 | + if (save_user_regs(regs, &frame->mctx, 0, 1)) | ||
100 | goto badframe; | ||
101 | regs->link = current->mm->context.vdso_base + vdso32_sigtramp; | ||
102 | } else { | ||
103 | - if (save_user_regs(regs, &frame->mctx, __NR_sigreturn)) | ||
104 | + if (save_user_regs(regs, &frame->mctx, __NR_sigreturn, 1)) | ||
105 | goto badframe; | ||
106 | regs->link = (unsigned long) frame->mctx.tramp; | ||
107 | } | ||
108 | diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c | ||
109 | index 65ad925..e4acdbd 100644 | ||
110 | --- a/arch/powerpc/kernel/signal_64.c | ||
111 | +++ b/arch/powerpc/kernel/signal_64.c | ||
112 | @@ -74,7 +74,8 @@ static const char fmt64[] = KERN_INFO \ | ||
113 | */ | ||
114 | |||
115 | static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | ||
116 | - int signr, sigset_t *set, unsigned long handler) | ||
117 | + int signr, sigset_t *set, unsigned long handler, | ||
118 | + int ctx_has_vsx_region) | ||
119 | { | ||
120 | /* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the | ||
121 | * process never used altivec yet (MSR_VEC is zero in pt_regs of | ||
122 | @@ -121,7 +122,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | ||
123 | * then out to userspace. Update v_regs to point after the | ||
124 | * VMX data. | ||
125 | */ | ||
126 | - if (current->thread.used_vsr) { | ||
127 | + if (current->thread.used_vsr && ctx_has_vsx_region) { | ||
128 | __giveup_vsx(current); | ||
129 | v_regs += ELF_NVRREG; | ||
130 | err |= copy_vsx_to_user(v_regs, current); | ||
131 | @@ -284,9 +285,10 @@ int sys_swapcontext(struct ucontext __user *old_ctx, | ||
132 | unsigned char tmp; | ||
133 | sigset_t set; | ||
134 | unsigned long new_msr = 0; | ||
135 | + int ctx_has_vsx_region = 0; | ||
136 | |||
137 | if (new_ctx && | ||
138 | - __get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR])) | ||
139 | + get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR])) | ||
140 | return -EFAULT; | ||
141 | /* | ||
142 | * Check that the context is not smaller than the original | ||
143 | @@ -301,28 +303,23 @@ int sys_swapcontext(struct ucontext __user *old_ctx, | ||
144 | if ((ctx_size < sizeof(struct ucontext)) && | ||
145 | (new_msr & MSR_VSX)) | ||
146 | return -EINVAL; | ||
147 | -#ifdef CONFIG_VSX | ||
148 | - /* | ||
149 | - * If userspace doesn't provide enough room for VSX data, | ||
150 | - * but current thread has used VSX, we don't have anywhere | ||
151 | - * to store the full context back into. | ||
152 | - */ | ||
153 | - if ((ctx_size < sizeof(struct ucontext)) && | ||
154 | - (current->thread.used_vsr && old_ctx)) | ||
155 | - return -EINVAL; | ||
156 | -#endif | ||
157 | + /* Does the context have enough room to store VSX data? */ | ||
158 | + if (ctx_size >= sizeof(struct ucontext)) | ||
159 | + ctx_has_vsx_region = 1; | ||
160 | + | ||
161 | if (old_ctx != NULL) { | ||
162 | - if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx)) | ||
163 | - || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0) | ||
164 | + if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size) | ||
165 | + || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0, | ||
166 | + ctx_has_vsx_region) | ||
167 | || __copy_to_user(&old_ctx->uc_sigmask, | ||
168 | ¤t->blocked, sizeof(sigset_t))) | ||
169 | return -EFAULT; | ||
170 | } | ||
171 | if (new_ctx == NULL) | ||
172 | return 0; | ||
173 | - if (!access_ok(VERIFY_READ, new_ctx, sizeof(*new_ctx)) | ||
174 | + if (!access_ok(VERIFY_READ, new_ctx, ctx_size) | ||
175 | || __get_user(tmp, (u8 __user *) new_ctx) | ||
176 | - || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1)) | ||
177 | + || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1)) | ||
178 | return -EFAULT; | ||
179 | |||
180 | /* | ||
181 | @@ -425,7 +422,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | ||
182 | &frame->uc.uc_stack.ss_flags); | ||
183 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
184 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, NULL, | ||
185 | - (unsigned long)ka->sa.sa_handler); | ||
186 | + (unsigned long)ka->sa.sa_handler, 1); | ||
187 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | ||
188 | if (err) | ||
189 | goto badframe; | ||
190 | diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c | ||
191 | index ce10e2b..131d729 100644 | ||
192 | --- a/arch/powerpc/mm/fsl_booke_mmu.c | ||
193 | +++ b/arch/powerpc/mm/fsl_booke_mmu.c | ||
194 | @@ -80,7 +80,7 @@ extern unsigned int tlbcam_index; | ||
195 | /* | ||
196 | * Return PA for this VA if it is mapped by a CAM, or 0 | ||
197 | */ | ||
198 | -unsigned long v_mapped_by_tlbcam(unsigned long va) | ||
199 | +phys_addr_t v_mapped_by_tlbcam(unsigned long va) | ||
200 | { | ||
201 | int b; | ||
202 | for (b = 0; b < tlbcam_index; ++b) | ||
203 | @@ -92,7 +92,7 @@ unsigned long v_mapped_by_tlbcam(unsigned long va) | ||
204 | /* | ||
205 | * Return VA for a given PA or 0 if not mapped | ||
206 | */ | ||
207 | -unsigned long p_mapped_by_tlbcam(unsigned long pa) | ||
208 | +unsigned long p_mapped_by_tlbcam(phys_addr_t pa) | ||
209 | { | ||
210 | int b; | ||
211 | for (b = 0; b < tlbcam_index; ++b) | ||
212 | diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c | ||
213 | index 2001abd..05922b2 100644 | ||
214 | --- a/arch/powerpc/mm/pgtable_32.c | ||
215 | +++ b/arch/powerpc/mm/pgtable_32.c | ||
216 | @@ -65,8 +65,8 @@ void setbat(int index, unsigned long virt, phys_addr_t phys, | ||
217 | |||
218 | #ifdef HAVE_TLBCAM | ||
219 | extern unsigned int tlbcam_index; | ||
220 | -extern unsigned long v_mapped_by_tlbcam(unsigned long va); | ||
221 | -extern unsigned long p_mapped_by_tlbcam(unsigned long pa); | ||
222 | +extern phys_addr_t v_mapped_by_tlbcam(unsigned long va); | ||
223 | +extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa); | ||
224 | #else /* !HAVE_TLBCAM */ | ||
225 | #define v_mapped_by_tlbcam(x) (0UL) | ||
226 | #define p_mapped_by_tlbcam(x) (0UL) | ||
227 | diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig | ||
228 | index 36b4b7a..b376667 100644 | ||
229 | --- a/arch/sparc64/Kconfig | ||
230 | +++ b/arch/sparc64/Kconfig | ||
231 | @@ -15,6 +15,7 @@ config SPARC64 | ||
232 | select HAVE_FTRACE | ||
233 | select HAVE_IDE | ||
234 | select HAVE_LMB | ||
235 | + select HAVE_SYSCALL_WRAPPERS | ||
236 | select HAVE_ARCH_KGDB | ||
237 | select USE_GENERIC_SMP_HELPERS if SMP | ||
238 | select HAVE_ARCH_TRACEHOOK | ||
239 | diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c | ||
240 | index 39749e3..73b287e 100644 | ||
241 | --- a/arch/sparc64/kernel/sys_sparc.c | ||
242 | +++ b/arch/sparc64/kernel/sys_sparc.c | ||
243 | @@ -397,7 +397,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm) | ||
244 | } | ||
245 | } | ||
246 | |||
247 | -asmlinkage unsigned long sparc_brk(unsigned long brk) | ||
248 | +SYSCALL_DEFINE1(sparc_brk, unsigned long, brk) | ||
249 | { | ||
250 | /* People could try to be nasty and use ta 0x6d in 32bit programs */ | ||
251 | if (test_thread_flag(TIF_32BIT) && brk >= STACK_TOP32) | ||
252 | @@ -413,7 +413,7 @@ asmlinkage unsigned long sparc_brk(unsigned long brk) | ||
253 | * sys_pipe() is the normal C calling standard for creating | ||
254 | * a pipe. It's not the way unix traditionally does this, though. | ||
255 | */ | ||
256 | -asmlinkage long sparc_pipe(struct pt_regs *regs) | ||
257 | +SYSCALL_DEFINE1(sparc_pipe_real, struct pt_regs *, regs) | ||
258 | { | ||
259 | int fd[2]; | ||
260 | int error; | ||
261 | @@ -433,8 +433,8 @@ out: | ||
262 | * This is really horribly ugly. | ||
263 | */ | ||
264 | |||
265 | -asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second, | ||
266 | - unsigned long third, void __user *ptr, long fifth) | ||
267 | +SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second, | ||
268 | + unsigned long, third, void __user *, ptr, long, fifth) | ||
269 | { | ||
270 | long err; | ||
271 | |||
272 | @@ -517,7 +517,7 @@ out: | ||
273 | return err; | ||
274 | } | ||
275 | |||
276 | -asmlinkage long sparc64_newuname(struct new_utsname __user *name) | ||
277 | +SYSCALL_DEFINE1(sparc64_newuname, struct new_utsname __user *, name) | ||
278 | { | ||
279 | int ret = sys_newuname(name); | ||
280 | |||
281 | @@ -528,7 +528,7 @@ asmlinkage long sparc64_newuname(struct new_utsname __user *name) | ||
282 | return ret; | ||
283 | } | ||
284 | |||
285 | -asmlinkage long sparc64_personality(unsigned long personality) | ||
286 | +SYSCALL_DEFINE1(sparc64_personality, unsigned long, personality) | ||
287 | { | ||
288 | int ret; | ||
289 | |||
290 | @@ -562,9 +562,9 @@ int sparc_mmap_check(unsigned long addr, unsigned long len) | ||
291 | } | ||
292 | |||
293 | /* Linux version of mmap */ | ||
294 | -asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, | ||
295 | - unsigned long prot, unsigned long flags, unsigned long fd, | ||
296 | - unsigned long off) | ||
297 | +SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, | ||
298 | + unsigned long, prot, unsigned long, flags, unsigned long, fd, | ||
299 | + unsigned long, off) | ||
300 | { | ||
301 | struct file * file = NULL; | ||
302 | unsigned long retval = -EBADF; | ||
303 | @@ -587,7 +587,7 @@ out: | ||
304 | return retval; | ||
305 | } | ||
306 | |||
307 | -asmlinkage long sys64_munmap(unsigned long addr, size_t len) | ||
308 | +SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) | ||
309 | { | ||
310 | long ret; | ||
311 | |||
312 | @@ -604,9 +604,9 @@ extern unsigned long do_mremap(unsigned long addr, | ||
313 | unsigned long old_len, unsigned long new_len, | ||
314 | unsigned long flags, unsigned long new_addr); | ||
315 | |||
316 | -asmlinkage unsigned long sys64_mremap(unsigned long addr, | ||
317 | - unsigned long old_len, unsigned long new_len, | ||
318 | - unsigned long flags, unsigned long new_addr) | ||
319 | +SYSCALL_DEFINE5(64_mremap, unsigned long, addr, unsigned long, old_len, | ||
320 | + unsigned long, new_len, unsigned long, flags, | ||
321 | + unsigned long, new_addr) | ||
322 | { | ||
323 | unsigned long ret = -EINVAL; | ||
324 | |||
325 | @@ -669,7 +669,7 @@ asmlinkage void sparc_breakpoint(struct pt_regs *regs) | ||
326 | |||
327 | extern void check_pending(int signum); | ||
328 | |||
329 | -asmlinkage long sys_getdomainname(char __user *name, int len) | ||
330 | +SYSCALL_DEFINE2(getdomainname, char __user *, name, int, len) | ||
331 | { | ||
332 | int nlen, err; | ||
333 | |||
334 | @@ -692,11 +692,10 @@ out: | ||
335 | return err; | ||
336 | } | ||
337 | |||
338 | -asmlinkage long sys_utrap_install(utrap_entry_t type, | ||
339 | - utrap_handler_t new_p, | ||
340 | - utrap_handler_t new_d, | ||
341 | - utrap_handler_t __user *old_p, | ||
342 | - utrap_handler_t __user *old_d) | ||
343 | +SYSCALL_DEFINE5(utrap_install, utrap_entry_t, type, | ||
344 | + utrap_handler_t, new_p, utrap_handler_t, new_d, | ||
345 | + utrap_handler_t __user *, old_p, | ||
346 | + utrap_handler_t __user *, old_d) | ||
347 | { | ||
348 | if (type < UT_INSTRUCTION_EXCEPTION || type > UT_TRAP_INSTRUCTION_31) | ||
349 | return -EINVAL; | ||
350 | @@ -762,11 +761,9 @@ asmlinkage long sparc_memory_ordering(unsigned long model, | ||
351 | return 0; | ||
352 | } | ||
353 | |||
354 | -asmlinkage long sys_rt_sigaction(int sig, | ||
355 | - const struct sigaction __user *act, | ||
356 | - struct sigaction __user *oact, | ||
357 | - void __user *restorer, | ||
358 | - size_t sigsetsize) | ||
359 | +SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, | ||
360 | + struct sigaction __user *, oact, void __user *, restorer, | ||
361 | + size_t, sigsetsize) | ||
362 | { | ||
363 | struct k_sigaction new_ka, old_ka; | ||
364 | int ret; | ||
365 | @@ -806,7 +803,8 @@ asmlinkage void update_perfctrs(void) | ||
366 | reset_pic(); | ||
367 | } | ||
368 | |||
369 | -asmlinkage long sys_perfctr(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2) | ||
370 | +SYSCALL_DEFINE4(perfctr, int, opcode, unsigned long, arg0, | ||
371 | + unsigned long, arg1, unsigned long, arg2) | ||
372 | { | ||
373 | int err = 0; | ||
374 | |||
375 | diff --git a/arch/sparc64/kernel/syscalls.S b/arch/sparc64/kernel/syscalls.S | ||
376 | index cd2d333..5a0b52e 100644 | ||
377 | --- a/arch/sparc64/kernel/syscalls.S | ||
378 | +++ b/arch/sparc64/kernel/syscalls.S | ||
379 | @@ -21,7 +21,7 @@ execve_merge: | ||
380 | |||
381 | .align 32 | ||
382 | sys_sparc_pipe: | ||
383 | - ba,pt %xcc, sparc_pipe | ||
384 | + ba,pt %xcc, sys_sparc_pipe_real | ||
385 | add %sp, PTREGS_OFF, %o0 | ||
386 | sys_nis_syscall: | ||
387 | ba,pt %xcc, c_sys_nis_syscall | ||
388 | diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S | ||
389 | index 26b39de..8fafe0b 100644 | ||
390 | --- a/arch/sparc64/kernel/systbls.S | ||
391 | +++ b/arch/sparc64/kernel/systbls.S | ||
392 | @@ -21,7 +21,7 @@ sys_call_table32: | ||
393 | /*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write | ||
394 | /*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link | ||
395 | /*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod | ||
396 | -/*15*/ .word sys_chmod, sys_lchown16, sparc_brk, sys32_perfctr, sys32_lseek | ||
397 | +/*15*/ .word sys_chmod, sys_lchown16, sys_sparc_brk, sys32_perfctr, sys32_lseek | ||
398 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 | ||
399 | /*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause | ||
400 | /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice | ||
401 | @@ -55,8 +55,8 @@ sys_call_table32: | ||
402 | /*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents | ||
403 | .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr | ||
404 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall | ||
405 | - .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sparc64_newuname | ||
406 | -/*190*/ .word sys32_init_module, sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl | ||
407 | + .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_sparc64_newuname | ||
408 | +/*190*/ .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl | ||
409 | .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask | ||
410 | /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir | ||
411 | .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 | ||
412 | @@ -95,7 +95,7 @@ sys_call_table: | ||
413 | /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write | ||
414 | /*5*/ .word sys_open, sys_close, sys_wait4, sys_creat, sys_link | ||
415 | /*10*/ .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod | ||
416 | -/*15*/ .word sys_chmod, sys_lchown, sparc_brk, sys_perfctr, sys_lseek | ||
417 | +/*15*/ .word sys_chmod, sys_lchown, sys_sparc_brk, sys_perfctr, sys_lseek | ||
418 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid | ||
419 | /*25*/ .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall | ||
420 | /*30*/ .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice | ||
421 | @@ -106,7 +106,7 @@ sys_call_table: | ||
422 | .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve | ||
423 | /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize | ||
424 | .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall | ||
425 | -/*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect | ||
426 | +/*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect | ||
427 | .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups | ||
428 | /*80*/ .word sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_nis_syscall | ||
429 | .word sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall | ||
430 | @@ -129,8 +129,8 @@ sys_call_table: | ||
431 | /*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents | ||
432 | .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr | ||
433 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall | ||
434 | - .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname | ||
435 | -/*190*/ .word sys_init_module, sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl | ||
436 | + .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_sparc64_newuname | ||
437 | +/*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl | ||
438 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask | ||
439 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall | ||
440 | .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 | ||
441 | @@ -142,7 +142,7 @@ sys_call_table: | ||
442 | .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall | ||
443 | /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler | ||
444 | .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep | ||
445 | -/*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl | ||
446 | +/*250*/ .word sys_64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl | ||
447 | .word sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep | ||
448 | /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun | ||
449 | .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy | ||
450 | diff --git a/arch/sparc64/kernel/systbls.h b/arch/sparc64/kernel/systbls.h | ||
451 | index bc9f5da..15c2d75 100644 | ||
452 | --- a/arch/sparc64/kernel/systbls.h | ||
453 | +++ b/arch/sparc64/kernel/systbls.h | ||
454 | @@ -16,9 +16,6 @@ extern asmlinkage long sys_ipc(unsigned int call, int first, | ||
455 | void __user *ptr, long fifth); | ||
456 | extern asmlinkage long sparc64_newuname(struct new_utsname __user *name); | ||
457 | extern asmlinkage long sparc64_personality(unsigned long personality); | ||
458 | -extern asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, | ||
459 | - unsigned long prot, unsigned long flags, | ||
460 | - unsigned long fd, unsigned long off); | ||
461 | extern asmlinkage long sys64_munmap(unsigned long addr, size_t len); | ||
462 | extern asmlinkage unsigned long sys64_mremap(unsigned long addr, | ||
463 | unsigned long old_len, | ||
464 | diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c | ||
465 | index f370d38..c4e6cc9 100644 | ||
466 | --- a/arch/x86/kernel/vmi_32.c | ||
467 | +++ b/arch/x86/kernel/vmi_32.c | ||
468 | @@ -430,6 +430,16 @@ static void vmi_release_pmd(u32 pfn) | ||
469 | } | ||
470 | |||
471 | /* | ||
472 | + * We use the pgd_free hook for releasing the pgd page: | ||
473 | + */ | ||
474 | +static void vmi_pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
475 | +{ | ||
476 | + unsigned long pfn = __pa(pgd) >> PAGE_SHIFT; | ||
477 | + | ||
478 | + vmi_ops.release_page(pfn, VMI_PAGE_L2); | ||
479 | +} | ||
480 | + | ||
481 | +/* | ||
482 | * Helper macros for MMU update flags. We can defer updates until a flush | ||
483 | * or page invalidation only if the update is to the current address space | ||
484 | * (otherwise, there is no flush). We must check against init_mm, since | ||
485 | @@ -881,6 +891,7 @@ static inline int __init activate_vmi(void) | ||
486 | if (vmi_ops.release_page) { | ||
487 | pv_mmu_ops.release_pte = vmi_release_pte; | ||
488 | pv_mmu_ops.release_pmd = vmi_release_pmd; | ||
489 | + pv_mmu_ops.pgd_free = vmi_pgd_free; | ||
490 | } | ||
491 | |||
492 | /* Set linear is needed in all cases */ | ||
493 | diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c | ||
494 | index 4bdaa59..315b071 100644 | ||
495 | --- a/arch/x86/pci/fixup.c | ||
496 | +++ b/arch/x86/pci/fixup.c | ||
497 | @@ -496,18 +496,21 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015, | ||
498 | pci_siemens_interrupt_controller); | ||
499 | |||
500 | /* | ||
501 | - * Regular PCI devices have 256 bytes, but AMD Family 10h Opteron ext config | ||
502 | - * have 4096 bytes. Even if the device is capable, that doesn't mean we can | ||
503 | - * access it. Maybe we don't have a way to generate extended config space | ||
504 | - * accesses. So check it | ||
505 | + * Regular PCI devices have 256 bytes, but AMD Family 10h/11h CPUs have | ||
506 | + * 4096 bytes configuration space for each function of their processor | ||
507 | + * configuration space. | ||
508 | */ | ||
509 | -static void fam10h_pci_cfg_space_size(struct pci_dev *dev) | ||
510 | +static void amd_cpu_pci_cfg_space_size(struct pci_dev *dev) | ||
511 | { | ||
512 | dev->cfg_size = pci_cfg_space_size_ext(dev); | ||
513 | } | ||
514 | - | ||
515 | -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, fam10h_pci_cfg_space_size); | ||
516 | -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, fam10h_pci_cfg_space_size); | ||
517 | -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, fam10h_pci_cfg_space_size); | ||
518 | -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, fam10h_pci_cfg_space_size); | ||
519 | -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, fam10h_pci_cfg_space_size); | ||
520 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, amd_cpu_pci_cfg_space_size); | ||
521 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, amd_cpu_pci_cfg_space_size); | ||
522 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, amd_cpu_pci_cfg_space_size); | ||
523 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, amd_cpu_pci_cfg_space_size); | ||
524 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, amd_cpu_pci_cfg_space_size); | ||
525 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1300, amd_cpu_pci_cfg_space_size); | ||
526 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1301, amd_cpu_pci_cfg_space_size); | ||
527 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1302, amd_cpu_pci_cfg_space_size); | ||
528 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1303, amd_cpu_pci_cfg_space_size); | ||
529 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1304, amd_cpu_pci_cfg_space_size); | ||
530 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c | ||
531 | index 2c4ccec..154e7d6 100644 | ||
532 | --- a/drivers/ata/libata-eh.c | ||
533 | +++ b/drivers/ata/libata-eh.c | ||
534 | @@ -2694,12 +2694,13 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err) | ||
535 | /* give it just one more chance */ | ||
536 | ehc->tries[dev->devno] = min(ehc->tries[dev->devno], 1); | ||
537 | case -EIO: | ||
538 | - if (ehc->tries[dev->devno] == 1 && dev->pio_mode > XFER_PIO_0) { | ||
539 | + if (ehc->tries[dev->devno] == 1) { | ||
540 | /* This is the last chance, better to slow | ||
541 | * down than lose it. | ||
542 | */ | ||
543 | sata_down_spd_limit(dev->link); | ||
544 | - ata_down_xfermask_limit(dev, ATA_DNXFER_PIO); | ||
545 | + if (dev->pio_mode > XFER_PIO_0) | ||
546 | + ata_down_xfermask_limit(dev, ATA_DNXFER_PIO); | ||
547 | } | ||
548 | } | ||
549 | |||
550 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c | ||
551 | index 1778e4a..814ffd9 100644 | ||
552 | --- a/drivers/block/nbd.c | ||
553 | +++ b/drivers/block/nbd.c | ||
554 | @@ -547,6 +547,15 @@ static void do_nbd_request(struct request_queue * q) | ||
555 | |||
556 | BUG_ON(lo->magic != LO_MAGIC); | ||
557 | |||
558 | + if (unlikely(!lo->sock)) { | ||
559 | + printk(KERN_ERR "%s: Attempted send on closed socket\n", | ||
560 | + lo->disk->disk_name); | ||
561 | + req->errors++; | ||
562 | + nbd_end_request(req); | ||
563 | + spin_lock_irq(q->queue_lock); | ||
564 | + continue; | ||
565 | + } | ||
566 | + | ||
567 | spin_lock_irq(&lo->queue_lock); | ||
568 | list_add_tail(&req->queuelist, &lo->waiting_queue); | ||
569 | spin_unlock_irq(&lo->queue_lock); | ||
570 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
571 | index e87956a..1371184 100644 | ||
572 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
573 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
574 | @@ -1130,24 +1130,16 @@ static void usbhid_fixup_button_consumer_descriptor(unsigned char *rdesc, int rs | ||
575 | } | ||
576 | |||
577 | /* | ||
578 | - * Microsoft Wireless Desktop Receiver (Model 1028) has several | ||
579 | + * Microsoft Wireless Desktop Receiver (Model 1028) has | ||
580 | * 'Usage Min/Max' where it ought to have 'Physical Min/Max' | ||
581 | */ | ||
582 | static void usbhid_fixup_microsoft_descriptor(unsigned char *rdesc, int rsize) | ||
583 | { | ||
584 | - if (rsize == 571 && rdesc[284] == 0x19 | ||
585 | - && rdesc[286] == 0x2a | ||
586 | - && rdesc[304] == 0x19 | ||
587 | - && rdesc[306] == 0x29 | ||
588 | - && rdesc[352] == 0x1a | ||
589 | - && rdesc[355] == 0x2a | ||
590 | - && rdesc[557] == 0x19 | ||
591 | + if (rsize == 571 && rdesc[557] == 0x19 | ||
592 | && rdesc[559] == 0x29) { | ||
593 | printk(KERN_INFO "Fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n"); | ||
594 | - rdesc[284] = rdesc[304] = rdesc[557] = 0x35; | ||
595 | - rdesc[352] = 0x36; | ||
596 | - rdesc[286] = rdesc[355] = 0x46; | ||
597 | - rdesc[306] = rdesc[559] = 0x45; | ||
598 | + rdesc[557] = 0x35; | ||
599 | + rdesc[559] = 0x45; | ||
600 | } | ||
601 | } | ||
602 | |||
603 | diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c | ||
604 | index a2b092b..b7d829f 100644 | ||
605 | --- a/drivers/net/skfp/skfddi.c | ||
606 | +++ b/drivers/net/skfp/skfddi.c | ||
607 | @@ -998,9 +998,9 @@ static int skfp_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | ||
608 | break; | ||
609 | case SKFP_CLR_STATS: /* Zero out the driver statistics */ | ||
610 | if (!capable(CAP_NET_ADMIN)) { | ||
611 | - memset(&lp->MacStat, 0, sizeof(lp->MacStat)); | ||
612 | - } else { | ||
613 | status = -EPERM; | ||
614 | + } else { | ||
615 | + memset(&lp->MacStat, 0, sizeof(lp->MacStat)); | ||
616 | } | ||
617 | break; | ||
618 | default: | ||
619 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c | ||
620 | index b4be33a..b68bc39 100644 | ||
621 | --- a/drivers/net/sky2.c | ||
622 | +++ b/drivers/net/sky2.c | ||
623 | @@ -1403,9 +1403,6 @@ static int sky2_up(struct net_device *dev) | ||
624 | |||
625 | } | ||
626 | |||
627 | - if (netif_msg_ifup(sky2)) | ||
628 | - printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); | ||
629 | - | ||
630 | netif_carrier_off(dev); | ||
631 | |||
632 | /* must be power of 2 */ | ||
633 | @@ -1484,6 +1481,9 @@ static int sky2_up(struct net_device *dev) | ||
634 | sky2_write32(hw, B0_IMSK, imask); | ||
635 | |||
636 | sky2_set_multicast(dev); | ||
637 | + | ||
638 | + if (netif_msg_ifup(sky2)) | ||
639 | + printk(KERN_INFO PFX "%s: enabling interface\n", dev->name); | ||
640 | return 0; | ||
641 | |||
642 | err_out: | ||
643 | diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c | ||
644 | index 4291458..88f9fd5 100644 | ||
645 | --- a/drivers/net/sungem.c | ||
646 | +++ b/drivers/net/sungem.c | ||
647 | @@ -2205,6 +2205,8 @@ static int gem_do_start(struct net_device *dev) | ||
648 | |||
649 | gp->running = 1; | ||
650 | |||
651 | + napi_enable(&gp->napi); | ||
652 | + | ||
653 | if (gp->lstate == link_up) { | ||
654 | netif_carrier_on(gp->dev); | ||
655 | gem_set_link_modes(gp); | ||
656 | @@ -2222,6 +2224,8 @@ static int gem_do_start(struct net_device *dev) | ||
657 | spin_lock_irqsave(&gp->lock, flags); | ||
658 | spin_lock(&gp->tx_lock); | ||
659 | |||
660 | + napi_disable(&gp->napi); | ||
661 | + | ||
662 | gp->running = 0; | ||
663 | gem_reset(gp); | ||
664 | gem_clean_rings(gp); | ||
665 | @@ -2322,8 +2326,6 @@ static int gem_open(struct net_device *dev) | ||
666 | if (!gp->asleep) | ||
667 | rc = gem_do_start(dev); | ||
668 | gp->opened = (rc == 0); | ||
669 | - if (gp->opened) | ||
670 | - napi_enable(&gp->napi); | ||
671 | |||
672 | mutex_unlock(&gp->pm_mutex); | ||
673 | |||
674 | @@ -2460,8 +2462,6 @@ static int gem_resume(struct pci_dev *pdev) | ||
675 | |||
676 | /* Re-attach net device */ | ||
677 | netif_device_attach(dev); | ||
678 | - | ||
679 | - napi_enable(&gp->napi); | ||
680 | } | ||
681 | |||
682 | spin_lock_irqsave(&gp->lock, flags); | ||
683 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
684 | index 6daea0c..f00fcb5 100644 | ||
685 | --- a/drivers/net/tun.c | ||
686 | +++ b/drivers/net/tun.c | ||
687 | @@ -157,10 +157,16 @@ static int update_filter(struct tap_filter *filter, void __user *arg) | ||
688 | |||
689 | nexact = n; | ||
690 | |||
691 | - /* The rest is hashed */ | ||
692 | + /* Remaining multicast addresses are hashed, | ||
693 | + * unicast will leave the filter disabled. */ | ||
694 | memset(filter->mask, 0, sizeof(filter->mask)); | ||
695 | - for (; n < uf.count; n++) | ||
696 | + for (; n < uf.count; n++) { | ||
697 | + if (!is_multicast_ether_addr(addr[n].u)) { | ||
698 | + err = 0; /* no filter */ | ||
699 | + goto done; | ||
700 | + } | ||
701 | addr_hash_set(filter->mask, addr[n].u); | ||
702 | + } | ||
703 | |||
704 | /* For ALLMULTI just set the mask to all ones. | ||
705 | * This overrides the mask populated above. */ | ||
706 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c | ||
707 | index 0196a0d..ce743ec 100644 | ||
708 | --- a/drivers/net/virtio_net.c | ||
709 | +++ b/drivers/net/virtio_net.c | ||
710 | @@ -24,6 +24,7 @@ | ||
711 | #include <linux/virtio.h> | ||
712 | #include <linux/virtio_net.h> | ||
713 | #include <linux/scatterlist.h> | ||
714 | +#include <linux/if_vlan.h> | ||
715 | |||
716 | static int napi_weight = 128; | ||
717 | module_param(napi_weight, int, 0444); | ||
718 | @@ -33,7 +34,7 @@ module_param(csum, bool, 0444); | ||
719 | module_param(gso, bool, 0444); | ||
720 | |||
721 | /* FIXME: MTU in config. */ | ||
722 | -#define MAX_PACKET_LEN (ETH_HLEN+ETH_DATA_LEN) | ||
723 | +#define MAX_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN) | ||
724 | |||
725 | struct virtnet_info | ||
726 | { | ||
727 | diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c | ||
728 | index 3a90a67..87d020c 100644 | ||
729 | --- a/drivers/net/wireless/iwlwifi/iwl-scan.c | ||
730 | +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | ||
731 | @@ -704,7 +704,7 @@ static void iwl_bg_request_scan(struct work_struct *data) | ||
732 | u16 cmd_len; | ||
733 | enum ieee80211_band band; | ||
734 | u8 n_probes = 2; | ||
735 | - u8 rx_chain = 0x7; /* bitmap: ABC chains */ | ||
736 | + u8 rx_chain = priv->hw_params.valid_rx_ant; | ||
737 | |||
738 | conf = ieee80211_get_hw_conf(priv->hw); | ||
739 | |||
740 | diff --git a/drivers/net/wireless/zd1211rw/zd_rf.c b/drivers/net/wireless/zd1211rw/zd_rf.c | ||
741 | index ec41293..ead3073 100644 | ||
742 | --- a/drivers/net/wireless/zd1211rw/zd_rf.c | ||
743 | +++ b/drivers/net/wireless/zd1211rw/zd_rf.c | ||
744 | @@ -86,6 +86,7 @@ int zd_rf_init_hw(struct zd_rf *rf, u8 type) | ||
745 | case AL7230B_RF: | ||
746 | r = zd_rf_init_al7230b(rf); | ||
747 | break; | ||
748 | + case MAXIM_NEW_RF: | ||
749 | case UW2453_RF: | ||
750 | r = zd_rf_init_uw2453(rf); | ||
751 | break; | ||
752 | diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c | ||
753 | index a3ccd8c..5d740b5 100644 | ||
754 | --- a/drivers/net/wireless/zd1211rw/zd_usb.c | ||
755 | +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | ||
756 | @@ -37,6 +37,7 @@ | ||
757 | static struct usb_device_id usb_ids[] = { | ||
758 | /* ZD1211 */ | ||
759 | { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 }, | ||
760 | + { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 }, | ||
761 | { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 }, | ||
762 | { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 }, | ||
763 | { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, | ||
764 | diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c | ||
765 | index 101ed49..032db81 100644 | ||
766 | --- a/drivers/parport/parport_serial.c | ||
767 | +++ b/drivers/parport/parport_serial.c | ||
768 | @@ -64,6 +64,11 @@ struct parport_pc_pci { | ||
769 | |||
770 | static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma) | ||
771 | { | ||
772 | + /* the rule described below doesn't hold for this device */ | ||
773 | + if (dev->device == PCI_DEVICE_ID_NETMOS_9835 && | ||
774 | + dev->subsystem_vendor == PCI_VENDOR_ID_IBM && | ||
775 | + dev->subsystem_device == 0x0299) | ||
776 | + return -ENODEV; | ||
777 | /* | ||
778 | * Netmos uses the subdevice ID to indicate the number of parallel | ||
779 | * and serial ports. The form is 0x00PS, where <P> is the number of | ||
780 | diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c | ||
781 | index fb28aca..521a2db 100644 | ||
782 | --- a/drivers/w1/slaves/w1_therm.c | ||
783 | +++ b/drivers/w1/slaves/w1_therm.c | ||
784 | @@ -113,7 +113,7 @@ static struct w1_therm_family_converter w1_therm_families[] = { | ||
785 | |||
786 | static inline int w1_DS18B20_convert_temp(u8 rom[9]) | ||
787 | { | ||
788 | - s16 t = (rom[1] << 8) | rom[0]; | ||
789 | + int t = ((s16)rom[1] << 8) | rom[0]; | ||
790 | t = t*1000/16; | ||
791 | return t; | ||
792 | } | ||
793 | diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c | ||
794 | index 5235c67..c8f8d59 100644 | ||
795 | --- a/fs/compat_ioctl.c | ||
796 | +++ b/fs/compat_ioctl.c | ||
797 | @@ -538,6 +538,7 @@ static int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
798 | * cannot be fixed without breaking all existing apps. | ||
799 | */ | ||
800 | case TUNSETIFF: | ||
801 | + case TUNGETIFF: | ||
802 | case SIOCGIFFLAGS: | ||
803 | case SIOCGIFMETRIC: | ||
804 | case SIOCGIFMTU: | ||
805 | @@ -1982,6 +1983,11 @@ COMPATIBLE_IOCTL(TUNSETNOCSUM) | ||
806 | COMPATIBLE_IOCTL(TUNSETDEBUG) | ||
807 | COMPATIBLE_IOCTL(TUNSETPERSIST) | ||
808 | COMPATIBLE_IOCTL(TUNSETOWNER) | ||
809 | +COMPATIBLE_IOCTL(TUNSETLINK) | ||
810 | +COMPATIBLE_IOCTL(TUNSETGROUP) | ||
811 | +COMPATIBLE_IOCTL(TUNGETFEATURES) | ||
812 | +COMPATIBLE_IOCTL(TUNSETOFFLOAD) | ||
813 | +COMPATIBLE_IOCTL(TUNSETTXFILTER) | ||
814 | /* Big V */ | ||
815 | COMPATIBLE_IOCTL(VT_SETMODE) | ||
816 | COMPATIBLE_IOCTL(VT_GETMODE) | ||
817 | @@ -2573,6 +2579,7 @@ HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc) | ||
818 | HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc) | ||
819 | HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc) | ||
820 | HANDLE_IOCTL(TUNSETIFF, dev_ifsioc) | ||
821 | +HANDLE_IOCTL(TUNGETIFF, dev_ifsioc) | ||
822 | HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl) | ||
823 | HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl) | ||
824 | HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl) | ||
825 | diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c | ||
826 | index cf0d5c2..dc934da 100644 | ||
827 | --- a/fs/lockd/svclock.c | ||
828 | +++ b/fs/lockd/svclock.c | ||
829 | @@ -418,7 +418,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, | ||
830 | goto out; | ||
831 | case -EAGAIN: | ||
832 | ret = nlm_lck_denied; | ||
833 | - goto out; | ||
834 | + break; | ||
835 | case FILE_LOCK_DEFERRED: | ||
836 | if (wait) | ||
837 | break; | ||
838 | @@ -434,6 +434,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, | ||
839 | goto out; | ||
840 | } | ||
841 | |||
842 | + ret = nlm_lck_denied; | ||
843 | + if (!wait) | ||
844 | + goto out; | ||
845 | + | ||
846 | ret = nlm_lck_blocked; | ||
847 | |||
848 | /* Append to list of blocked */ | ||
849 | diff --git a/include/linux/ata.h b/include/linux/ata.h | ||
850 | index 8a12d71..8297a3c 100644 | ||
851 | --- a/include/linux/ata.h | ||
852 | +++ b/include/linux/ata.h | ||
853 | @@ -681,12 +681,17 @@ static inline int ata_id_current_chs_valid(const u16 *id) | ||
854 | |||
855 | static inline int ata_id_is_cfa(const u16 *id) | ||
856 | { | ||
857 | - if (id[ATA_ID_CONFIG] == 0x848A) /* Standard CF */ | ||
858 | + if (id[ATA_ID_CONFIG] == 0x848A) /* Traditional CF */ | ||
859 | return 1; | ||
860 | - /* Could be CF hiding as standard ATA */ | ||
861 | - if (ata_id_major_version(id) >= 3 && | ||
862 | - id[ATA_ID_COMMAND_SET_1] != 0xFFFF && | ||
863 | - (id[ATA_ID_COMMAND_SET_1] & (1 << 2))) | ||
864 | + /* | ||
865 | + * CF specs don't require specific value in the word 0 anymore and yet | ||
866 | + * they forbid to report the ATA version in the word 80 and require the | ||
867 | + * CFA feature set support to be indicated in the word 83 in this case. | ||
868 | + * Unfortunately, some cards only follow either of this requirements, | ||
869 | + * and while those that don't indicate CFA feature support need some | ||
870 | + * sort of quirk list, it seems impractical for the ones that do... | ||
871 | + */ | ||
872 | + if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004) | ||
873 | return 1; | ||
874 | return 0; | ||
875 | } | ||
876 | diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h | ||
877 | index f54aa38..258a17b 100644 | ||
878 | --- a/include/linux/syscalls.h | ||
879 | +++ b/include/linux/syscalls.h | ||
880 | @@ -95,13 +95,13 @@ struct old_linux_dirent; | ||
881 | #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__) | ||
882 | #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__) | ||
883 | |||
884 | -#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void) | ||
885 | -#define SYSCALL_DEFINE1(...) SYSCALL_DEFINEx(1, __VA_ARGS__) | ||
886 | -#define SYSCALL_DEFINE2(...) SYSCALL_DEFINEx(2, __VA_ARGS__) | ||
887 | -#define SYSCALL_DEFINE3(...) SYSCALL_DEFINEx(3, __VA_ARGS__) | ||
888 | -#define SYSCALL_DEFINE4(...) SYSCALL_DEFINEx(4, __VA_ARGS__) | ||
889 | -#define SYSCALL_DEFINE5(...) SYSCALL_DEFINEx(5, __VA_ARGS__) | ||
890 | -#define SYSCALL_DEFINE6(...) SYSCALL_DEFINEx(6, __VA_ARGS__) | ||
891 | +#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void) | ||
892 | +#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) | ||
893 | +#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) | ||
894 | +#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) | ||
895 | +#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__) | ||
896 | +#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__) | ||
897 | +#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) | ||
898 | |||
899 | #ifdef CONFIG_PPC64 | ||
900 | #define SYSCALL_ALIAS(alias, name) \ | ||
901 | @@ -116,21 +116,21 @@ struct old_linux_dirent; | ||
902 | |||
903 | #define SYSCALL_DEFINE(name) static inline long SYSC_##name | ||
904 | #define SYSCALL_DEFINEx(x, name, ...) \ | ||
905 | - asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__)); \ | ||
906 | - static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__)); \ | ||
907 | - asmlinkage long SyS_##name(__SC_LONG##x(__VA_ARGS__)) \ | ||
908 | + asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \ | ||
909 | + static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \ | ||
910 | + asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \ | ||
911 | { \ | ||
912 | __SC_TEST##x(__VA_ARGS__); \ | ||
913 | - return (long) SYSC_##name(__SC_CAST##x(__VA_ARGS__)); \ | ||
914 | + return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \ | ||
915 | } \ | ||
916 | - SYSCALL_ALIAS(sys_##name, SyS_##name); \ | ||
917 | - static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__)) | ||
918 | + SYSCALL_ALIAS(sys##name, SyS##name); \ | ||
919 | + static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)) | ||
920 | |||
921 | #else /* CONFIG_HAVE_SYSCALL_WRAPPERS */ | ||
922 | |||
923 | #define SYSCALL_DEFINE(name) asmlinkage long sys_##name | ||
924 | #define SYSCALL_DEFINEx(x, name, ...) \ | ||
925 | - asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__)) | ||
926 | + asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)) | ||
927 | |||
928 | #endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */ | ||
929 | |||
930 | diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h | ||
931 | index b799fb2..2fec3c3 100644 | ||
932 | --- a/include/net/sctp/checksum.h | ||
933 | +++ b/include/net/sctp/checksum.h | ||
934 | @@ -79,5 +79,5 @@ static inline __be32 sctp_update_cksum(__u8 *buffer, __u16 length, __be32 crc32) | ||
935 | |||
936 | static inline __be32 sctp_end_cksum(__be32 crc32) | ||
937 | { | ||
938 | - return ~crc32; | ||
939 | + return (__force __be32)~cpu_to_le32((__force u32)crc32); | ||
940 | } | ||
941 | diff --git a/mm/page-writeback.c b/mm/page-writeback.c | ||
942 | index 8875822..5f7cdc2 100644 | ||
943 | --- a/mm/page-writeback.c | ||
944 | +++ b/mm/page-writeback.c | ||
945 | @@ -985,13 +985,25 @@ continue_unlock: | ||
946 | } | ||
947 | } | ||
948 | |||
949 | - if (wbc->sync_mode == WB_SYNC_NONE) { | ||
950 | + if (wbc->nr_to_write > 0) { | ||
951 | wbc->nr_to_write--; | ||
952 | - if (wbc->nr_to_write <= 0) { | ||
953 | + if (wbc->nr_to_write == 0 && | ||
954 | + wbc->sync_mode == WB_SYNC_NONE) { | ||
955 | + /* | ||
956 | + * We stop writing back only if we are | ||
957 | + * not doing integrity sync. In case of | ||
958 | + * integrity sync we have to keep going | ||
959 | + * because someone may be concurrently | ||
960 | + * dirtying pages, and we might have | ||
961 | + * synced a lot of newly appeared dirty | ||
962 | + * pages, but have not synced all of the | ||
963 | + * old dirty pages. | ||
964 | + */ | ||
965 | done = 1; | ||
966 | break; | ||
967 | } | ||
968 | } | ||
969 | + | ||
970 | if (wbc->nonblocking && bdi_write_congested(bdi)) { | ||
971 | wbc->encountered_congestion = 1; | ||
972 | done = 1; | ||
973 | @@ -1001,7 +1013,7 @@ continue_unlock: | ||
974 | pagevec_release(&pvec); | ||
975 | cond_resched(); | ||
976 | } | ||
977 | - if (!cycled) { | ||
978 | + if (!cycled && !done) { | ||
979 | /* | ||
980 | * range_cyclic: | ||
981 | * We hit the last page and there is more work to be done: wrap | ||
982 | diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c | ||
983 | index 96434d7..0abd0ef 100644 | ||
984 | --- a/net/bluetooth/hidp/core.c | ||
985 | +++ b/net/bluetooth/hidp/core.c | ||
986 | @@ -684,6 +684,10 @@ static const struct { | ||
987 | } hidp_blacklist[] = { | ||
988 | /* Apple wireless Mighty Mouse */ | ||
989 | { 0x05ac, 0x030c, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, | ||
990 | + /* Apple Wireless Keyboard */ | ||
991 | + { 0x05ac, 0x022c, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | ||
992 | + { 0x05ac, 0x022d, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | ||
993 | + { 0x05ac, 0x022e, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | ||
994 | |||
995 | { } /* Terminating entry */ | ||
996 | }; | ||
997 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
998 | index ca1ccdf..53425fa 100644 | ||
999 | --- a/net/core/skbuff.c | ||
1000 | +++ b/net/core/skbuff.c | ||
1001 | @@ -73,17 +73,13 @@ static struct kmem_cache *skbuff_fclone_cache __read_mostly; | ||
1002 | static void sock_pipe_buf_release(struct pipe_inode_info *pipe, | ||
1003 | struct pipe_buffer *buf) | ||
1004 | { | ||
1005 | - struct sk_buff *skb = (struct sk_buff *) buf->private; | ||
1006 | - | ||
1007 | - kfree_skb(skb); | ||
1008 | + put_page(buf->page); | ||
1009 | } | ||
1010 | |||
1011 | static void sock_pipe_buf_get(struct pipe_inode_info *pipe, | ||
1012 | struct pipe_buffer *buf) | ||
1013 | { | ||
1014 | - struct sk_buff *skb = (struct sk_buff *) buf->private; | ||
1015 | - | ||
1016 | - skb_get(skb); | ||
1017 | + get_page(buf->page); | ||
1018 | } | ||
1019 | |||
1020 | static int sock_pipe_buf_steal(struct pipe_inode_info *pipe, | ||
1021 | @@ -1262,9 +1258,19 @@ fault: | ||
1022 | */ | ||
1023 | static void sock_spd_release(struct splice_pipe_desc *spd, unsigned int i) | ||
1024 | { | ||
1025 | - struct sk_buff *skb = (struct sk_buff *) spd->partial[i].private; | ||
1026 | + put_page(spd->pages[i]); | ||
1027 | +} | ||
1028 | |||
1029 | - kfree_skb(skb); | ||
1030 | +static inline struct page *linear_to_page(struct page *page, unsigned int len, | ||
1031 | + unsigned int offset) | ||
1032 | +{ | ||
1033 | + struct page *p = alloc_pages(GFP_KERNEL, 0); | ||
1034 | + | ||
1035 | + if (!p) | ||
1036 | + return NULL; | ||
1037 | + memcpy(page_address(p) + offset, page_address(page) + offset, len); | ||
1038 | + | ||
1039 | + return p; | ||
1040 | } | ||
1041 | |||
1042 | /* | ||
1043 | @@ -1272,16 +1278,23 @@ static void sock_spd_release(struct splice_pipe_desc *spd, unsigned int i) | ||
1044 | */ | ||
1045 | static inline int spd_fill_page(struct splice_pipe_desc *spd, struct page *page, | ||
1046 | unsigned int len, unsigned int offset, | ||
1047 | - struct sk_buff *skb) | ||
1048 | + struct sk_buff *skb, int linear) | ||
1049 | { | ||
1050 | if (unlikely(spd->nr_pages == PIPE_BUFFERS)) | ||
1051 | return 1; | ||
1052 | |||
1053 | + if (linear) { | ||
1054 | + page = linear_to_page(page, len, offset); | ||
1055 | + if (!page) | ||
1056 | + return 1; | ||
1057 | + } else | ||
1058 | + get_page(page); | ||
1059 | + | ||
1060 | spd->pages[spd->nr_pages] = page; | ||
1061 | spd->partial[spd->nr_pages].len = len; | ||
1062 | spd->partial[spd->nr_pages].offset = offset; | ||
1063 | - spd->partial[spd->nr_pages].private = (unsigned long) skb_get(skb); | ||
1064 | spd->nr_pages++; | ||
1065 | + | ||
1066 | return 0; | ||
1067 | } | ||
1068 | |||
1069 | @@ -1297,7 +1310,7 @@ static inline void __segment_seek(struct page **page, unsigned int *poff, | ||
1070 | static inline int __splice_segment(struct page *page, unsigned int poff, | ||
1071 | unsigned int plen, unsigned int *off, | ||
1072 | unsigned int *len, struct sk_buff *skb, | ||
1073 | - struct splice_pipe_desc *spd) | ||
1074 | + struct splice_pipe_desc *spd, int linear) | ||
1075 | { | ||
1076 | if (!*len) | ||
1077 | return 1; | ||
1078 | @@ -1320,7 +1333,7 @@ static inline int __splice_segment(struct page *page, unsigned int poff, | ||
1079 | /* the linear region may spread across several pages */ | ||
1080 | flen = min_t(unsigned int, flen, PAGE_SIZE - poff); | ||
1081 | |||
1082 | - if (spd_fill_page(spd, page, flen, poff, skb)) | ||
1083 | + if (spd_fill_page(spd, page, flen, poff, skb, linear)) | ||
1084 | return 1; | ||
1085 | |||
1086 | __segment_seek(&page, &poff, &plen, flen); | ||
1087 | @@ -1347,7 +1360,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | ||
1088 | if (__splice_segment(virt_to_page(skb->data), | ||
1089 | (unsigned long) skb->data & (PAGE_SIZE - 1), | ||
1090 | skb_headlen(skb), | ||
1091 | - offset, len, skb, spd)) | ||
1092 | + offset, len, skb, spd, 1)) | ||
1093 | return 1; | ||
1094 | |||
1095 | /* | ||
1096 | @@ -1357,7 +1370,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | ||
1097 | const skb_frag_t *f = &skb_shinfo(skb)->frags[seg]; | ||
1098 | |||
1099 | if (__splice_segment(f->page, f->page_offset, f->size, | ||
1100 | - offset, len, skb, spd)) | ||
1101 | + offset, len, skb, spd, 0)) | ||
1102 | return 1; | ||
1103 | } | ||
1104 | |||
1105 | @@ -1370,7 +1383,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | ||
1106 | * the frag list, if such a thing exists. We'd probably need to recurse to | ||
1107 | * handle that cleanly. | ||
1108 | */ | ||
1109 | -int skb_splice_bits(struct sk_buff *__skb, unsigned int offset, | ||
1110 | +int skb_splice_bits(struct sk_buff *skb, unsigned int offset, | ||
1111 | struct pipe_inode_info *pipe, unsigned int tlen, | ||
1112 | unsigned int flags) | ||
1113 | { | ||
1114 | @@ -1383,16 +1396,6 @@ int skb_splice_bits(struct sk_buff *__skb, unsigned int offset, | ||
1115 | .ops = &sock_pipe_buf_ops, | ||
1116 | .spd_release = sock_spd_release, | ||
1117 | }; | ||
1118 | - struct sk_buff *skb; | ||
1119 | - | ||
1120 | - /* | ||
1121 | - * I'd love to avoid the clone here, but tcp_read_sock() | ||
1122 | - * ignores reference counts and unconditonally kills the sk_buff | ||
1123 | - * on return from the actor. | ||
1124 | - */ | ||
1125 | - skb = skb_clone(__skb, GFP_KERNEL); | ||
1126 | - if (unlikely(!skb)) | ||
1127 | - return -ENOMEM; | ||
1128 | |||
1129 | /* | ||
1130 | * __skb_splice_bits() only fails if the output has no room left, | ||
1131 | @@ -1416,15 +1419,9 @@ int skb_splice_bits(struct sk_buff *__skb, unsigned int offset, | ||
1132 | } | ||
1133 | |||
1134 | done: | ||
1135 | - /* | ||
1136 | - * drop our reference to the clone, the pipe consumption will | ||
1137 | - * drop the rest. | ||
1138 | - */ | ||
1139 | - kfree_skb(skb); | ||
1140 | - | ||
1141 | if (spd.nr_pages) { | ||
1142 | + struct sock *sk = skb->sk; | ||
1143 | int ret; | ||
1144 | - struct sock *sk = __skb->sk; | ||
1145 | |||
1146 | /* | ||
1147 | * Drop the socket lock, otherwise we have reverse | ||
1148 | @@ -2001,10 +1998,10 @@ unsigned int skb_seq_read(unsigned int consumed, const u8 **data, | ||
1149 | return 0; | ||
1150 | |||
1151 | next_skb: | ||
1152 | - block_limit = skb_headlen(st->cur_skb); | ||
1153 | + block_limit = skb_headlen(st->cur_skb) + st->stepped_offset; | ||
1154 | |||
1155 | if (abs_offset < block_limit) { | ||
1156 | - *data = st->cur_skb->data + abs_offset; | ||
1157 | + *data = st->cur_skb->data + (abs_offset - st->stepped_offset); | ||
1158 | return block_limit - abs_offset; | ||
1159 | } | ||
1160 | |||
1161 | @@ -2039,13 +2036,14 @@ next_skb: | ||
1162 | st->frag_data = NULL; | ||
1163 | } | ||
1164 | |||
1165 | - if (st->cur_skb->next) { | ||
1166 | - st->cur_skb = st->cur_skb->next; | ||
1167 | + if (st->root_skb == st->cur_skb && | ||
1168 | + skb_shinfo(st->root_skb)->frag_list) { | ||
1169 | + st->cur_skb = skb_shinfo(st->root_skb)->frag_list; | ||
1170 | st->frag_idx = 0; | ||
1171 | goto next_skb; | ||
1172 | - } else if (st->root_skb == st->cur_skb && | ||
1173 | - skb_shinfo(st->root_skb)->frag_list) { | ||
1174 | - st->cur_skb = skb_shinfo(st->root_skb)->frag_list; | ||
1175 | + } else if (st->cur_skb->next) { | ||
1176 | + st->cur_skb = st->cur_skb->next; | ||
1177 | + st->frag_idx = 0; | ||
1178 | goto next_skb; | ||
1179 | } | ||
1180 | |||
1181 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
1182 | index 91f8bbc..b1b2f22 100644 | ||
1183 | --- a/net/core/sock.c | ||
1184 | +++ b/net/core/sock.c | ||
1185 | @@ -695,6 +695,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | ||
1186 | if (len < 0) | ||
1187 | return -EINVAL; | ||
1188 | |||
1189 | + v.val = 0; | ||
1190 | + | ||
1191 | switch(optname) { | ||
1192 | case SO_DEBUG: | ||
1193 | v.val = sock_flag(sk, SOCK_DBG); | ||
1194 | diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c | ||
1195 | index 42065ff..ff75000 100644 | ||
1196 | --- a/net/ipv4/ipconfig.c | ||
1197 | +++ b/net/ipv4/ipconfig.c | ||
1198 | @@ -1272,6 +1272,9 @@ __be32 __init root_nfs_parse_addr(char *name) | ||
1199 | static int __init ip_auto_config(void) | ||
1200 | { | ||
1201 | __be32 addr; | ||
1202 | +#ifdef IPCONFIG_DYNAMIC | ||
1203 | + int retries = CONF_OPEN_RETRIES; | ||
1204 | +#endif | ||
1205 | |||
1206 | #ifdef CONFIG_PROC_FS | ||
1207 | proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops); | ||
1208 | @@ -1308,9 +1311,6 @@ static int __init ip_auto_config(void) | ||
1209 | #endif | ||
1210 | ic_first_dev->next) { | ||
1211 | #ifdef IPCONFIG_DYNAMIC | ||
1212 | - | ||
1213 | - int retries = CONF_OPEN_RETRIES; | ||
1214 | - | ||
1215 | if (ic_dynamic() < 0) { | ||
1216 | ic_close_devs(); | ||
1217 | |||
1218 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
1219 | index f57d576..9440ba6 100644 | ||
1220 | --- a/net/ipv4/tcp.c | ||
1221 | +++ b/net/ipv4/tcp.c | ||
1222 | @@ -518,8 +518,13 @@ static int tcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, | ||
1223 | unsigned int offset, size_t len) | ||
1224 | { | ||
1225 | struct tcp_splice_state *tss = rd_desc->arg.data; | ||
1226 | + int ret; | ||
1227 | |||
1228 | - return skb_splice_bits(skb, offset, tss->pipe, tss->len, tss->flags); | ||
1229 | + ret = skb_splice_bits(skb, offset, tss->pipe, min(rd_desc->count, len), | ||
1230 | + tss->flags); | ||
1231 | + if (ret > 0) | ||
1232 | + rd_desc->count -= ret; | ||
1233 | + return ret; | ||
1234 | } | ||
1235 | |||
1236 | static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss) | ||
1237 | @@ -527,6 +532,7 @@ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss) | ||
1238 | /* Store TCP splice context information in read_descriptor_t. */ | ||
1239 | read_descriptor_t rd_desc = { | ||
1240 | .arg.data = tss, | ||
1241 | + .count = tss->len, | ||
1242 | }; | ||
1243 | |||
1244 | return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv); | ||
1245 | @@ -611,11 +617,13 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos, | ||
1246 | tss.len -= ret; | ||
1247 | spliced += ret; | ||
1248 | |||
1249 | + if (!timeo) | ||
1250 | + break; | ||
1251 | release_sock(sk); | ||
1252 | lock_sock(sk); | ||
1253 | |||
1254 | if (sk->sk_err || sk->sk_state == TCP_CLOSE || | ||
1255 | - (sk->sk_shutdown & RCV_SHUTDOWN) || !timeo || | ||
1256 | + (sk->sk_shutdown & RCV_SHUTDOWN) || | ||
1257 | signal_pending(current)) | ||
1258 | break; | ||
1259 | } | ||
1260 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c | ||
1261 | index 915e6b7..a9b62ee 100644 | ||
1262 | --- a/net/ipv4/udp.c | ||
1263 | +++ b/net/ipv4/udp.c | ||
1264 | @@ -959,9 +959,11 @@ static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | ||
1265 | |||
1266 | if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) { | ||
1267 | /* Note that an ENOMEM error is charged twice */ | ||
1268 | - if (rc == -ENOMEM) | ||
1269 | + if (rc == -ENOMEM) { | ||
1270 | UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS, | ||
1271 | is_udplite); | ||
1272 | + atomic_inc(&sk->sk_drops); | ||
1273 | + } | ||
1274 | goto drop; | ||
1275 | } | ||
1276 | |||
1277 | @@ -1172,7 +1174,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[], | ||
1278 | int proto) | ||
1279 | { | ||
1280 | struct sock *sk; | ||
1281 | - struct udphdr *uh = udp_hdr(skb); | ||
1282 | + struct udphdr *uh; | ||
1283 | unsigned short ulen; | ||
1284 | struct rtable *rt = (struct rtable*)skb->dst; | ||
1285 | __be32 saddr = ip_hdr(skb)->saddr; | ||
1286 | @@ -1185,6 +1187,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[], | ||
1287 | if (!pskb_may_pull(skb, sizeof(struct udphdr))) | ||
1288 | goto drop; /* No space for header. */ | ||
1289 | |||
1290 | + uh = udp_hdr(skb); | ||
1291 | ulen = ntohs(uh->len); | ||
1292 | if (ulen > skb->len) | ||
1293 | goto short_packet; | ||
1294 | diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c | ||
1295 | index 37a4e77..489a7fd 100644 | ||
1296 | --- a/net/ipv6/ip6_flowlabel.c | ||
1297 | +++ b/net/ipv6/ip6_flowlabel.c | ||
1298 | @@ -323,17 +323,21 @@ static struct ip6_flowlabel * | ||
1299 | fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval, | ||
1300 | int optlen, int *err_p) | ||
1301 | { | ||
1302 | - struct ip6_flowlabel *fl; | ||
1303 | + struct ip6_flowlabel *fl = NULL; | ||
1304 | int olen; | ||
1305 | int addr_type; | ||
1306 | int err; | ||
1307 | |||
1308 | + olen = optlen - CMSG_ALIGN(sizeof(*freq)); | ||
1309 | + err = -EINVAL; | ||
1310 | + if (olen > 64 * 1024) | ||
1311 | + goto done; | ||
1312 | + | ||
1313 | err = -ENOMEM; | ||
1314 | fl = kzalloc(sizeof(*fl), GFP_KERNEL); | ||
1315 | if (fl == NULL) | ||
1316 | goto done; | ||
1317 | |||
1318 | - olen = optlen - CMSG_ALIGN(sizeof(*freq)); | ||
1319 | if (olen > 0) { | ||
1320 | struct msghdr msg; | ||
1321 | struct flowi flowi; | ||
1322 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c | ||
1323 | index 3df2c44..a423200 100644 | ||
1324 | --- a/net/ipv6/ip6_output.c | ||
1325 | +++ b/net/ipv6/ip6_output.c | ||
1326 | @@ -1091,6 +1091,18 @@ static inline int ip6_ufo_append_data(struct sock *sk, | ||
1327 | return err; | ||
1328 | } | ||
1329 | |||
1330 | +static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src, | ||
1331 | + gfp_t gfp) | ||
1332 | +{ | ||
1333 | + return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL; | ||
1334 | +} | ||
1335 | + | ||
1336 | +static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src, | ||
1337 | + gfp_t gfp) | ||
1338 | +{ | ||
1339 | + return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL; | ||
1340 | +} | ||
1341 | + | ||
1342 | int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | ||
1343 | int offset, int len, int odd, struct sk_buff *skb), | ||
1344 | void *from, int length, int transhdrlen, | ||
1345 | @@ -1116,17 +1128,37 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | ||
1346 | * setup for corking | ||
1347 | */ | ||
1348 | if (opt) { | ||
1349 | - if (np->cork.opt == NULL) { | ||
1350 | - np->cork.opt = kmalloc(opt->tot_len, | ||
1351 | - sk->sk_allocation); | ||
1352 | - if (unlikely(np->cork.opt == NULL)) | ||
1353 | - return -ENOBUFS; | ||
1354 | - } else if (np->cork.opt->tot_len < opt->tot_len) { | ||
1355 | - printk(KERN_DEBUG "ip6_append_data: invalid option length\n"); | ||
1356 | + if (WARN_ON(np->cork.opt)) | ||
1357 | return -EINVAL; | ||
1358 | - } | ||
1359 | - memcpy(np->cork.opt, opt, opt->tot_len); | ||
1360 | - inet->cork.flags |= IPCORK_OPT; | ||
1361 | + | ||
1362 | + np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation); | ||
1363 | + if (unlikely(np->cork.opt == NULL)) | ||
1364 | + return -ENOBUFS; | ||
1365 | + | ||
1366 | + np->cork.opt->tot_len = opt->tot_len; | ||
1367 | + np->cork.opt->opt_flen = opt->opt_flen; | ||
1368 | + np->cork.opt->opt_nflen = opt->opt_nflen; | ||
1369 | + | ||
1370 | + np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt, | ||
1371 | + sk->sk_allocation); | ||
1372 | + if (opt->dst0opt && !np->cork.opt->dst0opt) | ||
1373 | + return -ENOBUFS; | ||
1374 | + | ||
1375 | + np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt, | ||
1376 | + sk->sk_allocation); | ||
1377 | + if (opt->dst1opt && !np->cork.opt->dst1opt) | ||
1378 | + return -ENOBUFS; | ||
1379 | + | ||
1380 | + np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt, | ||
1381 | + sk->sk_allocation); | ||
1382 | + if (opt->hopopt && !np->cork.opt->hopopt) | ||
1383 | + return -ENOBUFS; | ||
1384 | + | ||
1385 | + np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt, | ||
1386 | + sk->sk_allocation); | ||
1387 | + if (opt->srcrt && !np->cork.opt->srcrt) | ||
1388 | + return -ENOBUFS; | ||
1389 | + | ||
1390 | /* need source address above miyazawa*/ | ||
1391 | } | ||
1392 | dst_hold(&rt->u.dst); | ||
1393 | @@ -1153,8 +1185,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, | ||
1394 | } else { | ||
1395 | rt = (struct rt6_info *)inet->cork.dst; | ||
1396 | fl = &inet->cork.fl; | ||
1397 | - if (inet->cork.flags & IPCORK_OPT) | ||
1398 | - opt = np->cork.opt; | ||
1399 | + opt = np->cork.opt; | ||
1400 | transhdrlen = 0; | ||
1401 | exthdrlen = 0; | ||
1402 | mtu = inet->cork.fragsize; | ||
1403 | @@ -1393,9 +1424,15 @@ error: | ||
1404 | |||
1405 | static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np) | ||
1406 | { | ||
1407 | - inet->cork.flags &= ~IPCORK_OPT; | ||
1408 | - kfree(np->cork.opt); | ||
1409 | - np->cork.opt = NULL; | ||
1410 | + if (np->cork.opt) { | ||
1411 | + kfree(np->cork.opt->dst0opt); | ||
1412 | + kfree(np->cork.opt->dst1opt); | ||
1413 | + kfree(np->cork.opt->hopopt); | ||
1414 | + kfree(np->cork.opt->srcrt); | ||
1415 | + kfree(np->cork.opt); | ||
1416 | + np->cork.opt = NULL; | ||
1417 | + } | ||
1418 | + | ||
1419 | if (inet->cork.dst) { | ||
1420 | dst_release(inet->cork.dst); | ||
1421 | inet->cork.dst = NULL; | ||
1422 | diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | ||
1423 | index 14d47d8..0610123 100644 | ||
1424 | --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | ||
1425 | +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | ||
1426 | @@ -49,8 +49,8 @@ static bool icmpv6_pkt_to_tuple(const struct sk_buff *skb, | ||
1427 | static const u_int8_t invmap[] = { | ||
1428 | [ICMPV6_ECHO_REQUEST - 128] = ICMPV6_ECHO_REPLY + 1, | ||
1429 | [ICMPV6_ECHO_REPLY - 128] = ICMPV6_ECHO_REQUEST + 1, | ||
1430 | - [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_QUERY + 1, | ||
1431 | - [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_REPLY +1 | ||
1432 | + [ICMPV6_NI_QUERY - 128] = ICMPV6_NI_REPLY + 1, | ||
1433 | + [ICMPV6_NI_REPLY - 128] = ICMPV6_NI_QUERY +1 | ||
1434 | }; | ||
1435 | |||
1436 | static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple, | ||
1437 | diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c | ||
1438 | index 79a0627..27bd353 100644 | ||
1439 | --- a/net/mac80211/debugfs_sta.c | ||
1440 | +++ b/net/mac80211/debugfs_sta.c | ||
1441 | @@ -200,7 +200,7 @@ static ssize_t sta_agg_status_write(struct file *file, | ||
1442 | /* toggle Rx aggregation command */ | ||
1443 | tid_num = tid_num - 100; | ||
1444 | if (tid_static_rx[tid_num] == 1) { | ||
1445 | - strcpy(state, "off "); | ||
1446 | + strcpy(state, "off"); | ||
1447 | ieee80211_sta_stop_rx_ba_session(dev, da, tid_num, 0, | ||
1448 | WLAN_REASON_QSTA_REQUIRE_SETUP); | ||
1449 | sta->ampdu_mlme.tid_state_rx[tid_num] |= | ||
1450 | diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c | ||
1451 | index e6e4681..aa7aec0 100644 | ||
1452 | --- a/net/netfilter/xt_sctp.c | ||
1453 | +++ b/net/netfilter/xt_sctp.c | ||
1454 | @@ -105,7 +105,7 @@ match_packet(const struct sk_buff *skb, | ||
1455 | |||
1456 | switch (chunk_match_type) { | ||
1457 | case SCTP_CHUNK_MATCH_ALL: | ||
1458 | - return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap); | ||
1459 | + return SCTP_CHUNKMAP_IS_CLEAR(chunkmapcopy); | ||
1460 | case SCTP_CHUNK_MATCH_ANY: | ||
1461 | return false; | ||
1462 | case SCTP_CHUNK_MATCH_ONLY: | ||
1463 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c | ||
1464 | index c718e7e..4b50878 100644 | ||
1465 | --- a/net/packet/af_packet.c | ||
1466 | +++ b/net/packet/af_packet.c | ||
1467 | @@ -77,6 +77,7 @@ | ||
1468 | #include <linux/poll.h> | ||
1469 | #include <linux/module.h> | ||
1470 | #include <linux/init.h> | ||
1471 | +#include <linux/mutex.h> | ||
1472 | |||
1473 | #ifdef CONFIG_INET | ||
1474 | #include <net/inet_common.h> | ||
1475 | @@ -175,6 +176,7 @@ struct packet_sock { | ||
1476 | #endif | ||
1477 | struct packet_type prot_hook; | ||
1478 | spinlock_t bind_lock; | ||
1479 | + struct mutex pg_vec_lock; | ||
1480 | unsigned int running:1, /* prot_hook is attached*/ | ||
1481 | auxdata:1, | ||
1482 | origdev:1; | ||
1483 | @@ -220,13 +222,13 @@ static void *packet_lookup_frame(struct packet_sock *po, unsigned int position, | ||
1484 | h.raw = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size); | ||
1485 | switch (po->tp_version) { | ||
1486 | case TPACKET_V1: | ||
1487 | - if (status != h.h1->tp_status ? TP_STATUS_USER : | ||
1488 | - TP_STATUS_KERNEL) | ||
1489 | + if (status != (h.h1->tp_status ? TP_STATUS_USER : | ||
1490 | + TP_STATUS_KERNEL)) | ||
1491 | return NULL; | ||
1492 | break; | ||
1493 | case TPACKET_V2: | ||
1494 | - if (status != h.h2->tp_status ? TP_STATUS_USER : | ||
1495 | - TP_STATUS_KERNEL) | ||
1496 | + if (status != (h.h2->tp_status ? TP_STATUS_USER : | ||
1497 | + TP_STATUS_KERNEL)) | ||
1498 | return NULL; | ||
1499 | break; | ||
1500 | } | ||
1501 | @@ -1068,6 +1070,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol) | ||
1502 | */ | ||
1503 | |||
1504 | spin_lock_init(&po->bind_lock); | ||
1505 | + mutex_init(&po->pg_vec_lock); | ||
1506 | po->prot_hook.func = packet_rcv; | ||
1507 | |||
1508 | if (sock->type == SOCK_PACKET) | ||
1509 | @@ -1863,6 +1866,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing | ||
1510 | synchronize_net(); | ||
1511 | |||
1512 | err = -EBUSY; | ||
1513 | + mutex_lock(&po->pg_vec_lock); | ||
1514 | if (closing || atomic_read(&po->mapped) == 0) { | ||
1515 | err = 0; | ||
1516 | #define XC(a, b) ({ __typeof__ ((a)) __t; __t = (a); (a) = (b); __t; }) | ||
1517 | @@ -1884,6 +1888,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing | ||
1518 | if (atomic_read(&po->mapped)) | ||
1519 | printk(KERN_DEBUG "packet_mmap: vma is busy: %d\n", atomic_read(&po->mapped)); | ||
1520 | } | ||
1521 | + mutex_unlock(&po->pg_vec_lock); | ||
1522 | |||
1523 | spin_lock(&po->bind_lock); | ||
1524 | if (was_running && !po->running) { | ||
1525 | @@ -1916,7 +1921,7 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st | ||
1526 | |||
1527 | size = vma->vm_end - vma->vm_start; | ||
1528 | |||
1529 | - lock_sock(sk); | ||
1530 | + mutex_lock(&po->pg_vec_lock); | ||
1531 | if (po->pg_vec == NULL) | ||
1532 | goto out; | ||
1533 | if (size != po->pg_vec_len*po->pg_vec_pages*PAGE_SIZE) | ||
1534 | @@ -1939,7 +1944,7 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st | ||
1535 | err = 0; | ||
1536 | |||
1537 | out: | ||
1538 | - release_sock(sk); | ||
1539 | + mutex_unlock(&po->pg_vec_lock); | ||
1540 | return err; | ||
1541 | } | ||
1542 | #endif | ||
1543 | diff --git a/net/sctp/output.c b/net/sctp/output.c | ||
1544 | index 225c712..e4746fd 100644 | ||
1545 | --- a/net/sctp/output.c | ||
1546 | +++ b/net/sctp/output.c | ||
1547 | @@ -324,14 +324,16 @@ append: | ||
1548 | switch (chunk->chunk_hdr->type) { | ||
1549 | case SCTP_CID_DATA: | ||
1550 | retval = sctp_packet_append_data(packet, chunk); | ||
1551 | + if (SCTP_XMIT_OK != retval) | ||
1552 | + goto finish; | ||
1553 | /* Disallow SACK bundling after DATA. */ | ||
1554 | packet->has_sack = 1; | ||
1555 | /* Disallow AUTH bundling after DATA */ | ||
1556 | packet->has_auth = 1; | ||
1557 | /* Let it be knows that packet has DATA in it */ | ||
1558 | packet->has_data = 1; | ||
1559 | - if (SCTP_XMIT_OK != retval) | ||
1560 | - goto finish; | ||
1561 | + /* timestamp the chunk for rtx purposes */ | ||
1562 | + chunk->sent_at = jiffies; | ||
1563 | break; | ||
1564 | case SCTP_CID_COOKIE_ECHO: | ||
1565 | packet->has_cookie_echo = 1; | ||
1566 | @@ -470,7 +472,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) | ||
1567 | } else | ||
1568 | chunk->resent = 1; | ||
1569 | |||
1570 | - chunk->sent_at = jiffies; | ||
1571 | has_data = 1; | ||
1572 | } | ||
1573 | |||
1574 | diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c | ||
1575 | index 4328ad5..fe11686 100644 | ||
1576 | --- a/net/sctp/outqueue.c | ||
1577 | +++ b/net/sctp/outqueue.c | ||
1578 | @@ -929,7 +929,6 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | ||
1579 | } | ||
1580 | |||
1581 | /* Finally, transmit new packets. */ | ||
1582 | - start_timer = 0; | ||
1583 | while ((chunk = sctp_outq_dequeue_data(q)) != NULL) { | ||
1584 | /* RFC 2960 6.5 Every DATA chunk MUST carry a valid | ||
1585 | * stream identifier. | ||
1586 | @@ -1028,7 +1027,7 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | ||
1587 | list_add_tail(&chunk->transmitted_list, | ||
1588 | &transport->transmitted); | ||
1589 | |||
1590 | - sctp_transport_reset_timers(transport, start_timer-1); | ||
1591 | + sctp_transport_reset_timers(transport, 0); | ||
1592 | |||
1593 | q->empty = 0; | ||
1594 | |||
1595 | diff --git a/scripts/kernel-doc b/scripts/kernel-doc | ||
1596 | index 44ee94d..0865a89 100755 | ||
1597 | --- a/scripts/kernel-doc | ||
1598 | +++ b/scripts/kernel-doc | ||
1599 | @@ -1758,6 +1758,40 @@ sub reset_state { | ||
1600 | $state = 0; | ||
1601 | } | ||
1602 | |||
1603 | +sub syscall_munge() { | ||
1604 | + my $void = 0; | ||
1605 | + | ||
1606 | + $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs | ||
1607 | +## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) { | ||
1608 | + if ($prototype =~ m/SYSCALL_DEFINE0/) { | ||
1609 | + $void = 1; | ||
1610 | +## $prototype = "long sys_$1(void)"; | ||
1611 | + } | ||
1612 | + | ||
1613 | + $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name | ||
1614 | + if ($prototype =~ m/long (sys_.*?),/) { | ||
1615 | + $prototype =~ s/,/\(/; | ||
1616 | + } elsif ($void) { | ||
1617 | + $prototype =~ s/\)/\(void\)/; | ||
1618 | + } | ||
1619 | + | ||
1620 | + # now delete all of the odd-number commas in $prototype | ||
1621 | + # so that arg types & arg names don't have a comma between them | ||
1622 | + my $count = 0; | ||
1623 | + my $len = length($prototype); | ||
1624 | + if ($void) { | ||
1625 | + $len = 0; # skip the for-loop | ||
1626 | + } | ||
1627 | + for (my $ix = 0; $ix < $len; $ix++) { | ||
1628 | + if (substr($prototype, $ix, 1) eq ',') { | ||
1629 | + $count++; | ||
1630 | + if ($count % 2 == 1) { | ||
1631 | + substr($prototype, $ix, 1) = ' '; | ||
1632 | + } | ||
1633 | + } | ||
1634 | + } | ||
1635 | +} | ||
1636 | + | ||
1637 | sub process_state3_function($$) { | ||
1638 | my $x = shift; | ||
1639 | my $file = shift; | ||
1640 | @@ -1774,7 +1808,10 @@ sub process_state3_function($$) { | ||
1641 | $prototype =~ s@/\*.*?\*/@@gos; # strip comments. | ||
1642 | $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's. | ||
1643 | $prototype =~ s@^\s+@@gos; # strip leading spaces | ||
1644 | - dump_function($prototype,$file); | ||
1645 | + if ($prototype =~ /SYSCALL_DEFINE/) { | ||
1646 | + syscall_munge(); | ||
1647 | + } | ||
1648 | + dump_function($prototype, $file); | ||
1649 | reset_state(); | ||
1650 | } | ||
1651 | } | ||
1652 | diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c | ||
1653 | index b5e1a71..04d50aa 100644 | ||
1654 | --- a/sound/drivers/mtpav.c | ||
1655 | +++ b/sound/drivers/mtpav.c | ||
1656 | @@ -706,7 +706,6 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev) | ||
1657 | mtp_card->card = card; | ||
1658 | mtp_card->irq = -1; | ||
1659 | mtp_card->share_irq = 0; | ||
1660 | - mtp_card->inmidiport = 0xffffffff; | ||
1661 | mtp_card->inmidistate = 0; | ||
1662 | mtp_card->outmidihwport = 0xffffffff; | ||
1663 | init_timer(&mtp_card->timer); | ||
1664 | @@ -715,6 +714,8 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev) | ||
1665 | |||
1666 | card->private_free = snd_mtpav_free; | ||
1667 | |||
1668 | + mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST; | ||
1669 | + | ||
1670 | err = snd_mtpav_get_ISA(mtp_card); | ||
1671 | if (err < 0) | ||
1672 | goto __error; |