Annotation of /trunk/kernel-alx/patches-3.4/0113-3.4.14-all-fixes.patch
Parent Directory | Revision Log
Revision 1946 -
(hide annotations)
(download)
Wed Nov 14 15:25:09 2012 UTC (11 years, 10 months ago) by niro
File size: 123551 byte(s)
Wed Nov 14 15:25:09 2012 UTC (11 years, 10 months ago) by niro
File size: 123551 byte(s)
3.4.18-alx-r1
1 | niro | 1946 | diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c |
2 | index 153d3fc..8e3d91b 100644 | ||
3 | --- a/arch/alpha/kernel/process.c | ||
4 | +++ b/arch/alpha/kernel/process.c | ||
5 | @@ -28,6 +28,7 @@ | ||
6 | #include <linux/tty.h> | ||
7 | #include <linux/console.h> | ||
8 | #include <linux/slab.h> | ||
9 | +#include <linux/rcupdate.h> | ||
10 | |||
11 | #include <asm/reg.h> | ||
12 | #include <asm/uaccess.h> | ||
13 | @@ -54,8 +55,11 @@ cpu_idle(void) | ||
14 | /* FIXME -- EV6 and LCA45 know how to power down | ||
15 | the CPU. */ | ||
16 | |||
17 | + rcu_idle_enter(); | ||
18 | while (!need_resched()) | ||
19 | cpu_relax(); | ||
20 | + | ||
21 | + rcu_idle_exit(); | ||
22 | schedule(); | ||
23 | } | ||
24 | } | ||
25 | diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c | ||
26 | index 891dad8..c722027 100644 | ||
27 | --- a/arch/cris/kernel/process.c | ||
28 | +++ b/arch/cris/kernel/process.c | ||
29 | @@ -25,6 +25,7 @@ | ||
30 | #include <linux/elfcore.h> | ||
31 | #include <linux/mqueue.h> | ||
32 | #include <linux/reboot.h> | ||
33 | +#include <linux/rcupdate.h> | ||
34 | |||
35 | //#define DEBUG | ||
36 | |||
37 | @@ -102,6 +103,7 @@ void cpu_idle (void) | ||
38 | { | ||
39 | /* endless idle loop with no priority at all */ | ||
40 | while (1) { | ||
41 | + rcu_idle_enter(); | ||
42 | while (!need_resched()) { | ||
43 | void (*idle)(void); | ||
44 | /* | ||
45 | @@ -114,6 +116,7 @@ void cpu_idle (void) | ||
46 | idle = default_idle; | ||
47 | idle(); | ||
48 | } | ||
49 | + rcu_idle_exit(); | ||
50 | schedule_preempt_disabled(); | ||
51 | } | ||
52 | } | ||
53 | diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c | ||
54 | index d4de48b..3941cbc 100644 | ||
55 | --- a/arch/frv/kernel/process.c | ||
56 | +++ b/arch/frv/kernel/process.c | ||
57 | @@ -25,6 +25,7 @@ | ||
58 | #include <linux/reboot.h> | ||
59 | #include <linux/interrupt.h> | ||
60 | #include <linux/pagemap.h> | ||
61 | +#include <linux/rcupdate.h> | ||
62 | |||
63 | #include <asm/asm-offsets.h> | ||
64 | #include <asm/uaccess.h> | ||
65 | @@ -84,12 +85,14 @@ void cpu_idle(void) | ||
66 | { | ||
67 | /* endless idle loop with no priority at all */ | ||
68 | while (1) { | ||
69 | + rcu_idle_enter(); | ||
70 | while (!need_resched()) { | ||
71 | check_pgt_cache(); | ||
72 | |||
73 | if (!frv_dma_inprogress && idle) | ||
74 | idle(); | ||
75 | } | ||
76 | + rcu_idle_exit(); | ||
77 | |||
78 | schedule_preempt_disabled(); | ||
79 | } | ||
80 | diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c | ||
81 | index 0e9c315..f153ed1 100644 | ||
82 | --- a/arch/h8300/kernel/process.c | ||
83 | +++ b/arch/h8300/kernel/process.c | ||
84 | @@ -36,6 +36,7 @@ | ||
85 | #include <linux/reboot.h> | ||
86 | #include <linux/fs.h> | ||
87 | #include <linux/slab.h> | ||
88 | +#include <linux/rcupdate.h> | ||
89 | |||
90 | #include <asm/uaccess.h> | ||
91 | #include <asm/traps.h> | ||
92 | @@ -78,8 +79,10 @@ void (*idle)(void) = default_idle; | ||
93 | void cpu_idle(void) | ||
94 | { | ||
95 | while (1) { | ||
96 | + rcu_idle_enter(); | ||
97 | while (!need_resched()) | ||
98 | idle(); | ||
99 | + rcu_idle_exit(); | ||
100 | schedule_preempt_disabled(); | ||
101 | } | ||
102 | } | ||
103 | diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c | ||
104 | index ce74e14..86d74ab 100644 | ||
105 | --- a/arch/ia64/kernel/process.c | ||
106 | +++ b/arch/ia64/kernel/process.c | ||
107 | @@ -29,6 +29,7 @@ | ||
108 | #include <linux/kdebug.h> | ||
109 | #include <linux/utsname.h> | ||
110 | #include <linux/tracehook.h> | ||
111 | +#include <linux/rcupdate.h> | ||
112 | |||
113 | #include <asm/cpu.h> | ||
114 | #include <asm/delay.h> | ||
115 | @@ -301,6 +302,7 @@ cpu_idle (void) | ||
116 | |||
117 | /* endless idle loop with no priority at all */ | ||
118 | while (1) { | ||
119 | + rcu_idle_enter(); | ||
120 | if (can_do_pal_halt) { | ||
121 | current_thread_info()->status &= ~TS_POLLING; | ||
122 | /* | ||
123 | @@ -331,6 +333,7 @@ cpu_idle (void) | ||
124 | normal_xtp(); | ||
125 | #endif | ||
126 | } | ||
127 | + rcu_idle_exit(); | ||
128 | schedule_preempt_disabled(); | ||
129 | check_pgt_cache(); | ||
130 | if (cpu_is_offline(cpu)) | ||
131 | diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c | ||
132 | index 3a4a32b..384e63f 100644 | ||
133 | --- a/arch/m32r/kernel/process.c | ||
134 | +++ b/arch/m32r/kernel/process.c | ||
135 | @@ -26,6 +26,7 @@ | ||
136 | #include <linux/ptrace.h> | ||
137 | #include <linux/unistd.h> | ||
138 | #include <linux/hardirq.h> | ||
139 | +#include <linux/rcupdate.h> | ||
140 | |||
141 | #include <asm/io.h> | ||
142 | #include <asm/uaccess.h> | ||
143 | @@ -82,6 +83,7 @@ void cpu_idle (void) | ||
144 | { | ||
145 | /* endless idle loop with no priority at all */ | ||
146 | while (1) { | ||
147 | + rcu_idle_enter(); | ||
148 | while (!need_resched()) { | ||
149 | void (*idle)(void) = pm_idle; | ||
150 | |||
151 | @@ -90,6 +92,7 @@ void cpu_idle (void) | ||
152 | |||
153 | idle(); | ||
154 | } | ||
155 | + rcu_idle_exit(); | ||
156 | schedule_preempt_disabled(); | ||
157 | } | ||
158 | } | ||
159 | diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c | ||
160 | index c488e3c..ac2892e 100644 | ||
161 | --- a/arch/m68k/kernel/process.c | ||
162 | +++ b/arch/m68k/kernel/process.c | ||
163 | @@ -25,6 +25,7 @@ | ||
164 | #include <linux/reboot.h> | ||
165 | #include <linux/init_task.h> | ||
166 | #include <linux/mqueue.h> | ||
167 | +#include <linux/rcupdate.h> | ||
168 | |||
169 | #include <asm/uaccess.h> | ||
170 | #include <asm/traps.h> | ||
171 | @@ -75,8 +76,10 @@ void cpu_idle(void) | ||
172 | { | ||
173 | /* endless idle loop with no priority at all */ | ||
174 | while (1) { | ||
175 | + rcu_idle_enter(); | ||
176 | while (!need_resched()) | ||
177 | idle(); | ||
178 | + rcu_idle_exit(); | ||
179 | schedule_preempt_disabled(); | ||
180 | } | ||
181 | } | ||
182 | diff --git a/arch/mips/Makefile b/arch/mips/Makefile | ||
183 | index 4fedf5a..5c1e75d 100644 | ||
184 | --- a/arch/mips/Makefile | ||
185 | +++ b/arch/mips/Makefile | ||
186 | @@ -225,7 +225,7 @@ KBUILD_CPPFLAGS += -D"DATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)" | ||
187 | LDFLAGS += -m $(ld-emul) | ||
188 | |||
189 | ifdef CONFIG_MIPS | ||
190 | -CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -xc /dev/null | \ | ||
191 | +CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ | ||
192 | egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ | ||
193 | sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/") | ||
194 | ifdef CONFIG_64BIT | ||
195 | diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile | ||
196 | index 0c6877e..d3d6fa9 100644 | ||
197 | --- a/arch/mips/kernel/Makefile | ||
198 | +++ b/arch/mips/kernel/Makefile | ||
199 | @@ -104,7 +104,7 @@ obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o | ||
200 | |||
201 | obj-$(CONFIG_OF) += prom.o | ||
202 | |||
203 | -CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) | ||
204 | +CFLAGS_cpu-bugs64.o = $(shell if $(CC) $(KBUILD_CFLAGS) -Wa,-mdaddi -c -o /dev/null -x c /dev/null >/dev/null 2>&1; then echo "-DHAVE_AS_SET_DADDI"; fi) | ||
205 | |||
206 | obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT) += 8250-platform.o | ||
207 | |||
208 | diff --git a/arch/mn10300/Makefile b/arch/mn10300/Makefile | ||
209 | index 7120282..3eb4a52 100644 | ||
210 | --- a/arch/mn10300/Makefile | ||
211 | +++ b/arch/mn10300/Makefile | ||
212 | @@ -26,7 +26,7 @@ CHECKFLAGS += | ||
213 | PROCESSOR := unset | ||
214 | UNIT := unset | ||
215 | |||
216 | -KBUILD_CFLAGS += -mam33 -mmem-funcs -DCPU=AM33 | ||
217 | +KBUILD_CFLAGS += -mam33 -DCPU=AM33 $(call cc-option,-mmem-funcs,) | ||
218 | KBUILD_AFLAGS += -mam33 -DCPU=AM33 | ||
219 | |||
220 | ifeq ($(CONFIG_MN10300_CURRENT_IN_E2),y) | ||
221 | diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c | ||
222 | index 14707f2..675d8f2 100644 | ||
223 | --- a/arch/mn10300/kernel/process.c | ||
224 | +++ b/arch/mn10300/kernel/process.c | ||
225 | @@ -25,6 +25,7 @@ | ||
226 | #include <linux/err.h> | ||
227 | #include <linux/fs.h> | ||
228 | #include <linux/slab.h> | ||
229 | +#include <linux/rcupdate.h> | ||
230 | #include <asm/uaccess.h> | ||
231 | #include <asm/pgtable.h> | ||
232 | #include <asm/io.h> | ||
233 | @@ -107,6 +108,7 @@ void cpu_idle(void) | ||
234 | { | ||
235 | /* endless idle loop with no priority at all */ | ||
236 | for (;;) { | ||
237 | + rcu_idle_enter(); | ||
238 | while (!need_resched()) { | ||
239 | void (*idle)(void); | ||
240 | |||
241 | @@ -121,6 +123,7 @@ void cpu_idle(void) | ||
242 | } | ||
243 | idle(); | ||
244 | } | ||
245 | + rcu_idle_exit(); | ||
246 | |||
247 | schedule_preempt_disabled(); | ||
248 | } | ||
249 | diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c | ||
250 | index d4b94b3..c54a4db 100644 | ||
251 | --- a/arch/parisc/kernel/process.c | ||
252 | +++ b/arch/parisc/kernel/process.c | ||
253 | @@ -48,6 +48,7 @@ | ||
254 | #include <linux/unistd.h> | ||
255 | #include <linux/kallsyms.h> | ||
256 | #include <linux/uaccess.h> | ||
257 | +#include <linux/rcupdate.h> | ||
258 | |||
259 | #include <asm/io.h> | ||
260 | #include <asm/asm-offsets.h> | ||
261 | @@ -69,8 +70,10 @@ void cpu_idle(void) | ||
262 | |||
263 | /* endless idle loop with no priority at all */ | ||
264 | while (1) { | ||
265 | + rcu_idle_enter(); | ||
266 | while (!need_resched()) | ||
267 | barrier(); | ||
268 | + rcu_idle_exit(); | ||
269 | schedule_preempt_disabled(); | ||
270 | check_pgt_cache(); | ||
271 | } | ||
272 | diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h | ||
273 | index ac39e6a..2974edd 100644 | ||
274 | --- a/arch/powerpc/include/asm/pci-bridge.h | ||
275 | +++ b/arch/powerpc/include/asm/pci-bridge.h | ||
276 | @@ -181,6 +181,14 @@ static inline int pci_device_from_OF_node(struct device_node *np, | ||
277 | #if defined(CONFIG_EEH) | ||
278 | static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn) | ||
279 | { | ||
280 | + /* | ||
281 | + * For those OF nodes whose parent isn't PCI bridge, they | ||
282 | + * don't have PCI_DN actually. So we have to skip them for | ||
283 | + * any EEH operations. | ||
284 | + */ | ||
285 | + if (!dn || !PCI_DN(dn)) | ||
286 | + return NULL; | ||
287 | + | ||
288 | return PCI_DN(dn)->edev; | ||
289 | } | ||
290 | #endif | ||
291 | diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c | ||
292 | index a75e37d..41d4b16 100644 | ||
293 | --- a/arch/powerpc/platforms/pseries/eeh.c | ||
294 | +++ b/arch/powerpc/platforms/pseries/eeh.c | ||
295 | @@ -1029,7 +1029,7 @@ static void eeh_add_device_early(struct device_node *dn) | ||
296 | { | ||
297 | struct pci_controller *phb; | ||
298 | |||
299 | - if (!dn || !of_node_to_eeh_dev(dn)) | ||
300 | + if (!of_node_to_eeh_dev(dn)) | ||
301 | return; | ||
302 | phb = of_node_to_eeh_dev(dn)->phb; | ||
303 | |||
304 | diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c | ||
305 | index 2707023..637970c 100644 | ||
306 | --- a/arch/score/kernel/process.c | ||
307 | +++ b/arch/score/kernel/process.c | ||
308 | @@ -27,6 +27,7 @@ | ||
309 | #include <linux/reboot.h> | ||
310 | #include <linux/elfcore.h> | ||
311 | #include <linux/pm.h> | ||
312 | +#include <linux/rcupdate.h> | ||
313 | |||
314 | void (*pm_power_off)(void); | ||
315 | EXPORT_SYMBOL(pm_power_off); | ||
316 | @@ -50,9 +51,10 @@ void __noreturn cpu_idle(void) | ||
317 | { | ||
318 | /* endless idle loop with no priority at all */ | ||
319 | while (1) { | ||
320 | + rcu_idle_enter(); | ||
321 | while (!need_resched()) | ||
322 | barrier(); | ||
323 | - | ||
324 | + rcu_idle_exit(); | ||
325 | schedule_preempt_disabled(); | ||
326 | } | ||
327 | } | ||
328 | diff --git a/arch/x86/Makefile b/arch/x86/Makefile | ||
329 | index b1c611e..f1276aa 100644 | ||
330 | --- a/arch/x86/Makefile | ||
331 | +++ b/arch/x86/Makefile | ||
332 | @@ -85,7 +85,7 @@ endif | ||
333 | ifdef CONFIG_X86_X32 | ||
334 | x32_ld_ok := $(call try-run,\ | ||
335 | /bin/echo -e '1: .quad 1b' | \ | ||
336 | - $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" - && \ | ||
337 | + $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \ | ||
338 | $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \ | ||
339 | $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n) | ||
340 | ifeq ($(x32_ld_ok),y) | ||
341 | diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile | ||
342 | index e398bb5..8a84501 100644 | ||
343 | --- a/arch/x86/boot/compressed/Makefile | ||
344 | +++ b/arch/x86/boot/compressed/Makefile | ||
345 | @@ -28,6 +28,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \ | ||
346 | $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \ | ||
347 | $(obj)/piggy.o | ||
348 | |||
349 | +$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone | ||
350 | +$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone | ||
351 | + | ||
352 | ifeq ($(CONFIG_EFI_STUB), y) | ||
353 | VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o | ||
354 | endif | ||
355 | diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h | ||
356 | index 49afb3f..c3520d7 100644 | ||
357 | --- a/arch/x86/include/asm/pgtable.h | ||
358 | +++ b/arch/x86/include/asm/pgtable.h | ||
359 | @@ -146,8 +146,7 @@ static inline unsigned long pmd_pfn(pmd_t pmd) | ||
360 | |||
361 | static inline int pmd_large(pmd_t pte) | ||
362 | { | ||
363 | - return (pmd_flags(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | ||
364 | - (_PAGE_PSE | _PAGE_PRESENT); | ||
365 | + return pmd_flags(pte) & _PAGE_PSE; | ||
366 | } | ||
367 | |||
368 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
369 | @@ -415,7 +414,13 @@ static inline int pte_hidden(pte_t pte) | ||
370 | |||
371 | static inline int pmd_present(pmd_t pmd) | ||
372 | { | ||
373 | - return pmd_flags(pmd) & _PAGE_PRESENT; | ||
374 | + /* | ||
375 | + * Checking for _PAGE_PSE is needed too because | ||
376 | + * split_huge_page will temporarily clear the present bit (but | ||
377 | + * the _PAGE_PSE flag will remain set at all times while the | ||
378 | + * _PAGE_PRESENT bit is clear). | ||
379 | + */ | ||
380 | + return pmd_flags(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PSE); | ||
381 | } | ||
382 | |||
383 | static inline int pmd_none(pmd_t pmd) | ||
384 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c | ||
385 | index 92660eda..f55a4ce 100644 | ||
386 | --- a/arch/x86/platform/efi/efi.c | ||
387 | +++ b/arch/x86/platform/efi/efi.c | ||
388 | @@ -890,6 +890,7 @@ void __init efi_enter_virtual_mode(void) | ||
389 | * | ||
390 | * Call EFI services through wrapper functions. | ||
391 | */ | ||
392 | + efi.runtime_version = efi_systab.fw_revision; | ||
393 | efi.get_time = virt_efi_get_time; | ||
394 | efi.set_time = virt_efi_set_time; | ||
395 | efi.get_wakeup_time = virt_efi_get_wakeup_time; | ||
396 | diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c | ||
397 | index 6a2d6ed..7a41d9e 100644 | ||
398 | --- a/arch/xtensa/kernel/process.c | ||
399 | +++ b/arch/xtensa/kernel/process.c | ||
400 | @@ -31,6 +31,7 @@ | ||
401 | #include <linux/mqueue.h> | ||
402 | #include <linux/fs.h> | ||
403 | #include <linux/slab.h> | ||
404 | +#include <linux/rcupdate.h> | ||
405 | |||
406 | #include <asm/pgtable.h> | ||
407 | #include <asm/uaccess.h> | ||
408 | @@ -110,8 +111,10 @@ void cpu_idle(void) | ||
409 | |||
410 | /* endless idle loop with no priority at all */ | ||
411 | while (1) { | ||
412 | + rcu_idle_enter(); | ||
413 | while (!need_resched()) | ||
414 | platform_idle(); | ||
415 | + rcu_idle_exit(); | ||
416 | schedule_preempt_disabled(); | ||
417 | } | ||
418 | } | ||
419 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c | ||
420 | index 3188da3..cf02e97 100644 | ||
421 | --- a/drivers/acpi/bus.c | ||
422 | +++ b/drivers/acpi/bus.c | ||
423 | @@ -954,8 +954,6 @@ static int __init acpi_bus_init(void) | ||
424 | status = acpi_ec_ecdt_probe(); | ||
425 | /* Ignore result. Not having an ECDT is not fatal. */ | ||
426 | |||
427 | - acpi_bus_osc_support(); | ||
428 | - | ||
429 | status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION); | ||
430 | if (ACPI_FAILURE(status)) { | ||
431 | printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n"); | ||
432 | @@ -963,6 +961,12 @@ static int __init acpi_bus_init(void) | ||
433 | } | ||
434 | |||
435 | /* | ||
436 | + * _OSC method may exist in module level code, | ||
437 | + * so it must be run after ACPI_FULL_INITIALIZATION | ||
438 | + */ | ||
439 | + acpi_bus_osc_support(); | ||
440 | + | ||
441 | + /* | ||
442 | * _PDC control method may load dynamic SSDT tables, | ||
443 | * and we need to install the table handler before that. | ||
444 | */ | ||
445 | diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c | ||
446 | index f7eff25..ebc272f 100644 | ||
447 | --- a/drivers/base/power/main.c | ||
448 | +++ b/drivers/base/power/main.c | ||
449 | @@ -984,7 +984,7 @@ int dpm_suspend_end(pm_message_t state) | ||
450 | |||
451 | error = dpm_suspend_noirq(state); | ||
452 | if (error) { | ||
453 | - dpm_resume_early(state); | ||
454 | + dpm_resume_early(resume_event(state)); | ||
455 | return error; | ||
456 | } | ||
457 | |||
458 | diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c | ||
459 | index de0435e..887f68f 100644 | ||
460 | --- a/drivers/block/aoe/aoecmd.c | ||
461 | +++ b/drivers/block/aoe/aoecmd.c | ||
462 | @@ -35,6 +35,7 @@ new_skb(ulong len) | ||
463 | skb_reset_mac_header(skb); | ||
464 | skb_reset_network_header(skb); | ||
465 | skb->protocol = __constant_htons(ETH_P_AOE); | ||
466 | + skb_checksum_none_assert(skb); | ||
467 | } | ||
468 | return skb; | ||
469 | } | ||
470 | diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c | ||
471 | index 2397f6f..6c87d67 100644 | ||
472 | --- a/drivers/dma/dmaengine.c | ||
473 | +++ b/drivers/dma/dmaengine.c | ||
474 | @@ -578,7 +578,7 @@ void dmaengine_get(void) | ||
475 | list_del_rcu(&device->global_node); | ||
476 | break; | ||
477 | } else if (err) | ||
478 | - pr_err("%s: failed to get %s: (%d)\n", | ||
479 | + pr_debug("%s: failed to get %s: (%d)\n", | ||
480 | __func__, dma_chan_name(chan), err); | ||
481 | } | ||
482 | } | ||
483 | diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c | ||
484 | index 7e479a4..4fd363f 100644 | ||
485 | --- a/drivers/gpu/drm/drm_crtc.c | ||
486 | +++ b/drivers/gpu/drm/drm_crtc.c | ||
487 | @@ -1028,15 +1028,15 @@ void drm_mode_config_cleanup(struct drm_device *dev) | ||
488 | fb->funcs->destroy(fb); | ||
489 | } | ||
490 | |||
491 | - list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { | ||
492 | - crtc->funcs->destroy(crtc); | ||
493 | - } | ||
494 | - | ||
495 | list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list, | ||
496 | head) { | ||
497 | plane->funcs->destroy(plane); | ||
498 | } | ||
499 | |||
500 | + list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { | ||
501 | + crtc->funcs->destroy(crtc); | ||
502 | + } | ||
503 | + | ||
504 | idr_remove_all(&dev->mode_config.crtc_idr); | ||
505 | idr_destroy(&dev->mode_config.crtc_idr); | ||
506 | } | ||
507 | diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
508 | index 65060b7..645dcbf 100644 | ||
509 | --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
510 | +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
511 | @@ -147,6 +147,16 @@ static bool radeon_msi_ok(struct radeon_device *rdev) | ||
512 | (rdev->pdev->subsystem_device == 0x01fd)) | ||
513 | return true; | ||
514 | |||
515 | + /* Gateway RS690 only seems to work with MSIs. */ | ||
516 | + if ((rdev->pdev->device == 0x791f) && | ||
517 | + (rdev->pdev->subsystem_vendor == 0x107b) && | ||
518 | + (rdev->pdev->subsystem_device == 0x0185)) | ||
519 | + return true; | ||
520 | + | ||
521 | + /* try and enable MSIs by default on all RS690s */ | ||
522 | + if (rdev->family == CHIP_RS690) | ||
523 | + return true; | ||
524 | + | ||
525 | /* RV515 seems to have MSI issues where it loses | ||
526 | * MSI rearms occasionally. This leads to lockups and freezes. | ||
527 | * disable it by default. | ||
528 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c | ||
529 | index caa55d6..b8459bd 100644 | ||
530 | --- a/drivers/gpu/drm/radeon/radeon_pm.c | ||
531 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c | ||
532 | @@ -567,7 +567,9 @@ void radeon_pm_suspend(struct radeon_device *rdev) | ||
533 | void radeon_pm_resume(struct radeon_device *rdev) | ||
534 | { | ||
535 | /* set up the default clocks if the MC ucode is loaded */ | ||
536 | - if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | ||
537 | + if ((rdev->family >= CHIP_BARTS) && | ||
538 | + (rdev->family <= CHIP_CAYMAN) && | ||
539 | + rdev->mc_fw) { | ||
540 | if (rdev->pm.default_vddc) | ||
541 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | ||
542 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
543 | @@ -622,7 +624,9 @@ int radeon_pm_init(struct radeon_device *rdev) | ||
544 | radeon_pm_print_states(rdev); | ||
545 | radeon_pm_init_profile(rdev); | ||
546 | /* set up the default clocks if the MC ucode is loaded */ | ||
547 | - if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) { | ||
548 | + if ((rdev->family >= CHIP_BARTS) && | ||
549 | + (rdev->family <= CHIP_CAYMAN) && | ||
550 | + rdev->mc_fw) { | ||
551 | if (rdev->pm.default_vddc) | ||
552 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | ||
553 | SET_VOLTAGE_TYPE_ASIC_VDDC); | ||
554 | diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c | ||
555 | index cb1ee4e..2a25888 100644 | ||
556 | --- a/drivers/gpu/drm/savage/savage_bci.c | ||
557 | +++ b/drivers/gpu/drm/savage/savage_bci.c | ||
558 | @@ -547,6 +547,8 @@ int savage_driver_load(struct drm_device *dev, unsigned long chipset) | ||
559 | |||
560 | dev_priv->chipset = (enum savage_family)chipset; | ||
561 | |||
562 | + pci_set_master(dev->pdev); | ||
563 | + | ||
564 | return 0; | ||
565 | } | ||
566 | |||
567 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
568 | index 5fda348..0d251d3 100644 | ||
569 | --- a/drivers/iommu/intel-iommu.c | ||
570 | +++ b/drivers/iommu/intel-iommu.c | ||
571 | @@ -588,7 +588,9 @@ static void domain_update_iommu_coherency(struct dmar_domain *domain) | ||
572 | { | ||
573 | int i; | ||
574 | |||
575 | - domain->iommu_coherency = 1; | ||
576 | + i = find_first_bit(domain->iommu_bmp, g_num_of_iommus); | ||
577 | + | ||
578 | + domain->iommu_coherency = i < g_num_of_iommus ? 1 : 0; | ||
579 | |||
580 | for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus) { | ||
581 | if (!ecap_coherent(g_iommus[i]->ecap)) { | ||
582 | diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c | ||
583 | index 0e49c99..c06992e 100644 | ||
584 | --- a/drivers/media/rc/ite-cir.c | ||
585 | +++ b/drivers/media/rc/ite-cir.c | ||
586 | @@ -1473,6 +1473,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | ||
587 | rdev = rc_allocate_device(); | ||
588 | if (!rdev) | ||
589 | goto failure; | ||
590 | + itdev->rdev = rdev; | ||
591 | |||
592 | ret = -ENODEV; | ||
593 | |||
594 | @@ -1604,7 +1605,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id | ||
595 | if (ret) | ||
596 | goto failure; | ||
597 | |||
598 | - itdev->rdev = rdev; | ||
599 | ite_pr(KERN_NOTICE, "driver has been successfully loaded\n"); | ||
600 | |||
601 | return 0; | ||
602 | diff --git a/drivers/media/video/gspca/pac7302.c b/drivers/media/video/gspca/pac7302.c | ||
603 | index 30662fc..63f571b 100644 | ||
604 | --- a/drivers/media/video/gspca/pac7302.c | ||
605 | +++ b/drivers/media/video/gspca/pac7302.c | ||
606 | @@ -945,6 +945,7 @@ static const struct usb_device_id device_table[] = { | ||
607 | {USB_DEVICE(0x093a, 0x262a)}, | ||
608 | {USB_DEVICE(0x093a, 0x262c)}, | ||
609 | {USB_DEVICE(0x145f, 0x013c)}, | ||
610 | + {USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */ | ||
611 | {} | ||
612 | }; | ||
613 | MODULE_DEVICE_TABLE(usb, device_table); | ||
614 | diff --git a/drivers/mfd/max8925-core.c b/drivers/mfd/max8925-core.c | ||
615 | index ca881ef..746a59c 100644 | ||
616 | --- a/drivers/mfd/max8925-core.c | ||
617 | +++ b/drivers/mfd/max8925-core.c | ||
618 | @@ -18,12 +18,19 @@ | ||
619 | #include <linux/mfd/core.h> | ||
620 | #include <linux/mfd/max8925.h> | ||
621 | |||
622 | +static struct resource io_parent = { | ||
623 | + .start = 0, | ||
624 | + .end = 0xffffffff, | ||
625 | + .flags = IORESOURCE_IO, | ||
626 | +}; | ||
627 | + | ||
628 | static struct resource backlight_resources[] = { | ||
629 | { | ||
630 | .name = "max8925-backlight", | ||
631 | .start = MAX8925_WLED_MODE_CNTL, | ||
632 | .end = MAX8925_WLED_CNTL, | ||
633 | .flags = IORESOURCE_IO, | ||
634 | + .parent = &io_parent, | ||
635 | }, | ||
636 | }; | ||
637 | |||
638 | @@ -42,6 +49,7 @@ static struct resource touch_resources[] = { | ||
639 | .start = MAX8925_TSC_IRQ, | ||
640 | .end = MAX8925_ADC_RES_END, | ||
641 | .flags = IORESOURCE_IO, | ||
642 | + .parent = &io_parent, | ||
643 | }, | ||
644 | }; | ||
645 | |||
646 | @@ -60,6 +68,7 @@ static struct resource power_supply_resources[] = { | ||
647 | .start = MAX8925_CHG_IRQ1, | ||
648 | .end = MAX8925_CHG_IRQ1_MASK, | ||
649 | .flags = IORESOURCE_IO, | ||
650 | + .parent = &io_parent, | ||
651 | }, | ||
652 | }; | ||
653 | |||
654 | @@ -118,6 +127,7 @@ static struct mfd_cell onkey_devs[] = { | ||
655 | .start = MAX8925_##_start, \ | ||
656 | .end = MAX8925_##_end, \ | ||
657 | .flags = IORESOURCE_IO, \ | ||
658 | + .parent = &io_parent, \ | ||
659 | } | ||
660 | |||
661 | static struct resource regulator_resources[] = { | ||
662 | diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c | ||
663 | index 71a0c4e..1025377 100644 | ||
664 | --- a/drivers/mmc/host/omap_hsmmc.c | ||
665 | +++ b/drivers/mmc/host/omap_hsmmc.c | ||
666 | @@ -2097,8 +2097,7 @@ static int omap_hsmmc_suspend(struct device *dev) | ||
667 | if (ret) { | ||
668 | host->suspended = 0; | ||
669 | if (host->pdata->resume) { | ||
670 | - ret = host->pdata->resume(dev, host->slot_id); | ||
671 | - if (ret) | ||
672 | + if (host->pdata->resume(dev, host->slot_id)) | ||
673 | dev_dbg(dev, "Unmask interrupt failed\n"); | ||
674 | } | ||
675 | goto err; | ||
676 | diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c | ||
677 | index 724b35e..3b8236b 100644 | ||
678 | --- a/drivers/mmc/host/sh_mmcif.c | ||
679 | +++ b/drivers/mmc/host/sh_mmcif.c | ||
680 | @@ -1191,6 +1191,10 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id) | ||
681 | host->sd_error = true; | ||
682 | dev_dbg(&host->pd->dev, "int err state = %08x\n", state); | ||
683 | } | ||
684 | + if (host->state == STATE_IDLE) { | ||
685 | + dev_info(&host->pd->dev, "Spurious IRQ status 0x%x", state); | ||
686 | + return IRQ_HANDLED; | ||
687 | + } | ||
688 | if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) { | ||
689 | if (!host->dma_active) | ||
690 | return IRQ_WAKE_THREAD; | ||
691 | diff --git a/drivers/mtd/maps/autcpu12-nvram.c b/drivers/mtd/maps/autcpu12-nvram.c | ||
692 | index e5bfd0e..0598d52 100644 | ||
693 | --- a/drivers/mtd/maps/autcpu12-nvram.c | ||
694 | +++ b/drivers/mtd/maps/autcpu12-nvram.c | ||
695 | @@ -43,7 +43,8 @@ struct map_info autcpu12_sram_map = { | ||
696 | |||
697 | static int __init init_autcpu12_sram (void) | ||
698 | { | ||
699 | - int err, save0, save1; | ||
700 | + map_word tmp, save0, save1; | ||
701 | + int err; | ||
702 | |||
703 | autcpu12_sram_map.virt = ioremap(0x12000000, SZ_128K); | ||
704 | if (!autcpu12_sram_map.virt) { | ||
705 | @@ -51,7 +52,7 @@ static int __init init_autcpu12_sram (void) | ||
706 | err = -EIO; | ||
707 | goto out; | ||
708 | } | ||
709 | - simple_map_init(&autcpu_sram_map); | ||
710 | + simple_map_init(&autcpu12_sram_map); | ||
711 | |||
712 | /* | ||
713 | * Check for 32K/128K | ||
714 | @@ -61,20 +62,22 @@ static int __init init_autcpu12_sram (void) | ||
715 | * Read and check result on ofs 0x0 | ||
716 | * Restore contents | ||
717 | */ | ||
718 | - save0 = map_read32(&autcpu12_sram_map,0); | ||
719 | - save1 = map_read32(&autcpu12_sram_map,0x10000); | ||
720 | - map_write32(&autcpu12_sram_map,~save0,0x10000); | ||
721 | + save0 = map_read(&autcpu12_sram_map, 0); | ||
722 | + save1 = map_read(&autcpu12_sram_map, 0x10000); | ||
723 | + tmp.x[0] = ~save0.x[0]; | ||
724 | + map_write(&autcpu12_sram_map, tmp, 0x10000); | ||
725 | /* if we find this pattern on 0x0, we have 32K size | ||
726 | * restore contents and exit | ||
727 | */ | ||
728 | - if ( map_read32(&autcpu12_sram_map,0) != save0) { | ||
729 | - map_write32(&autcpu12_sram_map,save0,0x0); | ||
730 | + tmp = map_read(&autcpu12_sram_map, 0); | ||
731 | + if (!map_word_equal(&autcpu12_sram_map, tmp, save0)) { | ||
732 | + map_write(&autcpu12_sram_map, save0, 0x0); | ||
733 | goto map; | ||
734 | } | ||
735 | /* We have a 128K found, restore 0x10000 and set size | ||
736 | * to 128K | ||
737 | */ | ||
738 | - map_write32(&autcpu12_sram_map,save1,0x10000); | ||
739 | + map_write(&autcpu12_sram_map, save1, 0x10000); | ||
740 | autcpu12_sram_map.size = SZ_128K; | ||
741 | |||
742 | map: | ||
743 | diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c | ||
744 | index 9651c06..bf24aa7 100644 | ||
745 | --- a/drivers/mtd/mtdpart.c | ||
746 | +++ b/drivers/mtd/mtdpart.c | ||
747 | @@ -709,6 +709,8 @@ static const char *default_mtd_part_types[] = { | ||
748 | * partition parsers, specified in @types. However, if @types is %NULL, then | ||
749 | * the default list of parsers is used. The default list contains only the | ||
750 | * "cmdlinepart" and "ofpart" parsers ATM. | ||
751 | + * Note: If there are more then one parser in @types, the kernel only takes the | ||
752 | + * partitions parsed out by the first parser. | ||
753 | * | ||
754 | * This function may return: | ||
755 | * o a negative error code in case of failure | ||
756 | @@ -733,11 +735,12 @@ int parse_mtd_partitions(struct mtd_info *master, const char **types, | ||
757 | if (!parser) | ||
758 | continue; | ||
759 | ret = (*parser->parse_fn)(master, pparts, data); | ||
760 | + put_partition_parser(parser); | ||
761 | if (ret > 0) { | ||
762 | printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n", | ||
763 | ret, parser->name, master->name); | ||
764 | + break; | ||
765 | } | ||
766 | - put_partition_parser(parser); | ||
767 | } | ||
768 | return ret; | ||
769 | } | ||
770 | diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c | ||
771 | index 30d1319..c126469 100644 | ||
772 | --- a/drivers/mtd/nand/nand_bbt.c | ||
773 | +++ b/drivers/mtd/nand/nand_bbt.c | ||
774 | @@ -390,7 +390,7 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, | ||
775 | /* Read the mirror version, if available */ | ||
776 | if (md && (md->options & NAND_BBT_VERSION)) { | ||
777 | scan_read_raw(mtd, buf, (loff_t)md->pages[0] << this->page_shift, | ||
778 | - mtd->writesize, td); | ||
779 | + mtd->writesize, md); | ||
780 | md->version[0] = buf[bbt_get_ver_offs(mtd, md)]; | ||
781 | pr_info("Bad block table at page %d, version 0x%02X\n", | ||
782 | md->pages[0], md->version[0]); | ||
783 | diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c | ||
784 | index c606b6a..b9cbd65 100644 | ||
785 | --- a/drivers/mtd/nand/nandsim.c | ||
786 | +++ b/drivers/mtd/nand/nandsim.c | ||
787 | @@ -2355,6 +2355,7 @@ static int __init ns_init_module(void) | ||
788 | uint64_t new_size = (uint64_t)nsmtd->erasesize << overridesize; | ||
789 | if (new_size >> overridesize != nsmtd->erasesize) { | ||
790 | NS_ERR("overridesize is too big\n"); | ||
791 | + retval = -EINVAL; | ||
792 | goto err_exit; | ||
793 | } | ||
794 | /* N.B. This relies on nand_scan not doing anything with the size before we change it */ | ||
795 | diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c | ||
796 | index c2b0bba..62d039a 100644 | ||
797 | --- a/drivers/mtd/nand/omap2.c | ||
798 | +++ b/drivers/mtd/nand/omap2.c | ||
799 | @@ -1133,7 +1133,8 @@ static int omap_nand_remove(struct platform_device *pdev) | ||
800 | /* Release NAND device, its internal structures and partitions */ | ||
801 | nand_release(&info->mtd); | ||
802 | iounmap(info->nand.IO_ADDR_R); | ||
803 | - kfree(&info->mtd); | ||
804 | + release_mem_region(info->phys_base, NAND_IO_SIZE); | ||
805 | + kfree(info); | ||
806 | return 0; | ||
807 | } | ||
808 | |||
809 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
810 | index 41bb34f..acd8246 100644 | ||
811 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
812 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | ||
813 | @@ -571,14 +571,16 @@ drop: | ||
814 | static void bnx2x_csum_validate(struct sk_buff *skb, union eth_rx_cqe *cqe, | ||
815 | struct bnx2x_fastpath *fp) | ||
816 | { | ||
817 | - /* Do nothing if no IP/L4 csum validation was done */ | ||
818 | - | ||
819 | + /* Do nothing if no L4 csum validation was done. | ||
820 | + * We do not check whether IP csum was validated. For IPv4 we assume | ||
821 | + * that if the card got as far as validating the L4 csum, it also | ||
822 | + * validated the IP csum. IPv6 has no IP csum. | ||
823 | + */ | ||
824 | if (cqe->fast_path_cqe.status_flags & | ||
825 | - (ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG | | ||
826 | - ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG)) | ||
827 | + ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG) | ||
828 | return; | ||
829 | |||
830 | - /* If both IP/L4 validation were done, check if an error was found. */ | ||
831 | + /* If L4 validation was done, check if an error was found. */ | ||
832 | |||
833 | if (cqe->fast_path_cqe.type_error_flags & | ||
834 | (ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG | | ||
835 | diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c | ||
836 | index 65a718f..22b399a 100644 | ||
837 | --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c | ||
838 | +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c | ||
839 | @@ -1370,6 +1370,10 @@ static void netxen_mask_aer_correctable(struct netxen_adapter *adapter) | ||
840 | struct pci_dev *root = pdev->bus->self; | ||
841 | u32 aer_pos; | ||
842 | |||
843 | + /* root bus? */ | ||
844 | + if (!root) | ||
845 | + return; | ||
846 | + | ||
847 | if (adapter->ahw.board_type != NETXEN_BRDTYPE_P3_4_GB_MM && | ||
848 | adapter->ahw.board_type != NETXEN_BRDTYPE_P3_10G_TP) | ||
849 | return; | ||
850 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c | ||
851 | index 5fb74c4..482dcd3 100644 | ||
852 | --- a/drivers/net/ethernet/realtek/r8169.c | ||
853 | +++ b/drivers/net/ethernet/realtek/r8169.c | ||
854 | @@ -319,6 +319,8 @@ enum rtl_registers { | ||
855 | Config0 = 0x51, | ||
856 | Config1 = 0x52, | ||
857 | Config2 = 0x53, | ||
858 | +#define PME_SIGNAL (1 << 5) /* 8168c and later */ | ||
859 | + | ||
860 | Config3 = 0x54, | ||
861 | Config4 = 0x55, | ||
862 | Config5 = 0x56, | ||
863 | @@ -1400,7 +1402,6 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts) | ||
864 | u16 reg; | ||
865 | u8 mask; | ||
866 | } cfg[] = { | ||
867 | - { WAKE_ANY, Config1, PMEnable }, | ||
868 | { WAKE_PHY, Config3, LinkUp }, | ||
869 | { WAKE_MAGIC, Config3, MagicPacket }, | ||
870 | { WAKE_UCAST, Config5, UWF }, | ||
871 | @@ -1408,16 +1409,32 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts) | ||
872 | { WAKE_MCAST, Config5, MWF }, | ||
873 | { WAKE_ANY, Config5, LanWake } | ||
874 | }; | ||
875 | + u8 options; | ||
876 | |||
877 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
878 | |||
879 | for (i = 0; i < ARRAY_SIZE(cfg); i++) { | ||
880 | - u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask; | ||
881 | + options = RTL_R8(cfg[i].reg) & ~cfg[i].mask; | ||
882 | if (wolopts & cfg[i].opt) | ||
883 | options |= cfg[i].mask; | ||
884 | RTL_W8(cfg[i].reg, options); | ||
885 | } | ||
886 | |||
887 | + switch (tp->mac_version) { | ||
888 | + case RTL_GIGA_MAC_VER_01 ... RTL_GIGA_MAC_VER_17: | ||
889 | + options = RTL_R8(Config1) & ~PMEnable; | ||
890 | + if (wolopts) | ||
891 | + options |= PMEnable; | ||
892 | + RTL_W8(Config1, options); | ||
893 | + break; | ||
894 | + default: | ||
895 | + options = RTL_R8(Config2) & ~PME_SIGNAL; | ||
896 | + if (wolopts) | ||
897 | + options |= PME_SIGNAL; | ||
898 | + RTL_W8(Config2, options); | ||
899 | + break; | ||
900 | + } | ||
901 | + | ||
902 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
903 | } | ||
904 | |||
905 | diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c | ||
906 | index 3455876..06f2b49 100644 | ||
907 | --- a/drivers/net/ethernet/ti/davinci_cpdma.c | ||
908 | +++ b/drivers/net/ethernet/ti/davinci_cpdma.c | ||
909 | @@ -851,6 +851,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan) | ||
910 | |||
911 | next_dma = desc_read(desc, hw_next); | ||
912 | chan->head = desc_from_phys(pool, next_dma); | ||
913 | + chan->count--; | ||
914 | chan->stats.teardown_dequeue++; | ||
915 | |||
916 | /* issue callback without locks held */ | ||
917 | diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c | ||
918 | index 2fa1a9b..2e0d876 100644 | ||
919 | --- a/drivers/net/ppp/pppoe.c | ||
920 | +++ b/drivers/net/ppp/pppoe.c | ||
921 | @@ -576,7 +576,7 @@ static int pppoe_release(struct socket *sock) | ||
922 | |||
923 | po = pppox_sk(sk); | ||
924 | |||
925 | - if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND)) { | ||
926 | + if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) { | ||
927 | dev_put(po->pppoe_dev); | ||
928 | po->pppoe_dev = NULL; | ||
929 | } | ||
930 | diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c | ||
931 | index 91d2588..1470d3e 100644 | ||
932 | --- a/drivers/net/rionet.c | ||
933 | +++ b/drivers/net/rionet.c | ||
934 | @@ -79,6 +79,7 @@ static int rionet_capable = 1; | ||
935 | * on system trade-offs. | ||
936 | */ | ||
937 | static struct rio_dev **rionet_active; | ||
938 | +static int nact; /* total number of active rionet peers */ | ||
939 | |||
940 | #define is_rionet_capable(src_ops, dst_ops) \ | ||
941 | ((src_ops & RIO_SRC_OPS_DATA_MSG) && \ | ||
942 | @@ -175,6 +176,7 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
943 | struct ethhdr *eth = (struct ethhdr *)skb->data; | ||
944 | u16 destid; | ||
945 | unsigned long flags; | ||
946 | + int add_num = 1; | ||
947 | |||
948 | local_irq_save(flags); | ||
949 | if (!spin_trylock(&rnet->tx_lock)) { | ||
950 | @@ -182,7 +184,10 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
951 | return NETDEV_TX_LOCKED; | ||
952 | } | ||
953 | |||
954 | - if ((rnet->tx_cnt + 1) > RIONET_TX_RING_SIZE) { | ||
955 | + if (is_multicast_ether_addr(eth->h_dest)) | ||
956 | + add_num = nact; | ||
957 | + | ||
958 | + if ((rnet->tx_cnt + add_num) > RIONET_TX_RING_SIZE) { | ||
959 | netif_stop_queue(ndev); | ||
960 | spin_unlock_irqrestore(&rnet->tx_lock, flags); | ||
961 | printk(KERN_ERR "%s: BUG! Tx Ring full when queue awake!\n", | ||
962 | @@ -191,11 +196,16 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
963 | } | ||
964 | |||
965 | if (is_multicast_ether_addr(eth->h_dest)) { | ||
966 | + int count = 0; | ||
967 | for (i = 0; i < RIO_MAX_ROUTE_ENTRIES(rnet->mport->sys_size); | ||
968 | i++) | ||
969 | - if (rionet_active[i]) | ||
970 | + if (rionet_active[i]) { | ||
971 | rionet_queue_tx_msg(skb, ndev, | ||
972 | rionet_active[i]); | ||
973 | + if (count) | ||
974 | + atomic_inc(&skb->users); | ||
975 | + count++; | ||
976 | + } | ||
977 | } else if (RIONET_MAC_MATCH(eth->h_dest)) { | ||
978 | destid = RIONET_GET_DESTID(eth->h_dest); | ||
979 | if (rionet_active[destid]) | ||
980 | @@ -220,14 +230,17 @@ static void rionet_dbell_event(struct rio_mport *mport, void *dev_id, u16 sid, u | ||
981 | if (info == RIONET_DOORBELL_JOIN) { | ||
982 | if (!rionet_active[sid]) { | ||
983 | list_for_each_entry(peer, &rionet_peers, node) { | ||
984 | - if (peer->rdev->destid == sid) | ||
985 | + if (peer->rdev->destid == sid) { | ||
986 | rionet_active[sid] = peer->rdev; | ||
987 | + nact++; | ||
988 | + } | ||
989 | } | ||
990 | rio_mport_send_doorbell(mport, sid, | ||
991 | RIONET_DOORBELL_JOIN); | ||
992 | } | ||
993 | } else if (info == RIONET_DOORBELL_LEAVE) { | ||
994 | rionet_active[sid] = NULL; | ||
995 | + nact--; | ||
996 | } else { | ||
997 | if (netif_msg_intr(rnet)) | ||
998 | printk(KERN_WARNING "%s: unhandled doorbell\n", | ||
999 | @@ -523,6 +536,7 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | ||
1000 | |||
1001 | rc = rionet_setup_netdev(rdev->net->hport, ndev); | ||
1002 | rionet_check = 1; | ||
1003 | + nact = 0; | ||
1004 | } | ||
1005 | |||
1006 | /* | ||
1007 | diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c | ||
1008 | index cc9776c..8789bc5 100644 | ||
1009 | --- a/drivers/net/usb/sierra_net.c | ||
1010 | +++ b/drivers/net/usb/sierra_net.c | ||
1011 | @@ -678,7 +678,7 @@ static int sierra_net_get_fw_attr(struct usbnet *dev, u16 *datap) | ||
1012 | return -EIO; | ||
1013 | } | ||
1014 | |||
1015 | - *datap = *attrdata; | ||
1016 | + *datap = le16_to_cpu(*attrdata); | ||
1017 | |||
1018 | kfree(attrdata); | ||
1019 | return result; | ||
1020 | diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c | ||
1021 | index aaaca9a..3f575af 100644 | ||
1022 | --- a/drivers/net/wan/ixp4xx_hss.c | ||
1023 | +++ b/drivers/net/wan/ixp4xx_hss.c | ||
1024 | @@ -10,6 +10,7 @@ | ||
1025 | |||
1026 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
1027 | |||
1028 | +#include <linux/module.h> | ||
1029 | #include <linux/bitops.h> | ||
1030 | #include <linux/cdev.h> | ||
1031 | #include <linux/dma-mapping.h> | ||
1032 | diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c | ||
1033 | index 806c44f..09bf377 100644 | ||
1034 | --- a/drivers/pci/hotplug/acpiphp_glue.c | ||
1035 | +++ b/drivers/pci/hotplug/acpiphp_glue.c | ||
1036 | @@ -132,6 +132,15 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | ||
1037 | if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle)) | ||
1038 | return AE_OK; | ||
1039 | |||
1040 | + status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); | ||
1041 | + if (ACPI_FAILURE(status)) { | ||
1042 | + warn("can't evaluate _ADR (%#x)\n", status); | ||
1043 | + return AE_OK; | ||
1044 | + } | ||
1045 | + | ||
1046 | + device = (adr >> 16) & 0xffff; | ||
1047 | + function = adr & 0xffff; | ||
1048 | + | ||
1049 | pdev = pbus->self; | ||
1050 | if (pdev && pci_is_pcie(pdev)) { | ||
1051 | tmp = acpi_find_root_bridge_handle(pdev); | ||
1052 | @@ -144,10 +153,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) | ||
1053 | } | ||
1054 | } | ||
1055 | |||
1056 | - acpi_evaluate_integer(handle, "_ADR", NULL, &adr); | ||
1057 | - device = (adr >> 16) & 0xffff; | ||
1058 | - function = adr & 0xffff; | ||
1059 | - | ||
1060 | newfunc = kzalloc(sizeof(struct acpiphp_func), GFP_KERNEL); | ||
1061 | if (!newfunc) | ||
1062 | return AE_NO_MEMORY; | ||
1063 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c | ||
1064 | index 5e1ca3c..63e0199 100644 | ||
1065 | --- a/drivers/pci/probe.c | ||
1066 | +++ b/drivers/pci/probe.c | ||
1067 | @@ -749,8 +749,10 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, | ||
1068 | |||
1069 | /* Check if setup is sensible at all */ | ||
1070 | if (!pass && | ||
1071 | - (primary != bus->number || secondary <= bus->number)) { | ||
1072 | - dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n"); | ||
1073 | + (primary != bus->number || secondary <= bus->number || | ||
1074 | + secondary > subordinate)) { | ||
1075 | + dev_info(&dev->dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n", | ||
1076 | + secondary, subordinate); | ||
1077 | broken = 1; | ||
1078 | } | ||
1079 | |||
1080 | diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c | ||
1081 | index 0860181..4f1b10b 100644 | ||
1082 | --- a/drivers/s390/scsi/zfcp_aux.c | ||
1083 | +++ b/drivers/s390/scsi/zfcp_aux.c | ||
1084 | @@ -519,6 +519,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | ||
1085 | |||
1086 | rwlock_init(&port->unit_list_lock); | ||
1087 | INIT_LIST_HEAD(&port->unit_list); | ||
1088 | + atomic_set(&port->units, 0); | ||
1089 | |||
1090 | INIT_WORK(&port->gid_pn_work, zfcp_fc_port_did_lookup); | ||
1091 | INIT_WORK(&port->test_link_work, zfcp_fc_link_test_work); | ||
1092 | diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c | ||
1093 | index 96f13ad8..79a6afe 100644 | ||
1094 | --- a/drivers/s390/scsi/zfcp_ccw.c | ||
1095 | +++ b/drivers/s390/scsi/zfcp_ccw.c | ||
1096 | @@ -39,17 +39,23 @@ void zfcp_ccw_adapter_put(struct zfcp_adapter *adapter) | ||
1097 | spin_unlock_irqrestore(&zfcp_ccw_adapter_ref_lock, flags); | ||
1098 | } | ||
1099 | |||
1100 | -static int zfcp_ccw_activate(struct ccw_device *cdev) | ||
1101 | - | ||
1102 | +/** | ||
1103 | + * zfcp_ccw_activate - activate adapter and wait for it to finish | ||
1104 | + * @cdev: pointer to belonging ccw device | ||
1105 | + * @clear: Status flags to clear. | ||
1106 | + * @tag: s390dbf trace record tag | ||
1107 | + */ | ||
1108 | +static int zfcp_ccw_activate(struct ccw_device *cdev, int clear, char *tag) | ||
1109 | { | ||
1110 | struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); | ||
1111 | |||
1112 | if (!adapter) | ||
1113 | return 0; | ||
1114 | |||
1115 | + zfcp_erp_clear_adapter_status(adapter, clear); | ||
1116 | zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING); | ||
1117 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, | ||
1118 | - "ccresu2"); | ||
1119 | + tag); | ||
1120 | zfcp_erp_wait(adapter); | ||
1121 | flush_work(&adapter->scan_work); | ||
1122 | |||
1123 | @@ -164,26 +170,29 @@ static int zfcp_ccw_set_online(struct ccw_device *cdev) | ||
1124 | BUG_ON(!zfcp_reqlist_isempty(adapter->req_list)); | ||
1125 | adapter->req_no = 0; | ||
1126 | |||
1127 | - zfcp_ccw_activate(cdev); | ||
1128 | + zfcp_ccw_activate(cdev, 0, "ccsonl1"); | ||
1129 | zfcp_ccw_adapter_put(adapter); | ||
1130 | return 0; | ||
1131 | } | ||
1132 | |||
1133 | /** | ||
1134 | - * zfcp_ccw_set_offline - set_offline function of zfcp driver | ||
1135 | + * zfcp_ccw_offline_sync - shut down adapter and wait for it to finish | ||
1136 | * @cdev: pointer to belonging ccw device | ||
1137 | + * @set: Status flags to set. | ||
1138 | + * @tag: s390dbf trace record tag | ||
1139 | * | ||
1140 | * This function gets called by the common i/o layer and sets an adapter | ||
1141 | * into state offline. | ||
1142 | */ | ||
1143 | -static int zfcp_ccw_set_offline(struct ccw_device *cdev) | ||
1144 | +static int zfcp_ccw_offline_sync(struct ccw_device *cdev, int set, char *tag) | ||
1145 | { | ||
1146 | struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); | ||
1147 | |||
1148 | if (!adapter) | ||
1149 | return 0; | ||
1150 | |||
1151 | - zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1"); | ||
1152 | + zfcp_erp_set_adapter_status(adapter, set); | ||
1153 | + zfcp_erp_adapter_shutdown(adapter, 0, tag); | ||
1154 | zfcp_erp_wait(adapter); | ||
1155 | |||
1156 | zfcp_ccw_adapter_put(adapter); | ||
1157 | @@ -191,6 +200,18 @@ static int zfcp_ccw_set_offline(struct ccw_device *cdev) | ||
1158 | } | ||
1159 | |||
1160 | /** | ||
1161 | + * zfcp_ccw_set_offline - set_offline function of zfcp driver | ||
1162 | + * @cdev: pointer to belonging ccw device | ||
1163 | + * | ||
1164 | + * This function gets called by the common i/o layer and sets an adapter | ||
1165 | + * into state offline. | ||
1166 | + */ | ||
1167 | +static int zfcp_ccw_set_offline(struct ccw_device *cdev) | ||
1168 | +{ | ||
1169 | + return zfcp_ccw_offline_sync(cdev, 0, "ccsoff1"); | ||
1170 | +} | ||
1171 | + | ||
1172 | +/** | ||
1173 | * zfcp_ccw_notify - ccw notify function | ||
1174 | * @cdev: pointer to belonging ccw device | ||
1175 | * @event: indicates if adapter was detached or attached | ||
1176 | @@ -207,6 +228,11 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event) | ||
1177 | |||
1178 | switch (event) { | ||
1179 | case CIO_GONE: | ||
1180 | + if (atomic_read(&adapter->status) & | ||
1181 | + ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */ | ||
1182 | + zfcp_dbf_hba_basic("ccnigo1", adapter); | ||
1183 | + break; | ||
1184 | + } | ||
1185 | dev_warn(&cdev->dev, "The FCP device has been detached\n"); | ||
1186 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1"); | ||
1187 | break; | ||
1188 | @@ -216,6 +242,11 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event) | ||
1189 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2"); | ||
1190 | break; | ||
1191 | case CIO_OPER: | ||
1192 | + if (atomic_read(&adapter->status) & | ||
1193 | + ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */ | ||
1194 | + zfcp_dbf_hba_basic("ccniop1", adapter); | ||
1195 | + break; | ||
1196 | + } | ||
1197 | dev_info(&cdev->dev, "The FCP device is operational again\n"); | ||
1198 | zfcp_erp_set_adapter_status(adapter, | ||
1199 | ZFCP_STATUS_COMMON_RUNNING); | ||
1200 | @@ -251,6 +282,28 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev) | ||
1201 | zfcp_ccw_adapter_put(adapter); | ||
1202 | } | ||
1203 | |||
1204 | +static int zfcp_ccw_suspend(struct ccw_device *cdev) | ||
1205 | +{ | ||
1206 | + zfcp_ccw_offline_sync(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccsusp1"); | ||
1207 | + return 0; | ||
1208 | +} | ||
1209 | + | ||
1210 | +static int zfcp_ccw_thaw(struct ccw_device *cdev) | ||
1211 | +{ | ||
1212 | + /* trace records for thaw and final shutdown during suspend | ||
1213 | + can only be found in system dump until the end of suspend | ||
1214 | + but not after resume because it's based on the memory image | ||
1215 | + right after the very first suspend (freeze) callback */ | ||
1216 | + zfcp_ccw_activate(cdev, 0, "ccthaw1"); | ||
1217 | + return 0; | ||
1218 | +} | ||
1219 | + | ||
1220 | +static int zfcp_ccw_resume(struct ccw_device *cdev) | ||
1221 | +{ | ||
1222 | + zfcp_ccw_activate(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccresu1"); | ||
1223 | + return 0; | ||
1224 | +} | ||
1225 | + | ||
1226 | struct ccw_driver zfcp_ccw_driver = { | ||
1227 | .driver = { | ||
1228 | .owner = THIS_MODULE, | ||
1229 | @@ -263,7 +316,7 @@ struct ccw_driver zfcp_ccw_driver = { | ||
1230 | .set_offline = zfcp_ccw_set_offline, | ||
1231 | .notify = zfcp_ccw_notify, | ||
1232 | .shutdown = zfcp_ccw_shutdown, | ||
1233 | - .freeze = zfcp_ccw_set_offline, | ||
1234 | - .thaw = zfcp_ccw_activate, | ||
1235 | - .restore = zfcp_ccw_activate, | ||
1236 | + .freeze = zfcp_ccw_suspend, | ||
1237 | + .thaw = zfcp_ccw_thaw, | ||
1238 | + .restore = zfcp_ccw_resume, | ||
1239 | }; | ||
1240 | diff --git a/drivers/s390/scsi/zfcp_cfdc.c b/drivers/s390/scsi/zfcp_cfdc.c | ||
1241 | index fab2c25..8ed63aa 100644 | ||
1242 | --- a/drivers/s390/scsi/zfcp_cfdc.c | ||
1243 | +++ b/drivers/s390/scsi/zfcp_cfdc.c | ||
1244 | @@ -293,7 +293,7 @@ void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *adapter) | ||
1245 | } | ||
1246 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | ||
1247 | |||
1248 | - shost_for_each_device(sdev, port->adapter->scsi_host) { | ||
1249 | + shost_for_each_device(sdev, adapter->scsi_host) { | ||
1250 | zfcp_sdev = sdev_to_zfcp(sdev); | ||
1251 | status = atomic_read(&zfcp_sdev->status); | ||
1252 | if ((status & ZFCP_STATUS_COMMON_ACCESS_DENIED) || | ||
1253 | diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c | ||
1254 | index a9a816e..79b9848 100644 | ||
1255 | --- a/drivers/s390/scsi/zfcp_dbf.c | ||
1256 | +++ b/drivers/s390/scsi/zfcp_dbf.c | ||
1257 | @@ -191,7 +191,7 @@ void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount, | ||
1258 | length = min((u16)sizeof(struct qdio_buffer), | ||
1259 | (u16)ZFCP_DBF_PAY_MAX_REC); | ||
1260 | |||
1261 | - while ((char *)pl[payload->counter] && payload->counter < scount) { | ||
1262 | + while (payload->counter < scount && (char *)pl[payload->counter]) { | ||
1263 | memcpy(payload->data, (char *)pl[payload->counter], length); | ||
1264 | debug_event(dbf->pay, 1, payload, zfcp_dbf_plen(length)); | ||
1265 | payload->counter++; | ||
1266 | @@ -200,6 +200,26 @@ void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount, | ||
1267 | spin_unlock_irqrestore(&dbf->pay_lock, flags); | ||
1268 | } | ||
1269 | |||
1270 | +/** | ||
1271 | + * zfcp_dbf_hba_basic - trace event for basic adapter events | ||
1272 | + * @adapter: pointer to struct zfcp_adapter | ||
1273 | + */ | ||
1274 | +void zfcp_dbf_hba_basic(char *tag, struct zfcp_adapter *adapter) | ||
1275 | +{ | ||
1276 | + struct zfcp_dbf *dbf = adapter->dbf; | ||
1277 | + struct zfcp_dbf_hba *rec = &dbf->hba_buf; | ||
1278 | + unsigned long flags; | ||
1279 | + | ||
1280 | + spin_lock_irqsave(&dbf->hba_lock, flags); | ||
1281 | + memset(rec, 0, sizeof(*rec)); | ||
1282 | + | ||
1283 | + memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); | ||
1284 | + rec->id = ZFCP_DBF_HBA_BASIC; | ||
1285 | + | ||
1286 | + debug_event(dbf->hba, 1, rec, sizeof(*rec)); | ||
1287 | + spin_unlock_irqrestore(&dbf->hba_lock, flags); | ||
1288 | +} | ||
1289 | + | ||
1290 | static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec, | ||
1291 | struct zfcp_adapter *adapter, | ||
1292 | struct zfcp_port *port, | ||
1293 | diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h | ||
1294 | index 714f087..3ac7a4b 100644 | ||
1295 | --- a/drivers/s390/scsi/zfcp_dbf.h | ||
1296 | +++ b/drivers/s390/scsi/zfcp_dbf.h | ||
1297 | @@ -154,6 +154,7 @@ enum zfcp_dbf_hba_id { | ||
1298 | ZFCP_DBF_HBA_RES = 1, | ||
1299 | ZFCP_DBF_HBA_USS = 2, | ||
1300 | ZFCP_DBF_HBA_BIT = 3, | ||
1301 | + ZFCP_DBF_HBA_BASIC = 4, | ||
1302 | }; | ||
1303 | |||
1304 | /** | ||
1305 | diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h | ||
1306 | index ed5d921..f172b84 100644 | ||
1307 | --- a/drivers/s390/scsi/zfcp_def.h | ||
1308 | +++ b/drivers/s390/scsi/zfcp_def.h | ||
1309 | @@ -77,6 +77,7 @@ struct zfcp_reqlist; | ||
1310 | #define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED 0x00000004 | ||
1311 | #define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008 | ||
1312 | #define ZFCP_STATUS_ADAPTER_HOST_CON_INIT 0x00000010 | ||
1313 | +#define ZFCP_STATUS_ADAPTER_SUSPENDED 0x00000040 | ||
1314 | #define ZFCP_STATUS_ADAPTER_ERP_PENDING 0x00000100 | ||
1315 | #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200 | ||
1316 | #define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED 0x00000400 | ||
1317 | @@ -204,6 +205,7 @@ struct zfcp_port { | ||
1318 | struct zfcp_adapter *adapter; /* adapter used to access port */ | ||
1319 | struct list_head unit_list; /* head of logical unit list */ | ||
1320 | rwlock_t unit_list_lock; /* unit list lock */ | ||
1321 | + atomic_t units; /* zfcp_unit count */ | ||
1322 | atomic_t status; /* status of this remote port */ | ||
1323 | u64 wwnn; /* WWNN if known */ | ||
1324 | u64 wwpn; /* WWPN */ | ||
1325 | diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h | ||
1326 | index 2302e1c..ef9e502 100644 | ||
1327 | --- a/drivers/s390/scsi/zfcp_ext.h | ||
1328 | +++ b/drivers/s390/scsi/zfcp_ext.h | ||
1329 | @@ -54,6 +54,7 @@ extern void zfcp_dbf_hba_fsf_res(char *, struct zfcp_fsf_req *); | ||
1330 | extern void zfcp_dbf_hba_bit_err(char *, struct zfcp_fsf_req *); | ||
1331 | extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *); | ||
1332 | extern void zfcp_dbf_hba_def_err(struct zfcp_adapter *, u64, u16, void **); | ||
1333 | +extern void zfcp_dbf_hba_basic(char *, struct zfcp_adapter *); | ||
1334 | extern void zfcp_dbf_san_req(char *, struct zfcp_fsf_req *, u32); | ||
1335 | extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *); | ||
1336 | extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *); | ||
1337 | @@ -158,6 +159,7 @@ extern void zfcp_scsi_dif_sense_error(struct scsi_cmnd *, int); | ||
1338 | extern struct attribute_group zfcp_sysfs_unit_attrs; | ||
1339 | extern struct attribute_group zfcp_sysfs_adapter_attrs; | ||
1340 | extern struct attribute_group zfcp_sysfs_port_attrs; | ||
1341 | +extern struct mutex zfcp_sysfs_port_units_mutex; | ||
1342 | extern struct device_attribute *zfcp_sysfs_sdev_attrs[]; | ||
1343 | extern struct device_attribute *zfcp_sysfs_shost_attrs[]; | ||
1344 | |||
1345 | diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c | ||
1346 | index e9a787e..2136fc2 100644 | ||
1347 | --- a/drivers/s390/scsi/zfcp_fsf.c | ||
1348 | +++ b/drivers/s390/scsi/zfcp_fsf.c | ||
1349 | @@ -219,7 +219,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req) | ||
1350 | return; | ||
1351 | } | ||
1352 | |||
1353 | - zfcp_dbf_hba_fsf_uss("fssrh_2", req); | ||
1354 | + zfcp_dbf_hba_fsf_uss("fssrh_4", req); | ||
1355 | |||
1356 | switch (sr_buf->status_type) { | ||
1357 | case FSF_STATUS_READ_PORT_CLOSED: | ||
1358 | @@ -437,6 +437,34 @@ void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) | ||
1359 | } | ||
1360 | } | ||
1361 | |||
1362 | +#define ZFCP_FSF_PORTSPEED_1GBIT (1 << 0) | ||
1363 | +#define ZFCP_FSF_PORTSPEED_2GBIT (1 << 1) | ||
1364 | +#define ZFCP_FSF_PORTSPEED_4GBIT (1 << 2) | ||
1365 | +#define ZFCP_FSF_PORTSPEED_10GBIT (1 << 3) | ||
1366 | +#define ZFCP_FSF_PORTSPEED_8GBIT (1 << 4) | ||
1367 | +#define ZFCP_FSF_PORTSPEED_16GBIT (1 << 5) | ||
1368 | +#define ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED (1 << 15) | ||
1369 | + | ||
1370 | +static u32 zfcp_fsf_convert_portspeed(u32 fsf_speed) | ||
1371 | +{ | ||
1372 | + u32 fdmi_speed = 0; | ||
1373 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_1GBIT) | ||
1374 | + fdmi_speed |= FC_PORTSPEED_1GBIT; | ||
1375 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_2GBIT) | ||
1376 | + fdmi_speed |= FC_PORTSPEED_2GBIT; | ||
1377 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_4GBIT) | ||
1378 | + fdmi_speed |= FC_PORTSPEED_4GBIT; | ||
1379 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_10GBIT) | ||
1380 | + fdmi_speed |= FC_PORTSPEED_10GBIT; | ||
1381 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_8GBIT) | ||
1382 | + fdmi_speed |= FC_PORTSPEED_8GBIT; | ||
1383 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_16GBIT) | ||
1384 | + fdmi_speed |= FC_PORTSPEED_16GBIT; | ||
1385 | + if (fsf_speed & ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED) | ||
1386 | + fdmi_speed |= FC_PORTSPEED_NOT_NEGOTIATED; | ||
1387 | + return fdmi_speed; | ||
1388 | +} | ||
1389 | + | ||
1390 | static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
1391 | { | ||
1392 | struct fsf_qtcb_bottom_config *bottom = &req->qtcb->bottom.config; | ||
1393 | @@ -456,7 +484,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | ||
1394 | fc_host_port_name(shost) = nsp->fl_wwpn; | ||
1395 | fc_host_node_name(shost) = nsp->fl_wwnn; | ||
1396 | fc_host_port_id(shost) = ntoh24(bottom->s_id); | ||
1397 | - fc_host_speed(shost) = bottom->fc_link_speed; | ||
1398 | + fc_host_speed(shost) = | ||
1399 | + zfcp_fsf_convert_portspeed(bottom->fc_link_speed); | ||
1400 | fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; | ||
1401 | |||
1402 | adapter->hydra_version = bottom->adapter_type; | ||
1403 | @@ -580,7 +609,8 @@ static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req) | ||
1404 | } else | ||
1405 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); | ||
1406 | fc_host_maxframe_size(shost) = bottom->maximum_frame_size; | ||
1407 | - fc_host_supported_speeds(shost) = bottom->supported_speed; | ||
1408 | + fc_host_supported_speeds(shost) = | ||
1409 | + zfcp_fsf_convert_portspeed(bottom->supported_speed); | ||
1410 | memcpy(fc_host_supported_fc4s(shost), bottom->supported_fc4_types, | ||
1411 | FC_FC4_LIST_SIZE); | ||
1412 | memcpy(fc_host_active_fc4s(shost), bottom->active_fc4_types, | ||
1413 | @@ -771,12 +801,14 @@ out: | ||
1414 | static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req) | ||
1415 | { | ||
1416 | struct scsi_device *sdev = req->data; | ||
1417 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
1418 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
1419 | union fsf_status_qual *fsq = &req->qtcb->header.fsf_status_qual; | ||
1420 | |||
1421 | if (req->status & ZFCP_STATUS_FSFREQ_ERROR) | ||
1422 | return; | ||
1423 | |||
1424 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
1425 | + | ||
1426 | switch (req->qtcb->header.fsf_status) { | ||
1427 | case FSF_PORT_HANDLE_NOT_VALID: | ||
1428 | if (fsq->word[0] == fsq->word[1]) { | ||
1429 | @@ -885,7 +917,7 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req) | ||
1430 | |||
1431 | switch (header->fsf_status) { | ||
1432 | case FSF_GOOD: | ||
1433 | - zfcp_dbf_san_res("fsscth1", req); | ||
1434 | + zfcp_dbf_san_res("fsscth2", req); | ||
1435 | ct->status = 0; | ||
1436 | break; | ||
1437 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: | ||
1438 | @@ -1739,13 +1771,15 @@ static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req) | ||
1439 | { | ||
1440 | struct zfcp_adapter *adapter = req->adapter; | ||
1441 | struct scsi_device *sdev = req->data; | ||
1442 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
1443 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
1444 | struct fsf_qtcb_header *header = &req->qtcb->header; | ||
1445 | struct fsf_qtcb_bottom_support *bottom = &req->qtcb->bottom.support; | ||
1446 | |||
1447 | if (req->status & ZFCP_STATUS_FSFREQ_ERROR) | ||
1448 | return; | ||
1449 | |||
1450 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
1451 | + | ||
1452 | atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED | | ||
1453 | ZFCP_STATUS_COMMON_ACCESS_BOXED | | ||
1454 | ZFCP_STATUS_LUN_SHARED | | ||
1455 | @@ -1856,11 +1890,13 @@ out: | ||
1456 | static void zfcp_fsf_close_lun_handler(struct zfcp_fsf_req *req) | ||
1457 | { | ||
1458 | struct scsi_device *sdev = req->data; | ||
1459 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
1460 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
1461 | |||
1462 | if (req->status & ZFCP_STATUS_FSFREQ_ERROR) | ||
1463 | return; | ||
1464 | |||
1465 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
1466 | + | ||
1467 | switch (req->qtcb->header.fsf_status) { | ||
1468 | case FSF_PORT_HANDLE_NOT_VALID: | ||
1469 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1"); | ||
1470 | @@ -1950,7 +1986,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) | ||
1471 | { | ||
1472 | struct fsf_qual_latency_info *lat_in; | ||
1473 | struct latency_cont *lat = NULL; | ||
1474 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scsi->device); | ||
1475 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
1476 | struct zfcp_blk_drv_data blktrc; | ||
1477 | int ticks = req->adapter->timer_ticks; | ||
1478 | |||
1479 | @@ -1965,6 +2001,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) | ||
1480 | |||
1481 | if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA && | ||
1482 | !(req->status & ZFCP_STATUS_FSFREQ_ERROR)) { | ||
1483 | + zfcp_sdev = sdev_to_zfcp(scsi->device); | ||
1484 | blktrc.flags |= ZFCP_BLK_LAT_VALID; | ||
1485 | blktrc.channel_lat = lat_in->channel_lat * ticks; | ||
1486 | blktrc.fabric_lat = lat_in->fabric_lat * ticks; | ||
1487 | @@ -2002,12 +2039,14 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req) | ||
1488 | { | ||
1489 | struct scsi_cmnd *scmnd = req->data; | ||
1490 | struct scsi_device *sdev = scmnd->device; | ||
1491 | - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
1492 | + struct zfcp_scsi_dev *zfcp_sdev; | ||
1493 | struct fsf_qtcb_header *header = &req->qtcb->header; | ||
1494 | |||
1495 | if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR)) | ||
1496 | return; | ||
1497 | |||
1498 | + zfcp_sdev = sdev_to_zfcp(sdev); | ||
1499 | + | ||
1500 | switch (header->fsf_status) { | ||
1501 | case FSF_HANDLE_MISMATCH: | ||
1502 | case FSF_PORT_HANDLE_NOT_VALID: | ||
1503 | diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c | ||
1504 | index e14da57..e76d003 100644 | ||
1505 | --- a/drivers/s390/scsi/zfcp_qdio.c | ||
1506 | +++ b/drivers/s390/scsi/zfcp_qdio.c | ||
1507 | @@ -102,18 +102,22 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, | ||
1508 | { | ||
1509 | struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; | ||
1510 | struct zfcp_adapter *adapter = qdio->adapter; | ||
1511 | - struct qdio_buffer_element *sbale; | ||
1512 | int sbal_no, sbal_idx; | ||
1513 | - void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; | ||
1514 | - u64 req_id; | ||
1515 | - u8 scount; | ||
1516 | |||
1517 | if (unlikely(qdio_err)) { | ||
1518 | - memset(pl, 0, ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); | ||
1519 | if (zfcp_adapter_multi_buffer_active(adapter)) { | ||
1520 | + void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; | ||
1521 | + struct qdio_buffer_element *sbale; | ||
1522 | + u64 req_id; | ||
1523 | + u8 scount; | ||
1524 | + | ||
1525 | + memset(pl, 0, | ||
1526 | + ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); | ||
1527 | sbale = qdio->res_q[idx]->element; | ||
1528 | req_id = (u64) sbale->addr; | ||
1529 | - scount = sbale->scount + 1; /* incl. signaling SBAL */ | ||
1530 | + scount = min(sbale->scount + 1, | ||
1531 | + ZFCP_QDIO_MAX_SBALS_PER_REQ + 1); | ||
1532 | + /* incl. signaling SBAL */ | ||
1533 | |||
1534 | for (sbal_no = 0; sbal_no < scount; sbal_no++) { | ||
1535 | sbal_idx = (idx + sbal_no) % | ||
1536 | diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c | ||
1537 | index cdc4ff7..9e62210 100644 | ||
1538 | --- a/drivers/s390/scsi/zfcp_sysfs.c | ||
1539 | +++ b/drivers/s390/scsi/zfcp_sysfs.c | ||
1540 | @@ -227,6 +227,8 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev, | ||
1541 | static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL, | ||
1542 | zfcp_sysfs_port_rescan_store); | ||
1543 | |||
1544 | +DEFINE_MUTEX(zfcp_sysfs_port_units_mutex); | ||
1545 | + | ||
1546 | static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | ||
1547 | struct device_attribute *attr, | ||
1548 | const char *buf, size_t count) | ||
1549 | @@ -249,6 +251,16 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | ||
1550 | else | ||
1551 | retval = 0; | ||
1552 | |||
1553 | + mutex_lock(&zfcp_sysfs_port_units_mutex); | ||
1554 | + if (atomic_read(&port->units) > 0) { | ||
1555 | + retval = -EBUSY; | ||
1556 | + mutex_unlock(&zfcp_sysfs_port_units_mutex); | ||
1557 | + goto out; | ||
1558 | + } | ||
1559 | + /* port is about to be removed, so no more unit_add */ | ||
1560 | + atomic_set(&port->units, -1); | ||
1561 | + mutex_unlock(&zfcp_sysfs_port_units_mutex); | ||
1562 | + | ||
1563 | write_lock_irq(&adapter->port_list_lock); | ||
1564 | list_del(&port->list); | ||
1565 | write_unlock_irq(&adapter->port_list_lock); | ||
1566 | @@ -289,12 +301,14 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, | ||
1567 | { | ||
1568 | struct zfcp_port *port = container_of(dev, struct zfcp_port, dev); | ||
1569 | u64 fcp_lun; | ||
1570 | + int retval; | ||
1571 | |||
1572 | if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) | ||
1573 | return -EINVAL; | ||
1574 | |||
1575 | - if (zfcp_unit_add(port, fcp_lun)) | ||
1576 | - return -EINVAL; | ||
1577 | + retval = zfcp_unit_add(port, fcp_lun); | ||
1578 | + if (retval) | ||
1579 | + return retval; | ||
1580 | |||
1581 | return count; | ||
1582 | } | ||
1583 | diff --git a/drivers/s390/scsi/zfcp_unit.c b/drivers/s390/scsi/zfcp_unit.c | ||
1584 | index 20796eb..4e6a535 100644 | ||
1585 | --- a/drivers/s390/scsi/zfcp_unit.c | ||
1586 | +++ b/drivers/s390/scsi/zfcp_unit.c | ||
1587 | @@ -104,7 +104,7 @@ static void zfcp_unit_release(struct device *dev) | ||
1588 | { | ||
1589 | struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev); | ||
1590 | |||
1591 | - put_device(&unit->port->dev); | ||
1592 | + atomic_dec(&unit->port->units); | ||
1593 | kfree(unit); | ||
1594 | } | ||
1595 | |||
1596 | @@ -119,16 +119,27 @@ static void zfcp_unit_release(struct device *dev) | ||
1597 | int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun) | ||
1598 | { | ||
1599 | struct zfcp_unit *unit; | ||
1600 | + int retval = 0; | ||
1601 | + | ||
1602 | + mutex_lock(&zfcp_sysfs_port_units_mutex); | ||
1603 | + if (atomic_read(&port->units) == -1) { | ||
1604 | + /* port is already gone */ | ||
1605 | + retval = -ENODEV; | ||
1606 | + goto out; | ||
1607 | + } | ||
1608 | |||
1609 | unit = zfcp_unit_find(port, fcp_lun); | ||
1610 | if (unit) { | ||
1611 | put_device(&unit->dev); | ||
1612 | - return -EEXIST; | ||
1613 | + retval = -EEXIST; | ||
1614 | + goto out; | ||
1615 | } | ||
1616 | |||
1617 | unit = kzalloc(sizeof(struct zfcp_unit), GFP_KERNEL); | ||
1618 | - if (!unit) | ||
1619 | - return -ENOMEM; | ||
1620 | + if (!unit) { | ||
1621 | + retval = -ENOMEM; | ||
1622 | + goto out; | ||
1623 | + } | ||
1624 | |||
1625 | unit->port = port; | ||
1626 | unit->fcp_lun = fcp_lun; | ||
1627 | @@ -139,28 +150,33 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun) | ||
1628 | if (dev_set_name(&unit->dev, "0x%016llx", | ||
1629 | (unsigned long long) fcp_lun)) { | ||
1630 | kfree(unit); | ||
1631 | - return -ENOMEM; | ||
1632 | + retval = -ENOMEM; | ||
1633 | + goto out; | ||
1634 | } | ||
1635 | |||
1636 | - get_device(&port->dev); | ||
1637 | - | ||
1638 | if (device_register(&unit->dev)) { | ||
1639 | put_device(&unit->dev); | ||
1640 | - return -ENOMEM; | ||
1641 | + retval = -ENOMEM; | ||
1642 | + goto out; | ||
1643 | } | ||
1644 | |||
1645 | if (sysfs_create_group(&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) { | ||
1646 | device_unregister(&unit->dev); | ||
1647 | - return -EINVAL; | ||
1648 | + retval = -EINVAL; | ||
1649 | + goto out; | ||
1650 | } | ||
1651 | |||
1652 | + atomic_inc(&port->units); /* under zfcp_sysfs_port_units_mutex ! */ | ||
1653 | + | ||
1654 | write_lock_irq(&port->unit_list_lock); | ||
1655 | list_add_tail(&unit->list, &port->unit_list); | ||
1656 | write_unlock_irq(&port->unit_list_lock); | ||
1657 | |||
1658 | zfcp_unit_scsi_scan(unit); | ||
1659 | |||
1660 | - return 0; | ||
1661 | +out: | ||
1662 | + mutex_unlock(&zfcp_sysfs_port_units_mutex); | ||
1663 | + return retval; | ||
1664 | } | ||
1665 | |||
1666 | /** | ||
1667 | diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c | ||
1668 | index 68ce085..a540162 100644 | ||
1669 | --- a/drivers/scsi/atp870u.c | ||
1670 | +++ b/drivers/scsi/atp870u.c | ||
1671 | @@ -1173,7 +1173,16 @@ wait_io1: | ||
1672 | outw(val, tmport); | ||
1673 | outb(2, 0x80); | ||
1674 | TCM_SYNC: | ||
1675 | - udelay(0x800); | ||
1676 | + /* | ||
1677 | + * The funny division into multiple delays is to accomodate | ||
1678 | + * arches like ARM where udelay() multiplies its argument by | ||
1679 | + * a large number to initialize a loop counter. To avoid | ||
1680 | + * overflow, the maximum supported udelay is 2000 microseconds. | ||
1681 | + * | ||
1682 | + * XXX it would be more polite to find a way to use msleep() | ||
1683 | + */ | ||
1684 | + mdelay(2); | ||
1685 | + udelay(48); | ||
1686 | if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */ | ||
1687 | outw(0, tmport--); | ||
1688 | outb(0, tmport); | ||
1689 | diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c | ||
1690 | index 33ef60d..6a8568c 100644 | ||
1691 | --- a/fs/cifs/cifs_unicode.c | ||
1692 | +++ b/fs/cifs/cifs_unicode.c | ||
1693 | @@ -203,6 +203,27 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len, | ||
1694 | int i; | ||
1695 | wchar_t wchar_to; /* needed to quiet sparse */ | ||
1696 | |||
1697 | + /* special case for utf8 to handle no plane0 chars */ | ||
1698 | + if (!strcmp(codepage->charset, "utf8")) { | ||
1699 | + /* | ||
1700 | + * convert utf8 -> utf16, we assume we have enough space | ||
1701 | + * as caller should have assumed conversion does not overflow | ||
1702 | + * in destination len is length in wchar_t units (16bits) | ||
1703 | + */ | ||
1704 | + i = utf8s_to_utf16s(from, len, UTF16_LITTLE_ENDIAN, | ||
1705 | + (wchar_t *) to, len); | ||
1706 | + | ||
1707 | + /* if success terminate and exit */ | ||
1708 | + if (i >= 0) | ||
1709 | + goto success; | ||
1710 | + /* | ||
1711 | + * if fails fall back to UCS encoding as this | ||
1712 | + * function should not return negative values | ||
1713 | + * currently can fail only if source contains | ||
1714 | + * invalid encoded characters | ||
1715 | + */ | ||
1716 | + } | ||
1717 | + | ||
1718 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { | ||
1719 | charlen = codepage->char2uni(from, len, &wchar_to); | ||
1720 | if (charlen < 1) { | ||
1721 | @@ -215,6 +236,7 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len, | ||
1722 | put_unaligned_le16(wchar_to, &to[i]); | ||
1723 | } | ||
1724 | |||
1725 | +success: | ||
1726 | put_unaligned_le16(0, &to[i]); | ||
1727 | return i; | ||
1728 | } | ||
1729 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
1730 | index 65a78e9..f771e9f 100644 | ||
1731 | --- a/fs/cifs/connect.c | ||
1732 | +++ b/fs/cifs/connect.c | ||
1733 | @@ -70,6 +70,7 @@ enum { | ||
1734 | /* Mount options that take no arguments */ | ||
1735 | Opt_user_xattr, Opt_nouser_xattr, | ||
1736 | Opt_forceuid, Opt_noforceuid, | ||
1737 | + Opt_forcegid, Opt_noforcegid, | ||
1738 | Opt_noblocksend, Opt_noautotune, | ||
1739 | Opt_hard, Opt_soft, Opt_perm, Opt_noperm, | ||
1740 | Opt_mapchars, Opt_nomapchars, Opt_sfu, | ||
1741 | @@ -121,6 +122,8 @@ static const match_table_t cifs_mount_option_tokens = { | ||
1742 | { Opt_nouser_xattr, "nouser_xattr" }, | ||
1743 | { Opt_forceuid, "forceuid" }, | ||
1744 | { Opt_noforceuid, "noforceuid" }, | ||
1745 | + { Opt_forcegid, "forcegid" }, | ||
1746 | + { Opt_noforcegid, "noforcegid" }, | ||
1747 | { Opt_noblocksend, "noblocksend" }, | ||
1748 | { Opt_noautotune, "noautotune" }, | ||
1749 | { Opt_hard, "hard" }, | ||
1750 | @@ -1287,6 +1290,12 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | ||
1751 | case Opt_noforceuid: | ||
1752 | override_uid = 0; | ||
1753 | break; | ||
1754 | + case Opt_forcegid: | ||
1755 | + override_gid = 1; | ||
1756 | + break; | ||
1757 | + case Opt_noforcegid: | ||
1758 | + override_gid = 0; | ||
1759 | + break; | ||
1760 | case Opt_noblocksend: | ||
1761 | vol->noblocksnd = 1; | ||
1762 | break; | ||
1763 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
1764 | index 55a654d..dcd08e4 100644 | ||
1765 | --- a/fs/ext4/inode.c | ||
1766 | +++ b/fs/ext4/inode.c | ||
1767 | @@ -2386,6 +2386,16 @@ static int ext4_nonda_switch(struct super_block *sb) | ||
1768 | free_blocks = EXT4_C2B(sbi, | ||
1769 | percpu_counter_read_positive(&sbi->s_freeclusters_counter)); | ||
1770 | dirty_blocks = percpu_counter_read_positive(&sbi->s_dirtyclusters_counter); | ||
1771 | + /* | ||
1772 | + * Start pushing delalloc when 1/2 of free blocks are dirty. | ||
1773 | + */ | ||
1774 | + if (dirty_blocks && (free_blocks < 2 * dirty_blocks) && | ||
1775 | + !writeback_in_progress(sb->s_bdi) && | ||
1776 | + down_read_trylock(&sb->s_umount)) { | ||
1777 | + writeback_inodes_sb(sb, WB_REASON_FS_FREE_SPACE); | ||
1778 | + up_read(&sb->s_umount); | ||
1779 | + } | ||
1780 | + | ||
1781 | if (2 * free_blocks < 3 * dirty_blocks || | ||
1782 | free_blocks < (dirty_blocks + EXT4_FREECLUSTERS_WATERMARK)) { | ||
1783 | /* | ||
1784 | @@ -2394,13 +2404,6 @@ static int ext4_nonda_switch(struct super_block *sb) | ||
1785 | */ | ||
1786 | return 1; | ||
1787 | } | ||
1788 | - /* | ||
1789 | - * Even if we don't switch but are nearing capacity, | ||
1790 | - * start pushing delalloc when 1/2 of free blocks are dirty. | ||
1791 | - */ | ||
1792 | - if (free_blocks < 2 * dirty_blocks) | ||
1793 | - writeback_inodes_sb_if_idle(sb, WB_REASON_FS_FREE_SPACE); | ||
1794 | - | ||
1795 | return 0; | ||
1796 | } | ||
1797 | |||
1798 | @@ -3889,6 +3892,7 @@ static int ext4_do_update_inode(handle_t *handle, | ||
1799 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
1800 | struct buffer_head *bh = iloc->bh; | ||
1801 | int err = 0, rc, block; | ||
1802 | + int need_datasync = 0; | ||
1803 | |||
1804 | /* For fields not not tracking in the in-memory inode, | ||
1805 | * initialise them to zero for new inodes. */ | ||
1806 | @@ -3937,7 +3941,10 @@ static int ext4_do_update_inode(handle_t *handle, | ||
1807 | raw_inode->i_file_acl_high = | ||
1808 | cpu_to_le16(ei->i_file_acl >> 32); | ||
1809 | raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl); | ||
1810 | - ext4_isize_set(raw_inode, ei->i_disksize); | ||
1811 | + if (ei->i_disksize != ext4_isize(raw_inode)) { | ||
1812 | + ext4_isize_set(raw_inode, ei->i_disksize); | ||
1813 | + need_datasync = 1; | ||
1814 | + } | ||
1815 | if (ei->i_disksize > 0x7fffffffULL) { | ||
1816 | struct super_block *sb = inode->i_sb; | ||
1817 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, | ||
1818 | @@ -3988,7 +3995,7 @@ static int ext4_do_update_inode(handle_t *handle, | ||
1819 | err = rc; | ||
1820 | ext4_clear_inode_state(inode, EXT4_STATE_NEW); | ||
1821 | |||
1822 | - ext4_update_inode_fsync_trans(handle, inode, 0); | ||
1823 | + ext4_update_inode_fsync_trans(handle, inode, need_datasync); | ||
1824 | out_brelse: | ||
1825 | brelse(bh); | ||
1826 | ext4_std_error(inode->i_sb, err); | ||
1827 | diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c | ||
1828 | index c5826c6..e2016f3 100644 | ||
1829 | --- a/fs/ext4/move_extent.c | ||
1830 | +++ b/fs/ext4/move_extent.c | ||
1831 | @@ -141,55 +141,21 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path, | ||
1832 | } | ||
1833 | |||
1834 | /** | ||
1835 | - * mext_check_null_inode - NULL check for two inodes | ||
1836 | - * | ||
1837 | - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. | ||
1838 | - */ | ||
1839 | -static int | ||
1840 | -mext_check_null_inode(struct inode *inode1, struct inode *inode2, | ||
1841 | - const char *function, unsigned int line) | ||
1842 | -{ | ||
1843 | - int ret = 0; | ||
1844 | - | ||
1845 | - if (inode1 == NULL) { | ||
1846 | - __ext4_error(inode2->i_sb, function, line, | ||
1847 | - "Both inodes should not be NULL: " | ||
1848 | - "inode1 NULL inode2 %lu", inode2->i_ino); | ||
1849 | - ret = -EIO; | ||
1850 | - } else if (inode2 == NULL) { | ||
1851 | - __ext4_error(inode1->i_sb, function, line, | ||
1852 | - "Both inodes should not be NULL: " | ||
1853 | - "inode1 %lu inode2 NULL", inode1->i_ino); | ||
1854 | - ret = -EIO; | ||
1855 | - } | ||
1856 | - return ret; | ||
1857 | -} | ||
1858 | - | ||
1859 | -/** | ||
1860 | * double_down_write_data_sem - Acquire two inodes' write lock of i_data_sem | ||
1861 | * | ||
1862 | - * @orig_inode: original inode structure | ||
1863 | - * @donor_inode: donor inode structure | ||
1864 | - * Acquire write lock of i_data_sem of the two inodes (orig and donor) by | ||
1865 | - * i_ino order. | ||
1866 | + * Acquire write lock of i_data_sem of the two inodes | ||
1867 | */ | ||
1868 | static void | ||
1869 | -double_down_write_data_sem(struct inode *orig_inode, struct inode *donor_inode) | ||
1870 | +double_down_write_data_sem(struct inode *first, struct inode *second) | ||
1871 | { | ||
1872 | - struct inode *first = orig_inode, *second = donor_inode; | ||
1873 | + if (first < second) { | ||
1874 | + down_write(&EXT4_I(first)->i_data_sem); | ||
1875 | + down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
1876 | + } else { | ||
1877 | + down_write(&EXT4_I(second)->i_data_sem); | ||
1878 | + down_write_nested(&EXT4_I(first)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
1879 | |||
1880 | - /* | ||
1881 | - * Use the inode number to provide the stable locking order instead | ||
1882 | - * of its address, because the C language doesn't guarantee you can | ||
1883 | - * compare pointers that don't come from the same array. | ||
1884 | - */ | ||
1885 | - if (donor_inode->i_ino < orig_inode->i_ino) { | ||
1886 | - first = donor_inode; | ||
1887 | - second = orig_inode; | ||
1888 | } | ||
1889 | - | ||
1890 | - down_write(&EXT4_I(first)->i_data_sem); | ||
1891 | - down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
1892 | } | ||
1893 | |||
1894 | /** | ||
1895 | @@ -969,14 +935,6 @@ mext_check_arguments(struct inode *orig_inode, | ||
1896 | return -EINVAL; | ||
1897 | } | ||
1898 | |||
1899 | - /* Files should be in the same ext4 FS */ | ||
1900 | - if (orig_inode->i_sb != donor_inode->i_sb) { | ||
1901 | - ext4_debug("ext4 move extent: The argument files " | ||
1902 | - "should be in same FS [ino:orig %lu, donor %lu]\n", | ||
1903 | - orig_inode->i_ino, donor_inode->i_ino); | ||
1904 | - return -EINVAL; | ||
1905 | - } | ||
1906 | - | ||
1907 | /* Ext4 move extent supports only extent based file */ | ||
1908 | if (!(ext4_test_inode_flag(orig_inode, EXT4_INODE_EXTENTS))) { | ||
1909 | ext4_debug("ext4 move extent: orig file is not extents " | ||
1910 | @@ -1072,35 +1030,19 @@ mext_check_arguments(struct inode *orig_inode, | ||
1911 | * @inode1: the inode structure | ||
1912 | * @inode2: the inode structure | ||
1913 | * | ||
1914 | - * Lock two inodes' i_mutex by i_ino order. | ||
1915 | - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. | ||
1916 | + * Lock two inodes' i_mutex | ||
1917 | */ | ||
1918 | -static int | ||
1919 | +static void | ||
1920 | mext_inode_double_lock(struct inode *inode1, struct inode *inode2) | ||
1921 | { | ||
1922 | - int ret = 0; | ||
1923 | - | ||
1924 | - BUG_ON(inode1 == NULL && inode2 == NULL); | ||
1925 | - | ||
1926 | - ret = mext_check_null_inode(inode1, inode2, __func__, __LINE__); | ||
1927 | - if (ret < 0) | ||
1928 | - goto out; | ||
1929 | - | ||
1930 | - if (inode1 == inode2) { | ||
1931 | - mutex_lock(&inode1->i_mutex); | ||
1932 | - goto out; | ||
1933 | - } | ||
1934 | - | ||
1935 | - if (inode1->i_ino < inode2->i_ino) { | ||
1936 | + BUG_ON(inode1 == inode2); | ||
1937 | + if (inode1 < inode2) { | ||
1938 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT); | ||
1939 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_CHILD); | ||
1940 | } else { | ||
1941 | mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT); | ||
1942 | mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD); | ||
1943 | } | ||
1944 | - | ||
1945 | -out: | ||
1946 | - return ret; | ||
1947 | } | ||
1948 | |||
1949 | /** | ||
1950 | @@ -1109,28 +1051,13 @@ out: | ||
1951 | * @inode1: the inode that is released first | ||
1952 | * @inode2: the inode that is released second | ||
1953 | * | ||
1954 | - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0. | ||
1955 | */ | ||
1956 | |||
1957 | -static int | ||
1958 | +static void | ||
1959 | mext_inode_double_unlock(struct inode *inode1, struct inode *inode2) | ||
1960 | { | ||
1961 | - int ret = 0; | ||
1962 | - | ||
1963 | - BUG_ON(inode1 == NULL && inode2 == NULL); | ||
1964 | - | ||
1965 | - ret = mext_check_null_inode(inode1, inode2, __func__, __LINE__); | ||
1966 | - if (ret < 0) | ||
1967 | - goto out; | ||
1968 | - | ||
1969 | - if (inode1) | ||
1970 | - mutex_unlock(&inode1->i_mutex); | ||
1971 | - | ||
1972 | - if (inode2 && inode2 != inode1) | ||
1973 | - mutex_unlock(&inode2->i_mutex); | ||
1974 | - | ||
1975 | -out: | ||
1976 | - return ret; | ||
1977 | + mutex_unlock(&inode1->i_mutex); | ||
1978 | + mutex_unlock(&inode2->i_mutex); | ||
1979 | } | ||
1980 | |||
1981 | /** | ||
1982 | @@ -1187,16 +1114,23 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
1983 | ext4_lblk_t block_end, seq_start, add_blocks, file_end, seq_blocks = 0; | ||
1984 | ext4_lblk_t rest_blocks; | ||
1985 | pgoff_t orig_page_offset = 0, seq_end_page; | ||
1986 | - int ret1, ret2, depth, last_extent = 0; | ||
1987 | + int ret, depth, last_extent = 0; | ||
1988 | int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits; | ||
1989 | int data_offset_in_page; | ||
1990 | int block_len_in_page; | ||
1991 | int uninit; | ||
1992 | |||
1993 | - /* orig and donor should be different file */ | ||
1994 | - if (orig_inode->i_ino == donor_inode->i_ino) { | ||
1995 | + if (orig_inode->i_sb != donor_inode->i_sb) { | ||
1996 | + ext4_debug("ext4 move extent: The argument files " | ||
1997 | + "should be in same FS [ino:orig %lu, donor %lu]\n", | ||
1998 | + orig_inode->i_ino, donor_inode->i_ino); | ||
1999 | + return -EINVAL; | ||
2000 | + } | ||
2001 | + | ||
2002 | + /* orig and donor should be different inodes */ | ||
2003 | + if (orig_inode == donor_inode) { | ||
2004 | ext4_debug("ext4 move extent: The argument files should not " | ||
2005 | - "be same file [ino:orig %lu, donor %lu]\n", | ||
2006 | + "be same inode [ino:orig %lu, donor %lu]\n", | ||
2007 | orig_inode->i_ino, donor_inode->i_ino); | ||
2008 | return -EINVAL; | ||
2009 | } | ||
2010 | @@ -1208,18 +1142,21 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2011 | orig_inode->i_ino, donor_inode->i_ino); | ||
2012 | return -EINVAL; | ||
2013 | } | ||
2014 | - | ||
2015 | + /* TODO: This is non obvious task to swap blocks for inodes with full | ||
2016 | + jornaling enabled */ | ||
2017 | + if (ext4_should_journal_data(orig_inode) || | ||
2018 | + ext4_should_journal_data(donor_inode)) { | ||
2019 | + return -EINVAL; | ||
2020 | + } | ||
2021 | /* Protect orig and donor inodes against a truncate */ | ||
2022 | - ret1 = mext_inode_double_lock(orig_inode, donor_inode); | ||
2023 | - if (ret1 < 0) | ||
2024 | - return ret1; | ||
2025 | + mext_inode_double_lock(orig_inode, donor_inode); | ||
2026 | |||
2027 | /* Protect extent tree against block allocations via delalloc */ | ||
2028 | double_down_write_data_sem(orig_inode, donor_inode); | ||
2029 | /* Check the filesystem environment whether move_extent can be done */ | ||
2030 | - ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start, | ||
2031 | + ret = mext_check_arguments(orig_inode, donor_inode, orig_start, | ||
2032 | donor_start, &len); | ||
2033 | - if (ret1) | ||
2034 | + if (ret) | ||
2035 | goto out; | ||
2036 | |||
2037 | file_end = (i_size_read(orig_inode) - 1) >> orig_inode->i_blkbits; | ||
2038 | @@ -1227,13 +1164,13 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2039 | if (file_end < block_end) | ||
2040 | len -= block_end - file_end; | ||
2041 | |||
2042 | - ret1 = get_ext_path(orig_inode, block_start, &orig_path); | ||
2043 | - if (ret1) | ||
2044 | + ret = get_ext_path(orig_inode, block_start, &orig_path); | ||
2045 | + if (ret) | ||
2046 | goto out; | ||
2047 | |||
2048 | /* Get path structure to check the hole */ | ||
2049 | - ret1 = get_ext_path(orig_inode, block_start, &holecheck_path); | ||
2050 | - if (ret1) | ||
2051 | + ret = get_ext_path(orig_inode, block_start, &holecheck_path); | ||
2052 | + if (ret) | ||
2053 | goto out; | ||
2054 | |||
2055 | depth = ext_depth(orig_inode); | ||
2056 | @@ -1252,13 +1189,13 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2057 | last_extent = mext_next_extent(orig_inode, | ||
2058 | holecheck_path, &ext_cur); | ||
2059 | if (last_extent < 0) { | ||
2060 | - ret1 = last_extent; | ||
2061 | + ret = last_extent; | ||
2062 | goto out; | ||
2063 | } | ||
2064 | last_extent = mext_next_extent(orig_inode, orig_path, | ||
2065 | &ext_dummy); | ||
2066 | if (last_extent < 0) { | ||
2067 | - ret1 = last_extent; | ||
2068 | + ret = last_extent; | ||
2069 | goto out; | ||
2070 | } | ||
2071 | seq_start = le32_to_cpu(ext_cur->ee_block); | ||
2072 | @@ -1272,7 +1209,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2073 | if (le32_to_cpu(ext_cur->ee_block) > block_end) { | ||
2074 | ext4_debug("ext4 move extent: The specified range of file " | ||
2075 | "may be the hole\n"); | ||
2076 | - ret1 = -EINVAL; | ||
2077 | + ret = -EINVAL; | ||
2078 | goto out; | ||
2079 | } | ||
2080 | |||
2081 | @@ -1292,7 +1229,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2082 | last_extent = mext_next_extent(orig_inode, holecheck_path, | ||
2083 | &ext_cur); | ||
2084 | if (last_extent < 0) { | ||
2085 | - ret1 = last_extent; | ||
2086 | + ret = last_extent; | ||
2087 | break; | ||
2088 | } | ||
2089 | add_blocks = ext4_ext_get_actual_len(ext_cur); | ||
2090 | @@ -1349,18 +1286,18 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2091 | orig_page_offset, | ||
2092 | data_offset_in_page, | ||
2093 | block_len_in_page, uninit, | ||
2094 | - &ret1); | ||
2095 | + &ret); | ||
2096 | |||
2097 | /* Count how many blocks we have exchanged */ | ||
2098 | *moved_len += block_len_in_page; | ||
2099 | - if (ret1 < 0) | ||
2100 | + if (ret < 0) | ||
2101 | break; | ||
2102 | if (*moved_len > len) { | ||
2103 | EXT4_ERROR_INODE(orig_inode, | ||
2104 | "We replaced blocks too much! " | ||
2105 | "sum of replaced: %llu requested: %llu", | ||
2106 | *moved_len, len); | ||
2107 | - ret1 = -EIO; | ||
2108 | + ret = -EIO; | ||
2109 | break; | ||
2110 | } | ||
2111 | |||
2112 | @@ -1374,22 +1311,22 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | ||
2113 | } | ||
2114 | |||
2115 | double_down_write_data_sem(orig_inode, donor_inode); | ||
2116 | - if (ret1 < 0) | ||
2117 | + if (ret < 0) | ||
2118 | break; | ||
2119 | |||
2120 | /* Decrease buffer counter */ | ||
2121 | if (holecheck_path) | ||
2122 | ext4_ext_drop_refs(holecheck_path); | ||
2123 | - ret1 = get_ext_path(orig_inode, seq_start, &holecheck_path); | ||
2124 | - if (ret1) | ||
2125 | + ret = get_ext_path(orig_inode, seq_start, &holecheck_path); | ||
2126 | + if (ret) | ||
2127 | break; | ||
2128 | depth = holecheck_path->p_depth; | ||
2129 | |||
2130 | /* Decrease buffer counter */ | ||
2131 | if (orig_path) | ||
2132 | ext4_ext_drop_refs(orig_path); | ||
2133 | - ret1 = get_ext_path(orig_inode, seq_start, &orig_path); | ||
2134 | - if (ret1) | ||
2135 | + ret = get_ext_path(orig_inode, seq_start, &orig_path); | ||
2136 | + if (ret) | ||
2137 | break; | ||
2138 | |||
2139 | ext_cur = holecheck_path[depth].p_ext; | ||
2140 | @@ -1412,12 +1349,7 @@ out: | ||
2141 | kfree(holecheck_path); | ||
2142 | } | ||
2143 | double_up_write_data_sem(orig_inode, donor_inode); | ||
2144 | - ret2 = mext_inode_double_unlock(orig_inode, donor_inode); | ||
2145 | - | ||
2146 | - if (ret1) | ||
2147 | - return ret1; | ||
2148 | - else if (ret2) | ||
2149 | - return ret2; | ||
2150 | + mext_inode_double_unlock(orig_inode, donor_inode); | ||
2151 | |||
2152 | - return 0; | ||
2153 | + return ret; | ||
2154 | } | ||
2155 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
2156 | index 0a94cbb..ac76939 100644 | ||
2157 | --- a/fs/ext4/namei.c | ||
2158 | +++ b/fs/ext4/namei.c | ||
2159 | @@ -1801,9 +1801,7 @@ retry: | ||
2160 | err = PTR_ERR(inode); | ||
2161 | if (!IS_ERR(inode)) { | ||
2162 | init_special_inode(inode, inode->i_mode, rdev); | ||
2163 | -#ifdef CONFIG_EXT4_FS_XATTR | ||
2164 | inode->i_op = &ext4_special_inode_operations; | ||
2165 | -#endif | ||
2166 | err = ext4_add_nondir(handle, dentry, inode); | ||
2167 | } | ||
2168 | ext4_journal_stop(handle); | ||
2169 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c | ||
2170 | index 3407a62..231cacb 100644 | ||
2171 | --- a/fs/ext4/resize.c | ||
2172 | +++ b/fs/ext4/resize.c | ||
2173 | @@ -200,8 +200,11 @@ static void free_flex_gd(struct ext4_new_flex_group_data *flex_gd) | ||
2174 | * be a partial of a flex group. | ||
2175 | * | ||
2176 | * @sb: super block of fs to which the groups belongs | ||
2177 | + * | ||
2178 | + * Returns 0 on a successful allocation of the metadata blocks in the | ||
2179 | + * block group. | ||
2180 | */ | ||
2181 | -static void ext4_alloc_group_tables(struct super_block *sb, | ||
2182 | +static int ext4_alloc_group_tables(struct super_block *sb, | ||
2183 | struct ext4_new_flex_group_data *flex_gd, | ||
2184 | int flexbg_size) | ||
2185 | { | ||
2186 | @@ -226,6 +229,8 @@ static void ext4_alloc_group_tables(struct super_block *sb, | ||
2187 | (last_group & ~(flexbg_size - 1)))); | ||
2188 | next_group: | ||
2189 | group = group_data[0].group; | ||
2190 | + if (src_group >= group_data[0].group + flex_gd->count) | ||
2191 | + return -ENOSPC; | ||
2192 | start_blk = ext4_group_first_block_no(sb, src_group); | ||
2193 | last_blk = start_blk + group_data[src_group - group].blocks_count; | ||
2194 | |||
2195 | @@ -235,7 +240,6 @@ next_group: | ||
2196 | |||
2197 | start_blk += overhead; | ||
2198 | |||
2199 | - BUG_ON(src_group >= group_data[0].group + flex_gd->count); | ||
2200 | /* We collect contiguous blocks as much as possible. */ | ||
2201 | src_group++; | ||
2202 | for (; src_group <= last_group; src_group++) | ||
2203 | @@ -300,6 +304,7 @@ next_group: | ||
2204 | group_data[i].free_blocks_count); | ||
2205 | } | ||
2206 | } | ||
2207 | + return 0; | ||
2208 | } | ||
2209 | |||
2210 | static struct buffer_head *bclean(handle_t *handle, struct super_block *sb, | ||
2211 | @@ -451,6 +456,9 @@ static int setup_new_flex_group_blocks(struct super_block *sb, | ||
2212 | gdblocks = ext4_bg_num_gdb(sb, group); | ||
2213 | start = ext4_group_first_block_no(sb, group); | ||
2214 | |||
2215 | + if (!ext4_bg_has_super(sb, group)) | ||
2216 | + goto handle_itb; | ||
2217 | + | ||
2218 | /* Copy all of the GDT blocks into the backup in this group */ | ||
2219 | for (j = 0, block = start + 1; j < gdblocks; j++, block++) { | ||
2220 | struct buffer_head *gdb; | ||
2221 | @@ -493,6 +501,7 @@ static int setup_new_flex_group_blocks(struct super_block *sb, | ||
2222 | goto out; | ||
2223 | } | ||
2224 | |||
2225 | +handle_itb: | ||
2226 | /* Initialize group tables of the grop @group */ | ||
2227 | if (!(bg_flags[i] & EXT4_BG_INODE_ZEROED)) | ||
2228 | goto handle_bb; | ||
2229 | @@ -1293,13 +1302,15 @@ exit_journal: | ||
2230 | err = err2; | ||
2231 | |||
2232 | if (!err) { | ||
2233 | - int i; | ||
2234 | + int gdb_num = group / EXT4_DESC_PER_BLOCK(sb); | ||
2235 | + int gdb_num_end = ((group + flex_gd->count - 1) / | ||
2236 | + EXT4_DESC_PER_BLOCK(sb)); | ||
2237 | + | ||
2238 | update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es, | ||
2239 | sizeof(struct ext4_super_block)); | ||
2240 | - for (i = 0; i < flex_gd->count; i++, group++) { | ||
2241 | + for (; gdb_num <= gdb_num_end; gdb_num++) { | ||
2242 | struct buffer_head *gdb_bh; | ||
2243 | - int gdb_num; | ||
2244 | - gdb_num = group / EXT4_BLOCKS_PER_GROUP(sb); | ||
2245 | + | ||
2246 | gdb_bh = sbi->s_group_desc[gdb_num]; | ||
2247 | update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, | ||
2248 | gdb_bh->b_size); | ||
2249 | @@ -1676,7 +1687,8 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) | ||
2250 | */ | ||
2251 | while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count, | ||
2252 | flexbg_size)) { | ||
2253 | - ext4_alloc_group_tables(sb, flex_gd, flexbg_size); | ||
2254 | + if (ext4_alloc_group_tables(sb, flex_gd, flexbg_size) != 0) | ||
2255 | + break; | ||
2256 | err = ext4_flex_group_add(sb, resize_inode, flex_gd); | ||
2257 | if (unlikely(err)) | ||
2258 | break; | ||
2259 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
2260 | index 12a278f..b1c28f1 100644 | ||
2261 | --- a/fs/ext4/super.c | ||
2262 | +++ b/fs/ext4/super.c | ||
2263 | @@ -1692,7 +1692,7 @@ static inline void ext4_show_quota_options(struct seq_file *seq, | ||
2264 | |||
2265 | static const char *token2str(int token) | ||
2266 | { | ||
2267 | - static const struct match_token *t; | ||
2268 | + const struct match_token *t; | ||
2269 | |||
2270 | for (t = tokens; t->token != Opt_err; t++) | ||
2271 | if (t->token == token && !strchr(t->pattern, '=')) | ||
2272 | diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c | ||
2273 | index 539f36c..b35bd64 100644 | ||
2274 | --- a/fs/fs-writeback.c | ||
2275 | +++ b/fs/fs-writeback.c | ||
2276 | @@ -68,6 +68,7 @@ int writeback_in_progress(struct backing_dev_info *bdi) | ||
2277 | { | ||
2278 | return test_bit(BDI_writeback_running, &bdi->state); | ||
2279 | } | ||
2280 | +EXPORT_SYMBOL(writeback_in_progress); | ||
2281 | |||
2282 | static inline struct backing_dev_info *inode_to_bdi(struct inode *inode) | ||
2283 | { | ||
2284 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
2285 | index 9956ac6..e5bfb11 100644 | ||
2286 | --- a/fs/jbd2/journal.c | ||
2287 | +++ b/fs/jbd2/journal.c | ||
2288 | @@ -1317,6 +1317,11 @@ static void jbd2_mark_journal_empty(journal_t *journal) | ||
2289 | |||
2290 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); | ||
2291 | read_lock(&journal->j_state_lock); | ||
2292 | + /* Is it already empty? */ | ||
2293 | + if (sb->s_start == 0) { | ||
2294 | + read_unlock(&journal->j_state_lock); | ||
2295 | + return; | ||
2296 | + } | ||
2297 | jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n", | ||
2298 | journal->j_tail_sequence); | ||
2299 | |||
2300 | diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c | ||
2301 | index 74d9be1..6bec5c0 100644 | ||
2302 | --- a/fs/jffs2/wbuf.c | ||
2303 | +++ b/fs/jffs2/wbuf.c | ||
2304 | @@ -1043,10 +1043,10 @@ int jffs2_check_oob_empty(struct jffs2_sb_info *c, | ||
2305 | ops.datbuf = NULL; | ||
2306 | |||
2307 | ret = mtd_read_oob(c->mtd, jeb->offset, &ops); | ||
2308 | - if (ret || ops.oobretlen != ops.ooblen) { | ||
2309 | + if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) { | ||
2310 | pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n", | ||
2311 | jeb->offset, ops.ooblen, ops.oobretlen, ret); | ||
2312 | - if (!ret) | ||
2313 | + if (!ret || mtd_is_bitflip(ret)) | ||
2314 | ret = -EIO; | ||
2315 | return ret; | ||
2316 | } | ||
2317 | @@ -1085,10 +1085,10 @@ int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, | ||
2318 | ops.datbuf = NULL; | ||
2319 | |||
2320 | ret = mtd_read_oob(c->mtd, jeb->offset, &ops); | ||
2321 | - if (ret || ops.oobretlen != ops.ooblen) { | ||
2322 | + if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) { | ||
2323 | pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n", | ||
2324 | jeb->offset, ops.ooblen, ops.oobretlen, ret); | ||
2325 | - if (!ret) | ||
2326 | + if (!ret || mtd_is_bitflip(ret)) | ||
2327 | ret = -EIO; | ||
2328 | return ret; | ||
2329 | } | ||
2330 | diff --git a/fs/proc/page.c b/fs/proc/page.c | ||
2331 | index 7fcd0d6..b8730d9 100644 | ||
2332 | --- a/fs/proc/page.c | ||
2333 | +++ b/fs/proc/page.c | ||
2334 | @@ -115,7 +115,13 @@ u64 stable_page_flags(struct page *page) | ||
2335 | u |= 1 << KPF_COMPOUND_TAIL; | ||
2336 | if (PageHuge(page)) | ||
2337 | u |= 1 << KPF_HUGE; | ||
2338 | - else if (PageTransCompound(page)) | ||
2339 | + /* | ||
2340 | + * PageTransCompound can be true for non-huge compound pages (slab | ||
2341 | + * pages or pages allocated by drivers with __GFP_COMP) because it | ||
2342 | + * just checks PG_head/PG_tail, so we need to check PageLRU to make | ||
2343 | + * sure a given page is a thp, not a non-huge compound page. | ||
2344 | + */ | ||
2345 | + else if (PageTransCompound(page) && PageLRU(compound_trans_head(page))) | ||
2346 | u |= 1 << KPF_THP; | ||
2347 | |||
2348 | /* | ||
2349 | diff --git a/fs/udf/super.c b/fs/udf/super.c | ||
2350 | index e660ffd..4988a8a 100644 | ||
2351 | --- a/fs/udf/super.c | ||
2352 | +++ b/fs/udf/super.c | ||
2353 | @@ -1287,6 +1287,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | ||
2354 | udf_err(sb, "error loading logical volume descriptor: " | ||
2355 | "Partition table too long (%u > %lu)\n", table_len, | ||
2356 | sb->s_blocksize - sizeof(*lvd)); | ||
2357 | + ret = 1; | ||
2358 | goto out_bh; | ||
2359 | } | ||
2360 | |||
2361 | @@ -1331,8 +1332,10 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | ||
2362 | UDF_ID_SPARABLE, | ||
2363 | strlen(UDF_ID_SPARABLE))) { | ||
2364 | if (udf_load_sparable_map(sb, map, | ||
2365 | - (struct sparablePartitionMap *)gpm) < 0) | ||
2366 | + (struct sparablePartitionMap *)gpm) < 0) { | ||
2367 | + ret = 1; | ||
2368 | goto out_bh; | ||
2369 | + } | ||
2370 | } else if (!strncmp(upm2->partIdent.ident, | ||
2371 | UDF_ID_METADATA, | ||
2372 | strlen(UDF_ID_METADATA))) { | ||
2373 | diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h | ||
2374 | index 7c727a9..0abf1d4 100644 | ||
2375 | --- a/include/linux/mempolicy.h | ||
2376 | +++ b/include/linux/mempolicy.h | ||
2377 | @@ -188,7 +188,7 @@ struct sp_node { | ||
2378 | |||
2379 | struct shared_policy { | ||
2380 | struct rb_root root; | ||
2381 | - spinlock_t lock; | ||
2382 | + struct mutex mutex; | ||
2383 | }; | ||
2384 | |||
2385 | void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol); | ||
2386 | diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h | ||
2387 | index 22e61fd..28e493b 100644 | ||
2388 | --- a/include/linux/xfrm.h | ||
2389 | +++ b/include/linux/xfrm.h | ||
2390 | @@ -84,6 +84,8 @@ struct xfrm_replay_state { | ||
2391 | __u32 bitmap; | ||
2392 | }; | ||
2393 | |||
2394 | +#define XFRMA_REPLAY_ESN_MAX 4096 | ||
2395 | + | ||
2396 | struct xfrm_replay_state_esn { | ||
2397 | unsigned int bmp_len; | ||
2398 | __u32 oseq; | ||
2399 | diff --git a/include/net/xfrm.h b/include/net/xfrm.h | ||
2400 | index 96239e7..9f7e94b 100644 | ||
2401 | --- a/include/net/xfrm.h | ||
2402 | +++ b/include/net/xfrm.h | ||
2403 | @@ -269,6 +269,9 @@ struct xfrm_replay { | ||
2404 | int (*check)(struct xfrm_state *x, | ||
2405 | struct sk_buff *skb, | ||
2406 | __be32 net_seq); | ||
2407 | + int (*recheck)(struct xfrm_state *x, | ||
2408 | + struct sk_buff *skb, | ||
2409 | + __be32 net_seq); | ||
2410 | void (*notify)(struct xfrm_state *x, int event); | ||
2411 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); | ||
2412 | }; | ||
2413 | diff --git a/kernel/cpuset.c b/kernel/cpuset.c | ||
2414 | index 14f7070..5fc1570 100644 | ||
2415 | --- a/kernel/cpuset.c | ||
2416 | +++ b/kernel/cpuset.c | ||
2417 | @@ -2065,6 +2065,9 @@ static void scan_for_empty_cpusets(struct cpuset *root) | ||
2418 | * (of no affect) on systems that are actively using CPU hotplug | ||
2419 | * but making no active use of cpusets. | ||
2420 | * | ||
2421 | + * The only exception to this is suspend/resume, where we don't | ||
2422 | + * modify cpusets at all. | ||
2423 | + * | ||
2424 | * This routine ensures that top_cpuset.cpus_allowed tracks | ||
2425 | * cpu_active_mask on each CPU hotplug (cpuhp) event. | ||
2426 | * | ||
2427 | diff --git a/kernel/rcutree.c b/kernel/rcutree.c | ||
2428 | index d0c5baf..4eec66e 100644 | ||
2429 | --- a/kernel/rcutree.c | ||
2430 | +++ b/kernel/rcutree.c | ||
2431 | @@ -295,7 +295,9 @@ cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp) | ||
2432 | static int | ||
2433 | cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp) | ||
2434 | { | ||
2435 | - return *rdp->nxttail[RCU_DONE_TAIL] && !rcu_gp_in_progress(rsp); | ||
2436 | + return *rdp->nxttail[RCU_DONE_TAIL + | ||
2437 | + ACCESS_ONCE(rsp->completed) != rdp->completed] && | ||
2438 | + !rcu_gp_in_progress(rsp); | ||
2439 | } | ||
2440 | |||
2441 | /* | ||
2442 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
2443 | index 593087b..1d22981 100644 | ||
2444 | --- a/kernel/sched/core.c | ||
2445 | +++ b/kernel/sched/core.c | ||
2446 | @@ -6937,34 +6937,66 @@ int __init sched_create_sysfs_power_savings_entries(struct device *dev) | ||
2447 | } | ||
2448 | #endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */ | ||
2449 | |||
2450 | +static int num_cpus_frozen; /* used to mark begin/end of suspend/resume */ | ||
2451 | + | ||
2452 | /* | ||
2453 | * Update cpusets according to cpu_active mask. If cpusets are | ||
2454 | * disabled, cpuset_update_active_cpus() becomes a simple wrapper | ||
2455 | * around partition_sched_domains(). | ||
2456 | + * | ||
2457 | + * If we come here as part of a suspend/resume, don't touch cpusets because we | ||
2458 | + * want to restore it back to its original state upon resume anyway. | ||
2459 | */ | ||
2460 | static int cpuset_cpu_active(struct notifier_block *nfb, unsigned long action, | ||
2461 | void *hcpu) | ||
2462 | { | ||
2463 | - switch (action & ~CPU_TASKS_FROZEN) { | ||
2464 | + switch (action) { | ||
2465 | + case CPU_ONLINE_FROZEN: | ||
2466 | + case CPU_DOWN_FAILED_FROZEN: | ||
2467 | + | ||
2468 | + /* | ||
2469 | + * num_cpus_frozen tracks how many CPUs are involved in suspend | ||
2470 | + * resume sequence. As long as this is not the last online | ||
2471 | + * operation in the resume sequence, just build a single sched | ||
2472 | + * domain, ignoring cpusets. | ||
2473 | + */ | ||
2474 | + num_cpus_frozen--; | ||
2475 | + if (likely(num_cpus_frozen)) { | ||
2476 | + partition_sched_domains(1, NULL, NULL); | ||
2477 | + break; | ||
2478 | + } | ||
2479 | + | ||
2480 | + /* | ||
2481 | + * This is the last CPU online operation. So fall through and | ||
2482 | + * restore the original sched domains by considering the | ||
2483 | + * cpuset configurations. | ||
2484 | + */ | ||
2485 | + | ||
2486 | case CPU_ONLINE: | ||
2487 | case CPU_DOWN_FAILED: | ||
2488 | cpuset_update_active_cpus(); | ||
2489 | - return NOTIFY_OK; | ||
2490 | + break; | ||
2491 | default: | ||
2492 | return NOTIFY_DONE; | ||
2493 | } | ||
2494 | + return NOTIFY_OK; | ||
2495 | } | ||
2496 | |||
2497 | static int cpuset_cpu_inactive(struct notifier_block *nfb, unsigned long action, | ||
2498 | void *hcpu) | ||
2499 | { | ||
2500 | - switch (action & ~CPU_TASKS_FROZEN) { | ||
2501 | + switch (action) { | ||
2502 | case CPU_DOWN_PREPARE: | ||
2503 | cpuset_update_active_cpus(); | ||
2504 | - return NOTIFY_OK; | ||
2505 | + break; | ||
2506 | + case CPU_DOWN_PREPARE_FROZEN: | ||
2507 | + num_cpus_frozen++; | ||
2508 | + partition_sched_domains(1, NULL, NULL); | ||
2509 | + break; | ||
2510 | default: | ||
2511 | return NOTIFY_DONE; | ||
2512 | } | ||
2513 | + return NOTIFY_OK; | ||
2514 | } | ||
2515 | |||
2516 | void __init sched_init_smp(void) | ||
2517 | diff --git a/kernel/sched/stop_task.c b/kernel/sched/stop_task.c | ||
2518 | index 7b386e8..da5eb5b 100644 | ||
2519 | --- a/kernel/sched/stop_task.c | ||
2520 | +++ b/kernel/sched/stop_task.c | ||
2521 | @@ -27,8 +27,10 @@ static struct task_struct *pick_next_task_stop(struct rq *rq) | ||
2522 | { | ||
2523 | struct task_struct *stop = rq->stop; | ||
2524 | |||
2525 | - if (stop && stop->on_rq) | ||
2526 | + if (stop && stop->on_rq) { | ||
2527 | + stop->se.exec_start = rq->clock_task; | ||
2528 | return stop; | ||
2529 | + } | ||
2530 | |||
2531 | return NULL; | ||
2532 | } | ||
2533 | @@ -52,6 +54,21 @@ static void yield_task_stop(struct rq *rq) | ||
2534 | |||
2535 | static void put_prev_task_stop(struct rq *rq, struct task_struct *prev) | ||
2536 | { | ||
2537 | + struct task_struct *curr = rq->curr; | ||
2538 | + u64 delta_exec; | ||
2539 | + | ||
2540 | + delta_exec = rq->clock_task - curr->se.exec_start; | ||
2541 | + if (unlikely((s64)delta_exec < 0)) | ||
2542 | + delta_exec = 0; | ||
2543 | + | ||
2544 | + schedstat_set(curr->se.statistics.exec_max, | ||
2545 | + max(curr->se.statistics.exec_max, delta_exec)); | ||
2546 | + | ||
2547 | + curr->se.sum_exec_runtime += delta_exec; | ||
2548 | + account_group_exec_runtime(curr, delta_exec); | ||
2549 | + | ||
2550 | + curr->se.exec_start = rq->clock_task; | ||
2551 | + cpuacct_charge(curr, delta_exec); | ||
2552 | } | ||
2553 | |||
2554 | static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued) | ||
2555 | @@ -60,6 +77,9 @@ static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued) | ||
2556 | |||
2557 | static void set_curr_task_stop(struct rq *rq) | ||
2558 | { | ||
2559 | + struct task_struct *stop = rq->stop; | ||
2560 | + | ||
2561 | + stop->se.exec_start = rq->clock_task; | ||
2562 | } | ||
2563 | |||
2564 | static void switched_to_stop(struct rq *rq, struct task_struct *p) | ||
2565 | diff --git a/kernel/sys.c b/kernel/sys.c | ||
2566 | index e7006eb..898a84c 100644 | ||
2567 | --- a/kernel/sys.c | ||
2568 | +++ b/kernel/sys.c | ||
2569 | @@ -365,6 +365,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); | ||
2570 | void kernel_restart(char *cmd) | ||
2571 | { | ||
2572 | kernel_restart_prepare(cmd); | ||
2573 | + disable_nonboot_cpus(); | ||
2574 | if (!cmd) | ||
2575 | printk(KERN_EMERG "Restarting system.\n"); | ||
2576 | else | ||
2577 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
2578 | index 7584322..56f793d 100644 | ||
2579 | --- a/kernel/workqueue.c | ||
2580 | +++ b/kernel/workqueue.c | ||
2581 | @@ -1864,7 +1864,9 @@ __acquires(&gcwq->lock) | ||
2582 | |||
2583 | spin_unlock_irq(&gcwq->lock); | ||
2584 | |||
2585 | + smp_wmb(); /* paired with test_and_set_bit(PENDING) */ | ||
2586 | work_clear_pending(work); | ||
2587 | + | ||
2588 | lock_map_acquire_read(&cwq->wq->lockdep_map); | ||
2589 | lock_map_acquire(&lockdep_map); | ||
2590 | trace_workqueue_execute_start(work); | ||
2591 | diff --git a/lib/gcd.c b/lib/gcd.c | ||
2592 | index cce4f3c..3657f12 100644 | ||
2593 | --- a/lib/gcd.c | ||
2594 | +++ b/lib/gcd.c | ||
2595 | @@ -9,6 +9,9 @@ unsigned long gcd(unsigned long a, unsigned long b) | ||
2596 | |||
2597 | if (a < b) | ||
2598 | swap(a, b); | ||
2599 | + | ||
2600 | + if (!b) | ||
2601 | + return a; | ||
2602 | while ((r = a % b) != 0) { | ||
2603 | a = b; | ||
2604 | b = r; | ||
2605 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
2606 | index a799df5..c384e09 100644 | ||
2607 | --- a/mm/hugetlb.c | ||
2608 | +++ b/mm/hugetlb.c | ||
2609 | @@ -2431,7 +2431,8 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma, | ||
2610 | * from page cache lookup which is in HPAGE_SIZE units. | ||
2611 | */ | ||
2612 | address = address & huge_page_mask(h); | ||
2613 | - pgoff = vma_hugecache_offset(h, vma, address); | ||
2614 | + pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) + | ||
2615 | + vma->vm_pgoff; | ||
2616 | mapping = vma->vm_file->f_dentry->d_inode->i_mapping; | ||
2617 | |||
2618 | /* | ||
2619 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
2620 | index 9afcbad..d1e4bef 100644 | ||
2621 | --- a/mm/mempolicy.c | ||
2622 | +++ b/mm/mempolicy.c | ||
2623 | @@ -607,6 +607,42 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, | ||
2624 | return first; | ||
2625 | } | ||
2626 | |||
2627 | +/* | ||
2628 | + * Apply policy to a single VMA | ||
2629 | + * This must be called with the mmap_sem held for writing. | ||
2630 | + */ | ||
2631 | +static int vma_replace_policy(struct vm_area_struct *vma, | ||
2632 | + struct mempolicy *pol) | ||
2633 | +{ | ||
2634 | + int err; | ||
2635 | + struct mempolicy *old; | ||
2636 | + struct mempolicy *new; | ||
2637 | + | ||
2638 | + pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", | ||
2639 | + vma->vm_start, vma->vm_end, vma->vm_pgoff, | ||
2640 | + vma->vm_ops, vma->vm_file, | ||
2641 | + vma->vm_ops ? vma->vm_ops->set_policy : NULL); | ||
2642 | + | ||
2643 | + new = mpol_dup(pol); | ||
2644 | + if (IS_ERR(new)) | ||
2645 | + return PTR_ERR(new); | ||
2646 | + | ||
2647 | + if (vma->vm_ops && vma->vm_ops->set_policy) { | ||
2648 | + err = vma->vm_ops->set_policy(vma, new); | ||
2649 | + if (err) | ||
2650 | + goto err_out; | ||
2651 | + } | ||
2652 | + | ||
2653 | + old = vma->vm_policy; | ||
2654 | + vma->vm_policy = new; /* protected by mmap_sem */ | ||
2655 | + mpol_put(old); | ||
2656 | + | ||
2657 | + return 0; | ||
2658 | + err_out: | ||
2659 | + mpol_put(new); | ||
2660 | + return err; | ||
2661 | +} | ||
2662 | + | ||
2663 | /* Step 2: apply policy to a range and do splits. */ | ||
2664 | static int mbind_range(struct mm_struct *mm, unsigned long start, | ||
2665 | unsigned long end, struct mempolicy *new_pol) | ||
2666 | @@ -655,23 +691,9 @@ static int mbind_range(struct mm_struct *mm, unsigned long start, | ||
2667 | if (err) | ||
2668 | goto out; | ||
2669 | } | ||
2670 | - | ||
2671 | - /* | ||
2672 | - * Apply policy to a single VMA. The reference counting of | ||
2673 | - * policy for vma_policy linkages has already been handled by | ||
2674 | - * vma_merge and split_vma as necessary. If this is a shared | ||
2675 | - * policy then ->set_policy will increment the reference count | ||
2676 | - * for an sp node. | ||
2677 | - */ | ||
2678 | - pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n", | ||
2679 | - vma->vm_start, vma->vm_end, vma->vm_pgoff, | ||
2680 | - vma->vm_ops, vma->vm_file, | ||
2681 | - vma->vm_ops ? vma->vm_ops->set_policy : NULL); | ||
2682 | - if (vma->vm_ops && vma->vm_ops->set_policy) { | ||
2683 | - err = vma->vm_ops->set_policy(vma, new_pol); | ||
2684 | - if (err) | ||
2685 | - goto out; | ||
2686 | - } | ||
2687 | + err = vma_replace_policy(vma, new_pol); | ||
2688 | + if (err) | ||
2689 | + goto out; | ||
2690 | } | ||
2691 | |||
2692 | out: | ||
2693 | @@ -1510,8 +1532,18 @@ struct mempolicy *get_vma_policy(struct task_struct *task, | ||
2694 | addr); | ||
2695 | if (vpol) | ||
2696 | pol = vpol; | ||
2697 | - } else if (vma->vm_policy) | ||
2698 | + } else if (vma->vm_policy) { | ||
2699 | pol = vma->vm_policy; | ||
2700 | + | ||
2701 | + /* | ||
2702 | + * shmem_alloc_page() passes MPOL_F_SHARED policy with | ||
2703 | + * a pseudo vma whose vma->vm_ops=NULL. Take a reference | ||
2704 | + * count on these policies which will be dropped by | ||
2705 | + * mpol_cond_put() later | ||
2706 | + */ | ||
2707 | + if (mpol_needs_cond_ref(pol)) | ||
2708 | + mpol_get(pol); | ||
2709 | + } | ||
2710 | } | ||
2711 | if (!pol) | ||
2712 | pol = &default_policy; | ||
2713 | @@ -2035,7 +2067,7 @@ bool __mpol_equal(struct mempolicy *a, struct mempolicy *b) | ||
2714 | */ | ||
2715 | |||
2716 | /* lookup first element intersecting start-end */ | ||
2717 | -/* Caller holds sp->lock */ | ||
2718 | +/* Caller holds sp->mutex */ | ||
2719 | static struct sp_node * | ||
2720 | sp_lookup(struct shared_policy *sp, unsigned long start, unsigned long end) | ||
2721 | { | ||
2722 | @@ -2099,36 +2131,50 @@ mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx) | ||
2723 | |||
2724 | if (!sp->root.rb_node) | ||
2725 | return NULL; | ||
2726 | - spin_lock(&sp->lock); | ||
2727 | + mutex_lock(&sp->mutex); | ||
2728 | sn = sp_lookup(sp, idx, idx+1); | ||
2729 | if (sn) { | ||
2730 | mpol_get(sn->policy); | ||
2731 | pol = sn->policy; | ||
2732 | } | ||
2733 | - spin_unlock(&sp->lock); | ||
2734 | + mutex_unlock(&sp->mutex); | ||
2735 | return pol; | ||
2736 | } | ||
2737 | |||
2738 | +static void sp_free(struct sp_node *n) | ||
2739 | +{ | ||
2740 | + mpol_put(n->policy); | ||
2741 | + kmem_cache_free(sn_cache, n); | ||
2742 | +} | ||
2743 | + | ||
2744 | static void sp_delete(struct shared_policy *sp, struct sp_node *n) | ||
2745 | { | ||
2746 | pr_debug("deleting %lx-l%lx\n", n->start, n->end); | ||
2747 | rb_erase(&n->nd, &sp->root); | ||
2748 | - mpol_put(n->policy); | ||
2749 | - kmem_cache_free(sn_cache, n); | ||
2750 | + sp_free(n); | ||
2751 | } | ||
2752 | |||
2753 | static struct sp_node *sp_alloc(unsigned long start, unsigned long end, | ||
2754 | struct mempolicy *pol) | ||
2755 | { | ||
2756 | - struct sp_node *n = kmem_cache_alloc(sn_cache, GFP_KERNEL); | ||
2757 | + struct sp_node *n; | ||
2758 | + struct mempolicy *newpol; | ||
2759 | |||
2760 | + n = kmem_cache_alloc(sn_cache, GFP_KERNEL); | ||
2761 | if (!n) | ||
2762 | return NULL; | ||
2763 | + | ||
2764 | + newpol = mpol_dup(pol); | ||
2765 | + if (IS_ERR(newpol)) { | ||
2766 | + kmem_cache_free(sn_cache, n); | ||
2767 | + return NULL; | ||
2768 | + } | ||
2769 | + newpol->flags |= MPOL_F_SHARED; | ||
2770 | + | ||
2771 | n->start = start; | ||
2772 | n->end = end; | ||
2773 | - mpol_get(pol); | ||
2774 | - pol->flags |= MPOL_F_SHARED; /* for unref */ | ||
2775 | - n->policy = pol; | ||
2776 | + n->policy = newpol; | ||
2777 | + | ||
2778 | return n; | ||
2779 | } | ||
2780 | |||
2781 | @@ -2136,10 +2182,10 @@ static struct sp_node *sp_alloc(unsigned long start, unsigned long end, | ||
2782 | static int shared_policy_replace(struct shared_policy *sp, unsigned long start, | ||
2783 | unsigned long end, struct sp_node *new) | ||
2784 | { | ||
2785 | - struct sp_node *n, *new2 = NULL; | ||
2786 | + struct sp_node *n; | ||
2787 | + int ret = 0; | ||
2788 | |||
2789 | -restart: | ||
2790 | - spin_lock(&sp->lock); | ||
2791 | + mutex_lock(&sp->mutex); | ||
2792 | n = sp_lookup(sp, start, end); | ||
2793 | /* Take care of old policies in the same range. */ | ||
2794 | while (n && n->start < end) { | ||
2795 | @@ -2152,16 +2198,14 @@ restart: | ||
2796 | } else { | ||
2797 | /* Old policy spanning whole new range. */ | ||
2798 | if (n->end > end) { | ||
2799 | + struct sp_node *new2; | ||
2800 | + new2 = sp_alloc(end, n->end, n->policy); | ||
2801 | if (!new2) { | ||
2802 | - spin_unlock(&sp->lock); | ||
2803 | - new2 = sp_alloc(end, n->end, n->policy); | ||
2804 | - if (!new2) | ||
2805 | - return -ENOMEM; | ||
2806 | - goto restart; | ||
2807 | + ret = -ENOMEM; | ||
2808 | + goto out; | ||
2809 | } | ||
2810 | n->end = start; | ||
2811 | sp_insert(sp, new2); | ||
2812 | - new2 = NULL; | ||
2813 | break; | ||
2814 | } else | ||
2815 | n->end = start; | ||
2816 | @@ -2172,12 +2216,9 @@ restart: | ||
2817 | } | ||
2818 | if (new) | ||
2819 | sp_insert(sp, new); | ||
2820 | - spin_unlock(&sp->lock); | ||
2821 | - if (new2) { | ||
2822 | - mpol_put(new2->policy); | ||
2823 | - kmem_cache_free(sn_cache, new2); | ||
2824 | - } | ||
2825 | - return 0; | ||
2826 | +out: | ||
2827 | + mutex_unlock(&sp->mutex); | ||
2828 | + return ret; | ||
2829 | } | ||
2830 | |||
2831 | /** | ||
2832 | @@ -2195,7 +2236,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol) | ||
2833 | int ret; | ||
2834 | |||
2835 | sp->root = RB_ROOT; /* empty tree == default mempolicy */ | ||
2836 | - spin_lock_init(&sp->lock); | ||
2837 | + mutex_init(&sp->mutex); | ||
2838 | |||
2839 | if (mpol) { | ||
2840 | struct vm_area_struct pvma; | ||
2841 | @@ -2249,7 +2290,7 @@ int mpol_set_shared_policy(struct shared_policy *info, | ||
2842 | } | ||
2843 | err = shared_policy_replace(info, vma->vm_pgoff, vma->vm_pgoff+sz, new); | ||
2844 | if (err && new) | ||
2845 | - kmem_cache_free(sn_cache, new); | ||
2846 | + sp_free(new); | ||
2847 | return err; | ||
2848 | } | ||
2849 | |||
2850 | @@ -2261,16 +2302,14 @@ void mpol_free_shared_policy(struct shared_policy *p) | ||
2851 | |||
2852 | if (!p->root.rb_node) | ||
2853 | return; | ||
2854 | - spin_lock(&p->lock); | ||
2855 | + mutex_lock(&p->mutex); | ||
2856 | next = rb_first(&p->root); | ||
2857 | while (next) { | ||
2858 | n = rb_entry(next, struct sp_node, nd); | ||
2859 | next = rb_next(&n->nd); | ||
2860 | - rb_erase(&n->nd, &p->root); | ||
2861 | - mpol_put(n->policy); | ||
2862 | - kmem_cache_free(sn_cache, n); | ||
2863 | + sp_delete(p, n); | ||
2864 | } | ||
2865 | - spin_unlock(&p->lock); | ||
2866 | + mutex_unlock(&p->mutex); | ||
2867 | } | ||
2868 | |||
2869 | /* assumes fs == KERNEL_DS */ | ||
2870 | diff --git a/mm/slab.c b/mm/slab.c | ||
2871 | index e901a36..da2bb68 100644 | ||
2872 | --- a/mm/slab.c | ||
2873 | +++ b/mm/slab.c | ||
2874 | @@ -1685,9 +1685,6 @@ void __init kmem_cache_init_late(void) | ||
2875 | |||
2876 | g_cpucache_up = LATE; | ||
2877 | |||
2878 | - /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
2879 | - init_lock_keys(); | ||
2880 | - | ||
2881 | /* 6) resize the head arrays to their final sizes */ | ||
2882 | mutex_lock(&cache_chain_mutex); | ||
2883 | list_for_each_entry(cachep, &cache_chain, next) | ||
2884 | @@ -1695,6 +1692,9 @@ void __init kmem_cache_init_late(void) | ||
2885 | BUG(); | ||
2886 | mutex_unlock(&cache_chain_mutex); | ||
2887 | |||
2888 | + /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
2889 | + init_lock_keys(); | ||
2890 | + | ||
2891 | /* Done! */ | ||
2892 | g_cpucache_up = FULL; | ||
2893 | |||
2894 | diff --git a/mm/truncate.c b/mm/truncate.c | ||
2895 | index 61a183b..4224627 100644 | ||
2896 | --- a/mm/truncate.c | ||
2897 | +++ b/mm/truncate.c | ||
2898 | @@ -394,11 +394,12 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page) | ||
2899 | if (page_has_private(page) && !try_to_release_page(page, GFP_KERNEL)) | ||
2900 | return 0; | ||
2901 | |||
2902 | + clear_page_mlock(page); | ||
2903 | + | ||
2904 | spin_lock_irq(&mapping->tree_lock); | ||
2905 | if (PageDirty(page)) | ||
2906 | goto failed; | ||
2907 | |||
2908 | - clear_page_mlock(page); | ||
2909 | BUG_ON(page_has_private(page)); | ||
2910 | __delete_from_page_cache(page); | ||
2911 | spin_unlock_irq(&mapping->tree_lock); | ||
2912 | diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c | ||
2913 | index 4d39d80..f364630 100644 | ||
2914 | --- a/net/8021q/vlan_core.c | ||
2915 | +++ b/net/8021q/vlan_core.c | ||
2916 | @@ -106,7 +106,6 @@ static struct sk_buff *vlan_reorder_header(struct sk_buff *skb) | ||
2917 | return NULL; | ||
2918 | memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN); | ||
2919 | skb->mac_header += VLAN_HLEN; | ||
2920 | - skb_reset_mac_len(skb); | ||
2921 | return skb; | ||
2922 | } | ||
2923 | |||
2924 | @@ -140,6 +139,8 @@ struct sk_buff *vlan_untag(struct sk_buff *skb) | ||
2925 | |||
2926 | skb_reset_network_header(skb); | ||
2927 | skb_reset_transport_header(skb); | ||
2928 | + skb_reset_mac_len(skb); | ||
2929 | + | ||
2930 | return skb; | ||
2931 | |||
2932 | err_free: | ||
2933 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
2934 | index 3fd9cae..086bc2e 100644 | ||
2935 | --- a/net/core/dev.c | ||
2936 | +++ b/net/core/dev.c | ||
2937 | @@ -2121,7 +2121,8 @@ static bool can_checksum_protocol(netdev_features_t features, __be16 protocol) | ||
2938 | static netdev_features_t harmonize_features(struct sk_buff *skb, | ||
2939 | __be16 protocol, netdev_features_t features) | ||
2940 | { | ||
2941 | - if (!can_checksum_protocol(features, protocol)) { | ||
2942 | + if (skb->ip_summed != CHECKSUM_NONE && | ||
2943 | + !can_checksum_protocol(features, protocol)) { | ||
2944 | features &= ~NETIF_F_ALL_CSUM; | ||
2945 | features &= ~NETIF_F_SG; | ||
2946 | } else if (illegal_highdma(skb->dev, skb)) { | ||
2947 | @@ -2617,15 +2618,16 @@ void __skb_get_rxhash(struct sk_buff *skb) | ||
2948 | if (!skb_flow_dissect(skb, &keys)) | ||
2949 | return; | ||
2950 | |||
2951 | - if (keys.ports) { | ||
2952 | - if ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]) | ||
2953 | - swap(keys.port16[0], keys.port16[1]); | ||
2954 | + if (keys.ports) | ||
2955 | skb->l4_rxhash = 1; | ||
2956 | - } | ||
2957 | |||
2958 | /* get a consistent hash (same value on both flow directions) */ | ||
2959 | - if ((__force u32)keys.dst < (__force u32)keys.src) | ||
2960 | + if (((__force u32)keys.dst < (__force u32)keys.src) || | ||
2961 | + (((__force u32)keys.dst == (__force u32)keys.src) && | ||
2962 | + ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]))) { | ||
2963 | swap(keys.dst, keys.src); | ||
2964 | + swap(keys.port16[0], keys.port16[1]); | ||
2965 | + } | ||
2966 | |||
2967 | hash = jhash_3words((__force u32)keys.dst, | ||
2968 | (__force u32)keys.src, | ||
2969 | diff --git a/net/core/sock.c b/net/core/sock.c | ||
2970 | index d3e0a52..4b469e3 100644 | ||
2971 | --- a/net/core/sock.c | ||
2972 | +++ b/net/core/sock.c | ||
2973 | @@ -644,7 +644,8 @@ set_rcvbuf: | ||
2974 | |||
2975 | case SO_KEEPALIVE: | ||
2976 | #ifdef CONFIG_INET | ||
2977 | - if (sk->sk_protocol == IPPROTO_TCP) | ||
2978 | + if (sk->sk_protocol == IPPROTO_TCP && | ||
2979 | + sk->sk_type == SOCK_STREAM) | ||
2980 | tcp_set_keepalive(sk, valbool); | ||
2981 | #endif | ||
2982 | sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool); | ||
2983 | diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c | ||
2984 | index bbd604c..2fe0dc2 100644 | ||
2985 | --- a/net/ipv4/raw.c | ||
2986 | +++ b/net/ipv4/raw.c | ||
2987 | @@ -131,18 +131,20 @@ found: | ||
2988 | * 0 - deliver | ||
2989 | * 1 - block | ||
2990 | */ | ||
2991 | -static __inline__ int icmp_filter(struct sock *sk, struct sk_buff *skb) | ||
2992 | +static int icmp_filter(const struct sock *sk, const struct sk_buff *skb) | ||
2993 | { | ||
2994 | - int type; | ||
2995 | + struct icmphdr _hdr; | ||
2996 | + const struct icmphdr *hdr; | ||
2997 | |||
2998 | - if (!pskb_may_pull(skb, sizeof(struct icmphdr))) | ||
2999 | + hdr = skb_header_pointer(skb, skb_transport_offset(skb), | ||
3000 | + sizeof(_hdr), &_hdr); | ||
3001 | + if (!hdr) | ||
3002 | return 1; | ||
3003 | |||
3004 | - type = icmp_hdr(skb)->type; | ||
3005 | - if (type < 32) { | ||
3006 | + if (hdr->type < 32) { | ||
3007 | __u32 data = raw_sk(sk)->filter.data; | ||
3008 | |||
3009 | - return ((1 << type) & data) != 0; | ||
3010 | + return ((1U << hdr->type) & data) != 0; | ||
3011 | } | ||
3012 | |||
3013 | /* Do not block unknown ICMP types */ | ||
3014 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
3015 | index 367bdaf..8fbe2e2 100644 | ||
3016 | --- a/net/ipv4/tcp.c | ||
3017 | +++ b/net/ipv4/tcp.c | ||
3018 | @@ -1594,8 +1594,14 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | ||
3019 | } | ||
3020 | |||
3021 | #ifdef CONFIG_NET_DMA | ||
3022 | - if (tp->ucopy.dma_chan) | ||
3023 | - dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
3024 | + if (tp->ucopy.dma_chan) { | ||
3025 | + if (tp->rcv_wnd == 0 && | ||
3026 | + !skb_queue_empty(&sk->sk_async_wait_queue)) { | ||
3027 | + tcp_service_net_dma(sk, true); | ||
3028 | + tcp_cleanup_rbuf(sk, copied); | ||
3029 | + } else | ||
3030 | + dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
3031 | + } | ||
3032 | #endif | ||
3033 | if (copied >= target) { | ||
3034 | /* Do not sleep, just process backlog. */ | ||
3035 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c | ||
3036 | index 2c69eca..5ec6069 100644 | ||
3037 | --- a/net/ipv6/addrconf.c | ||
3038 | +++ b/net/ipv6/addrconf.c | ||
3039 | @@ -793,10 +793,16 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | ||
3040 | struct in6_addr prefix; | ||
3041 | struct rt6_info *rt; | ||
3042 | struct net *net = dev_net(ifp->idev->dev); | ||
3043 | + struct flowi6 fl6 = {}; | ||
3044 | + | ||
3045 | ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len); | ||
3046 | - rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1); | ||
3047 | + fl6.flowi6_oif = ifp->idev->dev->ifindex; | ||
3048 | + fl6.daddr = prefix; | ||
3049 | + rt = (struct rt6_info *)ip6_route_lookup(net, &fl6, | ||
3050 | + RT6_LOOKUP_F_IFACE); | ||
3051 | |||
3052 | - if (rt && addrconf_is_prefix_route(rt)) { | ||
3053 | + if (rt != net->ipv6.ip6_null_entry && | ||
3054 | + addrconf_is_prefix_route(rt)) { | ||
3055 | if (onlink == 0) { | ||
3056 | ip6_del_rt(rt); | ||
3057 | rt = NULL; | ||
3058 | diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c | ||
3059 | index 92bb9cb..c3a007d 100644 | ||
3060 | --- a/net/ipv6/ip6_fib.c | ||
3061 | +++ b/net/ipv6/ip6_fib.c | ||
3062 | @@ -818,6 +818,10 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info) | ||
3063 | offsetof(struct rt6_info, rt6i_src), | ||
3064 | allow_create, replace_required); | ||
3065 | |||
3066 | + if (IS_ERR(sn)) { | ||
3067 | + err = PTR_ERR(sn); | ||
3068 | + sn = NULL; | ||
3069 | + } | ||
3070 | if (!sn) { | ||
3071 | /* If it is failed, discard just allocated | ||
3072 | root, and then (in st_failure) stale node | ||
3073 | diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c | ||
3074 | index 7e1e0fb..740c919 100644 | ||
3075 | --- a/net/ipv6/mip6.c | ||
3076 | +++ b/net/ipv6/mip6.c | ||
3077 | @@ -84,28 +84,30 @@ static int mip6_mh_len(int type) | ||
3078 | |||
3079 | static int mip6_mh_filter(struct sock *sk, struct sk_buff *skb) | ||
3080 | { | ||
3081 | - struct ip6_mh *mh; | ||
3082 | + struct ip6_mh _hdr; | ||
3083 | + const struct ip6_mh *mh; | ||
3084 | |||
3085 | - if (!pskb_may_pull(skb, (skb_transport_offset(skb)) + 8) || | ||
3086 | - !pskb_may_pull(skb, (skb_transport_offset(skb) + | ||
3087 | - ((skb_transport_header(skb)[1] + 1) << 3)))) | ||
3088 | + mh = skb_header_pointer(skb, skb_transport_offset(skb), | ||
3089 | + sizeof(_hdr), &_hdr); | ||
3090 | + if (!mh) | ||
3091 | return -1; | ||
3092 | |||
3093 | - mh = (struct ip6_mh *)skb_transport_header(skb); | ||
3094 | + if (((mh->ip6mh_hdrlen + 1) << 3) > skb->len) | ||
3095 | + return -1; | ||
3096 | |||
3097 | if (mh->ip6mh_hdrlen < mip6_mh_len(mh->ip6mh_type)) { | ||
3098 | LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n", | ||
3099 | mh->ip6mh_hdrlen, mip6_mh_len(mh->ip6mh_type)); | ||
3100 | - mip6_param_prob(skb, 0, ((&mh->ip6mh_hdrlen) - | ||
3101 | - skb_network_header(skb))); | ||
3102 | + mip6_param_prob(skb, 0, offsetof(struct ip6_mh, ip6mh_hdrlen) + | ||
3103 | + skb_network_header_len(skb)); | ||
3104 | return -1; | ||
3105 | } | ||
3106 | |||
3107 | if (mh->ip6mh_proto != IPPROTO_NONE) { | ||
3108 | LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n", | ||
3109 | mh->ip6mh_proto); | ||
3110 | - mip6_param_prob(skb, 0, ((&mh->ip6mh_proto) - | ||
3111 | - skb_network_header(skb))); | ||
3112 | + mip6_param_prob(skb, 0, offsetof(struct ip6_mh, ip6mh_proto) + | ||
3113 | + skb_network_header_len(skb)); | ||
3114 | return -1; | ||
3115 | } | ||
3116 | |||
3117 | diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c | ||
3118 | index 5bddea7..3ee2870 100644 | ||
3119 | --- a/net/ipv6/raw.c | ||
3120 | +++ b/net/ipv6/raw.c | ||
3121 | @@ -107,21 +107,20 @@ found: | ||
3122 | * 0 - deliver | ||
3123 | * 1 - block | ||
3124 | */ | ||
3125 | -static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb) | ||
3126 | +static int icmpv6_filter(const struct sock *sk, const struct sk_buff *skb) | ||
3127 | { | ||
3128 | - struct icmp6hdr *icmph; | ||
3129 | - struct raw6_sock *rp = raw6_sk(sk); | ||
3130 | - | ||
3131 | - if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) { | ||
3132 | - __u32 *data = &rp->filter.data[0]; | ||
3133 | - int bit_nr; | ||
3134 | + struct icmp6hdr *_hdr; | ||
3135 | + const struct icmp6hdr *hdr; | ||
3136 | |||
3137 | - icmph = (struct icmp6hdr *) skb->data; | ||
3138 | - bit_nr = icmph->icmp6_type; | ||
3139 | + hdr = skb_header_pointer(skb, skb_transport_offset(skb), | ||
3140 | + sizeof(_hdr), &_hdr); | ||
3141 | + if (hdr) { | ||
3142 | + const __u32 *data = &raw6_sk(sk)->filter.data[0]; | ||
3143 | + unsigned int type = hdr->icmp6_type; | ||
3144 | |||
3145 | - return (data[bit_nr >> 5] & (1 << (bit_nr & 31))) != 0; | ||
3146 | + return (data[type >> 5] & (1U << (type & 31))) != 0; | ||
3147 | } | ||
3148 | - return 0; | ||
3149 | + return 1; | ||
3150 | } | ||
3151 | |||
3152 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | ||
3153 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
3154 | index c4920ca..2796b37 100644 | ||
3155 | --- a/net/ipv6/route.c | ||
3156 | +++ b/net/ipv6/route.c | ||
3157 | @@ -1485,17 +1485,18 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info) | ||
3158 | struct fib6_table *table; | ||
3159 | struct net *net = dev_net(rt->dst.dev); | ||
3160 | |||
3161 | - if (rt == net->ipv6.ip6_null_entry) | ||
3162 | - return -ENOENT; | ||
3163 | + if (rt == net->ipv6.ip6_null_entry) { | ||
3164 | + err = -ENOENT; | ||
3165 | + goto out; | ||
3166 | + } | ||
3167 | |||
3168 | table = rt->rt6i_table; | ||
3169 | write_lock_bh(&table->tb6_lock); | ||
3170 | - | ||
3171 | err = fib6_del(rt, info); | ||
3172 | - dst_release(&rt->dst); | ||
3173 | - | ||
3174 | write_unlock_bh(&table->tb6_lock); | ||
3175 | |||
3176 | +out: | ||
3177 | + dst_release(&rt->dst); | ||
3178 | return err; | ||
3179 | } | ||
3180 | |||
3181 | diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c | ||
3182 | index 7446038..5c82907 100644 | ||
3183 | --- a/net/l2tp/l2tp_eth.c | ||
3184 | +++ b/net/l2tp/l2tp_eth.c | ||
3185 | @@ -132,7 +132,7 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, | ||
3186 | printk("\n"); | ||
3187 | } | ||
3188 | |||
3189 | - if (!pskb_may_pull(skb, sizeof(ETH_HLEN))) | ||
3190 | + if (!pskb_may_pull(skb, ETH_HLEN)) | ||
3191 | goto error; | ||
3192 | |||
3193 | secpath_reset(skb); | ||
3194 | diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c | ||
3195 | index 06592d8..1b9024e 100644 | ||
3196 | --- a/net/netrom/af_netrom.c | ||
3197 | +++ b/net/netrom/af_netrom.c | ||
3198 | @@ -1169,7 +1169,12 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
3199 | msg->msg_flags |= MSG_TRUNC; | ||
3200 | } | ||
3201 | |||
3202 | - skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | ||
3203 | + er = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | ||
3204 | + if (er < 0) { | ||
3205 | + skb_free_datagram(sk, skb); | ||
3206 | + release_sock(sk); | ||
3207 | + return er; | ||
3208 | + } | ||
3209 | |||
3210 | if (sax != NULL) { | ||
3211 | sax->sax25_family = AF_NETROM; | ||
3212 | diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c | ||
3213 | index 24d94c0..599f67a 100644 | ||
3214 | --- a/net/sched/sch_cbq.c | ||
3215 | +++ b/net/sched/sch_cbq.c | ||
3216 | @@ -250,10 +250,11 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | ||
3217 | else if ((cl = defmap[res.classid & TC_PRIO_MAX]) == NULL) | ||
3218 | cl = defmap[TC_PRIO_BESTEFFORT]; | ||
3219 | |||
3220 | - if (cl == NULL || cl->level >= head->level) | ||
3221 | + if (cl == NULL) | ||
3222 | goto fallback; | ||
3223 | } | ||
3224 | - | ||
3225 | + if (cl->level >= head->level) | ||
3226 | + goto fallback; | ||
3227 | #ifdef CONFIG_NET_CLS_ACT | ||
3228 | switch (result) { | ||
3229 | case TC_ACT_QUEUED: | ||
3230 | diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c | ||
3231 | index e68cb44..cdd474a 100644 | ||
3232 | --- a/net/sched/sch_qfq.c | ||
3233 | +++ b/net/sched/sch_qfq.c | ||
3234 | @@ -830,7 +830,10 @@ static void qfq_update_start(struct qfq_sched *q, struct qfq_class *cl) | ||
3235 | if (mask) { | ||
3236 | struct qfq_group *next = qfq_ffs(q, mask); | ||
3237 | if (qfq_gt(roundedF, next->F)) { | ||
3238 | - cl->S = next->F; | ||
3239 | + if (qfq_gt(limit, next->F)) | ||
3240 | + cl->S = next->F; | ||
3241 | + else /* preserve timestamp correctness */ | ||
3242 | + cl->S = limit; | ||
3243 | return; | ||
3244 | } | ||
3245 | } | ||
3246 | diff --git a/net/sctp/output.c b/net/sctp/output.c | ||
3247 | index 8fc4dcd..32ba8d0 100644 | ||
3248 | --- a/net/sctp/output.c | ||
3249 | +++ b/net/sctp/output.c | ||
3250 | @@ -334,6 +334,25 @@ finish: | ||
3251 | return retval; | ||
3252 | } | ||
3253 | |||
3254 | +static void sctp_packet_release_owner(struct sk_buff *skb) | ||
3255 | +{ | ||
3256 | + sk_free(skb->sk); | ||
3257 | +} | ||
3258 | + | ||
3259 | +static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk) | ||
3260 | +{ | ||
3261 | + skb_orphan(skb); | ||
3262 | + skb->sk = sk; | ||
3263 | + skb->destructor = sctp_packet_release_owner; | ||
3264 | + | ||
3265 | + /* | ||
3266 | + * The data chunks have already been accounted for in sctp_sendmsg(), | ||
3267 | + * therefore only reserve a single byte to keep socket around until | ||
3268 | + * the packet has been transmitted. | ||
3269 | + */ | ||
3270 | + atomic_inc(&sk->sk_wmem_alloc); | ||
3271 | +} | ||
3272 | + | ||
3273 | /* All packets are sent to the network through this function from | ||
3274 | * sctp_outq_tail(). | ||
3275 | * | ||
3276 | @@ -375,7 +394,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) | ||
3277 | /* Set the owning socket so that we know where to get the | ||
3278 | * destination IP address. | ||
3279 | */ | ||
3280 | - skb_set_owner_w(nskb, sk); | ||
3281 | + sctp_packet_set_owner_w(nskb, sk); | ||
3282 | |||
3283 | if (!sctp_transport_dst_check(tp)) { | ||
3284 | sctp_transport_route(tp, NULL, sctp_sk(sk)); | ||
3285 | diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c | ||
3286 | index 54a0dc2..ab2bb42 100644 | ||
3287 | --- a/net/xfrm/xfrm_input.c | ||
3288 | +++ b/net/xfrm/xfrm_input.c | ||
3289 | @@ -212,7 +212,7 @@ resume: | ||
3290 | /* only the first xfrm gets the encap type */ | ||
3291 | encap_type = 0; | ||
3292 | |||
3293 | - if (async && x->repl->check(x, skb, seq)) { | ||
3294 | + if (async && x->repl->recheck(x, skb, seq)) { | ||
3295 | XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR); | ||
3296 | goto drop_unlock; | ||
3297 | } | ||
3298 | diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c | ||
3299 | index a15d2a0..71c80c7 100644 | ||
3300 | --- a/net/xfrm/xfrm_policy.c | ||
3301 | +++ b/net/xfrm/xfrm_policy.c | ||
3302 | @@ -1761,7 +1761,7 @@ static struct dst_entry *make_blackhole(struct net *net, u16 family, | ||
3303 | |||
3304 | if (!afinfo) { | ||
3305 | dst_release(dst_orig); | ||
3306 | - ret = ERR_PTR(-EINVAL); | ||
3307 | + return ERR_PTR(-EINVAL); | ||
3308 | } else { | ||
3309 | ret = afinfo->blackhole_route(net, dst_orig); | ||
3310 | } | ||
3311 | diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c | ||
3312 | index 2f6d11d..3efb07d 100644 | ||
3313 | --- a/net/xfrm/xfrm_replay.c | ||
3314 | +++ b/net/xfrm/xfrm_replay.c | ||
3315 | @@ -420,6 +420,18 @@ err: | ||
3316 | return -EINVAL; | ||
3317 | } | ||
3318 | |||
3319 | +static int xfrm_replay_recheck_esn(struct xfrm_state *x, | ||
3320 | + struct sk_buff *skb, __be32 net_seq) | ||
3321 | +{ | ||
3322 | + if (unlikely(XFRM_SKB_CB(skb)->seq.input.hi != | ||
3323 | + htonl(xfrm_replay_seqhi(x, net_seq)))) { | ||
3324 | + x->stats.replay_window++; | ||
3325 | + return -EINVAL; | ||
3326 | + } | ||
3327 | + | ||
3328 | + return xfrm_replay_check_esn(x, skb, net_seq); | ||
3329 | +} | ||
3330 | + | ||
3331 | static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) | ||
3332 | { | ||
3333 | unsigned int bitnr, nr, i; | ||
3334 | @@ -479,6 +491,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) | ||
3335 | static struct xfrm_replay xfrm_replay_legacy = { | ||
3336 | .advance = xfrm_replay_advance, | ||
3337 | .check = xfrm_replay_check, | ||
3338 | + .recheck = xfrm_replay_check, | ||
3339 | .notify = xfrm_replay_notify, | ||
3340 | .overflow = xfrm_replay_overflow, | ||
3341 | }; | ||
3342 | @@ -486,6 +499,7 @@ static struct xfrm_replay xfrm_replay_legacy = { | ||
3343 | static struct xfrm_replay xfrm_replay_bmp = { | ||
3344 | .advance = xfrm_replay_advance_bmp, | ||
3345 | .check = xfrm_replay_check_bmp, | ||
3346 | + .recheck = xfrm_replay_check_bmp, | ||
3347 | .notify = xfrm_replay_notify_bmp, | ||
3348 | .overflow = xfrm_replay_overflow_bmp, | ||
3349 | }; | ||
3350 | @@ -493,6 +507,7 @@ static struct xfrm_replay xfrm_replay_bmp = { | ||
3351 | static struct xfrm_replay xfrm_replay_esn = { | ||
3352 | .advance = xfrm_replay_advance_esn, | ||
3353 | .check = xfrm_replay_check_esn, | ||
3354 | + .recheck = xfrm_replay_recheck_esn, | ||
3355 | .notify = xfrm_replay_notify_bmp, | ||
3356 | .overflow = xfrm_replay_overflow_esn, | ||
3357 | }; | ||
3358 | diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c | ||
3359 | index 7128dde..c8b903d 100644 | ||
3360 | --- a/net/xfrm/xfrm_user.c | ||
3361 | +++ b/net/xfrm/xfrm_user.c | ||
3362 | @@ -123,9 +123,21 @@ static inline int verify_replay(struct xfrm_usersa_info *p, | ||
3363 | struct nlattr **attrs) | ||
3364 | { | ||
3365 | struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; | ||
3366 | + struct xfrm_replay_state_esn *rs; | ||
3367 | |||
3368 | - if ((p->flags & XFRM_STATE_ESN) && !rt) | ||
3369 | - return -EINVAL; | ||
3370 | + if (p->flags & XFRM_STATE_ESN) { | ||
3371 | + if (!rt) | ||
3372 | + return -EINVAL; | ||
3373 | + | ||
3374 | + rs = nla_data(rt); | ||
3375 | + | ||
3376 | + if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8) | ||
3377 | + return -EINVAL; | ||
3378 | + | ||
3379 | + if (nla_len(rt) < xfrm_replay_state_esn_len(rs) && | ||
3380 | + nla_len(rt) != sizeof(*rs)) | ||
3381 | + return -EINVAL; | ||
3382 | + } | ||
3383 | |||
3384 | if (!rt) | ||
3385 | return 0; | ||
3386 | @@ -370,14 +382,15 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es | ||
3387 | struct nlattr *rp) | ||
3388 | { | ||
3389 | struct xfrm_replay_state_esn *up; | ||
3390 | + int ulen; | ||
3391 | |||
3392 | if (!replay_esn || !rp) | ||
3393 | return 0; | ||
3394 | |||
3395 | up = nla_data(rp); | ||
3396 | + ulen = xfrm_replay_state_esn_len(up); | ||
3397 | |||
3398 | - if (xfrm_replay_state_esn_len(replay_esn) != | ||
3399 | - xfrm_replay_state_esn_len(up)) | ||
3400 | + if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen) | ||
3401 | return -EINVAL; | ||
3402 | |||
3403 | return 0; | ||
3404 | @@ -388,22 +401,28 @@ static int xfrm_alloc_replay_state_esn(struct xfrm_replay_state_esn **replay_esn | ||
3405 | struct nlattr *rta) | ||
3406 | { | ||
3407 | struct xfrm_replay_state_esn *p, *pp, *up; | ||
3408 | + int klen, ulen; | ||
3409 | |||
3410 | if (!rta) | ||
3411 | return 0; | ||
3412 | |||
3413 | up = nla_data(rta); | ||
3414 | + klen = xfrm_replay_state_esn_len(up); | ||
3415 | + ulen = nla_len(rta) >= klen ? klen : sizeof(*up); | ||
3416 | |||
3417 | - p = kmemdup(up, xfrm_replay_state_esn_len(up), GFP_KERNEL); | ||
3418 | + p = kzalloc(klen, GFP_KERNEL); | ||
3419 | if (!p) | ||
3420 | return -ENOMEM; | ||
3421 | |||
3422 | - pp = kmemdup(up, xfrm_replay_state_esn_len(up), GFP_KERNEL); | ||
3423 | + pp = kzalloc(klen, GFP_KERNEL); | ||
3424 | if (!pp) { | ||
3425 | kfree(p); | ||
3426 | return -ENOMEM; | ||
3427 | } | ||
3428 | |||
3429 | + memcpy(p, up, ulen); | ||
3430 | + memcpy(pp, up, ulen); | ||
3431 | + | ||
3432 | *replay_esn = p; | ||
3433 | *preplay_esn = pp; | ||
3434 | |||
3435 | @@ -442,10 +461,11 @@ static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info * | ||
3436 | * somehow made shareable and move it to xfrm_state.c - JHS | ||
3437 | * | ||
3438 | */ | ||
3439 | -static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs) | ||
3440 | +static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs, | ||
3441 | + int update_esn) | ||
3442 | { | ||
3443 | struct nlattr *rp = attrs[XFRMA_REPLAY_VAL]; | ||
3444 | - struct nlattr *re = attrs[XFRMA_REPLAY_ESN_VAL]; | ||
3445 | + struct nlattr *re = update_esn ? attrs[XFRMA_REPLAY_ESN_VAL] : NULL; | ||
3446 | struct nlattr *lt = attrs[XFRMA_LTIME_VAL]; | ||
3447 | struct nlattr *et = attrs[XFRMA_ETIMER_THRESH]; | ||
3448 | struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH]; | ||
3449 | @@ -555,7 +575,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, | ||
3450 | goto error; | ||
3451 | |||
3452 | /* override default values from above */ | ||
3453 | - xfrm_update_ae_params(x, attrs); | ||
3454 | + xfrm_update_ae_params(x, attrs, 0); | ||
3455 | |||
3456 | return x; | ||
3457 | |||
3458 | @@ -689,6 +709,7 @@ out: | ||
3459 | |||
3460 | static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p) | ||
3461 | { | ||
3462 | + memset(p, 0, sizeof(*p)); | ||
3463 | memcpy(&p->id, &x->id, sizeof(p->id)); | ||
3464 | memcpy(&p->sel, &x->sel, sizeof(p->sel)); | ||
3465 | memcpy(&p->lft, &x->lft, sizeof(p->lft)); | ||
3466 | @@ -742,7 +763,7 @@ static int copy_to_user_auth(struct xfrm_algo_auth *auth, struct sk_buff *skb) | ||
3467 | return -EMSGSIZE; | ||
3468 | |||
3469 | algo = nla_data(nla); | ||
3470 | - strcpy(algo->alg_name, auth->alg_name); | ||
3471 | + strncpy(algo->alg_name, auth->alg_name, sizeof(algo->alg_name)); | ||
3472 | memcpy(algo->alg_key, auth->alg_key, (auth->alg_key_len + 7) / 8); | ||
3473 | algo->alg_key_len = auth->alg_key_len; | ||
3474 | |||
3475 | @@ -862,6 +883,7 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb, | ||
3476 | { | ||
3477 | struct xfrm_dump_info info; | ||
3478 | struct sk_buff *skb; | ||
3479 | + int err; | ||
3480 | |||
3481 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); | ||
3482 | if (!skb) | ||
3483 | @@ -872,9 +894,10 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb, | ||
3484 | info.nlmsg_seq = seq; | ||
3485 | info.nlmsg_flags = 0; | ||
3486 | |||
3487 | - if (dump_one_state(x, 0, &info)) { | ||
3488 | + err = dump_one_state(x, 0, &info); | ||
3489 | + if (err) { | ||
3490 | kfree_skb(skb); | ||
3491 | - return NULL; | ||
3492 | + return ERR_PTR(err); | ||
3493 | } | ||
3494 | |||
3495 | return skb; | ||
3496 | @@ -1297,6 +1320,7 @@ static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy | ||
3497 | |||
3498 | static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir) | ||
3499 | { | ||
3500 | + memset(p, 0, sizeof(*p)); | ||
3501 | memcpy(&p->sel, &xp->selector, sizeof(p->sel)); | ||
3502 | memcpy(&p->lft, &xp->lft, sizeof(p->lft)); | ||
3503 | memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft)); | ||
3504 | @@ -1401,6 +1425,7 @@ static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb) | ||
3505 | struct xfrm_user_tmpl *up = &vec[i]; | ||
3506 | struct xfrm_tmpl *kp = &xp->xfrm_vec[i]; | ||
3507 | |||
3508 | + memset(up, 0, sizeof(*up)); | ||
3509 | memcpy(&up->id, &kp->id, sizeof(up->id)); | ||
3510 | up->family = kp->encap_family; | ||
3511 | memcpy(&up->saddr, &kp->saddr, sizeof(up->saddr)); | ||
3512 | @@ -1529,6 +1554,7 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb, | ||
3513 | { | ||
3514 | struct xfrm_dump_info info; | ||
3515 | struct sk_buff *skb; | ||
3516 | + int err; | ||
3517 | |||
3518 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
3519 | if (!skb) | ||
3520 | @@ -1539,9 +1565,10 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb, | ||
3521 | info.nlmsg_seq = seq; | ||
3522 | info.nlmsg_flags = 0; | ||
3523 | |||
3524 | - if (dump_one_policy(xp, dir, 0, &info) < 0) { | ||
3525 | + err = dump_one_policy(xp, dir, 0, &info); | ||
3526 | + if (err) { | ||
3527 | kfree_skb(skb); | ||
3528 | - return NULL; | ||
3529 | + return ERR_PTR(err); | ||
3530 | } | ||
3531 | |||
3532 | return skb; | ||
3533 | @@ -1794,7 +1821,7 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh, | ||
3534 | goto out; | ||
3535 | |||
3536 | spin_lock_bh(&x->lock); | ||
3537 | - xfrm_update_ae_params(x, attrs); | ||
3538 | + xfrm_update_ae_params(x, attrs, 1); | ||
3539 | spin_unlock_bh(&x->lock); | ||
3540 | |||
3541 | c.event = nlh->nlmsg_type; | ||
3542 | diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include | ||
3543 | index 6a3ee98..978416d 100644 | ||
3544 | --- a/scripts/Kbuild.include | ||
3545 | +++ b/scripts/Kbuild.include | ||
3546 | @@ -98,24 +98,24 @@ try-run = $(shell set -e; \ | ||
3547 | # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) | ||
3548 | |||
3549 | as-option = $(call try-run,\ | ||
3550 | - $(CC) $(KBUILD_CFLAGS) $(1) -c -xassembler /dev/null -o "$$TMP",$(1),$(2)) | ||
3551 | + $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2)) | ||
3552 | |||
3553 | # as-instr | ||
3554 | # Usage: cflags-y += $(call as-instr,instr,option1,option2) | ||
3555 | |||
3556 | as-instr = $(call try-run,\ | ||
3557 | - printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" -,$(2),$(3)) | ||
3558 | + printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3)) | ||
3559 | |||
3560 | # cc-option | ||
3561 | # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) | ||
3562 | |||
3563 | cc-option = $(call try-run,\ | ||
3564 | - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2)) | ||
3565 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2)) | ||
3566 | |||
3567 | # cc-option-yn | ||
3568 | # Usage: flag := $(call cc-option-yn,-march=winchip-c6) | ||
3569 | cc-option-yn = $(call try-run,\ | ||
3570 | - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n) | ||
3571 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) | ||
3572 | |||
3573 | # cc-option-align | ||
3574 | # Prefix align with either -falign or -malign | ||
3575 | @@ -125,7 +125,7 @@ cc-option-align = $(subst -functions=0,,\ | ||
3576 | # cc-disable-warning | ||
3577 | # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) | ||
3578 | cc-disable-warning = $(call try-run,\ | ||
3579 | - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -xc /dev/null -o "$$TMP",-Wno-$(strip $(1))) | ||
3580 | + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) | ||
3581 | |||
3582 | # cc-version | ||
3583 | # Usage gcc-ver := $(call cc-version) | ||
3584 | @@ -143,7 +143,7 @@ cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3)) | ||
3585 | # cc-ldoption | ||
3586 | # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) | ||
3587 | cc-ldoption = $(call try-run,\ | ||
3588 | - $(CC) $(1) -nostdlib -xc /dev/null -o "$$TMP",$(1),$(2)) | ||
3589 | + $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) | ||
3590 | |||
3591 | # ld-option | ||
3592 | # Usage: LDFLAGS += $(call ld-option, -X) | ||
3593 | @@ -209,7 +209,7 @@ endif | ||
3594 | # >$< substitution to preserve $ when reloading .cmd file | ||
3595 | # note: when using inline perl scripts [perl -e '...$$t=1;...'] | ||
3596 | # in $(cmd_xxx) double $$ your perl vars | ||
3597 | -make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))) | ||
3598 | +make-cmd = $(subst \\,\\\\,$(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))) | ||
3599 | |||
3600 | # Find any prerequisites that is newer than target or that does not exist. | ||
3601 | # PHONY targets skipped in both cases. | ||
3602 | diff --git a/scripts/gcc-version.sh b/scripts/gcc-version.sh | ||
3603 | index debecb5..7f2126d 100644 | ||
3604 | --- a/scripts/gcc-version.sh | ||
3605 | +++ b/scripts/gcc-version.sh | ||
3606 | @@ -22,10 +22,10 @@ if [ ${#compiler} -eq 0 ]; then | ||
3607 | exit 1 | ||
3608 | fi | ||
3609 | |||
3610 | -MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1) | ||
3611 | -MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1) | ||
3612 | +MAJOR=$(echo __GNUC__ | $compiler -E -x c - | tail -n 1) | ||
3613 | +MINOR=$(echo __GNUC_MINOR__ | $compiler -E -x c - | tail -n 1) | ||
3614 | if [ "x$with_patchlevel" != "x" ] ; then | ||
3615 | - PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -xc - | tail -n 1) | ||
3616 | + PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -x c - | tail -n 1) | ||
3617 | printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL | ||
3618 | else | ||
3619 | printf "%02d%02d\\n" $MAJOR $MINOR | ||
3620 | diff --git a/scripts/gcc-x86_32-has-stack-protector.sh b/scripts/gcc-x86_32-has-stack-protector.sh | ||
3621 | index 29493dc..12dbd0b 100644 | ||
3622 | --- a/scripts/gcc-x86_32-has-stack-protector.sh | ||
3623 | +++ b/scripts/gcc-x86_32-has-stack-protector.sh | ||
3624 | @@ -1,6 +1,6 @@ | ||
3625 | #!/bin/sh | ||
3626 | |||
3627 | -echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3628 | +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3629 | if [ "$?" -eq "0" ] ; then | ||
3630 | echo y | ||
3631 | else | ||
3632 | diff --git a/scripts/gcc-x86_64-has-stack-protector.sh b/scripts/gcc-x86_64-has-stack-protector.sh | ||
3633 | index afaec61..973e8c1 100644 | ||
3634 | --- a/scripts/gcc-x86_64-has-stack-protector.sh | ||
3635 | +++ b/scripts/gcc-x86_64-has-stack-protector.sh | ||
3636 | @@ -1,6 +1,6 @@ | ||
3637 | #!/bin/sh | ||
3638 | |||
3639 | -echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3640 | +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
3641 | if [ "$?" -eq "0" ] ; then | ||
3642 | echo y | ||
3643 | else | ||
3644 | diff --git a/scripts/kconfig/check.sh b/scripts/kconfig/check.sh | ||
3645 | index fa59cbf..854d9c7 100755 | ||
3646 | --- a/scripts/kconfig/check.sh | ||
3647 | +++ b/scripts/kconfig/check.sh | ||
3648 | @@ -1,6 +1,6 @@ | ||
3649 | #!/bin/sh | ||
3650 | # Needed for systems without gettext | ||
3651 | -$* -xc -o /dev/null - > /dev/null 2>&1 << EOF | ||
3652 | +$* -x c -o /dev/null - > /dev/null 2>&1 << EOF | ||
3653 | #include <libintl.h> | ||
3654 | int main() | ||
3655 | { | ||
3656 | diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh | ||
3657 | index 82cc3a8..50df490 100644 | ||
3658 | --- a/scripts/kconfig/lxdialog/check-lxdialog.sh | ||
3659 | +++ b/scripts/kconfig/lxdialog/check-lxdialog.sh | ||
3660 | @@ -38,7 +38,7 @@ trap "rm -f $tmp" 0 1 2 3 15 | ||
3661 | |||
3662 | # Check if we can link to ncurses | ||
3663 | check() { | ||
3664 | - $cc -xc - -o $tmp 2>/dev/null <<'EOF' | ||
3665 | + $cc -x c - -o $tmp 2>/dev/null <<'EOF' | ||
3666 | #include CURSES_LOC | ||
3667 | main() {} | ||
3668 | EOF | ||
3669 | diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl | ||
3670 | index bccf07dd..3346f42 100644 | ||
3671 | --- a/scripts/kconfig/streamline_config.pl | ||
3672 | +++ b/scripts/kconfig/streamline_config.pl | ||
3673 | @@ -463,6 +463,8 @@ while(<CIN>) { | ||
3674 | if (defined($configs{$1})) { | ||
3675 | if ($localyesconfig) { | ||
3676 | $setconfigs{$1} = 'y'; | ||
3677 | + print "$1=y\n"; | ||
3678 | + next; | ||
3679 | } else { | ||
3680 | $setconfigs{$1} = $2; | ||
3681 | } | ||
3682 | diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c | ||
3683 | index ad079b6..bdc963e 100644 | ||
3684 | --- a/sound/drivers/aloop.c | ||
3685 | +++ b/sound/drivers/aloop.c | ||
3686 | @@ -119,6 +119,7 @@ struct loopback_pcm { | ||
3687 | unsigned int period_size_frac; | ||
3688 | unsigned long last_jiffies; | ||
3689 | struct timer_list timer; | ||
3690 | + spinlock_t timer_lock; | ||
3691 | }; | ||
3692 | |||
3693 | static struct platform_device *devices[SNDRV_CARDS]; | ||
3694 | @@ -169,6 +170,7 @@ static void loopback_timer_start(struct loopback_pcm *dpcm) | ||
3695 | unsigned long tick; | ||
3696 | unsigned int rate_shift = get_rate_shift(dpcm); | ||
3697 | |||
3698 | + spin_lock(&dpcm->timer_lock); | ||
3699 | if (rate_shift != dpcm->pcm_rate_shift) { | ||
3700 | dpcm->pcm_rate_shift = rate_shift; | ||
3701 | dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size); | ||
3702 | @@ -181,12 +183,15 @@ static void loopback_timer_start(struct loopback_pcm *dpcm) | ||
3703 | tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps; | ||
3704 | dpcm->timer.expires = jiffies + tick; | ||
3705 | add_timer(&dpcm->timer); | ||
3706 | + spin_unlock(&dpcm->timer_lock); | ||
3707 | } | ||
3708 | |||
3709 | static inline void loopback_timer_stop(struct loopback_pcm *dpcm) | ||
3710 | { | ||
3711 | + spin_lock(&dpcm->timer_lock); | ||
3712 | del_timer(&dpcm->timer); | ||
3713 | dpcm->timer.expires = 0; | ||
3714 | + spin_unlock(&dpcm->timer_lock); | ||
3715 | } | ||
3716 | |||
3717 | #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK) | ||
3718 | @@ -659,6 +664,7 @@ static int loopback_open(struct snd_pcm_substream *substream) | ||
3719 | dpcm->substream = substream; | ||
3720 | setup_timer(&dpcm->timer, loopback_timer_function, | ||
3721 | (unsigned long)dpcm); | ||
3722 | + spin_lock_init(&dpcm->timer_lock); | ||
3723 | |||
3724 | cable = loopback->cables[substream->number][dev]; | ||
3725 | if (!cable) { | ||
3726 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
3727 | index 52e7a45..e7cb4bd 100644 | ||
3728 | --- a/sound/pci/hda/patch_realtek.c | ||
3729 | +++ b/sound/pci/hda/patch_realtek.c | ||
3730 | @@ -6307,6 +6307,12 @@ static int patch_alc269(struct hda_codec *codec) | ||
3731 | if (err < 0) | ||
3732 | goto error; | ||
3733 | |||
3734 | + alc_pick_fixup(codec, alc269_fixup_models, | ||
3735 | + alc269_fixup_tbl, alc269_fixups); | ||
3736 | + alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
3737 | + | ||
3738 | + alc_auto_parse_customize_define(codec); | ||
3739 | + | ||
3740 | if (codec->vendor_id == 0x10ec0269) { | ||
3741 | spec->codec_variant = ALC269_TYPE_ALC269VA; | ||
3742 | switch (alc_get_coef0(codec) & 0x00f0) { | ||
3743 | @@ -6331,12 +6337,6 @@ static int patch_alc269(struct hda_codec *codec) | ||
3744 | alc269_fill_coef(codec); | ||
3745 | } | ||
3746 | |||
3747 | - alc_pick_fixup(codec, alc269_fixup_models, | ||
3748 | - alc269_fixup_tbl, alc269_fixups); | ||
3749 | - alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); | ||
3750 | - | ||
3751 | - alc_auto_parse_customize_define(codec); | ||
3752 | - | ||
3753 | /* automatic parse from the BIOS config */ | ||
3754 | err = alc269_parse_auto_config(codec); | ||
3755 | if (err < 0) | ||
3756 | diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c | ||
3757 | index b9567bc..757a52a 100644 | ||
3758 | --- a/sound/soc/codecs/wm9712.c | ||
3759 | +++ b/sound/soc/codecs/wm9712.c | ||
3760 | @@ -146,7 +146,7 @@ SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0), | ||
3761 | SOC_SINGLE("Bass Volume", AC97_MASTER_TONE, 8, 15, 1), | ||
3762 | SOC_SINGLE("Treble Volume", AC97_MASTER_TONE, 0, 15, 1), | ||
3763 | |||
3764 | -SOC_SINGLE("Capture ADC Switch", AC97_REC_GAIN, 15, 1, 1), | ||
3765 | +SOC_SINGLE("Capture Switch", AC97_REC_GAIN, 15, 1, 1), | ||
3766 | SOC_ENUM("Capture Volume Steps", wm9712_enum[6]), | ||
3767 | SOC_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 1), | ||
3768 | SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0), | ||
3769 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
3770 | index ab23869..8a818a4 100644 | ||
3771 | --- a/sound/usb/mixer.c | ||
3772 | +++ b/sound/usb/mixer.c | ||
3773 | @@ -1247,6 +1247,13 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | ||
3774 | /* disable non-functional volume control */ | ||
3775 | master_bits &= ~UAC_CONTROL_BIT(UAC_FU_VOLUME); | ||
3776 | break; | ||
3777 | + case USB_ID(0x1130, 0xf211): | ||
3778 | + snd_printk(KERN_INFO | ||
3779 | + "usbmixer: volume control quirk for Tenx TP6911 Audio Headset\n"); | ||
3780 | + /* disable non-functional volume control */ | ||
3781 | + channels = 0; | ||
3782 | + break; | ||
3783 | + | ||
3784 | } | ||
3785 | if (channels > 0) | ||
3786 | first_ch_bits = snd_usb_combine_bytes(bmaControls + csize, csize); | ||
3787 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h | ||
3788 | index d89ab4c..63128cd 100644 | ||
3789 | --- a/sound/usb/quirks-table.h | ||
3790 | +++ b/sound/usb/quirks-table.h | ||
3791 | @@ -2751,6 +2751,59 @@ YAMAHA_DEVICE(0x7010, "UB99"), | ||
3792 | } | ||
3793 | }, | ||
3794 | |||
3795 | +/* Microsoft XboxLive Headset/Xbox Communicator */ | ||
3796 | +{ | ||
3797 | + USB_DEVICE(0x045e, 0x0283), | ||
3798 | + .bInterfaceClass = USB_CLASS_PER_INTERFACE, | ||
3799 | + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
3800 | + .vendor_name = "Microsoft", | ||
3801 | + .product_name = "XboxLive Headset/Xbox Communicator", | ||
3802 | + .ifnum = QUIRK_ANY_INTERFACE, | ||
3803 | + .type = QUIRK_COMPOSITE, | ||
3804 | + .data = &(const struct snd_usb_audio_quirk[]) { | ||
3805 | + { | ||
3806 | + /* playback */ | ||
3807 | + .ifnum = 0, | ||
3808 | + .type = QUIRK_AUDIO_FIXED_ENDPOINT, | ||
3809 | + .data = &(const struct audioformat) { | ||
3810 | + .formats = SNDRV_PCM_FMTBIT_S16_LE, | ||
3811 | + .channels = 1, | ||
3812 | + .iface = 0, | ||
3813 | + .altsetting = 0, | ||
3814 | + .altset_idx = 0, | ||
3815 | + .attributes = 0, | ||
3816 | + .endpoint = 0x04, | ||
3817 | + .ep_attr = 0x05, | ||
3818 | + .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
3819 | + .rate_min = 22050, | ||
3820 | + .rate_max = 22050 | ||
3821 | + } | ||
3822 | + }, | ||
3823 | + { | ||
3824 | + /* capture */ | ||
3825 | + .ifnum = 1, | ||
3826 | + .type = QUIRK_AUDIO_FIXED_ENDPOINT, | ||
3827 | + .data = &(const struct audioformat) { | ||
3828 | + .formats = SNDRV_PCM_FMTBIT_S16_LE, | ||
3829 | + .channels = 1, | ||
3830 | + .iface = 1, | ||
3831 | + .altsetting = 0, | ||
3832 | + .altset_idx = 0, | ||
3833 | + .attributes = 0, | ||
3834 | + .endpoint = 0x85, | ||
3835 | + .ep_attr = 0x05, | ||
3836 | + .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
3837 | + .rate_min = 16000, | ||
3838 | + .rate_max = 16000 | ||
3839 | + } | ||
3840 | + }, | ||
3841 | + { | ||
3842 | + .ifnum = -1 | ||
3843 | + } | ||
3844 | + } | ||
3845 | + } | ||
3846 | +}, | ||
3847 | + | ||
3848 | { | ||
3849 | /* | ||
3850 | * Some USB MIDI devices don't have an audio control interface, | ||
3851 | diff --git a/tools/lguest/lguest.c b/tools/lguest/lguest.c | ||
3852 | index f759f4f..fd2f922 100644 | ||
3853 | --- a/tools/lguest/lguest.c | ||
3854 | +++ b/tools/lguest/lguest.c | ||
3855 | @@ -1299,6 +1299,7 @@ static struct device *new_device(const char *name, u16 type) | ||
3856 | dev->feature_len = 0; | ||
3857 | dev->num_vq = 0; | ||
3858 | dev->running = false; | ||
3859 | + dev->next = NULL; | ||
3860 | |||
3861 | /* | ||
3862 | * Append to device list. Prepending to a single-linked list is | ||
3863 | diff --git a/tools/perf/Makefile b/tools/perf/Makefile | ||
3864 | index 92271d3..c3dd3d4 100644 | ||
3865 | --- a/tools/perf/Makefile | ||
3866 | +++ b/tools/perf/Makefile | ||
3867 | @@ -70,7 +70,7 @@ ifeq ($(ARCH),x86_64) | ||
3868 | ARCH := x86 | ||
3869 | IS_X86_64 := 0 | ||
3870 | ifeq (, $(findstring m32,$(EXTRA_CFLAGS))) | ||
3871 | - IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -xc - | tail -n 1) | ||
3872 | + IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1) | ||
3873 | endif | ||
3874 | ifeq (${IS_X86_64}, 1) | ||
3875 | RAW_ARCH := x86_64 | ||
3876 | diff --git a/tools/power/cpupower/Makefile b/tools/power/cpupower/Makefile | ||
3877 | index a93e06c..cf397bd 100644 | ||
3878 | --- a/tools/power/cpupower/Makefile | ||
3879 | +++ b/tools/power/cpupower/Makefile | ||
3880 | @@ -111,7 +111,7 @@ GMO_FILES = ${shell for HLANG in ${LANGUAGES}; do echo $(OUTPUT)po/$$HLANG.gmo; | ||
3881 | export CROSS CC AR STRIP RANLIB CFLAGS LDFLAGS LIB_OBJS | ||
3882 | |||
3883 | # check if compiler option is supported | ||
3884 | -cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;} | ||
3885 | +cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -x c /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;} | ||
3886 | |||
3887 | # use '-Os' optimization if available, else use -O2 | ||
3888 | OPTIMIZATION := $(call cc-supports,-Os,-O2) |