Contents of /trunk/kernel-alx/patches-3.4/0124-3.4.25-all-fixes.patch
Parent Directory | Revision Log
Revision 2110 -
(show annotations)
(download)
Tue Mar 12 12:15:23 2013 UTC (11 years, 6 months ago) by niro
File size: 110677 byte(s)
Tue Mar 12 12:15:23 2013 UTC (11 years, 6 months ago) by niro
File size: 110677 byte(s)
-sync with upstream
1 | diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt |
2 | index 1619a8c..7977153 100644 |
3 | --- a/Documentation/networking/ip-sysctl.txt |
4 | +++ b/Documentation/networking/ip-sysctl.txt |
5 | @@ -537,6 +537,11 @@ tcp_thin_dupack - BOOLEAN |
6 | Documentation/networking/tcp-thin.txt |
7 | Default: 0 |
8 | |
9 | +tcp_challenge_ack_limit - INTEGER |
10 | + Limits number of Challenge ACK sent per second, as recommended |
11 | + in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks) |
12 | + Default: 100 |
13 | + |
14 | UDP variables: |
15 | |
16 | udp_mem - vector of 3 INTEGERs: min, pressure, max |
17 | diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c |
18 | index df74518..ab1017b 100644 |
19 | --- a/arch/arm/kernel/swp_emulate.c |
20 | +++ b/arch/arm/kernel/swp_emulate.c |
21 | @@ -109,10 +109,12 @@ static void set_segfault(struct pt_regs *regs, unsigned long addr) |
22 | { |
23 | siginfo_t info; |
24 | |
25 | + down_read(¤t->mm->mmap_sem); |
26 | if (find_vma(current->mm, addr) == NULL) |
27 | info.si_code = SEGV_MAPERR; |
28 | else |
29 | info.si_code = SEGV_ACCERR; |
30 | + up_read(¤t->mm->mmap_sem); |
31 | |
32 | info.si_signo = SIGSEGV; |
33 | info.si_errno = 0; |
34 | diff --git a/arch/arm/mach-realview/include/mach/board-eb.h b/arch/arm/mach-realview/include/mach/board-eb.h |
35 | index 124bce6..a301e61 100644 |
36 | --- a/arch/arm/mach-realview/include/mach/board-eb.h |
37 | +++ b/arch/arm/mach-realview/include/mach/board-eb.h |
38 | @@ -47,7 +47,7 @@ |
39 | #define REALVIEW_EB_USB_BASE 0x4F000000 /* USB */ |
40 | |
41 | #ifdef CONFIG_REALVIEW_EB_ARM11MP_REVB |
42 | -#define REALVIEW_EB11MP_PRIV_MEM_BASE 0x1F000000 |
43 | +#define REALVIEW_EB11MP_PRIV_MEM_BASE 0x10100000 |
44 | #define REALVIEW_EB11MP_L220_BASE 0x10102000 /* L220 registers */ |
45 | #define REALVIEW_EB11MP_SYS_PLD_CTRL1 0xD8 /* Register offset for MPCore sysctl */ |
46 | #else |
47 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
48 | index 7d41919..5df5492 100644 |
49 | --- a/arch/arm/mm/mmu.c |
50 | +++ b/arch/arm/mm/mmu.c |
51 | @@ -497,7 +497,7 @@ static void __init build_mem_type_table(void) |
52 | #endif |
53 | |
54 | for (i = 0; i < 16; i++) { |
55 | - unsigned long v = pgprot_val(protection_map[i]); |
56 | + pteval_t v = pgprot_val(protection_map[i]); |
57 | protection_map[i] = __pgprot(v | user_pgprot); |
58 | } |
59 | |
60 | diff --git a/arch/cris/include/asm/io.h b/arch/cris/include/asm/io.h |
61 | index 32567bc..ac12ae2 100644 |
62 | --- a/arch/cris/include/asm/io.h |
63 | +++ b/arch/cris/include/asm/io.h |
64 | @@ -133,12 +133,39 @@ static inline void writel(unsigned int b, volatile void __iomem *addr) |
65 | #define insb(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,1,count) : 0) |
66 | #define insw(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,2,count) : 0) |
67 | #define insl(port,addr,count) (cris_iops ? cris_iops->read_io(port,addr,4,count) : 0) |
68 | -#define outb(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,1,1) |
69 | -#define outw(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,2,1) |
70 | -#define outl(data,port) if (cris_iops) cris_iops->write_io(port,(void*)(unsigned)data,4,1) |
71 | -#define outsb(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,1,count) |
72 | -#define outsw(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,2,count) |
73 | -#define outsl(port,addr,count) if(cris_iops) cris_iops->write_io(port,(void*)addr,3,count) |
74 | +static inline void outb(unsigned char data, unsigned int port) |
75 | +{ |
76 | + if (cris_iops) |
77 | + cris_iops->write_io(port, (void *) &data, 1, 1); |
78 | +} |
79 | +static inline void outw(unsigned short data, unsigned int port) |
80 | +{ |
81 | + if (cris_iops) |
82 | + cris_iops->write_io(port, (void *) &data, 2, 1); |
83 | +} |
84 | +static inline void outl(unsigned int data, unsigned int port) |
85 | +{ |
86 | + if (cris_iops) |
87 | + cris_iops->write_io(port, (void *) &data, 4, 1); |
88 | +} |
89 | +static inline void outsb(unsigned int port, const void *addr, |
90 | + unsigned long count) |
91 | +{ |
92 | + if (cris_iops) |
93 | + cris_iops->write_io(port, (void *)addr, 1, count); |
94 | +} |
95 | +static inline void outsw(unsigned int port, const void *addr, |
96 | + unsigned long count) |
97 | +{ |
98 | + if (cris_iops) |
99 | + cris_iops->write_io(port, (void *)addr, 2, count); |
100 | +} |
101 | +static inline void outsl(unsigned int port, const void *addr, |
102 | + unsigned long count) |
103 | +{ |
104 | + if (cris_iops) |
105 | + cris_iops->write_io(port, (void *)addr, 4, count); |
106 | +} |
107 | |
108 | /* |
109 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem |
110 | diff --git a/arch/sparc/include/asm/hugetlb.h b/arch/sparc/include/asm/hugetlb.h |
111 | index 1770610..f368cef 100644 |
112 | --- a/arch/sparc/include/asm/hugetlb.h |
113 | +++ b/arch/sparc/include/asm/hugetlb.h |
114 | @@ -58,14 +58,20 @@ static inline pte_t huge_pte_wrprotect(pte_t pte) |
115 | static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, |
116 | unsigned long addr, pte_t *ptep) |
117 | { |
118 | - ptep_set_wrprotect(mm, addr, ptep); |
119 | + pte_t old_pte = *ptep; |
120 | + set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte)); |
121 | } |
122 | |
123 | static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, |
124 | unsigned long addr, pte_t *ptep, |
125 | pte_t pte, int dirty) |
126 | { |
127 | - return ptep_set_access_flags(vma, addr, ptep, pte, dirty); |
128 | + int changed = !pte_same(*ptep, pte); |
129 | + if (changed) { |
130 | + set_huge_pte_at(vma->vm_mm, addr, ptep, pte); |
131 | + flush_tlb_page(vma, addr); |
132 | + } |
133 | + return changed; |
134 | } |
135 | |
136 | static inline pte_t huge_ptep_get(pte_t *ptep) |
137 | diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c |
138 | index 146bb62..6b4976b 100644 |
139 | --- a/arch/x86/kernel/cpu/amd.c |
140 | +++ b/arch/x86/kernel/cpu/amd.c |
141 | @@ -598,6 +598,20 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) |
142 | } |
143 | } |
144 | |
145 | + /* |
146 | + * The way access filter has a performance penalty on some workloads. |
147 | + * Disable it on the affected CPUs. |
148 | + */ |
149 | + if ((c->x86 == 0x15) && |
150 | + (c->x86_model >= 0x02) && (c->x86_model < 0x20)) { |
151 | + u64 val; |
152 | + |
153 | + if (!rdmsrl_safe(0xc0011021, &val) && !(val & 0x1E)) { |
154 | + val |= 0x1E; |
155 | + checking_wrmsrl(0xc0011021, val); |
156 | + } |
157 | + } |
158 | + |
159 | cpu_detect_cache_sizes(c); |
160 | |
161 | /* Multi core CPU? */ |
162 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
163 | index 85cbfdc..bd3199c 100644 |
164 | --- a/drivers/acpi/scan.c |
165 | +++ b/drivers/acpi/scan.c |
166 | @@ -1157,7 +1157,7 @@ static void acpi_device_set_id(struct acpi_device *device) |
167 | acpi_add_id(device, ACPI_DOCK_HID); |
168 | else if (!acpi_ibm_smbus_match(device)) |
169 | acpi_add_id(device, ACPI_SMBUS_IBM_HID); |
170 | - else if (!acpi_device_hid(device) && |
171 | + else if (list_empty(&device->pnp.ids) && |
172 | ACPI_IS_ROOT_DEVICE(device->parent)) { |
173 | acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */ |
174 | strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME); |
175 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
176 | index 480b648..aa0a904 100644 |
177 | --- a/drivers/acpi/sleep.c |
178 | +++ b/drivers/acpi/sleep.c |
179 | @@ -138,6 +138,180 @@ void __init acpi_old_suspend_ordering(void) |
180 | old_suspend_ordering = true; |
181 | } |
182 | |
183 | +static int __init init_old_suspend_ordering(const struct dmi_system_id *d) |
184 | +{ |
185 | + acpi_old_suspend_ordering(); |
186 | + return 0; |
187 | +} |
188 | + |
189 | +static int __init init_nvs_nosave(const struct dmi_system_id *d) |
190 | +{ |
191 | + acpi_nvs_nosave(); |
192 | + return 0; |
193 | +} |
194 | + |
195 | +static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
196 | + { |
197 | + .callback = init_old_suspend_ordering, |
198 | + .ident = "Abit KN9 (nForce4 variant)", |
199 | + .matches = { |
200 | + DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"), |
201 | + DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"), |
202 | + }, |
203 | + }, |
204 | + { |
205 | + .callback = init_old_suspend_ordering, |
206 | + .ident = "HP xw4600 Workstation", |
207 | + .matches = { |
208 | + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
209 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), |
210 | + }, |
211 | + }, |
212 | + { |
213 | + .callback = init_old_suspend_ordering, |
214 | + .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)", |
215 | + .matches = { |
216 | + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."), |
217 | + DMI_MATCH(DMI_BOARD_NAME, "M2N8L"), |
218 | + }, |
219 | + }, |
220 | + { |
221 | + .callback = init_old_suspend_ordering, |
222 | + .ident = "Panasonic CF51-2L", |
223 | + .matches = { |
224 | + DMI_MATCH(DMI_BOARD_VENDOR, |
225 | + "Matsushita Electric Industrial Co.,Ltd."), |
226 | + DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), |
227 | + }, |
228 | + }, |
229 | + { |
230 | + .callback = init_nvs_nosave, |
231 | + .ident = "Sony Vaio VGN-FW21E", |
232 | + .matches = { |
233 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
234 | + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW21E"), |
235 | + }, |
236 | + }, |
237 | + { |
238 | + .callback = init_nvs_nosave, |
239 | + .ident = "Sony Vaio VPCEB17FX", |
240 | + .matches = { |
241 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
242 | + DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB17FX"), |
243 | + }, |
244 | + }, |
245 | + { |
246 | + .callback = init_nvs_nosave, |
247 | + .ident = "Sony Vaio VGN-SR11M", |
248 | + .matches = { |
249 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
250 | + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR11M"), |
251 | + }, |
252 | + }, |
253 | + { |
254 | + .callback = init_nvs_nosave, |
255 | + .ident = "Everex StepNote Series", |
256 | + .matches = { |
257 | + DMI_MATCH(DMI_SYS_VENDOR, "Everex Systems, Inc."), |
258 | + DMI_MATCH(DMI_PRODUCT_NAME, "Everex StepNote Series"), |
259 | + }, |
260 | + }, |
261 | + { |
262 | + .callback = init_nvs_nosave, |
263 | + .ident = "Sony Vaio VPCEB1Z1E", |
264 | + .matches = { |
265 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
266 | + DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1Z1E"), |
267 | + }, |
268 | + }, |
269 | + { |
270 | + .callback = init_nvs_nosave, |
271 | + .ident = "Sony Vaio VGN-NW130D", |
272 | + .matches = { |
273 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
274 | + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NW130D"), |
275 | + }, |
276 | + }, |
277 | + { |
278 | + .callback = init_nvs_nosave, |
279 | + .ident = "Sony Vaio VPCCW29FX", |
280 | + .matches = { |
281 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
282 | + DMI_MATCH(DMI_PRODUCT_NAME, "VPCCW29FX"), |
283 | + }, |
284 | + }, |
285 | + { |
286 | + .callback = init_nvs_nosave, |
287 | + .ident = "Averatec AV1020-ED2", |
288 | + .matches = { |
289 | + DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"), |
290 | + DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), |
291 | + }, |
292 | + }, |
293 | + { |
294 | + .callback = init_old_suspend_ordering, |
295 | + .ident = "Asus A8N-SLI DELUXE", |
296 | + .matches = { |
297 | + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), |
298 | + DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI DELUXE"), |
299 | + }, |
300 | + }, |
301 | + { |
302 | + .callback = init_old_suspend_ordering, |
303 | + .ident = "Asus A8N-SLI Premium", |
304 | + .matches = { |
305 | + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), |
306 | + DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI Premium"), |
307 | + }, |
308 | + }, |
309 | + { |
310 | + .callback = init_nvs_nosave, |
311 | + .ident = "Sony Vaio VGN-SR26GN_P", |
312 | + .matches = { |
313 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
314 | + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR26GN_P"), |
315 | + }, |
316 | + }, |
317 | + { |
318 | + .callback = init_nvs_nosave, |
319 | + .ident = "Sony Vaio VPCEB1S1E", |
320 | + .matches = { |
321 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
322 | + DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1S1E"), |
323 | + }, |
324 | + }, |
325 | + { |
326 | + .callback = init_nvs_nosave, |
327 | + .ident = "Sony Vaio VGN-FW520F", |
328 | + .matches = { |
329 | + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
330 | + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW520F"), |
331 | + }, |
332 | + }, |
333 | + { |
334 | + .callback = init_nvs_nosave, |
335 | + .ident = "Asus K54C", |
336 | + .matches = { |
337 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
338 | + DMI_MATCH(DMI_PRODUCT_NAME, "K54C"), |
339 | + }, |
340 | + }, |
341 | + { |
342 | + .callback = init_nvs_nosave, |
343 | + .ident = "Asus K54HR", |
344 | + .matches = { |
345 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
346 | + DMI_MATCH(DMI_PRODUCT_NAME, "K54HR"), |
347 | + }, |
348 | + }, |
349 | + {}, |
350 | +}; |
351 | + |
352 | +static void acpi_sleep_dmi_check(void) |
353 | +{ |
354 | + dmi_check_system(acpisleep_dmi_table); |
355 | +} |
356 | + |
357 | /** |
358 | * acpi_pm_freeze - Disable the GPEs and suspend EC transactions. |
359 | */ |
360 | @@ -227,6 +401,7 @@ static void acpi_pm_end(void) |
361 | } |
362 | #else /* !CONFIG_ACPI_SLEEP */ |
363 | #define acpi_target_sleep_state ACPI_STATE_S0 |
364 | +static inline void acpi_sleep_dmi_check(void) {} |
365 | #endif /* CONFIG_ACPI_SLEEP */ |
366 | |
367 | #ifdef CONFIG_SUSPEND |
368 | @@ -371,175 +546,6 @@ static const struct platform_suspend_ops acpi_suspend_ops_old = { |
369 | .end = acpi_pm_end, |
370 | .recover = acpi_pm_finish, |
371 | }; |
372 | - |
373 | -static int __init init_old_suspend_ordering(const struct dmi_system_id *d) |
374 | -{ |
375 | - old_suspend_ordering = true; |
376 | - return 0; |
377 | -} |
378 | - |
379 | -static int __init init_nvs_nosave(const struct dmi_system_id *d) |
380 | -{ |
381 | - acpi_nvs_nosave(); |
382 | - return 0; |
383 | -} |
384 | - |
385 | -static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
386 | - { |
387 | - .callback = init_old_suspend_ordering, |
388 | - .ident = "Abit KN9 (nForce4 variant)", |
389 | - .matches = { |
390 | - DMI_MATCH(DMI_BOARD_VENDOR, "http://www.abit.com.tw/"), |
391 | - DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"), |
392 | - }, |
393 | - }, |
394 | - { |
395 | - .callback = init_old_suspend_ordering, |
396 | - .ident = "HP xw4600 Workstation", |
397 | - .matches = { |
398 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
399 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), |
400 | - }, |
401 | - }, |
402 | - { |
403 | - .callback = init_old_suspend_ordering, |
404 | - .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)", |
405 | - .matches = { |
406 | - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."), |
407 | - DMI_MATCH(DMI_BOARD_NAME, "M2N8L"), |
408 | - }, |
409 | - }, |
410 | - { |
411 | - .callback = init_old_suspend_ordering, |
412 | - .ident = "Panasonic CF51-2L", |
413 | - .matches = { |
414 | - DMI_MATCH(DMI_BOARD_VENDOR, |
415 | - "Matsushita Electric Industrial Co.,Ltd."), |
416 | - DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), |
417 | - }, |
418 | - }, |
419 | - { |
420 | - .callback = init_nvs_nosave, |
421 | - .ident = "Sony Vaio VGN-FW21E", |
422 | - .matches = { |
423 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
424 | - DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW21E"), |
425 | - }, |
426 | - }, |
427 | - { |
428 | - .callback = init_nvs_nosave, |
429 | - .ident = "Sony Vaio VPCEB17FX", |
430 | - .matches = { |
431 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
432 | - DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB17FX"), |
433 | - }, |
434 | - }, |
435 | - { |
436 | - .callback = init_nvs_nosave, |
437 | - .ident = "Sony Vaio VGN-SR11M", |
438 | - .matches = { |
439 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
440 | - DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR11M"), |
441 | - }, |
442 | - }, |
443 | - { |
444 | - .callback = init_nvs_nosave, |
445 | - .ident = "Everex StepNote Series", |
446 | - .matches = { |
447 | - DMI_MATCH(DMI_SYS_VENDOR, "Everex Systems, Inc."), |
448 | - DMI_MATCH(DMI_PRODUCT_NAME, "Everex StepNote Series"), |
449 | - }, |
450 | - }, |
451 | - { |
452 | - .callback = init_nvs_nosave, |
453 | - .ident = "Sony Vaio VPCEB1Z1E", |
454 | - .matches = { |
455 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
456 | - DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1Z1E"), |
457 | - }, |
458 | - }, |
459 | - { |
460 | - .callback = init_nvs_nosave, |
461 | - .ident = "Sony Vaio VGN-NW130D", |
462 | - .matches = { |
463 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
464 | - DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NW130D"), |
465 | - }, |
466 | - }, |
467 | - { |
468 | - .callback = init_nvs_nosave, |
469 | - .ident = "Sony Vaio VPCCW29FX", |
470 | - .matches = { |
471 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
472 | - DMI_MATCH(DMI_PRODUCT_NAME, "VPCCW29FX"), |
473 | - }, |
474 | - }, |
475 | - { |
476 | - .callback = init_nvs_nosave, |
477 | - .ident = "Averatec AV1020-ED2", |
478 | - .matches = { |
479 | - DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"), |
480 | - DMI_MATCH(DMI_PRODUCT_NAME, "1000 Series"), |
481 | - }, |
482 | - }, |
483 | - { |
484 | - .callback = init_old_suspend_ordering, |
485 | - .ident = "Asus A8N-SLI DELUXE", |
486 | - .matches = { |
487 | - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), |
488 | - DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI DELUXE"), |
489 | - }, |
490 | - }, |
491 | - { |
492 | - .callback = init_old_suspend_ordering, |
493 | - .ident = "Asus A8N-SLI Premium", |
494 | - .matches = { |
495 | - DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), |
496 | - DMI_MATCH(DMI_BOARD_NAME, "A8N-SLI Premium"), |
497 | - }, |
498 | - }, |
499 | - { |
500 | - .callback = init_nvs_nosave, |
501 | - .ident = "Sony Vaio VGN-SR26GN_P", |
502 | - .matches = { |
503 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
504 | - DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR26GN_P"), |
505 | - }, |
506 | - }, |
507 | - { |
508 | - .callback = init_nvs_nosave, |
509 | - .ident = "Sony Vaio VPCEB1S1E", |
510 | - .matches = { |
511 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
512 | - DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1S1E"), |
513 | - }, |
514 | - }, |
515 | - { |
516 | - .callback = init_nvs_nosave, |
517 | - .ident = "Sony Vaio VGN-FW520F", |
518 | - .matches = { |
519 | - DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
520 | - DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FW520F"), |
521 | - }, |
522 | - }, |
523 | - { |
524 | - .callback = init_nvs_nosave, |
525 | - .ident = "Asus K54C", |
526 | - .matches = { |
527 | - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
528 | - DMI_MATCH(DMI_PRODUCT_NAME, "K54C"), |
529 | - }, |
530 | - }, |
531 | - { |
532 | - .callback = init_nvs_nosave, |
533 | - .ident = "Asus K54HR", |
534 | - .matches = { |
535 | - DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
536 | - DMI_MATCH(DMI_PRODUCT_NAME, "K54HR"), |
537 | - }, |
538 | - }, |
539 | - {}, |
540 | -}; |
541 | #endif /* CONFIG_SUSPEND */ |
542 | |
543 | #ifdef CONFIG_HIBERNATION |
544 | @@ -880,13 +886,13 @@ int __init acpi_sleep_init(void) |
545 | u8 type_a, type_b; |
546 | #ifdef CONFIG_SUSPEND |
547 | int i = 0; |
548 | - |
549 | - dmi_check_system(acpisleep_dmi_table); |
550 | #endif |
551 | |
552 | if (acpi_disabled) |
553 | return 0; |
554 | |
555 | + acpi_sleep_dmi_check(); |
556 | + |
557 | sleep_states[ACPI_STATE_S0] = 1; |
558 | printk(KERN_INFO PREFIX "(supports S0"); |
559 | |
560 | diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c |
561 | index 9851093..1853a45 100644 |
562 | --- a/drivers/atm/solos-pci.c |
563 | +++ b/drivers/atm/solos-pci.c |
564 | @@ -967,10 +967,11 @@ static uint32_t fpga_tx(struct solos_card *card) |
565 | for (port = 0; tx_pending; tx_pending >>= 1, port++) { |
566 | if (tx_pending & 1) { |
567 | struct sk_buff *oldskb = card->tx_skb[port]; |
568 | - if (oldskb) |
569 | + if (oldskb) { |
570 | pci_unmap_single(card->dev, SKB_CB(oldskb)->dma_addr, |
571 | oldskb->len, PCI_DMA_TODEVICE); |
572 | - |
573 | + card->tx_skb[port] = NULL; |
574 | + } |
575 | spin_lock(&card->tx_queue_lock); |
576 | skb = skb_dequeue(&card->tx_queue[port]); |
577 | if (!skb) |
578 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c |
579 | index 57fd867..1ae7039 100644 |
580 | --- a/drivers/bluetooth/ath3k.c |
581 | +++ b/drivers/bluetooth/ath3k.c |
582 | @@ -66,6 +66,7 @@ static struct usb_device_id ath3k_table[] = { |
583 | { USB_DEVICE(0x13d3, 0x3304) }, |
584 | { USB_DEVICE(0x0930, 0x0215) }, |
585 | { USB_DEVICE(0x0489, 0xE03D) }, |
586 | + { USB_DEVICE(0x0489, 0xE027) }, |
587 | |
588 | /* Atheros AR9285 Malbec with sflash firmware */ |
589 | { USB_DEVICE(0x03F0, 0x311D) }, |
590 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
591 | index 29d31ff..27f9d9f 100644 |
592 | --- a/drivers/bluetooth/btusb.c |
593 | +++ b/drivers/bluetooth/btusb.c |
594 | @@ -130,6 +130,7 @@ static struct usb_device_id blacklist_table[] = { |
595 | { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE }, |
596 | { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, |
597 | { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, |
598 | + { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE }, |
599 | |
600 | /* Atheros AR9285 Malbec with sflash firmware */ |
601 | { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, |
602 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
603 | index 41d4437..1a92a27 100644 |
604 | --- a/drivers/hid/hid-core.c |
605 | +++ b/drivers/hid/hid-core.c |
606 | @@ -1385,6 +1385,7 @@ static const struct hid_device_id hid_have_special_driver[] = { |
607 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, |
608 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, |
609 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, |
610 | + { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI) }, |
611 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) }, |
612 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, |
613 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, |
614 | diff --git a/drivers/input/joystick/walkera0701.c b/drivers/input/joystick/walkera0701.c |
615 | index 4dfa1ee..f8f892b 100644 |
616 | --- a/drivers/input/joystick/walkera0701.c |
617 | +++ b/drivers/input/joystick/walkera0701.c |
618 | @@ -196,6 +196,7 @@ static void walkera0701_close(struct input_dev *dev) |
619 | struct walkera_dev *w = input_get_drvdata(dev); |
620 | |
621 | parport_disable_irq(w->parport); |
622 | + hrtimer_cancel(&w->timer); |
623 | } |
624 | |
625 | static int walkera0701_connect(struct walkera_dev *w, int parport) |
626 | @@ -224,6 +225,9 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) |
627 | if (parport_claim(w->pardevice)) |
628 | goto init_err1; |
629 | |
630 | + hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
631 | + w->timer.function = timer_handler; |
632 | + |
633 | w->input_dev = input_allocate_device(); |
634 | if (!w->input_dev) |
635 | goto init_err2; |
636 | @@ -254,8 +258,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) |
637 | if (err) |
638 | goto init_err3; |
639 | |
640 | - hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
641 | - w->timer.function = timer_handler; |
642 | return 0; |
643 | |
644 | init_err3: |
645 | @@ -271,7 +273,6 @@ static int walkera0701_connect(struct walkera_dev *w, int parport) |
646 | |
647 | static void walkera0701_disconnect(struct walkera_dev *w) |
648 | { |
649 | - hrtimer_cancel(&w->timer); |
650 | input_unregister_device(w->input_dev); |
651 | parport_release(w->pardevice); |
652 | parport_unregister_device(w->pardevice); |
653 | diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c |
654 | index 661a0ca..1257ce8 100644 |
655 | --- a/drivers/input/mouse/sentelic.c |
656 | +++ b/drivers/input/mouse/sentelic.c |
657 | @@ -759,7 +759,7 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse) |
658 | fsp_set_slot(dev, 0, fgrs > 0, abs_x, abs_y); |
659 | fsp_set_slot(dev, 1, false, 0, 0); |
660 | } |
661 | - if (fgrs > 0) { |
662 | + if (fgrs == 1 || (fgrs == 2 && !(packet[0] & FSP_PB0_MFMC_FGR2))) { |
663 | input_report_abs(dev, ABS_X, abs_x); |
664 | input_report_abs(dev, ABS_Y, abs_y); |
665 | } |
666 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
667 | index d6cc77a..5f306f7 100644 |
668 | --- a/drivers/input/serio/i8042-x86ia64io.h |
669 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
670 | @@ -921,6 +921,7 @@ static int __init i8042_platform_init(void) |
671 | int retval; |
672 | |
673 | #ifdef CONFIG_X86 |
674 | + u8 a20_on = 0xdf; |
675 | /* Just return if pre-detection shows no i8042 controller exist */ |
676 | if (!x86_platform.i8042_detect()) |
677 | return -ENODEV; |
678 | @@ -960,6 +961,14 @@ static int __init i8042_platform_init(void) |
679 | |
680 | if (dmi_check_system(i8042_dmi_dritek_table)) |
681 | i8042_dritek = true; |
682 | + |
683 | + /* |
684 | + * A20 was already enabled during early kernel init. But some buggy |
685 | + * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to |
686 | + * resume from S3. So we do it here and hope that nothing breaks. |
687 | + */ |
688 | + i8042_command(&a20_on, 0x10d1); |
689 | + i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */ |
690 | #endif /* CONFIG_X86 */ |
691 | |
692 | return retval; |
693 | diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c |
694 | index 8d082b4..d971817 100644 |
695 | --- a/drivers/misc/sgi-xp/xpc_main.c |
696 | +++ b/drivers/misc/sgi-xp/xpc_main.c |
697 | @@ -53,6 +53,10 @@ |
698 | #include <linux/kthread.h> |
699 | #include "xpc.h" |
700 | |
701 | +#ifdef CONFIG_X86_64 |
702 | +#include <asm/traps.h> |
703 | +#endif |
704 | + |
705 | /* define two XPC debug device structures to be used with dev_dbg() et al */ |
706 | |
707 | struct device_driver xpc_dbg_name = { |
708 | @@ -1079,6 +1083,9 @@ xpc_system_reboot(struct notifier_block *nb, unsigned long event, void *unused) |
709 | return NOTIFY_DONE; |
710 | } |
711 | |
712 | +/* Used to only allow one cpu to complete disconnect */ |
713 | +static unsigned int xpc_die_disconnecting; |
714 | + |
715 | /* |
716 | * Notify other partitions to deactivate from us by first disengaging from all |
717 | * references to our memory. |
718 | @@ -1092,6 +1099,9 @@ xpc_die_deactivate(void) |
719 | long keep_waiting; |
720 | long wait_to_print; |
721 | |
722 | + if (cmpxchg(&xpc_die_disconnecting, 0, 1)) |
723 | + return; |
724 | + |
725 | /* keep xpc_hb_checker thread from doing anything (just in case) */ |
726 | xpc_exiting = 1; |
727 | |
728 | @@ -1159,7 +1169,7 @@ xpc_die_deactivate(void) |
729 | * about the lack of a heartbeat. |
730 | */ |
731 | static int |
732 | -xpc_system_die(struct notifier_block *nb, unsigned long event, void *unused) |
733 | +xpc_system_die(struct notifier_block *nb, unsigned long event, void *_die_args) |
734 | { |
735 | #ifdef CONFIG_IA64 /* !!! temporary kludge */ |
736 | switch (event) { |
737 | @@ -1191,7 +1201,27 @@ xpc_system_die(struct notifier_block *nb, unsigned long event, void *unused) |
738 | break; |
739 | } |
740 | #else |
741 | - xpc_die_deactivate(); |
742 | + struct die_args *die_args = _die_args; |
743 | + |
744 | + switch (event) { |
745 | + case DIE_TRAP: |
746 | + if (die_args->trapnr == X86_TRAP_DF) |
747 | + xpc_die_deactivate(); |
748 | + |
749 | + if (((die_args->trapnr == X86_TRAP_MF) || |
750 | + (die_args->trapnr == X86_TRAP_XF)) && |
751 | + !user_mode_vm(die_args->regs)) |
752 | + xpc_die_deactivate(); |
753 | + |
754 | + break; |
755 | + case DIE_INT3: |
756 | + case DIE_DEBUG: |
757 | + break; |
758 | + case DIE_OOPS: |
759 | + case DIE_GPF: |
760 | + default: |
761 | + xpc_die_deactivate(); |
762 | + } |
763 | #endif |
764 | |
765 | return NOTIFY_DONE; |
766 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
767 | index 318a62a..6df52c9 100644 |
768 | --- a/drivers/net/bonding/bond_main.c |
769 | +++ b/drivers/net/bonding/bond_main.c |
770 | @@ -1383,6 +1383,8 @@ static void bond_compute_features(struct bonding *bond) |
771 | struct net_device *bond_dev = bond->dev; |
772 | netdev_features_t vlan_features = BOND_VLAN_FEATURES; |
773 | unsigned short max_hard_header_len = ETH_HLEN; |
774 | + unsigned int gso_max_size = GSO_MAX_SIZE; |
775 | + u16 gso_max_segs = GSO_MAX_SEGS; |
776 | int i; |
777 | |
778 | read_lock(&bond->lock); |
779 | @@ -1396,11 +1398,16 @@ static void bond_compute_features(struct bonding *bond) |
780 | |
781 | if (slave->dev->hard_header_len > max_hard_header_len) |
782 | max_hard_header_len = slave->dev->hard_header_len; |
783 | + |
784 | + gso_max_size = min(gso_max_size, slave->dev->gso_max_size); |
785 | + gso_max_segs = min(gso_max_segs, slave->dev->gso_max_segs); |
786 | } |
787 | |
788 | done: |
789 | bond_dev->vlan_features = vlan_features; |
790 | bond_dev->hard_header_len = max_hard_header_len; |
791 | + bond_dev->gso_max_segs = gso_max_segs; |
792 | + netif_set_gso_max_size(bond_dev, gso_max_size); |
793 | |
794 | read_unlock(&bond->lock); |
795 | |
796 | diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c |
797 | index aef42f0..6734737 100644 |
798 | --- a/drivers/net/bonding/bond_sysfs.c |
799 | +++ b/drivers/net/bonding/bond_sysfs.c |
800 | @@ -1578,6 +1578,7 @@ static ssize_t bonding_store_slaves_active(struct device *d, |
801 | goto out; |
802 | } |
803 | |
804 | + read_lock(&bond->lock); |
805 | bond_for_each_slave(bond, slave, i) { |
806 | if (!bond_is_active_slave(slave)) { |
807 | if (new_value) |
808 | @@ -1586,6 +1587,7 @@ static ssize_t bonding_store_slaves_active(struct device *d, |
809 | slave->inactive = 1; |
810 | } |
811 | } |
812 | + read_unlock(&bond->lock); |
813 | out: |
814 | return ret; |
815 | } |
816 | diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c |
817 | index c5fe3a3..e86f4c3 100644 |
818 | --- a/drivers/net/can/dev.c |
819 | +++ b/drivers/net/can/dev.c |
820 | @@ -576,8 +576,7 @@ void close_candev(struct net_device *dev) |
821 | { |
822 | struct can_priv *priv = netdev_priv(dev); |
823 | |
824 | - if (del_timer_sync(&priv->restart_timer)) |
825 | - dev_put(dev); |
826 | + del_timer_sync(&priv->restart_timer); |
827 | can_flush_echo_skb(dev); |
828 | } |
829 | EXPORT_SYMBOL_GPL(close_candev); |
830 | diff --git a/drivers/net/ethernet/8390/ne.c b/drivers/net/ethernet/8390/ne.c |
831 | index d04911d..47618e5 100644 |
832 | --- a/drivers/net/ethernet/8390/ne.c |
833 | +++ b/drivers/net/ethernet/8390/ne.c |
834 | @@ -813,6 +813,7 @@ static int __init ne_drv_probe(struct platform_device *pdev) |
835 | dev->irq = irq[this_dev]; |
836 | dev->mem_end = bad[this_dev]; |
837 | } |
838 | + SET_NETDEV_DEV(dev, &pdev->dev); |
839 | err = do_ne_probe(dev); |
840 | if (err) { |
841 | free_netdev(dev); |
842 | diff --git a/drivers/net/irda/sir_dev.c b/drivers/net/irda/sir_dev.c |
843 | index 5039f08..43e9ab4 100644 |
844 | --- a/drivers/net/irda/sir_dev.c |
845 | +++ b/drivers/net/irda/sir_dev.c |
846 | @@ -222,7 +222,7 @@ static void sirdev_config_fsm(struct work_struct *work) |
847 | break; |
848 | |
849 | case SIRDEV_STATE_DONGLE_SPEED: |
850 | - if (dev->dongle_drv->reset) { |
851 | + if (dev->dongle_drv->set_speed) { |
852 | ret = dev->dongle_drv->set_speed(dev, fsm->param); |
853 | if (ret < 0) { |
854 | fsm->result = ret; |
855 | diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c |
856 | index 5cba415..32e4791 100644 |
857 | --- a/drivers/net/usb/ipheth.c |
858 | +++ b/drivers/net/usb/ipheth.c |
859 | @@ -62,6 +62,7 @@ |
860 | #define USB_PRODUCT_IPAD 0x129a |
861 | #define USB_PRODUCT_IPHONE_4_VZW 0x129c |
862 | #define USB_PRODUCT_IPHONE_4S 0x12a0 |
863 | +#define USB_PRODUCT_IPHONE_5 0x12a8 |
864 | |
865 | #define IPHETH_USBINTF_CLASS 255 |
866 | #define IPHETH_USBINTF_SUBCLASS 253 |
867 | @@ -113,6 +114,10 @@ static struct usb_device_id ipheth_table[] = { |
868 | USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S, |
869 | IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
870 | IPHETH_USBINTF_PROTO) }, |
871 | + { USB_DEVICE_AND_INTERFACE_INFO( |
872 | + USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_5, |
873 | + IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS, |
874 | + IPHETH_USBINTF_PROTO) }, |
875 | { } |
876 | }; |
877 | MODULE_DEVICE_TABLE(usb, ipheth_table); |
878 | diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c |
879 | index b5f1b91..65f831f 100644 |
880 | --- a/drivers/net/wireless/b43/dma.c |
881 | +++ b/drivers/net/wireless/b43/dma.c |
882 | @@ -409,7 +409,10 @@ static inline |
883 | struct b43_dmadesc_meta *meta) |
884 | { |
885 | if (meta->skb) { |
886 | - dev_kfree_skb_any(meta->skb); |
887 | + if (ring->tx) |
888 | + ieee80211_free_txskb(ring->dev->wl->hw, meta->skb); |
889 | + else |
890 | + dev_kfree_skb_any(meta->skb); |
891 | meta->skb = NULL; |
892 | } |
893 | } |
894 | @@ -1454,7 +1457,7 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) |
895 | if (unlikely(err == -ENOKEY)) { |
896 | /* Drop this packet, as we don't have the encryption key |
897 | * anymore and must not transmit it unencrypted. */ |
898 | - dev_kfree_skb_any(skb); |
899 | + ieee80211_free_txskb(dev->wl->hw, skb); |
900 | err = 0; |
901 | goto out; |
902 | } |
903 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c |
904 | index d6ffd43..4e465c5 100644 |
905 | --- a/drivers/net/wireless/b43/main.c |
906 | +++ b/drivers/net/wireless/b43/main.c |
907 | @@ -3393,7 +3393,7 @@ static void b43_tx_work(struct work_struct *work) |
908 | break; |
909 | } |
910 | if (unlikely(err)) |
911 | - dev_kfree_skb(skb); /* Drop it */ |
912 | + ieee80211_free_txskb(wl->hw, skb); |
913 | err = 0; |
914 | } |
915 | |
916 | @@ -3414,7 +3414,7 @@ static void b43_op_tx(struct ieee80211_hw *hw, |
917 | |
918 | if (unlikely(skb->len < 2 + 2 + 6)) { |
919 | /* Too short, this can't be a valid frame. */ |
920 | - dev_kfree_skb_any(skb); |
921 | + ieee80211_free_txskb(hw, skb); |
922 | return; |
923 | } |
924 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); |
925 | @@ -4210,8 +4210,12 @@ redo: |
926 | |
927 | /* Drain all TX queues. */ |
928 | for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) { |
929 | - while (skb_queue_len(&wl->tx_queue[queue_num])) |
930 | - dev_kfree_skb(skb_dequeue(&wl->tx_queue[queue_num])); |
931 | + while (skb_queue_len(&wl->tx_queue[queue_num])) { |
932 | + struct sk_buff *skb; |
933 | + |
934 | + skb = skb_dequeue(&wl->tx_queue[queue_num]); |
935 | + ieee80211_free_txskb(wl->hw, skb); |
936 | + } |
937 | } |
938 | |
939 | b43_mac_suspend(dev); |
940 | diff --git a/drivers/net/wireless/b43/pio.c b/drivers/net/wireless/b43/pio.c |
941 | index 3533ab8..a73ff8c 100644 |
942 | --- a/drivers/net/wireless/b43/pio.c |
943 | +++ b/drivers/net/wireless/b43/pio.c |
944 | @@ -196,7 +196,7 @@ static void b43_pio_cancel_tx_packets(struct b43_pio_txqueue *q) |
945 | for (i = 0; i < ARRAY_SIZE(q->packets); i++) { |
946 | pack = &(q->packets[i]); |
947 | if (pack->skb) { |
948 | - dev_kfree_skb_any(pack->skb); |
949 | + ieee80211_free_txskb(q->dev->wl->hw, pack->skb); |
950 | pack->skb = NULL; |
951 | } |
952 | } |
953 | @@ -552,7 +552,7 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb) |
954 | if (unlikely(err == -ENOKEY)) { |
955 | /* Drop this packet, as we don't have the encryption key |
956 | * anymore and must not transmit it unencrypted. */ |
957 | - dev_kfree_skb_any(skb); |
958 | + ieee80211_free_txskb(dev->wl->hw, skb); |
959 | err = 0; |
960 | goto out; |
961 | } |
962 | diff --git a/drivers/net/wireless/b43legacy/b43legacy.h b/drivers/net/wireless/b43legacy/b43legacy.h |
963 | index a29da67..482476f 100644 |
964 | --- a/drivers/net/wireless/b43legacy/b43legacy.h |
965 | +++ b/drivers/net/wireless/b43legacy/b43legacy.h |
966 | @@ -13,6 +13,7 @@ |
967 | |
968 | #include <linux/ssb/ssb.h> |
969 | #include <linux/ssb/ssb_driver_chipcommon.h> |
970 | +#include <linux/completion.h> |
971 | |
972 | #include <net/mac80211.h> |
973 | |
974 | @@ -733,6 +734,10 @@ struct b43legacy_wldev { |
975 | |
976 | /* Firmware data */ |
977 | struct b43legacy_firmware fw; |
978 | + const struct firmware *fwp; /* needed to pass fw pointer */ |
979 | + |
980 | + /* completion struct for firmware loading */ |
981 | + struct completion fw_load_complete; |
982 | |
983 | /* Devicelist in struct b43legacy_wl (all 802.11 cores) */ |
984 | struct list_head list; |
985 | diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c |
986 | index 0f30c07..53696ef 100644 |
987 | --- a/drivers/net/wireless/b43legacy/main.c |
988 | +++ b/drivers/net/wireless/b43legacy/main.c |
989 | @@ -1511,9 +1511,17 @@ static void b43legacy_print_fw_helptext(struct b43legacy_wl *wl) |
990 | "and download the correct firmware (version 3).\n"); |
991 | } |
992 | |
993 | +static void b43legacy_fw_cb(const struct firmware *firmware, void *context) |
994 | +{ |
995 | + struct b43legacy_wldev *dev = context; |
996 | + |
997 | + dev->fwp = firmware; |
998 | + complete(&dev->fw_load_complete); |
999 | +} |
1000 | + |
1001 | static int do_request_fw(struct b43legacy_wldev *dev, |
1002 | const char *name, |
1003 | - const struct firmware **fw) |
1004 | + const struct firmware **fw, bool async) |
1005 | { |
1006 | char path[sizeof(modparam_fwpostfix) + 32]; |
1007 | struct b43legacy_fw_header *hdr; |
1008 | @@ -1526,7 +1534,24 @@ static int do_request_fw(struct b43legacy_wldev *dev, |
1009 | snprintf(path, ARRAY_SIZE(path), |
1010 | "b43legacy%s/%s.fw", |
1011 | modparam_fwpostfix, name); |
1012 | - err = request_firmware(fw, path, dev->dev->dev); |
1013 | + b43legacyinfo(dev->wl, "Loading firmware %s\n", path); |
1014 | + if (async) { |
1015 | + init_completion(&dev->fw_load_complete); |
1016 | + err = request_firmware_nowait(THIS_MODULE, 1, path, |
1017 | + dev->dev->dev, GFP_KERNEL, |
1018 | + dev, b43legacy_fw_cb); |
1019 | + if (err) { |
1020 | + b43legacyerr(dev->wl, "Unable to load firmware\n"); |
1021 | + return err; |
1022 | + } |
1023 | + /* stall here until fw ready */ |
1024 | + wait_for_completion(&dev->fw_load_complete); |
1025 | + if (!dev->fwp) |
1026 | + err = -EINVAL; |
1027 | + *fw = dev->fwp; |
1028 | + } else { |
1029 | + err = request_firmware(fw, path, dev->dev->dev); |
1030 | + } |
1031 | if (err) { |
1032 | b43legacyerr(dev->wl, "Firmware file \"%s\" not found " |
1033 | "or load failed.\n", path); |
1034 | @@ -1578,7 +1603,7 @@ static void b43legacy_request_firmware(struct work_struct *work) |
1035 | filename = "ucode4"; |
1036 | else |
1037 | filename = "ucode5"; |
1038 | - err = do_request_fw(dev, filename, &fw->ucode); |
1039 | + err = do_request_fw(dev, filename, &fw->ucode, true); |
1040 | if (err) |
1041 | goto err_load; |
1042 | } |
1043 | @@ -1587,7 +1612,7 @@ static void b43legacy_request_firmware(struct work_struct *work) |
1044 | filename = "pcm4"; |
1045 | else |
1046 | filename = "pcm5"; |
1047 | - err = do_request_fw(dev, filename, &fw->pcm); |
1048 | + err = do_request_fw(dev, filename, &fw->pcm, false); |
1049 | if (err) |
1050 | goto err_load; |
1051 | } |
1052 | @@ -1605,7 +1630,7 @@ static void b43legacy_request_firmware(struct work_struct *work) |
1053 | default: |
1054 | goto err_no_initvals; |
1055 | } |
1056 | - err = do_request_fw(dev, filename, &fw->initvals); |
1057 | + err = do_request_fw(dev, filename, &fw->initvals, false); |
1058 | if (err) |
1059 | goto err_load; |
1060 | } |
1061 | @@ -1625,7 +1650,7 @@ static void b43legacy_request_firmware(struct work_struct *work) |
1062 | default: |
1063 | goto err_no_initvals; |
1064 | } |
1065 | - err = do_request_fw(dev, filename, &fw->initvals_band); |
1066 | + err = do_request_fw(dev, filename, &fw->initvals_band, false); |
1067 | if (err) |
1068 | goto err_load; |
1069 | } |
1070 | diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c |
1071 | index a337a50..be20cf7 100644 |
1072 | --- a/drivers/net/wireless/p54/p54usb.c |
1073 | +++ b/drivers/net/wireless/p54/p54usb.c |
1074 | @@ -47,6 +47,7 @@ static struct usb_device_id p54u_table[] = { |
1075 | {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */ |
1076 | {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */ |
1077 | {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */ |
1078 | + {USB_DEVICE(0x0675, 0x0530)}, /* DrayTek Vigor 530 */ |
1079 | {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */ |
1080 | {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */ |
1081 | {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */ |
1082 | @@ -82,6 +83,8 @@ static struct usb_device_id p54u_table[] = { |
1083 | {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */ |
1084 | {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */ |
1085 | {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */ |
1086 | + {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */ |
1087 | + {USB_DEVICE(0x083a, 0x4503)}, /* T-Com Sinus 154 data II */ |
1088 | {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */ |
1089 | {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */ |
1090 | {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */ |
1091 | @@ -101,6 +104,7 @@ static struct usb_device_id p54u_table[] = { |
1092 | {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */ |
1093 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ |
1094 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ |
1095 | + /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */ |
1096 | {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ |
1097 | {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */ |
1098 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ |
1099 | diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c |
1100 | index aa970fc..8fa144f 100644 |
1101 | --- a/drivers/net/wireless/rtlwifi/usb.c |
1102 | +++ b/drivers/net/wireless/rtlwifi/usb.c |
1103 | @@ -210,17 +210,16 @@ static void _usb_writeN_sync(struct rtl_priv *rtlpriv, u32 addr, void *data, |
1104 | u16 index = REALTEK_USB_VENQT_CMD_IDX; |
1105 | int pipe = usb_sndctrlpipe(udev, 0); /* write_out */ |
1106 | u8 *buffer; |
1107 | - dma_addr_t dma_addr; |
1108 | |
1109 | - wvalue = (u16)(addr&0x0000ffff); |
1110 | - buffer = usb_alloc_coherent(udev, (size_t)len, GFP_ATOMIC, &dma_addr); |
1111 | + wvalue = (u16)(addr & 0x0000ffff); |
1112 | + buffer = kmalloc(len, GFP_ATOMIC); |
1113 | if (!buffer) |
1114 | return; |
1115 | memcpy(buffer, data, len); |
1116 | usb_control_msg(udev, pipe, request, reqtype, wvalue, |
1117 | index, buffer, len, 50); |
1118 | |
1119 | - usb_free_coherent(udev, (size_t)len, buffer, dma_addr); |
1120 | + kfree(buffer); |
1121 | } |
1122 | |
1123 | static void _rtl_usb_io_handler_init(struct device *dev, |
1124 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
1125 | index 4bf7102..680dbfa 100644 |
1126 | --- a/drivers/pci/quirks.c |
1127 | +++ b/drivers/pci/quirks.c |
1128 | @@ -2708,7 +2708,7 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) |
1129 | if (PCI_FUNC(dev->devfn)) |
1130 | return; |
1131 | /* |
1132 | - * RICOH 0xe823 SD/MMC card reader fails to recognize |
1133 | + * RICOH 0xe822 and 0xe823 SD/MMC card readers fail to recognize |
1134 | * certain types of SD/MMC cards. Lowering the SD base |
1135 | * clock frequency from 200Mhz to 50Mhz fixes this issue. |
1136 | * |
1137 | @@ -2719,7 +2719,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) |
1138 | * 0xf9 - Key register for 0x150 |
1139 | * 0xfc - key register for 0xe1 |
1140 | */ |
1141 | - if (dev->device == PCI_DEVICE_ID_RICOH_R5CE823) { |
1142 | + if (dev->device == PCI_DEVICE_ID_RICOH_R5CE822 || |
1143 | + dev->device == PCI_DEVICE_ID_RICOH_R5CE823) { |
1144 | pci_write_config_byte(dev, 0xf9, 0xfc); |
1145 | pci_write_config_byte(dev, 0x150, 0x10); |
1146 | pci_write_config_byte(dev, 0xf9, 0x00); |
1147 | @@ -2746,6 +2747,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) |
1148 | } |
1149 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
1150 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
1151 | +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832); |
1152 | +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832); |
1153 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); |
1154 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); |
1155 | #endif /*CONFIG_MMC_RICOH_MMC*/ |
1156 | diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c |
1157 | index e353788..291906e 100644 |
1158 | --- a/drivers/pnp/pnpacpi/core.c |
1159 | +++ b/drivers/pnp/pnpacpi/core.c |
1160 | @@ -58,7 +58,7 @@ static inline int __init is_exclusive_device(struct acpi_device *dev) |
1161 | if (!(('0' <= (c) && (c) <= '9') || ('A' <= (c) && (c) <= 'F'))) \ |
1162 | return 0 |
1163 | #define TEST_ALPHA(c) \ |
1164 | - if (!('@' <= (c) || (c) <= 'Z')) \ |
1165 | + if (!('A' <= (c) && (c) <= 'Z')) \ |
1166 | return 0 |
1167 | static int __init ispnpidacpi(const char *id) |
1168 | { |
1169 | diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c |
1170 | index 9e94fb1..44878da 100644 |
1171 | --- a/drivers/rtc/rtc-vt8500.c |
1172 | +++ b/drivers/rtc/rtc-vt8500.c |
1173 | @@ -69,7 +69,7 @@ |
1174 | | ALARM_SEC_BIT) |
1175 | |
1176 | #define VT8500_RTC_CR_ENABLE (1 << 0) /* Enable RTC */ |
1177 | -#define VT8500_RTC_CR_24H (1 << 1) /* 24h time format */ |
1178 | +#define VT8500_RTC_CR_12H (1 << 1) /* 12h time format */ |
1179 | #define VT8500_RTC_CR_SM_ENABLE (1 << 2) /* Enable periodic irqs */ |
1180 | #define VT8500_RTC_CR_SM_SEC (1 << 3) /* 0: 1Hz/60, 1: 1Hz */ |
1181 | #define VT8500_RTC_CR_CALIB (1 << 4) /* Enable calibration */ |
1182 | @@ -118,7 +118,7 @@ static int vt8500_rtc_read_time(struct device *dev, struct rtc_time *tm) |
1183 | tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S); |
1184 | tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S); |
1185 | tm->tm_mday = bcd2bin(date & DATE_DAY_MASK); |
1186 | - tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S); |
1187 | + tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S) - 1; |
1188 | tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S) |
1189 | + ((date >> DATE_CENTURY_S) & 1 ? 200 : 100); |
1190 | tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S; |
1191 | @@ -137,8 +137,9 @@ static int vt8500_rtc_set_time(struct device *dev, struct rtc_time *tm) |
1192 | } |
1193 | |
1194 | writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S) |
1195 | - | (bin2bcd(tm->tm_mon) << DATE_MONTH_S) |
1196 | - | (bin2bcd(tm->tm_mday)), |
1197 | + | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S) |
1198 | + | (bin2bcd(tm->tm_mday)) |
1199 | + | ((tm->tm_year >= 200) << DATE_CENTURY_S), |
1200 | vt8500_rtc->regbase + VT8500_RTC_DS); |
1201 | writel((bin2bcd(tm->tm_wday) << TIME_DOW_S) |
1202 | | (bin2bcd(tm->tm_hour) << TIME_HOUR_S) |
1203 | @@ -248,7 +249,7 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev) |
1204 | } |
1205 | |
1206 | /* Enable RTC and set it to 24-hour mode */ |
1207 | - writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H, |
1208 | + writel(VT8500_RTC_CR_ENABLE, |
1209 | vt8500_rtc->regbase + VT8500_RTC_CR); |
1210 | |
1211 | vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev, |
1212 | diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c |
1213 | index 30b908f..672c66a 100644 |
1214 | --- a/drivers/usb/gadget/f_ecm.c |
1215 | +++ b/drivers/usb/gadget/f_ecm.c |
1216 | @@ -808,9 +808,9 @@ fail: |
1217 | /* we might as well release our claims on endpoints */ |
1218 | if (ecm->notify) |
1219 | ecm->notify->driver_data = NULL; |
1220 | - if (ecm->port.out_ep->desc) |
1221 | + if (ecm->port.out_ep) |
1222 | ecm->port.out_ep->driver_data = NULL; |
1223 | - if (ecm->port.in_ep->desc) |
1224 | + if (ecm->port.in_ep) |
1225 | ecm->port.in_ep->driver_data = NULL; |
1226 | |
1227 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
1228 | diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c |
1229 | index 1a7b2dd..a9cf2052 100644 |
1230 | --- a/drivers/usb/gadget/f_eem.c |
1231 | +++ b/drivers/usb/gadget/f_eem.c |
1232 | @@ -319,10 +319,9 @@ fail: |
1233 | if (f->hs_descriptors) |
1234 | usb_free_descriptors(f->hs_descriptors); |
1235 | |
1236 | - /* we might as well release our claims on endpoints */ |
1237 | - if (eem->port.out_ep->desc) |
1238 | + if (eem->port.out_ep) |
1239 | eem->port.out_ep->driver_data = NULL; |
1240 | - if (eem->port.in_ep->desc) |
1241 | + if (eem->port.in_ep) |
1242 | eem->port.in_ep->driver_data = NULL; |
1243 | |
1244 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
1245 | diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c |
1246 | index 2f7e8f2..1bf9596 100644 |
1247 | --- a/drivers/usb/gadget/f_midi.c |
1248 | +++ b/drivers/usb/gadget/f_midi.c |
1249 | @@ -416,6 +416,7 @@ static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f) |
1250 | midi->id = NULL; |
1251 | |
1252 | usb_free_descriptors(f->descriptors); |
1253 | + usb_free_descriptors(f->hs_descriptors); |
1254 | kfree(midi); |
1255 | } |
1256 | |
1257 | diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c |
1258 | index aab8ede..d7811ae 100644 |
1259 | --- a/drivers/usb/gadget/f_ncm.c |
1260 | +++ b/drivers/usb/gadget/f_ncm.c |
1261 | @@ -1259,9 +1259,9 @@ fail: |
1262 | /* we might as well release our claims on endpoints */ |
1263 | if (ncm->notify) |
1264 | ncm->notify->driver_data = NULL; |
1265 | - if (ncm->port.out_ep->desc) |
1266 | + if (ncm->port.out_ep) |
1267 | ncm->port.out_ep->driver_data = NULL; |
1268 | - if (ncm->port.in_ep->desc) |
1269 | + if (ncm->port.in_ep) |
1270 | ncm->port.in_ep->driver_data = NULL; |
1271 | |
1272 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
1273 | diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c |
1274 | index 965a629..16512f9 100644 |
1275 | --- a/drivers/usb/gadget/f_phonet.c |
1276 | +++ b/drivers/usb/gadget/f_phonet.c |
1277 | @@ -531,7 +531,7 @@ int pn_bind(struct usb_configuration *c, struct usb_function *f) |
1278 | |
1279 | req = usb_ep_alloc_request(fp->out_ep, GFP_KERNEL); |
1280 | if (!req) |
1281 | - goto err; |
1282 | + goto err_req; |
1283 | |
1284 | req->complete = pn_rx_complete; |
1285 | fp->out_reqv[i] = req; |
1286 | @@ -540,14 +540,18 @@ int pn_bind(struct usb_configuration *c, struct usb_function *f) |
1287 | /* Outgoing USB requests */ |
1288 | fp->in_req = usb_ep_alloc_request(fp->in_ep, GFP_KERNEL); |
1289 | if (!fp->in_req) |
1290 | - goto err; |
1291 | + goto err_req; |
1292 | |
1293 | INFO(cdev, "USB CDC Phonet function\n"); |
1294 | INFO(cdev, "using %s, OUT %s, IN %s\n", cdev->gadget->name, |
1295 | fp->out_ep->name, fp->in_ep->name); |
1296 | return 0; |
1297 | |
1298 | +err_req: |
1299 | + for (i = 0; i < phonet_rxq_size && fp->out_reqv[i]; i++) |
1300 | + usb_ep_free_request(fp->out_ep, fp->out_reqv[i]); |
1301 | err: |
1302 | + |
1303 | if (fp->out_ep) |
1304 | fp->out_ep->driver_data = NULL; |
1305 | if (fp->in_ep) |
1306 | diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c |
1307 | index 5234365..345f838 100644 |
1308 | --- a/drivers/usb/gadget/f_rndis.c |
1309 | +++ b/drivers/usb/gadget/f_rndis.c |
1310 | @@ -803,9 +803,9 @@ fail: |
1311 | /* we might as well release our claims on endpoints */ |
1312 | if (rndis->notify) |
1313 | rndis->notify->driver_data = NULL; |
1314 | - if (rndis->port.out_ep->desc) |
1315 | + if (rndis->port.out_ep) |
1316 | rndis->port.out_ep->driver_data = NULL; |
1317 | - if (rndis->port.in_ep->desc) |
1318 | + if (rndis->port.in_ep) |
1319 | rndis->port.in_ep->driver_data = NULL; |
1320 | |
1321 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
1322 | diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c |
1323 | index 21ab474..e5bb966 100644 |
1324 | --- a/drivers/usb/gadget/f_subset.c |
1325 | +++ b/drivers/usb/gadget/f_subset.c |
1326 | @@ -370,9 +370,9 @@ fail: |
1327 | usb_free_descriptors(f->hs_descriptors); |
1328 | |
1329 | /* we might as well release our claims on endpoints */ |
1330 | - if (geth->port.out_ep->desc) |
1331 | + if (geth->port.out_ep) |
1332 | geth->port.out_ep->driver_data = NULL; |
1333 | - if (geth->port.in_ep->desc) |
1334 | + if (geth->port.in_ep) |
1335 | geth->port.in_ep->driver_data = NULL; |
1336 | |
1337 | ERROR(cdev, "%s: can't bind, err %d\n", f->name, status); |
1338 | diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c |
1339 | index 2022fe49..a0abc65 100644 |
1340 | --- a/drivers/usb/gadget/f_uvc.c |
1341 | +++ b/drivers/usb/gadget/f_uvc.c |
1342 | @@ -335,7 +335,6 @@ uvc_register_video(struct uvc_device *uvc) |
1343 | return -ENOMEM; |
1344 | |
1345 | video->parent = &cdev->gadget->dev; |
1346 | - video->minor = -1; |
1347 | video->fops = &uvc_v4l2_fops; |
1348 | video->release = video_device_release; |
1349 | strncpy(video->name, cdev->gadget->name, sizeof(video->name)); |
1350 | @@ -462,23 +461,12 @@ uvc_function_unbind(struct usb_configuration *c, struct usb_function *f) |
1351 | |
1352 | INFO(cdev, "uvc_function_unbind\n"); |
1353 | |
1354 | - if (uvc->vdev) { |
1355 | - if (uvc->vdev->minor == -1) |
1356 | - video_device_release(uvc->vdev); |
1357 | - else |
1358 | - video_unregister_device(uvc->vdev); |
1359 | - uvc->vdev = NULL; |
1360 | - } |
1361 | - |
1362 | - if (uvc->control_ep) |
1363 | - uvc->control_ep->driver_data = NULL; |
1364 | - if (uvc->video.ep) |
1365 | - uvc->video.ep->driver_data = NULL; |
1366 | + video_unregister_device(uvc->vdev); |
1367 | + uvc->control_ep->driver_data = NULL; |
1368 | + uvc->video.ep->driver_data = NULL; |
1369 | |
1370 | - if (uvc->control_req) { |
1371 | - usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); |
1372 | - kfree(uvc->control_buf); |
1373 | - } |
1374 | + usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); |
1375 | + kfree(uvc->control_buf); |
1376 | |
1377 | kfree(f->descriptors); |
1378 | kfree(f->hs_descriptors); |
1379 | @@ -563,7 +551,22 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) |
1380 | return 0; |
1381 | |
1382 | error: |
1383 | - uvc_function_unbind(c, f); |
1384 | + if (uvc->vdev) |
1385 | + video_device_release(uvc->vdev); |
1386 | + |
1387 | + if (uvc->control_ep) |
1388 | + uvc->control_ep->driver_data = NULL; |
1389 | + if (uvc->video.ep) |
1390 | + uvc->video.ep->driver_data = NULL; |
1391 | + |
1392 | + if (uvc->control_req) { |
1393 | + usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); |
1394 | + kfree(uvc->control_buf); |
1395 | + } |
1396 | + |
1397 | + kfree(f->descriptors); |
1398 | + kfree(f->hs_descriptors); |
1399 | + kfree(f->ss_descriptors); |
1400 | return ret; |
1401 | } |
1402 | |
1403 | diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c |
1404 | index 1234817..0909783 100644 |
1405 | --- a/drivers/usb/host/ehci-pci.c |
1406 | +++ b/drivers/usb/host/ehci-pci.c |
1407 | @@ -362,7 +362,8 @@ static bool usb_is_intel_switchable_ehci(struct pci_dev *pdev) |
1408 | pdev->vendor == PCI_VENDOR_ID_INTEL && |
1409 | (pdev->device == 0x1E26 || |
1410 | pdev->device == 0x8C2D || |
1411 | - pdev->device == 0x8C26); |
1412 | + pdev->device == 0x8C26 || |
1413 | + pdev->device == 0x9C26); |
1414 | } |
1415 | |
1416 | static void ehci_enable_xhci_companion(void) |
1417 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c |
1418 | index 39f9e4a..eb5563a 100644 |
1419 | --- a/drivers/usb/host/pci-quirks.c |
1420 | +++ b/drivers/usb/host/pci-quirks.c |
1421 | @@ -723,6 +723,7 @@ static int handshake(void __iomem *ptr, u32 mask, u32 done, |
1422 | } |
1423 | |
1424 | #define PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI 0x8C31 |
1425 | +#define PCI_DEVICE_ID_INTEL_LYNX_POINT_LP_XHCI 0x9C31 |
1426 | |
1427 | bool usb_is_intel_ppt_switchable_xhci(struct pci_dev *pdev) |
1428 | { |
1429 | @@ -736,7 +737,8 @@ bool usb_is_intel_lpt_switchable_xhci(struct pci_dev *pdev) |
1430 | { |
1431 | return pdev->class == PCI_CLASS_SERIAL_USB_XHCI && |
1432 | pdev->vendor == PCI_VENDOR_ID_INTEL && |
1433 | - pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI; |
1434 | + (pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI || |
1435 | + pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_LP_XHCI); |
1436 | } |
1437 | |
1438 | bool usb_is_intel_switchable_xhci(struct pci_dev *pdev) |
1439 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
1440 | index cbed50a..3e16f1c 100644 |
1441 | --- a/drivers/usb/host/xhci-mem.c |
1442 | +++ b/drivers/usb/host/xhci-mem.c |
1443 | @@ -205,7 +205,12 @@ static int xhci_alloc_segments_for_ring(struct xhci_hcd *xhci, |
1444 | |
1445 | next = xhci_segment_alloc(xhci, cycle_state, flags); |
1446 | if (!next) { |
1447 | - xhci_free_segments_for_ring(xhci, *first); |
1448 | + prev = *first; |
1449 | + while (prev) { |
1450 | + next = prev->next; |
1451 | + xhci_segment_free(xhci, prev); |
1452 | + prev = next; |
1453 | + } |
1454 | return -ENOMEM; |
1455 | } |
1456 | xhci_link_segments(xhci, prev, next, type); |
1457 | @@ -258,7 +263,7 @@ static struct xhci_ring *xhci_ring_alloc(struct xhci_hcd *xhci, |
1458 | return ring; |
1459 | |
1460 | fail: |
1461 | - xhci_ring_free(xhci, ring); |
1462 | + kfree(ring); |
1463 | return NULL; |
1464 | } |
1465 | |
1466 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1467 | index 23aebcb..bf8bcc4 100644 |
1468 | --- a/drivers/usb/host/xhci-ring.c |
1469 | +++ b/drivers/usb/host/xhci-ring.c |
1470 | @@ -3069,11 +3069,11 @@ static u32 xhci_td_remainder(unsigned int remainder) |
1471 | } |
1472 | |
1473 | /* |
1474 | - * For xHCI 1.0 host controllers, TD size is the number of packets remaining in |
1475 | - * the TD (*not* including this TRB). |
1476 | + * For xHCI 1.0 host controllers, TD size is the number of max packet sized |
1477 | + * packets remaining in the TD (*not* including this TRB). |
1478 | * |
1479 | * Total TD packet count = total_packet_count = |
1480 | - * roundup(TD size in bytes / wMaxPacketSize) |
1481 | + * DIV_ROUND_UP(TD size in bytes / wMaxPacketSize) |
1482 | * |
1483 | * Packets transferred up to and including this TRB = packets_transferred = |
1484 | * rounddown(total bytes transferred including this TRB / wMaxPacketSize) |
1485 | @@ -3081,15 +3081,16 @@ static u32 xhci_td_remainder(unsigned int remainder) |
1486 | * TD size = total_packet_count - packets_transferred |
1487 | * |
1488 | * It must fit in bits 21:17, so it can't be bigger than 31. |
1489 | + * The last TRB in a TD must have the TD size set to zero. |
1490 | */ |
1491 | - |
1492 | static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, |
1493 | - unsigned int total_packet_count, struct urb *urb) |
1494 | + unsigned int total_packet_count, struct urb *urb, |
1495 | + unsigned int num_trbs_left) |
1496 | { |
1497 | int packets_transferred; |
1498 | |
1499 | /* One TRB with a zero-length data packet. */ |
1500 | - if (running_total == 0 && trb_buff_len == 0) |
1501 | + if (num_trbs_left == 0 || (running_total == 0 && trb_buff_len == 0)) |
1502 | return 0; |
1503 | |
1504 | /* All the TRB queueing functions don't count the current TRB in |
1505 | @@ -3098,7 +3099,9 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, |
1506 | packets_transferred = (running_total + trb_buff_len) / |
1507 | usb_endpoint_maxp(&urb->ep->desc); |
1508 | |
1509 | - return xhci_td_remainder(total_packet_count - packets_transferred); |
1510 | + if ((total_packet_count - packets_transferred) > 31) |
1511 | + return 31 << 17; |
1512 | + return (total_packet_count - packets_transferred) << 17; |
1513 | } |
1514 | |
1515 | static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1516 | @@ -3125,7 +3128,7 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1517 | |
1518 | num_trbs = count_sg_trbs_needed(xhci, urb); |
1519 | num_sgs = urb->num_mapped_sgs; |
1520 | - total_packet_count = roundup(urb->transfer_buffer_length, |
1521 | + total_packet_count = DIV_ROUND_UP(urb->transfer_buffer_length, |
1522 | usb_endpoint_maxp(&urb->ep->desc)); |
1523 | |
1524 | trb_buff_len = prepare_transfer(xhci, xhci->devs[slot_id], |
1525 | @@ -3208,7 +3211,8 @@ static int queue_bulk_sg_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1526 | running_total); |
1527 | } else { |
1528 | remainder = xhci_v1_0_td_remainder(running_total, |
1529 | - trb_buff_len, total_packet_count, urb); |
1530 | + trb_buff_len, total_packet_count, urb, |
1531 | + num_trbs - 1); |
1532 | } |
1533 | length_field = TRB_LEN(trb_buff_len) | |
1534 | remainder | |
1535 | @@ -3316,7 +3320,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1536 | start_cycle = ep_ring->cycle_state; |
1537 | |
1538 | running_total = 0; |
1539 | - total_packet_count = roundup(urb->transfer_buffer_length, |
1540 | + total_packet_count = DIV_ROUND_UP(urb->transfer_buffer_length, |
1541 | usb_endpoint_maxp(&urb->ep->desc)); |
1542 | /* How much data is in the first TRB? */ |
1543 | addr = (u64) urb->transfer_dma; |
1544 | @@ -3362,7 +3366,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1545 | running_total); |
1546 | } else { |
1547 | remainder = xhci_v1_0_td_remainder(running_total, |
1548 | - trb_buff_len, total_packet_count, urb); |
1549 | + trb_buff_len, total_packet_count, urb, |
1550 | + num_trbs - 1); |
1551 | } |
1552 | length_field = TRB_LEN(trb_buff_len) | |
1553 | remainder | |
1554 | @@ -3625,7 +3630,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1555 | addr = start_addr + urb->iso_frame_desc[i].offset; |
1556 | td_len = urb->iso_frame_desc[i].length; |
1557 | td_remain_len = td_len; |
1558 | - total_packet_count = roundup(td_len, |
1559 | + total_packet_count = DIV_ROUND_UP(td_len, |
1560 | usb_endpoint_maxp(&urb->ep->desc)); |
1561 | /* A zero-length transfer still involves at least one packet. */ |
1562 | if (total_packet_count == 0) |
1563 | @@ -3704,7 +3709,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1564 | } else { |
1565 | remainder = xhci_v1_0_td_remainder( |
1566 | running_total, trb_buff_len, |
1567 | - total_packet_count, urb); |
1568 | + total_packet_count, urb, |
1569 | + (trbs_per_td - j - 1)); |
1570 | } |
1571 | length_field = TRB_LEN(trb_buff_len) | |
1572 | remainder | |
1573 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1574 | index e52ddfe..b4063fc 100644 |
1575 | --- a/drivers/usb/host/xhci.c |
1576 | +++ b/drivers/usb/host/xhci.c |
1577 | @@ -480,7 +480,7 @@ static bool compliance_mode_recovery_timer_quirk_check(void) |
1578 | if (strstr(dmi_product_name, "Z420") || |
1579 | strstr(dmi_product_name, "Z620") || |
1580 | strstr(dmi_product_name, "Z820") || |
1581 | - strstr(dmi_product_name, "Z1")) |
1582 | + strstr(dmi_product_name, "Z1 Workstation")) |
1583 | return true; |
1584 | |
1585 | return false; |
1586 | @@ -2253,7 +2253,7 @@ static bool xhci_is_async_ep(unsigned int ep_type) |
1587 | |
1588 | static bool xhci_is_sync_in_ep(unsigned int ep_type) |
1589 | { |
1590 | - return (ep_type == ISOC_IN_EP || ep_type != INT_IN_EP); |
1591 | + return (ep_type == ISOC_IN_EP || ep_type == INT_IN_EP); |
1592 | } |
1593 | |
1594 | static unsigned int xhci_get_ss_bw_consumed(struct xhci_bw_info *ep_bw) |
1595 | diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c |
1596 | index 66bc376..319cfcf 100644 |
1597 | --- a/drivers/usb/musb/cppi_dma.c |
1598 | +++ b/drivers/usb/musb/cppi_dma.c |
1599 | @@ -1313,6 +1313,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) |
1600 | |
1601 | return IRQ_HANDLED; |
1602 | } |
1603 | +EXPORT_SYMBOL_GPL(cppi_interrupt); |
1604 | |
1605 | /* Instantiate a software object representing a DMA controller. */ |
1606 | struct dma_controller *__init |
1607 | diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c |
1608 | index 5aa43c3..52bfd07 100644 |
1609 | --- a/drivers/virtio/virtio_ring.c |
1610 | +++ b/drivers/virtio/virtio_ring.c |
1611 | @@ -132,6 +132,13 @@ static int vring_add_indirect(struct vring_virtqueue *vq, |
1612 | unsigned head; |
1613 | int i; |
1614 | |
1615 | + /* |
1616 | + * We require lowmem mappings for the descriptors because |
1617 | + * otherwise virt_to_phys will give us bogus addresses in the |
1618 | + * virtqueue. |
1619 | + */ |
1620 | + gfp &= ~(__GFP_HIGHMEM | __GFP_HIGH); |
1621 | + |
1622 | desc = kmalloc((out + in) * sizeof(struct vring_desc), gfp); |
1623 | if (!desc) |
1624 | return -ENOMEM; |
1625 | diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c |
1626 | index 613aa06..e172439 100644 |
1627 | --- a/fs/binfmt_misc.c |
1628 | +++ b/fs/binfmt_misc.c |
1629 | @@ -176,7 +176,10 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs) |
1630 | goto _error; |
1631 | bprm->argc ++; |
1632 | |
1633 | - bprm->interp = iname; /* for binfmt_script */ |
1634 | + /* Update interp in case binfmt_script needs it. */ |
1635 | + retval = bprm_change_interp(iname, bprm); |
1636 | + if (retval < 0) |
1637 | + goto _error; |
1638 | |
1639 | interp_file = open_exec (iname); |
1640 | retval = PTR_ERR (interp_file); |
1641 | diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c |
1642 | index d3b8c1f..df49d48 100644 |
1643 | --- a/fs/binfmt_script.c |
1644 | +++ b/fs/binfmt_script.c |
1645 | @@ -82,7 +82,9 @@ static int load_script(struct linux_binprm *bprm,struct pt_regs *regs) |
1646 | retval = copy_strings_kernel(1, &i_name, bprm); |
1647 | if (retval) return retval; |
1648 | bprm->argc++; |
1649 | - bprm->interp = interp; |
1650 | + retval = bprm_change_interp(interp, bprm); |
1651 | + if (retval < 0) |
1652 | + return retval; |
1653 | |
1654 | /* |
1655 | * OK, now restart the process with the interpreter's dentry. |
1656 | diff --git a/fs/exec.c b/fs/exec.c |
1657 | index 6c4791d..51d8629 100644 |
1658 | --- a/fs/exec.c |
1659 | +++ b/fs/exec.c |
1660 | @@ -1206,9 +1206,24 @@ void free_bprm(struct linux_binprm *bprm) |
1661 | mutex_unlock(¤t->signal->cred_guard_mutex); |
1662 | abort_creds(bprm->cred); |
1663 | } |
1664 | + /* If a binfmt changed the interp, free it. */ |
1665 | + if (bprm->interp != bprm->filename) |
1666 | + kfree(bprm->interp); |
1667 | kfree(bprm); |
1668 | } |
1669 | |
1670 | +int bprm_change_interp(char *interp, struct linux_binprm *bprm) |
1671 | +{ |
1672 | + /* If a binfmt changed the interp, free it first. */ |
1673 | + if (bprm->interp != bprm->filename) |
1674 | + kfree(bprm->interp); |
1675 | + bprm->interp = kstrdup(interp, GFP_KERNEL); |
1676 | + if (!bprm->interp) |
1677 | + return -ENOMEM; |
1678 | + return 0; |
1679 | +} |
1680 | +EXPORT_SYMBOL(bprm_change_interp); |
1681 | + |
1682 | /* |
1683 | * install the new credentials for this executable |
1684 | */ |
1685 | diff --git a/fs/nfs/client.c b/fs/nfs/client.c |
1686 | index 60f7e4e..37f6de3 100644 |
1687 | --- a/fs/nfs/client.c |
1688 | +++ b/fs/nfs/client.c |
1689 | @@ -694,8 +694,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp, |
1690 | */ |
1691 | static void nfs_destroy_server(struct nfs_server *server) |
1692 | { |
1693 | - if (!(server->flags & NFS_MOUNT_LOCAL_FLOCK) || |
1694 | - !(server->flags & NFS_MOUNT_LOCAL_FCNTL)) |
1695 | + if (server->nlm_host) |
1696 | nlmclnt_done(server->nlm_host); |
1697 | } |
1698 | |
1699 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
1700 | index 53ad9d1..a0daac7 100644 |
1701 | --- a/fs/nfs/dir.c |
1702 | +++ b/fs/nfs/dir.c |
1703 | @@ -1219,11 +1219,14 @@ static int nfs_dentry_delete(const struct dentry *dentry) |
1704 | |
1705 | } |
1706 | |
1707 | +/* Ensure that we revalidate inode->i_nlink */ |
1708 | static void nfs_drop_nlink(struct inode *inode) |
1709 | { |
1710 | spin_lock(&inode->i_lock); |
1711 | - if (inode->i_nlink > 0) |
1712 | - drop_nlink(inode); |
1713 | + /* drop the inode if we're reasonably sure this is the last link */ |
1714 | + if (inode->i_nlink == 1) |
1715 | + clear_nlink(inode); |
1716 | + NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR; |
1717 | spin_unlock(&inode->i_lock); |
1718 | } |
1719 | |
1720 | @@ -1238,8 +1241,8 @@ static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode) |
1721 | NFS_I(inode)->cache_validity |= NFS_INO_INVALID_DATA; |
1722 | |
1723 | if (dentry->d_flags & DCACHE_NFSFS_RENAMED) { |
1724 | - drop_nlink(inode); |
1725 | nfs_complete_unlink(dentry, inode); |
1726 | + nfs_drop_nlink(inode); |
1727 | } |
1728 | iput(inode); |
1729 | } |
1730 | @@ -1800,10 +1803,8 @@ static int nfs_safe_remove(struct dentry *dentry) |
1731 | if (inode != NULL) { |
1732 | nfs_inode_return_delegation(inode); |
1733 | error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); |
1734 | - /* The VFS may want to delete this inode */ |
1735 | if (error == 0) |
1736 | nfs_drop_nlink(inode); |
1737 | - nfs_mark_for_revalidate(inode); |
1738 | } else |
1739 | error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); |
1740 | if (error == -ENOENT) |
1741 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1742 | index 8955e36..3035187 100644 |
1743 | --- a/fs/nfs/nfs4proc.c |
1744 | +++ b/fs/nfs/nfs4proc.c |
1745 | @@ -5739,13 +5739,26 @@ static void nfs41_sequence_prepare(struct rpc_task *task, void *data) |
1746 | rpc_call_start(task); |
1747 | } |
1748 | |
1749 | +static void nfs41_sequence_prepare_privileged(struct rpc_task *task, void *data) |
1750 | +{ |
1751 | + rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED); |
1752 | + nfs41_sequence_prepare(task, data); |
1753 | +} |
1754 | + |
1755 | static const struct rpc_call_ops nfs41_sequence_ops = { |
1756 | .rpc_call_done = nfs41_sequence_call_done, |
1757 | .rpc_call_prepare = nfs41_sequence_prepare, |
1758 | .rpc_release = nfs41_sequence_release, |
1759 | }; |
1760 | |
1761 | -static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred) |
1762 | +static const struct rpc_call_ops nfs41_sequence_privileged_ops = { |
1763 | + .rpc_call_done = nfs41_sequence_call_done, |
1764 | + .rpc_call_prepare = nfs41_sequence_prepare_privileged, |
1765 | + .rpc_release = nfs41_sequence_release, |
1766 | +}; |
1767 | + |
1768 | +static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred, |
1769 | + const struct rpc_call_ops *seq_ops) |
1770 | { |
1771 | struct nfs4_sequence_data *calldata; |
1772 | struct rpc_message msg = { |
1773 | @@ -5755,7 +5768,7 @@ static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp, struct rpc_ |
1774 | struct rpc_task_setup task_setup_data = { |
1775 | .rpc_client = clp->cl_rpcclient, |
1776 | .rpc_message = &msg, |
1777 | - .callback_ops = &nfs41_sequence_ops, |
1778 | + .callback_ops = seq_ops, |
1779 | .flags = RPC_TASK_ASYNC | RPC_TASK_SOFT, |
1780 | }; |
1781 | |
1782 | @@ -5782,7 +5795,7 @@ static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cr |
1783 | |
1784 | if ((renew_flags & NFS4_RENEW_TIMEOUT) == 0) |
1785 | return 0; |
1786 | - task = _nfs41_proc_sequence(clp, cred); |
1787 | + task = _nfs41_proc_sequence(clp, cred, &nfs41_sequence_ops); |
1788 | if (IS_ERR(task)) |
1789 | ret = PTR_ERR(task); |
1790 | else |
1791 | @@ -5796,7 +5809,7 @@ static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred) |
1792 | struct rpc_task *task; |
1793 | int ret; |
1794 | |
1795 | - task = _nfs41_proc_sequence(clp, cred); |
1796 | + task = _nfs41_proc_sequence(clp, cred, &nfs41_sequence_privileged_ops); |
1797 | if (IS_ERR(task)) { |
1798 | ret = PTR_ERR(task); |
1799 | goto out; |
1800 | diff --git a/fs/nfs/super.c b/fs/nfs/super.c |
1801 | index feabe7a..c252161 100644 |
1802 | --- a/fs/nfs/super.c |
1803 | +++ b/fs/nfs/super.c |
1804 | @@ -1138,7 +1138,7 @@ static int nfs_get_option_str(substring_t args[], char **option) |
1805 | { |
1806 | kfree(*option); |
1807 | *option = match_strdup(args); |
1808 | - return !option; |
1809 | + return !*option; |
1810 | } |
1811 | |
1812 | static int nfs_get_option_ul(substring_t args[], unsigned long *option) |
1813 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
1814 | index 987e719..dd0308d 100644 |
1815 | --- a/fs/nfsd/nfs4proc.c |
1816 | +++ b/fs/nfsd/nfs4proc.c |
1817 | @@ -194,6 +194,7 @@ static __be32 |
1818 | do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open *open) |
1819 | { |
1820 | struct svc_fh *resfh; |
1821 | + int accmode; |
1822 | __be32 status; |
1823 | |
1824 | resfh = kmalloc(sizeof(struct svc_fh), GFP_KERNEL); |
1825 | @@ -253,9 +254,10 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o |
1826 | /* set reply cache */ |
1827 | fh_copy_shallow(&open->op_openowner->oo_owner.so_replay.rp_openfh, |
1828 | &resfh->fh_handle); |
1829 | - if (!open->op_created) |
1830 | - status = do_open_permission(rqstp, resfh, open, |
1831 | - NFSD_MAY_NOP); |
1832 | + accmode = NFSD_MAY_NOP; |
1833 | + if (open->op_created) |
1834 | + accmode |= NFSD_MAY_OWNER_OVERRIDE; |
1835 | + status = do_open_permission(rqstp, resfh, open, accmode); |
1836 | set_change_info(&open->op_cinfo, current_fh); |
1837 | fh_dup2(current_fh, resfh); |
1838 | out: |
1839 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
1840 | index a2f99d1..537731e 100644 |
1841 | --- a/fs/nfsd/nfs4state.c |
1842 | +++ b/fs/nfsd/nfs4state.c |
1843 | @@ -2356,7 +2356,7 @@ nfsd4_init_slabs(void) |
1844 | if (openowner_slab == NULL) |
1845 | goto out_nomem; |
1846 | lockowner_slab = kmem_cache_create("nfsd4_lockowners", |
1847 | - sizeof(struct nfs4_openowner), 0, 0, NULL); |
1848 | + sizeof(struct nfs4_lockowner), 0, 0, NULL); |
1849 | if (lockowner_slab == NULL) |
1850 | goto out_nomem; |
1851 | file_slab = kmem_cache_create("nfsd4_files", |
1852 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
1853 | index 283d15e..967d68e 100644 |
1854 | --- a/fs/nfsd/nfs4xdr.c |
1855 | +++ b/fs/nfsd/nfs4xdr.c |
1856 | @@ -2920,11 +2920,16 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, |
1857 | len = maxcount; |
1858 | v = 0; |
1859 | while (len > 0) { |
1860 | - pn = resp->rqstp->rq_resused++; |
1861 | + pn = resp->rqstp->rq_resused; |
1862 | + if (!resp->rqstp->rq_respages[pn]) { /* ran out of pages */ |
1863 | + maxcount -= len; |
1864 | + break; |
1865 | + } |
1866 | resp->rqstp->rq_vec[v].iov_base = |
1867 | page_address(resp->rqstp->rq_respages[pn]); |
1868 | resp->rqstp->rq_vec[v].iov_len = |
1869 | len < PAGE_SIZE ? len : PAGE_SIZE; |
1870 | + resp->rqstp->rq_resused++; |
1871 | v++; |
1872 | len -= PAGE_SIZE; |
1873 | } |
1874 | @@ -2970,6 +2975,8 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd |
1875 | return nfserr; |
1876 | if (resp->xbuf->page_len) |
1877 | return nfserr_resource; |
1878 | + if (!resp->rqstp->rq_respages[resp->rqstp->rq_resused]) |
1879 | + return nfserr_resource; |
1880 | |
1881 | page = page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused++]); |
1882 | |
1883 | @@ -3019,6 +3026,8 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4 |
1884 | return nfserr; |
1885 | if (resp->xbuf->page_len) |
1886 | return nfserr_resource; |
1887 | + if (!resp->rqstp->rq_respages[resp->rqstp->rq_resused]) |
1888 | + return nfserr_resource; |
1889 | |
1890 | RESERVE_SPACE(NFS4_VERIFIER_SIZE); |
1891 | savep = p; |
1892 | diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c |
1893 | index b6f8e65..53459b0 100644 |
1894 | --- a/fs/nfsd/nfssvc.c |
1895 | +++ b/fs/nfsd/nfssvc.c |
1896 | @@ -650,7 +650,7 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp) |
1897 | } |
1898 | |
1899 | /* Store reply in cache. */ |
1900 | - nfsd_cache_update(rqstp, proc->pc_cachetype, statp + 1); |
1901 | + nfsd_cache_update(rqstp, rqstp->rq_cachetype, statp + 1); |
1902 | return 1; |
1903 | } |
1904 | |
1905 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
1906 | index 5686661..f031601 100644 |
1907 | --- a/fs/nfsd/vfs.c |
1908 | +++ b/fs/nfsd/vfs.c |
1909 | @@ -1477,13 +1477,19 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, |
1910 | case NFS3_CREATE_EXCLUSIVE: |
1911 | if ( dchild->d_inode->i_mtime.tv_sec == v_mtime |
1912 | && dchild->d_inode->i_atime.tv_sec == v_atime |
1913 | - && dchild->d_inode->i_size == 0 ) |
1914 | + && dchild->d_inode->i_size == 0 ) { |
1915 | + if (created) |
1916 | + *created = 1; |
1917 | break; |
1918 | + } |
1919 | case NFS4_CREATE_EXCLUSIVE4_1: |
1920 | if ( dchild->d_inode->i_mtime.tv_sec == v_mtime |
1921 | && dchild->d_inode->i_atime.tv_sec == v_atime |
1922 | - && dchild->d_inode->i_size == 0 ) |
1923 | + && dchild->d_inode->i_size == 0 ) { |
1924 | + if (created) |
1925 | + *created = 1; |
1926 | goto set_attr; |
1927 | + } |
1928 | /* fallthru */ |
1929 | case NFS3_CREATE_GUARDED: |
1930 | err = nfserr_exist; |
1931 | diff --git a/fs/splice.c b/fs/splice.c |
1932 | index 5cac690..bed6a3c 100644 |
1933 | --- a/fs/splice.c |
1934 | +++ b/fs/splice.c |
1935 | @@ -696,8 +696,10 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, |
1936 | return -EINVAL; |
1937 | |
1938 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; |
1939 | - if (sd->len < sd->total_len) |
1940 | + |
1941 | + if (sd->len < sd->total_len && pipe->nrbufs > 1) |
1942 | more |= MSG_SENDPAGE_NOTLAST; |
1943 | + |
1944 | return file->f_op->sendpage(file, buf->page, buf->offset, |
1945 | sd->len, &pos, more); |
1946 | } |
1947 | diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h |
1948 | index f96a5b5..979ed15 100644 |
1949 | --- a/include/asm-generic/tlb.h |
1950 | +++ b/include/asm-generic/tlb.h |
1951 | @@ -78,6 +78,14 @@ struct mmu_gather_batch { |
1952 | #define MAX_GATHER_BATCH \ |
1953 | ((PAGE_SIZE - sizeof(struct mmu_gather_batch)) / sizeof(void *)) |
1954 | |
1955 | +/* |
1956 | + * Limit the maximum number of mmu_gather batches to reduce a risk of soft |
1957 | + * lockups for non-preemptible kernels on huge machines when a lot of memory |
1958 | + * is zapped during unmapping. |
1959 | + * 10K pages freed at once should be safe even without a preemption point. |
1960 | + */ |
1961 | +#define MAX_GATHER_BATCH_COUNT (10000UL/MAX_GATHER_BATCH) |
1962 | + |
1963 | /* struct mmu_gather is an opaque type used by the mm code for passing around |
1964 | * any data needed by arch specific code for tlb_remove_page. |
1965 | */ |
1966 | @@ -94,6 +102,7 @@ struct mmu_gather { |
1967 | struct mmu_gather_batch *active; |
1968 | struct mmu_gather_batch local; |
1969 | struct page *__pages[MMU_GATHER_BUNDLE]; |
1970 | + unsigned int batch_count; |
1971 | }; |
1972 | |
1973 | #define HAVE_GENERIC_MMU_GATHER |
1974 | diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h |
1975 | index 366422b..eb53e15 100644 |
1976 | --- a/include/linux/binfmts.h |
1977 | +++ b/include/linux/binfmts.h |
1978 | @@ -128,6 +128,7 @@ extern int setup_arg_pages(struct linux_binprm * bprm, |
1979 | unsigned long stack_top, |
1980 | int executable_stack); |
1981 | extern int bprm_mm_init(struct linux_binprm *bprm); |
1982 | +extern int bprm_change_interp(char *interp, struct linux_binprm *bprm); |
1983 | extern int copy_strings_kernel(int argc, const char *const *argv, |
1984 | struct linux_binprm *bprm); |
1985 | extern int prepare_bprm_creds(struct linux_binprm *bprm); |
1986 | diff --git a/include/linux/freezer.h b/include/linux/freezer.h |
1987 | index d09af4b..ee89932 100644 |
1988 | --- a/include/linux/freezer.h |
1989 | +++ b/include/linux/freezer.h |
1990 | @@ -75,28 +75,62 @@ static inline bool cgroup_freezing(struct task_struct *task) |
1991 | */ |
1992 | |
1993 | |
1994 | -/* Tell the freezer not to count the current task as freezable. */ |
1995 | +/** |
1996 | + * freezer_do_not_count - tell freezer to ignore %current |
1997 | + * |
1998 | + * Tell freezers to ignore the current task when determining whether the |
1999 | + * target frozen state is reached. IOW, the current task will be |
2000 | + * considered frozen enough by freezers. |
2001 | + * |
2002 | + * The caller shouldn't do anything which isn't allowed for a frozen task |
2003 | + * until freezer_cont() is called. Usually, freezer[_do_not]_count() pair |
2004 | + * wrap a scheduling operation and nothing much else. |
2005 | + */ |
2006 | static inline void freezer_do_not_count(void) |
2007 | { |
2008 | current->flags |= PF_FREEZER_SKIP; |
2009 | } |
2010 | |
2011 | -/* |
2012 | - * Tell the freezer to count the current task as freezable again and try to |
2013 | - * freeze it. |
2014 | +/** |
2015 | + * freezer_count - tell freezer to stop ignoring %current |
2016 | + * |
2017 | + * Undo freezer_do_not_count(). It tells freezers that %current should be |
2018 | + * considered again and tries to freeze if freezing condition is already in |
2019 | + * effect. |
2020 | */ |
2021 | static inline void freezer_count(void) |
2022 | { |
2023 | current->flags &= ~PF_FREEZER_SKIP; |
2024 | + /* |
2025 | + * If freezing is in progress, the following paired with smp_mb() |
2026 | + * in freezer_should_skip() ensures that either we see %true |
2027 | + * freezing() or freezer_should_skip() sees !PF_FREEZER_SKIP. |
2028 | + */ |
2029 | + smp_mb(); |
2030 | try_to_freeze(); |
2031 | } |
2032 | |
2033 | -/* |
2034 | - * Check if the task should be counted as freezable by the freezer |
2035 | +/** |
2036 | + * freezer_should_skip - whether to skip a task when determining frozen |
2037 | + * state is reached |
2038 | + * @p: task in quesion |
2039 | + * |
2040 | + * This function is used by freezers after establishing %true freezing() to |
2041 | + * test whether a task should be skipped when determining the target frozen |
2042 | + * state is reached. IOW, if this function returns %true, @p is considered |
2043 | + * frozen enough. |
2044 | */ |
2045 | -static inline int freezer_should_skip(struct task_struct *p) |
2046 | +static inline bool freezer_should_skip(struct task_struct *p) |
2047 | { |
2048 | - return !!(p->flags & PF_FREEZER_SKIP); |
2049 | + /* |
2050 | + * The following smp_mb() paired with the one in freezer_count() |
2051 | + * ensures that either freezer_count() sees %true freezing() or we |
2052 | + * see cleared %PF_FREEZER_SKIP and return %false. This makes it |
2053 | + * impossible for a task to slip frozen state testing after |
2054 | + * clearing %PF_FREEZER_SKIP. |
2055 | + */ |
2056 | + smp_mb(); |
2057 | + return p->flags & PF_FREEZER_SKIP; |
2058 | } |
2059 | |
2060 | /* |
2061 | diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h |
2062 | index c88d2a9..4dabf0f 100644 |
2063 | --- a/include/linux/page-flags.h |
2064 | +++ b/include/linux/page-flags.h |
2065 | @@ -361,7 +361,7 @@ static inline void ClearPageCompound(struct page *page) |
2066 | * pages on the LRU and/or pagecache. |
2067 | */ |
2068 | TESTPAGEFLAG(Compound, compound) |
2069 | -__PAGEFLAG(Head, compound) |
2070 | +__SETPAGEFLAG(Head, compound) __CLEARPAGEFLAG(Head, compound) |
2071 | |
2072 | /* |
2073 | * PG_reclaim is used in combination with PG_compound to mark the |
2074 | @@ -373,8 +373,14 @@ __PAGEFLAG(Head, compound) |
2075 | * PG_compound & PG_reclaim => Tail page |
2076 | * PG_compound & ~PG_reclaim => Head page |
2077 | */ |
2078 | +#define PG_head_mask ((1L << PG_compound)) |
2079 | #define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim)) |
2080 | |
2081 | +static inline int PageHead(struct page *page) |
2082 | +{ |
2083 | + return ((page->flags & PG_head_tail_mask) == PG_head_mask); |
2084 | +} |
2085 | + |
2086 | static inline int PageTail(struct page *page) |
2087 | { |
2088 | return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask); |
2089 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
2090 | index bf7934f..d7dbf4e 100644 |
2091 | --- a/include/linux/pci_ids.h |
2092 | +++ b/include/linux/pci_ids.h |
2093 | @@ -1565,6 +1565,7 @@ |
2094 | #define PCI_DEVICE_ID_RICOH_RL5C476 0x0476 |
2095 | #define PCI_DEVICE_ID_RICOH_RL5C478 0x0478 |
2096 | #define PCI_DEVICE_ID_RICOH_R5C822 0x0822 |
2097 | +#define PCI_DEVICE_ID_RICOH_R5CE822 0xe822 |
2098 | #define PCI_DEVICE_ID_RICOH_R5CE823 0xe823 |
2099 | #define PCI_DEVICE_ID_RICOH_R5C832 0x0832 |
2100 | #define PCI_DEVICE_ID_RICOH_R5C843 0x0843 |
2101 | diff --git a/include/linux/snmp.h b/include/linux/snmp.h |
2102 | index 2e68f5b..a33f70f 100644 |
2103 | --- a/include/linux/snmp.h |
2104 | +++ b/include/linux/snmp.h |
2105 | @@ -208,7 +208,6 @@ enum |
2106 | LINUX_MIB_TCPDSACKOFOSENT, /* TCPDSACKOfoSent */ |
2107 | LINUX_MIB_TCPDSACKRECV, /* TCPDSACKRecv */ |
2108 | LINUX_MIB_TCPDSACKOFORECV, /* TCPDSACKOfoRecv */ |
2109 | - LINUX_MIB_TCPABORTONSYN, /* TCPAbortOnSyn */ |
2110 | LINUX_MIB_TCPABORTONDATA, /* TCPAbortOnData */ |
2111 | LINUX_MIB_TCPABORTONCLOSE, /* TCPAbortOnClose */ |
2112 | LINUX_MIB_TCPABORTONMEMORY, /* TCPAbortOnMemory */ |
2113 | @@ -234,6 +233,8 @@ enum |
2114 | LINUX_MIB_TCPREQQFULLDROP, /* TCPReqQFullDrop */ |
2115 | LINUX_MIB_TCPRETRANSFAIL, /* TCPRetransFail */ |
2116 | LINUX_MIB_TCPRCVCOALESCE, /* TCPRcvCoalesce */ |
2117 | + LINUX_MIB_TCPCHALLENGEACK, /* TCPChallengeACK */ |
2118 | + LINUX_MIB_TCPSYNCHALLENGE, /* TCPSYNChallenge */ |
2119 | __LINUX_MIB_MAX |
2120 | }; |
2121 | |
2122 | diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h |
2123 | index dbf9aab..e9b05de 100644 |
2124 | --- a/include/net/inet_connection_sock.h |
2125 | +++ b/include/net/inet_connection_sock.h |
2126 | @@ -317,6 +317,7 @@ extern void inet_csk_reqsk_queue_prune(struct sock *parent, |
2127 | const unsigned long max_rto); |
2128 | |
2129 | extern void inet_csk_destroy_sock(struct sock *sk); |
2130 | +extern void inet_csk_prepare_forced_close(struct sock *sk); |
2131 | |
2132 | /* |
2133 | * LISTEN is a special case for poll.. |
2134 | diff --git a/include/net/tcp.h b/include/net/tcp.h |
2135 | index f75a04d..2757a11 100644 |
2136 | --- a/include/net/tcp.h |
2137 | +++ b/include/net/tcp.h |
2138 | @@ -252,6 +252,7 @@ extern int sysctl_tcp_max_ssthresh; |
2139 | extern int sysctl_tcp_cookie_size; |
2140 | extern int sysctl_tcp_thin_linear_timeouts; |
2141 | extern int sysctl_tcp_thin_dupack; |
2142 | +extern int sysctl_tcp_challenge_ack_limit; |
2143 | |
2144 | extern atomic_long_t tcp_memory_allocated; |
2145 | extern struct percpu_counter tcp_sockets_allocated; |
2146 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
2147 | index 762f7cc7..a5dccd4 100644 |
2148 | --- a/kernel/cgroup.c |
2149 | +++ b/kernel/cgroup.c |
2150 | @@ -2568,9 +2568,7 @@ static int cgroup_create_dir(struct cgroup *cgrp, struct dentry *dentry, |
2151 | dentry->d_fsdata = cgrp; |
2152 | inc_nlink(parent->d_inode); |
2153 | rcu_assign_pointer(cgrp->dentry, dentry); |
2154 | - dget(dentry); |
2155 | } |
2156 | - dput(dentry); |
2157 | |
2158 | return error; |
2159 | } |
2160 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
2161 | index b9d1d83..7684920 100644 |
2162 | --- a/kernel/irq/manage.c |
2163 | +++ b/kernel/irq/manage.c |
2164 | @@ -708,6 +708,7 @@ static void |
2165 | irq_thread_check_affinity(struct irq_desc *desc, struct irqaction *action) |
2166 | { |
2167 | cpumask_var_t mask; |
2168 | + bool valid = true; |
2169 | |
2170 | if (!test_and_clear_bit(IRQTF_AFFINITY, &action->thread_flags)) |
2171 | return; |
2172 | @@ -722,10 +723,18 @@ irq_thread_check_affinity(struct irq_desc *desc, struct irqaction *action) |
2173 | } |
2174 | |
2175 | raw_spin_lock_irq(&desc->lock); |
2176 | - cpumask_copy(mask, desc->irq_data.affinity); |
2177 | + /* |
2178 | + * This code is triggered unconditionally. Check the affinity |
2179 | + * mask pointer. For CPU_MASK_OFFSTACK=n this is optimized out. |
2180 | + */ |
2181 | + if (desc->irq_data.affinity) |
2182 | + cpumask_copy(mask, desc->irq_data.affinity); |
2183 | + else |
2184 | + valid = false; |
2185 | raw_spin_unlock_irq(&desc->lock); |
2186 | |
2187 | - set_cpus_allowed_ptr(current, mask); |
2188 | + if (valid) |
2189 | + set_cpus_allowed_ptr(current, mask); |
2190 | free_cpumask_var(mask); |
2191 | } |
2192 | #else |
2193 | @@ -933,6 +942,16 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) |
2194 | */ |
2195 | get_task_struct(t); |
2196 | new->thread = t; |
2197 | + /* |
2198 | + * Tell the thread to set its affinity. This is |
2199 | + * important for shared interrupt handlers as we do |
2200 | + * not invoke setup_affinity() for the secondary |
2201 | + * handlers as everything is already set up. Even for |
2202 | + * interrupts marked with IRQF_NO_BALANCE this is |
2203 | + * correct as we want the thread to move to the cpu(s) |
2204 | + * on which the requesting code placed the interrupt. |
2205 | + */ |
2206 | + set_bit(IRQTF_AFFINITY, &new->thread_flags); |
2207 | } |
2208 | |
2209 | if (!alloc_cpumask_var(&mask, GFP_KERNEL)) { |
2210 | diff --git a/lib/atomic64.c b/lib/atomic64.c |
2211 | index 9785378..08a4f06 100644 |
2212 | --- a/lib/atomic64.c |
2213 | +++ b/lib/atomic64.c |
2214 | @@ -31,7 +31,11 @@ |
2215 | static union { |
2216 | raw_spinlock_t lock; |
2217 | char pad[L1_CACHE_BYTES]; |
2218 | -} atomic64_lock[NR_LOCKS] __cacheline_aligned_in_smp; |
2219 | +} atomic64_lock[NR_LOCKS] __cacheline_aligned_in_smp = { |
2220 | + [0 ... (NR_LOCKS - 1)] = { |
2221 | + .lock = __RAW_SPIN_LOCK_UNLOCKED(atomic64_lock.lock), |
2222 | + }, |
2223 | +}; |
2224 | |
2225 | static inline raw_spinlock_t *lock_addr(const atomic64_t *v) |
2226 | { |
2227 | @@ -173,14 +177,3 @@ int atomic64_add_unless(atomic64_t *v, long long a, long long u) |
2228 | return ret; |
2229 | } |
2230 | EXPORT_SYMBOL(atomic64_add_unless); |
2231 | - |
2232 | -static int init_atomic64_lock(void) |
2233 | -{ |
2234 | - int i; |
2235 | - |
2236 | - for (i = 0; i < NR_LOCKS; ++i) |
2237 | - raw_spin_lock_init(&atomic64_lock[i].lock); |
2238 | - return 0; |
2239 | -} |
2240 | - |
2241 | -pure_initcall(init_atomic64_lock); |
2242 | diff --git a/mm/memory.c b/mm/memory.c |
2243 | index 6105f47..024b4af 100644 |
2244 | --- a/mm/memory.c |
2245 | +++ b/mm/memory.c |
2246 | @@ -182,10 +182,14 @@ static int tlb_next_batch(struct mmu_gather *tlb) |
2247 | return 1; |
2248 | } |
2249 | |
2250 | + if (tlb->batch_count == MAX_GATHER_BATCH_COUNT) |
2251 | + return 0; |
2252 | + |
2253 | batch = (void *)__get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); |
2254 | if (!batch) |
2255 | return 0; |
2256 | |
2257 | + tlb->batch_count++; |
2258 | batch->next = NULL; |
2259 | batch->nr = 0; |
2260 | batch->max = MAX_GATHER_BATCH; |
2261 | @@ -212,6 +216,7 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm) |
2262 | tlb->local.nr = 0; |
2263 | tlb->local.max = ARRAY_SIZE(tlb->__pages); |
2264 | tlb->active = &tlb->local; |
2265 | + tlb->batch_count = 0; |
2266 | |
2267 | #ifdef CONFIG_HAVE_RCU_TABLE_FREE |
2268 | tlb->batch = NULL; |
2269 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
2270 | index 458dede..82f1b02 100644 |
2271 | --- a/mm/mempolicy.c |
2272 | +++ b/mm/mempolicy.c |
2273 | @@ -2344,8 +2344,7 @@ void numa_default_policy(void) |
2274 | */ |
2275 | |
2276 | /* |
2277 | - * "local" is pseudo-policy: MPOL_PREFERRED with MPOL_F_LOCAL flag |
2278 | - * Used only for mpol_parse_str() and mpol_to_str() |
2279 | + * "local" is implemented internally by MPOL_PREFERRED with MPOL_F_LOCAL flag. |
2280 | */ |
2281 | #define MPOL_LOCAL MPOL_MAX |
2282 | static const char * const policy_modes[] = |
2283 | @@ -2360,28 +2359,21 @@ static const char * const policy_modes[] = |
2284 | |
2285 | #ifdef CONFIG_TMPFS |
2286 | /** |
2287 | - * mpol_parse_str - parse string to mempolicy |
2288 | + * mpol_parse_str - parse string to mempolicy, for tmpfs mpol mount option. |
2289 | * @str: string containing mempolicy to parse |
2290 | * @mpol: pointer to struct mempolicy pointer, returned on success. |
2291 | - * @no_context: flag whether to "contextualize" the mempolicy |
2292 | + * @unused: redundant argument, to be removed later. |
2293 | * |
2294 | * Format of input: |
2295 | * <mode>[=<flags>][:<nodelist>] |
2296 | * |
2297 | - * if @no_context is true, save the input nodemask in w.user_nodemask in |
2298 | - * the returned mempolicy. This will be used to "clone" the mempolicy in |
2299 | - * a specific context [cpuset] at a later time. Used to parse tmpfs mpol |
2300 | - * mount option. Note that if 'static' or 'relative' mode flags were |
2301 | - * specified, the input nodemask will already have been saved. Saving |
2302 | - * it again is redundant, but safe. |
2303 | - * |
2304 | * On success, returns 0, else 1 |
2305 | */ |
2306 | -int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
2307 | +int mpol_parse_str(char *str, struct mempolicy **mpol, int unused) |
2308 | { |
2309 | struct mempolicy *new = NULL; |
2310 | unsigned short mode; |
2311 | - unsigned short uninitialized_var(mode_flags); |
2312 | + unsigned short mode_flags; |
2313 | nodemask_t nodes; |
2314 | char *nodelist = strchr(str, ':'); |
2315 | char *flags = strchr(str, '='); |
2316 | @@ -2469,24 +2461,23 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context) |
2317 | if (IS_ERR(new)) |
2318 | goto out; |
2319 | |
2320 | - if (no_context) { |
2321 | - /* save for contextualization */ |
2322 | - new->w.user_nodemask = nodes; |
2323 | - } else { |
2324 | - int ret; |
2325 | - NODEMASK_SCRATCH(scratch); |
2326 | - if (scratch) { |
2327 | - task_lock(current); |
2328 | - ret = mpol_set_nodemask(new, &nodes, scratch); |
2329 | - task_unlock(current); |
2330 | - } else |
2331 | - ret = -ENOMEM; |
2332 | - NODEMASK_SCRATCH_FREE(scratch); |
2333 | - if (ret) { |
2334 | - mpol_put(new); |
2335 | - goto out; |
2336 | - } |
2337 | - } |
2338 | + /* |
2339 | + * Save nodes for mpol_to_str() to show the tmpfs mount options |
2340 | + * for /proc/mounts, /proc/pid/mounts and /proc/pid/mountinfo. |
2341 | + */ |
2342 | + if (mode != MPOL_PREFERRED) |
2343 | + new->v.nodes = nodes; |
2344 | + else if (nodelist) |
2345 | + new->v.preferred_node = first_node(nodes); |
2346 | + else |
2347 | + new->flags |= MPOL_F_LOCAL; |
2348 | + |
2349 | + /* |
2350 | + * Save nodes for contextualization: this will be used to "clone" |
2351 | + * the mempolicy in a specific context [cpuset] at a later time. |
2352 | + */ |
2353 | + new->w.user_nodemask = nodes; |
2354 | + |
2355 | err = 0; |
2356 | |
2357 | out: |
2358 | @@ -2506,13 +2497,13 @@ out: |
2359 | * @buffer: to contain formatted mempolicy string |
2360 | * @maxlen: length of @buffer |
2361 | * @pol: pointer to mempolicy to be formatted |
2362 | - * @no_context: "context free" mempolicy - use nodemask in w.user_nodemask |
2363 | + * @unused: redundant argument, to be removed later. |
2364 | * |
2365 | * Convert a mempolicy into a string. |
2366 | * Returns the number of characters in buffer (if positive) |
2367 | * or an error (negative) |
2368 | */ |
2369 | -int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context) |
2370 | +int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int unused) |
2371 | { |
2372 | char *p = buffer; |
2373 | int l; |
2374 | @@ -2538,7 +2529,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context) |
2375 | case MPOL_PREFERRED: |
2376 | nodes_clear(nodes); |
2377 | if (flags & MPOL_F_LOCAL) |
2378 | - mode = MPOL_LOCAL; /* pseudo-policy */ |
2379 | + mode = MPOL_LOCAL; |
2380 | else |
2381 | node_set(pol->v.preferred_node, nodes); |
2382 | break; |
2383 | @@ -2546,10 +2537,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context) |
2384 | case MPOL_BIND: |
2385 | /* Fall through */ |
2386 | case MPOL_INTERLEAVE: |
2387 | - if (no_context) |
2388 | - nodes = pol->w.user_nodemask; |
2389 | - else |
2390 | - nodes = pol->v.nodes; |
2391 | + nodes = pol->v.nodes; |
2392 | break; |
2393 | |
2394 | default: |
2395 | diff --git a/mm/page-writeback.c b/mm/page-writeback.c |
2396 | index 26adea8..bc8465f 100644 |
2397 | --- a/mm/page-writeback.c |
2398 | +++ b/mm/page-writeback.c |
2399 | @@ -187,6 +187,18 @@ static unsigned long highmem_dirtyable_memory(unsigned long total) |
2400 | zone_reclaimable_pages(z) - z->dirty_balance_reserve; |
2401 | } |
2402 | /* |
2403 | + * Unreclaimable memory (kernel memory or anonymous memory |
2404 | + * without swap) can bring down the dirtyable pages below |
2405 | + * the zone's dirty balance reserve and the above calculation |
2406 | + * will underflow. However we still want to add in nodes |
2407 | + * which are below threshold (negative values) to get a more |
2408 | + * accurate calculation but make sure that the total never |
2409 | + * underflows. |
2410 | + */ |
2411 | + if ((long)x < 0) |
2412 | + x = 0; |
2413 | + |
2414 | + /* |
2415 | * Make sure that the number of highmem pages is never larger |
2416 | * than the number of the total dirtyable memory. This can only |
2417 | * occur in very strange VM situations but we want to make sure |
2418 | @@ -208,8 +220,8 @@ unsigned long global_dirtyable_memory(void) |
2419 | { |
2420 | unsigned long x; |
2421 | |
2422 | - x = global_page_state(NR_FREE_PAGES) + global_reclaimable_pages() - |
2423 | - dirty_balance_reserve; |
2424 | + x = global_page_state(NR_FREE_PAGES) + global_reclaimable_pages(); |
2425 | + x -= min(x, dirty_balance_reserve); |
2426 | |
2427 | if (!vm_highmem_is_dirtyable) |
2428 | x -= highmem_dirtyable_memory(x); |
2429 | @@ -276,9 +288,12 @@ static unsigned long zone_dirtyable_memory(struct zone *zone) |
2430 | * highmem zone can hold its share of dirty pages, so we don't |
2431 | * care about vm_highmem_is_dirtyable here. |
2432 | */ |
2433 | - return zone_page_state(zone, NR_FREE_PAGES) + |
2434 | - zone_reclaimable_pages(zone) - |
2435 | - zone->dirty_balance_reserve; |
2436 | + unsigned long nr_pages = zone_page_state(zone, NR_FREE_PAGES) + |
2437 | + zone_reclaimable_pages(zone); |
2438 | + |
2439 | + /* don't allow this to underflow */ |
2440 | + nr_pages -= min(nr_pages, zone->dirty_balance_reserve); |
2441 | + return nr_pages; |
2442 | } |
2443 | |
2444 | /** |
2445 | diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c |
2446 | index a6d5d63..fa701b6 100644 |
2447 | --- a/net/batman-adv/bat_iv_ogm.c |
2448 | +++ b/net/batman-adv/bat_iv_ogm.c |
2449 | @@ -72,7 +72,7 @@ static unsigned long bat_iv_ogm_emit_send_time(const struct bat_priv *bat_priv) |
2450 | { |
2451 | return jiffies + msecs_to_jiffies( |
2452 | atomic_read(&bat_priv->orig_interval) - |
2453 | - JITTER + (random32() % 2*JITTER)); |
2454 | + JITTER + (random32() % (2*JITTER))); |
2455 | } |
2456 | |
2457 | /* when do we schedule a ogm packet to be sent */ |
2458 | diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c |
2459 | index 0a30ec1..13b6c28 100644 |
2460 | --- a/net/bluetooth/hci_core.c |
2461 | +++ b/net/bluetooth/hci_core.c |
2462 | @@ -1866,6 +1866,8 @@ void hci_unregister_dev(struct hci_dev *hdev) |
2463 | for (i = 0; i < NUM_REASSEMBLY; i++) |
2464 | kfree_skb(hdev->reassembly[i]); |
2465 | |
2466 | + cancel_work_sync(&hdev->power_on); |
2467 | + |
2468 | if (!test_bit(HCI_INIT, &hdev->flags) && |
2469 | !test_bit(HCI_SETUP, &hdev->dev_flags)) { |
2470 | hci_dev_lock(hdev); |
2471 | diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c |
2472 | index 717c43a..8d1edd7 100644 |
2473 | --- a/net/bluetooth/rfcomm/sock.c |
2474 | +++ b/net/bluetooth/rfcomm/sock.c |
2475 | @@ -485,7 +485,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f |
2476 | long timeo; |
2477 | int err = 0; |
2478 | |
2479 | - lock_sock(sk); |
2480 | + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
2481 | |
2482 | if (sk->sk_type != SOCK_STREAM) { |
2483 | err = -EINVAL; |
2484 | @@ -522,7 +522,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f |
2485 | |
2486 | release_sock(sk); |
2487 | timeo = schedule_timeout(timeo); |
2488 | - lock_sock(sk); |
2489 | + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
2490 | } |
2491 | __set_current_state(TASK_RUNNING); |
2492 | remove_wait_queue(sk_sleep(sk), &wait); |
2493 | diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c |
2494 | index caf6e17..c6f6e42 100644 |
2495 | --- a/net/dccp/ipv4.c |
2496 | +++ b/net/dccp/ipv4.c |
2497 | @@ -435,8 +435,8 @@ exit: |
2498 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); |
2499 | return NULL; |
2500 | put_and_exit: |
2501 | - bh_unlock_sock(newsk); |
2502 | - sock_put(newsk); |
2503 | + inet_csk_prepare_forced_close(newsk); |
2504 | + dccp_done(newsk); |
2505 | goto exit; |
2506 | } |
2507 | |
2508 | diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c |
2509 | index 4dc588f..aaa8f8b 100644 |
2510 | --- a/net/dccp/ipv6.c |
2511 | +++ b/net/dccp/ipv6.c |
2512 | @@ -611,7 +611,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, |
2513 | newinet->inet_rcv_saddr = LOOPBACK4_IPV6; |
2514 | |
2515 | if (__inet_inherit_port(sk, newsk) < 0) { |
2516 | - sock_put(newsk); |
2517 | + inet_csk_prepare_forced_close(newsk); |
2518 | + dccp_done(newsk); |
2519 | goto out; |
2520 | } |
2521 | __inet6_hash(newsk, NULL); |
2522 | diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c |
2523 | index 19d66ce..3f40432 100644 |
2524 | --- a/net/ipv4/inet_connection_sock.c |
2525 | +++ b/net/ipv4/inet_connection_sock.c |
2526 | @@ -659,6 +659,22 @@ void inet_csk_destroy_sock(struct sock *sk) |
2527 | } |
2528 | EXPORT_SYMBOL(inet_csk_destroy_sock); |
2529 | |
2530 | +/* This function allows to force a closure of a socket after the call to |
2531 | + * tcp/dccp_create_openreq_child(). |
2532 | + */ |
2533 | +void inet_csk_prepare_forced_close(struct sock *sk) |
2534 | +{ |
2535 | + /* sk_clone_lock locked the socket and set refcnt to 2 */ |
2536 | + bh_unlock_sock(sk); |
2537 | + sock_put(sk); |
2538 | + |
2539 | + /* The below has to be done to allow calling inet_csk_destroy_sock */ |
2540 | + sock_set_flag(sk, SOCK_DEAD); |
2541 | + percpu_counter_inc(sk->sk_prot->orphan_count); |
2542 | + inet_sk(sk)->inet_num = 0; |
2543 | +} |
2544 | +EXPORT_SYMBOL(inet_csk_prepare_forced_close); |
2545 | + |
2546 | int inet_csk_listen_start(struct sock *sk, const int nr_table_entries) |
2547 | { |
2548 | struct inet_sock *inet = inet_sk(sk); |
2549 | diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c |
2550 | index dda5383..d7b862a 100644 |
2551 | --- a/net/ipv4/inet_diag.c |
2552 | +++ b/net/ipv4/inet_diag.c |
2553 | @@ -44,6 +44,10 @@ struct inet_diag_entry { |
2554 | u16 dport; |
2555 | u16 family; |
2556 | u16 userlocks; |
2557 | +#if IS_ENABLED(CONFIG_IPV6) |
2558 | + struct in6_addr saddr_storage; /* for IPv4-mapped-IPv6 addresses */ |
2559 | + struct in6_addr daddr_storage; /* for IPv4-mapped-IPv6 addresses */ |
2560 | +#endif |
2561 | }; |
2562 | |
2563 | #define INET_DIAG_PUT(skb, attrtype, attrlen) \ |
2564 | @@ -419,25 +423,31 @@ static int inet_diag_bc_run(const struct nlattr *_bc, |
2565 | break; |
2566 | } |
2567 | |
2568 | - if (cond->prefix_len == 0) |
2569 | - break; |
2570 | - |
2571 | if (op->code == INET_DIAG_BC_S_COND) |
2572 | addr = entry->saddr; |
2573 | else |
2574 | addr = entry->daddr; |
2575 | |
2576 | + if (cond->family != AF_UNSPEC && |
2577 | + cond->family != entry->family) { |
2578 | + if (entry->family == AF_INET6 && |
2579 | + cond->family == AF_INET) { |
2580 | + if (addr[0] == 0 && addr[1] == 0 && |
2581 | + addr[2] == htonl(0xffff) && |
2582 | + bitstring_match(addr + 3, |
2583 | + cond->addr, |
2584 | + cond->prefix_len)) |
2585 | + break; |
2586 | + } |
2587 | + yes = 0; |
2588 | + break; |
2589 | + } |
2590 | + |
2591 | + if (cond->prefix_len == 0) |
2592 | + break; |
2593 | if (bitstring_match(addr, cond->addr, |
2594 | cond->prefix_len)) |
2595 | break; |
2596 | - if (entry->family == AF_INET6 && |
2597 | - cond->family == AF_INET) { |
2598 | - if (addr[0] == 0 && addr[1] == 0 && |
2599 | - addr[2] == htonl(0xffff) && |
2600 | - bitstring_match(addr + 3, cond->addr, |
2601 | - cond->prefix_len)) |
2602 | - break; |
2603 | - } |
2604 | yes = 0; |
2605 | break; |
2606 | } |
2607 | @@ -500,6 +510,55 @@ static int valid_cc(const void *bc, int len, int cc) |
2608 | return 0; |
2609 | } |
2610 | |
2611 | +/* Validate an inet_diag_hostcond. */ |
2612 | +static bool valid_hostcond(const struct inet_diag_bc_op *op, int len, |
2613 | + int *min_len) |
2614 | +{ |
2615 | + int addr_len; |
2616 | + struct inet_diag_hostcond *cond; |
2617 | + |
2618 | + /* Check hostcond space. */ |
2619 | + *min_len += sizeof(struct inet_diag_hostcond); |
2620 | + if (len < *min_len) |
2621 | + return false; |
2622 | + cond = (struct inet_diag_hostcond *)(op + 1); |
2623 | + |
2624 | + /* Check address family and address length. */ |
2625 | + switch (cond->family) { |
2626 | + case AF_UNSPEC: |
2627 | + addr_len = 0; |
2628 | + break; |
2629 | + case AF_INET: |
2630 | + addr_len = sizeof(struct in_addr); |
2631 | + break; |
2632 | + case AF_INET6: |
2633 | + addr_len = sizeof(struct in6_addr); |
2634 | + break; |
2635 | + default: |
2636 | + return false; |
2637 | + } |
2638 | + *min_len += addr_len; |
2639 | + if (len < *min_len) |
2640 | + return false; |
2641 | + |
2642 | + /* Check prefix length (in bits) vs address length (in bytes). */ |
2643 | + if (cond->prefix_len > 8 * addr_len) |
2644 | + return false; |
2645 | + |
2646 | + return true; |
2647 | +} |
2648 | + |
2649 | +/* Validate a port comparison operator. */ |
2650 | +static inline bool valid_port_comparison(const struct inet_diag_bc_op *op, |
2651 | + int len, int *min_len) |
2652 | +{ |
2653 | + /* Port comparisons put the port in a follow-on inet_diag_bc_op. */ |
2654 | + *min_len += sizeof(struct inet_diag_bc_op); |
2655 | + if (len < *min_len) |
2656 | + return false; |
2657 | + return true; |
2658 | +} |
2659 | + |
2660 | static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
2661 | { |
2662 | const void *bc = bytecode; |
2663 | @@ -507,29 +566,39 @@ static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
2664 | |
2665 | while (len > 0) { |
2666 | const struct inet_diag_bc_op *op = bc; |
2667 | + int min_len = sizeof(struct inet_diag_bc_op); |
2668 | |
2669 | //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len); |
2670 | switch (op->code) { |
2671 | - case INET_DIAG_BC_AUTO: |
2672 | case INET_DIAG_BC_S_COND: |
2673 | case INET_DIAG_BC_D_COND: |
2674 | + if (!valid_hostcond(bc, len, &min_len)) |
2675 | + return -EINVAL; |
2676 | + break; |
2677 | case INET_DIAG_BC_S_GE: |
2678 | case INET_DIAG_BC_S_LE: |
2679 | case INET_DIAG_BC_D_GE: |
2680 | case INET_DIAG_BC_D_LE: |
2681 | - case INET_DIAG_BC_JMP: |
2682 | - if (op->no < 4 || op->no > len + 4 || op->no & 3) |
2683 | - return -EINVAL; |
2684 | - if (op->no < len && |
2685 | - !valid_cc(bytecode, bytecode_len, len - op->no)) |
2686 | + if (!valid_port_comparison(bc, len, &min_len)) |
2687 | return -EINVAL; |
2688 | break; |
2689 | + case INET_DIAG_BC_AUTO: |
2690 | + case INET_DIAG_BC_JMP: |
2691 | case INET_DIAG_BC_NOP: |
2692 | break; |
2693 | default: |
2694 | return -EINVAL; |
2695 | } |
2696 | - if (op->yes < 4 || op->yes > len + 4 || op->yes & 3) |
2697 | + |
2698 | + if (op->code != INET_DIAG_BC_NOP) { |
2699 | + if (op->no < min_len || op->no > len + 4 || op->no & 3) |
2700 | + return -EINVAL; |
2701 | + if (op->no < len && |
2702 | + !valid_cc(bytecode, bytecode_len, len - op->no)) |
2703 | + return -EINVAL; |
2704 | + } |
2705 | + |
2706 | + if (op->yes < min_len || op->yes > len + 4 || op->yes & 3) |
2707 | return -EINVAL; |
2708 | bc += op->yes; |
2709 | len -= op->yes; |
2710 | @@ -586,6 +655,36 @@ static int inet_twsk_diag_dump(struct inet_timewait_sock *tw, |
2711 | cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh); |
2712 | } |
2713 | |
2714 | +/* Get the IPv4, IPv6, or IPv4-mapped-IPv6 local and remote addresses |
2715 | + * from a request_sock. For IPv4-mapped-IPv6 we must map IPv4 to IPv6. |
2716 | + */ |
2717 | +static inline void inet_diag_req_addrs(const struct sock *sk, |
2718 | + const struct request_sock *req, |
2719 | + struct inet_diag_entry *entry) |
2720 | +{ |
2721 | + struct inet_request_sock *ireq = inet_rsk(req); |
2722 | + |
2723 | +#if IS_ENABLED(CONFIG_IPV6) |
2724 | + if (sk->sk_family == AF_INET6) { |
2725 | + if (req->rsk_ops->family == AF_INET6) { |
2726 | + entry->saddr = inet6_rsk(req)->loc_addr.s6_addr32; |
2727 | + entry->daddr = inet6_rsk(req)->rmt_addr.s6_addr32; |
2728 | + } else if (req->rsk_ops->family == AF_INET) { |
2729 | + ipv6_addr_set_v4mapped(ireq->loc_addr, |
2730 | + &entry->saddr_storage); |
2731 | + ipv6_addr_set_v4mapped(ireq->rmt_addr, |
2732 | + &entry->daddr_storage); |
2733 | + entry->saddr = entry->saddr_storage.s6_addr32; |
2734 | + entry->daddr = entry->daddr_storage.s6_addr32; |
2735 | + } |
2736 | + } else |
2737 | +#endif |
2738 | + { |
2739 | + entry->saddr = &ireq->loc_addr; |
2740 | + entry->daddr = &ireq->rmt_addr; |
2741 | + } |
2742 | +} |
2743 | + |
2744 | static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, |
2745 | struct request_sock *req, u32 pid, u32 seq, |
2746 | const struct nlmsghdr *unlh) |
2747 | @@ -624,8 +723,10 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, |
2748 | r->idiag_inode = 0; |
2749 | #if IS_ENABLED(CONFIG_IPV6) |
2750 | if (r->idiag_family == AF_INET6) { |
2751 | - *(struct in6_addr *)r->id.idiag_src = inet6_rsk(req)->loc_addr; |
2752 | - *(struct in6_addr *)r->id.idiag_dst = inet6_rsk(req)->rmt_addr; |
2753 | + struct inet_diag_entry entry; |
2754 | + inet_diag_req_addrs(sk, req, &entry); |
2755 | + memcpy(r->id.idiag_src, entry.saddr, sizeof(struct in6_addr)); |
2756 | + memcpy(r->id.idiag_dst, entry.daddr, sizeof(struct in6_addr)); |
2757 | } |
2758 | #endif |
2759 | nlh->nlmsg_len = skb_tail_pointer(skb) - b; |
2760 | @@ -683,18 +784,7 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk, |
2761 | continue; |
2762 | |
2763 | if (bc) { |
2764 | - entry.saddr = |
2765 | -#if IS_ENABLED(CONFIG_IPV6) |
2766 | - (entry.family == AF_INET6) ? |
2767 | - inet6_rsk(req)->loc_addr.s6_addr32 : |
2768 | -#endif |
2769 | - &ireq->loc_addr; |
2770 | - entry.daddr = |
2771 | -#if IS_ENABLED(CONFIG_IPV6) |
2772 | - (entry.family == AF_INET6) ? |
2773 | - inet6_rsk(req)->rmt_addr.s6_addr32 : |
2774 | -#endif |
2775 | - &ireq->rmt_addr; |
2776 | + inet_diag_req_addrs(sk, req, &entry); |
2777 | entry.dport = ntohs(ireq->rmt_port); |
2778 | |
2779 | if (!inet_diag_bc_run(bc, &entry)) |
2780 | diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c |
2781 | index 3727e23..b7bf6e3 100644 |
2782 | --- a/net/ipv4/ip_fragment.c |
2783 | +++ b/net/ipv4/ip_fragment.c |
2784 | @@ -685,28 +685,27 @@ EXPORT_SYMBOL(ip_defrag); |
2785 | |
2786 | struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user) |
2787 | { |
2788 | - const struct iphdr *iph; |
2789 | + struct iphdr iph; |
2790 | u32 len; |
2791 | |
2792 | if (skb->protocol != htons(ETH_P_IP)) |
2793 | return skb; |
2794 | |
2795 | - if (!pskb_may_pull(skb, sizeof(struct iphdr))) |
2796 | + if (!skb_copy_bits(skb, 0, &iph, sizeof(iph))) |
2797 | return skb; |
2798 | |
2799 | - iph = ip_hdr(skb); |
2800 | - if (iph->ihl < 5 || iph->version != 4) |
2801 | + if (iph.ihl < 5 || iph.version != 4) |
2802 | return skb; |
2803 | - if (!pskb_may_pull(skb, iph->ihl*4)) |
2804 | - return skb; |
2805 | - iph = ip_hdr(skb); |
2806 | - len = ntohs(iph->tot_len); |
2807 | - if (skb->len < len || len < (iph->ihl * 4)) |
2808 | + |
2809 | + len = ntohs(iph.tot_len); |
2810 | + if (skb->len < len || len < (iph.ihl * 4)) |
2811 | return skb; |
2812 | |
2813 | - if (ip_is_fragment(ip_hdr(skb))) { |
2814 | + if (ip_is_fragment(&iph)) { |
2815 | skb = skb_share_check(skb, GFP_ATOMIC); |
2816 | if (skb) { |
2817 | + if (!pskb_may_pull(skb, iph.ihl*4)) |
2818 | + return skb; |
2819 | if (pskb_trim_rcsum(skb, len)) |
2820 | return skb; |
2821 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
2822 | diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c |
2823 | index 8af0d44..2128975 100644 |
2824 | --- a/net/ipv4/proc.c |
2825 | +++ b/net/ipv4/proc.c |
2826 | @@ -232,7 +232,6 @@ static const struct snmp_mib snmp4_net_list[] = { |
2827 | SNMP_MIB_ITEM("TCPDSACKOfoSent", LINUX_MIB_TCPDSACKOFOSENT), |
2828 | SNMP_MIB_ITEM("TCPDSACKRecv", LINUX_MIB_TCPDSACKRECV), |
2829 | SNMP_MIB_ITEM("TCPDSACKOfoRecv", LINUX_MIB_TCPDSACKOFORECV), |
2830 | - SNMP_MIB_ITEM("TCPAbortOnSyn", LINUX_MIB_TCPABORTONSYN), |
2831 | SNMP_MIB_ITEM("TCPAbortOnData", LINUX_MIB_TCPABORTONDATA), |
2832 | SNMP_MIB_ITEM("TCPAbortOnClose", LINUX_MIB_TCPABORTONCLOSE), |
2833 | SNMP_MIB_ITEM("TCPAbortOnMemory", LINUX_MIB_TCPABORTONMEMORY), |
2834 | @@ -258,6 +257,8 @@ static const struct snmp_mib snmp4_net_list[] = { |
2835 | SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP), |
2836 | SNMP_MIB_ITEM("TCPRetransFail", LINUX_MIB_TCPRETRANSFAIL), |
2837 | SNMP_MIB_ITEM("TCPRcvCoalesce", LINUX_MIB_TCPRCVCOALESCE), |
2838 | + SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK), |
2839 | + SNMP_MIB_ITEM("TCPSYNChallenge", LINUX_MIB_TCPSYNCHALLENGE), |
2840 | SNMP_MIB_SENTINEL |
2841 | }; |
2842 | |
2843 | diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c |
2844 | index 7a7724d..bf7a604 100644 |
2845 | --- a/net/ipv4/sysctl_net_ipv4.c |
2846 | +++ b/net/ipv4/sysctl_net_ipv4.c |
2847 | @@ -590,6 +590,13 @@ static struct ctl_table ipv4_table[] = { |
2848 | .mode = 0644, |
2849 | .proc_handler = proc_dointvec |
2850 | }, |
2851 | + { |
2852 | + .procname = "tcp_challenge_ack_limit", |
2853 | + .data = &sysctl_tcp_challenge_ack_limit, |
2854 | + .maxlen = sizeof(int), |
2855 | + .mode = 0644, |
2856 | + .proc_handler = proc_dointvec |
2857 | + }, |
2858 | #ifdef CONFIG_NET_DMA |
2859 | { |
2860 | .procname = "tcp_dma_copybreak", |
2861 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
2862 | index 3acebbd..0e0b6d0 100644 |
2863 | --- a/net/ipv4/tcp_input.c |
2864 | +++ b/net/ipv4/tcp_input.c |
2865 | @@ -88,6 +88,9 @@ int sysctl_tcp_app_win __read_mostly = 31; |
2866 | int sysctl_tcp_adv_win_scale __read_mostly = 1; |
2867 | EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); |
2868 | |
2869 | +/* rfc5961 challenge ack rate limiting */ |
2870 | +int sysctl_tcp_challenge_ack_limit = 100; |
2871 | + |
2872 | int sysctl_tcp_stdurg __read_mostly; |
2873 | int sysctl_tcp_rfc1337 __read_mostly; |
2874 | int sysctl_tcp_max_orphans __read_mostly = NR_FILE; |
2875 | @@ -3684,6 +3687,24 @@ static int tcp_process_frto(struct sock *sk, int flag) |
2876 | return 0; |
2877 | } |
2878 | |
2879 | +/* RFC 5961 7 [ACK Throttling] */ |
2880 | +static void tcp_send_challenge_ack(struct sock *sk) |
2881 | +{ |
2882 | + /* unprotected vars, we dont care of overwrites */ |
2883 | + static u32 challenge_timestamp; |
2884 | + static unsigned int challenge_count; |
2885 | + u32 now = jiffies / HZ; |
2886 | + |
2887 | + if (now != challenge_timestamp) { |
2888 | + challenge_timestamp = now; |
2889 | + challenge_count = 0; |
2890 | + } |
2891 | + if (++challenge_count <= sysctl_tcp_challenge_ack_limit) { |
2892 | + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); |
2893 | + tcp_send_ack(sk); |
2894 | + } |
2895 | +} |
2896 | + |
2897 | /* This routine deals with incoming acks, but not outgoing ones. */ |
2898 | static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) |
2899 | { |
2900 | @@ -3703,8 +3724,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) |
2901 | /* If the ack is older than previous acks |
2902 | * then we can probably ignore it. |
2903 | */ |
2904 | - if (before(ack, prior_snd_una)) |
2905 | + if (before(ack, prior_snd_una)) { |
2906 | + /* RFC 5961 5.2 [Blind Data Injection Attack].[Mitigation] */ |
2907 | + if (before(ack, prior_snd_una - tp->max_window)) { |
2908 | + tcp_send_challenge_ack(sk); |
2909 | + return -1; |
2910 | + } |
2911 | goto old_ack; |
2912 | + } |
2913 | |
2914 | /* If the ack includes data we haven't sent yet, discard |
2915 | * this segment (RFC793 Section 3.9). |
2916 | @@ -5268,8 +5295,8 @@ out: |
2917 | /* Does PAWS and seqno based validation of an incoming segment, flags will |
2918 | * play significant role here. |
2919 | */ |
2920 | -static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, |
2921 | - const struct tcphdr *th, int syn_inerr) |
2922 | +static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, |
2923 | + const struct tcphdr *th, int syn_inerr) |
2924 | { |
2925 | const u8 *hash_location; |
2926 | struct tcp_sock *tp = tcp_sk(sk); |
2927 | @@ -5294,38 +5321,48 @@ static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, |
2928 | * an acknowledgment should be sent in reply (unless the RST |
2929 | * bit is set, if so drop the segment and return)". |
2930 | */ |
2931 | - if (!th->rst) |
2932 | + if (!th->rst) { |
2933 | + if (th->syn) |
2934 | + goto syn_challenge; |
2935 | tcp_send_dupack(sk, skb); |
2936 | + } |
2937 | goto discard; |
2938 | } |
2939 | |
2940 | /* Step 2: check RST bit */ |
2941 | if (th->rst) { |
2942 | - tcp_reset(sk); |
2943 | + /* RFC 5961 3.2 : |
2944 | + * If sequence number exactly matches RCV.NXT, then |
2945 | + * RESET the connection |
2946 | + * else |
2947 | + * Send a challenge ACK |
2948 | + */ |
2949 | + if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) |
2950 | + tcp_reset(sk); |
2951 | + else |
2952 | + tcp_send_challenge_ack(sk); |
2953 | goto discard; |
2954 | } |
2955 | |
2956 | - /* ts_recent update must be made after we are sure that the packet |
2957 | - * is in window. |
2958 | - */ |
2959 | - tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); |
2960 | - |
2961 | /* step 3: check security and precedence [ignored] */ |
2962 | |
2963 | - /* step 4: Check for a SYN in window. */ |
2964 | - if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { |
2965 | + /* step 4: Check for a SYN |
2966 | + * RFC 5691 4.2 : Send a challenge ack |
2967 | + */ |
2968 | + if (th->syn) { |
2969 | +syn_challenge: |
2970 | if (syn_inerr) |
2971 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS); |
2972 | - NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN); |
2973 | - tcp_reset(sk); |
2974 | - return -1; |
2975 | + NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNCHALLENGE); |
2976 | + tcp_send_challenge_ack(sk); |
2977 | + goto discard; |
2978 | } |
2979 | |
2980 | - return 1; |
2981 | + return true; |
2982 | |
2983 | discard: |
2984 | __kfree_skb(skb); |
2985 | - return 0; |
2986 | + return false; |
2987 | } |
2988 | |
2989 | /* |
2990 | @@ -5355,7 +5392,6 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, |
2991 | const struct tcphdr *th, unsigned int len) |
2992 | { |
2993 | struct tcp_sock *tp = tcp_sk(sk); |
2994 | - int res; |
2995 | |
2996 | /* |
2997 | * Header prediction. |
2998 | @@ -5535,14 +5571,18 @@ slow_path: |
2999 | * Standard slow path. |
3000 | */ |
3001 | |
3002 | - res = tcp_validate_incoming(sk, skb, th, 1); |
3003 | - if (res <= 0) |
3004 | - return -res; |
3005 | + if (!tcp_validate_incoming(sk, skb, th, 1)) |
3006 | + return 0; |
3007 | |
3008 | step5: |
3009 | if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0) |
3010 | goto discard; |
3011 | |
3012 | + /* ts_recent update must be made after we are sure that the packet |
3013 | + * is in window. |
3014 | + */ |
3015 | + tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); |
3016 | + |
3017 | tcp_rcv_rtt_measure_ts(sk, skb); |
3018 | |
3019 | /* Process urgent data. */ |
3020 | @@ -5847,7 +5887,6 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, |
3021 | struct tcp_sock *tp = tcp_sk(sk); |
3022 | struct inet_connection_sock *icsk = inet_csk(sk); |
3023 | int queued = 0; |
3024 | - int res; |
3025 | |
3026 | tp->rx_opt.saw_tstamp = 0; |
3027 | |
3028 | @@ -5902,9 +5941,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, |
3029 | return 0; |
3030 | } |
3031 | |
3032 | - res = tcp_validate_incoming(sk, skb, th, 0); |
3033 | - if (res <= 0) |
3034 | - return -res; |
3035 | + if (!tcp_validate_incoming(sk, skb, th, 0)) |
3036 | + return 0; |
3037 | |
3038 | /* step 5: check the ACK field */ |
3039 | if (th->ack) { |
3040 | @@ -6015,6 +6053,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, |
3041 | } else |
3042 | goto discard; |
3043 | |
3044 | + /* ts_recent update must be made after we are sure that the packet |
3045 | + * is in window. |
3046 | + */ |
3047 | + tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq); |
3048 | + |
3049 | /* step 6: check the URG bit */ |
3050 | tcp_urg(sk, skb, th); |
3051 | |
3052 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c |
3053 | index 8f2458d..76f50e1 100644 |
3054 | --- a/net/ipv4/tcp_ipv4.c |
3055 | +++ b/net/ipv4/tcp_ipv4.c |
3056 | @@ -1524,10 +1524,8 @@ exit: |
3057 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS); |
3058 | return NULL; |
3059 | put_and_exit: |
3060 | - tcp_clear_xmit_timers(newsk); |
3061 | - tcp_cleanup_congestion_control(newsk); |
3062 | - bh_unlock_sock(newsk); |
3063 | - sock_put(newsk); |
3064 | + inet_csk_prepare_forced_close(newsk); |
3065 | + tcp_done(newsk); |
3066 | goto exit; |
3067 | } |
3068 | EXPORT_SYMBOL(tcp_v4_syn_recv_sock); |
3069 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
3070 | index 8a8fa2d..3889e02 100644 |
3071 | --- a/net/ipv6/tcp_ipv6.c |
3072 | +++ b/net/ipv6/tcp_ipv6.c |
3073 | @@ -1411,7 +1411,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, |
3074 | #endif |
3075 | |
3076 | if (__inet_inherit_port(sk, newsk) < 0) { |
3077 | - sock_put(newsk); |
3078 | + inet_csk_prepare_forced_close(newsk); |
3079 | + tcp_done(newsk); |
3080 | goto out; |
3081 | } |
3082 | __inet6_hash(newsk, NULL); |
3083 | diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c |
3084 | index 29b942c..f08b9166 100644 |
3085 | --- a/net/sched/sch_htb.c |
3086 | +++ b/net/sched/sch_htb.c |
3087 | @@ -876,7 +876,7 @@ ok: |
3088 | q->now = psched_get_time(); |
3089 | start_at = jiffies; |
3090 | |
3091 | - next_event = q->now + 5 * PSCHED_TICKS_PER_SEC; |
3092 | + next_event = q->now + 5LLU * PSCHED_TICKS_PER_SEC; |
3093 | |
3094 | for (level = 0; level < TC_HTB_MAXDEPTH; level++) { |
3095 | /* common case optimization - skip event handler quickly */ |
3096 | diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c |
3097 | index 6c85564..0018b65 100644 |
3098 | --- a/net/sctp/chunk.c |
3099 | +++ b/net/sctp/chunk.c |
3100 | @@ -183,7 +183,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
3101 | |
3102 | msg = sctp_datamsg_new(GFP_KERNEL); |
3103 | if (!msg) |
3104 | - return NULL; |
3105 | + return ERR_PTR(-ENOMEM); |
3106 | |
3107 | /* Note: Calculate this outside of the loop, so that all fragments |
3108 | * have the same expiration. |
3109 | @@ -280,11 +280,14 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
3110 | |
3111 | chunk = sctp_make_datafrag_empty(asoc, sinfo, len, frag, 0); |
3112 | |
3113 | - if (!chunk) |
3114 | + if (!chunk) { |
3115 | + err = -ENOMEM; |
3116 | goto errout; |
3117 | + } |
3118 | + |
3119 | err = sctp_user_addto_chunk(chunk, offset, len, msgh->msg_iov); |
3120 | if (err < 0) |
3121 | - goto errout; |
3122 | + goto errout_chunk_free; |
3123 | |
3124 | offset += len; |
3125 | |
3126 | @@ -315,8 +318,10 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
3127 | |
3128 | chunk = sctp_make_datafrag_empty(asoc, sinfo, over, frag, 0); |
3129 | |
3130 | - if (!chunk) |
3131 | + if (!chunk) { |
3132 | + err = -ENOMEM; |
3133 | goto errout; |
3134 | + } |
3135 | |
3136 | err = sctp_user_addto_chunk(chunk, offset, over,msgh->msg_iov); |
3137 | |
3138 | @@ -324,7 +329,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
3139 | __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr |
3140 | - (__u8 *)chunk->skb->data); |
3141 | if (err < 0) |
3142 | - goto errout; |
3143 | + goto errout_chunk_free; |
3144 | |
3145 | sctp_datamsg_assign(msg, chunk); |
3146 | list_add_tail(&chunk->frag_list, &msg->chunks); |
3147 | @@ -332,6 +337,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, |
3148 | |
3149 | return msg; |
3150 | |
3151 | +errout_chunk_free: |
3152 | + sctp_chunk_free(chunk); |
3153 | + |
3154 | errout: |
3155 | list_for_each_safe(pos, temp, &msg->chunks) { |
3156 | list_del_init(pos); |
3157 | @@ -339,7 +347,7 @@ errout: |
3158 | sctp_chunk_free(chunk); |
3159 | } |
3160 | sctp_datamsg_put(msg); |
3161 | - return NULL; |
3162 | + return ERR_PTR(err); |
3163 | } |
3164 | |
3165 | /* Check whether this message has expired. */ |
3166 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
3167 | index dba20d6..7405355 100644 |
3168 | --- a/net/sctp/socket.c |
3169 | +++ b/net/sctp/socket.c |
3170 | @@ -1908,8 +1908,8 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, |
3171 | |
3172 | /* Break the message into multiple chunks of maximum size. */ |
3173 | datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len); |
3174 | - if (!datamsg) { |
3175 | - err = -ENOMEM; |
3176 | + if (IS_ERR(datamsg)) { |
3177 | + err = PTR_ERR(datamsg); |
3178 | goto out_free; |
3179 | } |
3180 | |
3181 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3182 | index 29774e2..7f2a109 100644 |
3183 | --- a/sound/pci/hda/patch_realtek.c |
3184 | +++ b/sound/pci/hda/patch_realtek.c |
3185 | @@ -6520,8 +6520,8 @@ static void alc861vd_fixup_dallas(struct hda_codec *codec, |
3186 | const struct alc_fixup *fix, int action) |
3187 | { |
3188 | if (action == ALC_FIXUP_ACT_PRE_PROBE) { |
3189 | - snd_hda_override_pin_caps(codec, 0x18, 0x00001714); |
3190 | - snd_hda_override_pin_caps(codec, 0x19, 0x0000171c); |
3191 | + snd_hda_override_pin_caps(codec, 0x18, 0x00000734); |
3192 | + snd_hda_override_pin_caps(codec, 0x19, 0x0000073c); |
3193 | } |
3194 | } |
3195 | |
3196 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
3197 | index 04cd44f..137b67f 100644 |
3198 | --- a/sound/pci/hda/patch_sigmatel.c |
3199 | +++ b/sound/pci/hda/patch_sigmatel.c |
3200 | @@ -1695,7 +1695,7 @@ static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { |
3201 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658, |
3202 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), |
3203 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659, |
3204 | - "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), |
3205 | + "HP Pavilion dv7", STAC_HP_DV7_4000), |
3206 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A, |
3207 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), |
3208 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B, |
3209 | diff --git a/sound/usb/midi.c b/sound/usb/midi.c |
3210 | index eeefbce..34b9bb7 100644 |
3211 | --- a/sound/usb/midi.c |
3212 | +++ b/sound/usb/midi.c |
3213 | @@ -116,6 +116,7 @@ struct snd_usb_midi { |
3214 | struct list_head list; |
3215 | struct timer_list error_timer; |
3216 | spinlock_t disc_lock; |
3217 | + struct rw_semaphore disc_rwsem; |
3218 | struct mutex mutex; |
3219 | u32 usb_id; |
3220 | int next_midi_device; |
3221 | @@ -125,8 +126,10 @@ struct snd_usb_midi { |
3222 | struct snd_usb_midi_in_endpoint *in; |
3223 | } endpoints[MIDI_MAX_ENDPOINTS]; |
3224 | unsigned long input_triggered; |
3225 | - unsigned int opened; |
3226 | + bool autopm_reference; |
3227 | + unsigned int opened[2]; |
3228 | unsigned char disconnected; |
3229 | + unsigned char input_running; |
3230 | |
3231 | struct snd_kcontrol *roland_load_ctl; |
3232 | }; |
3233 | @@ -148,7 +151,6 @@ struct snd_usb_midi_out_endpoint { |
3234 | struct snd_usb_midi_out_endpoint* ep; |
3235 | struct snd_rawmidi_substream *substream; |
3236 | int active; |
3237 | - bool autopm_reference; |
3238 | uint8_t cable; /* cable number << 4 */ |
3239 | uint8_t state; |
3240 | #define STATE_UNKNOWN 0 |
3241 | @@ -1033,29 +1035,58 @@ static void update_roland_altsetting(struct snd_usb_midi* umidi) |
3242 | snd_usbmidi_input_start(&umidi->list); |
3243 | } |
3244 | |
3245 | -static void substream_open(struct snd_rawmidi_substream *substream, int open) |
3246 | +static int substream_open(struct snd_rawmidi_substream *substream, int dir, |
3247 | + int open) |
3248 | { |
3249 | struct snd_usb_midi* umidi = substream->rmidi->private_data; |
3250 | struct snd_kcontrol *ctl; |
3251 | + int err; |
3252 | + |
3253 | + down_read(&umidi->disc_rwsem); |
3254 | + if (umidi->disconnected) { |
3255 | + up_read(&umidi->disc_rwsem); |
3256 | + return open ? -ENODEV : 0; |
3257 | + } |
3258 | |
3259 | mutex_lock(&umidi->mutex); |
3260 | if (open) { |
3261 | - if (umidi->opened++ == 0 && umidi->roland_load_ctl) { |
3262 | - ctl = umidi->roland_load_ctl; |
3263 | - ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; |
3264 | - snd_ctl_notify(umidi->card, |
3265 | + if (!umidi->opened[0] && !umidi->opened[1]) { |
3266 | + err = usb_autopm_get_interface(umidi->iface); |
3267 | + umidi->autopm_reference = err >= 0; |
3268 | + if (err < 0 && err != -EACCES) { |
3269 | + mutex_unlock(&umidi->mutex); |
3270 | + up_read(&umidi->disc_rwsem); |
3271 | + return -EIO; |
3272 | + } |
3273 | + if (umidi->roland_load_ctl) { |
3274 | + ctl = umidi->roland_load_ctl; |
3275 | + ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; |
3276 | + snd_ctl_notify(umidi->card, |
3277 | SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); |
3278 | - update_roland_altsetting(umidi); |
3279 | + update_roland_altsetting(umidi); |
3280 | + } |
3281 | } |
3282 | + umidi->opened[dir]++; |
3283 | + if (umidi->opened[1]) |
3284 | + snd_usbmidi_input_start(&umidi->list); |
3285 | } else { |
3286 | - if (--umidi->opened == 0 && umidi->roland_load_ctl) { |
3287 | - ctl = umidi->roland_load_ctl; |
3288 | - ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; |
3289 | - snd_ctl_notify(umidi->card, |
3290 | + umidi->opened[dir]--; |
3291 | + if (!umidi->opened[1]) |
3292 | + snd_usbmidi_input_stop(&umidi->list); |
3293 | + if (!umidi->opened[0] && !umidi->opened[1]) { |
3294 | + if (umidi->roland_load_ctl) { |
3295 | + ctl = umidi->roland_load_ctl; |
3296 | + ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; |
3297 | + snd_ctl_notify(umidi->card, |
3298 | SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); |
3299 | + } |
3300 | + if (umidi->autopm_reference) |
3301 | + usb_autopm_put_interface(umidi->iface); |
3302 | } |
3303 | } |
3304 | mutex_unlock(&umidi->mutex); |
3305 | + up_read(&umidi->disc_rwsem); |
3306 | + return 0; |
3307 | } |
3308 | |
3309 | static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream) |
3310 | @@ -1063,7 +1094,6 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream) |
3311 | struct snd_usb_midi* umidi = substream->rmidi->private_data; |
3312 | struct usbmidi_out_port* port = NULL; |
3313 | int i, j; |
3314 | - int err; |
3315 | |
3316 | for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) |
3317 | if (umidi->endpoints[i].out) |
3318 | @@ -1076,25 +1106,15 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream) |
3319 | snd_BUG(); |
3320 | return -ENXIO; |
3321 | } |
3322 | - err = usb_autopm_get_interface(umidi->iface); |
3323 | - port->autopm_reference = err >= 0; |
3324 | - if (err < 0 && err != -EACCES) |
3325 | - return -EIO; |
3326 | + |
3327 | substream->runtime->private_data = port; |
3328 | port->state = STATE_UNKNOWN; |
3329 | - substream_open(substream, 1); |
3330 | - return 0; |
3331 | + return substream_open(substream, 0, 1); |
3332 | } |
3333 | |
3334 | static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream) |
3335 | { |
3336 | - struct snd_usb_midi* umidi = substream->rmidi->private_data; |
3337 | - struct usbmidi_out_port *port = substream->runtime->private_data; |
3338 | - |
3339 | - substream_open(substream, 0); |
3340 | - if (port->autopm_reference) |
3341 | - usb_autopm_put_interface(umidi->iface); |
3342 | - return 0; |
3343 | + return substream_open(substream, 0, 0); |
3344 | } |
3345 | |
3346 | static void snd_usbmidi_output_trigger(struct snd_rawmidi_substream *substream, int up) |
3347 | @@ -1147,14 +1167,12 @@ static void snd_usbmidi_output_drain(struct snd_rawmidi_substream *substream) |
3348 | |
3349 | static int snd_usbmidi_input_open(struct snd_rawmidi_substream *substream) |
3350 | { |
3351 | - substream_open(substream, 1); |
3352 | - return 0; |
3353 | + return substream_open(substream, 1, 1); |
3354 | } |
3355 | |
3356 | static int snd_usbmidi_input_close(struct snd_rawmidi_substream *substream) |
3357 | { |
3358 | - substream_open(substream, 0); |
3359 | - return 0; |
3360 | + return substream_open(substream, 1, 0); |
3361 | } |
3362 | |
3363 | static void snd_usbmidi_input_trigger(struct snd_rawmidi_substream *substream, int up) |
3364 | @@ -1403,9 +1421,12 @@ void snd_usbmidi_disconnect(struct list_head* p) |
3365 | * a timer may submit an URB. To reliably break the cycle |
3366 | * a flag under lock must be used |
3367 | */ |
3368 | + down_write(&umidi->disc_rwsem); |
3369 | spin_lock_irq(&umidi->disc_lock); |
3370 | umidi->disconnected = 1; |
3371 | spin_unlock_irq(&umidi->disc_lock); |
3372 | + up_write(&umidi->disc_rwsem); |
3373 | + |
3374 | for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { |
3375 | struct snd_usb_midi_endpoint* ep = &umidi->endpoints[i]; |
3376 | if (ep->out) |
3377 | @@ -2060,12 +2081,15 @@ void snd_usbmidi_input_stop(struct list_head* p) |
3378 | unsigned int i, j; |
3379 | |
3380 | umidi = list_entry(p, struct snd_usb_midi, list); |
3381 | + if (!umidi->input_running) |
3382 | + return; |
3383 | for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) { |
3384 | struct snd_usb_midi_endpoint* ep = &umidi->endpoints[i]; |
3385 | if (ep->in) |
3386 | for (j = 0; j < INPUT_URBS; ++j) |
3387 | usb_kill_urb(ep->in->urbs[j]); |
3388 | } |
3389 | + umidi->input_running = 0; |
3390 | } |
3391 | |
3392 | static void snd_usbmidi_input_start_ep(struct snd_usb_midi_in_endpoint* ep) |
3393 | @@ -2090,8 +2114,11 @@ void snd_usbmidi_input_start(struct list_head* p) |
3394 | int i; |
3395 | |
3396 | umidi = list_entry(p, struct snd_usb_midi, list); |
3397 | + if (umidi->input_running || !umidi->opened[1]) |
3398 | + return; |
3399 | for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) |
3400 | snd_usbmidi_input_start_ep(umidi->endpoints[i].in); |
3401 | + umidi->input_running = 1; |
3402 | } |
3403 | |
3404 | /* |
3405 | @@ -2117,6 +2144,7 @@ int snd_usbmidi_create(struct snd_card *card, |
3406 | umidi->usb_protocol_ops = &snd_usbmidi_standard_ops; |
3407 | init_timer(&umidi->error_timer); |
3408 | spin_lock_init(&umidi->disc_lock); |
3409 | + init_rwsem(&umidi->disc_rwsem); |
3410 | mutex_init(&umidi->mutex); |
3411 | umidi->usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor), |
3412 | le16_to_cpu(umidi->dev->descriptor.idProduct)); |
3413 | @@ -2229,9 +2257,6 @@ int snd_usbmidi_create(struct snd_card *card, |
3414 | } |
3415 | |
3416 | list_add_tail(&umidi->list, midi_list); |
3417 | - |
3418 | - for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) |
3419 | - snd_usbmidi_input_start_ep(umidi->endpoints[i].in); |
3420 | return 0; |
3421 | } |
3422 |