Magellan Linux

Contents of /trunk/kernel-magellan/patches-3.6/0101-3.6.2-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1921 - (show annotations) (download)
Fri Oct 26 08:33:00 2012 UTC (11 years, 6 months ago) by niro
File size: 145571 byte(s)
-3.6.3-magellan-r1
1 diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
2 index d6fde98..848ef4a 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,10 @@ 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 + rcu_idle_exit();
21 schedule();
22 }
23 }
24 diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h
25 index c334a23..fce38a6 100644
26 --- a/arch/arm/include/asm/syscall.h
27 +++ b/arch/arm/include/asm/syscall.h
28 @@ -8,6 +8,7 @@
29 #define _ASM_ARM_SYSCALL_H
30
31 #include <linux/err.h>
32 +#include <linux/sched.h>
33
34 extern const unsigned long sys_call_table[];
35
36 diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
37 index 66fd017..7f65be6 100644
38 --- a/arch/cris/kernel/process.c
39 +++ b/arch/cris/kernel/process.c
40 @@ -25,6 +25,7 @@
41 #include <linux/elfcore.h>
42 #include <linux/mqueue.h>
43 #include <linux/reboot.h>
44 +#include <linux/rcupdate.h>
45
46 //#define DEBUG
47
48 @@ -74,6 +75,7 @@ void cpu_idle (void)
49 {
50 /* endless idle loop with no priority at all */
51 while (1) {
52 + rcu_idle_enter();
53 while (!need_resched()) {
54 void (*idle)(void);
55 /*
56 @@ -86,6 +88,7 @@ void cpu_idle (void)
57 idle = default_idle;
58 idle();
59 }
60 + rcu_idle_exit();
61 schedule_preempt_disabled();
62 }
63 }
64 diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
65 index ff95f50..2eb7fa5 100644
66 --- a/arch/frv/kernel/process.c
67 +++ b/arch/frv/kernel/process.c
68 @@ -25,6 +25,7 @@
69 #include <linux/reboot.h>
70 #include <linux/interrupt.h>
71 #include <linux/pagemap.h>
72 +#include <linux/rcupdate.h>
73
74 #include <asm/asm-offsets.h>
75 #include <asm/uaccess.h>
76 @@ -69,12 +70,14 @@ void cpu_idle(void)
77 {
78 /* endless idle loop with no priority at all */
79 while (1) {
80 + rcu_idle_enter();
81 while (!need_resched()) {
82 check_pgt_cache();
83
84 if (!frv_dma_inprogress && idle)
85 idle();
86 }
87 + rcu_idle_exit();
88
89 schedule_preempt_disabled();
90 }
91 diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
92 index 0e9c315..f153ed1 100644
93 --- a/arch/h8300/kernel/process.c
94 +++ b/arch/h8300/kernel/process.c
95 @@ -36,6 +36,7 @@
96 #include <linux/reboot.h>
97 #include <linux/fs.h>
98 #include <linux/slab.h>
99 +#include <linux/rcupdate.h>
100
101 #include <asm/uaccess.h>
102 #include <asm/traps.h>
103 @@ -78,8 +79,10 @@ void (*idle)(void) = default_idle;
104 void cpu_idle(void)
105 {
106 while (1) {
107 + rcu_idle_enter();
108 while (!need_resched())
109 idle();
110 + rcu_idle_exit();
111 schedule_preempt_disabled();
112 }
113 }
114 diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
115 index dd6fc14..3e316ec 100644
116 --- a/arch/ia64/kernel/process.c
117 +++ b/arch/ia64/kernel/process.c
118 @@ -29,6 +29,7 @@
119 #include <linux/kdebug.h>
120 #include <linux/utsname.h>
121 #include <linux/tracehook.h>
122 +#include <linux/rcupdate.h>
123
124 #include <asm/cpu.h>
125 #include <asm/delay.h>
126 @@ -279,6 +280,7 @@ cpu_idle (void)
127
128 /* endless idle loop with no priority at all */
129 while (1) {
130 + rcu_idle_enter();
131 if (can_do_pal_halt) {
132 current_thread_info()->status &= ~TS_POLLING;
133 /*
134 @@ -309,6 +311,7 @@ cpu_idle (void)
135 normal_xtp();
136 #endif
137 }
138 + rcu_idle_exit();
139 schedule_preempt_disabled();
140 check_pgt_cache();
141 if (cpu_is_offline(cpu))
142 diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c
143 index 3a4a32b..384e63f 100644
144 --- a/arch/m32r/kernel/process.c
145 +++ b/arch/m32r/kernel/process.c
146 @@ -26,6 +26,7 @@
147 #include <linux/ptrace.h>
148 #include <linux/unistd.h>
149 #include <linux/hardirq.h>
150 +#include <linux/rcupdate.h>
151
152 #include <asm/io.h>
153 #include <asm/uaccess.h>
154 @@ -82,6 +83,7 @@ void cpu_idle (void)
155 {
156 /* endless idle loop with no priority at all */
157 while (1) {
158 + rcu_idle_enter();
159 while (!need_resched()) {
160 void (*idle)(void) = pm_idle;
161
162 @@ -90,6 +92,7 @@ void cpu_idle (void)
163
164 idle();
165 }
166 + rcu_idle_exit();
167 schedule_preempt_disabled();
168 }
169 }
170 diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
171 index c488e3c..ac2892e 100644
172 --- a/arch/m68k/kernel/process.c
173 +++ b/arch/m68k/kernel/process.c
174 @@ -25,6 +25,7 @@
175 #include <linux/reboot.h>
176 #include <linux/init_task.h>
177 #include <linux/mqueue.h>
178 +#include <linux/rcupdate.h>
179
180 #include <asm/uaccess.h>
181 #include <asm/traps.h>
182 @@ -75,8 +76,10 @@ void cpu_idle(void)
183 {
184 /* endless idle loop with no priority at all */
185 while (1) {
186 + rcu_idle_enter();
187 while (!need_resched())
188 idle();
189 + rcu_idle_exit();
190 schedule_preempt_disabled();
191 }
192 }
193 diff --git a/arch/mips/Makefile b/arch/mips/Makefile
194 index 764e37a..654b1ad 100644
195 --- a/arch/mips/Makefile
196 +++ b/arch/mips/Makefile
197 @@ -225,7 +225,7 @@ KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
198 LDFLAGS += -m $(ld-emul)
199
200 ifdef CONFIG_MIPS
201 -CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -xc /dev/null | \
202 +CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
203 egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \
204 sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/")
205 ifdef CONFIG_64BIT
206 diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c
207 index b91ad3e..d272857 100644
208 --- a/arch/mips/ath79/clock.c
209 +++ b/arch/mips/ath79/clock.c
210 @@ -189,7 +189,7 @@ static void __init ar934x_clocks_init(void)
211 AR934X_PLL_CPU_CONFIG_NFRAC_MASK;
212
213 cpu_pll = nint * ath79_ref_clk.rate / ref_div;
214 - cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 6));
215 + cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 6));
216 cpu_pll /= (1 << out_div);
217
218 pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG);
219 @@ -203,7 +203,7 @@ static void __init ar934x_clocks_init(void)
220 AR934X_PLL_DDR_CONFIG_NFRAC_MASK;
221
222 ddr_pll = nint * ath79_ref_clk.rate / ref_div;
223 - ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 10));
224 + ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 10));
225 ddr_pll /= (1 << out_div);
226
227 clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
228 diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
229 index fdaf65e..c6136cb 100644
230 --- a/arch/mips/kernel/Makefile
231 +++ b/arch/mips/kernel/Makefile
232 @@ -104,7 +104,7 @@ obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o
233
234 obj-$(CONFIG_OF) += prom.o
235
236 -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)
237 +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)
238
239 obj-$(CONFIG_HAVE_STD_PC_SERIAL_PORT) += 8250-platform.o
240
241 diff --git a/arch/mn10300/Makefile b/arch/mn10300/Makefile
242 index 33188b6..a3d0fef 100644
243 --- a/arch/mn10300/Makefile
244 +++ b/arch/mn10300/Makefile
245 @@ -26,7 +26,7 @@ CHECKFLAGS +=
246 PROCESSOR := unset
247 UNIT := unset
248
249 -KBUILD_CFLAGS += -mam33 -mmem-funcs -DCPU=AM33
250 +KBUILD_CFLAGS += -mam33 -DCPU=AM33 $(call cc-option,-mmem-funcs,)
251 KBUILD_AFLAGS += -mam33 -DCPU=AM33
252
253 ifeq ($(CONFIG_MN10300_CURRENT_IN_E2),y)
254 diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c
255 index 7dab0cd..e9cceba 100644
256 --- a/arch/mn10300/kernel/process.c
257 +++ b/arch/mn10300/kernel/process.c
258 @@ -25,6 +25,7 @@
259 #include <linux/err.h>
260 #include <linux/fs.h>
261 #include <linux/slab.h>
262 +#include <linux/rcupdate.h>
263 #include <asm/uaccess.h>
264 #include <asm/pgtable.h>
265 #include <asm/io.h>
266 @@ -107,6 +108,7 @@ void cpu_idle(void)
267 {
268 /* endless idle loop with no priority at all */
269 for (;;) {
270 + rcu_idle_enter();
271 while (!need_resched()) {
272 void (*idle)(void);
273
274 @@ -121,6 +123,7 @@ void cpu_idle(void)
275 }
276 idle();
277 }
278 + rcu_idle_exit();
279
280 schedule_preempt_disabled();
281 }
282 diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
283 index 2c05a92..8c6b6b6 100644
284 --- a/arch/parisc/kernel/process.c
285 +++ b/arch/parisc/kernel/process.c
286 @@ -48,6 +48,7 @@
287 #include <linux/unistd.h>
288 #include <linux/kallsyms.h>
289 #include <linux/uaccess.h>
290 +#include <linux/rcupdate.h>
291
292 #include <asm/io.h>
293 #include <asm/asm-offsets.h>
294 @@ -69,8 +70,10 @@ void cpu_idle(void)
295
296 /* endless idle loop with no priority at all */
297 while (1) {
298 + rcu_idle_enter();
299 while (!need_resched())
300 barrier();
301 + rcu_idle_exit();
302 schedule_preempt_disabled();
303 check_pgt_cache();
304 }
305 diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
306 index 8cccbee..78326de 100644
307 --- a/arch/powerpc/include/asm/pci-bridge.h
308 +++ b/arch/powerpc/include/asm/pci-bridge.h
309 @@ -182,6 +182,14 @@ static inline int pci_device_from_OF_node(struct device_node *np,
310 #if defined(CONFIG_EEH)
311 static inline struct eeh_dev *of_node_to_eeh_dev(struct device_node *dn)
312 {
313 + /*
314 + * For those OF nodes whose parent isn't PCI bridge, they
315 + * don't have PCI_DN actually. So we have to skip them for
316 + * any EEH operations.
317 + */
318 + if (!dn || !PCI_DN(dn))
319 + return NULL;
320 +
321 return PCI_DN(dn)->edev;
322 }
323 #endif
324 diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
325 index ff5a6ce..8226c6c 100644
326 --- a/arch/powerpc/kernel/iommu.c
327 +++ b/arch/powerpc/kernel/iommu.c
328 @@ -215,7 +215,8 @@ static unsigned long iommu_range_alloc(struct device *dev,
329 spin_lock_irqsave(&(pool->lock), flags);
330
331 again:
332 - if ((pass == 0) && handle && *handle)
333 + if ((pass == 0) && handle && *handle &&
334 + (*handle >= pool->start) && (*handle < pool->end))
335 start = *handle;
336 else
337 start = pool->hint;
338 @@ -236,7 +237,9 @@ again:
339 * but on second pass, start at 0 in pool 0.
340 */
341 if ((start & mask) >= limit || pass > 0) {
342 + spin_unlock(&(pool->lock));
343 pool = &(tbl->pools[0]);
344 + spin_lock(&(pool->lock));
345 start = pool->start;
346 } else {
347 start &= mask;
348 diff --git a/arch/powerpc/lib/memcpy_power7.S b/arch/powerpc/lib/memcpy_power7.S
349 index 7ba6c96..0663630 100644
350 --- a/arch/powerpc/lib/memcpy_power7.S
351 +++ b/arch/powerpc/lib/memcpy_power7.S
352 @@ -239,8 +239,8 @@ _GLOBAL(memcpy_power7)
353 ori r9,r9,1 /* stream=1 */
354
355 srdi r7,r5,7 /* length in cachelines, capped at 0x3FF */
356 - cmpldi cr1,r7,0x3FF
357 - ble cr1,1f
358 + cmpldi r7,0x3FF
359 + ble 1f
360 li r7,0x3FF
361 1: lis r0,0x0E00 /* depth=7 */
362 sldi r7,r7,7
363 diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c
364 index ecd394c..9a0b5f5 100644
365 --- a/arch/powerpc/platforms/pseries/eeh.c
366 +++ b/arch/powerpc/platforms/pseries/eeh.c
367 @@ -1029,7 +1029,7 @@ static void eeh_add_device_early(struct device_node *dn)
368 {
369 struct pci_controller *phb;
370
371 - if (!dn || !of_node_to_eeh_dev(dn))
372 + if (!of_node_to_eeh_dev(dn))
373 return;
374 phb = of_node_to_eeh_dev(dn)->phb;
375
376 diff --git a/arch/powerpc/sysdev/dart_iommu.c b/arch/powerpc/sysdev/dart_iommu.c
377 index 4f2680f..b68b0db 100644
378 --- a/arch/powerpc/sysdev/dart_iommu.c
379 +++ b/arch/powerpc/sysdev/dart_iommu.c
380 @@ -74,11 +74,16 @@ static int dart_is_u4;
381
382 #define DBG(...)
383
384 +static DEFINE_SPINLOCK(invalidate_lock);
385 +
386 static inline void dart_tlb_invalidate_all(void)
387 {
388 unsigned long l = 0;
389 unsigned int reg, inv_bit;
390 unsigned long limit;
391 + unsigned long flags;
392 +
393 + spin_lock_irqsave(&invalidate_lock, flags);
394
395 DBG("dart: flush\n");
396
397 @@ -111,12 +116,17 @@ retry:
398 panic("DART: TLB did not flush after waiting a long "
399 "time. Buggy U3 ?");
400 }
401 +
402 + spin_unlock_irqrestore(&invalidate_lock, flags);
403 }
404
405 static inline void dart_tlb_invalidate_one(unsigned long bus_rpn)
406 {
407 unsigned int reg;
408 unsigned int l, limit;
409 + unsigned long flags;
410 +
411 + spin_lock_irqsave(&invalidate_lock, flags);
412
413 reg = DART_CNTL_U4_ENABLE | DART_CNTL_U4_IONE |
414 (bus_rpn & DART_CNTL_U4_IONE_MASK);
415 @@ -138,6 +148,8 @@ wait_more:
416 panic("DART: TLB did not flush after waiting a long "
417 "time. Buggy U4 ?");
418 }
419 +
420 + spin_unlock_irqrestore(&invalidate_lock, flags);
421 }
422
423 static void dart_flush(struct iommu_table *tbl)
424 diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
425 index 2707023..637970c 100644
426 --- a/arch/score/kernel/process.c
427 +++ b/arch/score/kernel/process.c
428 @@ -27,6 +27,7 @@
429 #include <linux/reboot.h>
430 #include <linux/elfcore.h>
431 #include <linux/pm.h>
432 +#include <linux/rcupdate.h>
433
434 void (*pm_power_off)(void);
435 EXPORT_SYMBOL(pm_power_off);
436 @@ -50,9 +51,10 @@ void __noreturn cpu_idle(void)
437 {
438 /* endless idle loop with no priority at all */
439 while (1) {
440 + rcu_idle_enter();
441 while (!need_resched())
442 barrier();
443 -
444 + rcu_idle_exit();
445 schedule_preempt_disabled();
446 }
447 }
448 diff --git a/arch/x86/Makefile b/arch/x86/Makefile
449 index 474ca35..58790bd 100644
450 --- a/arch/x86/Makefile
451 +++ b/arch/x86/Makefile
452 @@ -92,7 +92,7 @@ endif
453 ifdef CONFIG_X86_X32
454 x32_ld_ok := $(call try-run,\
455 /bin/echo -e '1: .quad 1b' | \
456 - $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" - && \
457 + $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \
458 $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \
459 $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n)
460 ifeq ($(x32_ld_ok),y)
461 @@ -142,7 +142,7 @@ KBUILD_CFLAGS += $(call cc-option,-mno-avx,)
462 KBUILD_CFLAGS += $(mflags-y)
463 KBUILD_AFLAGS += $(mflags-y)
464
465 -archscripts: scripts_basic
466 +archscripts:
467 $(Q)$(MAKE) $(build)=arch/x86/tools relocs
468
469 ###
470 diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
471 index e398bb5..8a84501 100644
472 --- a/arch/x86/boot/compressed/Makefile
473 +++ b/arch/x86/boot/compressed/Makefile
474 @@ -28,6 +28,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
475 $(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \
476 $(obj)/piggy.o
477
478 +$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
479 +$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone
480 +
481 ifeq ($(CONFIG_EFI_STUB), y)
482 VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o
483 endif
484 diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
485 index 49afb3f..c3520d7 100644
486 --- a/arch/x86/include/asm/pgtable.h
487 +++ b/arch/x86/include/asm/pgtable.h
488 @@ -146,8 +146,7 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
489
490 static inline int pmd_large(pmd_t pte)
491 {
492 - return (pmd_flags(pte) & (_PAGE_PSE | _PAGE_PRESENT)) ==
493 - (_PAGE_PSE | _PAGE_PRESENT);
494 + return pmd_flags(pte) & _PAGE_PSE;
495 }
496
497 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
498 @@ -415,7 +414,13 @@ static inline int pte_hidden(pte_t pte)
499
500 static inline int pmd_present(pmd_t pmd)
501 {
502 - return pmd_flags(pmd) & _PAGE_PRESENT;
503 + /*
504 + * Checking for _PAGE_PSE is needed too because
505 + * split_huge_page will temporarily clear the present bit (but
506 + * the _PAGE_PSE flag will remain set at all times while the
507 + * _PAGE_PRESENT bit is clear).
508 + */
509 + return pmd_flags(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PSE);
510 }
511
512 static inline int pmd_none(pmd_t pmd)
513 diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
514 index 92660eda..f55a4ce 100644
515 --- a/arch/x86/platform/efi/efi.c
516 +++ b/arch/x86/platform/efi/efi.c
517 @@ -890,6 +890,7 @@ void __init efi_enter_virtual_mode(void)
518 *
519 * Call EFI services through wrapper functions.
520 */
521 + efi.runtime_version = efi_systab.fw_revision;
522 efi.get_time = virt_efi_get_time;
523 efi.set_time = virt_efi_set_time;
524 efi.get_wakeup_time = virt_efi_get_wakeup_time;
525 diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
526 index 2c8d6a3..bc44311 100644
527 --- a/arch/xtensa/kernel/process.c
528 +++ b/arch/xtensa/kernel/process.c
529 @@ -31,6 +31,7 @@
530 #include <linux/mqueue.h>
531 #include <linux/fs.h>
532 #include <linux/slab.h>
533 +#include <linux/rcupdate.h>
534
535 #include <asm/pgtable.h>
536 #include <asm/uaccess.h>
537 @@ -110,8 +111,10 @@ void cpu_idle(void)
538
539 /* endless idle loop with no priority at all */
540 while (1) {
541 + rcu_idle_enter();
542 while (!need_resched())
543 platform_idle();
544 + rcu_idle_exit();
545 schedule_preempt_disabled();
546 }
547 }
548 diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
549 index e059695..d59175e 100644
550 --- a/drivers/acpi/bus.c
551 +++ b/drivers/acpi/bus.c
552 @@ -994,8 +994,6 @@ static int __init acpi_bus_init(void)
553 status = acpi_ec_ecdt_probe();
554 /* Ignore result. Not having an ECDT is not fatal. */
555
556 - acpi_bus_osc_support();
557 -
558 status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
559 if (ACPI_FAILURE(status)) {
560 printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");
561 @@ -1003,6 +1001,12 @@ static int __init acpi_bus_init(void)
562 }
563
564 /*
565 + * _OSC method may exist in module level code,
566 + * so it must be run after ACPI_FULL_INITIALIZATION
567 + */
568 + acpi_bus_osc_support();
569 +
570 + /*
571 * _PDC control method may load dynamic SSDT tables,
572 * and we need to install the table handler before that.
573 */
574 diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
575 index 0113adc..2700f2e 100644
576 --- a/drivers/base/power/main.c
577 +++ b/drivers/base/power/main.c
578 @@ -996,7 +996,7 @@ int dpm_suspend_end(pm_message_t state)
579
580 error = dpm_suspend_noirq(state);
581 if (error) {
582 - dpm_resume_early(state);
583 + dpm_resume_early(resume_event(state));
584 return error;
585 }
586
587 diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
588 index 3491654..a815d44 100644
589 --- a/drivers/dma/dmaengine.c
590 +++ b/drivers/dma/dmaengine.c
591 @@ -582,7 +582,7 @@ void dmaengine_get(void)
592 list_del_rcu(&device->global_node);
593 break;
594 } else if (err)
595 - pr_err("%s: failed to get %s: (%d)\n",
596 + pr_debug("%s: failed to get %s: (%d)\n",
597 __func__, dma_chan_name(chan), err);
598 }
599 }
600 diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
601 index 6fbfc24..af81f77 100644
602 --- a/drivers/gpu/drm/drm_crtc.c
603 +++ b/drivers/gpu/drm/drm_crtc.c
604 @@ -1034,15 +1034,15 @@ void drm_mode_config_cleanup(struct drm_device *dev)
605 fb->funcs->destroy(fb);
606 }
607
608 - list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
609 - crtc->funcs->destroy(crtc);
610 - }
611 -
612 list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list,
613 head) {
614 plane->funcs->destroy(plane);
615 }
616
617 + list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
618 + crtc->funcs->destroy(crtc);
619 + }
620 +
621 idr_remove_all(&dev->mode_config.crtc_idr);
622 idr_destroy(&dev->mode_config.crtc_idr);
623 }
624 diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
625 index 5249640..73fa3e1 100644
626 --- a/drivers/gpu/drm/i915/i915_irq.c
627 +++ b/drivers/gpu/drm/i915/i915_irq.c
628 @@ -680,12 +680,12 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
629 intel_opregion_gse_intr(dev);
630
631 for (i = 0; i < 3; i++) {
632 + if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i)))
633 + drm_handle_vblank(dev, i);
634 if (de_iir & (DE_PLANEA_FLIP_DONE_IVB << (5 * i))) {
635 intel_prepare_page_flip(dev, i);
636 intel_finish_page_flip_plane(dev, i);
637 }
638 - if (de_iir & (DE_PIPEA_VBLANK_IVB << (5 * i)))
639 - drm_handle_vblank(dev, i);
640 }
641
642 /* check event from PCH */
643 @@ -767,6 +767,12 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
644 if (de_iir & DE_GSE)
645 intel_opregion_gse_intr(dev);
646
647 + if (de_iir & DE_PIPEA_VBLANK)
648 + drm_handle_vblank(dev, 0);
649 +
650 + if (de_iir & DE_PIPEB_VBLANK)
651 + drm_handle_vblank(dev, 1);
652 +
653 if (de_iir & DE_PLANEA_FLIP_DONE) {
654 intel_prepare_page_flip(dev, 0);
655 intel_finish_page_flip_plane(dev, 0);
656 @@ -777,12 +783,6 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
657 intel_finish_page_flip_plane(dev, 1);
658 }
659
660 - if (de_iir & DE_PIPEA_VBLANK)
661 - drm_handle_vblank(dev, 0);
662 -
663 - if (de_iir & DE_PIPEB_VBLANK)
664 - drm_handle_vblank(dev, 1);
665 -
666 /* check event from PCH */
667 if (de_iir & DE_PCH_EVENT) {
668 if (pch_iir & hotplug_mask)
669 diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
670 index 28725ce..a3e53c5 100644
671 --- a/drivers/gpu/drm/i915/i915_reg.h
672 +++ b/drivers/gpu/drm/i915/i915_reg.h
673 @@ -519,6 +519,9 @@
674 # define VS_TIMER_DISPATCH (1 << 6)
675 # define MI_FLUSH_ENABLE (1 << 12)
676
677 +#define GEN6_GT_MODE 0x20d0
678 +#define GEN6_GT_MODE_HI (1 << 9)
679 +
680 #define GFX_MODE 0x02520
681 #define GFX_MODE_GEN7 0x0229c
682 #define RING_MODE_GEN7(ring) ((ring)->mmio_base+0x29c)
683 @@ -1753,6 +1756,10 @@
684
685 /* Video Data Island Packet control */
686 #define VIDEO_DIP_DATA 0x61178
687 +/* Read the description of VIDEO_DIP_DATA (before Haswel) or VIDEO_DIP_ECC
688 + * (Haswell and newer) to see which VIDEO_DIP_DATA byte corresponds to each byte
689 + * of the infoframe structure specified by CEA-861. */
690 +#define VIDEO_DIP_DATA_SIZE 32
691 #define VIDEO_DIP_CTL 0x61170
692 /* Pre HSW: */
693 #define VIDEO_DIP_ENABLE (1 << 31)
694 diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
695 index c040aee..0c7f4aa 100644
696 --- a/drivers/gpu/drm/i915/intel_display.c
697 +++ b/drivers/gpu/drm/i915/intel_display.c
698 @@ -2823,13 +2823,34 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc)
699 udelay(100);
700 }
701
702 +static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc)
703 +{
704 + struct drm_device *dev = crtc->dev;
705 + struct drm_i915_private *dev_priv = dev->dev_private;
706 + unsigned long flags;
707 + bool pending;
708 +
709 + if (atomic_read(&dev_priv->mm.wedged))
710 + return false;
711 +
712 + spin_lock_irqsave(&dev->event_lock, flags);
713 + pending = to_intel_crtc(crtc)->unpin_work != NULL;
714 + spin_unlock_irqrestore(&dev->event_lock, flags);
715 +
716 + return pending;
717 +}
718 +
719 static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
720 {
721 struct drm_device *dev = crtc->dev;
722 + struct drm_i915_private *dev_priv = dev->dev_private;
723
724 if (crtc->fb == NULL)
725 return;
726
727 + wait_event(dev_priv->pending_flip_queue,
728 + !intel_crtc_has_pending_flip(crtc));
729 +
730 mutex_lock(&dev->struct_mutex);
731 intel_finish_fb(crtc->fb);
732 mutex_unlock(&dev->struct_mutex);
733 @@ -6149,9 +6170,8 @@ static void do_intel_finish_page_flip(struct drm_device *dev,
734
735 atomic_clear_mask(1 << intel_crtc->plane,
736 &obj->pending_flip.counter);
737 - if (atomic_read(&obj->pending_flip) == 0)
738 - wake_up(&dev_priv->pending_flip_queue);
739
740 + wake_up(&dev_priv->pending_flip_queue);
741 schedule_work(&work->work);
742
743 trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj);
744 @@ -6394,7 +6414,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
745 default:
746 WARN_ONCE(1, "unknown plane in flip command\n");
747 ret = -ENODEV;
748 - goto err;
749 + goto err_unpin;
750 }
751
752 ret = intel_ring_begin(ring, 4);
753 diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
754 index 12dc330..34b6724 100644
755 --- a/drivers/gpu/drm/i915/intel_hdmi.c
756 +++ b/drivers/gpu/drm/i915/intel_hdmi.c
757 @@ -151,6 +151,9 @@ static void g4x_write_infoframe(struct drm_encoder *encoder,
758 I915_WRITE(VIDEO_DIP_DATA, *data);
759 data++;
760 }
761 + /* Write every possible data byte to force correct ECC calculation. */
762 + for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
763 + I915_WRITE(VIDEO_DIP_DATA, 0);
764 mmiowb();
765
766 val |= g4x_infoframe_enable(frame);
767 @@ -186,6 +189,9 @@ static void ibx_write_infoframe(struct drm_encoder *encoder,
768 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
769 data++;
770 }
771 + /* Write every possible data byte to force correct ECC calculation. */
772 + for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
773 + I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
774 mmiowb();
775
776 val |= g4x_infoframe_enable(frame);
777 @@ -224,6 +230,9 @@ static void cpt_write_infoframe(struct drm_encoder *encoder,
778 I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
779 data++;
780 }
781 + /* Write every possible data byte to force correct ECC calculation. */
782 + for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
783 + I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
784 mmiowb();
785
786 val |= g4x_infoframe_enable(frame);
787 @@ -259,6 +268,9 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,
788 I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
789 data++;
790 }
791 + /* Write every possible data byte to force correct ECC calculation. */
792 + for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
793 + I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
794 mmiowb();
795
796 val |= g4x_infoframe_enable(frame);
797 @@ -292,6 +304,9 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
798 I915_WRITE(data_reg + i, *data);
799 data++;
800 }
801 + /* Write every possible data byte to force correct ECC calculation. */
802 + for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
803 + I915_WRITE(data_reg + i, 0);
804 mmiowb();
805
806 val |= hsw_infoframe_enable(frame);
807 diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
808 index ba8a27b..8c73fae 100644
809 --- a/drivers/gpu/drm/i915/intel_pm.c
810 +++ b/drivers/gpu/drm/i915/intel_pm.c
811 @@ -3387,6 +3387,11 @@ static void gen6_init_clock_gating(struct drm_device *dev)
812 DISPPLANE_TRICKLE_FEED_DISABLE);
813 intel_flush_display_plane(dev_priv, pipe);
814 }
815 +
816 + /* The default value should be 0x200 according to docs, but the two
817 + * platforms I checked have a 0 for this. (Maybe BIOS overrides?) */
818 + I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_DISABLE(0xffff));
819 + I915_WRITE(GEN6_GT_MODE, _MASKED_BIT_ENABLE(GEN6_GT_MODE_HI));
820 }
821
822 static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv)
823 diff --git a/drivers/gpu/drm/nouveau/nvc0_fence.c b/drivers/gpu/drm/nouveau/nvc0_fence.c
824 index 47ab388..8e5a2f4 100644
825 --- a/drivers/gpu/drm/nouveau/nvc0_fence.c
826 +++ b/drivers/gpu/drm/nouveau/nvc0_fence.c
827 @@ -32,6 +32,7 @@
828 struct nvc0_fence_priv {
829 struct nouveau_fence_priv base;
830 struct nouveau_bo *bo;
831 + u32 *suspend;
832 };
833
834 struct nvc0_fence_chan {
835 @@ -125,12 +126,36 @@ nvc0_fence_context_new(struct nouveau_channel *chan, int engine)
836 static int
837 nvc0_fence_fini(struct drm_device *dev, int engine, bool suspend)
838 {
839 + struct nouveau_fifo_priv *pfifo = nv_engine(dev, NVOBJ_ENGINE_FIFO);
840 + struct nvc0_fence_priv *priv = nv_engine(dev, engine);
841 + int i;
842 +
843 + if (suspend) {
844 + priv->suspend = vmalloc(pfifo->channels * sizeof(u32));
845 + if (!priv->suspend)
846 + return -ENOMEM;
847 +
848 + for (i = 0; i < pfifo->channels; i++)
849 + priv->suspend[i] = nouveau_bo_rd32(priv->bo, i);
850 + }
851 +
852 return 0;
853 }
854
855 static int
856 nvc0_fence_init(struct drm_device *dev, int engine)
857 {
858 + struct nouveau_fifo_priv *pfifo = nv_engine(dev, NVOBJ_ENGINE_FIFO);
859 + struct nvc0_fence_priv *priv = nv_engine(dev, engine);
860 + int i;
861 +
862 + if (priv->suspend) {
863 + for (i = 0; i < pfifo->channels; i++)
864 + nouveau_bo_wr32(priv->bo, i, priv->suspend[i]);
865 + vfree(priv->suspend);
866 + priv->suspend = NULL;
867 + }
868 +
869 return 0;
870 }
871
872 diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
873 index e44a62a..d883b20 100644
874 --- a/drivers/gpu/drm/radeon/evergreen_cs.c
875 +++ b/drivers/gpu/drm/radeon/evergreen_cs.c
876 @@ -846,6 +846,16 @@ static int evergreen_cs_track_validate_texture(struct radeon_cs_parser *p,
877 return -EINVAL;
878 }
879
880 + if (!mipmap) {
881 + if (llevel) {
882 + dev_warn(p->dev, "%s:%i got NULL MIP_ADDRESS relocation\n",
883 + __func__, __LINE__);
884 + return -EINVAL;
885 + } else {
886 + return 0; /* everything's ok */
887 + }
888 + }
889 +
890 /* check mipmap size */
891 for (i = 1; i <= llevel; i++) {
892 unsigned w, h, d;
893 @@ -1081,6 +1091,27 @@ static int evergreen_cs_packet_next_reloc(struct radeon_cs_parser *p,
894 }
895
896 /**
897 + * evergreen_cs_packet_next_is_pkt3_nop() - test if the next packet is NOP
898 + * @p: structure holding the parser context.
899 + *
900 + * Check if the next packet is a relocation packet3.
901 + **/
902 +static bool evergreen_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p)
903 +{
904 + struct radeon_cs_packet p3reloc;
905 + int r;
906 +
907 + r = evergreen_cs_packet_parse(p, &p3reloc, p->idx);
908 + if (r) {
909 + return false;
910 + }
911 + if (p3reloc.type != PACKET_TYPE3 || p3reloc.opcode != PACKET3_NOP) {
912 + return false;
913 + }
914 + return true;
915 +}
916 +
917 +/**
918 * evergreen_cs_packet_next_vline() - parse userspace VLINE packet
919 * @parser: parser structure holding parsing context.
920 *
921 @@ -2330,7 +2361,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
922 for (i = 0; i < (pkt->count / 8); i++) {
923 struct radeon_bo *texture, *mipmap;
924 u32 toffset, moffset;
925 - u32 size, offset;
926 + u32 size, offset, mip_address, tex_dim;
927
928 switch (G__SQ_CONSTANT_TYPE(radeon_get_ib_value(p, idx+1+(i*8)+7))) {
929 case SQ_TEX_VTX_VALID_TEXTURE:
930 @@ -2359,14 +2390,28 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
931 }
932 texture = reloc->robj;
933 toffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
934 +
935 /* tex mip base */
936 - r = evergreen_cs_packet_next_reloc(p, &reloc);
937 - if (r) {
938 - DRM_ERROR("bad SET_RESOURCE (tex)\n");
939 - return -EINVAL;
940 + tex_dim = ib[idx+1+(i*8)+0] & 0x7;
941 + mip_address = ib[idx+1+(i*8)+3];
942 +
943 + if ((tex_dim == SQ_TEX_DIM_2D_MSAA || tex_dim == SQ_TEX_DIM_2D_ARRAY_MSAA) &&
944 + !mip_address &&
945 + !evergreen_cs_packet_next_is_pkt3_nop(p)) {
946 + /* MIP_ADDRESS should point to FMASK for an MSAA texture.
947 + * It should be 0 if FMASK is disabled. */
948 + moffset = 0;
949 + mipmap = NULL;
950 + } else {
951 + r = evergreen_cs_packet_next_reloc(p, &reloc);
952 + if (r) {
953 + DRM_ERROR("bad SET_RESOURCE (tex)\n");
954 + return -EINVAL;
955 + }
956 + moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
957 + mipmap = reloc->robj;
958 }
959 - moffset = (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
960 - mipmap = reloc->robj;
961 +
962 r = evergreen_cs_track_validate_texture(p, texture, mipmap, idx+1+(i*8));
963 if (r)
964 return r;
965 diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c
966 index f37676d..dfa2448 100644
967 --- a/drivers/gpu/drm/radeon/r600_cs.c
968 +++ b/drivers/gpu/drm/radeon/r600_cs.c
969 @@ -2180,7 +2180,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
970 }
971 break;
972 case PACKET3_STRMOUT_BASE_UPDATE:
973 - if (p->family < CHIP_RV770) {
974 + /* RS780 and RS880 also need this */
975 + if (p->family < CHIP_RS780) {
976 DRM_ERROR("STRMOUT_BASE_UPDATE only supported on 7xx\n");
977 return -EINVAL;
978 }
979 diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
980 index 8c593ea..27ece75 100644
981 --- a/drivers/gpu/drm/radeon/radeon_drv.c
982 +++ b/drivers/gpu/drm/radeon/radeon_drv.c
983 @@ -64,9 +64,11 @@
984 * 2.20.0 - r600-si: RADEON_INFO_TIMESTAMP query
985 * 2.21.0 - r600-r700: FMASK and CMASK
986 * 2.22.0 - r600 only: RESOLVE_BOX allowed
987 + * 2.23.0 - allow STRMOUT_BASE_UPDATE on RS780 and RS880
988 + * 2.24.0 - eg only: allow MIP_ADDRESS=0 for MSAA textures
989 */
990 #define KMS_DRIVER_MAJOR 2
991 -#define KMS_DRIVER_MINOR 22
992 +#define KMS_DRIVER_MINOR 24
993 #define KMS_DRIVER_PATCHLEVEL 0
994 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
995 int radeon_driver_unload_kms(struct drm_device *dev);
996 diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
997 index afaa172..443bd49 100644
998 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
999 +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
1000 @@ -204,6 +204,16 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
1001 (rdev->pdev->subsystem_device == 0x01fd))
1002 return true;
1003
1004 + /* Gateway RS690 only seems to work with MSIs. */
1005 + if ((rdev->pdev->device == 0x791f) &&
1006 + (rdev->pdev->subsystem_vendor == 0x107b) &&
1007 + (rdev->pdev->subsystem_device == 0x0185))
1008 + return true;
1009 +
1010 + /* try and enable MSIs by default on all RS690s */
1011 + if (rdev->family == CHIP_RS690)
1012 + return true;
1013 +
1014 /* RV515 seems to have MSI issues where it loses
1015 * MSI rearms occasionally. This leads to lockups and freezes.
1016 * disable it by default.
1017 diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
1018 index 7ae6066..395d7e0 100644
1019 --- a/drivers/gpu/drm/radeon/radeon_pm.c
1020 +++ b/drivers/gpu/drm/radeon/radeon_pm.c
1021 @@ -547,7 +547,9 @@ void radeon_pm_suspend(struct radeon_device *rdev)
1022 void radeon_pm_resume(struct radeon_device *rdev)
1023 {
1024 /* set up the default clocks if the MC ucode is loaded */
1025 - if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
1026 + if ((rdev->family >= CHIP_BARTS) &&
1027 + (rdev->family <= CHIP_CAYMAN) &&
1028 + rdev->mc_fw) {
1029 if (rdev->pm.default_vddc)
1030 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
1031 SET_VOLTAGE_TYPE_ASIC_VDDC);
1032 @@ -602,7 +604,9 @@ int radeon_pm_init(struct radeon_device *rdev)
1033 radeon_pm_print_states(rdev);
1034 radeon_pm_init_profile(rdev);
1035 /* set up the default clocks if the MC ucode is loaded */
1036 - if (ASIC_IS_DCE5(rdev) && rdev->mc_fw) {
1037 + if ((rdev->family >= CHIP_BARTS) &&
1038 + (rdev->family <= CHIP_CAYMAN) &&
1039 + rdev->mc_fw) {
1040 if (rdev->pm.default_vddc)
1041 radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
1042 SET_VOLTAGE_TYPE_ASIC_VDDC);
1043 diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c
1044 index 1efbb90..c89aef4 100644
1045 --- a/drivers/gpu/drm/savage/savage_bci.c
1046 +++ b/drivers/gpu/drm/savage/savage_bci.c
1047 @@ -547,6 +547,8 @@ int savage_driver_load(struct drm_device *dev, unsigned long chipset)
1048
1049 dev_priv->chipset = (enum savage_family)chipset;
1050
1051 + pci_set_master(dev->pdev);
1052 +
1053 return 0;
1054 }
1055
1056 diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
1057 index 3b6f7bf..c46c5f1 100644
1058 --- a/drivers/hid/hidraw.c
1059 +++ b/drivers/hid/hidraw.c
1060 @@ -42,6 +42,7 @@ static struct cdev hidraw_cdev;
1061 static struct class *hidraw_class;
1062 static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES];
1063 static DEFINE_MUTEX(minors_lock);
1064 +static void drop_ref(struct hidraw *hid, int exists_bit);
1065
1066 static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1067 {
1068 @@ -113,7 +114,7 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer,
1069 __u8 *buf;
1070 int ret = 0;
1071
1072 - if (!hidraw_table[minor]) {
1073 + if (!hidraw_table[minor] || !hidraw_table[minor]->exist) {
1074 ret = -ENODEV;
1075 goto out;
1076 }
1077 @@ -261,7 +262,7 @@ static int hidraw_open(struct inode *inode, struct file *file)
1078 }
1079
1080 mutex_lock(&minors_lock);
1081 - if (!hidraw_table[minor]) {
1082 + if (!hidraw_table[minor] || !hidraw_table[minor]->exist) {
1083 err = -ENODEV;
1084 goto out_unlock;
1085 }
1086 @@ -298,36 +299,12 @@ out:
1087 static int hidraw_release(struct inode * inode, struct file * file)
1088 {
1089 unsigned int minor = iminor(inode);
1090 - struct hidraw *dev;
1091 struct hidraw_list *list = file->private_data;
1092 - int ret;
1093 - int i;
1094 -
1095 - mutex_lock(&minors_lock);
1096 - if (!hidraw_table[minor]) {
1097 - ret = -ENODEV;
1098 - goto unlock;
1099 - }
1100
1101 + drop_ref(hidraw_table[minor], 0);
1102 list_del(&list->node);
1103 - dev = hidraw_table[minor];
1104 - if (!--dev->open) {
1105 - if (list->hidraw->exist) {
1106 - hid_hw_power(dev->hid, PM_HINT_NORMAL);
1107 - hid_hw_close(dev->hid);
1108 - } else {
1109 - kfree(list->hidraw);
1110 - }
1111 - }
1112 -
1113 - for (i = 0; i < HIDRAW_BUFFER_SIZE; ++i)
1114 - kfree(list->buffer[i].value);
1115 kfree(list);
1116 - ret = 0;
1117 -unlock:
1118 - mutex_unlock(&minors_lock);
1119 -
1120 - return ret;
1121 + return 0;
1122 }
1123
1124 static long hidraw_ioctl(struct file *file, unsigned int cmd,
1125 @@ -529,21 +506,7 @@ EXPORT_SYMBOL_GPL(hidraw_connect);
1126 void hidraw_disconnect(struct hid_device *hid)
1127 {
1128 struct hidraw *hidraw = hid->hidraw;
1129 -
1130 - mutex_lock(&minors_lock);
1131 - hidraw->exist = 0;
1132 -
1133 - device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
1134 -
1135 - hidraw_table[hidraw->minor] = NULL;
1136 -
1137 - if (hidraw->open) {
1138 - hid_hw_close(hid);
1139 - wake_up_interruptible(&hidraw->wait);
1140 - } else {
1141 - kfree(hidraw);
1142 - }
1143 - mutex_unlock(&minors_lock);
1144 + drop_ref(hidraw, 1);
1145 }
1146 EXPORT_SYMBOL_GPL(hidraw_disconnect);
1147
1148 @@ -585,3 +548,23 @@ void hidraw_exit(void)
1149 unregister_chrdev_region(dev_id, HIDRAW_MAX_DEVICES);
1150
1151 }
1152 +
1153 +static void drop_ref(struct hidraw *hidraw, int exists_bit)
1154 +{
1155 + mutex_lock(&minors_lock);
1156 + if (exists_bit) {
1157 + hid_hw_close(hidraw->hid);
1158 + hidraw->exist = 0;
1159 + if (hidraw->open)
1160 + wake_up_interruptible(&hidraw->wait);
1161 + } else {
1162 + --hidraw->open;
1163 + }
1164 +
1165 + if (!hidraw->open && !hidraw->exist) {
1166 + device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
1167 + hidraw_table[hidraw->minor] = NULL;
1168 + kfree(hidraw);
1169 + }
1170 + mutex_unlock(&minors_lock);
1171 +}
1172 diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
1173 index ef511df..8bbd6ec 100644
1174 --- a/drivers/i2c/busses/i2c-piix4.c
1175 +++ b/drivers/i2c/busses/i2c-piix4.c
1176 @@ -37,6 +37,7 @@
1177 #include <linux/stddef.h>
1178 #include <linux/ioport.h>
1179 #include <linux/i2c.h>
1180 +#include <linux/slab.h>
1181 #include <linux/init.h>
1182 #include <linux/dmi.h>
1183 #include <linux/acpi.h>
1184 diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
1185 index 2297ec1..cb9e114 100644
1186 --- a/drivers/iommu/intel-iommu.c
1187 +++ b/drivers/iommu/intel-iommu.c
1188 @@ -589,7 +589,9 @@ static void domain_update_iommu_coherency(struct dmar_domain *domain)
1189 {
1190 int i;
1191
1192 - domain->iommu_coherency = 1;
1193 + i = find_first_bit(domain->iommu_bmp, g_num_of_iommus);
1194 +
1195 + domain->iommu_coherency = i < g_num_of_iommus ? 1 : 0;
1196
1197 for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus) {
1198 if (!ecap_coherent(g_iommus[i]->ecap)) {
1199 diff --git a/drivers/media/dvb/frontends/drxk.h b/drivers/media/dvb/frontends/drxk.h
1200 index d615d7d..94fecfb 100644
1201 --- a/drivers/media/dvb/frontends/drxk.h
1202 +++ b/drivers/media/dvb/frontends/drxk.h
1203 @@ -28,6 +28,7 @@
1204 * A value of 0 (default) or lower indicates that
1205 * the correct number of parameters will be
1206 * automatically detected.
1207 + * @load_firmware_sync: Force the firmware load to be synchronous.
1208 *
1209 * On the *_gpio vars, bit 0 is UIO-1, bit 1 is UIO-2 and bit 2 is
1210 * UIO-3.
1211 @@ -39,6 +40,7 @@ struct drxk_config {
1212 bool parallel_ts;
1213 bool dynamic_clk;
1214 bool enable_merr_cfg;
1215 + bool load_firmware_sync;
1216
1217 bool antenna_dvbt;
1218 u16 antenna_gpio;
1219 diff --git a/drivers/media/dvb/frontends/drxk_hard.c b/drivers/media/dvb/frontends/drxk_hard.c
1220 index 1ab8154..8b4c6d5 100644
1221 --- a/drivers/media/dvb/frontends/drxk_hard.c
1222 +++ b/drivers/media/dvb/frontends/drxk_hard.c
1223 @@ -6609,15 +6609,25 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
1224
1225 /* Load firmware and initialize DRX-K */
1226 if (state->microcode_name) {
1227 - status = request_firmware_nowait(THIS_MODULE, 1,
1228 + if (config->load_firmware_sync) {
1229 + const struct firmware *fw = NULL;
1230 +
1231 + status = request_firmware(&fw, state->microcode_name,
1232 + state->i2c->dev.parent);
1233 + if (status < 0)
1234 + fw = NULL;
1235 + load_firmware_cb(fw, state);
1236 + } else {
1237 + status = request_firmware_nowait(THIS_MODULE, 1,
1238 state->microcode_name,
1239 state->i2c->dev.parent,
1240 GFP_KERNEL,
1241 state, load_firmware_cb);
1242 - if (status < 0) {
1243 - printk(KERN_ERR
1244 - "drxk: failed to request a firmware\n");
1245 - return NULL;
1246 + if (status < 0) {
1247 + printk(KERN_ERR
1248 + "drxk: failed to request a firmware\n");
1249 + return NULL;
1250 + }
1251 }
1252 } else if (init_drxk(state) < 0)
1253 goto error;
1254 diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
1255 index 36fe5a3..24c77a4 100644
1256 --- a/drivers/media/rc/ite-cir.c
1257 +++ b/drivers/media/rc/ite-cir.c
1258 @@ -1473,6 +1473,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
1259 rdev = rc_allocate_device();
1260 if (!rdev)
1261 goto failure;
1262 + itdev->rdev = rdev;
1263
1264 ret = -ENODEV;
1265
1266 @@ -1604,7 +1605,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
1267 if (ret)
1268 goto failure3;
1269
1270 - itdev->rdev = rdev;
1271 ite_pr(KERN_NOTICE, "driver has been successfully loaded\n");
1272
1273 return 0;
1274 diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
1275 index ca62b99..ab98d08 100644
1276 --- a/drivers/media/video/em28xx/em28xx-cards.c
1277 +++ b/drivers/media/video/em28xx/em28xx-cards.c
1278 @@ -2875,12 +2875,20 @@ static void em28xx_card_setup(struct em28xx *dev)
1279 }
1280
1281
1282 -#if defined(CONFIG_MODULES) && defined(MODULE)
1283 static void request_module_async(struct work_struct *work)
1284 {
1285 struct em28xx *dev = container_of(work,
1286 struct em28xx, request_module_wk);
1287
1288 + /*
1289 + * The em28xx extensions can be modules or builtin. If the
1290 + * modules are already loaded or are built in, those extensions
1291 + * can be initialised right now. Otherwise, the module init
1292 + * code will do it.
1293 + */
1294 + em28xx_init_extension(dev);
1295 +
1296 +#if defined(CONFIG_MODULES) && defined(MODULE)
1297 if (dev->has_audio_class)
1298 request_module("snd-usb-audio");
1299 else if (dev->has_alsa_audio)
1300 @@ -2890,6 +2898,7 @@ static void request_module_async(struct work_struct *work)
1301 request_module("em28xx-dvb");
1302 if (dev->board.ir_codes && !disable_ir)
1303 request_module("em28xx-rc");
1304 +#endif /* CONFIG_MODULES */
1305 }
1306
1307 static void request_modules(struct em28xx *dev)
1308 @@ -2902,10 +2911,6 @@ static void flush_request_modules(struct em28xx *dev)
1309 {
1310 flush_work_sync(&dev->request_module_wk);
1311 }
1312 -#else
1313 -#define request_modules(dev)
1314 -#define flush_request_modules(dev)
1315 -#endif /* CONFIG_MODULES */
1316
1317 /*
1318 * em28xx_release_resources()
1319 @@ -3324,13 +3329,6 @@ static int em28xx_usb_probe(struct usb_interface *interface,
1320 */
1321 mutex_unlock(&dev->lock);
1322
1323 - /*
1324 - * These extensions can be modules. If the modules are already
1325 - * loaded then we can initialise the device now, otherwise we
1326 - * will initialise it when the modules load instead.
1327 - */
1328 - em28xx_init_extension(dev);
1329 -
1330 return 0;
1331
1332 unlock_and_free:
1333 diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c
1334 index a16531f..7353143 100644
1335 --- a/drivers/media/video/em28xx/em28xx-dvb.c
1336 +++ b/drivers/media/video/em28xx/em28xx-dvb.c
1337 @@ -316,6 +316,7 @@ static struct drxk_config terratec_h5_drxk = {
1338 .no_i2c_bridge = 1,
1339 .microcode_name = "dvb-usb-terratec-h5-drxk.fw",
1340 .qam_demod_parameter_count = 2,
1341 + .load_firmware_sync = true,
1342 };
1343
1344 static struct drxk_config hauppauge_930c_drxk = {
1345 @@ -325,6 +326,7 @@ static struct drxk_config hauppauge_930c_drxk = {
1346 .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw",
1347 .chunk_size = 56,
1348 .qam_demod_parameter_count = 2,
1349 + .load_firmware_sync = true,
1350 };
1351
1352 struct drxk_config terratec_htc_stick_drxk = {
1353 @@ -338,12 +340,14 @@ struct drxk_config terratec_htc_stick_drxk = {
1354 .antenna_dvbt = true,
1355 /* The windows driver uses the same. This will disable LNA. */
1356 .antenna_gpio = 0x6,
1357 + .load_firmware_sync = true,
1358 };
1359
1360 static struct drxk_config maxmedia_ub425_tc_drxk = {
1361 .adr = 0x29,
1362 .single_master = 1,
1363 .no_i2c_bridge = 1,
1364 + .load_firmware_sync = true,
1365 };
1366
1367 static struct drxk_config pctv_520e_drxk = {
1368 @@ -354,6 +358,7 @@ static struct drxk_config pctv_520e_drxk = {
1369 .chunk_size = 58,
1370 .antenna_dvbt = true, /* disable LNA */
1371 .antenna_gpio = (1 << 2), /* disable LNA */
1372 + .load_firmware_sync = true,
1373 };
1374
1375 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
1376 diff --git a/drivers/media/video/gspca/pac7302.c b/drivers/media/video/gspca/pac7302.c
1377 index 4877f7a..eb3c90e4 100644
1378 --- a/drivers/media/video/gspca/pac7302.c
1379 +++ b/drivers/media/video/gspca/pac7302.c
1380 @@ -616,7 +616,7 @@ static int sd_init_controls(struct gspca_dev *gspca_dev)
1381 sd->red_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1382 V4L2_CID_RED_BALANCE, 0, 3, 1, 1);
1383 sd->blue_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1384 - V4L2_CID_RED_BALANCE, 0, 3, 1, 1);
1385 + V4L2_CID_BLUE_BALANCE, 0, 3, 1, 1);
1386
1387 gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1388 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1389 @@ -905,6 +905,7 @@ static const struct usb_device_id device_table[] = {
1390 {USB_DEVICE(0x093a, 0x262a)},
1391 {USB_DEVICE(0x093a, 0x262c)},
1392 {USB_DEVICE(0x145f, 0x013c)},
1393 + {USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */
1394 {}
1395 };
1396 MODULE_DEVICE_TABLE(usb, device_table);
1397 diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c
1398 index b73f033..81ba655 100644
1399 --- a/drivers/mfd/88pm860x-core.c
1400 +++ b/drivers/mfd/88pm860x-core.c
1401 @@ -21,40 +21,73 @@
1402
1403 #define INT_STATUS_NUM 3
1404
1405 +static struct resource io_parent = {
1406 + .start = 0,
1407 + .end = 0xffffffff,
1408 + .flags = IORESOURCE_IO,
1409 +};
1410 +
1411 static struct resource bk_resources[] __devinitdata = {
1412 - {PM8606_BACKLIGHT1, PM8606_BACKLIGHT1, "backlight-0", IORESOURCE_IO,},
1413 - {PM8606_BACKLIGHT2, PM8606_BACKLIGHT2, "backlight-1", IORESOURCE_IO,},
1414 - {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO,},
1415 + {PM8606_BACKLIGHT1, PM8606_BACKLIGHT1, "backlight-0", IORESOURCE_IO,
1416 + &io_parent,},
1417 + {PM8606_BACKLIGHT2, PM8606_BACKLIGHT2, "backlight-1", IORESOURCE_IO,
1418 + &io_parent,},
1419 + {PM8606_BACKLIGHT3, PM8606_BACKLIGHT3, "backlight-2", IORESOURCE_IO,
1420 + &io_parent,},
1421 };
1422
1423 static struct resource led_resources[] __devinitdata = {
1424 - {PM8606_LED1_RED, PM8606_LED1_RED, "led0-red", IORESOURCE_IO,},
1425 - {PM8606_LED1_GREEN, PM8606_LED1_GREEN, "led0-green", IORESOURCE_IO,},
1426 - {PM8606_LED1_BLUE, PM8606_LED1_BLUE, "led0-blue", IORESOURCE_IO,},
1427 - {PM8606_LED2_RED, PM8606_LED2_RED, "led1-red", IORESOURCE_IO,},
1428 - {PM8606_LED2_GREEN, PM8606_LED2_GREEN, "led1-green", IORESOURCE_IO,},
1429 - {PM8606_LED2_BLUE, PM8606_LED2_BLUE, "led1-blue", IORESOURCE_IO,},
1430 + {PM8606_LED1_RED, PM8606_LED1_RED, "led0-red", IORESOURCE_IO,
1431 + &io_parent,},
1432 + {PM8606_LED1_GREEN, PM8606_LED1_GREEN, "led0-green", IORESOURCE_IO,
1433 + &io_parent,},
1434 + {PM8606_LED1_BLUE, PM8606_LED1_BLUE, "led0-blue", IORESOURCE_IO,
1435 + &io_parent,},
1436 + {PM8606_LED2_RED, PM8606_LED2_RED, "led1-red", IORESOURCE_IO,
1437 + &io_parent,},
1438 + {PM8606_LED2_GREEN, PM8606_LED2_GREEN, "led1-green", IORESOURCE_IO,
1439 + &io_parent,},
1440 + {PM8606_LED2_BLUE, PM8606_LED2_BLUE, "led1-blue", IORESOURCE_IO,
1441 + &io_parent,},
1442 };
1443
1444 static struct resource regulator_resources[] __devinitdata = {
1445 - {PM8607_ID_BUCK1, PM8607_ID_BUCK1, "buck-1", IORESOURCE_IO,},
1446 - {PM8607_ID_BUCK2, PM8607_ID_BUCK2, "buck-2", IORESOURCE_IO,},
1447 - {PM8607_ID_BUCK3, PM8607_ID_BUCK3, "buck-3", IORESOURCE_IO,},
1448 - {PM8607_ID_LDO1, PM8607_ID_LDO1, "ldo-01", IORESOURCE_IO,},
1449 - {PM8607_ID_LDO2, PM8607_ID_LDO2, "ldo-02", IORESOURCE_IO,},
1450 - {PM8607_ID_LDO3, PM8607_ID_LDO3, "ldo-03", IORESOURCE_IO,},
1451 - {PM8607_ID_LDO4, PM8607_ID_LDO4, "ldo-04", IORESOURCE_IO,},
1452 - {PM8607_ID_LDO5, PM8607_ID_LDO5, "ldo-05", IORESOURCE_IO,},
1453 - {PM8607_ID_LDO6, PM8607_ID_LDO6, "ldo-06", IORESOURCE_IO,},
1454 - {PM8607_ID_LDO7, PM8607_ID_LDO7, "ldo-07", IORESOURCE_IO,},
1455 - {PM8607_ID_LDO8, PM8607_ID_LDO8, "ldo-08", IORESOURCE_IO,},
1456 - {PM8607_ID_LDO9, PM8607_ID_LDO9, "ldo-09", IORESOURCE_IO,},
1457 - {PM8607_ID_LDO10, PM8607_ID_LDO10, "ldo-10", IORESOURCE_IO,},
1458 - {PM8607_ID_LDO11, PM8607_ID_LDO11, "ldo-11", IORESOURCE_IO,},
1459 - {PM8607_ID_LDO12, PM8607_ID_LDO12, "ldo-12", IORESOURCE_IO,},
1460 - {PM8607_ID_LDO13, PM8607_ID_LDO13, "ldo-13", IORESOURCE_IO,},
1461 - {PM8607_ID_LDO14, PM8607_ID_LDO14, "ldo-14", IORESOURCE_IO,},
1462 - {PM8607_ID_LDO15, PM8607_ID_LDO15, "ldo-15", IORESOURCE_IO,},
1463 + {PM8607_ID_BUCK1, PM8607_ID_BUCK1, "buck-1", IORESOURCE_IO,
1464 + &io_parent,},
1465 + {PM8607_ID_BUCK2, PM8607_ID_BUCK2, "buck-2", IORESOURCE_IO,
1466 + &io_parent,},
1467 + {PM8607_ID_BUCK3, PM8607_ID_BUCK3, "buck-3", IORESOURCE_IO,
1468 + &io_parent,},
1469 + {PM8607_ID_LDO1, PM8607_ID_LDO1, "ldo-01", IORESOURCE_IO,
1470 + &io_parent,},
1471 + {PM8607_ID_LDO2, PM8607_ID_LDO2, "ldo-02", IORESOURCE_IO,
1472 + &io_parent,},
1473 + {PM8607_ID_LDO3, PM8607_ID_LDO3, "ldo-03", IORESOURCE_IO,
1474 + &io_parent,},
1475 + {PM8607_ID_LDO4, PM8607_ID_LDO4, "ldo-04", IORESOURCE_IO,
1476 + &io_parent,},
1477 + {PM8607_ID_LDO5, PM8607_ID_LDO5, "ldo-05", IORESOURCE_IO,
1478 + &io_parent,},
1479 + {PM8607_ID_LDO6, PM8607_ID_LDO6, "ldo-06", IORESOURCE_IO,
1480 + &io_parent,},
1481 + {PM8607_ID_LDO7, PM8607_ID_LDO7, "ldo-07", IORESOURCE_IO,
1482 + &io_parent,},
1483 + {PM8607_ID_LDO8, PM8607_ID_LDO8, "ldo-08", IORESOURCE_IO,
1484 + &io_parent,},
1485 + {PM8607_ID_LDO9, PM8607_ID_LDO9, "ldo-09", IORESOURCE_IO,
1486 + &io_parent,},
1487 + {PM8607_ID_LDO10, PM8607_ID_LDO10, "ldo-10", IORESOURCE_IO,
1488 + &io_parent,},
1489 + {PM8607_ID_LDO11, PM8607_ID_LDO11, "ldo-11", IORESOURCE_IO,
1490 + &io_parent,},
1491 + {PM8607_ID_LDO12, PM8607_ID_LDO12, "ldo-12", IORESOURCE_IO,
1492 + &io_parent,},
1493 + {PM8607_ID_LDO13, PM8607_ID_LDO13, "ldo-13", IORESOURCE_IO,
1494 + &io_parent,},
1495 + {PM8607_ID_LDO14, PM8607_ID_LDO14, "ldo-14", IORESOURCE_IO,
1496 + &io_parent,},
1497 + {PM8607_ID_LDO15, PM8607_ID_LDO15, "ldo-15", IORESOURCE_IO,
1498 + &io_parent,},
1499 };
1500
1501 static struct resource touch_resources[] __devinitdata = {
1502 @@ -91,11 +124,12 @@ static struct resource charger_resources[] __devinitdata = {
1503 };
1504
1505 static struct resource preg_resources[] __devinitdata = {
1506 - {PM8606_ID_PREG, PM8606_ID_PREG, "preg", IORESOURCE_IO,},
1507 + {PM8606_ID_PREG, PM8606_ID_PREG, "preg", IORESOURCE_IO,
1508 + &io_parent,},
1509 };
1510
1511 static struct resource rtc_resources[] __devinitdata = {
1512 - {PM8607_IRQ_RTC, PM8607_IRQ_RTC, "rtc", IORESOURCE_IRQ,},
1513 + {PM8607_IRQ_RTC, PM8607_IRQ_RTC, "rtc", IORESOURCE_IRQ, &io_parent,},
1514 };
1515
1516 static struct mfd_cell bk_devs[] = {
1517 diff --git a/drivers/mfd/max8925-core.c b/drivers/mfd/max8925-core.c
1518 index ee53757..66d08a7 100644
1519 --- a/drivers/mfd/max8925-core.c
1520 +++ b/drivers/mfd/max8925-core.c
1521 @@ -18,12 +18,19 @@
1522 #include <linux/mfd/core.h>
1523 #include <linux/mfd/max8925.h>
1524
1525 +static struct resource io_parent = {
1526 + .start = 0,
1527 + .end = 0xffffffff,
1528 + .flags = IORESOURCE_IO,
1529 +};
1530 +
1531 static struct resource backlight_resources[] = {
1532 {
1533 .name = "max8925-backlight",
1534 .start = MAX8925_WLED_MODE_CNTL,
1535 .end = MAX8925_WLED_CNTL,
1536 .flags = IORESOURCE_IO,
1537 + .parent = &io_parent,
1538 },
1539 };
1540
1541 @@ -42,6 +49,7 @@ static struct resource touch_resources[] = {
1542 .start = MAX8925_TSC_IRQ,
1543 .end = MAX8925_ADC_RES_END,
1544 .flags = IORESOURCE_IO,
1545 + .parent = &io_parent,
1546 },
1547 };
1548
1549 @@ -60,6 +68,7 @@ static struct resource power_supply_resources[] = {
1550 .start = MAX8925_CHG_IRQ1,
1551 .end = MAX8925_CHG_IRQ1_MASK,
1552 .flags = IORESOURCE_IO,
1553 + .parent = &io_parent,
1554 },
1555 };
1556
1557 @@ -118,6 +127,7 @@ static struct mfd_cell onkey_devs[] = {
1558 .start = MAX8925_##_start, \
1559 .end = MAX8925_##_end, \
1560 .flags = IORESOURCE_IO, \
1561 + .parent = &io_parent, \
1562 }
1563
1564 static struct resource regulator_resources[] = {
1565 diff --git a/drivers/mmc/core/slot-gpio.c b/drivers/mmc/core/slot-gpio.c
1566 index 0582429..08c6b3d 100644
1567 --- a/drivers/mmc/core/slot-gpio.c
1568 +++ b/drivers/mmc/core/slot-gpio.c
1569 @@ -100,7 +100,13 @@ int mmc_gpio_request_ro(struct mmc_host *host, unsigned int gpio)
1570
1571 ctx = host->slot.handler_priv;
1572
1573 - return gpio_request_one(gpio, GPIOF_DIR_IN, ctx->ro_label);
1574 + ret = gpio_request_one(gpio, GPIOF_DIR_IN, ctx->ro_label);
1575 + if (ret < 0)
1576 + return ret;
1577 +
1578 + ctx->ro_gpio = gpio;
1579 +
1580 + return 0;
1581 }
1582 EXPORT_SYMBOL(mmc_gpio_request_ro);
1583
1584 diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
1585 index 3a09f93..ed4945c 100644
1586 --- a/drivers/mmc/host/omap_hsmmc.c
1587 +++ b/drivers/mmc/host/omap_hsmmc.c
1588 @@ -2106,8 +2106,7 @@ static int omap_hsmmc_suspend(struct device *dev)
1589 if (ret) {
1590 host->suspended = 0;
1591 if (host->pdata->resume) {
1592 - ret = host->pdata->resume(dev, host->slot_id);
1593 - if (ret)
1594 + if (host->pdata->resume(dev, host->slot_id))
1595 dev_dbg(dev, "Unmask interrupt failed\n");
1596 }
1597 goto err;
1598 diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
1599 index 5d81427..ba0e493 100644
1600 --- a/drivers/mmc/host/sh_mmcif.c
1601 +++ b/drivers/mmc/host/sh_mmcif.c
1602 @@ -1229,6 +1229,10 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id)
1603 host->sd_error = true;
1604 dev_dbg(&host->pd->dev, "int err state = %08x\n", state);
1605 }
1606 + if (host->state == STATE_IDLE) {
1607 + dev_info(&host->pd->dev, "Spurious IRQ status 0x%x", state);
1608 + return IRQ_HANDLED;
1609 + }
1610 if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) {
1611 if (!host->dma_active)
1612 return IRQ_WAKE_THREAD;
1613 diff --git a/drivers/mtd/maps/autcpu12-nvram.c b/drivers/mtd/maps/autcpu12-nvram.c
1614 index e5bfd0e..0598d52 100644
1615 --- a/drivers/mtd/maps/autcpu12-nvram.c
1616 +++ b/drivers/mtd/maps/autcpu12-nvram.c
1617 @@ -43,7 +43,8 @@ struct map_info autcpu12_sram_map = {
1618
1619 static int __init init_autcpu12_sram (void)
1620 {
1621 - int err, save0, save1;
1622 + map_word tmp, save0, save1;
1623 + int err;
1624
1625 autcpu12_sram_map.virt = ioremap(0x12000000, SZ_128K);
1626 if (!autcpu12_sram_map.virt) {
1627 @@ -51,7 +52,7 @@ static int __init init_autcpu12_sram (void)
1628 err = -EIO;
1629 goto out;
1630 }
1631 - simple_map_init(&autcpu_sram_map);
1632 + simple_map_init(&autcpu12_sram_map);
1633
1634 /*
1635 * Check for 32K/128K
1636 @@ -61,20 +62,22 @@ static int __init init_autcpu12_sram (void)
1637 * Read and check result on ofs 0x0
1638 * Restore contents
1639 */
1640 - save0 = map_read32(&autcpu12_sram_map,0);
1641 - save1 = map_read32(&autcpu12_sram_map,0x10000);
1642 - map_write32(&autcpu12_sram_map,~save0,0x10000);
1643 + save0 = map_read(&autcpu12_sram_map, 0);
1644 + save1 = map_read(&autcpu12_sram_map, 0x10000);
1645 + tmp.x[0] = ~save0.x[0];
1646 + map_write(&autcpu12_sram_map, tmp, 0x10000);
1647 /* if we find this pattern on 0x0, we have 32K size
1648 * restore contents and exit
1649 */
1650 - if ( map_read32(&autcpu12_sram_map,0) != save0) {
1651 - map_write32(&autcpu12_sram_map,save0,0x0);
1652 + tmp = map_read(&autcpu12_sram_map, 0);
1653 + if (!map_word_equal(&autcpu12_sram_map, tmp, save0)) {
1654 + map_write(&autcpu12_sram_map, save0, 0x0);
1655 goto map;
1656 }
1657 /* We have a 128K found, restore 0x10000 and set size
1658 * to 128K
1659 */
1660 - map_write32(&autcpu12_sram_map,save1,0x10000);
1661 + map_write(&autcpu12_sram_map, save1, 0x10000);
1662 autcpu12_sram_map.size = SZ_128K;
1663
1664 map:
1665 diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
1666 index d518e4d..f8c08ec 100644
1667 --- a/drivers/mtd/mtdpart.c
1668 +++ b/drivers/mtd/mtdpart.c
1669 @@ -711,6 +711,8 @@ static const char *default_mtd_part_types[] = {
1670 * partition parsers, specified in @types. However, if @types is %NULL, then
1671 * the default list of parsers is used. The default list contains only the
1672 * "cmdlinepart" and "ofpart" parsers ATM.
1673 + * Note: If there are more then one parser in @types, the kernel only takes the
1674 + * partitions parsed out by the first parser.
1675 *
1676 * This function may return:
1677 * o a negative error code in case of failure
1678 @@ -735,11 +737,12 @@ int parse_mtd_partitions(struct mtd_info *master, const char **types,
1679 if (!parser)
1680 continue;
1681 ret = (*parser->parse_fn)(master, pparts, data);
1682 + put_partition_parser(parser);
1683 if (ret > 0) {
1684 printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
1685 ret, parser->name, master->name);
1686 + break;
1687 }
1688 - put_partition_parser(parser);
1689 }
1690 return ret;
1691 }
1692 diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
1693 index 30d1319..c126469 100644
1694 --- a/drivers/mtd/nand/nand_bbt.c
1695 +++ b/drivers/mtd/nand/nand_bbt.c
1696 @@ -390,7 +390,7 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
1697 /* Read the mirror version, if available */
1698 if (md && (md->options & NAND_BBT_VERSION)) {
1699 scan_read_raw(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
1700 - mtd->writesize, td);
1701 + mtd->writesize, md);
1702 md->version[0] = buf[bbt_get_ver_offs(mtd, md)];
1703 pr_info("Bad block table at page %d, version 0x%02X\n",
1704 md->pages[0], md->version[0]);
1705 diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c
1706 index cf0cd31..5d881180 100644
1707 --- a/drivers/mtd/nand/nandsim.c
1708 +++ b/drivers/mtd/nand/nandsim.c
1709 @@ -2333,6 +2333,7 @@ static int __init ns_init_module(void)
1710 uint64_t new_size = (uint64_t)nsmtd->erasesize << overridesize;
1711 if (new_size >> overridesize != nsmtd->erasesize) {
1712 NS_ERR("overridesize is too big\n");
1713 + retval = -EINVAL;
1714 goto err_exit;
1715 }
1716 /* N.B. This relies on nand_scan not doing anything with the size before we change it */
1717 diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
1718 index ac4fd75..48f1d4e 100644
1719 --- a/drivers/mtd/nand/omap2.c
1720 +++ b/drivers/mtd/nand/omap2.c
1721 @@ -1387,7 +1387,8 @@ static int omap_nand_remove(struct platform_device *pdev)
1722 /* Release NAND device, its internal structures and partitions */
1723 nand_release(&info->mtd);
1724 iounmap(info->nand.IO_ADDR_R);
1725 - kfree(&info->mtd);
1726 + release_mem_region(info->phys_base, NAND_IO_SIZE);
1727 + kfree(info);
1728 return 0;
1729 }
1730
1731 diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
1732 index 4104ea25..56b20d1 100644
1733 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
1734 +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
1735 @@ -2690,10 +2690,7 @@ static int ixgbe_get_ts_info(struct net_device *dev,
1736 (1 << HWTSTAMP_FILTER_NONE) |
1737 (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
1738 (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
1739 - (1 << HWTSTAMP_FILTER_PTP_V2_SYNC) |
1740 - (1 << HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) |
1741 - (1 << HWTSTAMP_FILTER_PTP_V2_EVENT) |
1742 - (1 << HWTSTAMP_FILTER_SOME);
1743 + (1 << HWTSTAMP_FILTER_PTP_V2_EVENT);
1744 break;
1745 #endif /* CONFIG_IXGBE_PTP */
1746 default:
1747 diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c
1748 index d15c888..4995673 100644
1749 --- a/drivers/net/ethernet/ti/davinci_cpdma.c
1750 +++ b/drivers/net/ethernet/ti/davinci_cpdma.c
1751 @@ -863,6 +863,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan)
1752
1753 next_dma = desc_read(desc, hw_next);
1754 chan->head = desc_from_phys(pool, next_dma);
1755 + chan->count--;
1756 chan->stats.teardown_dequeue++;
1757
1758 /* issue callback without locks held */
1759 diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c
1760 index 91d2588..1470d3e 100644
1761 --- a/drivers/net/rionet.c
1762 +++ b/drivers/net/rionet.c
1763 @@ -79,6 +79,7 @@ static int rionet_capable = 1;
1764 * on system trade-offs.
1765 */
1766 static struct rio_dev **rionet_active;
1767 +static int nact; /* total number of active rionet peers */
1768
1769 #define is_rionet_capable(src_ops, dst_ops) \
1770 ((src_ops & RIO_SRC_OPS_DATA_MSG) && \
1771 @@ -175,6 +176,7 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1772 struct ethhdr *eth = (struct ethhdr *)skb->data;
1773 u16 destid;
1774 unsigned long flags;
1775 + int add_num = 1;
1776
1777 local_irq_save(flags);
1778 if (!spin_trylock(&rnet->tx_lock)) {
1779 @@ -182,7 +184,10 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1780 return NETDEV_TX_LOCKED;
1781 }
1782
1783 - if ((rnet->tx_cnt + 1) > RIONET_TX_RING_SIZE) {
1784 + if (is_multicast_ether_addr(eth->h_dest))
1785 + add_num = nact;
1786 +
1787 + if ((rnet->tx_cnt + add_num) > RIONET_TX_RING_SIZE) {
1788 netif_stop_queue(ndev);
1789 spin_unlock_irqrestore(&rnet->tx_lock, flags);
1790 printk(KERN_ERR "%s: BUG! Tx Ring full when queue awake!\n",
1791 @@ -191,11 +196,16 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1792 }
1793
1794 if (is_multicast_ether_addr(eth->h_dest)) {
1795 + int count = 0;
1796 for (i = 0; i < RIO_MAX_ROUTE_ENTRIES(rnet->mport->sys_size);
1797 i++)
1798 - if (rionet_active[i])
1799 + if (rionet_active[i]) {
1800 rionet_queue_tx_msg(skb, ndev,
1801 rionet_active[i]);
1802 + if (count)
1803 + atomic_inc(&skb->users);
1804 + count++;
1805 + }
1806 } else if (RIONET_MAC_MATCH(eth->h_dest)) {
1807 destid = RIONET_GET_DESTID(eth->h_dest);
1808 if (rionet_active[destid])
1809 @@ -220,14 +230,17 @@ static void rionet_dbell_event(struct rio_mport *mport, void *dev_id, u16 sid, u
1810 if (info == RIONET_DOORBELL_JOIN) {
1811 if (!rionet_active[sid]) {
1812 list_for_each_entry(peer, &rionet_peers, node) {
1813 - if (peer->rdev->destid == sid)
1814 + if (peer->rdev->destid == sid) {
1815 rionet_active[sid] = peer->rdev;
1816 + nact++;
1817 + }
1818 }
1819 rio_mport_send_doorbell(mport, sid,
1820 RIONET_DOORBELL_JOIN);
1821 }
1822 } else if (info == RIONET_DOORBELL_LEAVE) {
1823 rionet_active[sid] = NULL;
1824 + nact--;
1825 } else {
1826 if (netif_msg_intr(rnet))
1827 printk(KERN_WARNING "%s: unhandled doorbell\n",
1828 @@ -523,6 +536,7 @@ static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id)
1829
1830 rc = rionet_setup_netdev(rdev->net->hport, ndev);
1831 rionet_check = 1;
1832 + nact = 0;
1833 }
1834
1835 /*
1836 diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
1837 index 32e31c5..f778aa0 100644
1838 --- a/drivers/net/usb/asix_devices.c
1839 +++ b/drivers/net/usb/asix_devices.c
1840 @@ -930,6 +930,10 @@ static const struct usb_device_id products [] = {
1841 USB_DEVICE (0x04f1, 0x3008),
1842 .driver_info = (unsigned long) &ax8817x_info,
1843 }, {
1844 + // Lenovo U2L100P 10/100
1845 + USB_DEVICE (0x17ef, 0x7203),
1846 + .driver_info = (unsigned long) &ax88772_info,
1847 +}, {
1848 // ASIX AX88772B 10/100
1849 USB_DEVICE (0x0b95, 0x772b),
1850 .driver_info = (unsigned long) &ax88772_info,
1851 diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
1852 index 9f8a6b7..61859d0 100644
1853 --- a/drivers/pci/probe.c
1854 +++ b/drivers/pci/probe.c
1855 @@ -729,8 +729,10 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
1856
1857 /* Check if setup is sensible at all */
1858 if (!pass &&
1859 - (primary != bus->number || secondary <= bus->number)) {
1860 - dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n");
1861 + (primary != bus->number || secondary <= bus->number ||
1862 + secondary > subordinate)) {
1863 + dev_info(&dev->dev, "bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n",
1864 + secondary, subordinate);
1865 broken = 1;
1866 }
1867
1868 diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c
1869 index aff8621..f6adde4 100644
1870 --- a/drivers/s390/scsi/zfcp_aux.c
1871 +++ b/drivers/s390/scsi/zfcp_aux.c
1872 @@ -519,6 +519,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
1873
1874 rwlock_init(&port->unit_list_lock);
1875 INIT_LIST_HEAD(&port->unit_list);
1876 + atomic_set(&port->units, 0);
1877
1878 INIT_WORK(&port->gid_pn_work, zfcp_fc_port_did_lookup);
1879 INIT_WORK(&port->test_link_work, zfcp_fc_link_test_work);
1880 diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c
1881 index e37f045..9646766 100644
1882 --- a/drivers/s390/scsi/zfcp_ccw.c
1883 +++ b/drivers/s390/scsi/zfcp_ccw.c
1884 @@ -39,17 +39,23 @@ void zfcp_ccw_adapter_put(struct zfcp_adapter *adapter)
1885 spin_unlock_irqrestore(&zfcp_ccw_adapter_ref_lock, flags);
1886 }
1887
1888 -static int zfcp_ccw_activate(struct ccw_device *cdev)
1889 -
1890 +/**
1891 + * zfcp_ccw_activate - activate adapter and wait for it to finish
1892 + * @cdev: pointer to belonging ccw device
1893 + * @clear: Status flags to clear.
1894 + * @tag: s390dbf trace record tag
1895 + */
1896 +static int zfcp_ccw_activate(struct ccw_device *cdev, int clear, char *tag)
1897 {
1898 struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
1899
1900 if (!adapter)
1901 return 0;
1902
1903 + zfcp_erp_clear_adapter_status(adapter, clear);
1904 zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING);
1905 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
1906 - "ccresu2");
1907 + tag);
1908 zfcp_erp_wait(adapter);
1909 flush_work(&adapter->scan_work);
1910
1911 @@ -164,26 +170,29 @@ static int zfcp_ccw_set_online(struct ccw_device *cdev)
1912 BUG_ON(!zfcp_reqlist_isempty(adapter->req_list));
1913 adapter->req_no = 0;
1914
1915 - zfcp_ccw_activate(cdev);
1916 + zfcp_ccw_activate(cdev, 0, "ccsonl1");
1917 zfcp_ccw_adapter_put(adapter);
1918 return 0;
1919 }
1920
1921 /**
1922 - * zfcp_ccw_set_offline - set_offline function of zfcp driver
1923 + * zfcp_ccw_offline_sync - shut down adapter and wait for it to finish
1924 * @cdev: pointer to belonging ccw device
1925 + * @set: Status flags to set.
1926 + * @tag: s390dbf trace record tag
1927 *
1928 * This function gets called by the common i/o layer and sets an adapter
1929 * into state offline.
1930 */
1931 -static int zfcp_ccw_set_offline(struct ccw_device *cdev)
1932 +static int zfcp_ccw_offline_sync(struct ccw_device *cdev, int set, char *tag)
1933 {
1934 struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
1935
1936 if (!adapter)
1937 return 0;
1938
1939 - zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1");
1940 + zfcp_erp_set_adapter_status(adapter, set);
1941 + zfcp_erp_adapter_shutdown(adapter, 0, tag);
1942 zfcp_erp_wait(adapter);
1943
1944 zfcp_ccw_adapter_put(adapter);
1945 @@ -191,6 +200,18 @@ static int zfcp_ccw_set_offline(struct ccw_device *cdev)
1946 }
1947
1948 /**
1949 + * zfcp_ccw_set_offline - set_offline function of zfcp driver
1950 + * @cdev: pointer to belonging ccw device
1951 + *
1952 + * This function gets called by the common i/o layer and sets an adapter
1953 + * into state offline.
1954 + */
1955 +static int zfcp_ccw_set_offline(struct ccw_device *cdev)
1956 +{
1957 + return zfcp_ccw_offline_sync(cdev, 0, "ccsoff1");
1958 +}
1959 +
1960 +/**
1961 * zfcp_ccw_notify - ccw notify function
1962 * @cdev: pointer to belonging ccw device
1963 * @event: indicates if adapter was detached or attached
1964 @@ -207,6 +228,11 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event)
1965
1966 switch (event) {
1967 case CIO_GONE:
1968 + if (atomic_read(&adapter->status) &
1969 + ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */
1970 + zfcp_dbf_hba_basic("ccnigo1", adapter);
1971 + break;
1972 + }
1973 dev_warn(&cdev->dev, "The FCP device has been detached\n");
1974 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1");
1975 break;
1976 @@ -216,6 +242,11 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event)
1977 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2");
1978 break;
1979 case CIO_OPER:
1980 + if (atomic_read(&adapter->status) &
1981 + ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */
1982 + zfcp_dbf_hba_basic("ccniop1", adapter);
1983 + break;
1984 + }
1985 dev_info(&cdev->dev, "The FCP device is operational again\n");
1986 zfcp_erp_set_adapter_status(adapter,
1987 ZFCP_STATUS_COMMON_RUNNING);
1988 @@ -251,6 +282,28 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev)
1989 zfcp_ccw_adapter_put(adapter);
1990 }
1991
1992 +static int zfcp_ccw_suspend(struct ccw_device *cdev)
1993 +{
1994 + zfcp_ccw_offline_sync(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccsusp1");
1995 + return 0;
1996 +}
1997 +
1998 +static int zfcp_ccw_thaw(struct ccw_device *cdev)
1999 +{
2000 + /* trace records for thaw and final shutdown during suspend
2001 + can only be found in system dump until the end of suspend
2002 + but not after resume because it's based on the memory image
2003 + right after the very first suspend (freeze) callback */
2004 + zfcp_ccw_activate(cdev, 0, "ccthaw1");
2005 + return 0;
2006 +}
2007 +
2008 +static int zfcp_ccw_resume(struct ccw_device *cdev)
2009 +{
2010 + zfcp_ccw_activate(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccresu1");
2011 + return 0;
2012 +}
2013 +
2014 struct ccw_driver zfcp_ccw_driver = {
2015 .driver = {
2016 .owner = THIS_MODULE,
2017 @@ -263,7 +316,7 @@ struct ccw_driver zfcp_ccw_driver = {
2018 .set_offline = zfcp_ccw_set_offline,
2019 .notify = zfcp_ccw_notify,
2020 .shutdown = zfcp_ccw_shutdown,
2021 - .freeze = zfcp_ccw_set_offline,
2022 - .thaw = zfcp_ccw_activate,
2023 - .restore = zfcp_ccw_activate,
2024 + .freeze = zfcp_ccw_suspend,
2025 + .thaw = zfcp_ccw_thaw,
2026 + .restore = zfcp_ccw_resume,
2027 };
2028 diff --git a/drivers/s390/scsi/zfcp_cfdc.c b/drivers/s390/scsi/zfcp_cfdc.c
2029 index fbd8b4d..49b82e4 100644
2030 --- a/drivers/s390/scsi/zfcp_cfdc.c
2031 +++ b/drivers/s390/scsi/zfcp_cfdc.c
2032 @@ -293,7 +293,7 @@ void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *adapter)
2033 }
2034 read_unlock_irqrestore(&adapter->port_list_lock, flags);
2035
2036 - shost_for_each_device(sdev, port->adapter->scsi_host) {
2037 + shost_for_each_device(sdev, adapter->scsi_host) {
2038 zfcp_sdev = sdev_to_zfcp(sdev);
2039 status = atomic_read(&zfcp_sdev->status);
2040 if ((status & ZFCP_STATUS_COMMON_ACCESS_DENIED) ||
2041 diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c
2042 index 3c1d220..e1a8cc2 100644
2043 --- a/drivers/s390/scsi/zfcp_dbf.c
2044 +++ b/drivers/s390/scsi/zfcp_dbf.c
2045 @@ -191,7 +191,7 @@ void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount,
2046 length = min((u16)sizeof(struct qdio_buffer),
2047 (u16)ZFCP_DBF_PAY_MAX_REC);
2048
2049 - while ((char *)pl[payload->counter] && payload->counter < scount) {
2050 + while (payload->counter < scount && (char *)pl[payload->counter]) {
2051 memcpy(payload->data, (char *)pl[payload->counter], length);
2052 debug_event(dbf->pay, 1, payload, zfcp_dbf_plen(length));
2053 payload->counter++;
2054 @@ -200,6 +200,26 @@ void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount,
2055 spin_unlock_irqrestore(&dbf->pay_lock, flags);
2056 }
2057
2058 +/**
2059 + * zfcp_dbf_hba_basic - trace event for basic adapter events
2060 + * @adapter: pointer to struct zfcp_adapter
2061 + */
2062 +void zfcp_dbf_hba_basic(char *tag, struct zfcp_adapter *adapter)
2063 +{
2064 + struct zfcp_dbf *dbf = adapter->dbf;
2065 + struct zfcp_dbf_hba *rec = &dbf->hba_buf;
2066 + unsigned long flags;
2067 +
2068 + spin_lock_irqsave(&dbf->hba_lock, flags);
2069 + memset(rec, 0, sizeof(*rec));
2070 +
2071 + memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
2072 + rec->id = ZFCP_DBF_HBA_BASIC;
2073 +
2074 + debug_event(dbf->hba, 1, rec, sizeof(*rec));
2075 + spin_unlock_irqrestore(&dbf->hba_lock, flags);
2076 +}
2077 +
2078 static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec,
2079 struct zfcp_adapter *adapter,
2080 struct zfcp_port *port,
2081 diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h
2082 index 714f087..3ac7a4b 100644
2083 --- a/drivers/s390/scsi/zfcp_dbf.h
2084 +++ b/drivers/s390/scsi/zfcp_dbf.h
2085 @@ -154,6 +154,7 @@ enum zfcp_dbf_hba_id {
2086 ZFCP_DBF_HBA_RES = 1,
2087 ZFCP_DBF_HBA_USS = 2,
2088 ZFCP_DBF_HBA_BIT = 3,
2089 + ZFCP_DBF_HBA_BASIC = 4,
2090 };
2091
2092 /**
2093 diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h
2094 index 2955e1a..1305955 100644
2095 --- a/drivers/s390/scsi/zfcp_def.h
2096 +++ b/drivers/s390/scsi/zfcp_def.h
2097 @@ -77,6 +77,7 @@ struct zfcp_reqlist;
2098 #define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED 0x00000004
2099 #define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008
2100 #define ZFCP_STATUS_ADAPTER_HOST_CON_INIT 0x00000010
2101 +#define ZFCP_STATUS_ADAPTER_SUSPENDED 0x00000040
2102 #define ZFCP_STATUS_ADAPTER_ERP_PENDING 0x00000100
2103 #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200
2104 #define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED 0x00000400
2105 @@ -204,6 +205,7 @@ struct zfcp_port {
2106 struct zfcp_adapter *adapter; /* adapter used to access port */
2107 struct list_head unit_list; /* head of logical unit list */
2108 rwlock_t unit_list_lock; /* unit list lock */
2109 + atomic_t units; /* zfcp_unit count */
2110 atomic_t status; /* status of this remote port */
2111 u64 wwnn; /* WWNN if known */
2112 u64 wwpn; /* WWPN */
2113 diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h
2114 index 36f4227..03441a7f 100644
2115 --- a/drivers/s390/scsi/zfcp_ext.h
2116 +++ b/drivers/s390/scsi/zfcp_ext.h
2117 @@ -54,6 +54,7 @@ extern void zfcp_dbf_hba_fsf_res(char *, struct zfcp_fsf_req *);
2118 extern void zfcp_dbf_hba_bit_err(char *, struct zfcp_fsf_req *);
2119 extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *);
2120 extern void zfcp_dbf_hba_def_err(struct zfcp_adapter *, u64, u16, void **);
2121 +extern void zfcp_dbf_hba_basic(char *, struct zfcp_adapter *);
2122 extern void zfcp_dbf_san_req(char *, struct zfcp_fsf_req *, u32);
2123 extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *);
2124 extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *);
2125 @@ -158,6 +159,7 @@ extern void zfcp_scsi_dif_sense_error(struct scsi_cmnd *, int);
2126 extern struct attribute_group zfcp_sysfs_unit_attrs;
2127 extern struct attribute_group zfcp_sysfs_adapter_attrs;
2128 extern struct attribute_group zfcp_sysfs_port_attrs;
2129 +extern struct mutex zfcp_sysfs_port_units_mutex;
2130 extern struct device_attribute *zfcp_sysfs_sdev_attrs[];
2131 extern struct device_attribute *zfcp_sysfs_shost_attrs[];
2132
2133 diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
2134 index e1c1efc..48f875f 100644
2135 --- a/drivers/s390/scsi/zfcp_fsf.c
2136 +++ b/drivers/s390/scsi/zfcp_fsf.c
2137 @@ -219,7 +219,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)
2138 return;
2139 }
2140
2141 - zfcp_dbf_hba_fsf_uss("fssrh_2", req);
2142 + zfcp_dbf_hba_fsf_uss("fssrh_4", req);
2143
2144 switch (sr_buf->status_type) {
2145 case FSF_STATUS_READ_PORT_CLOSED:
2146 @@ -437,6 +437,34 @@ void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
2147 }
2148 }
2149
2150 +#define ZFCP_FSF_PORTSPEED_1GBIT (1 << 0)
2151 +#define ZFCP_FSF_PORTSPEED_2GBIT (1 << 1)
2152 +#define ZFCP_FSF_PORTSPEED_4GBIT (1 << 2)
2153 +#define ZFCP_FSF_PORTSPEED_10GBIT (1 << 3)
2154 +#define ZFCP_FSF_PORTSPEED_8GBIT (1 << 4)
2155 +#define ZFCP_FSF_PORTSPEED_16GBIT (1 << 5)
2156 +#define ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED (1 << 15)
2157 +
2158 +static u32 zfcp_fsf_convert_portspeed(u32 fsf_speed)
2159 +{
2160 + u32 fdmi_speed = 0;
2161 + if (fsf_speed & ZFCP_FSF_PORTSPEED_1GBIT)
2162 + fdmi_speed |= FC_PORTSPEED_1GBIT;
2163 + if (fsf_speed & ZFCP_FSF_PORTSPEED_2GBIT)
2164 + fdmi_speed |= FC_PORTSPEED_2GBIT;
2165 + if (fsf_speed & ZFCP_FSF_PORTSPEED_4GBIT)
2166 + fdmi_speed |= FC_PORTSPEED_4GBIT;
2167 + if (fsf_speed & ZFCP_FSF_PORTSPEED_10GBIT)
2168 + fdmi_speed |= FC_PORTSPEED_10GBIT;
2169 + if (fsf_speed & ZFCP_FSF_PORTSPEED_8GBIT)
2170 + fdmi_speed |= FC_PORTSPEED_8GBIT;
2171 + if (fsf_speed & ZFCP_FSF_PORTSPEED_16GBIT)
2172 + fdmi_speed |= FC_PORTSPEED_16GBIT;
2173 + if (fsf_speed & ZFCP_FSF_PORTSPEED_NOT_NEGOTIATED)
2174 + fdmi_speed |= FC_PORTSPEED_NOT_NEGOTIATED;
2175 + return fdmi_speed;
2176 +}
2177 +
2178 static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
2179 {
2180 struct fsf_qtcb_bottom_config *bottom = &req->qtcb->bottom.config;
2181 @@ -456,7 +484,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
2182 fc_host_port_name(shost) = nsp->fl_wwpn;
2183 fc_host_node_name(shost) = nsp->fl_wwnn;
2184 fc_host_port_id(shost) = ntoh24(bottom->s_id);
2185 - fc_host_speed(shost) = bottom->fc_link_speed;
2186 + fc_host_speed(shost) =
2187 + zfcp_fsf_convert_portspeed(bottom->fc_link_speed);
2188 fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3;
2189
2190 adapter->hydra_version = bottom->adapter_type;
2191 @@ -580,7 +609,8 @@ static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req)
2192 } else
2193 fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
2194 fc_host_maxframe_size(shost) = bottom->maximum_frame_size;
2195 - fc_host_supported_speeds(shost) = bottom->supported_speed;
2196 + fc_host_supported_speeds(shost) =
2197 + zfcp_fsf_convert_portspeed(bottom->supported_speed);
2198 memcpy(fc_host_supported_fc4s(shost), bottom->supported_fc4_types,
2199 FC_FC4_LIST_SIZE);
2200 memcpy(fc_host_active_fc4s(shost), bottom->active_fc4_types,
2201 @@ -771,12 +801,14 @@ out:
2202 static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req)
2203 {
2204 struct scsi_device *sdev = req->data;
2205 - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2206 + struct zfcp_scsi_dev *zfcp_sdev;
2207 union fsf_status_qual *fsq = &req->qtcb->header.fsf_status_qual;
2208
2209 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2210 return;
2211
2212 + zfcp_sdev = sdev_to_zfcp(sdev);
2213 +
2214 switch (req->qtcb->header.fsf_status) {
2215 case FSF_PORT_HANDLE_NOT_VALID:
2216 if (fsq->word[0] == fsq->word[1]) {
2217 @@ -885,7 +917,7 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req)
2218
2219 switch (header->fsf_status) {
2220 case FSF_GOOD:
2221 - zfcp_dbf_san_res("fsscth1", req);
2222 + zfcp_dbf_san_res("fsscth2", req);
2223 ct->status = 0;
2224 break;
2225 case FSF_SERVICE_CLASS_NOT_SUPPORTED:
2226 @@ -1739,13 +1771,15 @@ static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req)
2227 {
2228 struct zfcp_adapter *adapter = req->adapter;
2229 struct scsi_device *sdev = req->data;
2230 - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2231 + struct zfcp_scsi_dev *zfcp_sdev;
2232 struct fsf_qtcb_header *header = &req->qtcb->header;
2233 struct fsf_qtcb_bottom_support *bottom = &req->qtcb->bottom.support;
2234
2235 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2236 return;
2237
2238 + zfcp_sdev = sdev_to_zfcp(sdev);
2239 +
2240 atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
2241 ZFCP_STATUS_COMMON_ACCESS_BOXED |
2242 ZFCP_STATUS_LUN_SHARED |
2243 @@ -1856,11 +1890,13 @@ out:
2244 static void zfcp_fsf_close_lun_handler(struct zfcp_fsf_req *req)
2245 {
2246 struct scsi_device *sdev = req->data;
2247 - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2248 + struct zfcp_scsi_dev *zfcp_sdev;
2249
2250 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2251 return;
2252
2253 + zfcp_sdev = sdev_to_zfcp(sdev);
2254 +
2255 switch (req->qtcb->header.fsf_status) {
2256 case FSF_PORT_HANDLE_NOT_VALID:
2257 zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1");
2258 @@ -1950,7 +1986,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi)
2259 {
2260 struct fsf_qual_latency_info *lat_in;
2261 struct latency_cont *lat = NULL;
2262 - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scsi->device);
2263 + struct zfcp_scsi_dev *zfcp_sdev;
2264 struct zfcp_blk_drv_data blktrc;
2265 int ticks = req->adapter->timer_ticks;
2266
2267 @@ -1965,6 +2001,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi)
2268
2269 if (req->adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA &&
2270 !(req->status & ZFCP_STATUS_FSFREQ_ERROR)) {
2271 + zfcp_sdev = sdev_to_zfcp(scsi->device);
2272 blktrc.flags |= ZFCP_BLK_LAT_VALID;
2273 blktrc.channel_lat = lat_in->channel_lat * ticks;
2274 blktrc.fabric_lat = lat_in->fabric_lat * ticks;
2275 @@ -2002,12 +2039,14 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req)
2276 {
2277 struct scsi_cmnd *scmnd = req->data;
2278 struct scsi_device *sdev = scmnd->device;
2279 - struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
2280 + struct zfcp_scsi_dev *zfcp_sdev;
2281 struct fsf_qtcb_header *header = &req->qtcb->header;
2282
2283 if (unlikely(req->status & ZFCP_STATUS_FSFREQ_ERROR))
2284 return;
2285
2286 + zfcp_sdev = sdev_to_zfcp(sdev);
2287 +
2288 switch (header->fsf_status) {
2289 case FSF_HANDLE_MISMATCH:
2290 case FSF_PORT_HANDLE_NOT_VALID:
2291 diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c
2292 index b9fffc8..50b5615 100644
2293 --- a/drivers/s390/scsi/zfcp_qdio.c
2294 +++ b/drivers/s390/scsi/zfcp_qdio.c
2295 @@ -102,18 +102,22 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err,
2296 {
2297 struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm;
2298 struct zfcp_adapter *adapter = qdio->adapter;
2299 - struct qdio_buffer_element *sbale;
2300 int sbal_no, sbal_idx;
2301 - void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1];
2302 - u64 req_id;
2303 - u8 scount;
2304
2305 if (unlikely(qdio_err)) {
2306 - memset(pl, 0, ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *));
2307 if (zfcp_adapter_multi_buffer_active(adapter)) {
2308 + void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1];
2309 + struct qdio_buffer_element *sbale;
2310 + u64 req_id;
2311 + u8 scount;
2312 +
2313 + memset(pl, 0,
2314 + ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *));
2315 sbale = qdio->res_q[idx]->element;
2316 req_id = (u64) sbale->addr;
2317 - scount = sbale->scount + 1; /* incl. signaling SBAL */
2318 + scount = min(sbale->scount + 1,
2319 + ZFCP_QDIO_MAX_SBALS_PER_REQ + 1);
2320 + /* incl. signaling SBAL */
2321
2322 for (sbal_no = 0; sbal_no < scount; sbal_no++) {
2323 sbal_idx = (idx + sbal_no) %
2324 diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c
2325 index c66af27..1e0eb08 100644
2326 --- a/drivers/s390/scsi/zfcp_sysfs.c
2327 +++ b/drivers/s390/scsi/zfcp_sysfs.c
2328 @@ -227,6 +227,8 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev,
2329 static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL,
2330 zfcp_sysfs_port_rescan_store);
2331
2332 +DEFINE_MUTEX(zfcp_sysfs_port_units_mutex);
2333 +
2334 static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
2335 struct device_attribute *attr,
2336 const char *buf, size_t count)
2337 @@ -249,6 +251,16 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
2338 else
2339 retval = 0;
2340
2341 + mutex_lock(&zfcp_sysfs_port_units_mutex);
2342 + if (atomic_read(&port->units) > 0) {
2343 + retval = -EBUSY;
2344 + mutex_unlock(&zfcp_sysfs_port_units_mutex);
2345 + goto out;
2346 + }
2347 + /* port is about to be removed, so no more unit_add */
2348 + atomic_set(&port->units, -1);
2349 + mutex_unlock(&zfcp_sysfs_port_units_mutex);
2350 +
2351 write_lock_irq(&adapter->port_list_lock);
2352 list_del(&port->list);
2353 write_unlock_irq(&adapter->port_list_lock);
2354 @@ -289,12 +301,14 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev,
2355 {
2356 struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
2357 u64 fcp_lun;
2358 + int retval;
2359
2360 if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun))
2361 return -EINVAL;
2362
2363 - if (zfcp_unit_add(port, fcp_lun))
2364 - return -EINVAL;
2365 + retval = zfcp_unit_add(port, fcp_lun);
2366 + if (retval)
2367 + return retval;
2368
2369 return count;
2370 }
2371 diff --git a/drivers/s390/scsi/zfcp_unit.c b/drivers/s390/scsi/zfcp_unit.c
2372 index 3f2bff0..1cd2b99 100644
2373 --- a/drivers/s390/scsi/zfcp_unit.c
2374 +++ b/drivers/s390/scsi/zfcp_unit.c
2375 @@ -104,7 +104,7 @@ static void zfcp_unit_release(struct device *dev)
2376 {
2377 struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev);
2378
2379 - put_device(&unit->port->dev);
2380 + atomic_dec(&unit->port->units);
2381 kfree(unit);
2382 }
2383
2384 @@ -119,16 +119,27 @@ static void zfcp_unit_release(struct device *dev)
2385 int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
2386 {
2387 struct zfcp_unit *unit;
2388 + int retval = 0;
2389 +
2390 + mutex_lock(&zfcp_sysfs_port_units_mutex);
2391 + if (atomic_read(&port->units) == -1) {
2392 + /* port is already gone */
2393 + retval = -ENODEV;
2394 + goto out;
2395 + }
2396
2397 unit = zfcp_unit_find(port, fcp_lun);
2398 if (unit) {
2399 put_device(&unit->dev);
2400 - return -EEXIST;
2401 + retval = -EEXIST;
2402 + goto out;
2403 }
2404
2405 unit = kzalloc(sizeof(struct zfcp_unit), GFP_KERNEL);
2406 - if (!unit)
2407 - return -ENOMEM;
2408 + if (!unit) {
2409 + retval = -ENOMEM;
2410 + goto out;
2411 + }
2412
2413 unit->port = port;
2414 unit->fcp_lun = fcp_lun;
2415 @@ -139,28 +150,33 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)
2416 if (dev_set_name(&unit->dev, "0x%016llx",
2417 (unsigned long long) fcp_lun)) {
2418 kfree(unit);
2419 - return -ENOMEM;
2420 + retval = -ENOMEM;
2421 + goto out;
2422 }
2423
2424 - get_device(&port->dev);
2425 -
2426 if (device_register(&unit->dev)) {
2427 put_device(&unit->dev);
2428 - return -ENOMEM;
2429 + retval = -ENOMEM;
2430 + goto out;
2431 }
2432
2433 if (sysfs_create_group(&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) {
2434 device_unregister(&unit->dev);
2435 - return -EINVAL;
2436 + retval = -EINVAL;
2437 + goto out;
2438 }
2439
2440 + atomic_inc(&port->units); /* under zfcp_sysfs_port_units_mutex ! */
2441 +
2442 write_lock_irq(&port->unit_list_lock);
2443 list_add_tail(&unit->list, &port->unit_list);
2444 write_unlock_irq(&port->unit_list_lock);
2445
2446 zfcp_unit_scsi_scan(unit);
2447
2448 - return 0;
2449 +out:
2450 + mutex_unlock(&zfcp_sysfs_port_units_mutex);
2451 + return retval;
2452 }
2453
2454 /**
2455 diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
2456 index 68ce085..a540162 100644
2457 --- a/drivers/scsi/atp870u.c
2458 +++ b/drivers/scsi/atp870u.c
2459 @@ -1173,7 +1173,16 @@ wait_io1:
2460 outw(val, tmport);
2461 outb(2, 0x80);
2462 TCM_SYNC:
2463 - udelay(0x800);
2464 + /*
2465 + * The funny division into multiple delays is to accomodate
2466 + * arches like ARM where udelay() multiplies its argument by
2467 + * a large number to initialize a loop counter. To avoid
2468 + * overflow, the maximum supported udelay is 2000 microseconds.
2469 + *
2470 + * XXX it would be more polite to find a way to use msleep()
2471 + */
2472 + mdelay(2);
2473 + udelay(48);
2474 if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */
2475 outw(0, tmport--);
2476 outb(0, tmport);
2477 diff --git a/fs/buffer.c b/fs/buffer.c
2478 index 58e2e7b..b5f0442 100644
2479 --- a/fs/buffer.c
2480 +++ b/fs/buffer.c
2481 @@ -2312,12 +2312,6 @@ int __block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
2482 loff_t size;
2483 int ret;
2484
2485 - /*
2486 - * Update file times before taking page lock. We may end up failing the
2487 - * fault so this update may be superfluous but who really cares...
2488 - */
2489 - file_update_time(vma->vm_file);
2490 -
2491 lock_page(page);
2492 size = i_size_read(inode);
2493 if ((page->mapping != inode->i_mapping) ||
2494 @@ -2355,6 +2349,13 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
2495 struct super_block *sb = vma->vm_file->f_path.dentry->d_inode->i_sb;
2496
2497 sb_start_pagefault(sb);
2498 +
2499 + /*
2500 + * Update file times before taking page lock. We may end up failing the
2501 + * fault so this update may be superfluous but who really cares...
2502 + */
2503 + file_update_time(vma->vm_file);
2504 +
2505 ret = __block_page_mkwrite(vma, vmf, get_block);
2506 sb_end_pagefault(sb);
2507 return block_page_mkwrite_return(ret);
2508 diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
2509 index 53cf2aa..71d5d0a 100644
2510 --- a/fs/cifs/cifs_unicode.c
2511 +++ b/fs/cifs/cifs_unicode.c
2512 @@ -203,6 +203,27 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len,
2513 int i;
2514 wchar_t wchar_to; /* needed to quiet sparse */
2515
2516 + /* special case for utf8 to handle no plane0 chars */
2517 + if (!strcmp(codepage->charset, "utf8")) {
2518 + /*
2519 + * convert utf8 -> utf16, we assume we have enough space
2520 + * as caller should have assumed conversion does not overflow
2521 + * in destination len is length in wchar_t units (16bits)
2522 + */
2523 + i = utf8s_to_utf16s(from, len, UTF16_LITTLE_ENDIAN,
2524 + (wchar_t *) to, len);
2525 +
2526 + /* if success terminate and exit */
2527 + if (i >= 0)
2528 + goto success;
2529 + /*
2530 + * if fails fall back to UCS encoding as this
2531 + * function should not return negative values
2532 + * currently can fail only if source contains
2533 + * invalid encoded characters
2534 + */
2535 + }
2536 +
2537 for (i = 0; len && *from; i++, from += charlen, len -= charlen) {
2538 charlen = codepage->char2uni(from, len, &wchar_to);
2539 if (charlen < 1) {
2540 @@ -215,6 +236,7 @@ cifs_strtoUTF16(__le16 *to, const char *from, int len,
2541 put_unaligned_le16(wchar_to, &to[i]);
2542 }
2543
2544 +success:
2545 put_unaligned_le16(0, &to[i]);
2546 return i;
2547 }
2548 diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
2549 index 6df6fa1..b39bb4a 100644
2550 --- a/fs/cifs/connect.c
2551 +++ b/fs/cifs/connect.c
2552 @@ -67,6 +67,7 @@ enum {
2553 /* Mount options that take no arguments */
2554 Opt_user_xattr, Opt_nouser_xattr,
2555 Opt_forceuid, Opt_noforceuid,
2556 + Opt_forcegid, Opt_noforcegid,
2557 Opt_noblocksend, Opt_noautotune,
2558 Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
2559 Opt_mapchars, Opt_nomapchars, Opt_sfu,
2560 @@ -118,6 +119,8 @@ static const match_table_t cifs_mount_option_tokens = {
2561 { Opt_nouser_xattr, "nouser_xattr" },
2562 { Opt_forceuid, "forceuid" },
2563 { Opt_noforceuid, "noforceuid" },
2564 + { Opt_forcegid, "forcegid" },
2565 + { Opt_noforcegid, "noforcegid" },
2566 { Opt_noblocksend, "noblocksend" },
2567 { Opt_noautotune, "noautotune" },
2568 { Opt_hard, "hard" },
2569 @@ -1190,6 +1193,12 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
2570 case Opt_noforceuid:
2571 override_uid = 0;
2572 break;
2573 + case Opt_forcegid:
2574 + override_gid = 1;
2575 + break;
2576 + case Opt_noforcegid:
2577 + override_gid = 0;
2578 + break;
2579 case Opt_noblocksend:
2580 vol->noblocksnd = 1;
2581 break;
2582 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
2583 index dff171c..2ce16af 100644
2584 --- a/fs/ext4/inode.c
2585 +++ b/fs/ext4/inode.c
2586 @@ -2463,6 +2463,16 @@ static int ext4_nonda_switch(struct super_block *sb)
2587 free_blocks = EXT4_C2B(sbi,
2588 percpu_counter_read_positive(&sbi->s_freeclusters_counter));
2589 dirty_blocks = percpu_counter_read_positive(&sbi->s_dirtyclusters_counter);
2590 + /*
2591 + * Start pushing delalloc when 1/2 of free blocks are dirty.
2592 + */
2593 + if (dirty_blocks && (free_blocks < 2 * dirty_blocks) &&
2594 + !writeback_in_progress(sb->s_bdi) &&
2595 + down_read_trylock(&sb->s_umount)) {
2596 + writeback_inodes_sb(sb, WB_REASON_FS_FREE_SPACE);
2597 + up_read(&sb->s_umount);
2598 + }
2599 +
2600 if (2 * free_blocks < 3 * dirty_blocks ||
2601 free_blocks < (dirty_blocks + EXT4_FREECLUSTERS_WATERMARK)) {
2602 /*
2603 @@ -2471,13 +2481,6 @@ static int ext4_nonda_switch(struct super_block *sb)
2604 */
2605 return 1;
2606 }
2607 - /*
2608 - * Even if we don't switch but are nearing capacity,
2609 - * start pushing delalloc when 1/2 of free blocks are dirty.
2610 - */
2611 - if (free_blocks < 2 * dirty_blocks)
2612 - writeback_inodes_sb_if_idle(sb, WB_REASON_FS_FREE_SPACE);
2613 -
2614 return 0;
2615 }
2616
2617 @@ -4052,6 +4055,7 @@ static int ext4_do_update_inode(handle_t *handle,
2618 struct ext4_inode_info *ei = EXT4_I(inode);
2619 struct buffer_head *bh = iloc->bh;
2620 int err = 0, rc, block;
2621 + int need_datasync = 0;
2622 uid_t i_uid;
2623 gid_t i_gid;
2624
2625 @@ -4102,7 +4106,10 @@ static int ext4_do_update_inode(handle_t *handle,
2626 raw_inode->i_file_acl_high =
2627 cpu_to_le16(ei->i_file_acl >> 32);
2628 raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl);
2629 - ext4_isize_set(raw_inode, ei->i_disksize);
2630 + if (ei->i_disksize != ext4_isize(raw_inode)) {
2631 + ext4_isize_set(raw_inode, ei->i_disksize);
2632 + need_datasync = 1;
2633 + }
2634 if (ei->i_disksize > 0x7fffffffULL) {
2635 struct super_block *sb = inode->i_sb;
2636 if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
2637 @@ -4155,7 +4162,7 @@ static int ext4_do_update_inode(handle_t *handle,
2638 err = rc;
2639 ext4_clear_inode_state(inode, EXT4_STATE_NEW);
2640
2641 - ext4_update_inode_fsync_trans(handle, inode, 0);
2642 + ext4_update_inode_fsync_trans(handle, inode, need_datasync);
2643 out_brelse:
2644 brelse(bh);
2645 ext4_std_error(inode->i_sb, err);
2646 @@ -4780,6 +4787,7 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
2647 int retries = 0;
2648
2649 sb_start_pagefault(inode->i_sb);
2650 + file_update_time(vma->vm_file);
2651 /* Delalloc case is easy... */
2652 if (test_opt(inode->i_sb, DELALLOC) &&
2653 !ext4_should_journal_data(inode) &&
2654 diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
2655 index c5826c6..e2016f3 100644
2656 --- a/fs/ext4/move_extent.c
2657 +++ b/fs/ext4/move_extent.c
2658 @@ -141,55 +141,21 @@ mext_next_extent(struct inode *inode, struct ext4_ext_path *path,
2659 }
2660
2661 /**
2662 - * mext_check_null_inode - NULL check for two inodes
2663 - *
2664 - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0.
2665 - */
2666 -static int
2667 -mext_check_null_inode(struct inode *inode1, struct inode *inode2,
2668 - const char *function, unsigned int line)
2669 -{
2670 - int ret = 0;
2671 -
2672 - if (inode1 == NULL) {
2673 - __ext4_error(inode2->i_sb, function, line,
2674 - "Both inodes should not be NULL: "
2675 - "inode1 NULL inode2 %lu", inode2->i_ino);
2676 - ret = -EIO;
2677 - } else if (inode2 == NULL) {
2678 - __ext4_error(inode1->i_sb, function, line,
2679 - "Both inodes should not be NULL: "
2680 - "inode1 %lu inode2 NULL", inode1->i_ino);
2681 - ret = -EIO;
2682 - }
2683 - return ret;
2684 -}
2685 -
2686 -/**
2687 * double_down_write_data_sem - Acquire two inodes' write lock of i_data_sem
2688 *
2689 - * @orig_inode: original inode structure
2690 - * @donor_inode: donor inode structure
2691 - * Acquire write lock of i_data_sem of the two inodes (orig and donor) by
2692 - * i_ino order.
2693 + * Acquire write lock of i_data_sem of the two inodes
2694 */
2695 static void
2696 -double_down_write_data_sem(struct inode *orig_inode, struct inode *donor_inode)
2697 +double_down_write_data_sem(struct inode *first, struct inode *second)
2698 {
2699 - struct inode *first = orig_inode, *second = donor_inode;
2700 + if (first < second) {
2701 + down_write(&EXT4_I(first)->i_data_sem);
2702 + down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING);
2703 + } else {
2704 + down_write(&EXT4_I(second)->i_data_sem);
2705 + down_write_nested(&EXT4_I(first)->i_data_sem, SINGLE_DEPTH_NESTING);
2706
2707 - /*
2708 - * Use the inode number to provide the stable locking order instead
2709 - * of its address, because the C language doesn't guarantee you can
2710 - * compare pointers that don't come from the same array.
2711 - */
2712 - if (donor_inode->i_ino < orig_inode->i_ino) {
2713 - first = donor_inode;
2714 - second = orig_inode;
2715 }
2716 -
2717 - down_write(&EXT4_I(first)->i_data_sem);
2718 - down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING);
2719 }
2720
2721 /**
2722 @@ -969,14 +935,6 @@ mext_check_arguments(struct inode *orig_inode,
2723 return -EINVAL;
2724 }
2725
2726 - /* Files should be in the same ext4 FS */
2727 - if (orig_inode->i_sb != donor_inode->i_sb) {
2728 - ext4_debug("ext4 move extent: The argument files "
2729 - "should be in same FS [ino:orig %lu, donor %lu]\n",
2730 - orig_inode->i_ino, donor_inode->i_ino);
2731 - return -EINVAL;
2732 - }
2733 -
2734 /* Ext4 move extent supports only extent based file */
2735 if (!(ext4_test_inode_flag(orig_inode, EXT4_INODE_EXTENTS))) {
2736 ext4_debug("ext4 move extent: orig file is not extents "
2737 @@ -1072,35 +1030,19 @@ mext_check_arguments(struct inode *orig_inode,
2738 * @inode1: the inode structure
2739 * @inode2: the inode structure
2740 *
2741 - * Lock two inodes' i_mutex by i_ino order.
2742 - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0.
2743 + * Lock two inodes' i_mutex
2744 */
2745 -static int
2746 +static void
2747 mext_inode_double_lock(struct inode *inode1, struct inode *inode2)
2748 {
2749 - int ret = 0;
2750 -
2751 - BUG_ON(inode1 == NULL && inode2 == NULL);
2752 -
2753 - ret = mext_check_null_inode(inode1, inode2, __func__, __LINE__);
2754 - if (ret < 0)
2755 - goto out;
2756 -
2757 - if (inode1 == inode2) {
2758 - mutex_lock(&inode1->i_mutex);
2759 - goto out;
2760 - }
2761 -
2762 - if (inode1->i_ino < inode2->i_ino) {
2763 + BUG_ON(inode1 == inode2);
2764 + if (inode1 < inode2) {
2765 mutex_lock_nested(&inode1->i_mutex, I_MUTEX_PARENT);
2766 mutex_lock_nested(&inode2->i_mutex, I_MUTEX_CHILD);
2767 } else {
2768 mutex_lock_nested(&inode2->i_mutex, I_MUTEX_PARENT);
2769 mutex_lock_nested(&inode1->i_mutex, I_MUTEX_CHILD);
2770 }
2771 -
2772 -out:
2773 - return ret;
2774 }
2775
2776 /**
2777 @@ -1109,28 +1051,13 @@ out:
2778 * @inode1: the inode that is released first
2779 * @inode2: the inode that is released second
2780 *
2781 - * If inode1 or inode2 is NULL, return -EIO. Otherwise, return 0.
2782 */
2783
2784 -static int
2785 +static void
2786 mext_inode_double_unlock(struct inode *inode1, struct inode *inode2)
2787 {
2788 - int ret = 0;
2789 -
2790 - BUG_ON(inode1 == NULL && inode2 == NULL);
2791 -
2792 - ret = mext_check_null_inode(inode1, inode2, __func__, __LINE__);
2793 - if (ret < 0)
2794 - goto out;
2795 -
2796 - if (inode1)
2797 - mutex_unlock(&inode1->i_mutex);
2798 -
2799 - if (inode2 && inode2 != inode1)
2800 - mutex_unlock(&inode2->i_mutex);
2801 -
2802 -out:
2803 - return ret;
2804 + mutex_unlock(&inode1->i_mutex);
2805 + mutex_unlock(&inode2->i_mutex);
2806 }
2807
2808 /**
2809 @@ -1187,16 +1114,23 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2810 ext4_lblk_t block_end, seq_start, add_blocks, file_end, seq_blocks = 0;
2811 ext4_lblk_t rest_blocks;
2812 pgoff_t orig_page_offset = 0, seq_end_page;
2813 - int ret1, ret2, depth, last_extent = 0;
2814 + int ret, depth, last_extent = 0;
2815 int blocks_per_page = PAGE_CACHE_SIZE >> orig_inode->i_blkbits;
2816 int data_offset_in_page;
2817 int block_len_in_page;
2818 int uninit;
2819
2820 - /* orig and donor should be different file */
2821 - if (orig_inode->i_ino == donor_inode->i_ino) {
2822 + if (orig_inode->i_sb != donor_inode->i_sb) {
2823 + ext4_debug("ext4 move extent: The argument files "
2824 + "should be in same FS [ino:orig %lu, donor %lu]\n",
2825 + orig_inode->i_ino, donor_inode->i_ino);
2826 + return -EINVAL;
2827 + }
2828 +
2829 + /* orig and donor should be different inodes */
2830 + if (orig_inode == donor_inode) {
2831 ext4_debug("ext4 move extent: The argument files should not "
2832 - "be same file [ino:orig %lu, donor %lu]\n",
2833 + "be same inode [ino:orig %lu, donor %lu]\n",
2834 orig_inode->i_ino, donor_inode->i_ino);
2835 return -EINVAL;
2836 }
2837 @@ -1208,18 +1142,21 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2838 orig_inode->i_ino, donor_inode->i_ino);
2839 return -EINVAL;
2840 }
2841 -
2842 + /* TODO: This is non obvious task to swap blocks for inodes with full
2843 + jornaling enabled */
2844 + if (ext4_should_journal_data(orig_inode) ||
2845 + ext4_should_journal_data(donor_inode)) {
2846 + return -EINVAL;
2847 + }
2848 /* Protect orig and donor inodes against a truncate */
2849 - ret1 = mext_inode_double_lock(orig_inode, donor_inode);
2850 - if (ret1 < 0)
2851 - return ret1;
2852 + mext_inode_double_lock(orig_inode, donor_inode);
2853
2854 /* Protect extent tree against block allocations via delalloc */
2855 double_down_write_data_sem(orig_inode, donor_inode);
2856 /* Check the filesystem environment whether move_extent can be done */
2857 - ret1 = mext_check_arguments(orig_inode, donor_inode, orig_start,
2858 + ret = mext_check_arguments(orig_inode, donor_inode, orig_start,
2859 donor_start, &len);
2860 - if (ret1)
2861 + if (ret)
2862 goto out;
2863
2864 file_end = (i_size_read(orig_inode) - 1) >> orig_inode->i_blkbits;
2865 @@ -1227,13 +1164,13 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2866 if (file_end < block_end)
2867 len -= block_end - file_end;
2868
2869 - ret1 = get_ext_path(orig_inode, block_start, &orig_path);
2870 - if (ret1)
2871 + ret = get_ext_path(orig_inode, block_start, &orig_path);
2872 + if (ret)
2873 goto out;
2874
2875 /* Get path structure to check the hole */
2876 - ret1 = get_ext_path(orig_inode, block_start, &holecheck_path);
2877 - if (ret1)
2878 + ret = get_ext_path(orig_inode, block_start, &holecheck_path);
2879 + if (ret)
2880 goto out;
2881
2882 depth = ext_depth(orig_inode);
2883 @@ -1252,13 +1189,13 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2884 last_extent = mext_next_extent(orig_inode,
2885 holecheck_path, &ext_cur);
2886 if (last_extent < 0) {
2887 - ret1 = last_extent;
2888 + ret = last_extent;
2889 goto out;
2890 }
2891 last_extent = mext_next_extent(orig_inode, orig_path,
2892 &ext_dummy);
2893 if (last_extent < 0) {
2894 - ret1 = last_extent;
2895 + ret = last_extent;
2896 goto out;
2897 }
2898 seq_start = le32_to_cpu(ext_cur->ee_block);
2899 @@ -1272,7 +1209,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2900 if (le32_to_cpu(ext_cur->ee_block) > block_end) {
2901 ext4_debug("ext4 move extent: The specified range of file "
2902 "may be the hole\n");
2903 - ret1 = -EINVAL;
2904 + ret = -EINVAL;
2905 goto out;
2906 }
2907
2908 @@ -1292,7 +1229,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2909 last_extent = mext_next_extent(orig_inode, holecheck_path,
2910 &ext_cur);
2911 if (last_extent < 0) {
2912 - ret1 = last_extent;
2913 + ret = last_extent;
2914 break;
2915 }
2916 add_blocks = ext4_ext_get_actual_len(ext_cur);
2917 @@ -1349,18 +1286,18 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2918 orig_page_offset,
2919 data_offset_in_page,
2920 block_len_in_page, uninit,
2921 - &ret1);
2922 + &ret);
2923
2924 /* Count how many blocks we have exchanged */
2925 *moved_len += block_len_in_page;
2926 - if (ret1 < 0)
2927 + if (ret < 0)
2928 break;
2929 if (*moved_len > len) {
2930 EXT4_ERROR_INODE(orig_inode,
2931 "We replaced blocks too much! "
2932 "sum of replaced: %llu requested: %llu",
2933 *moved_len, len);
2934 - ret1 = -EIO;
2935 + ret = -EIO;
2936 break;
2937 }
2938
2939 @@ -1374,22 +1311,22 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp,
2940 }
2941
2942 double_down_write_data_sem(orig_inode, donor_inode);
2943 - if (ret1 < 0)
2944 + if (ret < 0)
2945 break;
2946
2947 /* Decrease buffer counter */
2948 if (holecheck_path)
2949 ext4_ext_drop_refs(holecheck_path);
2950 - ret1 = get_ext_path(orig_inode, seq_start, &holecheck_path);
2951 - if (ret1)
2952 + ret = get_ext_path(orig_inode, seq_start, &holecheck_path);
2953 + if (ret)
2954 break;
2955 depth = holecheck_path->p_depth;
2956
2957 /* Decrease buffer counter */
2958 if (orig_path)
2959 ext4_ext_drop_refs(orig_path);
2960 - ret1 = get_ext_path(orig_inode, seq_start, &orig_path);
2961 - if (ret1)
2962 + ret = get_ext_path(orig_inode, seq_start, &orig_path);
2963 + if (ret)
2964 break;
2965
2966 ext_cur = holecheck_path[depth].p_ext;
2967 @@ -1412,12 +1349,7 @@ out:
2968 kfree(holecheck_path);
2969 }
2970 double_up_write_data_sem(orig_inode, donor_inode);
2971 - ret2 = mext_inode_double_unlock(orig_inode, donor_inode);
2972 -
2973 - if (ret1)
2974 - return ret1;
2975 - else if (ret2)
2976 - return ret2;
2977 + mext_inode_double_unlock(orig_inode, donor_inode);
2978
2979 - return 0;
2980 + return ret;
2981 }
2982 diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
2983 index 2a42cc0..d13873d 100644
2984 --- a/fs/ext4/namei.c
2985 +++ b/fs/ext4/namei.c
2986 @@ -2149,9 +2149,7 @@ retry:
2987 err = PTR_ERR(inode);
2988 if (!IS_ERR(inode)) {
2989 init_special_inode(inode, inode->i_mode, rdev);
2990 -#ifdef CONFIG_EXT4_FS_XATTR
2991 inode->i_op = &ext4_special_inode_operations;
2992 -#endif
2993 err = ext4_add_nondir(handle, dentry, inode);
2994 }
2995 ext4_journal_stop(handle);
2996 diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
2997 index 41f6ef6..0be1789 100644
2998 --- a/fs/ext4/resize.c
2999 +++ b/fs/ext4/resize.c
3000 @@ -200,8 +200,11 @@ static void free_flex_gd(struct ext4_new_flex_group_data *flex_gd)
3001 * be a partial of a flex group.
3002 *
3003 * @sb: super block of fs to which the groups belongs
3004 + *
3005 + * Returns 0 on a successful allocation of the metadata blocks in the
3006 + * block group.
3007 */
3008 -static void ext4_alloc_group_tables(struct super_block *sb,
3009 +static int ext4_alloc_group_tables(struct super_block *sb,
3010 struct ext4_new_flex_group_data *flex_gd,
3011 int flexbg_size)
3012 {
3013 @@ -226,6 +229,8 @@ static void ext4_alloc_group_tables(struct super_block *sb,
3014 (last_group & ~(flexbg_size - 1))));
3015 next_group:
3016 group = group_data[0].group;
3017 + if (src_group >= group_data[0].group + flex_gd->count)
3018 + return -ENOSPC;
3019 start_blk = ext4_group_first_block_no(sb, src_group);
3020 last_blk = start_blk + group_data[src_group - group].blocks_count;
3021
3022 @@ -235,7 +240,6 @@ next_group:
3023
3024 start_blk += overhead;
3025
3026 - BUG_ON(src_group >= group_data[0].group + flex_gd->count);
3027 /* We collect contiguous blocks as much as possible. */
3028 src_group++;
3029 for (; src_group <= last_group; src_group++)
3030 @@ -300,6 +304,7 @@ next_group:
3031 group_data[i].free_blocks_count);
3032 }
3033 }
3034 + return 0;
3035 }
3036
3037 static struct buffer_head *bclean(handle_t *handle, struct super_block *sb,
3038 @@ -451,6 +456,9 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
3039 gdblocks = ext4_bg_num_gdb(sb, group);
3040 start = ext4_group_first_block_no(sb, group);
3041
3042 + if (!ext4_bg_has_super(sb, group))
3043 + goto handle_itb;
3044 +
3045 /* Copy all of the GDT blocks into the backup in this group */
3046 for (j = 0, block = start + 1; j < gdblocks; j++, block++) {
3047 struct buffer_head *gdb;
3048 @@ -493,6 +501,7 @@ static int setup_new_flex_group_blocks(struct super_block *sb,
3049 goto out;
3050 }
3051
3052 +handle_itb:
3053 /* Initialize group tables of the grop @group */
3054 if (!(bg_flags[i] & EXT4_BG_INODE_ZEROED))
3055 goto handle_bb;
3056 @@ -1349,13 +1358,15 @@ exit_journal:
3057 err = err2;
3058
3059 if (!err) {
3060 - int i;
3061 + int gdb_num = group / EXT4_DESC_PER_BLOCK(sb);
3062 + int gdb_num_end = ((group + flex_gd->count - 1) /
3063 + EXT4_DESC_PER_BLOCK(sb));
3064 +
3065 update_backups(sb, sbi->s_sbh->b_blocknr, (char *)es,
3066 sizeof(struct ext4_super_block));
3067 - for (i = 0; i < flex_gd->count; i++, group++) {
3068 + for (; gdb_num <= gdb_num_end; gdb_num++) {
3069 struct buffer_head *gdb_bh;
3070 - int gdb_num;
3071 - gdb_num = group / EXT4_BLOCKS_PER_GROUP(sb);
3072 +
3073 gdb_bh = sbi->s_group_desc[gdb_num];
3074 update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data,
3075 gdb_bh->b_size);
3076 @@ -1729,7 +1740,8 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count)
3077 */
3078 while (ext4_setup_next_flex_gd(sb, flex_gd, n_blocks_count,
3079 flexbg_size)) {
3080 - ext4_alloc_group_tables(sb, flex_gd, flexbg_size);
3081 + if (ext4_alloc_group_tables(sb, flex_gd, flexbg_size) != 0)
3082 + break;
3083 err = ext4_flex_group_add(sb, resize_inode, flex_gd);
3084 if (unlikely(err))
3085 break;
3086 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
3087 index c6e0cb3..e44b233 100644
3088 --- a/fs/ext4/super.c
3089 +++ b/fs/ext4/super.c
3090 @@ -1735,7 +1735,7 @@ static inline void ext4_show_quota_options(struct seq_file *seq,
3091
3092 static const char *token2str(int token)
3093 {
3094 - static const struct match_token *t;
3095 + const struct match_token *t;
3096
3097 for (t = tokens; t->token != Opt_err; t++)
3098 if (t->token == token && !strchr(t->pattern, '='))
3099 diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
3100 index be3efc4..5602d73 100644
3101 --- a/fs/fs-writeback.c
3102 +++ b/fs/fs-writeback.c
3103 @@ -63,6 +63,7 @@ int writeback_in_progress(struct backing_dev_info *bdi)
3104 {
3105 return test_bit(BDI_writeback_running, &bdi->state);
3106 }
3107 +EXPORT_SYMBOL(writeback_in_progress);
3108
3109 static inline struct backing_dev_info *inode_to_bdi(struct inode *inode)
3110 {
3111 diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
3112 index e149b99..484b8d1 100644
3113 --- a/fs/jbd2/journal.c
3114 +++ b/fs/jbd2/journal.c
3115 @@ -1354,6 +1354,11 @@ static void jbd2_mark_journal_empty(journal_t *journal)
3116
3117 BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
3118 read_lock(&journal->j_state_lock);
3119 + /* Is it already empty? */
3120 + if (sb->s_start == 0) {
3121 + read_unlock(&journal->j_state_lock);
3122 + return;
3123 + }
3124 jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n",
3125 journal->j_tail_sequence);
3126
3127 diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
3128 index 61ea413..1224d6b 100644
3129 --- a/fs/jffs2/super.c
3130 +++ b/fs/jffs2/super.c
3131 @@ -100,6 +100,10 @@ static int jffs2_sync_fs(struct super_block *sb, int wait)
3132 {
3133 struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
3134
3135 +#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
3136 + cancel_delayed_work_sync(&c->wbuf_dwork);
3137 +#endif
3138 +
3139 mutex_lock(&c->alloc_sem);
3140 jffs2_flush_wbuf_pad(c);
3141 mutex_unlock(&c->alloc_sem);
3142 diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
3143 index 6f4529d..a6597d6 100644
3144 --- a/fs/jffs2/wbuf.c
3145 +++ b/fs/jffs2/wbuf.c
3146 @@ -1044,10 +1044,10 @@ int jffs2_check_oob_empty(struct jffs2_sb_info *c,
3147 ops.datbuf = NULL;
3148
3149 ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
3150 - if (ret || ops.oobretlen != ops.ooblen) {
3151 + if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) {
3152 pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n",
3153 jeb->offset, ops.ooblen, ops.oobretlen, ret);
3154 - if (!ret)
3155 + if (!ret || mtd_is_bitflip(ret))
3156 ret = -EIO;
3157 return ret;
3158 }
3159 @@ -1086,10 +1086,10 @@ int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c,
3160 ops.datbuf = NULL;
3161
3162 ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
3163 - if (ret || ops.oobretlen != ops.ooblen) {
3164 + if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) {
3165 pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n",
3166 jeb->offset, ops.ooblen, ops.oobretlen, ret);
3167 - if (!ret)
3168 + if (!ret || mtd_is_bitflip(ret))
3169 ret = -EIO;
3170 return ret;
3171 }
3172 diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c
3173 index a4d56ac..5b387a4 100644
3174 --- a/fs/nilfs2/file.c
3175 +++ b/fs/nilfs2/file.c
3176 @@ -116,6 +116,7 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
3177 if (unlikely(ret))
3178 goto out;
3179
3180 + file_update_time(vma->vm_file);
3181 ret = __block_page_mkwrite(vma, vmf, nilfs_get_block);
3182 if (ret) {
3183 nilfs_transaction_abort(inode->i_sb);
3184 diff --git a/fs/proc/page.c b/fs/proc/page.c
3185 index 7fcd0d6..b8730d9 100644
3186 --- a/fs/proc/page.c
3187 +++ b/fs/proc/page.c
3188 @@ -115,7 +115,13 @@ u64 stable_page_flags(struct page *page)
3189 u |= 1 << KPF_COMPOUND_TAIL;
3190 if (PageHuge(page))
3191 u |= 1 << KPF_HUGE;
3192 - else if (PageTransCompound(page))
3193 + /*
3194 + * PageTransCompound can be true for non-huge compound pages (slab
3195 + * pages or pages allocated by drivers with __GFP_COMP) because it
3196 + * just checks PG_head/PG_tail, so we need to check PageLRU to make
3197 + * sure a given page is a thp, not a non-huge compound page.
3198 + */
3199 + else if (PageTransCompound(page) && PageLRU(compound_trans_head(page)))
3200 u |= 1 << KPF_THP;
3201
3202 /*
3203 diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h
3204 index 95b738c..df08254 100644
3205 --- a/include/linux/mempolicy.h
3206 +++ b/include/linux/mempolicy.h
3207 @@ -188,7 +188,7 @@ struct sp_node {
3208
3209 struct shared_policy {
3210 struct rb_root root;
3211 - spinlock_t lock;
3212 + struct mutex mutex;
3213 };
3214
3215 void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol);
3216 diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
3217 index 926142e..9497be1 100644
3218 --- a/include/net/ip_fib.h
3219 +++ b/include/net/ip_fib.h
3220 @@ -102,6 +102,7 @@ struct fib_info {
3221 unsigned char fib_dead;
3222 unsigned char fib_protocol;
3223 unsigned char fib_scope;
3224 + unsigned char fib_type;
3225 __be32 fib_prefsrc;
3226 u32 fib_priority;
3227 u32 *fib_metrics;
3228 diff --git a/kernel/rcutree.c b/kernel/rcutree.c
3229 index f280e54..f7bcd9e 100644
3230 --- a/kernel/rcutree.c
3231 +++ b/kernel/rcutree.c
3232 @@ -305,7 +305,9 @@ cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp)
3233 static int
3234 cpu_needs_another_gp(struct rcu_state *rsp, struct rcu_data *rdp)
3235 {
3236 - return *rdp->nxttail[RCU_DONE_TAIL] && !rcu_gp_in_progress(rsp);
3237 + return *rdp->nxttail[RCU_DONE_TAIL +
3238 + ACCESS_ONCE(rsp->completed) != rdp->completed] &&
3239 + !rcu_gp_in_progress(rsp);
3240 }
3241
3242 /*
3243 diff --git a/kernel/sched/core.c b/kernel/sched/core.c
3244 index 649c9f8..1a48cdb 100644
3245 --- a/kernel/sched/core.c
3246 +++ b/kernel/sched/core.c
3247 @@ -5604,7 +5604,9 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
3248 migrate_tasks(cpu);
3249 BUG_ON(rq->nr_running != 1); /* the migration thread */
3250 raw_spin_unlock_irqrestore(&rq->lock, flags);
3251 + break;
3252
3253 + case CPU_DEAD:
3254 calc_load_migrate(rq);
3255 break;
3256 #endif
3257 diff --git a/kernel/sys.c b/kernel/sys.c
3258 index 241507f..6fab59a 100644
3259 --- a/kernel/sys.c
3260 +++ b/kernel/sys.c
3261 @@ -368,6 +368,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier);
3262 void kernel_restart(char *cmd)
3263 {
3264 kernel_restart_prepare(cmd);
3265 + disable_nonboot_cpus();
3266 if (!cmd)
3267 printk(KERN_EMERG "Restarting system.\n");
3268 else
3269 diff --git a/kernel/workqueue.c b/kernel/workqueue.c
3270 index 3c5a79e..872bd6d 100644
3271 --- a/kernel/workqueue.c
3272 +++ b/kernel/workqueue.c
3273 @@ -1927,10 +1927,9 @@ static void move_linked_works(struct work_struct *work, struct list_head *head,
3274 *nextp = n;
3275 }
3276
3277 -static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq)
3278 +static void cwq_activate_delayed_work(struct work_struct *work)
3279 {
3280 - struct work_struct *work = list_first_entry(&cwq->delayed_works,
3281 - struct work_struct, entry);
3282 + struct cpu_workqueue_struct *cwq = get_work_cwq(work);
3283
3284 trace_workqueue_activate_work(work);
3285 move_linked_works(work, &cwq->pool->worklist, NULL);
3286 @@ -1938,6 +1937,14 @@ static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq)
3287 cwq->nr_active++;
3288 }
3289
3290 +static void cwq_activate_first_delayed(struct cpu_workqueue_struct *cwq)
3291 +{
3292 + struct work_struct *work = list_first_entry(&cwq->delayed_works,
3293 + struct work_struct, entry);
3294 +
3295 + cwq_activate_delayed_work(work);
3296 +}
3297 +
3298 /**
3299 * cwq_dec_nr_in_flight - decrement cwq's nr_in_flight
3300 * @cwq: cwq of interest
3301 @@ -2073,7 +2080,9 @@ __acquires(&gcwq->lock)
3302
3303 spin_unlock_irq(&gcwq->lock);
3304
3305 + smp_wmb(); /* paired with test_and_set_bit(PENDING) */
3306 work_clear_pending(work);
3307 +
3308 lock_map_acquire_read(&cwq->wq->lockdep_map);
3309 lock_map_acquire(&lockdep_map);
3310 trace_workqueue_execute_start(work);
3311 @@ -2844,6 +2853,18 @@ static int try_to_grab_pending(struct work_struct *work)
3312 smp_rmb();
3313 if (gcwq == get_work_gcwq(work)) {
3314 debug_work_deactivate(work);
3315 +
3316 + /*
3317 + * A delayed work item cannot be grabbed directly
3318 + * because it might have linked NO_COLOR work items
3319 + * which, if left on the delayed_list, will confuse
3320 + * cwq->nr_active management later on and cause
3321 + * stall. Make sure the work item is activated
3322 + * before grabbing.
3323 + */
3324 + if (*work_data_bits(work) & WORK_STRUCT_DELAYED)
3325 + cwq_activate_delayed_work(work);
3326 +
3327 list_del_init(&work->entry);
3328 cwq_dec_nr_in_flight(get_work_cwq(work),
3329 get_work_color(work),
3330 diff --git a/lib/gcd.c b/lib/gcd.c
3331 index cce4f3c..3657f12 100644
3332 --- a/lib/gcd.c
3333 +++ b/lib/gcd.c
3334 @@ -9,6 +9,9 @@ unsigned long gcd(unsigned long a, unsigned long b)
3335
3336 if (a < b)
3337 swap(a, b);
3338 +
3339 + if (!b)
3340 + return a;
3341 while ((r = a % b) != 0) {
3342 a = b;
3343 b = r;
3344 diff --git a/mm/hugetlb.c b/mm/hugetlb.c
3345 index bc72712..3adceaf 100644
3346 --- a/mm/hugetlb.c
3347 +++ b/mm/hugetlb.c
3348 @@ -2481,7 +2481,8 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
3349 * from page cache lookup which is in HPAGE_SIZE units.
3350 */
3351 address = address & huge_page_mask(h);
3352 - pgoff = vma_hugecache_offset(h, vma, address);
3353 + pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) +
3354 + vma->vm_pgoff;
3355 mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
3356
3357 /*
3358 diff --git a/mm/mempolicy.c b/mm/mempolicy.c
3359 index 4ada3be..3d64b36 100644
3360 --- a/mm/mempolicy.c
3361 +++ b/mm/mempolicy.c
3362 @@ -607,6 +607,42 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
3363 return first;
3364 }
3365
3366 +/*
3367 + * Apply policy to a single VMA
3368 + * This must be called with the mmap_sem held for writing.
3369 + */
3370 +static int vma_replace_policy(struct vm_area_struct *vma,
3371 + struct mempolicy *pol)
3372 +{
3373 + int err;
3374 + struct mempolicy *old;
3375 + struct mempolicy *new;
3376 +
3377 + pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
3378 + vma->vm_start, vma->vm_end, vma->vm_pgoff,
3379 + vma->vm_ops, vma->vm_file,
3380 + vma->vm_ops ? vma->vm_ops->set_policy : NULL);
3381 +
3382 + new = mpol_dup(pol);
3383 + if (IS_ERR(new))
3384 + return PTR_ERR(new);
3385 +
3386 + if (vma->vm_ops && vma->vm_ops->set_policy) {
3387 + err = vma->vm_ops->set_policy(vma, new);
3388 + if (err)
3389 + goto err_out;
3390 + }
3391 +
3392 + old = vma->vm_policy;
3393 + vma->vm_policy = new; /* protected by mmap_sem */
3394 + mpol_put(old);
3395 +
3396 + return 0;
3397 + err_out:
3398 + mpol_put(new);
3399 + return err;
3400 +}
3401 +
3402 /* Step 2: apply policy to a range and do splits. */
3403 static int mbind_range(struct mm_struct *mm, unsigned long start,
3404 unsigned long end, struct mempolicy *new_pol)
3405 @@ -655,23 +691,9 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
3406 if (err)
3407 goto out;
3408 }
3409 -
3410 - /*
3411 - * Apply policy to a single VMA. The reference counting of
3412 - * policy for vma_policy linkages has already been handled by
3413 - * vma_merge and split_vma as necessary. If this is a shared
3414 - * policy then ->set_policy will increment the reference count
3415 - * for an sp node.
3416 - */
3417 - pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
3418 - vma->vm_start, vma->vm_end, vma->vm_pgoff,
3419 - vma->vm_ops, vma->vm_file,
3420 - vma->vm_ops ? vma->vm_ops->set_policy : NULL);
3421 - if (vma->vm_ops && vma->vm_ops->set_policy) {
3422 - err = vma->vm_ops->set_policy(vma, new_pol);
3423 - if (err)
3424 - goto out;
3425 - }
3426 + err = vma_replace_policy(vma, new_pol);
3427 + if (err)
3428 + goto out;
3429 }
3430
3431 out:
3432 @@ -1530,8 +1552,18 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
3433 addr);
3434 if (vpol)
3435 pol = vpol;
3436 - } else if (vma->vm_policy)
3437 + } else if (vma->vm_policy) {
3438 pol = vma->vm_policy;
3439 +
3440 + /*
3441 + * shmem_alloc_page() passes MPOL_F_SHARED policy with
3442 + * a pseudo vma whose vma->vm_ops=NULL. Take a reference
3443 + * count on these policies which will be dropped by
3444 + * mpol_cond_put() later
3445 + */
3446 + if (mpol_needs_cond_ref(pol))
3447 + mpol_get(pol);
3448 + }
3449 }
3450 if (!pol)
3451 pol = &default_policy;
3452 @@ -2061,7 +2093,7 @@ bool __mpol_equal(struct mempolicy *a, struct mempolicy *b)
3453 */
3454
3455 /* lookup first element intersecting start-end */
3456 -/* Caller holds sp->lock */
3457 +/* Caller holds sp->mutex */
3458 static struct sp_node *
3459 sp_lookup(struct shared_policy *sp, unsigned long start, unsigned long end)
3460 {
3461 @@ -2125,36 +2157,50 @@ mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx)
3462
3463 if (!sp->root.rb_node)
3464 return NULL;
3465 - spin_lock(&sp->lock);
3466 + mutex_lock(&sp->mutex);
3467 sn = sp_lookup(sp, idx, idx+1);
3468 if (sn) {
3469 mpol_get(sn->policy);
3470 pol = sn->policy;
3471 }
3472 - spin_unlock(&sp->lock);
3473 + mutex_unlock(&sp->mutex);
3474 return pol;
3475 }
3476
3477 +static void sp_free(struct sp_node *n)
3478 +{
3479 + mpol_put(n->policy);
3480 + kmem_cache_free(sn_cache, n);
3481 +}
3482 +
3483 static void sp_delete(struct shared_policy *sp, struct sp_node *n)
3484 {
3485 pr_debug("deleting %lx-l%lx\n", n->start, n->end);
3486 rb_erase(&n->nd, &sp->root);
3487 - mpol_put(n->policy);
3488 - kmem_cache_free(sn_cache, n);
3489 + sp_free(n);
3490 }
3491
3492 static struct sp_node *sp_alloc(unsigned long start, unsigned long end,
3493 struct mempolicy *pol)
3494 {
3495 - struct sp_node *n = kmem_cache_alloc(sn_cache, GFP_KERNEL);
3496 + struct sp_node *n;
3497 + struct mempolicy *newpol;
3498
3499 + n = kmem_cache_alloc(sn_cache, GFP_KERNEL);
3500 if (!n)
3501 return NULL;
3502 +
3503 + newpol = mpol_dup(pol);
3504 + if (IS_ERR(newpol)) {
3505 + kmem_cache_free(sn_cache, n);
3506 + return NULL;
3507 + }
3508 + newpol->flags |= MPOL_F_SHARED;
3509 +
3510 n->start = start;
3511 n->end = end;
3512 - mpol_get(pol);
3513 - pol->flags |= MPOL_F_SHARED; /* for unref */
3514 - n->policy = pol;
3515 + n->policy = newpol;
3516 +
3517 return n;
3518 }
3519
3520 @@ -2162,10 +2208,10 @@ static struct sp_node *sp_alloc(unsigned long start, unsigned long end,
3521 static int shared_policy_replace(struct shared_policy *sp, unsigned long start,
3522 unsigned long end, struct sp_node *new)
3523 {
3524 - struct sp_node *n, *new2 = NULL;
3525 + struct sp_node *n;
3526 + int ret = 0;
3527
3528 -restart:
3529 - spin_lock(&sp->lock);
3530 + mutex_lock(&sp->mutex);
3531 n = sp_lookup(sp, start, end);
3532 /* Take care of old policies in the same range. */
3533 while (n && n->start < end) {
3534 @@ -2178,16 +2224,14 @@ restart:
3535 } else {
3536 /* Old policy spanning whole new range. */
3537 if (n->end > end) {
3538 + struct sp_node *new2;
3539 + new2 = sp_alloc(end, n->end, n->policy);
3540 if (!new2) {
3541 - spin_unlock(&sp->lock);
3542 - new2 = sp_alloc(end, n->end, n->policy);
3543 - if (!new2)
3544 - return -ENOMEM;
3545 - goto restart;
3546 + ret = -ENOMEM;
3547 + goto out;
3548 }
3549 n->end = start;
3550 sp_insert(sp, new2);
3551 - new2 = NULL;
3552 break;
3553 } else
3554 n->end = start;
3555 @@ -2198,12 +2242,9 @@ restart:
3556 }
3557 if (new)
3558 sp_insert(sp, new);
3559 - spin_unlock(&sp->lock);
3560 - if (new2) {
3561 - mpol_put(new2->policy);
3562 - kmem_cache_free(sn_cache, new2);
3563 - }
3564 - return 0;
3565 +out:
3566 + mutex_unlock(&sp->mutex);
3567 + return ret;
3568 }
3569
3570 /**
3571 @@ -2221,7 +2262,7 @@ void mpol_shared_policy_init(struct shared_policy *sp, struct mempolicy *mpol)
3572 int ret;
3573
3574 sp->root = RB_ROOT; /* empty tree == default mempolicy */
3575 - spin_lock_init(&sp->lock);
3576 + mutex_init(&sp->mutex);
3577
3578 if (mpol) {
3579 struct vm_area_struct pvma;
3580 @@ -2275,7 +2316,7 @@ int mpol_set_shared_policy(struct shared_policy *info,
3581 }
3582 err = shared_policy_replace(info, vma->vm_pgoff, vma->vm_pgoff+sz, new);
3583 if (err && new)
3584 - kmem_cache_free(sn_cache, new);
3585 + sp_free(new);
3586 return err;
3587 }
3588
3589 @@ -2287,16 +2328,14 @@ void mpol_free_shared_policy(struct shared_policy *p)
3590
3591 if (!p->root.rb_node)
3592 return;
3593 - spin_lock(&p->lock);
3594 + mutex_lock(&p->mutex);
3595 next = rb_first(&p->root);
3596 while (next) {
3597 n = rb_entry(next, struct sp_node, nd);
3598 next = rb_next(&n->nd);
3599 - rb_erase(&n->nd, &p->root);
3600 - mpol_put(n->policy);
3601 - kmem_cache_free(sn_cache, n);
3602 + sp_delete(p, n);
3603 }
3604 - spin_unlock(&p->lock);
3605 + mutex_unlock(&p->mutex);
3606 }
3607
3608 /* assumes fs == KERNEL_DS */
3609 diff --git a/mm/slab.c b/mm/slab.c
3610 index c685475..d066037 100644
3611 --- a/mm/slab.c
3612 +++ b/mm/slab.c
3613 @@ -1781,9 +1781,6 @@ void __init kmem_cache_init_late(void)
3614
3615 slab_state = UP;
3616
3617 - /* Annotate slab for lockdep -- annotate the malloc caches */
3618 - init_lock_keys();
3619 -
3620 /* 6) resize the head arrays to their final sizes */
3621 mutex_lock(&slab_mutex);
3622 list_for_each_entry(cachep, &slab_caches, list)
3623 @@ -1791,6 +1788,9 @@ void __init kmem_cache_init_late(void)
3624 BUG();
3625 mutex_unlock(&slab_mutex);
3626
3627 + /* Annotate slab for lockdep -- annotate the malloc caches */
3628 + init_lock_keys();
3629 +
3630 /* Done! */
3631 slab_state = FULL;
3632
3633 diff --git a/mm/truncate.c b/mm/truncate.c
3634 index 75801ac..f38055c 100644
3635 --- a/mm/truncate.c
3636 +++ b/mm/truncate.c
3637 @@ -394,11 +394,12 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page)
3638 if (page_has_private(page) && !try_to_release_page(page, GFP_KERNEL))
3639 return 0;
3640
3641 + clear_page_mlock(page);
3642 +
3643 spin_lock_irq(&mapping->tree_lock);
3644 if (PageDirty(page))
3645 goto failed;
3646
3647 - clear_page_mlock(page);
3648 BUG_ON(page_has_private(page));
3649 __delete_from_page_cache(page);
3650 spin_unlock_irq(&mapping->tree_lock);
3651 diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
3652 index 8ca533c..830059d 100644
3653 --- a/net/8021q/vlan_core.c
3654 +++ b/net/8021q/vlan_core.c
3655 @@ -105,7 +105,6 @@ static struct sk_buff *vlan_reorder_header(struct sk_buff *skb)
3656 return NULL;
3657 memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN);
3658 skb->mac_header += VLAN_HLEN;
3659 - skb_reset_mac_len(skb);
3660 return skb;
3661 }
3662
3663 @@ -139,6 +138,8 @@ struct sk_buff *vlan_untag(struct sk_buff *skb)
3664
3665 skb_reset_network_header(skb);
3666 skb_reset_transport_header(skb);
3667 + skb_reset_mac_len(skb);
3668 +
3669 return skb;
3670
3671 err_free:
3672 diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
3673 index da80dc1..a747100 100644
3674 --- a/net/ipv4/fib_semantics.c
3675 +++ b/net/ipv4/fib_semantics.c
3676 @@ -314,6 +314,7 @@ static struct fib_info *fib_find_info(const struct fib_info *nfi)
3677 nfi->fib_scope == fi->fib_scope &&
3678 nfi->fib_prefsrc == fi->fib_prefsrc &&
3679 nfi->fib_priority == fi->fib_priority &&
3680 + nfi->fib_type == fi->fib_type &&
3681 memcmp(nfi->fib_metrics, fi->fib_metrics,
3682 sizeof(u32) * RTAX_MAX) == 0 &&
3683 ((nfi->fib_flags ^ fi->fib_flags) & ~RTNH_F_DEAD) == 0 &&
3684 @@ -833,6 +834,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
3685 fi->fib_flags = cfg->fc_flags;
3686 fi->fib_priority = cfg->fc_priority;
3687 fi->fib_prefsrc = cfg->fc_prefsrc;
3688 + fi->fib_type = cfg->fc_type;
3689
3690 fi->fib_nhs = nhs;
3691 change_nexthops(fi) {
3692 diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
3693 index 6bc85f7..ea3e9af 100644
3694 --- a/net/ipv6/addrconf.c
3695 +++ b/net/ipv6/addrconf.c
3696 @@ -788,10 +788,16 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
3697 struct in6_addr prefix;
3698 struct rt6_info *rt;
3699 struct net *net = dev_net(ifp->idev->dev);
3700 + struct flowi6 fl6 = {};
3701 +
3702 ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len);
3703 - rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1);
3704 + fl6.flowi6_oif = ifp->idev->dev->ifindex;
3705 + fl6.daddr = prefix;
3706 + rt = (struct rt6_info *)ip6_route_lookup(net, &fl6,
3707 + RT6_LOOKUP_F_IFACE);
3708
3709 - if (rt && addrconf_is_prefix_route(rt)) {
3710 + if (rt != net->ipv6.ip6_null_entry &&
3711 + addrconf_is_prefix_route(rt)) {
3712 if (onlink == 0) {
3713 ip6_del_rt(rt);
3714 rt = NULL;
3715 diff --git a/net/ipv6/route.c b/net/ipv6/route.c
3716 index 854e401..46eff42 100644
3717 --- a/net/ipv6/route.c
3718 +++ b/net/ipv6/route.c
3719 @@ -1589,17 +1589,18 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
3720 struct fib6_table *table;
3721 struct net *net = dev_net(rt->dst.dev);
3722
3723 - if (rt == net->ipv6.ip6_null_entry)
3724 - return -ENOENT;
3725 + if (rt == net->ipv6.ip6_null_entry) {
3726 + err = -ENOENT;
3727 + goto out;
3728 + }
3729
3730 table = rt->rt6i_table;
3731 write_lock_bh(&table->tb6_lock);
3732 -
3733 err = fib6_del(rt, info);
3734 - dst_release(&rt->dst);
3735 -
3736 write_unlock_bh(&table->tb6_lock);
3737
3738 +out:
3739 + dst_release(&rt->dst);
3740 return err;
3741 }
3742
3743 diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
3744 index 6a3ee98..978416d 100644
3745 --- a/scripts/Kbuild.include
3746 +++ b/scripts/Kbuild.include
3747 @@ -98,24 +98,24 @@ try-run = $(shell set -e; \
3748 # Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
3749
3750 as-option = $(call try-run,\
3751 - $(CC) $(KBUILD_CFLAGS) $(1) -c -xassembler /dev/null -o "$$TMP",$(1),$(2))
3752 + $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2))
3753
3754 # as-instr
3755 # Usage: cflags-y += $(call as-instr,instr,option1,option2)
3756
3757 as-instr = $(call try-run,\
3758 - printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -xassembler -o "$$TMP" -,$(2),$(3))
3759 + printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
3760
3761 # cc-option
3762 # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
3763
3764 cc-option = $(call try-run,\
3765 - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",$(1),$(2))
3766 + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
3767
3768 # cc-option-yn
3769 # Usage: flag := $(call cc-option-yn,-march=winchip-c6)
3770 cc-option-yn = $(call try-run,\
3771 - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -xc /dev/null -o "$$TMP",y,n)
3772 + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
3773
3774 # cc-option-align
3775 # Prefix align with either -falign or -malign
3776 @@ -125,7 +125,7 @@ cc-option-align = $(subst -functions=0,,\
3777 # cc-disable-warning
3778 # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
3779 cc-disable-warning = $(call try-run,\
3780 - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -xc /dev/null -o "$$TMP",-Wno-$(strip $(1)))
3781 + $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
3782
3783 # cc-version
3784 # Usage gcc-ver := $(call cc-version)
3785 @@ -143,7 +143,7 @@ cc-ifversion = $(shell [ $(call cc-version, $(CC)) $(1) $(2) ] && echo $(3))
3786 # cc-ldoption
3787 # Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
3788 cc-ldoption = $(call try-run,\
3789 - $(CC) $(1) -nostdlib -xc /dev/null -o "$$TMP",$(1),$(2))
3790 + $(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
3791
3792 # ld-option
3793 # Usage: LDFLAGS += $(call ld-option, -X)
3794 @@ -209,7 +209,7 @@ endif
3795 # >$< substitution to preserve $ when reloading .cmd file
3796 # note: when using inline perl scripts [perl -e '...$$t=1;...']
3797 # in $(cmd_xxx) double $$ your perl vars
3798 -make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))
3799 +make-cmd = $(subst \\,\\\\,$(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))))
3800
3801 # Find any prerequisites that is newer than target or that does not exist.
3802 # PHONY targets skipped in both cases.
3803 diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst
3804 index 4d908d1..c3f69ae 100644
3805 --- a/scripts/Makefile.fwinst
3806 +++ b/scripts/Makefile.fwinst
3807 @@ -27,7 +27,7 @@ endif
3808 installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw))
3809
3810 installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all))
3811 -installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/./
3812 +installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/.
3813
3814 # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work.
3815 PHONY += $(INSTALL_FW_PATH)/$$(%) install-all-dirs
3816 @@ -42,7 +42,7 @@ quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@)
3817 $(installed-fw-dirs):
3818 $(call cmd,mkdir)
3819
3820 -$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $(INSTALL_FW_PATH)/$$(dir %)
3821 +$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $$(dir $(INSTALL_FW_PATH)/%)
3822 $(call cmd,install)
3823
3824 PHONY += __fw_install __fw_modinst FORCE
3825 diff --git a/scripts/gcc-version.sh b/scripts/gcc-version.sh
3826 index debecb5..7f2126d 100644
3827 --- a/scripts/gcc-version.sh
3828 +++ b/scripts/gcc-version.sh
3829 @@ -22,10 +22,10 @@ if [ ${#compiler} -eq 0 ]; then
3830 exit 1
3831 fi
3832
3833 -MAJOR=$(echo __GNUC__ | $compiler -E -xc - | tail -n 1)
3834 -MINOR=$(echo __GNUC_MINOR__ | $compiler -E -xc - | tail -n 1)
3835 +MAJOR=$(echo __GNUC__ | $compiler -E -x c - | tail -n 1)
3836 +MINOR=$(echo __GNUC_MINOR__ | $compiler -E -x c - | tail -n 1)
3837 if [ "x$with_patchlevel" != "x" ] ; then
3838 - PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -xc - | tail -n 1)
3839 + PATCHLEVEL=$(echo __GNUC_PATCHLEVEL__ | $compiler -E -x c - | tail -n 1)
3840 printf "%02d%02d%02d\\n" $MAJOR $MINOR $PATCHLEVEL
3841 else
3842 printf "%02d%02d\\n" $MAJOR $MINOR
3843 diff --git a/scripts/gcc-x86_32-has-stack-protector.sh b/scripts/gcc-x86_32-has-stack-protector.sh
3844 index 29493dc..12dbd0b 100644
3845 --- a/scripts/gcc-x86_32-has-stack-protector.sh
3846 +++ b/scripts/gcc-x86_32-has-stack-protector.sh
3847 @@ -1,6 +1,6 @@
3848 #!/bin/sh
3849
3850 -echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
3851 +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
3852 if [ "$?" -eq "0" ] ; then
3853 echo y
3854 else
3855 diff --git a/scripts/gcc-x86_64-has-stack-protector.sh b/scripts/gcc-x86_64-has-stack-protector.sh
3856 index afaec61..973e8c1 100644
3857 --- a/scripts/gcc-x86_64-has-stack-protector.sh
3858 +++ b/scripts/gcc-x86_64-has-stack-protector.sh
3859 @@ -1,6 +1,6 @@
3860 #!/bin/sh
3861
3862 -echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
3863 +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"
3864 if [ "$?" -eq "0" ] ; then
3865 echo y
3866 else
3867 diff --git a/scripts/kconfig/check.sh b/scripts/kconfig/check.sh
3868 index fa59cbf..854d9c7 100755
3869 --- a/scripts/kconfig/check.sh
3870 +++ b/scripts/kconfig/check.sh
3871 @@ -1,6 +1,6 @@
3872 #!/bin/sh
3873 # Needed for systems without gettext
3874 -$* -xc -o /dev/null - > /dev/null 2>&1 << EOF
3875 +$* -x c -o /dev/null - > /dev/null 2>&1 << EOF
3876 #include <libintl.h>
3877 int main()
3878 {
3879 diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh
3880 index e3b12c0..c8e8a71 100644
3881 --- a/scripts/kconfig/lxdialog/check-lxdialog.sh
3882 +++ b/scripts/kconfig/lxdialog/check-lxdialog.sh
3883 @@ -38,7 +38,7 @@ trap "rm -f $tmp" 0 1 2 3 15
3884
3885 # Check if we can link to ncurses
3886 check() {
3887 - $cc -xc - -o $tmp 2>/dev/null <<'EOF'
3888 + $cc -x c - -o $tmp 2>/dev/null <<'EOF'
3889 #include CURSES_LOC
3890 main() {}
3891 EOF
3892 diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl
3893 index 2fbbbc1..5eb3777 100644
3894 --- a/scripts/kconfig/streamline_config.pl
3895 +++ b/scripts/kconfig/streamline_config.pl
3896 @@ -605,6 +605,8 @@ foreach my $line (@config_file) {
3897 if (defined($configs{$1})) {
3898 if ($localyesconfig) {
3899 $setconfigs{$1} = 'y';
3900 + print "$1=y\n";
3901 + next;
3902 } else {
3903 $setconfigs{$1} = $2;
3904 }
3905 diff --git a/scripts/package/buildtar b/scripts/package/buildtar
3906 index 8a7b155..d0d748e 100644
3907 --- a/scripts/package/buildtar
3908 +++ b/scripts/package/buildtar
3909 @@ -109,7 +109,7 @@ esac
3910 if tar --owner=root --group=root --help >/dev/null 2>&1; then
3911 opts="--owner=root --group=root"
3912 fi
3913 - tar cf - . $opts | ${compress} > "${tarball}${file_ext}"
3914 + tar cf - boot/* lib/* $opts | ${compress} > "${tarball}${file_ext}"
3915 )
3916
3917 echo "Tarball successfully created in ${tarball}${file_ext}"
3918 diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c
3919 index 5a34355..0fe6d64 100644
3920 --- a/sound/drivers/aloop.c
3921 +++ b/sound/drivers/aloop.c
3922 @@ -120,6 +120,7 @@ struct loopback_pcm {
3923 unsigned int last_drift;
3924 unsigned long last_jiffies;
3925 struct timer_list timer;
3926 + spinlock_t timer_lock;
3927 };
3928
3929 static struct platform_device *devices[SNDRV_CARDS];
3930 @@ -170,6 +171,7 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
3931 unsigned long tick;
3932 unsigned int rate_shift = get_rate_shift(dpcm);
3933
3934 + spin_lock(&dpcm->timer_lock);
3935 if (rate_shift != dpcm->pcm_rate_shift) {
3936 dpcm->pcm_rate_shift = rate_shift;
3937 dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
3938 @@ -182,12 +184,15 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)
3939 tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps;
3940 dpcm->timer.expires = jiffies + tick;
3941 add_timer(&dpcm->timer);
3942 + spin_unlock(&dpcm->timer_lock);
3943 }
3944
3945 static inline void loopback_timer_stop(struct loopback_pcm *dpcm)
3946 {
3947 + spin_lock(&dpcm->timer_lock);
3948 del_timer(&dpcm->timer);
3949 dpcm->timer.expires = 0;
3950 + spin_unlock(&dpcm->timer_lock);
3951 }
3952
3953 #define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK)
3954 @@ -667,6 +672,7 @@ static int loopback_open(struct snd_pcm_substream *substream)
3955 dpcm->substream = substream;
3956 setup_timer(&dpcm->timer, loopback_timer_function,
3957 (unsigned long)dpcm);
3958 + spin_lock_init(&dpcm->timer_lock);
3959
3960 cable = loopback->cables[substream->number][dev];
3961 if (!cable) {
3962 diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
3963 index 1c65cc5..38fdefc 100644
3964 --- a/sound/pci/hda/hda_codec.c
3965 +++ b/sound/pci/hda/hda_codec.c
3966 @@ -3580,7 +3580,7 @@ static inline void hda_exec_init_verbs(struct hda_codec *codec) {}
3967 /*
3968 * call suspend and power-down; used both from PM and power-save
3969 */
3970 -static void hda_call_codec_suspend(struct hda_codec *codec)
3971 +static void hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)
3972 {
3973 if (codec->patch_ops.suspend)
3974 codec->patch_ops.suspend(codec);
3975 @@ -3589,7 +3589,9 @@ static void hda_call_codec_suspend(struct hda_codec *codec)
3976 codec->afg ? codec->afg : codec->mfg,
3977 AC_PWRST_D3);
3978 #ifdef CONFIG_SND_HDA_POWER_SAVE
3979 - cancel_delayed_work(&codec->power_work);
3980 + /* Cancel delayed work if we aren't currently running from it. */
3981 + if (!in_wq)
3982 + cancel_delayed_work_sync(&codec->power_work);
3983 spin_lock(&codec->power_lock);
3984 snd_hda_update_power_acct(codec);
3985 trace_hda_power_down(codec);
3986 @@ -4410,7 +4412,7 @@ static void hda_power_work(struct work_struct *work)
3987 }
3988 spin_unlock(&codec->power_lock);
3989
3990 - hda_call_codec_suspend(codec);
3991 + hda_call_codec_suspend(codec, true);
3992 if (bus->ops.pm_notify)
3993 bus->ops.pm_notify(bus);
3994 }
3995 @@ -5076,7 +5078,7 @@ int snd_hda_suspend(struct hda_bus *bus)
3996
3997 list_for_each_entry(codec, &bus->codec_list, list) {
3998 if (hda_codec_is_power_on(codec))
3999 - hda_call_codec_suspend(codec);
4000 + hda_call_codec_suspend(codec, false);
4001 }
4002 return 0;
4003 }
4004 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
4005 index c4763c5..12a9432 100644
4006 --- a/sound/pci/hda/hda_intel.c
4007 +++ b/sound/pci/hda/hda_intel.c
4008 @@ -538,6 +538,7 @@ enum {
4009 #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
4010 #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
4011 #define AZX_DCAPS_POSFIX_COMBO (1 << 24) /* Use COMBO as default */
4012 +#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
4013
4014 /* quirks for ATI SB / AMD Hudson */
4015 #define AZX_DCAPS_PRESET_ATI_SB \
4016 @@ -2120,6 +2121,27 @@ static unsigned int azx_get_position(struct azx *chip,
4017
4018 if (pos >= azx_dev->bufsize)
4019 pos = 0;
4020 +
4021 + /* calculate runtime delay from LPIB */
4022 + if (azx_dev->substream->runtime &&
4023 + chip->position_fix[stream] == POS_FIX_POSBUF &&
4024 + (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
4025 + unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
4026 + int delay;
4027 + if (stream == SNDRV_PCM_STREAM_PLAYBACK)
4028 + delay = pos - lpib_pos;
4029 + else
4030 + delay = lpib_pos - pos;
4031 + if (delay < 0)
4032 + delay += azx_dev->bufsize;
4033 + if (delay >= azx_dev->period_bytes) {
4034 + snd_printdd("delay %d > period_bytes %d\n",
4035 + delay, azx_dev->period_bytes);
4036 + delay = 0; /* something is wrong */
4037 + }
4038 + azx_dev->substream->runtime->delay =
4039 + bytes_to_frames(azx_dev->substream->runtime, delay);
4040 + }
4041 return pos;
4042 }
4043
4044 @@ -3260,7 +3282,7 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
4045 /* CPT */
4046 { PCI_DEVICE(0x8086, 0x1c20),
4047 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
4048 - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
4049 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4050 /* PBG */
4051 { PCI_DEVICE(0x8086, 0x1d20),
4052 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
4053 @@ -3268,23 +3290,26 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
4054 /* Panther Point */
4055 { PCI_DEVICE(0x8086, 0x1e20),
4056 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
4057 - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
4058 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4059 /* Lynx Point */
4060 { PCI_DEVICE(0x8086, 0x8c20),
4061 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
4062 - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
4063 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4064 /* Lynx Point-LP */
4065 { PCI_DEVICE(0x8086, 0x9c20),
4066 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
4067 - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
4068 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4069 /* Lynx Point-LP */
4070 { PCI_DEVICE(0x8086, 0x9c21),
4071 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
4072 - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
4073 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4074 /* Haswell */
4075 { PCI_DEVICE(0x8086, 0x0c0c),
4076 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
4077 - AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
4078 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4079 + { PCI_DEVICE(0x8086, 0x0d0c),
4080 + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
4081 + AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
4082 /* SCH */
4083 { PCI_DEVICE(0x8086, 0x811b),
4084 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
4085 diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
4086 index 5e22a8f..784017e 100644
4087 --- a/sound/pci/hda/patch_conexant.c
4088 +++ b/sound/pci/hda/patch_conexant.c
4089 @@ -4462,6 +4462,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
4090 SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410),
4091 SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410),
4092 SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC),
4093 + SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC),
4094 SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC),
4095 {}
4096 };
4097 diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
4098 index 4f81dd4..56a3eef 100644
4099 --- a/sound/pci/hda/patch_realtek.c
4100 +++ b/sound/pci/hda/patch_realtek.c
4101 @@ -6334,6 +6334,12 @@ static int patch_alc269(struct hda_codec *codec)
4102
4103 spec = codec->spec;
4104
4105 + alc_pick_fixup(codec, alc269_fixup_models,
4106 + alc269_fixup_tbl, alc269_fixups);
4107 + alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4108 +
4109 + alc_auto_parse_customize_define(codec);
4110 +
4111 if (codec->vendor_id == 0x10ec0269) {
4112 spec->codec_variant = ALC269_TYPE_ALC269VA;
4113 switch (alc_get_coef0(codec) & 0x00f0) {
4114 @@ -6361,12 +6367,6 @@ static int patch_alc269(struct hda_codec *codec)
4115 alc269_fill_coef(codec);
4116 }
4117
4118 - alc_pick_fixup(codec, alc269_fixup_models,
4119 - alc269_fixup_tbl, alc269_fixups);
4120 - alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4121 -
4122 - alc_auto_parse_customize_define(codec);
4123 -
4124 /* automatic parse from the BIOS config */
4125 err = alc269_parse_auto_config(codec);
4126 if (err < 0)
4127 diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
4128 index 4307717..4b4072f 100644
4129 --- a/sound/pci/hda/patch_via.c
4130 +++ b/sound/pci/hda/patch_via.c
4131 @@ -1672,7 +1672,8 @@ static void via_hp_automute(struct hda_codec *codec)
4132 struct via_spec *spec = codec->spec;
4133
4134 if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0] &&
4135 - (spec->codec_type != VT1708 || spec->vt1708_jack_detect))
4136 + (spec->codec_type != VT1708 || spec->vt1708_jack_detect) &&
4137 + is_jack_detectable(codec, spec->autocfg.hp_pins[0]))
4138 present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
4139
4140 if (spec->smart51_enabled)
4141 @@ -3669,6 +3670,32 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
4142 update_power_state(codec, 0x21, AC_PWRST_D3);
4143 }
4144
4145 +/*
4146 + * pin fix-up
4147 + */
4148 +enum {
4149 + VIA_FIXUP_INTMIC_BOOST,
4150 +};
4151 +
4152 +static void via_fixup_intmic_boost(struct hda_codec *codec,
4153 + const struct hda_fixup *fix, int action)
4154 +{
4155 + if (action == HDA_FIXUP_ACT_PRE_PROBE)
4156 + override_mic_boost(codec, 0x30, 0, 2, 40);
4157 +}
4158 +
4159 +static const struct hda_fixup via_fixups[] = {
4160 + [VIA_FIXUP_INTMIC_BOOST] = {
4161 + .type = HDA_FIXUP_FUNC,
4162 + .v.func = via_fixup_intmic_boost,
4163 + },
4164 +};
4165 +
4166 +static const struct snd_pci_quirk vt2002p_fixups[] = {
4167 + SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST),
4168 + {}
4169 +};
4170 +
4171 /* patch for vt2002P */
4172 static int patch_vt2002P(struct hda_codec *codec)
4173 {
4174 @@ -3685,6 +3712,9 @@ static int patch_vt2002P(struct hda_codec *codec)
4175 override_mic_boost(codec, 0x29, 0, 3, 40);
4176 add_secret_dac_path(codec);
4177
4178 + snd_hda_pick_fixup(codec, NULL, vt2002p_fixups, via_fixups);
4179 + snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
4180 +
4181 /* automatic parse from the BIOS config */
4182 err = via_parse_auto_config(codec);
4183 if (err < 0) {
4184 diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
4185 index 01ebbcc..11dfc33 100644
4186 --- a/sound/soc/codecs/wm5110.c
4187 +++ b/sound/soc/codecs/wm5110.c
4188 @@ -869,6 +869,8 @@ static unsigned int wm5110_digital_vu[] = {
4189 ARIZONA_ADC_DIGITAL_VOLUME_2R,
4190 ARIZONA_ADC_DIGITAL_VOLUME_3L,
4191 ARIZONA_ADC_DIGITAL_VOLUME_3R,
4192 + ARIZONA_ADC_DIGITAL_VOLUME_4L,
4193 + ARIZONA_ADC_DIGITAL_VOLUME_4R,
4194
4195 ARIZONA_DAC_DIGITAL_VOLUME_1L,
4196 ARIZONA_DAC_DIGITAL_VOLUME_1R,
4197 @@ -880,6 +882,8 @@ static unsigned int wm5110_digital_vu[] = {
4198 ARIZONA_DAC_DIGITAL_VOLUME_4R,
4199 ARIZONA_DAC_DIGITAL_VOLUME_5L,
4200 ARIZONA_DAC_DIGITAL_VOLUME_5R,
4201 + ARIZONA_DAC_DIGITAL_VOLUME_6L,
4202 + ARIZONA_DAC_DIGITAL_VOLUME_6R,
4203 };
4204
4205 static struct snd_soc_codec_driver soc_codec_dev_wm5110 = {
4206 diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c
4207 index c6d2076..c9516f0 100644
4208 --- a/sound/soc/codecs/wm9712.c
4209 +++ b/sound/soc/codecs/wm9712.c
4210 @@ -146,7 +146,7 @@ SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0),
4211 SOC_SINGLE("Bass Volume", AC97_MASTER_TONE, 8, 15, 1),
4212 SOC_SINGLE("Treble Volume", AC97_MASTER_TONE, 0, 15, 1),
4213
4214 -SOC_SINGLE("Capture ADC Switch", AC97_REC_GAIN, 15, 1, 1),
4215 +SOC_SINGLE("Capture Switch", AC97_REC_GAIN, 15, 1, 1),
4216 SOC_ENUM("Capture Volume Steps", wm9712_enum[6]),
4217 SOC_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 0),
4218 SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0),
4219 diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c
4220 index 61baa48..57b27ef 100644
4221 --- a/sound/soc/codecs/wm_hubs.c
4222 +++ b/sound/soc/codecs/wm_hubs.c
4223 @@ -634,6 +634,11 @@ void wm_hubs_update_class_w(struct snd_soc_codec *codec)
4224
4225 snd_soc_update_bits(codec, WM8993_CLASS_W_0,
4226 WM8993_CP_DYN_V | WM8993_CP_DYN_FREQ, enable);
4227 +
4228 + snd_soc_write(codec, WM8993_LEFT_OUTPUT_VOLUME,
4229 + snd_soc_read(codec, WM8993_LEFT_OUTPUT_VOLUME));
4230 + snd_soc_write(codec, WM8993_RIGHT_OUTPUT_VOLUME,
4231 + snd_soc_read(codec, WM8993_RIGHT_OUTPUT_VOLUME));
4232 }
4233 EXPORT_SYMBOL_GPL(wm_hubs_update_class_w);
4234
4235 diff --git a/sound/usb/card.h b/sound/usb/card.h
4236 index 2b9ffff..d9d2b5a 100644
4237 --- a/sound/usb/card.h
4238 +++ b/sound/usb/card.h
4239 @@ -92,6 +92,8 @@ struct snd_usb_endpoint {
4240 unsigned char silence_value;
4241 unsigned int stride;
4242 int iface, alt_idx;
4243 + int skip_packets; /* quirks for devices to ignore the first n packets
4244 + in a stream */
4245
4246 spinlock_t lock;
4247 struct list_head list;
4248 diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
4249 index 060dccb..d9de667 100644
4250 --- a/sound/usb/endpoint.c
4251 +++ b/sound/usb/endpoint.c
4252 @@ -31,6 +31,7 @@
4253 #include "card.h"
4254 #include "endpoint.h"
4255 #include "pcm.h"
4256 +#include "quirks.h"
4257
4258 #define EP_FLAG_ACTIVATED 0
4259 #define EP_FLAG_RUNNING 1
4260 @@ -170,6 +171,11 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep,
4261 {
4262 struct urb *urb = urb_ctx->urb;
4263
4264 + if (unlikely(ep->skip_packets > 0)) {
4265 + ep->skip_packets--;
4266 + return;
4267 + }
4268 +
4269 if (ep->sync_slave)
4270 snd_usb_handle_sync_urb(ep->sync_slave, ep, urb);
4271
4272 @@ -828,6 +834,8 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep)
4273 ep->unlink_mask = 0;
4274 ep->phase = 0;
4275
4276 + snd_usb_endpoint_start_quirk(ep);
4277 +
4278 /*
4279 * If this endpoint has a data endpoint as implicit feedback source,
4280 * don't start the urbs here. Instead, mark them all as available,
4281 diff --git a/sound/usb/helper.c b/sound/usb/helper.c
4282 index 9eed8f4..c1db28f 100644
4283 --- a/sound/usb/helper.c
4284 +++ b/sound/usb/helper.c
4285 @@ -21,6 +21,7 @@
4286
4287 #include "usbaudio.h"
4288 #include "helper.h"
4289 +#include "quirks.h"
4290
4291 /*
4292 * combine bytes and get an integer value
4293 @@ -97,6 +98,10 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
4294 memcpy(data, buf, size);
4295 kfree(buf);
4296 }
4297 +
4298 + snd_usb_ctl_msg_quirk(dev, pipe, request, requesttype,
4299 + value, index, data, size);
4300 +
4301 return err;
4302 }
4303
4304 diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
4305 index 4f40ba8..fe56c9d 100644
4306 --- a/sound/usb/mixer.c
4307 +++ b/sound/usb/mixer.c
4308 @@ -1267,6 +1267,13 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void
4309 /* disable non-functional volume control */
4310 master_bits &= ~UAC_CONTROL_BIT(UAC_FU_VOLUME);
4311 break;
4312 + case USB_ID(0x1130, 0xf211):
4313 + snd_printk(KERN_INFO
4314 + "usbmixer: volume control quirk for Tenx TP6911 Audio Headset\n");
4315 + /* disable non-functional volume control */
4316 + channels = 0;
4317 + break;
4318 +
4319 }
4320 if (channels > 0)
4321 first_ch_bits = snd_usb_combine_bytes(bmaControls + csize, csize);
4322 diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
4323 index 79780fa..d73ac9b 100644
4324 --- a/sound/usb/quirks-table.h
4325 +++ b/sound/usb/quirks-table.h
4326 @@ -2781,6 +2781,59 @@ YAMAHA_DEVICE(0x7010, "UB99"),
4327 }
4328 },
4329
4330 +/* Microsoft XboxLive Headset/Xbox Communicator */
4331 +{
4332 + USB_DEVICE(0x045e, 0x0283),
4333 + .bInterfaceClass = USB_CLASS_PER_INTERFACE,
4334 + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
4335 + .vendor_name = "Microsoft",
4336 + .product_name = "XboxLive Headset/Xbox Communicator",
4337 + .ifnum = QUIRK_ANY_INTERFACE,
4338 + .type = QUIRK_COMPOSITE,
4339 + .data = &(const struct snd_usb_audio_quirk[]) {
4340 + {
4341 + /* playback */
4342 + .ifnum = 0,
4343 + .type = QUIRK_AUDIO_FIXED_ENDPOINT,
4344 + .data = &(const struct audioformat) {
4345 + .formats = SNDRV_PCM_FMTBIT_S16_LE,
4346 + .channels = 1,
4347 + .iface = 0,
4348 + .altsetting = 0,
4349 + .altset_idx = 0,
4350 + .attributes = 0,
4351 + .endpoint = 0x04,
4352 + .ep_attr = 0x05,
4353 + .rates = SNDRV_PCM_RATE_CONTINUOUS,
4354 + .rate_min = 22050,
4355 + .rate_max = 22050
4356 + }
4357 + },
4358 + {
4359 + /* capture */
4360 + .ifnum = 1,
4361 + .type = QUIRK_AUDIO_FIXED_ENDPOINT,
4362 + .data = &(const struct audioformat) {
4363 + .formats = SNDRV_PCM_FMTBIT_S16_LE,
4364 + .channels = 1,
4365 + .iface = 1,
4366 + .altsetting = 0,
4367 + .altset_idx = 0,
4368 + .attributes = 0,
4369 + .endpoint = 0x85,
4370 + .ep_attr = 0x05,
4371 + .rates = SNDRV_PCM_RATE_CONTINUOUS,
4372 + .rate_min = 16000,
4373 + .rate_max = 16000
4374 + }
4375 + },
4376 + {
4377 + .ifnum = -1
4378 + }
4379 + }
4380 + }
4381 +},
4382 +
4383 {
4384 /*
4385 * Some USB MIDI devices don't have an audio control interface,
4386 diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
4387 index 2781726..0f58b4b 100644
4388 --- a/sound/usb/quirks.c
4389 +++ b/sound/usb/quirks.c
4390 @@ -761,3 +761,27 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
4391 }
4392 }
4393
4394 +void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep)
4395 +{
4396 + /*
4397 + * "Playback Design" products send bogus feedback data at the start
4398 + * of the stream. Ignore them.
4399 + */
4400 + if ((le16_to_cpu(ep->chip->dev->descriptor.idVendor) == 0x23ba) &&
4401 + ep->type == SND_USB_ENDPOINT_TYPE_SYNC)
4402 + ep->skip_packets = 4;
4403 +}
4404 +
4405 +void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
4406 + __u8 request, __u8 requesttype, __u16 value,
4407 + __u16 index, void *data, __u16 size)
4408 +{
4409 + /*
4410 + * "Playback Design" products need a 20ms delay after each
4411 + * class compliant request
4412 + */
4413 + if ((le16_to_cpu(dev->descriptor.idVendor) == 0x23ba) &&
4414 + (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
4415 + mdelay(20);
4416 +}
4417 +
4418 diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h
4419 index 03e5e94..0ca9e91 100644
4420 --- a/sound/usb/quirks.h
4421 +++ b/sound/usb/quirks.h
4422 @@ -1,6 +1,10 @@
4423 #ifndef __USBAUDIO_QUIRKS_H
4424 #define __USBAUDIO_QUIRKS_H
4425
4426 +struct audioformat;
4427 +struct snd_usb_endpoint;
4428 +struct snd_usb_substream;
4429 +
4430 int snd_usb_create_quirk(struct snd_usb_audio *chip,
4431 struct usb_interface *iface,
4432 struct usb_driver *driver,
4433 @@ -20,4 +24,10 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
4434 int snd_usb_is_big_endian_format(struct snd_usb_audio *chip,
4435 struct audioformat *fp);
4436
4437 +void snd_usb_endpoint_start_quirk(struct snd_usb_endpoint *ep);
4438 +
4439 +void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
4440 + __u8 request, __u8 requesttype, __u16 value,
4441 + __u16 index, void *data, __u16 size);
4442 +
4443 #endif /* __USBAUDIO_QUIRKS_H */
4444 diff --git a/tools/lguest/lguest.c b/tools/lguest/lguest.c
4445 index f759f4f..fd2f922 100644
4446 --- a/tools/lguest/lguest.c
4447 +++ b/tools/lguest/lguest.c
4448 @@ -1299,6 +1299,7 @@ static struct device *new_device(const char *name, u16 type)
4449 dev->feature_len = 0;
4450 dev->num_vq = 0;
4451 dev->running = false;
4452 + dev->next = NULL;
4453
4454 /*
4455 * Append to device list. Prepending to a single-linked list is
4456 diff --git a/tools/perf/Makefile b/tools/perf/Makefile
4457 index 35655c3..3657ab0 100644
4458 --- a/tools/perf/Makefile
4459 +++ b/tools/perf/Makefile
4460 @@ -62,7 +62,7 @@ ifeq ($(ARCH),x86_64)
4461 ARCH := x86
4462 IS_X86_64 := 0
4463 ifeq (, $(findstring m32,$(EXTRA_CFLAGS)))
4464 - IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -xc - | tail -n 1)
4465 + IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
4466 endif
4467 ifeq (${IS_X86_64}, 1)
4468 RAW_ARCH := x86_64
4469 diff --git a/tools/power/cpupower/Makefile b/tools/power/cpupower/Makefile
4470 index a93e06c..cf397bd 100644
4471 --- a/tools/power/cpupower/Makefile
4472 +++ b/tools/power/cpupower/Makefile
4473 @@ -111,7 +111,7 @@ GMO_FILES = ${shell for HLANG in ${LANGUAGES}; do echo $(OUTPUT)po/$$HLANG.gmo;
4474 export CROSS CC AR STRIP RANLIB CFLAGS LDFLAGS LIB_OBJS
4475
4476 # check if compiler option is supported
4477 -cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;}
4478 +cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -x c /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;}
4479
4480 # use '-Os' optimization if available, else use -O2
4481 OPTIMIZATION := $(call cc-supports,-Os,-O2)