Annotation of /trunk/kernel-magellan/patches-3.9/0100-3.9.1-all-fixes.patch
Parent Directory | Revision Log
Revision 2178 -
(hide annotations)
(download)
Wed May 22 06:42:34 2013 UTC (11 years, 4 months ago) by niro
File size: 114460 byte(s)
Wed May 22 06:42:34 2013 UTC (11 years, 4 months ago) by niro
File size: 114460 byte(s)
-linux-3.9.1-3
1 | niro | 2178 | diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi |
2 | index cb7bcc5..02b70a4 100644 | ||
3 | --- a/arch/arm/boot/dts/at91sam9260.dtsi | ||
4 | +++ b/arch/arm/boot/dts/at91sam9260.dtsi | ||
5 | @@ -158,8 +158,8 @@ | ||
6 | usart1 { | ||
7 | pinctrl_usart1: usart1-0 { | ||
8 | atmel,pins = | ||
9 | - <2 6 0x1 0x1 /* PB6 periph A with pullup */ | ||
10 | - 2 7 0x1 0x0>; /* PB7 periph A */ | ||
11 | + <1 6 0x1 0x1 /* PB6 periph A with pullup */ | ||
12 | + 1 7 0x1 0x0>; /* PB7 periph A */ | ||
13 | }; | ||
14 | |||
15 | pinctrl_usart1_rts: usart1_rts-0 { | ||
16 | @@ -194,18 +194,18 @@ | ||
17 | usart3 { | ||
18 | pinctrl_usart3: usart3-0 { | ||
19 | atmel,pins = | ||
20 | - <2 10 0x1 0x1 /* PB10 periph A with pullup */ | ||
21 | - 2 11 0x1 0x0>; /* PB11 periph A */ | ||
22 | + <1 10 0x1 0x1 /* PB10 periph A with pullup */ | ||
23 | + 1 11 0x1 0x0>; /* PB11 periph A */ | ||
24 | }; | ||
25 | |||
26 | pinctrl_usart3_rts: usart3_rts-0 { | ||
27 | atmel,pins = | ||
28 | - <3 8 0x2 0x0>; /* PB8 periph B */ | ||
29 | + <2 8 0x2 0x0>; /* PC8 periph B */ | ||
30 | }; | ||
31 | |||
32 | pinctrl_usart3_cts: usart3_cts-0 { | ||
33 | atmel,pins = | ||
34 | - <3 10 0x2 0x0>; /* PB10 periph B */ | ||
35 | + <2 10 0x2 0x0>; /* PC10 periph B */ | ||
36 | }; | ||
37 | }; | ||
38 | |||
39 | @@ -220,8 +220,8 @@ | ||
40 | uart1 { | ||
41 | pinctrl_uart1: uart1-0 { | ||
42 | atmel,pins = | ||
43 | - <2 12 0x1 0x1 /* PB12 periph A with pullup */ | ||
44 | - 2 13 0x1 0x0>; /* PB13 periph A */ | ||
45 | + <1 12 0x1 0x1 /* PB12 periph A with pullup */ | ||
46 | + 1 13 0x1 0x0>; /* PB13 periph A */ | ||
47 | }; | ||
48 | }; | ||
49 | |||
50 | diff --git a/arch/arm/boot/dts/at91sam9g15.dtsi b/arch/arm/boot/dts/at91sam9g15.dtsi | ||
51 | index fbe7a70..28467fd 100644 | ||
52 | --- a/arch/arm/boot/dts/at91sam9g15.dtsi | ||
53 | +++ b/arch/arm/boot/dts/at91sam9g15.dtsi | ||
54 | @@ -10,7 +10,7 @@ | ||
55 | |||
56 | / { | ||
57 | model = "Atmel AT91SAM9G15 SoC"; | ||
58 | - compatible = "atmel, at91sam9g15, atmel,at91sam9x5"; | ||
59 | + compatible = "atmel,at91sam9g15", "atmel,at91sam9x5"; | ||
60 | |||
61 | ahb { | ||
62 | apb { | ||
63 | diff --git a/arch/arm/boot/dts/at91sam9g15ek.dts b/arch/arm/boot/dts/at91sam9g15ek.dts | ||
64 | index 86dd3f6..5427b2d 100644 | ||
65 | --- a/arch/arm/boot/dts/at91sam9g15ek.dts | ||
66 | +++ b/arch/arm/boot/dts/at91sam9g15ek.dts | ||
67 | @@ -11,6 +11,6 @@ | ||
68 | /include/ "at91sam9x5ek.dtsi" | ||
69 | |||
70 | / { | ||
71 | - model = "Atmel AT91SAM9G25-EK"; | ||
72 | + model = "Atmel AT91SAM9G15-EK"; | ||
73 | compatible = "atmel,at91sam9g15ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
74 | }; | ||
75 | diff --git a/arch/arm/boot/dts/at91sam9g25.dtsi b/arch/arm/boot/dts/at91sam9g25.dtsi | ||
76 | index 05a718f..5fd32df 100644 | ||
77 | --- a/arch/arm/boot/dts/at91sam9g25.dtsi | ||
78 | +++ b/arch/arm/boot/dts/at91sam9g25.dtsi | ||
79 | @@ -10,7 +10,7 @@ | ||
80 | |||
81 | / { | ||
82 | model = "Atmel AT91SAM9G25 SoC"; | ||
83 | - compatible = "atmel, at91sam9g25, atmel,at91sam9x5"; | ||
84 | + compatible = "atmel,at91sam9g25", "atmel,at91sam9x5"; | ||
85 | |||
86 | ahb { | ||
87 | apb { | ||
88 | diff --git a/arch/arm/boot/dts/at91sam9g35.dtsi b/arch/arm/boot/dts/at91sam9g35.dtsi | ||
89 | index f9d14a7..d6fa8af 100644 | ||
90 | --- a/arch/arm/boot/dts/at91sam9g35.dtsi | ||
91 | +++ b/arch/arm/boot/dts/at91sam9g35.dtsi | ||
92 | @@ -10,7 +10,7 @@ | ||
93 | |||
94 | / { | ||
95 | model = "Atmel AT91SAM9G35 SoC"; | ||
96 | - compatible = "atmel, at91sam9g35, atmel,at91sam9x5"; | ||
97 | + compatible = "atmel,at91sam9g35", "atmel,at91sam9x5"; | ||
98 | |||
99 | ahb { | ||
100 | apb { | ||
101 | diff --git a/arch/arm/boot/dts/at91sam9x25.dtsi b/arch/arm/boot/dts/at91sam9x25.dtsi | ||
102 | index 54eb33b..9ac2bc2 100644 | ||
103 | --- a/arch/arm/boot/dts/at91sam9x25.dtsi | ||
104 | +++ b/arch/arm/boot/dts/at91sam9x25.dtsi | ||
105 | @@ -10,7 +10,7 @@ | ||
106 | |||
107 | / { | ||
108 | model = "Atmel AT91SAM9X25 SoC"; | ||
109 | - compatible = "atmel, at91sam9x25, atmel,at91sam9x5"; | ||
110 | + compatible = "atmel,at91sam9x25", "atmel,at91sam9x5"; | ||
111 | |||
112 | ahb { | ||
113 | apb { | ||
114 | diff --git a/arch/arm/boot/dts/at91sam9x35.dtsi b/arch/arm/boot/dts/at91sam9x35.dtsi | ||
115 | index fb102d6..ba67d83 100644 | ||
116 | --- a/arch/arm/boot/dts/at91sam9x35.dtsi | ||
117 | +++ b/arch/arm/boot/dts/at91sam9x35.dtsi | ||
118 | @@ -10,7 +10,7 @@ | ||
119 | |||
120 | / { | ||
121 | model = "Atmel AT91SAM9X35 SoC"; | ||
122 | - compatible = "atmel, at91sam9x35, atmel,at91sam9x5"; | ||
123 | + compatible = "atmel,at91sam9x35", "atmel,at91sam9x5"; | ||
124 | |||
125 | ahb { | ||
126 | apb { | ||
127 | diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi | ||
128 | index 8a7cf1d..ccab256 100644 | ||
129 | --- a/arch/arm/boot/dts/at91sam9x5ek.dtsi | ||
130 | +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi | ||
131 | @@ -13,7 +13,7 @@ | ||
132 | compatible = "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | ||
133 | |||
134 | chosen { | ||
135 | - bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; | ||
136 | + bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; | ||
137 | }; | ||
138 | |||
139 | ahb { | ||
140 | diff --git a/arch/arm/configs/at91sam9g45_defconfig b/arch/arm/configs/at91sam9g45_defconfig | ||
141 | index 606d48f..8aab786 100644 | ||
142 | --- a/arch/arm/configs/at91sam9g45_defconfig | ||
143 | +++ b/arch/arm/configs/at91sam9g45_defconfig | ||
144 | @@ -173,7 +173,6 @@ CONFIG_MMC=y | ||
145 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
146 | CONFIG_SDIO_UART=m | ||
147 | CONFIG_MMC_ATMELMCI=y | ||
148 | -CONFIG_MMC_ATMELMCI_DMA=y | ||
149 | CONFIG_LEDS_ATMEL_PWM=y | ||
150 | CONFIG_LEDS_GPIO=y | ||
151 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
152 | diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h | ||
153 | index 80d6fc4..9bcd262 100644 | ||
154 | --- a/arch/arm/include/asm/pgtable.h | ||
155 | +++ b/arch/arm/include/asm/pgtable.h | ||
156 | @@ -61,6 +61,15 @@ extern void __pgd_error(const char *file, int line, pgd_t); | ||
157 | #define FIRST_USER_ADDRESS PAGE_SIZE | ||
158 | |||
159 | /* | ||
160 | + * Use TASK_SIZE as the ceiling argument for free_pgtables() and | ||
161 | + * free_pgd_range() to avoid freeing the modules pmd when LPAE is enabled (pmd | ||
162 | + * page shared between user and kernel). | ||
163 | + */ | ||
164 | +#ifdef CONFIG_ARM_LPAE | ||
165 | +#define USER_PGTABLES_CEILING TASK_SIZE | ||
166 | +#endif | ||
167 | + | ||
168 | +/* | ||
169 | * The pgprot_* and protection_map entries will be fixed up in runtime | ||
170 | * to include the cachable and bufferable bits based on memory policy, | ||
171 | * as well as any architecture dependent bits like global/ASID and SMP | ||
172 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c | ||
173 | index 4b67847..6b4608d 100644 | ||
174 | --- a/arch/arm/mach-at91/setup.c | ||
175 | +++ b/arch/arm/mach-at91/setup.c | ||
176 | @@ -333,7 +333,7 @@ static void at91_dt_rstc(void) | ||
177 | |||
178 | of_id = of_match_node(rstc_ids, np); | ||
179 | if (!of_id) | ||
180 | - panic("AT91: rtsc no restart function availlable\n"); | ||
181 | + panic("AT91: rtsc no restart function available\n"); | ||
182 | |||
183 | arm_pm_restart = of_id->data; | ||
184 | |||
185 | diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c | ||
186 | index 80392fc..4f67a5b 100644 | ||
187 | --- a/arch/arm/mach-omap2/cpuidle34xx.c | ||
188 | +++ b/arch/arm/mach-omap2/cpuidle34xx.c | ||
189 | @@ -274,8 +274,9 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, | ||
190 | static DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev); | ||
191 | |||
192 | static struct cpuidle_driver omap3_idle_driver = { | ||
193 | - .name = "omap3_idle", | ||
194 | - .owner = THIS_MODULE, | ||
195 | + .name = "omap3_idle", | ||
196 | + .owner = THIS_MODULE, | ||
197 | + .en_core_tk_irqen = 1, | ||
198 | .states = { | ||
199 | { | ||
200 | .enter = omap3_enter_idle_bm, | ||
201 | diff --git a/arch/arm/mach-u300/include/mach/u300-regs.h b/arch/arm/mach-u300/include/mach/u300-regs.h | ||
202 | index 1e49d90..0320495 100644 | ||
203 | --- a/arch/arm/mach-u300/include/mach/u300-regs.h | ||
204 | +++ b/arch/arm/mach-u300/include/mach/u300-regs.h | ||
205 | @@ -95,7 +95,7 @@ | ||
206 | #define U300_SPI_BASE (U300_FAST_PER_PHYS_BASE+0x6000) | ||
207 | |||
208 | /* Fast UART1 on U335 only */ | ||
209 | -#define U300_UART1_BASE (U300_SLOW_PER_PHYS_BASE+0x7000) | ||
210 | +#define U300_UART1_BASE (U300_FAST_PER_PHYS_BASE+0x7000) | ||
211 | |||
212 | /* | ||
213 | * SLOW peripherals | ||
214 | diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig | ||
215 | index 0421498..9791820 100644 | ||
216 | --- a/arch/avr32/configs/favr-32_defconfig | ||
217 | +++ b/arch/avr32/configs/favr-32_defconfig | ||
218 | @@ -122,7 +122,6 @@ CONFIG_USB_G_SERIAL=m | ||
219 | CONFIG_USB_CDC_COMPOSITE=m | ||
220 | CONFIG_MMC=y | ||
221 | CONFIG_MMC_ATMELMCI=y | ||
222 | -CONFIG_MMC_ATMELMCI_DMA=y | ||
223 | CONFIG_NEW_LEDS=y | ||
224 | CONFIG_LEDS_CLASS=y | ||
225 | CONFIG_LEDS_ATMEL_PWM=m | ||
226 | diff --git a/arch/avr32/configs/merisc_defconfig b/arch/avr32/configs/merisc_defconfig | ||
227 | index 3befab9..65de443 100644 | ||
228 | --- a/arch/avr32/configs/merisc_defconfig | ||
229 | +++ b/arch/avr32/configs/merisc_defconfig | ||
230 | @@ -102,7 +102,6 @@ CONFIG_FRAMEBUFFER_CONSOLE=y | ||
231 | CONFIG_LOGO=y | ||
232 | CONFIG_MMC=y | ||
233 | CONFIG_MMC_ATMELMCI=y | ||
234 | -CONFIG_MMC_ATMELMCI_DMA=y | ||
235 | CONFIG_NEW_LEDS=y | ||
236 | CONFIG_LEDS_CLASS=y | ||
237 | CONFIG_LEDS_ATMEL_PWM=y | ||
238 | diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h | ||
239 | index d2bf1fd..76acbcd 100644 | ||
240 | --- a/arch/ia64/include/asm/futex.h | ||
241 | +++ b/arch/ia64/include/asm/futex.h | ||
242 | @@ -106,16 +106,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
243 | return -EFAULT; | ||
244 | |||
245 | { | ||
246 | - register unsigned long r8 __asm ("r8"); | ||
247 | + register unsigned long r8 __asm ("r8") = 0; | ||
248 | unsigned long prev; | ||
249 | __asm__ __volatile__( | ||
250 | " mf;; \n" | ||
251 | - " mov %0=r0 \n" | ||
252 | " mov ar.ccv=%4;; \n" | ||
253 | "[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n" | ||
254 | " .xdata4 \"__ex_table\", 1b-., 2f-. \n" | ||
255 | "[2:]" | ||
256 | - : "=r" (r8), "=r" (prev) | ||
257 | + : "+r" (r8), "=&r" (prev) | ||
258 | : "r" (uaddr), "r" (newval), | ||
259 | "rO" ((long) (unsigned) oldval) | ||
260 | : "memory"); | ||
261 | diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h | ||
262 | index 43f96ab..8c70961 100644 | ||
263 | --- a/arch/ia64/include/asm/mca.h | ||
264 | +++ b/arch/ia64/include/asm/mca.h | ||
265 | @@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS]; | ||
266 | extern int cpe_vector; | ||
267 | extern int ia64_cpe_irq; | ||
268 | extern void ia64_mca_init(void); | ||
269 | +extern void ia64_mca_irq_init(void); | ||
270 | extern void ia64_mca_cpu_init(void *); | ||
271 | extern void ia64_os_mca_dispatch(void); | ||
272 | extern void ia64_os_mca_dispatch_end(void); | ||
273 | diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c | ||
274 | index ad69606..f2c41828 100644 | ||
275 | --- a/arch/ia64/kernel/irq.c | ||
276 | +++ b/arch/ia64/kernel/irq.c | ||
277 | @@ -23,6 +23,8 @@ | ||
278 | #include <linux/interrupt.h> | ||
279 | #include <linux/kernel_stat.h> | ||
280 | |||
281 | +#include <asm/mca.h> | ||
282 | + | ||
283 | /* | ||
284 | * 'what should we do if we get a hw irq event on an illegal vector'. | ||
285 | * each architecture has to answer this themselves. | ||
286 | @@ -83,6 +85,12 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask) | ||
287 | |||
288 | #endif /* CONFIG_SMP */ | ||
289 | |||
290 | +int __init arch_early_irq_init(void) | ||
291 | +{ | ||
292 | + ia64_mca_irq_init(); | ||
293 | + return 0; | ||
294 | +} | ||
295 | + | ||
296 | #ifdef CONFIG_HOTPLUG_CPU | ||
297 | unsigned int vectors_in_migration[NR_IRQS]; | ||
298 | |||
299 | diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c | ||
300 | index 65bf9cd..d7396db 100644 | ||
301 | --- a/arch/ia64/kernel/mca.c | ||
302 | +++ b/arch/ia64/kernel/mca.c | ||
303 | @@ -2074,22 +2074,16 @@ ia64_mca_init(void) | ||
304 | printk(KERN_INFO "MCA related initialization done\n"); | ||
305 | } | ||
306 | |||
307 | + | ||
308 | /* | ||
309 | - * ia64_mca_late_init | ||
310 | - * | ||
311 | - * Opportunity to setup things that require initialization later | ||
312 | - * than ia64_mca_init. Setup a timer to poll for CPEs if the | ||
313 | - * platform doesn't support an interrupt driven mechanism. | ||
314 | - * | ||
315 | - * Inputs : None | ||
316 | - * Outputs : Status | ||
317 | + * These pieces cannot be done in ia64_mca_init() because it is called before | ||
318 | + * early_irq_init() which would wipe out our percpu irq registrations. But we | ||
319 | + * cannot leave them until ia64_mca_late_init() because by then all the other | ||
320 | + * processors have been brought online and have set their own CMC vectors to | ||
321 | + * point at a non-existant action. Called from arch_early_irq_init(). | ||
322 | */ | ||
323 | -static int __init | ||
324 | -ia64_mca_late_init(void) | ||
325 | +void __init ia64_mca_irq_init(void) | ||
326 | { | ||
327 | - if (!mca_init) | ||
328 | - return 0; | ||
329 | - | ||
330 | /* | ||
331 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | ||
332 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). | ||
333 | @@ -2108,6 +2102,23 @@ ia64_mca_late_init(void) | ||
334 | /* Setup the CPEI/P handler */ | ||
335 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); | ||
336 | #endif | ||
337 | +} | ||
338 | + | ||
339 | +/* | ||
340 | + * ia64_mca_late_init | ||
341 | + * | ||
342 | + * Opportunity to setup things that require initialization later | ||
343 | + * than ia64_mca_init. Setup a timer to poll for CPEs if the | ||
344 | + * platform doesn't support an interrupt driven mechanism. | ||
345 | + * | ||
346 | + * Inputs : None | ||
347 | + * Outputs : Status | ||
348 | + */ | ||
349 | +static int __init | ||
350 | +ia64_mca_late_init(void) | ||
351 | +{ | ||
352 | + if (!mca_init) | ||
353 | + return 0; | ||
354 | |||
355 | register_hotcpu_notifier(&mca_cpu_notifier); | ||
356 | |||
357 | diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c | ||
358 | index 4332f7e..a7869f8 100644 | ||
359 | --- a/arch/ia64/kvm/vtlb.c | ||
360 | +++ b/arch/ia64/kvm/vtlb.c | ||
361 | @@ -256,7 +256,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte) | ||
362 | "srlz.d;;" | ||
363 | "ssm psr.i;;" | ||
364 | "srlz.d;;" | ||
365 | - : "=r"(ret) : "r"(iha), "r"(pte):"memory"); | ||
366 | + : "=&r"(ret) : "r"(iha), "r"(pte) : "memory"); | ||
367 | |||
368 | return ret; | ||
369 | } | ||
370 | diff --git a/arch/powerpc/kernel/cpu_setup_power.S b/arch/powerpc/kernel/cpu_setup_power.S | ||
371 | index ea847ab..1167008 100644 | ||
372 | --- a/arch/powerpc/kernel/cpu_setup_power.S | ||
373 | +++ b/arch/powerpc/kernel/cpu_setup_power.S | ||
374 | @@ -66,6 +66,7 @@ _GLOBAL(__restore_cpu_power8) | ||
375 | bl __init_FSCR | ||
376 | mfmsr r3 | ||
377 | rldicl. r0,r3,4,63 | ||
378 | + mtlr r11 | ||
379 | beqlr | ||
380 | li r0,0 | ||
381 | mtspr SPRN_LPID,r0 | ||
382 | diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S | ||
383 | index 56bd923..3bbe7ed 100644 | ||
384 | --- a/arch/powerpc/kernel/exceptions-64s.S | ||
385 | +++ b/arch/powerpc/kernel/exceptions-64s.S | ||
386 | @@ -797,7 +797,7 @@ hardware_interrupt_relon_hv: | ||
387 | _MASKABLE_RELON_EXCEPTION_PSERIES(0x502, hardware_interrupt, EXC_HV, SOFTEN_TEST_HV) | ||
388 | FTR_SECTION_ELSE | ||
389 | _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt, EXC_STD, SOFTEN_TEST_PR) | ||
390 | - ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_206) | ||
391 | + ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) | ||
392 | STD_RELON_EXCEPTION_PSERIES(0x4600, 0x600, alignment) | ||
393 | STD_RELON_EXCEPTION_PSERIES(0x4700, 0x700, program_check) | ||
394 | STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable) | ||
395 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S | ||
396 | index 0886ae6..b61363d 100644 | ||
397 | --- a/arch/powerpc/kernel/head_64.S | ||
398 | +++ b/arch/powerpc/kernel/head_64.S | ||
399 | @@ -509,6 +509,7 @@ _GLOBAL(copy_and_flush) | ||
400 | sync | ||
401 | addi r5,r5,8 | ||
402 | addi r6,r6,8 | ||
403 | + isync | ||
404 | blr | ||
405 | |||
406 | .align 8 | ||
407 | diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c | ||
408 | index 3f3bb4c..35f77a4 100644 | ||
409 | --- a/arch/powerpc/platforms/cell/spufs/inode.c | ||
410 | +++ b/arch/powerpc/platforms/cell/spufs/inode.c | ||
411 | @@ -99,6 +99,7 @@ spufs_new_inode(struct super_block *sb, umode_t mode) | ||
412 | if (!inode) | ||
413 | goto out; | ||
414 | |||
415 | + inode->i_ino = get_next_ino(); | ||
416 | inode->i_mode = mode; | ||
417 | inode->i_uid = current_fsuid(); | ||
418 | inode->i_gid = current_fsgid(); | ||
419 | diff --git a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S | ||
420 | index cf1a7ec..a59c643 100644 | ||
421 | --- a/arch/x86/crypto/crc32c-pcl-intel-asm_64.S | ||
422 | +++ b/arch/x86/crypto/crc32c-pcl-intel-asm_64.S | ||
423 | @@ -42,6 +42,7 @@ | ||
424 | * SOFTWARE. | ||
425 | */ | ||
426 | |||
427 | +#include <asm/inst.h> | ||
428 | #include <linux/linkage.h> | ||
429 | |||
430 | ## ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction | ||
431 | @@ -225,10 +226,10 @@ LABEL crc_ %i | ||
432 | movdqa (bufp), %xmm0 # 2 consts: K1:K2 | ||
433 | |||
434 | movq crc_init, %xmm1 # CRC for block 1 | ||
435 | - pclmulqdq $0x00,%xmm0,%xmm1 # Multiply by K2 | ||
436 | + PCLMULQDQ 0x00,%xmm0,%xmm1 # Multiply by K2 | ||
437 | |||
438 | movq crc1, %xmm2 # CRC for block 2 | ||
439 | - pclmulqdq $0x10, %xmm0, %xmm2 # Multiply by K1 | ||
440 | + PCLMULQDQ 0x10, %xmm0, %xmm2 # Multiply by K1 | ||
441 | |||
442 | pxor %xmm2,%xmm1 | ||
443 | movq %xmm1, %rax | ||
444 | diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c | ||
445 | index c5e403f..1c68ccb 100644 | ||
446 | --- a/arch/x86/kernel/head64.c | ||
447 | +++ b/arch/x86/kernel/head64.c | ||
448 | @@ -34,6 +34,7 @@ | ||
449 | extern pgd_t early_level4_pgt[PTRS_PER_PGD]; | ||
450 | extern pmd_t early_dynamic_pgts[EARLY_DYNAMIC_PAGE_TABLES][PTRS_PER_PMD]; | ||
451 | static unsigned int __initdata next_early_pgt = 2; | ||
452 | +pmdval_t __initdata early_pmd_flags = __PAGE_KERNEL_LARGE & ~(_PAGE_GLOBAL | _PAGE_NX); | ||
453 | |||
454 | /* Wipe all early page tables except for the kernel symbol map */ | ||
455 | static void __init reset_early_page_tables(void) | ||
456 | @@ -99,7 +100,7 @@ again: | ||
457 | pmd_p[i] = 0; | ||
458 | *pud_p = (pudval_t)pmd_p - __START_KERNEL_map + phys_base + _KERNPG_TABLE; | ||
459 | } | ||
460 | - pmd = (physaddr & PMD_MASK) + (__PAGE_KERNEL_LARGE & ~_PAGE_GLOBAL); | ||
461 | + pmd = (physaddr & PMD_MASK) + early_pmd_flags; | ||
462 | pmd_p[pmd_index(address)] = pmd; | ||
463 | |||
464 | return 0; | ||
465 | diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S | ||
466 | index 6859e96..08f7e80 100644 | ||
467 | --- a/arch/x86/kernel/head_64.S | ||
468 | +++ b/arch/x86/kernel/head_64.S | ||
469 | @@ -200,6 +200,7 @@ ENTRY(secondary_startup_64) | ||
470 | btl $20,%edi /* No Execute supported? */ | ||
471 | jnc 1f | ||
472 | btsl $_EFER_NX, %eax | ||
473 | + btsq $_PAGE_BIT_NX,early_pmd_flags(%rip) | ||
474 | 1: wrmsr /* Make changes effective */ | ||
475 | |||
476 | /* Setup cr0 */ | ||
477 | diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c | ||
478 | index e4595f1..84b7789 100644 | ||
479 | --- a/arch/x86/kernel/irq.c | ||
480 | +++ b/arch/x86/kernel/irq.c | ||
481 | @@ -165,10 +165,6 @@ u64 arch_irq_stat_cpu(unsigned int cpu) | ||
482 | u64 arch_irq_stat(void) | ||
483 | { | ||
484 | u64 sum = atomic_read(&irq_err_count); | ||
485 | - | ||
486 | -#ifdef CONFIG_X86_IO_APIC | ||
487 | - sum += atomic_read(&irq_mis_count); | ||
488 | -#endif | ||
489 | return sum; | ||
490 | } | ||
491 | |||
492 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
493 | index a335cc6..a9c9d3e 100644 | ||
494 | --- a/arch/x86/kvm/emulate.c | ||
495 | +++ b/arch/x86/kvm/emulate.c | ||
496 | @@ -4162,6 +4162,10 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op, | ||
497 | break; | ||
498 | case OpMem8: | ||
499 | ctxt->memop.bytes = 1; | ||
500 | + if (ctxt->memop.type == OP_REG) { | ||
501 | + ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, 1); | ||
502 | + fetch_register_operand(&ctxt->memop); | ||
503 | + } | ||
504 | goto mem_common; | ||
505 | case OpMem16: | ||
506 | ctxt->memop.bytes = 2; | ||
507 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c | ||
508 | index c8e1c7b..2363127 100644 | ||
509 | --- a/arch/x86/xen/enlighten.c | ||
510 | +++ b/arch/x86/xen/enlighten.c | ||
511 | @@ -1589,8 +1589,11 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self, | ||
512 | switch (action) { | ||
513 | case CPU_UP_PREPARE: | ||
514 | xen_vcpu_setup(cpu); | ||
515 | - if (xen_have_vector_callback) | ||
516 | + if (xen_have_vector_callback) { | ||
517 | xen_init_lock_cpu(cpu); | ||
518 | + if (xen_feature(XENFEAT_hvm_safe_pvclock)) | ||
519 | + xen_setup_timer(cpu); | ||
520 | + } | ||
521 | break; | ||
522 | default: | ||
523 | break; | ||
524 | diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c | ||
525 | index 09ea61d..22c800a 100644 | ||
526 | --- a/arch/x86/xen/smp.c | ||
527 | +++ b/arch/x86/xen/smp.c | ||
528 | @@ -662,6 +662,8 @@ static void xen_hvm_cpu_die(unsigned int cpu) | ||
529 | unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu), NULL); | ||
530 | unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu), NULL); | ||
531 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu), NULL); | ||
532 | + xen_uninit_lock_cpu(cpu); | ||
533 | + xen_teardown_timer(cpu); | ||
534 | native_cpu_die(cpu); | ||
535 | } | ||
536 | |||
537 | diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c | ||
538 | index 0296a95..054cc01 100644 | ||
539 | --- a/arch/x86/xen/time.c | ||
540 | +++ b/arch/x86/xen/time.c | ||
541 | @@ -497,7 +497,11 @@ static void xen_hvm_setup_cpu_clockevents(void) | ||
542 | { | ||
543 | int cpu = smp_processor_id(); | ||
544 | xen_setup_runstate_info(cpu); | ||
545 | - xen_setup_timer(cpu); | ||
546 | + /* | ||
547 | + * xen_setup_timer(cpu) - snprintf is bad in atomic context. Hence | ||
548 | + * doing it xen_hvm_cpu_notify (which gets called by smp_init during | ||
549 | + * early bootup and also during CPU hotplug events). | ||
550 | + */ | ||
551 | xen_setup_cpu_clockevents(); | ||
552 | } | ||
553 | |||
554 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c | ||
555 | index 586e7e9..bcb7a3b 100644 | ||
556 | --- a/drivers/acpi/osl.c | ||
557 | +++ b/drivers/acpi/osl.c | ||
558 | @@ -641,7 +641,7 @@ void __init acpi_initrd_override(void *data, size_t size) | ||
559 | * Both memblock_reserve and e820_add_region (via arch_reserve_mem_area) | ||
560 | * works fine. | ||
561 | */ | ||
562 | - memblock_reserve(acpi_tables_addr, acpi_tables_addr + all_tables_size); | ||
563 | + memblock_reserve(acpi_tables_addr, all_tables_size); | ||
564 | arch_reserve_mem_area(acpi_tables_addr, all_tables_size); | ||
565 | |||
566 | p = early_ioremap(acpi_tables_addr, all_tables_size); | ||
567 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c | ||
568 | index 6ae5e44..4241b8d 100644 | ||
569 | --- a/drivers/acpi/pci_root.c | ||
570 | +++ b/drivers/acpi/pci_root.c | ||
571 | @@ -201,8 +201,8 @@ static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, | ||
572 | *control &= OSC_PCI_CONTROL_MASKS; | ||
573 | capbuf[OSC_CONTROL_TYPE] = *control | root->osc_control_set; | ||
574 | } else { | ||
575 | - /* Run _OSC query for all possible controls. */ | ||
576 | - capbuf[OSC_CONTROL_TYPE] = OSC_PCI_CONTROL_MASKS; | ||
577 | + /* Run _OSC query only with existing controls. */ | ||
578 | + capbuf[OSC_CONTROL_TYPE] = root->osc_control_set; | ||
579 | } | ||
580 | |||
581 | status = acpi_pci_run_osc(root->device->handle, capbuf, &result); | ||
582 | diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c | ||
583 | index 8470771..a33821c 100644 | ||
584 | --- a/drivers/acpi/thermal.c | ||
585 | +++ b/drivers/acpi/thermal.c | ||
586 | @@ -723,9 +723,19 @@ static int thermal_get_trend(struct thermal_zone_device *thermal, | ||
587 | return -EINVAL; | ||
588 | |||
589 | if (type == THERMAL_TRIP_ACTIVE) { | ||
590 | - /* aggressive active cooling */ | ||
591 | - *trend = THERMAL_TREND_RAISING; | ||
592 | - return 0; | ||
593 | + unsigned long trip_temp; | ||
594 | + unsigned long temp = KELVIN_TO_MILLICELSIUS(tz->temperature, | ||
595 | + tz->kelvin_offset); | ||
596 | + if (thermal_get_trip_temp(thermal, trip, &trip_temp)) | ||
597 | + return -EINVAL; | ||
598 | + | ||
599 | + if (temp > trip_temp) { | ||
600 | + *trend = THERMAL_TREND_RAISING; | ||
601 | + return 0; | ||
602 | + } else { | ||
603 | + /* Fall back on default trend */ | ||
604 | + return -EINVAL; | ||
605 | + } | ||
606 | } | ||
607 | |||
608 | /* | ||
609 | diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c | ||
610 | index 8a52dab..3badf18 100644 | ||
611 | --- a/drivers/ata/libata-acpi.c | ||
612 | +++ b/drivers/ata/libata-acpi.c | ||
613 | @@ -61,7 +61,8 @@ acpi_handle ata_ap_acpi_handle(struct ata_port *ap) | ||
614 | if (ap->flags & ATA_FLAG_ACPI_SATA) | ||
615 | return NULL; | ||
616 | |||
617 | - return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), ap->port_no); | ||
618 | + return ap->scsi_host ? | ||
619 | + DEVICE_ACPI_HANDLE(&ap->scsi_host->shost_gendev) : NULL; | ||
620 | } | ||
621 | EXPORT_SYMBOL(ata_ap_acpi_handle); | ||
622 | |||
623 | @@ -240,28 +241,15 @@ void ata_acpi_dissociate(struct ata_host *host) | ||
624 | } | ||
625 | } | ||
626 | |||
627 | -/** | ||
628 | - * ata_acpi_gtm - execute _GTM | ||
629 | - * @ap: target ATA port | ||
630 | - * @gtm: out parameter for _GTM result | ||
631 | - * | ||
632 | - * Evaluate _GTM and store the result in @gtm. | ||
633 | - * | ||
634 | - * LOCKING: | ||
635 | - * EH context. | ||
636 | - * | ||
637 | - * RETURNS: | ||
638 | - * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure. | ||
639 | - */ | ||
640 | -int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) | ||
641 | +static int __ata_acpi_gtm(struct ata_port *ap, acpi_handle handle, | ||
642 | + struct ata_acpi_gtm *gtm) | ||
643 | { | ||
644 | struct acpi_buffer output = { .length = ACPI_ALLOCATE_BUFFER }; | ||
645 | union acpi_object *out_obj; | ||
646 | acpi_status status; | ||
647 | int rc = 0; | ||
648 | |||
649 | - status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_GTM", NULL, | ||
650 | - &output); | ||
651 | + status = acpi_evaluate_object(handle, "_GTM", NULL, &output); | ||
652 | |||
653 | rc = -ENOENT; | ||
654 | if (status == AE_NOT_FOUND) | ||
655 | @@ -295,6 +283,27 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) | ||
656 | return rc; | ||
657 | } | ||
658 | |||
659 | +/** | ||
660 | + * ata_acpi_gtm - execute _GTM | ||
661 | + * @ap: target ATA port | ||
662 | + * @gtm: out parameter for _GTM result | ||
663 | + * | ||
664 | + * Evaluate _GTM and store the result in @gtm. | ||
665 | + * | ||
666 | + * LOCKING: | ||
667 | + * EH context. | ||
668 | + * | ||
669 | + * RETURNS: | ||
670 | + * 0 on success, -ENOENT if _GTM doesn't exist, -errno on failure. | ||
671 | + */ | ||
672 | +int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm) | ||
673 | +{ | ||
674 | + if (ata_ap_acpi_handle(ap)) | ||
675 | + return __ata_acpi_gtm(ap, ata_ap_acpi_handle(ap), gtm); | ||
676 | + else | ||
677 | + return -EINVAL; | ||
678 | +} | ||
679 | + | ||
680 | EXPORT_SYMBOL_GPL(ata_acpi_gtm); | ||
681 | |||
682 | /** | ||
683 | @@ -1080,7 +1089,7 @@ static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle) | ||
684 | if (!*handle) | ||
685 | return -ENODEV; | ||
686 | |||
687 | - if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0) | ||
688 | + if (__ata_acpi_gtm(ap, *handle, &ap->__acpi_init_gtm) == 0) | ||
689 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; | ||
690 | |||
691 | return 0; | ||
692 | diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c | ||
693 | index 5dba77c..b1a664a 100644 | ||
694 | --- a/drivers/ata/sata_highbank.c | ||
695 | +++ b/drivers/ata/sata_highbank.c | ||
696 | @@ -251,7 +251,7 @@ static const struct ata_port_info ahci_highbank_port_info = { | ||
697 | }; | ||
698 | |||
699 | static struct scsi_host_template ahci_highbank_platform_sht = { | ||
700 | - AHCI_SHT("highbank-ahci"), | ||
701 | + AHCI_SHT("sata_highbank"), | ||
702 | }; | ||
703 | |||
704 | static const struct of_device_id ahci_of_match[] = { | ||
705 | diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c | ||
706 | index 0d2e82f..7c3b3dc 100644 | ||
707 | --- a/drivers/char/tpm/tpm.c | ||
708 | +++ b/drivers/char/tpm/tpm.c | ||
709 | @@ -1337,7 +1337,7 @@ int tpm_pm_suspend(struct device *dev) | ||
710 | { | ||
711 | struct tpm_chip *chip = dev_get_drvdata(dev); | ||
712 | struct tpm_cmd_t cmd; | ||
713 | - int rc; | ||
714 | + int rc, try; | ||
715 | |||
716 | u8 dummy_hash[TPM_DIGEST_SIZE] = { 0 }; | ||
717 | |||
718 | @@ -1355,9 +1355,32 @@ int tpm_pm_suspend(struct device *dev) | ||
719 | } | ||
720 | |||
721 | /* now do the actual savestate */ | ||
722 | - cmd.header.in = savestate_header; | ||
723 | - rc = transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, | ||
724 | - "sending savestate before suspend"); | ||
725 | + for (try = 0; try < TPM_RETRY; try++) { | ||
726 | + cmd.header.in = savestate_header; | ||
727 | + rc = transmit_cmd(chip, &cmd, SAVESTATE_RESULT_SIZE, NULL); | ||
728 | + | ||
729 | + /* | ||
730 | + * If the TPM indicates that it is too busy to respond to | ||
731 | + * this command then retry before giving up. It can take | ||
732 | + * several seconds for this TPM to be ready. | ||
733 | + * | ||
734 | + * This can happen if the TPM has already been sent the | ||
735 | + * SaveState command before the driver has loaded. TCG 1.2 | ||
736 | + * specification states that any communication after SaveState | ||
737 | + * may cause the TPM to invalidate previously saved state. | ||
738 | + */ | ||
739 | + if (rc != TPM_WARN_RETRY) | ||
740 | + break; | ||
741 | + msleep(TPM_TIMEOUT_RETRY); | ||
742 | + } | ||
743 | + | ||
744 | + if (rc) | ||
745 | + dev_err(chip->dev, | ||
746 | + "Error (%d) sending savestate before suspend\n", rc); | ||
747 | + else if (try > 0) | ||
748 | + dev_warn(chip->dev, "TPM savestate took %dms\n", | ||
749 | + try * TPM_TIMEOUT_RETRY); | ||
750 | + | ||
751 | return rc; | ||
752 | } | ||
753 | EXPORT_SYMBOL_GPL(tpm_pm_suspend); | ||
754 | diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h | ||
755 | index 81b5201..0770d1d 100644 | ||
756 | --- a/drivers/char/tpm/tpm.h | ||
757 | +++ b/drivers/char/tpm/tpm.h | ||
758 | @@ -32,10 +32,12 @@ enum tpm_const { | ||
759 | TPM_MINOR = 224, /* officially assigned */ | ||
760 | TPM_BUFSIZE = 4096, | ||
761 | TPM_NUM_DEVICES = 256, | ||
762 | + TPM_RETRY = 50, /* 5 seconds */ | ||
763 | }; | ||
764 | |||
765 | enum tpm_timeout { | ||
766 | TPM_TIMEOUT = 5, /* msecs */ | ||
767 | + TPM_TIMEOUT_RETRY = 100 /* msecs */ | ||
768 | }; | ||
769 | |||
770 | /* TPM addresses */ | ||
771 | @@ -44,6 +46,7 @@ enum tpm_addr { | ||
772 | TPM_ADDR = 0x4E, | ||
773 | }; | ||
774 | |||
775 | +#define TPM_WARN_RETRY 0x800 | ||
776 | #define TPM_WARN_DOING_SELFTEST 0x802 | ||
777 | #define TPM_ERR_DEACTIVATED 0x6 | ||
778 | #define TPM_ERR_DISABLED 0x7 | ||
779 | diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c | ||
780 | index cafa72f..d6fbb577 100644 | ||
781 | --- a/drivers/hv/ring_buffer.c | ||
782 | +++ b/drivers/hv/ring_buffer.c | ||
783 | @@ -71,6 +71,7 @@ u32 hv_end_read(struct hv_ring_buffer_info *rbi) | ||
784 | |||
785 | static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi) | ||
786 | { | ||
787 | + smp_mb(); | ||
788 | if (rbi->ring_buffer->interrupt_mask) | ||
789 | return false; | ||
790 | |||
791 | diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c | ||
792 | index 332c720..3d0f052 100644 | ||
793 | --- a/drivers/i2c/busses/i2c-xiic.c | ||
794 | +++ b/drivers/i2c/busses/i2c-xiic.c | ||
795 | @@ -312,10 +312,8 @@ static void xiic_fill_tx_fifo(struct xiic_i2c *i2c) | ||
796 | /* last message in transfer -> STOP */ | ||
797 | data |= XIIC_TX_DYN_STOP_MASK; | ||
798 | dev_dbg(i2c->adap.dev.parent, "%s TX STOP\n", __func__); | ||
799 | - | ||
800 | - xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data); | ||
801 | - } else | ||
802 | - xiic_setreg8(i2c, XIIC_DTR_REG_OFFSET, data); | ||
803 | + } | ||
804 | + xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data); | ||
805 | } | ||
806 | } | ||
807 | |||
808 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
809 | index aeceedf..a4a93b9 100644 | ||
810 | --- a/drivers/md/md.c | ||
811 | +++ b/drivers/md/md.c | ||
812 | @@ -1564,8 +1564,8 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ | ||
813 | sector, count, 1) == 0) | ||
814 | return -EINVAL; | ||
815 | } | ||
816 | - } else if (sb->bblog_offset == 0) | ||
817 | - rdev->badblocks.shift = -1; | ||
818 | + } else if (sb->bblog_offset != 0) | ||
819 | + rdev->badblocks.shift = 0; | ||
820 | |||
821 | if (!refdev) { | ||
822 | ret = 1; | ||
823 | @@ -3221,7 +3221,7 @@ int md_rdev_init(struct md_rdev *rdev) | ||
824 | * be used - I wonder if that matters | ||
825 | */ | ||
826 | rdev->badblocks.count = 0; | ||
827 | - rdev->badblocks.shift = 0; | ||
828 | + rdev->badblocks.shift = -1; /* disabled until explicitly enabled */ | ||
829 | rdev->badblocks.page = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
830 | seqlock_init(&rdev->badblocks.lock); | ||
831 | if (rdev->badblocks.page == NULL) | ||
832 | @@ -3293,9 +3293,6 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe | ||
833 | goto abort_free; | ||
834 | } | ||
835 | } | ||
836 | - if (super_format == -1) | ||
837 | - /* hot-add for 0.90, or non-persistent: so no badblocks */ | ||
838 | - rdev->badblocks.shift = -1; | ||
839 | |||
840 | return rdev; | ||
841 | |||
842 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
843 | index fd86b37..6af167f 100644 | ||
844 | --- a/drivers/md/raid1.c | ||
845 | +++ b/drivers/md/raid1.c | ||
846 | @@ -981,7 +981,12 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule) | ||
847 | while (bio) { /* submit pending writes */ | ||
848 | struct bio *next = bio->bi_next; | ||
849 | bio->bi_next = NULL; | ||
850 | - generic_make_request(bio); | ||
851 | + if (unlikely((bio->bi_rw & REQ_DISCARD) && | ||
852 | + !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) | ||
853 | + /* Just ignore it */ | ||
854 | + bio_endio(bio, 0); | ||
855 | + else | ||
856 | + generic_make_request(bio); | ||
857 | bio = next; | ||
858 | } | ||
859 | kfree(plug); | ||
860 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
861 | index 77b562d..46c14e5 100644 | ||
862 | --- a/drivers/md/raid10.c | ||
863 | +++ b/drivers/md/raid10.c | ||
864 | @@ -1133,7 +1133,12 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) | ||
865 | while (bio) { /* submit pending writes */ | ||
866 | struct bio *next = bio->bi_next; | ||
867 | bio->bi_next = NULL; | ||
868 | - generic_make_request(bio); | ||
869 | + if (unlikely((bio->bi_rw & REQ_DISCARD) && | ||
870 | + !blk_queue_discard(bdev_get_queue(bio->bi_bdev)))) | ||
871 | + /* Just ignore it */ | ||
872 | + bio_endio(bio, 0); | ||
873 | + else | ||
874 | + generic_make_request(bio); | ||
875 | bio = next; | ||
876 | } | ||
877 | kfree(plug); | ||
878 | diff --git a/drivers/mfd/adp5520.c b/drivers/mfd/adp5520.c | ||
879 | index 210dd03..6b40e0c 100644 | ||
880 | --- a/drivers/mfd/adp5520.c | ||
881 | +++ b/drivers/mfd/adp5520.c | ||
882 | @@ -36,6 +36,7 @@ struct adp5520_chip { | ||
883 | struct blocking_notifier_head notifier_list; | ||
884 | int irq; | ||
885 | unsigned long id; | ||
886 | + uint8_t mode; | ||
887 | }; | ||
888 | |||
889 | static int __adp5520_read(struct i2c_client *client, | ||
890 | @@ -326,7 +327,10 @@ static int adp5520_suspend(struct device *dev) | ||
891 | struct i2c_client *client = to_i2c_client(dev); | ||
892 | struct adp5520_chip *chip = dev_get_drvdata(&client->dev); | ||
893 | |||
894 | - adp5520_clr_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); | ||
895 | + adp5520_read(chip->dev, ADP5520_MODE_STATUS, &chip->mode); | ||
896 | + /* All other bits are W1C */ | ||
897 | + chip->mode &= ADP5520_BL_EN | ADP5520_DIM_EN | ADP5520_nSTNBY; | ||
898 | + adp5520_write(chip->dev, ADP5520_MODE_STATUS, 0); | ||
899 | return 0; | ||
900 | } | ||
901 | |||
902 | @@ -335,7 +339,7 @@ static int adp5520_resume(struct device *dev) | ||
903 | struct i2c_client *client = to_i2c_client(dev); | ||
904 | struct adp5520_chip *chip = dev_get_drvdata(&client->dev); | ||
905 | |||
906 | - adp5520_set_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); | ||
907 | + adp5520_write(chip->dev, ADP5520_MODE_STATUS, chip->mode); | ||
908 | return 0; | ||
909 | } | ||
910 | #endif | ||
911 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c | ||
912 | index c8f3d6e..8ac5101 100644 | ||
913 | --- a/drivers/mmc/core/mmc.c | ||
914 | +++ b/drivers/mmc/core/mmc.c | ||
915 | @@ -368,13 +368,13 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | ||
916 | ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; | ||
917 | card->ext_csd.raw_trim_mult = | ||
918 | ext_csd[EXT_CSD_TRIM_MULT]; | ||
919 | + card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; | ||
920 | if (card->ext_csd.rev >= 4) { | ||
921 | /* | ||
922 | * Enhanced area feature support -- check whether the eMMC | ||
923 | * card has the Enhanced area enabled. If so, export enhanced | ||
924 | * area offset and size to user by adding sysfs interface. | ||
925 | */ | ||
926 | - card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; | ||
927 | if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && | ||
928 | (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { | ||
929 | hc_erase_grp_sz = | ||
930 | diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig | ||
931 | index d88219e..9c581c2 100644 | ||
932 | --- a/drivers/mmc/host/Kconfig | ||
933 | +++ b/drivers/mmc/host/Kconfig | ||
934 | @@ -300,16 +300,6 @@ config MMC_ATMELMCI | ||
935 | |||
936 | If unsure, say N. | ||
937 | |||
938 | -config MMC_ATMELMCI_DMA | ||
939 | - bool "Atmel MCI DMA support" | ||
940 | - depends on MMC_ATMELMCI && (AVR32 || ARCH_AT91SAM9G45) && DMA_ENGINE | ||
941 | - help | ||
942 | - Say Y here to have the Atmel MCI driver use a DMA engine to | ||
943 | - do data transfers and thus increase the throughput and | ||
944 | - reduce the CPU utilization. | ||
945 | - | ||
946 | - If unsure, say N. | ||
947 | - | ||
948 | config MMC_MSM | ||
949 | tristate "Qualcomm SDCC Controller Support" | ||
950 | depends on MMC && ARCH_MSM | ||
951 | diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c | ||
952 | index 722af1d..e75774f 100644 | ||
953 | --- a/drivers/mmc/host/atmel-mci.c | ||
954 | +++ b/drivers/mmc/host/atmel-mci.c | ||
955 | @@ -178,6 +178,7 @@ struct atmel_mci { | ||
956 | void __iomem *regs; | ||
957 | |||
958 | struct scatterlist *sg; | ||
959 | + unsigned int sg_len; | ||
960 | unsigned int pio_offset; | ||
961 | unsigned int *buffer; | ||
962 | unsigned int buf_size; | ||
963 | @@ -892,6 +893,7 @@ static u32 atmci_prepare_data(struct atmel_mci *host, struct mmc_data *data) | ||
964 | data->error = -EINPROGRESS; | ||
965 | |||
966 | host->sg = data->sg; | ||
967 | + host->sg_len = data->sg_len; | ||
968 | host->data = data; | ||
969 | host->data_chan = NULL; | ||
970 | |||
971 | @@ -1826,7 +1828,8 @@ static void atmci_read_data_pio(struct atmel_mci *host) | ||
972 | if (offset == sg->length) { | ||
973 | flush_dcache_page(sg_page(sg)); | ||
974 | host->sg = sg = sg_next(sg); | ||
975 | - if (!sg) | ||
976 | + host->sg_len--; | ||
977 | + if (!sg || !host->sg_len) | ||
978 | goto done; | ||
979 | |||
980 | offset = 0; | ||
981 | @@ -1839,7 +1842,8 @@ static void atmci_read_data_pio(struct atmel_mci *host) | ||
982 | |||
983 | flush_dcache_page(sg_page(sg)); | ||
984 | host->sg = sg = sg_next(sg); | ||
985 | - if (!sg) | ||
986 | + host->sg_len--; | ||
987 | + if (!sg || !host->sg_len) | ||
988 | goto done; | ||
989 | |||
990 | offset = 4 - remaining; | ||
991 | @@ -1890,7 +1894,8 @@ static void atmci_write_data_pio(struct atmel_mci *host) | ||
992 | nbytes += 4; | ||
993 | if (offset == sg->length) { | ||
994 | host->sg = sg = sg_next(sg); | ||
995 | - if (!sg) | ||
996 | + host->sg_len--; | ||
997 | + if (!sg || !host->sg_len) | ||
998 | goto done; | ||
999 | |||
1000 | offset = 0; | ||
1001 | @@ -1904,7 +1909,8 @@ static void atmci_write_data_pio(struct atmel_mci *host) | ||
1002 | nbytes += remaining; | ||
1003 | |||
1004 | host->sg = sg = sg_next(sg); | ||
1005 | - if (!sg) { | ||
1006 | + host->sg_len--; | ||
1007 | + if (!sg || !host->sg_len) { | ||
1008 | atmci_writel(host, ATMCI_TDR, value); | ||
1009 | goto done; | ||
1010 | } | ||
1011 | @@ -2487,10 +2493,8 @@ static int __exit atmci_remove(struct platform_device *pdev) | ||
1012 | atmci_readl(host, ATMCI_SR); | ||
1013 | clk_disable(host->mck); | ||
1014 | |||
1015 | -#ifdef CONFIG_MMC_ATMELMCI_DMA | ||
1016 | if (host->dma.chan) | ||
1017 | dma_release_channel(host->dma.chan); | ||
1018 | -#endif | ||
1019 | |||
1020 | free_irq(platform_get_irq(pdev, 0), host); | ||
1021 | iounmap(host->regs); | ||
1022 | diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c | ||
1023 | index 2e5daee..a3f8a25 100644 | ||
1024 | --- a/drivers/net/ethernet/freescale/gianfar_ptp.c | ||
1025 | +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c | ||
1026 | @@ -127,7 +127,6 @@ struct gianfar_ptp_registers { | ||
1027 | |||
1028 | #define DRIVER "gianfar_ptp" | ||
1029 | #define DEFAULT_CKSEL 1 | ||
1030 | -#define N_ALARM 1 /* first alarm is used internally to reset fipers */ | ||
1031 | #define N_EXT_TS 2 | ||
1032 | #define REG_SIZE sizeof(struct gianfar_ptp_registers) | ||
1033 | |||
1034 | @@ -410,7 +409,7 @@ static struct ptp_clock_info ptp_gianfar_caps = { | ||
1035 | .owner = THIS_MODULE, | ||
1036 | .name = "gianfar clock", | ||
1037 | .max_adj = 512000, | ||
1038 | - .n_alarm = N_ALARM, | ||
1039 | + .n_alarm = 0, | ||
1040 | .n_ext_ts = N_EXT_TS, | ||
1041 | .n_per_out = 0, | ||
1042 | .pps = 1, | ||
1043 | diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c | ||
1044 | index b477fa5..065f8c8 100644 | ||
1045 | --- a/drivers/net/ethernet/intel/e1000e/ptp.c | ||
1046 | +++ b/drivers/net/ethernet/intel/e1000e/ptp.c | ||
1047 | @@ -145,8 +145,7 @@ static int e1000e_phc_settime(struct ptp_clock_info *ptp, | ||
1048 | unsigned long flags; | ||
1049 | u64 ns; | ||
1050 | |||
1051 | - ns = ts->tv_sec * NSEC_PER_SEC; | ||
1052 | - ns += ts->tv_nsec; | ||
1053 | + ns = timespec_to_ns(ts); | ||
1054 | |||
1055 | /* reset the timecounter */ | ||
1056 | spin_lock_irqsave(&adapter->systim_lock, flags); | ||
1057 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
1058 | index 79f4a26..a892efd 100644 | ||
1059 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
1060 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
1061 | @@ -2405,6 +2405,16 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data) | ||
1062 | * with the write to EICR. | ||
1063 | */ | ||
1064 | eicr = IXGBE_READ_REG(hw, IXGBE_EICS); | ||
1065 | + | ||
1066 | + /* The lower 16bits of the EICR register are for the queue interrupts | ||
1067 | + * which should be masked here in order to not accidently clear them if | ||
1068 | + * the bits are high when ixgbe_msix_other is called. There is a race | ||
1069 | + * condition otherwise which results in possible performance loss | ||
1070 | + * especially if the ixgbe_msix_other interrupt is triggering | ||
1071 | + * consistently (as it would when PPS is turned on for the X540 device) | ||
1072 | + */ | ||
1073 | + eicr &= 0xFFFF0000; | ||
1074 | + | ||
1075 | IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); | ||
1076 | |||
1077 | if (eicr & IXGBE_EICR_LSC) | ||
1078 | diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c | ||
1079 | index 20806ca..81d4071 100644 | ||
1080 | --- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c | ||
1081 | +++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c | ||
1082 | @@ -2237,15 +2237,15 @@ static ssize_t iwl_dbgfs_log_event_read(struct file *file, | ||
1083 | size_t count, loff_t *ppos) | ||
1084 | { | ||
1085 | struct iwl_priv *priv = file->private_data; | ||
1086 | - char *buf; | ||
1087 | - int pos = 0; | ||
1088 | - ssize_t ret = -ENOMEM; | ||
1089 | + char *buf = NULL; | ||
1090 | + ssize_t ret; | ||
1091 | |||
1092 | - ret = pos = iwl_dump_nic_event_log(priv, true, &buf, true); | ||
1093 | - if (buf) { | ||
1094 | - ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
1095 | - kfree(buf); | ||
1096 | - } | ||
1097 | + ret = iwl_dump_nic_event_log(priv, true, &buf, true); | ||
1098 | + if (ret < 0) | ||
1099 | + goto err; | ||
1100 | + ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); | ||
1101 | +err: | ||
1102 | + kfree(buf); | ||
1103 | return ret; | ||
1104 | } | ||
1105 | |||
1106 | diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c | ||
1107 | index b775769..db183b4 100644 | ||
1108 | --- a/drivers/net/wireless/iwlwifi/dvm/sta.c | ||
1109 | +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c | ||
1110 | @@ -695,6 +695,7 @@ void iwl_clear_ucode_stations(struct iwl_priv *priv, | ||
1111 | void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | ||
1112 | { | ||
1113 | struct iwl_addsta_cmd sta_cmd; | ||
1114 | + static const struct iwl_link_quality_cmd zero_lq = {}; | ||
1115 | struct iwl_link_quality_cmd lq; | ||
1116 | int i; | ||
1117 | bool found = false; | ||
1118 | @@ -733,7 +734,9 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | ||
1119 | else | ||
1120 | memcpy(&lq, priv->stations[i].lq, | ||
1121 | sizeof(struct iwl_link_quality_cmd)); | ||
1122 | - send_lq = true; | ||
1123 | + | ||
1124 | + if (!memcmp(&lq, &zero_lq, sizeof(lq))) | ||
1125 | + send_lq = true; | ||
1126 | } | ||
1127 | spin_unlock_bh(&priv->sta_lock); | ||
1128 | ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC); | ||
1129 | diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c | ||
1130 | index feb2046..f024fb0 100644 | ||
1131 | --- a/drivers/net/wireless/mwifiex/pcie.c | ||
1132 | +++ b/drivers/net/wireless/mwifiex/pcie.c | ||
1133 | @@ -2281,9 +2281,9 @@ static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter) | ||
1134 | if (pdev) { | ||
1135 | pci_iounmap(pdev, card->pci_mmap); | ||
1136 | pci_iounmap(pdev, card->pci_mmap1); | ||
1137 | - | ||
1138 | - pci_release_regions(pdev); | ||
1139 | pci_disable_device(pdev); | ||
1140 | + pci_release_region(pdev, 2); | ||
1141 | + pci_release_region(pdev, 0); | ||
1142 | pci_set_drvdata(pdev, NULL); | ||
1143 | } | ||
1144 | } | ||
1145 | diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c | ||
1146 | index a658b4b..92849e5 100644 | ||
1147 | --- a/drivers/net/wireless/rt2x00/rt2800lib.c | ||
1148 | +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | ||
1149 | @@ -4436,6 +4436,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) | ||
1150 | |||
1151 | if (!rt2x00_rt(rt2x00dev, RT5390) && | ||
1152 | !rt2x00_rt(rt2x00dev, RT5392)) { | ||
1153 | + u8 min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2; | ||
1154 | + | ||
1155 | rt2800_rfcsr_read(rt2x00dev, 17, &rfcsr); | ||
1156 | rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0); | ||
1157 | if (rt2x00_rt(rt2x00dev, RT3070) || | ||
1158 | @@ -4446,8 +4448,10 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) | ||
1159 | &rt2x00dev->cap_flags)) | ||
1160 | rt2x00_set_field8(&rfcsr, RFCSR17_R, 1); | ||
1161 | } | ||
1162 | - rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN, | ||
1163 | - drv_data->txmixer_gain_24g); | ||
1164 | + if (drv_data->txmixer_gain_24g >= min_gain) { | ||
1165 | + rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN, | ||
1166 | + drv_data->txmixer_gain_24g); | ||
1167 | + } | ||
1168 | rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); | ||
1169 | } | ||
1170 | |||
1171 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c | ||
1172 | index b099e00..fc9bd81 100644 | ||
1173 | --- a/drivers/pci/pci.c | ||
1174 | +++ b/drivers/pci/pci.c | ||
1175 | @@ -646,15 +646,11 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) | ||
1176 | error = platform_pci_set_power_state(dev, state); | ||
1177 | if (!error) | ||
1178 | pci_update_current_state(dev, state); | ||
1179 | - /* Fall back to PCI_D0 if native PM is not supported */ | ||
1180 | - if (!dev->pm_cap) | ||
1181 | - dev->current_state = PCI_D0; | ||
1182 | - } else { | ||
1183 | + } else | ||
1184 | error = -ENODEV; | ||
1185 | - /* Fall back to PCI_D0 if native PM is not supported */ | ||
1186 | - if (!dev->pm_cap) | ||
1187 | - dev->current_state = PCI_D0; | ||
1188 | - } | ||
1189 | + | ||
1190 | + if (error && !dev->pm_cap) /* Fall back to PCI_D0 */ | ||
1191 | + dev->current_state = PCI_D0; | ||
1192 | |||
1193 | return error; | ||
1194 | } | ||
1195 | diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c | ||
1196 | index 434ebc3..eebd8ac 100644 | ||
1197 | --- a/drivers/rtc/rtc-at91rm9200.c | ||
1198 | +++ b/drivers/rtc/rtc-at91rm9200.c | ||
1199 | @@ -297,7 +297,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | ||
1200 | "at91_rtc", pdev); | ||
1201 | if (ret) { | ||
1202 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); | ||
1203 | - return ret; | ||
1204 | + goto err_unmap; | ||
1205 | } | ||
1206 | |||
1207 | /* cpu init code should really have flagged this device as | ||
1208 | @@ -309,13 +309,20 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | ||
1209 | rtc = rtc_device_register(pdev->name, &pdev->dev, | ||
1210 | &at91_rtc_ops, THIS_MODULE); | ||
1211 | if (IS_ERR(rtc)) { | ||
1212 | - free_irq(irq, pdev); | ||
1213 | - return PTR_ERR(rtc); | ||
1214 | + ret = PTR_ERR(rtc); | ||
1215 | + goto err_free_irq; | ||
1216 | } | ||
1217 | platform_set_drvdata(pdev, rtc); | ||
1218 | |||
1219 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); | ||
1220 | return 0; | ||
1221 | + | ||
1222 | +err_free_irq: | ||
1223 | + free_irq(irq, pdev); | ||
1224 | +err_unmap: | ||
1225 | + iounmap(at91_rtc_regs); | ||
1226 | + | ||
1227 | + return ret; | ||
1228 | } | ||
1229 | |||
1230 | /* | ||
1231 | @@ -332,6 +339,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) | ||
1232 | free_irq(irq, pdev); | ||
1233 | |||
1234 | rtc_device_unregister(rtc); | ||
1235 | + iounmap(at91_rtc_regs); | ||
1236 | platform_set_drvdata(pdev, NULL); | ||
1237 | |||
1238 | return 0; | ||
1239 | diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c | ||
1240 | index af97c94..cc5bea9 100644 | ||
1241 | --- a/drivers/rtc/rtc-cmos.c | ||
1242 | +++ b/drivers/rtc/rtc-cmos.c | ||
1243 | @@ -804,9 +804,8 @@ static int cmos_suspend(struct device *dev) | ||
1244 | mask = RTC_IRQMASK; | ||
1245 | tmp &= ~mask; | ||
1246 | CMOS_WRITE(tmp, RTC_CONTROL); | ||
1247 | + hpet_mask_rtc_irq_bit(mask); | ||
1248 | |||
1249 | - /* shut down hpet emulation - we don't need it for alarm */ | ||
1250 | - hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE); | ||
1251 | cmos_checkintr(cmos, tmp); | ||
1252 | } | ||
1253 | spin_unlock_irq(&rtc_lock); | ||
1254 | @@ -870,6 +869,7 @@ static int cmos_resume(struct device *dev) | ||
1255 | rtc_update_irq(cmos->rtc, 1, mask); | ||
1256 | tmp &= ~RTC_AIE; | ||
1257 | hpet_mask_rtc_irq_bit(RTC_AIE); | ||
1258 | + hpet_rtc_timer_init(); | ||
1259 | } while (mask & RTC_AIE); | ||
1260 | spin_unlock_irq(&rtc_lock); | ||
1261 | } | ||
1262 | diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c | ||
1263 | index cd79838..178836e 100644 | ||
1264 | --- a/drivers/s390/char/sclp_cmd.c | ||
1265 | +++ b/drivers/s390/char/sclp_cmd.c | ||
1266 | @@ -561,6 +561,8 @@ static void __init sclp_add_standby_memory(void) | ||
1267 | add_memory_merged(0); | ||
1268 | } | ||
1269 | |||
1270 | +#define MEM_SCT_SIZE (1UL << SECTION_SIZE_BITS) | ||
1271 | + | ||
1272 | static void __init insert_increment(u16 rn, int standby, int assigned) | ||
1273 | { | ||
1274 | struct memory_increment *incr, *new_incr; | ||
1275 | @@ -573,7 +575,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned) | ||
1276 | new_incr->rn = rn; | ||
1277 | new_incr->standby = standby; | ||
1278 | if (!standby) | ||
1279 | - new_incr->usecount = 1; | ||
1280 | + new_incr->usecount = rzm > MEM_SCT_SIZE ? rzm/MEM_SCT_SIZE : 1; | ||
1281 | last_rn = 0; | ||
1282 | prev = &sclp_mem_list; | ||
1283 | list_for_each_entry(incr, &sclp_mem_list, list) { | ||
1284 | diff --git a/drivers/staging/zsmalloc/Kconfig b/drivers/staging/zsmalloc/Kconfig | ||
1285 | index 9084565..7fab032 100644 | ||
1286 | --- a/drivers/staging/zsmalloc/Kconfig | ||
1287 | +++ b/drivers/staging/zsmalloc/Kconfig | ||
1288 | @@ -1,5 +1,5 @@ | ||
1289 | config ZSMALLOC | ||
1290 | - tristate "Memory allocator for compressed pages" | ||
1291 | + bool "Memory allocator for compressed pages" | ||
1292 | default n | ||
1293 | help | ||
1294 | zsmalloc is a slab-based memory allocator designed to store | ||
1295 | diff --git a/drivers/staging/zsmalloc/zsmalloc-main.c b/drivers/staging/zsmalloc/zsmalloc-main.c | ||
1296 | index e78d262..324e123 100644 | ||
1297 | --- a/drivers/staging/zsmalloc/zsmalloc-main.c | ||
1298 | +++ b/drivers/staging/zsmalloc/zsmalloc-main.c | ||
1299 | @@ -656,11 +656,8 @@ static inline void __zs_unmap_object(struct mapping_area *area, | ||
1300 | struct page *pages[2], int off, int size) | ||
1301 | { | ||
1302 | unsigned long addr = (unsigned long)area->vm_addr; | ||
1303 | - unsigned long end = addr + (PAGE_SIZE * 2); | ||
1304 | |||
1305 | - flush_cache_vunmap(addr, end); | ||
1306 | - unmap_kernel_range_noflush(addr, PAGE_SIZE * 2); | ||
1307 | - flush_tlb_kernel_range(addr, end); | ||
1308 | + unmap_kernel_range(addr, PAGE_SIZE * 2); | ||
1309 | } | ||
1310 | |||
1311 | #else /* USE_PGTABLE_MAPPING */ | ||
1312 | diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c | ||
1313 | index c24b4db..125e0fd 100644 | ||
1314 | --- a/drivers/tty/pty.c | ||
1315 | +++ b/drivers/tty/pty.c | ||
1316 | @@ -682,6 +682,9 @@ static int ptmx_open(struct inode *inode, struct file *filp) | ||
1317 | |||
1318 | nonseekable_open(inode, filp); | ||
1319 | |||
1320 | + /* We refuse fsnotify events on ptmx, since it's a shared resource */ | ||
1321 | + filp->f_mode |= FMODE_NONOTIFY; | ||
1322 | + | ||
1323 | retval = tty_alloc_file(filp); | ||
1324 | if (retval) | ||
1325 | return retval; | ||
1326 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c | ||
1327 | index a400002..8fbb6d2 100644 | ||
1328 | --- a/drivers/tty/serial/serial_core.c | ||
1329 | +++ b/drivers/tty/serial/serial_core.c | ||
1330 | @@ -1941,6 +1941,8 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) | ||
1331 | mutex_unlock(&port->mutex); | ||
1332 | return 0; | ||
1333 | } | ||
1334 | + put_device(tty_dev); | ||
1335 | + | ||
1336 | if (console_suspend_enabled || !uart_console(uport)) | ||
1337 | uport->suspended = 1; | ||
1338 | |||
1339 | @@ -2006,9 +2008,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) | ||
1340 | disable_irq_wake(uport->irq); | ||
1341 | uport->irq_wake = 0; | ||
1342 | } | ||
1343 | + put_device(tty_dev); | ||
1344 | mutex_unlock(&port->mutex); | ||
1345 | return 0; | ||
1346 | } | ||
1347 | + put_device(tty_dev); | ||
1348 | uport->suspended = 0; | ||
1349 | |||
1350 | /* | ||
1351 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c | ||
1352 | index b045268..a9cd0b9 100644 | ||
1353 | --- a/drivers/tty/tty_io.c | ||
1354 | +++ b/drivers/tty/tty_io.c | ||
1355 | @@ -941,10 +941,10 @@ void start_tty(struct tty_struct *tty) | ||
1356 | |||
1357 | EXPORT_SYMBOL(start_tty); | ||
1358 | |||
1359 | +/* We limit tty time update visibility to every 8 seconds or so. */ | ||
1360 | static void tty_update_time(struct timespec *time) | ||
1361 | { | ||
1362 | - unsigned long sec = get_seconds(); | ||
1363 | - sec -= sec % 60; | ||
1364 | + unsigned long sec = get_seconds() & ~7; | ||
1365 | if ((long)(sec - time->tv_sec) > 0) | ||
1366 | time->tv_sec = sec; | ||
1367 | } | ||
1368 | diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c | ||
1369 | index f64fbea..d86333b 100644 | ||
1370 | --- a/drivers/usb/chipidea/udc.c | ||
1371 | +++ b/drivers/usb/chipidea/udc.c | ||
1372 | @@ -461,6 +461,8 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) | ||
1373 | mReq->ptr->page[i] = | ||
1374 | (mReq->req.dma + i * CI13XXX_PAGE_SIZE) & ~TD_RESERVED_MASK; | ||
1375 | |||
1376 | + wmb(); | ||
1377 | + | ||
1378 | if (!list_empty(&mEp->qh.queue)) { | ||
1379 | struct ci13xxx_req *mReqPrev; | ||
1380 | int n = hw_ep_bit(mEp->num, mEp->dir); | ||
1381 | @@ -561,6 +563,12 @@ __acquires(mEp->lock) | ||
1382 | struct ci13xxx_req *mReq = \ | ||
1383 | list_entry(mEp->qh.queue.next, | ||
1384 | struct ci13xxx_req, queue); | ||
1385 | + | ||
1386 | + if (mReq->zptr) { | ||
1387 | + dma_pool_free(mEp->td_pool, mReq->zptr, mReq->zdma); | ||
1388 | + mReq->zptr = NULL; | ||
1389 | + } | ||
1390 | + | ||
1391 | list_del_init(&mReq->queue); | ||
1392 | mReq->req.status = -ESHUTDOWN; | ||
1393 | |||
1394 | diff --git a/drivers/usb/chipidea/udc.h b/drivers/usb/chipidea/udc.h | ||
1395 | index 4ff2384d..d12e8b5 100644 | ||
1396 | --- a/drivers/usb/chipidea/udc.h | ||
1397 | +++ b/drivers/usb/chipidea/udc.h | ||
1398 | @@ -40,7 +40,7 @@ struct ci13xxx_td { | ||
1399 | #define TD_CURR_OFFSET (0x0FFFUL << 0) | ||
1400 | #define TD_FRAME_NUM (0x07FFUL << 0) | ||
1401 | #define TD_RESERVED_MASK (0x0FFFUL << 0) | ||
1402 | -} __attribute__ ((packed)); | ||
1403 | +} __attribute__ ((packed, aligned(4))); | ||
1404 | |||
1405 | /* DMA layout of queue heads */ | ||
1406 | struct ci13xxx_qh { | ||
1407 | @@ -57,7 +57,7 @@ struct ci13xxx_qh { | ||
1408 | /* 9 */ | ||
1409 | u32 RESERVED; | ||
1410 | struct usb_ctrlrequest setup; | ||
1411 | -} __attribute__ ((packed)); | ||
1412 | +} __attribute__ ((packed, aligned(4))); | ||
1413 | |||
1414 | /** | ||
1415 | * struct ci13xxx_req - usb request representation | ||
1416 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
1417 | index 8823e98..caefc80 100644 | ||
1418 | --- a/drivers/usb/core/devio.c | ||
1419 | +++ b/drivers/usb/core/devio.c | ||
1420 | @@ -739,6 +739,8 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, | ||
1421 | index &= 0xff; | ||
1422 | switch (requesttype & USB_RECIP_MASK) { | ||
1423 | case USB_RECIP_ENDPOINT: | ||
1424 | + if ((index & ~USB_DIR_IN) == 0) | ||
1425 | + return 0; | ||
1426 | ret = findintfep(ps->dev, index); | ||
1427 | if (ret >= 0) | ||
1428 | ret = checkintf(ps, ret); | ||
1429 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c | ||
1430 | index 416a6dc..83b5a172 100644 | ||
1431 | --- a/drivers/usb/host/ehci-hcd.c | ||
1432 | +++ b/drivers/usb/host/ehci-hcd.c | ||
1433 | @@ -670,9 +670,6 @@ int ehci_setup(struct usb_hcd *hcd) | ||
1434 | if (retval) | ||
1435 | return retval; | ||
1436 | |||
1437 | - if (ehci_is_TDI(ehci)) | ||
1438 | - tdi_reset(ehci); | ||
1439 | - | ||
1440 | ehci_reset(ehci); | ||
1441 | |||
1442 | return 0; | ||
1443 | diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c | ||
1444 | index 0fc6e5f..ba6a5d6 100644 | ||
1445 | --- a/drivers/usb/misc/appledisplay.c | ||
1446 | +++ b/drivers/usb/misc/appledisplay.c | ||
1447 | @@ -63,6 +63,7 @@ static const struct usb_device_id appledisplay_table[] = { | ||
1448 | { APPLEDISPLAY_DEVICE(0x9219) }, | ||
1449 | { APPLEDISPLAY_DEVICE(0x921c) }, | ||
1450 | { APPLEDISPLAY_DEVICE(0x921d) }, | ||
1451 | + { APPLEDISPLAY_DEVICE(0x9236) }, | ||
1452 | |||
1453 | /* Terminating entry */ | ||
1454 | { } | ||
1455 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1456 | index 9886180..be2dcb0 100644 | ||
1457 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1458 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1459 | @@ -189,6 +189,7 @@ static struct usb_device_id id_table_combined [] = { | ||
1460 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, | ||
1461 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, | ||
1462 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, | ||
1463 | + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) }, | ||
1464 | { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) }, | ||
1465 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | ||
1466 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | ||
1467 | @@ -870,7 +871,9 @@ static struct usb_device_id id_table_combined [] = { | ||
1468 | { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, | ||
1469 | { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), | ||
1470 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
1471 | - { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), | ||
1472 | + { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID), | ||
1473 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
1474 | + { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID), | ||
1475 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, | ||
1476 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, | ||
1477 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
1478 | @@ -1792,20 +1795,24 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial) | ||
1479 | } | ||
1480 | |||
1481 | /* | ||
1482 | - * First and second port on STMCLiteadaptors is reserved for JTAG interface | ||
1483 | - * and the forth port for pio | ||
1484 | + * First two ports on JTAG adaptors using an FT4232 such as STMicroelectronics's | ||
1485 | + * ST Micro Connect Lite are reserved for JTAG or other non-UART interfaces and | ||
1486 | + * can be accessed from userspace. | ||
1487 | + * The next two ports are enabled as UARTs by default, where port 2 is | ||
1488 | + * a conventional RS-232 UART. | ||
1489 | */ | ||
1490 | static int ftdi_stmclite_probe(struct usb_serial *serial) | ||
1491 | { | ||
1492 | struct usb_device *udev = serial->dev; | ||
1493 | struct usb_interface *interface = serial->interface; | ||
1494 | |||
1495 | - if (interface == udev->actconfig->interface[2]) | ||
1496 | - return 0; | ||
1497 | - | ||
1498 | - dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); | ||
1499 | + if (interface == udev->actconfig->interface[0] || | ||
1500 | + interface == udev->actconfig->interface[1]) { | ||
1501 | + dev_info(&udev->dev, "Ignoring serial port reserved for JTAG\n"); | ||
1502 | + return -ENODEV; | ||
1503 | + } | ||
1504 | |||
1505 | - return -ENODEV; | ||
1506 | + return 0; | ||
1507 | } | ||
1508 | |||
1509 | /* | ||
1510 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
1511 | index e79861e..9852827 100644 | ||
1512 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
1513 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
1514 | @@ -74,6 +74,7 @@ | ||
1515 | #define FTDI_OPENDCC_THROTTLE_PID 0xBFDA | ||
1516 | #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB | ||
1517 | #define FTDI_OPENDCC_GBM_PID 0xBFDC | ||
1518 | +#define FTDI_OPENDCC_GBM_BOOST_PID 0xBFDD | ||
1519 | |||
1520 | /* NZR SEM 16+ USB (http://www.nzr.de) */ | ||
1521 | #define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ | ||
1522 | @@ -1150,7 +1151,8 @@ | ||
1523 | * STMicroelectonics | ||
1524 | */ | ||
1525 | #define ST_VID 0x0483 | ||
1526 | -#define ST_STMCLT1030_PID 0x3747 /* ST Micro Connect Lite STMCLT1030 */ | ||
1527 | +#define ST_STMCLT_2232_PID 0x3746 | ||
1528 | +#define ST_STMCLT_4232_PID 0x3747 | ||
1529 | |||
1530 | /* | ||
1531 | * Papouch products (http://www.papouch.com/) | ||
1532 | diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c | ||
1533 | index 7777172..38f2489 100644 | ||
1534 | --- a/drivers/usb/serial/io_ti.c | ||
1535 | +++ b/drivers/usb/serial/io_ti.c | ||
1536 | @@ -2392,7 +2392,7 @@ static int get_serial_info(struct edgeport_port *edge_port, | ||
1537 | |||
1538 | cwait = edge_port->port->port.closing_wait; | ||
1539 | if (cwait != ASYNC_CLOSING_WAIT_NONE) | ||
1540 | - cwait = jiffies_to_msecs(closing_wait) / 10; | ||
1541 | + cwait = jiffies_to_msecs(cwait) / 10; | ||
1542 | |||
1543 | memset(&tmp, 0, sizeof(tmp)); | ||
1544 | |||
1545 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
1546 | index 558adfc..bff059a 100644 | ||
1547 | --- a/drivers/usb/serial/option.c | ||
1548 | +++ b/drivers/usb/serial/option.c | ||
1549 | @@ -347,6 +347,7 @@ static void option_instat_callback(struct urb *urb); | ||
1550 | /* Olivetti products */ | ||
1551 | #define OLIVETTI_VENDOR_ID 0x0b3c | ||
1552 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 | ||
1553 | +#define OLIVETTI_PRODUCT_OLICARD145 0xc003 | ||
1554 | |||
1555 | /* Celot products */ | ||
1556 | #define CELOT_VENDOR_ID 0x211f | ||
1557 | @@ -1273,6 +1274,7 @@ static const struct usb_device_id option_ids[] = { | ||
1558 | { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, | ||
1559 | |||
1560 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, | ||
1561 | + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, | ||
1562 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | ||
1563 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ | ||
1564 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | ||
1565 | @@ -1350,6 +1352,12 @@ static const struct usb_device_id option_ids[] = { | ||
1566 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), | ||
1567 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
1568 | { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, | ||
1569 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */ | ||
1570 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */ | ||
1571 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x02, 0x01) }, | ||
1572 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, | ||
1573 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, | ||
1574 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, | ||
1575 | { } /* Terminating entry */ | ||
1576 | }; | ||
1577 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
1578 | diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c | ||
1579 | index 070b5c0..d944088 100644 | ||
1580 | --- a/drivers/usb/storage/cypress_atacb.c | ||
1581 | +++ b/drivers/usb/storage/cypress_atacb.c | ||
1582 | @@ -248,14 +248,26 @@ static int cypress_probe(struct usb_interface *intf, | ||
1583 | { | ||
1584 | struct us_data *us; | ||
1585 | int result; | ||
1586 | + struct usb_device *device; | ||
1587 | |||
1588 | result = usb_stor_probe1(&us, intf, id, | ||
1589 | (id - cypress_usb_ids) + cypress_unusual_dev_list); | ||
1590 | if (result) | ||
1591 | return result; | ||
1592 | |||
1593 | - us->protocol_name = "Transparent SCSI with Cypress ATACB"; | ||
1594 | - us->proto_handler = cypress_atacb_passthrough; | ||
1595 | + /* Among CY7C68300 chips, the A revision does not support Cypress ATACB | ||
1596 | + * Filter out this revision from EEPROM default descriptor values | ||
1597 | + */ | ||
1598 | + device = interface_to_usbdev(intf); | ||
1599 | + if (device->descriptor.iManufacturer != 0x38 || | ||
1600 | + device->descriptor.iProduct != 0x4e || | ||
1601 | + device->descriptor.iSerialNumber != 0x64) { | ||
1602 | + us->protocol_name = "Transparent SCSI with Cypress ATACB"; | ||
1603 | + us->proto_handler = cypress_atacb_passthrough; | ||
1604 | + } else { | ||
1605 | + us->protocol_name = "Transparent SCSI"; | ||
1606 | + us->proto_handler = usb_stor_transparent_scsi_command; | ||
1607 | + } | ||
1608 | |||
1609 | result = usb_stor_probe2(us); | ||
1610 | return result; | ||
1611 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c | ||
1612 | index 3cd6759..a92783e 100644 | ||
1613 | --- a/drivers/video/console/fbcon.c | ||
1614 | +++ b/drivers/video/console/fbcon.c | ||
1615 | @@ -1228,6 +1228,8 @@ static void fbcon_deinit(struct vc_data *vc) | ||
1616 | finished: | ||
1617 | |||
1618 | fbcon_free_font(p, free_font); | ||
1619 | + if (free_font) | ||
1620 | + vc->vc_font.data = NULL; | ||
1621 | |||
1622 | if (!con_is_bound(&fb_con)) | ||
1623 | fbcon_exit(); | ||
1624 | diff --git a/fs/dcache.c b/fs/dcache.c | ||
1625 | index e8bc342..e689268 100644 | ||
1626 | --- a/fs/dcache.c | ||
1627 | +++ b/fs/dcache.c | ||
1628 | @@ -1230,8 +1230,10 @@ void shrink_dcache_parent(struct dentry * parent) | ||
1629 | LIST_HEAD(dispose); | ||
1630 | int found; | ||
1631 | |||
1632 | - while ((found = select_parent(parent, &dispose)) != 0) | ||
1633 | + while ((found = select_parent(parent, &dispose)) != 0) { | ||
1634 | shrink_dentry_list(&dispose); | ||
1635 | + cond_resched(); | ||
1636 | + } | ||
1637 | } | ||
1638 | EXPORT_SYMBOL(shrink_dcache_parent); | ||
1639 | |||
1640 | diff --git a/fs/exec.c b/fs/exec.c | ||
1641 | index a96a488..6d56ff2 100644 | ||
1642 | --- a/fs/exec.c | ||
1643 | +++ b/fs/exec.c | ||
1644 | @@ -613,7 +613,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | ||
1645 | * when the old and new regions overlap clear from new_end. | ||
1646 | */ | ||
1647 | free_pgd_range(&tlb, new_end, old_end, new_end, | ||
1648 | - vma->vm_next ? vma->vm_next->vm_start : 0); | ||
1649 | + vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); | ||
1650 | } else { | ||
1651 | /* | ||
1652 | * otherwise, clean from old_start; this is done to not touch | ||
1653 | @@ -622,7 +622,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | ||
1654 | * for the others its just a little faster. | ||
1655 | */ | ||
1656 | free_pgd_range(&tlb, old_start, old_end, new_end, | ||
1657 | - vma->vm_next ? vma->vm_next->vm_start : 0); | ||
1658 | + vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); | ||
1659 | } | ||
1660 | tlb_finish_mmu(&tlb, new_end, old_end); | ||
1661 | |||
1662 | @@ -898,11 +898,13 @@ static int de_thread(struct task_struct *tsk) | ||
1663 | |||
1664 | sig->notify_count = -1; /* for exit_notify() */ | ||
1665 | for (;;) { | ||
1666 | + threadgroup_change_begin(tsk); | ||
1667 | write_lock_irq(&tasklist_lock); | ||
1668 | if (likely(leader->exit_state)) | ||
1669 | break; | ||
1670 | __set_current_state(TASK_KILLABLE); | ||
1671 | write_unlock_irq(&tasklist_lock); | ||
1672 | + threadgroup_change_end(tsk); | ||
1673 | schedule(); | ||
1674 | if (unlikely(__fatal_signal_pending(tsk))) | ||
1675 | goto killed; | ||
1676 | @@ -960,6 +962,7 @@ static int de_thread(struct task_struct *tsk) | ||
1677 | if (unlikely(leader->ptrace)) | ||
1678 | __wake_up_parent(leader, leader->parent); | ||
1679 | write_unlock_irq(&tasklist_lock); | ||
1680 | + threadgroup_change_end(tsk); | ||
1681 | |||
1682 | release_task(leader); | ||
1683 | } | ||
1684 | diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig | ||
1685 | index 9873587..efea5d5 100644 | ||
1686 | --- a/fs/ext4/Kconfig | ||
1687 | +++ b/fs/ext4/Kconfig | ||
1688 | @@ -71,4 +71,5 @@ config EXT4_DEBUG | ||
1689 | Enables run-time debugging support for the ext4 filesystem. | ||
1690 | |||
1691 | If you select Y here, then you will be able to turn on debugging | ||
1692 | - with a command such as "echo 1 > /sys/kernel/debug/ext4/mballoc-debug" | ||
1693 | + with a command such as: | ||
1694 | + echo 1 > /sys/module/ext4/parameters/mballoc_debug | ||
1695 | diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h | ||
1696 | index 4c216b1..aeed0ba 100644 | ||
1697 | --- a/fs/ext4/ext4_jbd2.h | ||
1698 | +++ b/fs/ext4/ext4_jbd2.h | ||
1699 | @@ -194,16 +194,20 @@ static inline void ext4_journal_callback_add(handle_t *handle, | ||
1700 | * ext4_journal_callback_del: delete a registered callback | ||
1701 | * @handle: active journal transaction handle on which callback was registered | ||
1702 | * @jce: registered journal callback entry to unregister | ||
1703 | + * Return true if object was sucessfully removed | ||
1704 | */ | ||
1705 | -static inline void ext4_journal_callback_del(handle_t *handle, | ||
1706 | +static inline bool ext4_journal_callback_try_del(handle_t *handle, | ||
1707 | struct ext4_journal_cb_entry *jce) | ||
1708 | { | ||
1709 | + bool deleted; | ||
1710 | struct ext4_sb_info *sbi = | ||
1711 | EXT4_SB(handle->h_transaction->t_journal->j_private); | ||
1712 | |||
1713 | spin_lock(&sbi->s_md_lock); | ||
1714 | + deleted = !list_empty(&jce->jce_list); | ||
1715 | list_del_init(&jce->jce_list); | ||
1716 | spin_unlock(&sbi->s_md_lock); | ||
1717 | + return deleted; | ||
1718 | } | ||
1719 | |||
1720 | int | ||
1721 | diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c | ||
1722 | index 3278e64..e0ba8a4 100644 | ||
1723 | --- a/fs/ext4/fsync.c | ||
1724 | +++ b/fs/ext4/fsync.c | ||
1725 | @@ -166,8 +166,7 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | ||
1726 | if (journal->j_flags & JBD2_BARRIER && | ||
1727 | !jbd2_trans_will_send_data_barrier(journal, commit_tid)) | ||
1728 | needs_barrier = true; | ||
1729 | - jbd2_log_start_commit(journal, commit_tid); | ||
1730 | - ret = jbd2_log_wait_commit(journal, commit_tid); | ||
1731 | + ret = jbd2_complete_transaction(journal, commit_tid); | ||
1732 | if (needs_barrier) { | ||
1733 | err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL); | ||
1734 | if (!ret) | ||
1735 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
1736 | index b3a5213..d69e954 100644 | ||
1737 | --- a/fs/ext4/inode.c | ||
1738 | +++ b/fs/ext4/inode.c | ||
1739 | @@ -55,21 +55,21 @@ static __u32 ext4_inode_csum(struct inode *inode, struct ext4_inode *raw, | ||
1740 | __u16 csum_hi = 0; | ||
1741 | __u32 csum; | ||
1742 | |||
1743 | - csum_lo = raw->i_checksum_lo; | ||
1744 | + csum_lo = le16_to_cpu(raw->i_checksum_lo); | ||
1745 | raw->i_checksum_lo = 0; | ||
1746 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && | ||
1747 | EXT4_FITS_IN_INODE(raw, ei, i_checksum_hi)) { | ||
1748 | - csum_hi = raw->i_checksum_hi; | ||
1749 | + csum_hi = le16_to_cpu(raw->i_checksum_hi); | ||
1750 | raw->i_checksum_hi = 0; | ||
1751 | } | ||
1752 | |||
1753 | csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)raw, | ||
1754 | EXT4_INODE_SIZE(inode->i_sb)); | ||
1755 | |||
1756 | - raw->i_checksum_lo = csum_lo; | ||
1757 | + raw->i_checksum_lo = cpu_to_le16(csum_lo); | ||
1758 | if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && | ||
1759 | EXT4_FITS_IN_INODE(raw, ei, i_checksum_hi)) | ||
1760 | - raw->i_checksum_hi = csum_hi; | ||
1761 | + raw->i_checksum_hi = cpu_to_le16(csum_hi); | ||
1762 | |||
1763 | return csum; | ||
1764 | } | ||
1765 | @@ -210,8 +210,7 @@ void ext4_evict_inode(struct inode *inode) | ||
1766 | journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; | ||
1767 | tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; | ||
1768 | |||
1769 | - jbd2_log_start_commit(journal, commit_tid); | ||
1770 | - jbd2_log_wait_commit(journal, commit_tid); | ||
1771 | + jbd2_complete_transaction(journal, commit_tid); | ||
1772 | filemap_write_and_wait(&inode->i_data); | ||
1773 | } | ||
1774 | truncate_inode_pages(&inode->i_data, 0); | ||
1775 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c | ||
1776 | index ee6614b..cf3025c 100644 | ||
1777 | --- a/fs/ext4/mballoc.c | ||
1778 | +++ b/fs/ext4/mballoc.c | ||
1779 | @@ -4420,11 +4420,11 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, | ||
1780 | node = rb_prev(new_node); | ||
1781 | if (node) { | ||
1782 | entry = rb_entry(node, struct ext4_free_data, efd_node); | ||
1783 | - if (can_merge(entry, new_entry)) { | ||
1784 | + if (can_merge(entry, new_entry) && | ||
1785 | + ext4_journal_callback_try_del(handle, &entry->efd_jce)) { | ||
1786 | new_entry->efd_start_cluster = entry->efd_start_cluster; | ||
1787 | new_entry->efd_count += entry->efd_count; | ||
1788 | rb_erase(node, &(db->bb_free_root)); | ||
1789 | - ext4_journal_callback_del(handle, &entry->efd_jce); | ||
1790 | kmem_cache_free(ext4_free_data_cachep, entry); | ||
1791 | } | ||
1792 | } | ||
1793 | @@ -4432,10 +4432,10 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, | ||
1794 | node = rb_next(new_node); | ||
1795 | if (node) { | ||
1796 | entry = rb_entry(node, struct ext4_free_data, efd_node); | ||
1797 | - if (can_merge(new_entry, entry)) { | ||
1798 | + if (can_merge(new_entry, entry) && | ||
1799 | + ext4_journal_callback_try_del(handle, &entry->efd_jce)) { | ||
1800 | new_entry->efd_count += entry->efd_count; | ||
1801 | rb_erase(node, &(db->bb_free_root)); | ||
1802 | - ext4_journal_callback_del(handle, &entry->efd_jce); | ||
1803 | kmem_cache_free(ext4_free_data_cachep, entry); | ||
1804 | } | ||
1805 | } | ||
1806 | diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c | ||
1807 | index f9b5515..b3b1f7d 100644 | ||
1808 | --- a/fs/ext4/mmp.c | ||
1809 | +++ b/fs/ext4/mmp.c | ||
1810 | @@ -7,7 +7,7 @@ | ||
1811 | #include "ext4.h" | ||
1812 | |||
1813 | /* Checksumming functions */ | ||
1814 | -static __u32 ext4_mmp_csum(struct super_block *sb, struct mmp_struct *mmp) | ||
1815 | +static __le32 ext4_mmp_csum(struct super_block *sb, struct mmp_struct *mmp) | ||
1816 | { | ||
1817 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
1818 | int offset = offsetof(struct mmp_struct, mmp_checksum); | ||
1819 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c | ||
1820 | index c169477..1357260 100644 | ||
1821 | --- a/fs/ext4/resize.c | ||
1822 | +++ b/fs/ext4/resize.c | ||
1823 | @@ -1341,6 +1341,8 @@ static void ext4_update_super(struct super_block *sb, | ||
1824 | |||
1825 | /* Update the global fs size fields */ | ||
1826 | sbi->s_groups_count += flex_gd->count; | ||
1827 | + sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count, | ||
1828 | + (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); | ||
1829 | |||
1830 | /* Update the reserved block counts only once the new group is | ||
1831 | * active. */ | ||
1832 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
1833 | index 5d6d5357..febbe0e 100644 | ||
1834 | --- a/fs/ext4/super.c | ||
1835 | +++ b/fs/ext4/super.c | ||
1836 | @@ -353,10 +353,13 @@ static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn) | ||
1837 | struct super_block *sb = journal->j_private; | ||
1838 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
1839 | int error = is_journal_aborted(journal); | ||
1840 | - struct ext4_journal_cb_entry *jce, *tmp; | ||
1841 | + struct ext4_journal_cb_entry *jce; | ||
1842 | |||
1843 | + BUG_ON(txn->t_state == T_FINISHED); | ||
1844 | spin_lock(&sbi->s_md_lock); | ||
1845 | - list_for_each_entry_safe(jce, tmp, &txn->t_private_list, jce_list) { | ||
1846 | + while (!list_empty(&txn->t_private_list)) { | ||
1847 | + jce = list_entry(txn->t_private_list.next, | ||
1848 | + struct ext4_journal_cb_entry, jce_list); | ||
1849 | list_del_init(&jce->jce_list); | ||
1850 | spin_unlock(&sbi->s_md_lock); | ||
1851 | jce->jce_func(sb, jce, error); | ||
1852 | @@ -3698,6 +3701,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
1853 | sbi->s_err_report.function = print_daily_error_info; | ||
1854 | sbi->s_err_report.data = (unsigned long) sb; | ||
1855 | |||
1856 | + /* Register extent status tree shrinker */ | ||
1857 | + ext4_es_register_shrinker(sb); | ||
1858 | + | ||
1859 | err = percpu_counter_init(&sbi->s_freeclusters_counter, | ||
1860 | ext4_count_free_clusters(sb)); | ||
1861 | if (!err) { | ||
1862 | @@ -3723,9 +3729,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
1863 | sbi->s_max_writeback_mb_bump = 128; | ||
1864 | sbi->s_extent_max_zeroout_kb = 32; | ||
1865 | |||
1866 | - /* Register extent status tree shrinker */ | ||
1867 | - ext4_es_register_shrinker(sb); | ||
1868 | - | ||
1869 | /* | ||
1870 | * set up enough so that it can read an inode | ||
1871 | */ | ||
1872 | @@ -4010,6 +4013,7 @@ failed_mount_wq: | ||
1873 | sbi->s_journal = NULL; | ||
1874 | } | ||
1875 | failed_mount3: | ||
1876 | + ext4_es_unregister_shrinker(sb); | ||
1877 | del_timer(&sbi->s_err_report); | ||
1878 | if (sbi->s_flex_groups) | ||
1879 | ext4_kvfree(sbi->s_flex_groups); | ||
1880 | diff --git a/fs/fscache/stats.c b/fs/fscache/stats.c | ||
1881 | index 8179e8b..40d13c7 100644 | ||
1882 | --- a/fs/fscache/stats.c | ||
1883 | +++ b/fs/fscache/stats.c | ||
1884 | @@ -287,5 +287,5 @@ const struct file_operations fscache_stats_fops = { | ||
1885 | .open = fscache_stats_open, | ||
1886 | .read = seq_read, | ||
1887 | .llseek = seq_lseek, | ||
1888 | - .release = seq_release, | ||
1889 | + .release = single_release, | ||
1890 | }; | ||
1891 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c | ||
1892 | index 750c701..0f53946 100644 | ||
1893 | --- a/fs/jbd2/commit.c | ||
1894 | +++ b/fs/jbd2/commit.c | ||
1895 | @@ -382,7 +382,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) | ||
1896 | int space_left = 0; | ||
1897 | int first_tag = 0; | ||
1898 | int tag_flag; | ||
1899 | - int i, to_free = 0; | ||
1900 | + int i; | ||
1901 | int tag_bytes = journal_tag_bytes(journal); | ||
1902 | struct buffer_head *cbh = NULL; /* For transactional checksums */ | ||
1903 | __u32 crc32_sum = ~0; | ||
1904 | @@ -1134,7 +1134,7 @@ restart_loop: | ||
1905 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; | ||
1906 | spin_unlock(&journal->j_history_lock); | ||
1907 | |||
1908 | - commit_transaction->t_state = T_FINISHED; | ||
1909 | + commit_transaction->t_state = T_COMMIT_CALLBACK; | ||
1910 | J_ASSERT(commit_transaction == journal->j_committing_transaction); | ||
1911 | journal->j_commit_sequence = commit_transaction->t_tid; | ||
1912 | journal->j_committing_transaction = NULL; | ||
1913 | @@ -1149,38 +1149,44 @@ restart_loop: | ||
1914 | journal->j_average_commit_time*3) / 4; | ||
1915 | else | ||
1916 | journal->j_average_commit_time = commit_time; | ||
1917 | + | ||
1918 | write_unlock(&journal->j_state_lock); | ||
1919 | |||
1920 | - if (commit_transaction->t_checkpoint_list == NULL && | ||
1921 | - commit_transaction->t_checkpoint_io_list == NULL) { | ||
1922 | - __jbd2_journal_drop_transaction(journal, commit_transaction); | ||
1923 | - to_free = 1; | ||
1924 | + if (journal->j_checkpoint_transactions == NULL) { | ||
1925 | + journal->j_checkpoint_transactions = commit_transaction; | ||
1926 | + commit_transaction->t_cpnext = commit_transaction; | ||
1927 | + commit_transaction->t_cpprev = commit_transaction; | ||
1928 | } else { | ||
1929 | - if (journal->j_checkpoint_transactions == NULL) { | ||
1930 | - journal->j_checkpoint_transactions = commit_transaction; | ||
1931 | - commit_transaction->t_cpnext = commit_transaction; | ||
1932 | - commit_transaction->t_cpprev = commit_transaction; | ||
1933 | - } else { | ||
1934 | - commit_transaction->t_cpnext = | ||
1935 | - journal->j_checkpoint_transactions; | ||
1936 | - commit_transaction->t_cpprev = | ||
1937 | - commit_transaction->t_cpnext->t_cpprev; | ||
1938 | - commit_transaction->t_cpnext->t_cpprev = | ||
1939 | - commit_transaction; | ||
1940 | - commit_transaction->t_cpprev->t_cpnext = | ||
1941 | + commit_transaction->t_cpnext = | ||
1942 | + journal->j_checkpoint_transactions; | ||
1943 | + commit_transaction->t_cpprev = | ||
1944 | + commit_transaction->t_cpnext->t_cpprev; | ||
1945 | + commit_transaction->t_cpnext->t_cpprev = | ||
1946 | + commit_transaction; | ||
1947 | + commit_transaction->t_cpprev->t_cpnext = | ||
1948 | commit_transaction; | ||
1949 | - } | ||
1950 | } | ||
1951 | spin_unlock(&journal->j_list_lock); | ||
1952 | - | ||
1953 | + /* Drop all spin_locks because commit_callback may be block. | ||
1954 | + * __journal_remove_checkpoint() can not destroy transaction | ||
1955 | + * under us because it is not marked as T_FINISHED yet */ | ||
1956 | if (journal->j_commit_callback) | ||
1957 | journal->j_commit_callback(journal, commit_transaction); | ||
1958 | |||
1959 | trace_jbd2_end_commit(journal, commit_transaction); | ||
1960 | jbd_debug(1, "JBD2: commit %d complete, head %d\n", | ||
1961 | journal->j_commit_sequence, journal->j_tail_sequence); | ||
1962 | - if (to_free) | ||
1963 | - jbd2_journal_free_transaction(commit_transaction); | ||
1964 | |||
1965 | + write_lock(&journal->j_state_lock); | ||
1966 | + spin_lock(&journal->j_list_lock); | ||
1967 | + commit_transaction->t_state = T_FINISHED; | ||
1968 | + /* Recheck checkpoint lists after j_list_lock was dropped */ | ||
1969 | + if (commit_transaction->t_checkpoint_list == NULL && | ||
1970 | + commit_transaction->t_checkpoint_io_list == NULL) { | ||
1971 | + __jbd2_journal_drop_transaction(journal, commit_transaction); | ||
1972 | + jbd2_journal_free_transaction(commit_transaction); | ||
1973 | + } | ||
1974 | + spin_unlock(&journal->j_list_lock); | ||
1975 | + write_unlock(&journal->j_state_lock); | ||
1976 | wake_up(&journal->j_wait_done_commit); | ||
1977 | } | ||
1978 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c | ||
1979 | index ed10991..886ec2f 100644 | ||
1980 | --- a/fs/jbd2/journal.c | ||
1981 | +++ b/fs/jbd2/journal.c | ||
1982 | @@ -710,6 +710,37 @@ int jbd2_log_wait_commit(journal_t *journal, tid_t tid) | ||
1983 | } | ||
1984 | |||
1985 | /* | ||
1986 | + * When this function returns the transaction corresponding to tid | ||
1987 | + * will be completed. If the transaction has currently running, start | ||
1988 | + * committing that transaction before waiting for it to complete. If | ||
1989 | + * the transaction id is stale, it is by definition already completed, | ||
1990 | + * so just return SUCCESS. | ||
1991 | + */ | ||
1992 | +int jbd2_complete_transaction(journal_t *journal, tid_t tid) | ||
1993 | +{ | ||
1994 | + int need_to_wait = 1; | ||
1995 | + | ||
1996 | + read_lock(&journal->j_state_lock); | ||
1997 | + if (journal->j_running_transaction && | ||
1998 | + journal->j_running_transaction->t_tid == tid) { | ||
1999 | + if (journal->j_commit_request != tid) { | ||
2000 | + /* transaction not yet started, so request it */ | ||
2001 | + read_unlock(&journal->j_state_lock); | ||
2002 | + jbd2_log_start_commit(journal, tid); | ||
2003 | + goto wait_commit; | ||
2004 | + } | ||
2005 | + } else if (!(journal->j_committing_transaction && | ||
2006 | + journal->j_committing_transaction->t_tid == tid)) | ||
2007 | + need_to_wait = 0; | ||
2008 | + read_unlock(&journal->j_state_lock); | ||
2009 | + if (!need_to_wait) | ||
2010 | + return 0; | ||
2011 | +wait_commit: | ||
2012 | + return jbd2_log_wait_commit(journal, tid); | ||
2013 | +} | ||
2014 | +EXPORT_SYMBOL(jbd2_complete_transaction); | ||
2015 | + | ||
2016 | +/* | ||
2017 | * Log buffer allocation routines: | ||
2018 | */ | ||
2019 | |||
2020 | diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c | ||
2021 | index 0796c45..01bfe76 100644 | ||
2022 | --- a/fs/lockd/clntlock.c | ||
2023 | +++ b/fs/lockd/clntlock.c | ||
2024 | @@ -144,6 +144,9 @@ int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout) | ||
2025 | timeout); | ||
2026 | if (ret < 0) | ||
2027 | return -ERESTARTSYS; | ||
2028 | + /* Reset the lock status after a server reboot so we resend */ | ||
2029 | + if (block->b_status == nlm_lck_denied_grace_period) | ||
2030 | + block->b_status = nlm_lck_blocked; | ||
2031 | req->a_res.status = block->b_status; | ||
2032 | return 0; | ||
2033 | } | ||
2034 | diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c | ||
2035 | index 7e529c3..9760ecb 100644 | ||
2036 | --- a/fs/lockd/clntproc.c | ||
2037 | +++ b/fs/lockd/clntproc.c | ||
2038 | @@ -550,9 +550,6 @@ again: | ||
2039 | status = nlmclnt_block(block, req, NLMCLNT_POLL_TIMEOUT); | ||
2040 | if (status < 0) | ||
2041 | break; | ||
2042 | - /* Resend the blocking lock request after a server reboot */ | ||
2043 | - if (resp->status == nlm_lck_denied_grace_period) | ||
2044 | - continue; | ||
2045 | if (resp->status != nlm_lck_blocked) | ||
2046 | break; | ||
2047 | } | ||
2048 | diff --git a/fs/namespace.c b/fs/namespace.c | ||
2049 | index 341d3f5..e945b81 100644 | ||
2050 | --- a/fs/namespace.c | ||
2051 | +++ b/fs/namespace.c | ||
2052 | @@ -2238,12 +2238,11 @@ long do_mount(const char *dev_name, const char *dir_name, | ||
2053 | |||
2054 | retval = security_sb_mount(dev_name, &path, | ||
2055 | type_page, flags, data_page); | ||
2056 | + if (!retval && !may_mount()) | ||
2057 | + retval = -EPERM; | ||
2058 | if (retval) | ||
2059 | goto dput_out; | ||
2060 | |||
2061 | - if (!may_mount()) | ||
2062 | - return -EPERM; | ||
2063 | - | ||
2064 | /* Default to relatime unless overriden */ | ||
2065 | if (!(flags & MS_NOATIME)) | ||
2066 | mnt_flags |= MNT_RELATIME; | ||
2067 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
2068 | index 0ad025e..c7856a1 100644 | ||
2069 | --- a/fs/nfs/nfs4proc.c | ||
2070 | +++ b/fs/nfs/nfs4proc.c | ||
2071 | @@ -1380,6 +1380,12 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | ||
2072 | case -ENOMEM: | ||
2073 | err = 0; | ||
2074 | goto out; | ||
2075 | + case -NFS4ERR_DELAY: | ||
2076 | + case -NFS4ERR_GRACE: | ||
2077 | + set_bit(NFS_DELEGATED_STATE, &state->flags); | ||
2078 | + ssleep(1); | ||
2079 | + err = -EAGAIN; | ||
2080 | + goto out; | ||
2081 | } | ||
2082 | set_bit(NFS_DELEGATED_STATE, &state->flags); | ||
2083 | err = nfs4_handle_exception(server, err, &exception); | ||
2084 | @@ -5025,6 +5031,12 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) | ||
2085 | nfs4_schedule_stateid_recovery(server, state); | ||
2086 | err = 0; | ||
2087 | goto out; | ||
2088 | + case -NFS4ERR_DELAY: | ||
2089 | + case -NFS4ERR_GRACE: | ||
2090 | + set_bit(NFS_DELEGATED_STATE, &state->flags); | ||
2091 | + ssleep(1); | ||
2092 | + err = -EAGAIN; | ||
2093 | + goto out; | ||
2094 | case -ENOMEM: | ||
2095 | case -NFS4ERR_DENIED: | ||
2096 | /* kill_proc(fl->fl_pid, SIGLOST, 1); */ | ||
2097 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c | ||
2098 | index ae73175..8288b08 100644 | ||
2099 | --- a/fs/nfsd/nfs4proc.c | ||
2100 | +++ b/fs/nfsd/nfs4proc.c | ||
2101 | @@ -931,14 +931,14 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
2102 | nfs4_lock_state(); | ||
2103 | status = nfs4_preprocess_stateid_op(SVC_NET(rqstp), | ||
2104 | cstate, stateid, WR_STATE, &filp); | ||
2105 | - if (filp) | ||
2106 | - get_file(filp); | ||
2107 | - nfs4_unlock_state(); | ||
2108 | - | ||
2109 | if (status) { | ||
2110 | + nfs4_unlock_state(); | ||
2111 | dprintk("NFSD: nfsd4_write: couldn't process stateid!\n"); | ||
2112 | return status; | ||
2113 | } | ||
2114 | + if (filp) | ||
2115 | + get_file(filp); | ||
2116 | + nfs4_unlock_state(); | ||
2117 | |||
2118 | cnt = write->wr_buflen; | ||
2119 | write->wr_how_written = write->wr_stable_how; | ||
2120 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c | ||
2121 | index 2e27430..f9a5e62 100644 | ||
2122 | --- a/fs/nfsd/nfs4state.c | ||
2123 | +++ b/fs/nfsd/nfs4state.c | ||
2124 | @@ -210,13 +210,7 @@ static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag) | ||
2125 | { | ||
2126 | if (atomic_dec_and_test(&fp->fi_access[oflag])) { | ||
2127 | nfs4_file_put_fd(fp, oflag); | ||
2128 | - /* | ||
2129 | - * It's also safe to get rid of the RDWR open *if* | ||
2130 | - * we no longer have need of the other kind of access | ||
2131 | - * or if we already have the other kind of open: | ||
2132 | - */ | ||
2133 | - if (fp->fi_fds[1-oflag] | ||
2134 | - || atomic_read(&fp->fi_access[1 - oflag]) == 0) | ||
2135 | + if (atomic_read(&fp->fi_access[1 - oflag]) == 0) | ||
2136 | nfs4_file_put_fd(fp, O_RDWR); | ||
2137 | } | ||
2138 | } | ||
2139 | @@ -267,7 +261,7 @@ kmem_cache *slab) | ||
2140 | min_stateid = 0; | ||
2141 | return stid; | ||
2142 | out_free: | ||
2143 | - kfree(stid); | ||
2144 | + kmem_cache_free(slab, stid); | ||
2145 | return NULL; | ||
2146 | } | ||
2147 | |||
2148 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
2149 | index a272007..6eb0dc5 100644 | ||
2150 | --- a/fs/nfsd/nfs4xdr.c | ||
2151 | +++ b/fs/nfsd/nfs4xdr.c | ||
2152 | @@ -344,10 +344,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | ||
2153 | all 32 bits of 'nseconds'. */ | ||
2154 | READ_BUF(12); | ||
2155 | len += 12; | ||
2156 | - READ32(dummy32); | ||
2157 | - if (dummy32) | ||
2158 | - return nfserr_inval; | ||
2159 | - READ32(iattr->ia_atime.tv_sec); | ||
2160 | + READ64(iattr->ia_atime.tv_sec); | ||
2161 | READ32(iattr->ia_atime.tv_nsec); | ||
2162 | if (iattr->ia_atime.tv_nsec >= (u32)1000000000) | ||
2163 | return nfserr_inval; | ||
2164 | @@ -370,10 +367,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | ||
2165 | all 32 bits of 'nseconds'. */ | ||
2166 | READ_BUF(12); | ||
2167 | len += 12; | ||
2168 | - READ32(dummy32); | ||
2169 | - if (dummy32) | ||
2170 | - return nfserr_inval; | ||
2171 | - READ32(iattr->ia_mtime.tv_sec); | ||
2172 | + READ64(iattr->ia_mtime.tv_sec); | ||
2173 | READ32(iattr->ia_mtime.tv_nsec); | ||
2174 | if (iattr->ia_mtime.tv_nsec >= (u32)1000000000) | ||
2175 | return nfserr_inval; | ||
2176 | @@ -2401,8 +2395,7 @@ out_acl: | ||
2177 | if (bmval1 & FATTR4_WORD1_TIME_ACCESS) { | ||
2178 | if ((buflen -= 12) < 0) | ||
2179 | goto out_resource; | ||
2180 | - WRITE32(0); | ||
2181 | - WRITE32(stat.atime.tv_sec); | ||
2182 | + WRITE64((s64)stat.atime.tv_sec); | ||
2183 | WRITE32(stat.atime.tv_nsec); | ||
2184 | } | ||
2185 | if (bmval1 & FATTR4_WORD1_TIME_DELTA) { | ||
2186 | @@ -2415,15 +2408,13 @@ out_acl: | ||
2187 | if (bmval1 & FATTR4_WORD1_TIME_METADATA) { | ||
2188 | if ((buflen -= 12) < 0) | ||
2189 | goto out_resource; | ||
2190 | - WRITE32(0); | ||
2191 | - WRITE32(stat.ctime.tv_sec); | ||
2192 | + WRITE64((s64)stat.ctime.tv_sec); | ||
2193 | WRITE32(stat.ctime.tv_nsec); | ||
2194 | } | ||
2195 | if (bmval1 & FATTR4_WORD1_TIME_MODIFY) { | ||
2196 | if ((buflen -= 12) < 0) | ||
2197 | goto out_resource; | ||
2198 | - WRITE32(0); | ||
2199 | - WRITE32(stat.mtime.tv_sec); | ||
2200 | + WRITE64((s64)stat.mtime.tv_sec); | ||
2201 | WRITE32(stat.mtime.tv_nsec); | ||
2202 | } | ||
2203 | if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { | ||
2204 | diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c | ||
2205 | index e0f7c12..5fe21d6 100644 | ||
2206 | --- a/fs/notify/inotify/inotify_user.c | ||
2207 | +++ b/fs/notify/inotify/inotify_user.c | ||
2208 | @@ -572,7 +572,6 @@ static int inotify_update_existing_watch(struct fsnotify_group *group, | ||
2209 | int add = (arg & IN_MASK_ADD); | ||
2210 | int ret; | ||
2211 | |||
2212 | - /* don't allow invalid bits: we don't want flags set */ | ||
2213 | mask = inotify_arg_to_mask(arg); | ||
2214 | |||
2215 | fsn_mark = fsnotify_find_inode_mark(group, inode); | ||
2216 | @@ -623,7 +622,6 @@ static int inotify_new_watch(struct fsnotify_group *group, | ||
2217 | struct idr *idr = &group->inotify_data.idr; | ||
2218 | spinlock_t *idr_lock = &group->inotify_data.idr_lock; | ||
2219 | |||
2220 | - /* don't allow invalid bits: we don't want flags set */ | ||
2221 | mask = inotify_arg_to_mask(arg); | ||
2222 | |||
2223 | tmp_i_mark = kmem_cache_alloc(inotify_inode_mark_cachep, GFP_KERNEL); | ||
2224 | @@ -751,6 +749,10 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname, | ||
2225 | int ret; | ||
2226 | unsigned flags = 0; | ||
2227 | |||
2228 | + /* don't allow invalid bits: we don't want flags set */ | ||
2229 | + if (unlikely(!(mask & ALL_INOTIFY_BITS))) | ||
2230 | + return -EINVAL; | ||
2231 | + | ||
2232 | f = fdget(fd); | ||
2233 | if (unlikely(!f.file)) | ||
2234 | return -EBADF; | ||
2235 | diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c | ||
2236 | index e145126..6f31590 100644 | ||
2237 | --- a/fs/sysfs/dir.c | ||
2238 | +++ b/fs/sysfs/dir.c | ||
2239 | @@ -1012,6 +1012,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) | ||
2240 | enum kobj_ns_type type; | ||
2241 | const void *ns; | ||
2242 | ino_t ino; | ||
2243 | + loff_t off; | ||
2244 | |||
2245 | type = sysfs_ns_type(parent_sd); | ||
2246 | ns = sysfs_info(dentry->d_sb)->ns[type]; | ||
2247 | @@ -1034,6 +1035,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) | ||
2248 | return 0; | ||
2249 | } | ||
2250 | mutex_lock(&sysfs_mutex); | ||
2251 | + off = filp->f_pos; | ||
2252 | for (pos = sysfs_dir_pos(ns, parent_sd, filp->f_pos, pos); | ||
2253 | pos; | ||
2254 | pos = sysfs_dir_next_pos(ns, parent_sd, filp->f_pos, pos)) { | ||
2255 | @@ -1045,19 +1047,24 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) | ||
2256 | len = strlen(name); | ||
2257 | ino = pos->s_ino; | ||
2258 | type = dt_type(pos); | ||
2259 | - filp->f_pos = pos->s_hash; | ||
2260 | + off = filp->f_pos = pos->s_hash; | ||
2261 | filp->private_data = sysfs_get(pos); | ||
2262 | |||
2263 | mutex_unlock(&sysfs_mutex); | ||
2264 | - ret = filldir(dirent, name, len, filp->f_pos, ino, type); | ||
2265 | + ret = filldir(dirent, name, len, off, ino, type); | ||
2266 | mutex_lock(&sysfs_mutex); | ||
2267 | if (ret < 0) | ||
2268 | break; | ||
2269 | } | ||
2270 | mutex_unlock(&sysfs_mutex); | ||
2271 | - if ((filp->f_pos > 1) && !pos) { /* EOF */ | ||
2272 | - filp->f_pos = INT_MAX; | ||
2273 | + | ||
2274 | + /* don't reference last entry if its refcount is dropped */ | ||
2275 | + if (!pos) { | ||
2276 | filp->private_data = NULL; | ||
2277 | + | ||
2278 | + /* EOF and not changed as 0 or 1 in read/write path */ | ||
2279 | + if (off == filp->f_pos && off > 1) | ||
2280 | + filp->f_pos = INT_MAX; | ||
2281 | } | ||
2282 | return 0; | ||
2283 | } | ||
2284 | diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h | ||
2285 | index bfd8768..a59ff51 100644 | ||
2286 | --- a/include/asm-generic/pgtable.h | ||
2287 | +++ b/include/asm-generic/pgtable.h | ||
2288 | @@ -7,6 +7,16 @@ | ||
2289 | #include <linux/mm_types.h> | ||
2290 | #include <linux/bug.h> | ||
2291 | |||
2292 | +/* | ||
2293 | + * On almost all architectures and configurations, 0 can be used as the | ||
2294 | + * upper ceiling to free_pgtables(): on many architectures it has the same | ||
2295 | + * effect as using TASK_SIZE. However, there is one configuration which | ||
2296 | + * must impose a more careful limit, to avoid freeing kernel pgtables. | ||
2297 | + */ | ||
2298 | +#ifndef USER_PGTABLES_CEILING | ||
2299 | +#define USER_PGTABLES_CEILING 0UL | ||
2300 | +#endif | ||
2301 | + | ||
2302 | #ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS | ||
2303 | extern int ptep_set_access_flags(struct vm_area_struct *vma, | ||
2304 | unsigned long address, pte_t *ptep, | ||
2305 | diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h | ||
2306 | index 900af59..16d4d09 100644 | ||
2307 | --- a/include/linux/cgroup.h | ||
2308 | +++ b/include/linux/cgroup.h | ||
2309 | @@ -304,9 +304,6 @@ struct cftype { | ||
2310 | /* CFTYPE_* flags */ | ||
2311 | unsigned int flags; | ||
2312 | |||
2313 | - /* file xattrs */ | ||
2314 | - struct simple_xattrs xattrs; | ||
2315 | - | ||
2316 | int (*open)(struct inode *inode, struct file *file); | ||
2317 | ssize_t (*read)(struct cgroup *cgrp, struct cftype *cft, | ||
2318 | struct file *file, | ||
2319 | diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h | ||
2320 | index ae221a7..c4d870b 100644 | ||
2321 | --- a/include/linux/ipc_namespace.h | ||
2322 | +++ b/include/linux/ipc_namespace.h | ||
2323 | @@ -43,8 +43,8 @@ struct ipc_namespace { | ||
2324 | |||
2325 | size_t shm_ctlmax; | ||
2326 | size_t shm_ctlall; | ||
2327 | + unsigned long shm_tot; | ||
2328 | int shm_ctlmni; | ||
2329 | - int shm_tot; | ||
2330 | /* | ||
2331 | * Defines whether IPC_RMID is forced for _all_ shm segments regardless | ||
2332 | * of shmctl() | ||
2333 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | ||
2334 | index 50e5a5e..f9fe889 100644 | ||
2335 | --- a/include/linux/jbd2.h | ||
2336 | +++ b/include/linux/jbd2.h | ||
2337 | @@ -480,6 +480,7 @@ struct transaction_s | ||
2338 | T_COMMIT, | ||
2339 | T_COMMIT_DFLUSH, | ||
2340 | T_COMMIT_JFLUSH, | ||
2341 | + T_COMMIT_CALLBACK, | ||
2342 | T_FINISHED | ||
2343 | } t_state; | ||
2344 | |||
2345 | @@ -1200,6 +1201,7 @@ int __jbd2_log_start_commit(journal_t *journal, tid_t tid); | ||
2346 | int jbd2_journal_start_commit(journal_t *journal, tid_t *tid); | ||
2347 | int jbd2_journal_force_commit_nested(journal_t *journal); | ||
2348 | int jbd2_log_wait_commit(journal_t *journal, tid_t tid); | ||
2349 | +int jbd2_complete_transaction(journal_t *journal, tid_t tid); | ||
2350 | int jbd2_log_do_checkpoint(journal_t *journal); | ||
2351 | int jbd2_trans_will_send_data_barrier(journal_t *journal, tid_t tid); | ||
2352 | |||
2353 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
2354 | index e692a02..be4e742 100644 | ||
2355 | --- a/include/linux/sched.h | ||
2356 | +++ b/include/linux/sched.h | ||
2357 | @@ -2413,27 +2413,18 @@ static inline void threadgroup_change_end(struct task_struct *tsk) | ||
2358 | * | ||
2359 | * Lock the threadgroup @tsk belongs to. No new task is allowed to enter | ||
2360 | * and member tasks aren't allowed to exit (as indicated by PF_EXITING) or | ||
2361 | - * perform exec. This is useful for cases where the threadgroup needs to | ||
2362 | - * stay stable across blockable operations. | ||
2363 | + * change ->group_leader/pid. This is useful for cases where the threadgroup | ||
2364 | + * needs to stay stable across blockable operations. | ||
2365 | * | ||
2366 | * fork and exit paths explicitly call threadgroup_change_{begin|end}() for | ||
2367 | * synchronization. While held, no new task will be added to threadgroup | ||
2368 | * and no existing live task will have its PF_EXITING set. | ||
2369 | * | ||
2370 | - * During exec, a task goes and puts its thread group through unusual | ||
2371 | - * changes. After de-threading, exclusive access is assumed to resources | ||
2372 | - * which are usually shared by tasks in the same group - e.g. sighand may | ||
2373 | - * be replaced with a new one. Also, the exec'ing task takes over group | ||
2374 | - * leader role including its pid. Exclude these changes while locked by | ||
2375 | - * grabbing cred_guard_mutex which is used to synchronize exec path. | ||
2376 | + * de_thread() does threadgroup_change_{begin|end}() when a non-leader | ||
2377 | + * sub-thread becomes a new leader. | ||
2378 | */ | ||
2379 | static inline void threadgroup_lock(struct task_struct *tsk) | ||
2380 | { | ||
2381 | - /* | ||
2382 | - * exec uses exit for de-threading nesting group_rwsem inside | ||
2383 | - * cred_guard_mutex. Grab cred_guard_mutex first. | ||
2384 | - */ | ||
2385 | - mutex_lock(&tsk->signal->cred_guard_mutex); | ||
2386 | down_write(&tsk->signal->group_rwsem); | ||
2387 | } | ||
2388 | |||
2389 | @@ -2446,7 +2437,6 @@ static inline void threadgroup_lock(struct task_struct *tsk) | ||
2390 | static inline void threadgroup_unlock(struct task_struct *tsk) | ||
2391 | { | ||
2392 | up_write(&tsk->signal->group_rwsem); | ||
2393 | - mutex_unlock(&tsk->signal->cred_guard_mutex); | ||
2394 | } | ||
2395 | #else | ||
2396 | static inline void threadgroup_change_begin(struct task_struct *tsk) {} | ||
2397 | diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h | ||
2398 | index f841ba4..dfb42ca 100644 | ||
2399 | --- a/include/sound/emu10k1.h | ||
2400 | +++ b/include/sound/emu10k1.h | ||
2401 | @@ -1787,6 +1787,7 @@ struct snd_emu10k1 { | ||
2402 | unsigned int next_free_voice; | ||
2403 | |||
2404 | const struct firmware *firmware; | ||
2405 | + const struct firmware *dock_fw; | ||
2406 | |||
2407 | #ifdef CONFIG_PM_SLEEP | ||
2408 | unsigned int *saved_ptr; | ||
2409 | diff --git a/ipc/shm.c b/ipc/shm.c | ||
2410 | index cb858df..8247c49 100644 | ||
2411 | --- a/ipc/shm.c | ||
2412 | +++ b/ipc/shm.c | ||
2413 | @@ -462,7 +462,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) | ||
2414 | size_t size = params->u.size; | ||
2415 | int error; | ||
2416 | struct shmid_kernel *shp; | ||
2417 | - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; | ||
2418 | + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
2419 | struct file * file; | ||
2420 | char name[13]; | ||
2421 | int id; | ||
2422 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
2423 | index a32f943..ba1f977 100644 | ||
2424 | --- a/kernel/cgroup.c | ||
2425 | +++ b/kernel/cgroup.c | ||
2426 | @@ -162,6 +162,9 @@ struct cfent { | ||
2427 | struct list_head node; | ||
2428 | struct dentry *dentry; | ||
2429 | struct cftype *type; | ||
2430 | + | ||
2431 | + /* file xattrs */ | ||
2432 | + struct simple_xattrs xattrs; | ||
2433 | }; | ||
2434 | |||
2435 | /* | ||
2436 | @@ -910,13 +913,12 @@ static void cgroup_diput(struct dentry *dentry, struct inode *inode) | ||
2437 | } else { | ||
2438 | struct cfent *cfe = __d_cfe(dentry); | ||
2439 | struct cgroup *cgrp = dentry->d_parent->d_fsdata; | ||
2440 | - struct cftype *cft = cfe->type; | ||
2441 | |||
2442 | WARN_ONCE(!list_empty(&cfe->node) && | ||
2443 | cgrp != &cgrp->root->top_cgroup, | ||
2444 | "cfe still linked for %s\n", cfe->type->name); | ||
2445 | + simple_xattrs_free(&cfe->xattrs); | ||
2446 | kfree(cfe); | ||
2447 | - simple_xattrs_free(&cft->xattrs); | ||
2448 | } | ||
2449 | iput(inode); | ||
2450 | } | ||
2451 | @@ -2065,7 +2067,7 @@ static int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader) | ||
2452 | if (!group) | ||
2453 | return -ENOMEM; | ||
2454 | /* pre-allocate to guarantee space while iterating in rcu read-side. */ | ||
2455 | - retval = flex_array_prealloc(group, 0, group_size - 1, GFP_KERNEL); | ||
2456 | + retval = flex_array_prealloc(group, 0, group_size, GFP_KERNEL); | ||
2457 | if (retval) | ||
2458 | goto out_free_group_list; | ||
2459 | |||
2460 | @@ -2551,7 +2553,7 @@ static struct simple_xattrs *__d_xattrs(struct dentry *dentry) | ||
2461 | if (S_ISDIR(dentry->d_inode->i_mode)) | ||
2462 | return &__d_cgrp(dentry)->xattrs; | ||
2463 | else | ||
2464 | - return &__d_cft(dentry)->xattrs; | ||
2465 | + return &__d_cfe(dentry)->xattrs; | ||
2466 | } | ||
2467 | |||
2468 | static inline int xattr_enabled(struct dentry *dentry) | ||
2469 | @@ -2727,8 +2729,6 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, | ||
2470 | umode_t mode; | ||
2471 | char name[MAX_CGROUP_TYPE_NAMELEN + MAX_CFTYPE_NAME + 2] = { 0 }; | ||
2472 | |||
2473 | - simple_xattrs_init(&cft->xattrs); | ||
2474 | - | ||
2475 | if (subsys && !test_bit(ROOT_NOPREFIX, &cgrp->root->flags)) { | ||
2476 | strcpy(name, subsys->name); | ||
2477 | strcat(name, "."); | ||
2478 | @@ -2753,6 +2753,7 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, | ||
2479 | cfe->type = (void *)cft; | ||
2480 | cfe->dentry = dentry; | ||
2481 | dentry->d_fsdata = cfe; | ||
2482 | + simple_xattrs_init(&cfe->xattrs); | ||
2483 | list_add_tail(&cfe->node, &parent->files); | ||
2484 | cfe = NULL; | ||
2485 | } | ||
2486 | diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c | ||
2487 | index 14be27f..7ef5556 100644 | ||
2488 | --- a/kernel/hrtimer.c | ||
2489 | +++ b/kernel/hrtimer.c | ||
2490 | @@ -276,6 +276,10 @@ ktime_t ktime_add_ns(const ktime_t kt, u64 nsec) | ||
2491 | } else { | ||
2492 | unsigned long rem = do_div(nsec, NSEC_PER_SEC); | ||
2493 | |||
2494 | + /* Make sure nsec fits into long */ | ||
2495 | + if (unlikely(nsec > KTIME_SEC_MAX)) | ||
2496 | + return (ktime_t){ .tv64 = KTIME_MAX }; | ||
2497 | + | ||
2498 | tmp = ktime_set((long)nsec, rem); | ||
2499 | } | ||
2500 | |||
2501 | @@ -1310,6 +1314,8 @@ retry: | ||
2502 | |||
2503 | expires = ktime_sub(hrtimer_get_expires(timer), | ||
2504 | base->offset); | ||
2505 | + if (expires.tv64 < 0) | ||
2506 | + expires.tv64 = KTIME_MAX; | ||
2507 | if (expires.tv64 < expires_next.tv64) | ||
2508 | expires_next = expires; | ||
2509 | break; | ||
2510 | diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c | ||
2511 | index 0d095dc..93f8e8f 100644 | ||
2512 | --- a/kernel/rcutree_trace.c | ||
2513 | +++ b/kernel/rcutree_trace.c | ||
2514 | @@ -97,7 +97,7 @@ static const struct file_operations rcubarrier_fops = { | ||
2515 | .open = rcubarrier_open, | ||
2516 | .read = seq_read, | ||
2517 | .llseek = no_llseek, | ||
2518 | - .release = seq_release, | ||
2519 | + .release = single_release, | ||
2520 | }; | ||
2521 | |||
2522 | #ifdef CONFIG_RCU_BOOST | ||
2523 | @@ -208,7 +208,7 @@ static const struct file_operations rcuexp_fops = { | ||
2524 | .open = rcuexp_open, | ||
2525 | .read = seq_read, | ||
2526 | .llseek = no_llseek, | ||
2527 | - .release = seq_release, | ||
2528 | + .release = single_release, | ||
2529 | }; | ||
2530 | |||
2531 | #ifdef CONFIG_RCU_BOOST | ||
2532 | @@ -308,7 +308,7 @@ static const struct file_operations rcuhier_fops = { | ||
2533 | .open = rcuhier_open, | ||
2534 | .read = seq_read, | ||
2535 | .llseek = no_llseek, | ||
2536 | - .release = seq_release, | ||
2537 | + .release = single_release, | ||
2538 | }; | ||
2539 | |||
2540 | static void show_one_rcugp(struct seq_file *m, struct rcu_state *rsp) | ||
2541 | @@ -350,7 +350,7 @@ static const struct file_operations rcugp_fops = { | ||
2542 | .open = rcugp_open, | ||
2543 | .read = seq_read, | ||
2544 | .llseek = no_llseek, | ||
2545 | - .release = seq_release, | ||
2546 | + .release = single_release, | ||
2547 | }; | ||
2548 | |||
2549 | static void print_one_rcu_pending(struct seq_file *m, struct rcu_data *rdp) | ||
2550 | diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c | ||
2551 | index 7f32fe0..90ad470 100644 | ||
2552 | --- a/kernel/time/tick-broadcast.c | ||
2553 | +++ b/kernel/time/tick-broadcast.c | ||
2554 | @@ -67,6 +67,8 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc) | ||
2555 | */ | ||
2556 | int tick_check_broadcast_device(struct clock_event_device *dev) | ||
2557 | { | ||
2558 | + struct clock_event_device *cur = tick_broadcast_device.evtdev; | ||
2559 | + | ||
2560 | if ((dev->features & CLOCK_EVT_FEAT_DUMMY) || | ||
2561 | (tick_broadcast_device.evtdev && | ||
2562 | tick_broadcast_device.evtdev->rating >= dev->rating) || | ||
2563 | @@ -74,6 +76,8 @@ int tick_check_broadcast_device(struct clock_event_device *dev) | ||
2564 | return 0; | ||
2565 | |||
2566 | clockevents_exchange_device(tick_broadcast_device.evtdev, dev); | ||
2567 | + if (cur) | ||
2568 | + cur->event_handler = clockevents_handle_noop; | ||
2569 | tick_broadcast_device.evtdev = dev; | ||
2570 | if (!cpumask_empty(tick_get_broadcast_mask())) | ||
2571 | tick_broadcast_start_periodic(dev); | ||
2572 | diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c | ||
2573 | index b1600a6..7076b3f 100644 | ||
2574 | --- a/kernel/time/tick-common.c | ||
2575 | +++ b/kernel/time/tick-common.c | ||
2576 | @@ -323,6 +323,7 @@ static void tick_shutdown(unsigned int *cpup) | ||
2577 | */ | ||
2578 | dev->mode = CLOCK_EVT_MODE_UNUSED; | ||
2579 | clockevents_exchange_device(dev, NULL); | ||
2580 | + dev->event_handler = clockevents_handle_noop; | ||
2581 | td->evtdev = NULL; | ||
2582 | } | ||
2583 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); | ||
2584 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
2585 | index b3fde6d..0a0e2a6 100644 | ||
2586 | --- a/kernel/trace/ftrace.c | ||
2587 | +++ b/kernel/trace/ftrace.c | ||
2588 | @@ -676,7 +676,7 @@ int ftrace_profile_pages_init(struct ftrace_profile_stat *stat) | ||
2589 | |||
2590 | pages = DIV_ROUND_UP(functions, PROFILES_PER_PAGE); | ||
2591 | |||
2592 | - for (i = 0; i < pages; i++) { | ||
2593 | + for (i = 1; i < pages; i++) { | ||
2594 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); | ||
2595 | if (!pg->next) | ||
2596 | goto out_free; | ||
2597 | @@ -3736,7 +3736,8 @@ out: | ||
2598 | if (fail) | ||
2599 | return -EINVAL; | ||
2600 | |||
2601 | - ftrace_graph_filter_enabled = 1; | ||
2602 | + ftrace_graph_filter_enabled = !!(*idx); | ||
2603 | + | ||
2604 | return 0; | ||
2605 | } | ||
2606 | |||
2607 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
2608 | index 66338c4..7713d1b 100644 | ||
2609 | --- a/kernel/trace/trace.c | ||
2610 | +++ b/kernel/trace/trace.c | ||
2611 | @@ -5028,6 +5028,8 @@ static __init int tracer_init_debugfs(void) | ||
2612 | trace_access_lock_init(); | ||
2613 | |||
2614 | d_tracer = tracing_init_dentry(); | ||
2615 | + if (!d_tracer) | ||
2616 | + return 0; | ||
2617 | |||
2618 | trace_create_file("trace_options", 0644, d_tracer, | ||
2619 | NULL, &tracing_iter_fops); | ||
2620 | diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c | ||
2621 | index 83a8b5b..b20428c 100644 | ||
2622 | --- a/kernel/trace/trace_stack.c | ||
2623 | +++ b/kernel/trace/trace_stack.c | ||
2624 | @@ -20,13 +20,24 @@ | ||
2625 | |||
2626 | #define STACK_TRACE_ENTRIES 500 | ||
2627 | |||
2628 | +#ifdef CC_USING_FENTRY | ||
2629 | +# define fentry 1 | ||
2630 | +#else | ||
2631 | +# define fentry 0 | ||
2632 | +#endif | ||
2633 | + | ||
2634 | static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] = | ||
2635 | { [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX }; | ||
2636 | static unsigned stack_dump_index[STACK_TRACE_ENTRIES]; | ||
2637 | |||
2638 | +/* | ||
2639 | + * Reserve one entry for the passed in ip. This will allow | ||
2640 | + * us to remove most or all of the stack size overhead | ||
2641 | + * added by the stack tracer itself. | ||
2642 | + */ | ||
2643 | static struct stack_trace max_stack_trace = { | ||
2644 | - .max_entries = STACK_TRACE_ENTRIES, | ||
2645 | - .entries = stack_dump_trace, | ||
2646 | + .max_entries = STACK_TRACE_ENTRIES - 1, | ||
2647 | + .entries = &stack_dump_trace[1], | ||
2648 | }; | ||
2649 | |||
2650 | static unsigned long max_stack_size; | ||
2651 | @@ -39,25 +50,34 @@ static DEFINE_MUTEX(stack_sysctl_mutex); | ||
2652 | int stack_tracer_enabled; | ||
2653 | static int last_stack_tracer_enabled; | ||
2654 | |||
2655 | -static inline void check_stack(void) | ||
2656 | +static inline void | ||
2657 | +check_stack(unsigned long ip, unsigned long *stack) | ||
2658 | { | ||
2659 | unsigned long this_size, flags; | ||
2660 | unsigned long *p, *top, *start; | ||
2661 | + static int tracer_frame; | ||
2662 | + int frame_size = ACCESS_ONCE(tracer_frame); | ||
2663 | int i; | ||
2664 | |||
2665 | - this_size = ((unsigned long)&this_size) & (THREAD_SIZE-1); | ||
2666 | + this_size = ((unsigned long)stack) & (THREAD_SIZE-1); | ||
2667 | this_size = THREAD_SIZE - this_size; | ||
2668 | + /* Remove the frame of the tracer */ | ||
2669 | + this_size -= frame_size; | ||
2670 | |||
2671 | if (this_size <= max_stack_size) | ||
2672 | return; | ||
2673 | |||
2674 | /* we do not handle interrupt stacks yet */ | ||
2675 | - if (!object_is_on_stack(&this_size)) | ||
2676 | + if (!object_is_on_stack(stack)) | ||
2677 | return; | ||
2678 | |||
2679 | local_irq_save(flags); | ||
2680 | arch_spin_lock(&max_stack_lock); | ||
2681 | |||
2682 | + /* In case another CPU set the tracer_frame on us */ | ||
2683 | + if (unlikely(!frame_size)) | ||
2684 | + this_size -= tracer_frame; | ||
2685 | + | ||
2686 | /* a race could have already updated it */ | ||
2687 | if (this_size <= max_stack_size) | ||
2688 | goto out; | ||
2689 | @@ -70,10 +90,18 @@ static inline void check_stack(void) | ||
2690 | save_stack_trace(&max_stack_trace); | ||
2691 | |||
2692 | /* | ||
2693 | + * Add the passed in ip from the function tracer. | ||
2694 | + * Searching for this on the stack will skip over | ||
2695 | + * most of the overhead from the stack tracer itself. | ||
2696 | + */ | ||
2697 | + stack_dump_trace[0] = ip; | ||
2698 | + max_stack_trace.nr_entries++; | ||
2699 | + | ||
2700 | + /* | ||
2701 | * Now find where in the stack these are. | ||
2702 | */ | ||
2703 | i = 0; | ||
2704 | - start = &this_size; | ||
2705 | + start = stack; | ||
2706 | top = (unsigned long *) | ||
2707 | (((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE); | ||
2708 | |||
2709 | @@ -97,6 +125,18 @@ static inline void check_stack(void) | ||
2710 | found = 1; | ||
2711 | /* Start the search from here */ | ||
2712 | start = p + 1; | ||
2713 | + /* | ||
2714 | + * We do not want to show the overhead | ||
2715 | + * of the stack tracer stack in the | ||
2716 | + * max stack. If we haven't figured | ||
2717 | + * out what that is, then figure it out | ||
2718 | + * now. | ||
2719 | + */ | ||
2720 | + if (unlikely(!tracer_frame) && i == 1) { | ||
2721 | + tracer_frame = (p - stack) * | ||
2722 | + sizeof(unsigned long); | ||
2723 | + max_stack_size -= tracer_frame; | ||
2724 | + } | ||
2725 | } | ||
2726 | } | ||
2727 | |||
2728 | @@ -113,6 +153,7 @@ static void | ||
2729 | stack_trace_call(unsigned long ip, unsigned long parent_ip, | ||
2730 | struct ftrace_ops *op, struct pt_regs *pt_regs) | ||
2731 | { | ||
2732 | + unsigned long stack; | ||
2733 | int cpu; | ||
2734 | |||
2735 | preempt_disable_notrace(); | ||
2736 | @@ -122,7 +163,26 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip, | ||
2737 | if (per_cpu(trace_active, cpu)++ != 0) | ||
2738 | goto out; | ||
2739 | |||
2740 | - check_stack(); | ||
2741 | + /* | ||
2742 | + * When fentry is used, the traced function does not get | ||
2743 | + * its stack frame set up, and we lose the parent. | ||
2744 | + * The ip is pretty useless because the function tracer | ||
2745 | + * was called before that function set up its stack frame. | ||
2746 | + * In this case, we use the parent ip. | ||
2747 | + * | ||
2748 | + * By adding the return address of either the parent ip | ||
2749 | + * or the current ip we can disregard most of the stack usage | ||
2750 | + * caused by the stack tracer itself. | ||
2751 | + * | ||
2752 | + * The function tracer always reports the address of where the | ||
2753 | + * mcount call was, but the stack will hold the return address. | ||
2754 | + */ | ||
2755 | + if (fentry) | ||
2756 | + ip = parent_ip; | ||
2757 | + else | ||
2758 | + ip += MCOUNT_INSN_SIZE; | ||
2759 | + | ||
2760 | + check_stack(ip, &stack); | ||
2761 | |||
2762 | out: | ||
2763 | per_cpu(trace_active, cpu)--; | ||
2764 | @@ -371,6 +431,8 @@ static __init int stack_trace_init(void) | ||
2765 | struct dentry *d_tracer; | ||
2766 | |||
2767 | d_tracer = tracing_init_dentry(); | ||
2768 | + if (!d_tracer) | ||
2769 | + return 0; | ||
2770 | |||
2771 | trace_create_file("stack_max_size", 0644, d_tracer, | ||
2772 | &max_stack_size, &stack_max_size_fops); | ||
2773 | diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c | ||
2774 | index 96cffb2..847f88a 100644 | ||
2775 | --- a/kernel/trace/trace_stat.c | ||
2776 | +++ b/kernel/trace/trace_stat.c | ||
2777 | @@ -307,6 +307,8 @@ static int tracing_stat_init(void) | ||
2778 | struct dentry *d_tracing; | ||
2779 | |||
2780 | d_tracing = tracing_init_dentry(); | ||
2781 | + if (!d_tracing) | ||
2782 | + return 0; | ||
2783 | |||
2784 | stat_dir = debugfs_create_dir("trace_stat", d_tracing); | ||
2785 | if (!stat_dir) | ||
2786 | diff --git a/lib/oid_registry.c b/lib/oid_registry.c | ||
2787 | index d8de11f..318f382 100644 | ||
2788 | --- a/lib/oid_registry.c | ||
2789 | +++ b/lib/oid_registry.c | ||
2790 | @@ -9,6 +9,7 @@ | ||
2791 | * 2 of the Licence, or (at your option) any later version. | ||
2792 | */ | ||
2793 | |||
2794 | +#include <linux/module.h> | ||
2795 | #include <linux/export.h> | ||
2796 | #include <linux/oid_registry.h> | ||
2797 | #include <linux/kernel.h> | ||
2798 | @@ -16,6 +17,10 @@ | ||
2799 | #include <linux/bug.h> | ||
2800 | #include "oid_registry_data.c" | ||
2801 | |||
2802 | +MODULE_DESCRIPTION("OID Registry"); | ||
2803 | +MODULE_AUTHOR("Red Hat, Inc."); | ||
2804 | +MODULE_LICENSE("GPL"); | ||
2805 | + | ||
2806 | /** | ||
2807 | * look_up_OID - Find an OID registration for the specified data | ||
2808 | * @data: Binary representation of the OID | ||
2809 | diff --git a/mm/mmap.c b/mm/mmap.c | ||
2810 | index 0db0de1..033094b 100644 | ||
2811 | --- a/mm/mmap.c | ||
2812 | +++ b/mm/mmap.c | ||
2813 | @@ -2305,7 +2305,7 @@ static void unmap_region(struct mm_struct *mm, | ||
2814 | update_hiwater_rss(mm); | ||
2815 | unmap_vmas(&tlb, vma, start, end); | ||
2816 | free_pgtables(&tlb, vma, prev ? prev->vm_end : FIRST_USER_ADDRESS, | ||
2817 | - next ? next->vm_start : 0); | ||
2818 | + next ? next->vm_start : USER_PGTABLES_CEILING); | ||
2819 | tlb_finish_mmu(&tlb, start, end); | ||
2820 | } | ||
2821 | |||
2822 | @@ -2685,7 +2685,7 @@ void exit_mmap(struct mm_struct *mm) | ||
2823 | /* Use -1 here to ensure all VMAs in the mm are unmapped */ | ||
2824 | unmap_vmas(&tlb, vma, 0, -1); | ||
2825 | |||
2826 | - free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0); | ||
2827 | + free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, USER_PGTABLES_CEILING); | ||
2828 | tlb_finish_mmu(&tlb, 0, -1); | ||
2829 | |||
2830 | /* | ||
2831 | diff --git a/mm/page_io.c b/mm/page_io.c | ||
2832 | index 78eee32..6182870 100644 | ||
2833 | --- a/mm/page_io.c | ||
2834 | +++ b/mm/page_io.c | ||
2835 | @@ -214,6 +214,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) | ||
2836 | kiocb.ki_left = PAGE_SIZE; | ||
2837 | kiocb.ki_nbytes = PAGE_SIZE; | ||
2838 | |||
2839 | + set_page_writeback(page); | ||
2840 | unlock_page(page); | ||
2841 | ret = mapping->a_ops->direct_IO(KERNEL_WRITE, | ||
2842 | &kiocb, &iov, | ||
2843 | @@ -222,7 +223,23 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) | ||
2844 | if (ret == PAGE_SIZE) { | ||
2845 | count_vm_event(PSWPOUT); | ||
2846 | ret = 0; | ||
2847 | + } else { | ||
2848 | + /* | ||
2849 | + * In the case of swap-over-nfs, this can be a | ||
2850 | + * temporary failure if the system has limited | ||
2851 | + * memory for allocating transmit buffers. | ||
2852 | + * Mark the page dirty and avoid | ||
2853 | + * rotate_reclaimable_page but rate-limit the | ||
2854 | + * messages but do not flag PageError like | ||
2855 | + * the normal direct-to-bio case as it could | ||
2856 | + * be temporary. | ||
2857 | + */ | ||
2858 | + set_page_dirty(page); | ||
2859 | + ClearPageReclaim(page); | ||
2860 | + pr_err_ratelimited("Write error on dio swapfile (%Lu)\n", | ||
2861 | + page_file_offset(page)); | ||
2862 | } | ||
2863 | + end_page_writeback(page); | ||
2864 | return ret; | ||
2865 | } | ||
2866 | |||
2867 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c | ||
2868 | index a689360..843d8c4 100644 | ||
2869 | --- a/net/mac80211/cfg.c | ||
2870 | +++ b/net/mac80211/cfg.c | ||
2871 | @@ -1034,6 +1034,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) | ||
2872 | list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) | ||
2873 | sta_info_flush_defer(vlan); | ||
2874 | sta_info_flush_defer(sdata); | ||
2875 | + synchronize_net(); | ||
2876 | rcu_barrier(); | ||
2877 | list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) | ||
2878 | sta_info_flush_cleanup(vlan); | ||
2879 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c | ||
2880 | index 9ed49ad..d51ca9d 100644 | ||
2881 | --- a/net/mac80211/iface.c | ||
2882 | +++ b/net/mac80211/iface.c | ||
2883 | @@ -844,11 +844,12 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | ||
2884 | * | ||
2885 | * sta_info_flush_cleanup() requires rcu_barrier() | ||
2886 | * first to wait for the station call_rcu() calls | ||
2887 | - * to complete, here we need at least sychronize_rcu() | ||
2888 | - * it to wait for the RX path in case it is using the | ||
2889 | + * to complete, and we also need synchronize_rcu() | ||
2890 | + * to wait for the RX path in case it is using the | ||
2891 | * interface and enqueuing frames at this very time on | ||
2892 | * another CPU. | ||
2893 | */ | ||
2894 | + synchronize_rcu(); | ||
2895 | rcu_barrier(); | ||
2896 | sta_info_flush_cleanup(sdata); | ||
2897 | |||
2898 | diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c | ||
2899 | index d0275f3..835584c 100644 | ||
2900 | --- a/net/mac80211/pm.c | ||
2901 | +++ b/net/mac80211/pm.c | ||
2902 | @@ -53,8 +53,9 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | ||
2903 | ieee80211_stop_queues_by_reason(hw, | ||
2904 | IEEE80211_QUEUE_STOP_REASON_SUSPEND); | ||
2905 | |||
2906 | - /* flush out all packets */ | ||
2907 | + /* flush out all packets and station cleanup call_rcu()s */ | ||
2908 | synchronize_net(); | ||
2909 | + rcu_barrier(); | ||
2910 | |||
2911 | drv_flush(local, false); | ||
2912 | |||
2913 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c | ||
2914 | index 98532c00..6dee0ad 100644 | ||
2915 | --- a/net/wireless/reg.c | ||
2916 | +++ b/net/wireless/reg.c | ||
2917 | @@ -855,7 +855,7 @@ static void handle_channel(struct wiphy *wiphy, | ||
2918 | return; | ||
2919 | |||
2920 | REG_DBG_PRINT("Disabling freq %d MHz\n", chan->center_freq); | ||
2921 | - chan->flags = IEEE80211_CHAN_DISABLED; | ||
2922 | + chan->flags |= IEEE80211_CHAN_DISABLED; | ||
2923 | return; | ||
2924 | } | ||
2925 | |||
2926 | diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl | ||
2927 | index 3368939..68b85e1 100644 | ||
2928 | --- a/scripts/kconfig/streamline_config.pl | ||
2929 | +++ b/scripts/kconfig/streamline_config.pl | ||
2930 | @@ -156,7 +156,6 @@ sub read_kconfig { | ||
2931 | |||
2932 | my $state = "NONE"; | ||
2933 | my $config; | ||
2934 | - my @kconfigs; | ||
2935 | |||
2936 | my $cont = 0; | ||
2937 | my $line; | ||
2938 | @@ -190,7 +189,13 @@ sub read_kconfig { | ||
2939 | |||
2940 | # collect any Kconfig sources | ||
2941 | if (/^source\s*"(.*)"/) { | ||
2942 | - $kconfigs[$#kconfigs+1] = $1; | ||
2943 | + my $kconfig = $1; | ||
2944 | + # prevent reading twice. | ||
2945 | + if (!defined($read_kconfigs{$kconfig})) { | ||
2946 | + $read_kconfigs{$kconfig} = 1; | ||
2947 | + read_kconfig($kconfig); | ||
2948 | + } | ||
2949 | + next; | ||
2950 | } | ||
2951 | |||
2952 | # configs found | ||
2953 | @@ -250,14 +255,6 @@ sub read_kconfig { | ||
2954 | } | ||
2955 | } | ||
2956 | close($kinfile); | ||
2957 | - | ||
2958 | - # read in any configs that were found. | ||
2959 | - foreach my $kconfig (@kconfigs) { | ||
2960 | - if (!defined($read_kconfigs{$kconfig})) { | ||
2961 | - $read_kconfigs{$kconfig} = 1; | ||
2962 | - read_kconfig($kconfig); | ||
2963 | - } | ||
2964 | - } | ||
2965 | } | ||
2966 | |||
2967 | if ($kconfig) { | ||
2968 | diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c | ||
2969 | index e6b0166..bdd888e 100644 | ||
2970 | --- a/sound/pci/emu10k1/emu10k1_main.c | ||
2971 | +++ b/sound/pci/emu10k1/emu10k1_main.c | ||
2972 | @@ -657,14 +657,14 @@ static int snd_emu10k1_cardbus_init(struct snd_emu10k1 *emu) | ||
2973 | return 0; | ||
2974 | } | ||
2975 | |||
2976 | -static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu) | ||
2977 | +static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, | ||
2978 | + const struct firmware *fw_entry) | ||
2979 | { | ||
2980 | int n, i; | ||
2981 | int reg; | ||
2982 | int value; | ||
2983 | unsigned int write_post; | ||
2984 | unsigned long flags; | ||
2985 | - const struct firmware *fw_entry = emu->firmware; | ||
2986 | |||
2987 | if (!fw_entry) | ||
2988 | return -EIO; | ||
2989 | @@ -725,9 +725,34 @@ static int emu1010_firmware_thread(void *data) | ||
2990 | /* Return to Audio Dock programming mode */ | ||
2991 | snd_printk(KERN_INFO "emu1010: Loading Audio Dock Firmware\n"); | ||
2992 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, EMU_HANA_FPGA_CONFIG_AUDIODOCK); | ||
2993 | - err = snd_emu1010_load_firmware(emu); | ||
2994 | - if (err != 0) | ||
2995 | - continue; | ||
2996 | + | ||
2997 | + if (!emu->dock_fw) { | ||
2998 | + const char *filename = NULL; | ||
2999 | + switch (emu->card_capabilities->emu_model) { | ||
3000 | + case EMU_MODEL_EMU1010: | ||
3001 | + filename = DOCK_FILENAME; | ||
3002 | + break; | ||
3003 | + case EMU_MODEL_EMU1010B: | ||
3004 | + filename = MICRO_DOCK_FILENAME; | ||
3005 | + break; | ||
3006 | + case EMU_MODEL_EMU1616: | ||
3007 | + filename = MICRO_DOCK_FILENAME; | ||
3008 | + break; | ||
3009 | + } | ||
3010 | + if (filename) { | ||
3011 | + err = request_firmware(&emu->dock_fw, | ||
3012 | + filename, | ||
3013 | + &emu->pci->dev); | ||
3014 | + if (err) | ||
3015 | + continue; | ||
3016 | + } | ||
3017 | + } | ||
3018 | + | ||
3019 | + if (emu->dock_fw) { | ||
3020 | + err = snd_emu1010_load_firmware(emu, emu->dock_fw); | ||
3021 | + if (err) | ||
3022 | + continue; | ||
3023 | + } | ||
3024 | |||
3025 | snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0); | ||
3026 | snd_emu1010_fpga_read(emu, EMU_HANA_IRQ_STATUS, ®); | ||
3027 | @@ -862,7 +887,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu) | ||
3028 | filename, emu->firmware->size); | ||
3029 | } | ||
3030 | |||
3031 | - err = snd_emu1010_load_firmware(emu); | ||
3032 | + err = snd_emu1010_load_firmware(emu, emu->firmware); | ||
3033 | if (err != 0) { | ||
3034 | snd_printk(KERN_INFO "emu1010: Loading Firmware failed\n"); | ||
3035 | return err; | ||
3036 | @@ -1253,6 +1278,8 @@ static int snd_emu10k1_free(struct snd_emu10k1 *emu) | ||
3037 | kthread_stop(emu->emu1010.firmware_thread); | ||
3038 | if (emu->firmware) | ||
3039 | release_firmware(emu->firmware); | ||
3040 | + if (emu->dock_fw) | ||
3041 | + release_firmware(emu->dock_fw); | ||
3042 | if (emu->irq >= 0) | ||
3043 | free_irq(emu->irq, emu); | ||
3044 | /* remove reserved page */ | ||
3045 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c | ||
3046 | index 2dbe767..d74500b 100644 | ||
3047 | --- a/sound/pci/hda/hda_generic.c | ||
3048 | +++ b/sound/pci/hda/hda_generic.c | ||
3049 | @@ -2072,6 +2072,14 @@ get_multiio_path(struct hda_codec *codec, int idx) | ||
3050 | |||
3051 | static void update_automute_all(struct hda_codec *codec); | ||
3052 | |||
3053 | +/* Default value to be passed as aamix argument for snd_hda_activate_path(); | ||
3054 | + * used for output paths | ||
3055 | + */ | ||
3056 | +static bool aamix_default(struct hda_gen_spec *spec) | ||
3057 | +{ | ||
3058 | + return !spec->have_aamix_ctl || spec->aamix_mode; | ||
3059 | +} | ||
3060 | + | ||
3061 | static int set_multi_io(struct hda_codec *codec, int idx, bool output) | ||
3062 | { | ||
3063 | struct hda_gen_spec *spec = codec->spec; | ||
3064 | @@ -2087,11 +2095,11 @@ static int set_multi_io(struct hda_codec *codec, int idx, bool output) | ||
3065 | |||
3066 | if (output) { | ||
3067 | set_pin_target(codec, nid, PIN_OUT, true); | ||
3068 | - snd_hda_activate_path(codec, path, true, true); | ||
3069 | + snd_hda_activate_path(codec, path, true, aamix_default(spec)); | ||
3070 | set_pin_eapd(codec, nid, true); | ||
3071 | } else { | ||
3072 | set_pin_eapd(codec, nid, false); | ||
3073 | - snd_hda_activate_path(codec, path, false, true); | ||
3074 | + snd_hda_activate_path(codec, path, false, aamix_default(spec)); | ||
3075 | set_pin_target(codec, nid, spec->multi_io[idx].ctl_in, true); | ||
3076 | path_power_down_sync(codec, path); | ||
3077 | } | ||
3078 | @@ -2182,8 +2190,8 @@ static void update_aamix_paths(struct hda_codec *codec, bool do_mix, | ||
3079 | snd_hda_activate_path(codec, mix_path, true, true); | ||
3080 | path_power_down_sync(codec, nomix_path); | ||
3081 | } else { | ||
3082 | - snd_hda_activate_path(codec, mix_path, false, true); | ||
3083 | - snd_hda_activate_path(codec, nomix_path, true, true); | ||
3084 | + snd_hda_activate_path(codec, mix_path, false, false); | ||
3085 | + snd_hda_activate_path(codec, nomix_path, true, false); | ||
3086 | path_power_down_sync(codec, mix_path); | ||
3087 | } | ||
3088 | } | ||
3089 | @@ -4729,7 +4737,8 @@ static void set_output_and_unmute(struct hda_codec *codec, int path_idx) | ||
3090 | return; | ||
3091 | pin = path->path[path->depth - 1]; | ||
3092 | restore_pin_ctl(codec, pin); | ||
3093 | - snd_hda_activate_path(codec, path, path->active, true); | ||
3094 | + snd_hda_activate_path(codec, path, path->active, | ||
3095 | + aamix_default(codec->spec)); | ||
3096 | set_pin_eapd(codec, pin, path->active); | ||
3097 | } | ||
3098 | |||
3099 | @@ -4779,7 +4788,8 @@ static void init_multi_io(struct hda_codec *codec) | ||
3100 | if (!spec->multi_io[i].ctl_in) | ||
3101 | spec->multi_io[i].ctl_in = | ||
3102 | snd_hda_codec_get_pin_target(codec, pin); | ||
3103 | - snd_hda_activate_path(codec, path, path->active, true); | ||
3104 | + snd_hda_activate_path(codec, path, path->active, | ||
3105 | + aamix_default(spec)); | ||
3106 | } | ||
3107 | } | ||
3108 | |||
3109 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
3110 | index f15c36b..fd1970c 100644 | ||
3111 | --- a/sound/pci/hda/patch_realtek.c | ||
3112 | +++ b/sound/pci/hda/patch_realtek.c | ||
3113 | @@ -2515,6 +2515,7 @@ enum { | ||
3114 | ALC269_TYPE_ALC280, | ||
3115 | ALC269_TYPE_ALC282, | ||
3116 | ALC269_TYPE_ALC284, | ||
3117 | + ALC269_TYPE_ALC286, | ||
3118 | }; | ||
3119 | |||
3120 | /* | ||
3121 | @@ -2538,6 +2539,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | ||
3122 | case ALC269_TYPE_ALC269VB: | ||
3123 | case ALC269_TYPE_ALC269VD: | ||
3124 | case ALC269_TYPE_ALC282: | ||
3125 | + case ALC269_TYPE_ALC286: | ||
3126 | ssids = alc269_ssids; | ||
3127 | break; | ||
3128 | default: | ||
3129 | @@ -3172,6 +3174,9 @@ static int patch_alc269(struct hda_codec *codec) | ||
3130 | case 0x10ec0292: | ||
3131 | spec->codec_variant = ALC269_TYPE_ALC284; | ||
3132 | break; | ||
3133 | + case 0x10ec0286: | ||
3134 | + spec->codec_variant = ALC269_TYPE_ALC286; | ||
3135 | + break; | ||
3136 | } | ||
3137 | |||
3138 | /* automatic parse from the BIOS config */ | ||
3139 | @@ -3878,6 +3883,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { | ||
3140 | { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, | ||
3141 | { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, | ||
3142 | { .id = 0x10ec0284, .name = "ALC284", .patch = patch_alc269 }, | ||
3143 | + { .id = 0x10ec0286, .name = "ALC286", .patch = patch_alc269 }, | ||
3144 | { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, | ||
3145 | { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, | ||
3146 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", | ||
3147 | diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c | ||
3148 | index a4c16fd..5d36319 100644 | ||
3149 | --- a/sound/soc/codecs/max98088.c | ||
3150 | +++ b/sound/soc/codecs/max98088.c | ||
3151 | @@ -2006,7 +2006,7 @@ static int max98088_probe(struct snd_soc_codec *codec) | ||
3152 | ret); | ||
3153 | goto err_access; | ||
3154 | } | ||
3155 | - dev_info(codec->dev, "revision %c\n", ret + 'A'); | ||
3156 | + dev_info(codec->dev, "revision %c\n", ret - 0x40 + 'A'); | ||
3157 | |||
3158 | snd_soc_write(codec, M98088_REG_51_PWR_SYS, M98088_PWRSV); | ||
3159 | |||
3160 | diff --git a/sound/usb/6fire/pcm.c b/sound/usb/6fire/pcm.c | ||
3161 | index e2ca12f..40dd50a 100644 | ||
3162 | --- a/sound/usb/6fire/pcm.c | ||
3163 | +++ b/sound/usb/6fire/pcm.c | ||
3164 | @@ -575,7 +575,6 @@ static void usb6fire_pcm_init_urb(struct pcm_urb *urb, | ||
3165 | urb->instance.pipe = in ? usb_rcvisocpipe(chip->dev, ep) | ||
3166 | : usb_sndisocpipe(chip->dev, ep); | ||
3167 | urb->instance.interval = 1; | ||
3168 | - urb->instance.transfer_flags = URB_ISO_ASAP; | ||
3169 | urb->instance.complete = handler; | ||
3170 | urb->instance.context = urb; | ||
3171 | urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB; | ||
3172 | diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c | ||
3173 | index fde9a7a..b45e29b 100644 | ||
3174 | --- a/sound/usb/caiaq/audio.c | ||
3175 | +++ b/sound/usb/caiaq/audio.c | ||
3176 | @@ -670,7 +670,6 @@ static void read_completed(struct urb *urb) | ||
3177 | |||
3178 | if (send_it) { | ||
3179 | out->number_of_packets = outframe; | ||
3180 | - out->transfer_flags = URB_ISO_ASAP; | ||
3181 | usb_submit_urb(out, GFP_ATOMIC); | ||
3182 | } else { | ||
3183 | struct snd_usb_caiaq_cb_info *oinfo = out->context; | ||
3184 | @@ -686,7 +685,6 @@ requeue: | ||
3185 | } | ||
3186 | |||
3187 | urb->number_of_packets = FRAMES_PER_URB; | ||
3188 | - urb->transfer_flags = URB_ISO_ASAP; | ||
3189 | usb_submit_urb(urb, GFP_ATOMIC); | ||
3190 | } | ||
3191 | |||
3192 | @@ -751,7 +749,6 @@ static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret) | ||
3193 | * BYTES_PER_FRAME; | ||
3194 | urbs[i]->context = &dev->data_cb_info[i]; | ||
3195 | urbs[i]->interval = 1; | ||
3196 | - urbs[i]->transfer_flags = URB_ISO_ASAP; | ||
3197 | urbs[i]->number_of_packets = FRAMES_PER_URB; | ||
3198 | urbs[i]->complete = (dir == SNDRV_PCM_STREAM_CAPTURE) ? | ||
3199 | read_completed : write_completed; | ||
3200 | diff --git a/sound/usb/card.c b/sound/usb/card.c | ||
3201 | index 2da8ad7..b79b7dc 100644 | ||
3202 | --- a/sound/usb/card.c | ||
3203 | +++ b/sound/usb/card.c | ||
3204 | @@ -627,7 +627,9 @@ int snd_usb_autoresume(struct snd_usb_audio *chip) | ||
3205 | int err = -ENODEV; | ||
3206 | |||
3207 | down_read(&chip->shutdown_rwsem); | ||
3208 | - if (!chip->shutdown && !chip->probing) | ||
3209 | + if (chip->probing) | ||
3210 | + err = 0; | ||
3211 | + else if (!chip->shutdown) | ||
3212 | err = usb_autopm_get_interface(chip->pm_intf); | ||
3213 | up_read(&chip->shutdown_rwsem); | ||
3214 | |||
3215 | diff --git a/sound/usb/card.h b/sound/usb/card.h | ||
3216 | index 8a751b4..d32ea41 100644 | ||
3217 | --- a/sound/usb/card.h | ||
3218 | +++ b/sound/usb/card.h | ||
3219 | @@ -116,6 +116,7 @@ struct snd_usb_substream { | ||
3220 | unsigned int altset_idx; /* USB data format: index of alternate setting */ | ||
3221 | unsigned int txfr_quirk:1; /* allow sub-frame alignment */ | ||
3222 | unsigned int fmt_type; /* USB audio format type (1-3) */ | ||
3223 | + unsigned int pkt_offset_adj; /* Bytes to drop from beginning of packets (for non-compliant devices) */ | ||
3224 | |||
3225 | unsigned int running: 1; /* running status */ | ||
3226 | |||
3227 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c | ||
3228 | index 21049b8..63cca3a 100644 | ||
3229 | --- a/sound/usb/endpoint.c | ||
3230 | +++ b/sound/usb/endpoint.c | ||
3231 | @@ -677,7 +677,7 @@ static int data_ep_set_params(struct snd_usb_endpoint *ep, | ||
3232 | if (!u->urb->transfer_buffer) | ||
3233 | goto out_of_memory; | ||
3234 | u->urb->pipe = ep->pipe; | ||
3235 | - u->urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; | ||
3236 | + u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; | ||
3237 | u->urb->interval = 1 << ep->datainterval; | ||
3238 | u->urb->context = u; | ||
3239 | u->urb->complete = snd_complete_urb; | ||
3240 | @@ -716,8 +716,7 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep, | ||
3241 | u->urb->transfer_dma = ep->sync_dma + i * 4; | ||
3242 | u->urb->transfer_buffer_length = 4; | ||
3243 | u->urb->pipe = ep->pipe; | ||
3244 | - u->urb->transfer_flags = URB_ISO_ASAP | | ||
3245 | - URB_NO_TRANSFER_DMA_MAP; | ||
3246 | + u->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; | ||
3247 | u->urb->number_of_packets = 1; | ||
3248 | u->urb->interval = 1 << ep->syncinterval; | ||
3249 | u->urb->context = u; | ||
3250 | diff --git a/sound/usb/midi.c b/sound/usb/midi.c | ||
3251 | index 34b9bb7..e5fee18 100644 | ||
3252 | --- a/sound/usb/midi.c | ||
3253 | +++ b/sound/usb/midi.c | ||
3254 | @@ -126,7 +126,6 @@ struct snd_usb_midi { | ||
3255 | struct snd_usb_midi_in_endpoint *in; | ||
3256 | } endpoints[MIDI_MAX_ENDPOINTS]; | ||
3257 | unsigned long input_triggered; | ||
3258 | - bool autopm_reference; | ||
3259 | unsigned int opened[2]; | ||
3260 | unsigned char disconnected; | ||
3261 | unsigned char input_running; | ||
3262 | @@ -1040,7 +1039,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, | ||
3263 | { | ||
3264 | struct snd_usb_midi* umidi = substream->rmidi->private_data; | ||
3265 | struct snd_kcontrol *ctl; | ||
3266 | - int err; | ||
3267 | |||
3268 | down_read(&umidi->disc_rwsem); | ||
3269 | if (umidi->disconnected) { | ||
3270 | @@ -1051,13 +1049,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, | ||
3271 | mutex_lock(&umidi->mutex); | ||
3272 | if (open) { | ||
3273 | if (!umidi->opened[0] && !umidi->opened[1]) { | ||
3274 | - err = usb_autopm_get_interface(umidi->iface); | ||
3275 | - umidi->autopm_reference = err >= 0; | ||
3276 | - if (err < 0 && err != -EACCES) { | ||
3277 | - mutex_unlock(&umidi->mutex); | ||
3278 | - up_read(&umidi->disc_rwsem); | ||
3279 | - return -EIO; | ||
3280 | - } | ||
3281 | if (umidi->roland_load_ctl) { | ||
3282 | ctl = umidi->roland_load_ctl; | ||
3283 | ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; | ||
3284 | @@ -1080,8 +1071,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, | ||
3285 | snd_ctl_notify(umidi->card, | ||
3286 | SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); | ||
3287 | } | ||
3288 | - if (umidi->autopm_reference) | ||
3289 | - usb_autopm_put_interface(umidi->iface); | ||
3290 | } | ||
3291 | } | ||
3292 | mutex_unlock(&umidi->mutex); | ||
3293 | @@ -2256,6 +2245,8 @@ int snd_usbmidi_create(struct snd_card *card, | ||
3294 | return err; | ||
3295 | } | ||
3296 | |||
3297 | + usb_autopm_get_interface_no_resume(umidi->iface); | ||
3298 | + | ||
3299 | list_add_tail(&umidi->list, midi_list); | ||
3300 | return 0; | ||
3301 | } | ||
3302 | diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c | ||
3303 | index 8b81cb5..6ad617b 100644 | ||
3304 | --- a/sound/usb/misc/ua101.c | ||
3305 | +++ b/sound/usb/misc/ua101.c | ||
3306 | @@ -1120,8 +1120,7 @@ static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream, | ||
3307 | usb_init_urb(&urb->urb); | ||
3308 | urb->urb.dev = ua->dev; | ||
3309 | urb->urb.pipe = stream->usb_pipe; | ||
3310 | - urb->urb.transfer_flags = URB_ISO_ASAP | | ||
3311 | - URB_NO_TRANSFER_DMA_MAP; | ||
3312 | + urb->urb.transfer_flags = URB_NO_TRANSFER_DMA_MAP; | ||
3313 | urb->urb.transfer_buffer = addr; | ||
3314 | urb->urb.transfer_dma = dma; | ||
3315 | urb->urb.transfer_buffer_length = max_packet_size; | ||
3316 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c | ||
3317 | index f94397b..a481fea 100644 | ||
3318 | --- a/sound/usb/pcm.c | ||
3319 | +++ b/sound/usb/pcm.c | ||
3320 | @@ -1170,7 +1170,7 @@ static void retire_capture_urb(struct snd_usb_substream *subs, | ||
3321 | stride = runtime->frame_bits >> 3; | ||
3322 | |||
3323 | for (i = 0; i < urb->number_of_packets; i++) { | ||
3324 | - cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset; | ||
3325 | + cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj; | ||
3326 | if (urb->iso_frame_desc[i].status && printk_ratelimit()) { | ||
3327 | snd_printdd(KERN_ERR "frame %d active: %d\n", i, urb->iso_frame_desc[i].status); | ||
3328 | // continue; | ||
3329 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
3330 | index 9c5ab22..0c7eb49 100644 | ||
3331 | --- a/sound/usb/quirks.c | ||
3332 | +++ b/sound/usb/quirks.c | ||
3333 | @@ -837,6 +837,7 @@ static void set_format_emu_quirk(struct snd_usb_substream *subs, | ||
3334 | break; | ||
3335 | } | ||
3336 | snd_emuusb_set_samplerate(subs->stream->chip, emu_samplerate_id); | ||
3337 | + subs->pkt_offset_adj = (emu_samplerate_id >= EMU_QUIRK_SR_176400HZ) ? 4 : 0; | ||
3338 | } | ||
3339 | |||
3340 | void snd_usb_set_format_quirk(struct snd_usb_substream *subs, | ||
3341 | diff --git a/sound/usb/stream.c b/sound/usb/stream.c | ||
3342 | index ad181d5..cfc4d4e 100644 | ||
3343 | --- a/sound/usb/stream.c | ||
3344 | +++ b/sound/usb/stream.c | ||
3345 | @@ -94,6 +94,7 @@ static void snd_usb_init_substream(struct snd_usb_stream *as, | ||
3346 | subs->dev = as->chip->dev; | ||
3347 | subs->txfr_quirk = as->chip->txfr_quirk; | ||
3348 | subs->speed = snd_usb_get_speed(subs->dev); | ||
3349 | + subs->pkt_offset_adj = 0; | ||
3350 | |||
3351 | snd_usb_set_pcm_ops(as->pcm, stream); | ||
3352 | |||
3353 | @@ -396,6 +397,14 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, | ||
3354 | if (!csep && altsd->bNumEndpoints >= 2) | ||
3355 | csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT); | ||
3356 | |||
3357 | + /* | ||
3358 | + * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra | ||
3359 | + * bytes after the first endpoint, go search the entire interface. | ||
3360 | + * Some devices have it directly *before* the standard endpoint. | ||
3361 | + */ | ||
3362 | + if (!csep) | ||
3363 | + csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT); | ||
3364 | + | ||
3365 | if (!csep || csep->bLength < 7 || | ||
3366 | csep->bDescriptorSubtype != UAC_EP_GENERAL) { | ||
3367 | snd_printk(KERN_WARNING "%d:%u:%d : no or invalid" | ||
3368 | diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c | ||
3369 | index 1e7a47a..bf618e1 100644 | ||
3370 | --- a/sound/usb/usx2y/usb_stream.c | ||
3371 | +++ b/sound/usb/usx2y/usb_stream.c | ||
3372 | @@ -69,7 +69,6 @@ static void init_pipe_urbs(struct usb_stream_kernel *sk, unsigned use_packsize, | ||
3373 | ++u, transfer += transfer_length) { | ||
3374 | struct urb *urb = urbs[u]; | ||
3375 | struct usb_iso_packet_descriptor *desc; | ||
3376 | - urb->transfer_flags = URB_ISO_ASAP; | ||
3377 | urb->transfer_buffer = transfer; | ||
3378 | urb->dev = dev; | ||
3379 | urb->pipe = pipe; | ||
3380 | diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c | ||
3381 | index 520ef96..b376532 100644 | ||
3382 | --- a/sound/usb/usx2y/usbusx2yaudio.c | ||
3383 | +++ b/sound/usb/usx2y/usbusx2yaudio.c | ||
3384 | @@ -503,7 +503,6 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs) | ||
3385 | if (0 == i) | ||
3386 | atomic_set(&subs->state, state_STARTING3); | ||
3387 | urb->dev = usX2Y->dev; | ||
3388 | - urb->transfer_flags = URB_ISO_ASAP; | ||
3389 | for (pack = 0; pack < nr_of_packs(); pack++) { | ||
3390 | urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack; | ||
3391 | urb->iso_frame_desc[pack].length = subs->maxpacksize; | ||
3392 | diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c | ||
3393 | index cc56007..f2a1acd 100644 | ||
3394 | --- a/sound/usb/usx2y/usx2yhwdeppcm.c | ||
3395 | +++ b/sound/usb/usx2y/usx2yhwdeppcm.c | ||
3396 | @@ -443,7 +443,6 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs) | ||
3397 | if (0 == u) | ||
3398 | atomic_set(&subs->state, state_STARTING3); | ||
3399 | urb->dev = usX2Y->dev; | ||
3400 | - urb->transfer_flags = URB_ISO_ASAP; | ||
3401 | for (pack = 0; pack < nr_of_packs(); pack++) { | ||
3402 | urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs()); | ||
3403 | urb->iso_frame_desc[pack].length = subs->maxpacksize; |