Contents of /trunk/kernel26-magellan/patches-2.6.39-r2/0102-2.6.39.3-all-fixes.patch
Parent Directory | Revision Log
Revision 1424 -
(show annotations)
(download)
Mon Jul 18 14:29:21 2011 UTC (13 years, 2 months ago) by niro
File size: 121531 byte(s)
Mon Jul 18 14:29:21 2011 UTC (13 years, 2 months ago) by niro
File size: 121531 byte(s)
-2.6.39-magellan-r2: -using linux-2.6.39.3 and removed deprecated acpi procfs options from config
1 | diff --git a/Documentation/filesystems/caching/netfs-api.txt b/Documentation/filesystems/caching/netfs-api.txt |
2 | index a167ab8..7cc6bf2 100644 |
3 | --- a/Documentation/filesystems/caching/netfs-api.txt |
4 | +++ b/Documentation/filesystems/caching/netfs-api.txt |
5 | @@ -673,6 +673,22 @@ storage request to complete, or it may attempt to cancel the storage request - |
6 | in which case the page will not be stored in the cache this time. |
7 | |
8 | |
9 | +BULK INODE PAGE UNCACHE |
10 | +----------------------- |
11 | + |
12 | +A convenience routine is provided to perform an uncache on all the pages |
13 | +attached to an inode. This assumes that the pages on the inode correspond on a |
14 | +1:1 basis with the pages in the cache. |
15 | + |
16 | + void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie, |
17 | + struct inode *inode); |
18 | + |
19 | +This takes the netfs cookie that the pages were cached with and the inode that |
20 | +the pages are attached to. This function will wait for pages to finish being |
21 | +written to the cache and for the cache to finish with the page generally. No |
22 | +error is returned. |
23 | + |
24 | + |
25 | ========================== |
26 | INDEX AND DATA FILE UPDATE |
27 | ========================== |
28 | diff --git a/arch/arm/mach-exynos4/init.c b/arch/arm/mach-exynos4/init.c |
29 | index cf91f50..a8a83e3 100644 |
30 | --- a/arch/arm/mach-exynos4/init.c |
31 | +++ b/arch/arm/mach-exynos4/init.c |
32 | @@ -35,6 +35,7 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no) |
33 | tcfg->clocks = exynos4_serial_clocks; |
34 | tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); |
35 | } |
36 | + tcfg->flags |= NO_NEED_CHECK_CLKSRC; |
37 | } |
38 | |
39 | s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); |
40 | diff --git a/arch/arm/plat-samsung/include/plat/regs-serial.h b/arch/arm/plat-samsung/include/plat/regs-serial.h |
41 | index 788837e..d2ef07f 100644 |
42 | --- a/arch/arm/plat-samsung/include/plat/regs-serial.h |
43 | +++ b/arch/arm/plat-samsung/include/plat/regs-serial.h |
44 | @@ -224,6 +224,8 @@ |
45 | #define S5PV210_UFSTAT_RXMASK (255<<0) |
46 | #define S5PV210_UFSTAT_RXSHIFT (0) |
47 | |
48 | +#define NO_NEED_CHECK_CLKSRC 1 |
49 | + |
50 | #ifndef __ASSEMBLY__ |
51 | |
52 | /* struct s3c24xx_uart_clksrc |
53 | diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h |
54 | index 31d84ac..a518c0a 100644 |
55 | --- a/arch/x86/include/asm/pvclock.h |
56 | +++ b/arch/x86/include/asm/pvclock.h |
57 | @@ -22,6 +22,8 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) |
58 | u64 product; |
59 | #ifdef __i386__ |
60 | u32 tmp1, tmp2; |
61 | +#else |
62 | + ulong tmp; |
63 | #endif |
64 | |
65 | if (shift < 0) |
66 | @@ -42,8 +44,11 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) |
67 | : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); |
68 | #elif defined(__x86_64__) |
69 | __asm__ ( |
70 | - "mul %%rdx ; shrd $32,%%rdx,%%rax" |
71 | - : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) ); |
72 | + "mul %[mul_frac] ; shrd $32, %[hi], %[lo]" |
73 | + : [lo]"=a"(product), |
74 | + [hi]"=d"(tmp) |
75 | + : "0"(delta), |
76 | + [mul_frac]"rm"((u64)mul_frac)); |
77 | #else |
78 | #error implement me! |
79 | #endif |
80 | diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S b/arch/x86/kernel/acpi/realmode/wakeup.S |
81 | index ead21b6..b4fd836 100644 |
82 | --- a/arch/x86/kernel/acpi/realmode/wakeup.S |
83 | +++ b/arch/x86/kernel/acpi/realmode/wakeup.S |
84 | @@ -28,6 +28,8 @@ pmode_cr3: .long 0 /* Saved %cr3 */ |
85 | pmode_cr4: .long 0 /* Saved %cr4 */ |
86 | pmode_efer: .quad 0 /* Saved EFER */ |
87 | pmode_gdt: .quad 0 |
88 | +pmode_misc_en: .quad 0 /* Saved MISC_ENABLE MSR */ |
89 | +pmode_behavior: .long 0 /* Wakeup behavior flags */ |
90 | realmode_flags: .long 0 |
91 | real_magic: .long 0 |
92 | trampoline_segment: .word 0 |
93 | @@ -91,6 +93,18 @@ wakeup_code: |
94 | /* Call the C code */ |
95 | calll main |
96 | |
97 | + /* Restore MISC_ENABLE before entering protected mode, in case |
98 | + BIOS decided to clear XD_DISABLE during S3. */ |
99 | + movl pmode_behavior, %eax |
100 | + btl $WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE, %eax |
101 | + jnc 1f |
102 | + |
103 | + movl pmode_misc_en, %eax |
104 | + movl pmode_misc_en + 4, %edx |
105 | + movl $MSR_IA32_MISC_ENABLE, %ecx |
106 | + wrmsr |
107 | +1: |
108 | + |
109 | /* Do any other stuff... */ |
110 | |
111 | #ifndef CONFIG_64BIT |
112 | diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h b/arch/x86/kernel/acpi/realmode/wakeup.h |
113 | index e1828c0..97a29e1 100644 |
114 | --- a/arch/x86/kernel/acpi/realmode/wakeup.h |
115 | +++ b/arch/x86/kernel/acpi/realmode/wakeup.h |
116 | @@ -21,6 +21,9 @@ struct wakeup_header { |
117 | u32 pmode_efer_low; /* Protected mode EFER */ |
118 | u32 pmode_efer_high; |
119 | u64 pmode_gdt; |
120 | + u32 pmode_misc_en_low; /* Protected mode MISC_ENABLE */ |
121 | + u32 pmode_misc_en_high; |
122 | + u32 pmode_behavior; /* Wakeup routine behavior flags */ |
123 | u32 realmode_flags; |
124 | u32 real_magic; |
125 | u16 trampoline_segment; /* segment with trampoline code, 64-bit only */ |
126 | @@ -39,4 +42,7 @@ extern struct wakeup_header wakeup_header; |
127 | #define WAKEUP_HEADER_SIGNATURE 0x51ee1111 |
128 | #define WAKEUP_END_SIGNATURE 0x65a22c82 |
129 | |
130 | +/* Wakeup behavior bits */ |
131 | +#define WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE 0 |
132 | + |
133 | #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */ |
134 | diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c |
135 | index ff93bc1..cdddffc 100644 |
136 | --- a/arch/x86/kernel/acpi/sleep.c |
137 | +++ b/arch/x86/kernel/acpi/sleep.c |
138 | @@ -77,6 +77,12 @@ int acpi_suspend_lowlevel(void) |
139 | |
140 | header->pmode_cr0 = read_cr0(); |
141 | header->pmode_cr4 = read_cr4_safe(); |
142 | + header->pmode_behavior = 0; |
143 | + if (!rdmsr_safe(MSR_IA32_MISC_ENABLE, |
144 | + &header->pmode_misc_en_low, |
145 | + &header->pmode_misc_en_high)) |
146 | + header->pmode_behavior |= |
147 | + (1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE); |
148 | header->realmode_flags = acpi_realmode_flags; |
149 | header->real_magic = 0x12345678; |
150 | |
151 | diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c |
152 | index cf97500..68894fd 100644 |
153 | --- a/arch/x86/oprofile/nmi_int.c |
154 | +++ b/arch/x86/oprofile/nmi_int.c |
155 | @@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy) |
156 | static int nmi_start(void) |
157 | { |
158 | get_online_cpus(); |
159 | - on_each_cpu(nmi_cpu_start, NULL, 1); |
160 | ctr_running = 1; |
161 | + /* make ctr_running visible to the nmi handler: */ |
162 | + smp_mb(); |
163 | + on_each_cpu(nmi_cpu_start, NULL, 1); |
164 | put_online_cpus(); |
165 | return 0; |
166 | } |
167 | @@ -504,15 +506,18 @@ static int nmi_setup(void) |
168 | |
169 | nmi_enabled = 0; |
170 | ctr_running = 0; |
171 | - barrier(); |
172 | + /* make variables visible to the nmi handler: */ |
173 | + smp_mb(); |
174 | err = register_die_notifier(&profile_exceptions_nb); |
175 | if (err) |
176 | goto fail; |
177 | |
178 | get_online_cpus(); |
179 | register_cpu_notifier(&oprofile_cpu_nb); |
180 | - on_each_cpu(nmi_cpu_setup, NULL, 1); |
181 | nmi_enabled = 1; |
182 | + /* make nmi_enabled visible to the nmi handler: */ |
183 | + smp_mb(); |
184 | + on_each_cpu(nmi_cpu_setup, NULL, 1); |
185 | put_online_cpus(); |
186 | |
187 | return 0; |
188 | @@ -531,7 +536,8 @@ static void nmi_shutdown(void) |
189 | nmi_enabled = 0; |
190 | ctr_running = 0; |
191 | put_online_cpus(); |
192 | - barrier(); |
193 | + /* make variables visible to the nmi handler: */ |
194 | + smp_mb(); |
195 | unregister_die_notifier(&profile_exceptions_nb); |
196 | msrs = &get_cpu_var(cpu_msrs); |
197 | model->shutdown(msrs); |
198 | diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c |
199 | index e37b407..632ba33 100644 |
200 | --- a/arch/x86/pci/xen.c |
201 | +++ b/arch/x86/pci/xen.c |
202 | @@ -316,7 +316,7 @@ int __init pci_xen_hvm_init(void) |
203 | } |
204 | |
205 | #ifdef CONFIG_XEN_DOM0 |
206 | -static int xen_register_pirq(u32 gsi, int triggering) |
207 | +static int xen_register_pirq(u32 gsi, int gsi_override, int triggering) |
208 | { |
209 | int rc, pirq, irq = -1; |
210 | struct physdev_map_pirq map_irq; |
211 | @@ -333,16 +333,18 @@ static int xen_register_pirq(u32 gsi, int triggering) |
212 | shareable = 1; |
213 | name = "ioapic-level"; |
214 | } |
215 | - |
216 | pirq = xen_allocate_pirq_gsi(gsi); |
217 | if (pirq < 0) |
218 | goto out; |
219 | |
220 | - irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name); |
221 | + if (gsi_override >= 0) |
222 | + irq = xen_bind_pirq_gsi_to_irq(gsi_override, pirq, shareable, name); |
223 | + else |
224 | + irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name); |
225 | if (irq < 0) |
226 | goto out; |
227 | |
228 | - printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d\n", pirq, irq); |
229 | + printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d (gsi=%d)\n", pirq, irq, gsi); |
230 | |
231 | map_irq.domid = DOMID_SELF; |
232 | map_irq.type = MAP_PIRQ_TYPE_GSI; |
233 | @@ -359,7 +361,7 @@ out: |
234 | return irq; |
235 | } |
236 | |
237 | -static int xen_register_gsi(u32 gsi, int triggering, int polarity) |
238 | +static int xen_register_gsi(u32 gsi, int gsi_override, int triggering, int polarity) |
239 | { |
240 | int rc, irq; |
241 | struct physdev_setup_gsi setup_gsi; |
242 | @@ -370,7 +372,7 @@ static int xen_register_gsi(u32 gsi, int triggering, int polarity) |
243 | printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n", |
244 | gsi, triggering, polarity); |
245 | |
246 | - irq = xen_register_pirq(gsi, triggering); |
247 | + irq = xen_register_pirq(gsi, gsi_override, triggering); |
248 | |
249 | setup_gsi.gsi = gsi; |
250 | setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); |
251 | @@ -392,6 +394,8 @@ static __init void xen_setup_acpi_sci(void) |
252 | int rc; |
253 | int trigger, polarity; |
254 | int gsi = acpi_sci_override_gsi; |
255 | + int irq = -1; |
256 | + int gsi_override = -1; |
257 | |
258 | if (!gsi) |
259 | return; |
260 | @@ -408,7 +412,25 @@ static __init void xen_setup_acpi_sci(void) |
261 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " |
262 | "polarity=%d\n", gsi, trigger, polarity); |
263 | |
264 | - gsi = xen_register_gsi(gsi, trigger, polarity); |
265 | + /* Before we bind the GSI to a Linux IRQ, check whether |
266 | + * we need to override it with bus_irq (IRQ) value. Usually for |
267 | + * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: |
268 | + * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) |
269 | + * but there are oddballs where the IRQ != GSI: |
270 | + * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) |
271 | + * which ends up being: gsi_to_irq[9] == 20 |
272 | + * (which is what acpi_gsi_to_irq ends up calling when starting the |
273 | + * the ACPI interpreter and keels over since IRQ 9 has not been |
274 | + * setup as we had setup IRQ 20 for it). |
275 | + */ |
276 | + /* Check whether the GSI != IRQ */ |
277 | + if (acpi_gsi_to_irq(gsi, &irq) == 0) { |
278 | + if (irq >= 0 && irq != gsi) |
279 | + /* Bugger, we MUST have that IRQ. */ |
280 | + gsi_override = irq; |
281 | + } |
282 | + |
283 | + gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); |
284 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); |
285 | |
286 | return; |
287 | @@ -417,7 +439,7 @@ static __init void xen_setup_acpi_sci(void) |
288 | static int acpi_register_gsi_xen(struct device *dev, u32 gsi, |
289 | int trigger, int polarity) |
290 | { |
291 | - return xen_register_gsi(gsi, trigger, polarity); |
292 | + return xen_register_gsi(gsi, -1 /* no GSI override */, trigger, polarity); |
293 | } |
294 | |
295 | static int __init pci_xen_initial_domain(void) |
296 | @@ -456,7 +478,7 @@ void __init xen_setup_pirqs(void) |
297 | if (acpi_get_override_irq(irq, &trigger, &polarity) == -1) |
298 | continue; |
299 | |
300 | - xen_register_pirq(irq, |
301 | + xen_register_pirq(irq, -1 /* no GSI override */, |
302 | trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE); |
303 | } |
304 | } |
305 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
306 | index f298bd7..0d668d1 100644 |
307 | --- a/arch/x86/xen/mmu.c |
308 | +++ b/arch/x86/xen/mmu.c |
309 | @@ -59,6 +59,7 @@ |
310 | #include <asm/page.h> |
311 | #include <asm/init.h> |
312 | #include <asm/pat.h> |
313 | +#include <asm/smp.h> |
314 | |
315 | #include <asm/xen/hypercall.h> |
316 | #include <asm/xen/hypervisor.h> |
317 | @@ -1353,7 +1354,11 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, |
318 | { |
319 | struct { |
320 | struct mmuext_op op; |
321 | +#ifdef CONFIG_SMP |
322 | + DECLARE_BITMAP(mask, num_processors); |
323 | +#else |
324 | DECLARE_BITMAP(mask, NR_CPUS); |
325 | +#endif |
326 | } *args; |
327 | struct multicall_space mcs; |
328 | |
329 | @@ -1721,6 +1726,11 @@ static __init void xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) |
330 | for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { |
331 | pte_t pte; |
332 | |
333 | +#ifdef CONFIG_X86_32 |
334 | + if (pfn > max_pfn_mapped) |
335 | + max_pfn_mapped = pfn; |
336 | +#endif |
337 | + |
338 | if (!pte_none(pte_page[pteidx])) |
339 | continue; |
340 | |
341 | @@ -1888,7 +1898,9 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, |
342 | initial_kernel_pmd = |
343 | extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); |
344 | |
345 | - max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); |
346 | + max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) + |
347 | + xen_start_info->nr_pt_frames * PAGE_SIZE + |
348 | + 512*1024); |
349 | |
350 | kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); |
351 | memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); |
352 | diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c |
353 | index 3061244..ae49046 100644 |
354 | --- a/arch/x86/xen/smp.c |
355 | +++ b/arch/x86/xen/smp.c |
356 | @@ -206,11 +206,18 @@ static void __init xen_smp_prepare_boot_cpu(void) |
357 | static void __init xen_smp_prepare_cpus(unsigned int max_cpus) |
358 | { |
359 | unsigned cpu; |
360 | + unsigned int i; |
361 | |
362 | xen_init_lock_cpu(0); |
363 | |
364 | smp_store_cpu_info(0); |
365 | cpu_data(0).x86_max_cores = 1; |
366 | + |
367 | + for_each_possible_cpu(i) { |
368 | + zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL); |
369 | + zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL); |
370 | + zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL); |
371 | + } |
372 | set_cpu_sibling_map(0); |
373 | |
374 | if (xen_smp_intr_init(0)) |
375 | diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c |
376 | index ab7a9e6..bd2fa5f 100644 |
377 | --- a/block/cfq-iosched.c |
378 | +++ b/block/cfq-iosched.c |
379 | @@ -2704,8 +2704,14 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd, |
380 | smp_wmb(); |
381 | cic->key = cfqd_dead_key(cfqd); |
382 | |
383 | - if (ioc->ioc_data == cic) |
384 | + rcu_read_lock(); |
385 | + if (rcu_dereference(ioc->ioc_data) == cic) { |
386 | + rcu_read_unlock(); |
387 | + spin_lock(&ioc->lock); |
388 | rcu_assign_pointer(ioc->ioc_data, NULL); |
389 | + spin_unlock(&ioc->lock); |
390 | + } else |
391 | + rcu_read_unlock(); |
392 | |
393 | if (cic->cfqq[BLK_RW_ASYNC]) { |
394 | cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]); |
395 | @@ -3012,7 +3018,8 @@ cfq_drop_dead_cic(struct cfq_data *cfqd, struct io_context *ioc, |
396 | |
397 | spin_lock_irqsave(&ioc->lock, flags); |
398 | |
399 | - BUG_ON(ioc->ioc_data == cic); |
400 | + BUG_ON(rcu_dereference_check(ioc->ioc_data, |
401 | + lockdep_is_held(&ioc->lock)) == cic); |
402 | |
403 | radix_tree_delete(&ioc->radix_root, cfqd->cic_index); |
404 | hlist_del_rcu(&cic->cic_list); |
405 | diff --git a/drivers/base/platform.c b/drivers/base/platform.c |
406 | index 9e0e4fc..5d5bd1a 100644 |
407 | --- a/drivers/base/platform.c |
408 | +++ b/drivers/base/platform.c |
409 | @@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister); |
410 | * |
411 | * Returns &struct platform_device pointer on success, or ERR_PTR() on error. |
412 | */ |
413 | -struct platform_device *__init_or_module platform_device_register_resndata( |
414 | +struct platform_device *platform_device_register_resndata( |
415 | struct device *parent, |
416 | const char *name, int id, |
417 | const struct resource *res, unsigned int num, |
418 | diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c |
419 | index abe3ab7..631b5d3 100644 |
420 | --- a/drivers/base/power/main.c |
421 | +++ b/drivers/base/power/main.c |
422 | @@ -57,7 +57,8 @@ static int async_error; |
423 | */ |
424 | void device_pm_init(struct device *dev) |
425 | { |
426 | - dev->power.in_suspend = false; |
427 | + dev->power.is_prepared = false; |
428 | + dev->power.is_suspended = false; |
429 | init_completion(&dev->power.completion); |
430 | complete_all(&dev->power.completion); |
431 | dev->power.wakeup = NULL; |
432 | @@ -91,7 +92,7 @@ void device_pm_add(struct device *dev) |
433 | pr_debug("PM: Adding info for %s:%s\n", |
434 | dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); |
435 | mutex_lock(&dpm_list_mtx); |
436 | - if (dev->parent && dev->parent->power.in_suspend) |
437 | + if (dev->parent && dev->parent->power.is_prepared) |
438 | dev_warn(dev, "parent %s should not be sleeping\n", |
439 | dev_name(dev->parent)); |
440 | list_add_tail(&dev->power.entry, &dpm_list); |
441 | @@ -513,7 +514,14 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) |
442 | dpm_wait(dev->parent, async); |
443 | device_lock(dev); |
444 | |
445 | - dev->power.in_suspend = false; |
446 | + /* |
447 | + * This is a fib. But we'll allow new children to be added below |
448 | + * a resumed device, even if the device hasn't been completed yet. |
449 | + */ |
450 | + dev->power.is_prepared = false; |
451 | + |
452 | + if (!dev->power.is_suspended) |
453 | + goto Unlock; |
454 | |
455 | if (dev->pwr_domain) { |
456 | pm_dev_dbg(dev, state, "power domain "); |
457 | @@ -549,6 +557,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) |
458 | } |
459 | |
460 | End: |
461 | + dev->power.is_suspended = false; |
462 | + |
463 | + Unlock: |
464 | device_unlock(dev); |
465 | complete_all(&dev->power.completion); |
466 | |
467 | @@ -668,7 +679,7 @@ static void dpm_complete(pm_message_t state) |
468 | struct device *dev = to_device(dpm_prepared_list.prev); |
469 | |
470 | get_device(dev); |
471 | - dev->power.in_suspend = false; |
472 | + dev->power.is_prepared = false; |
473 | list_move(&dev->power.entry, &list); |
474 | mutex_unlock(&dpm_list_mtx); |
475 | |
476 | @@ -834,11 +845,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) |
477 | device_lock(dev); |
478 | |
479 | if (async_error) |
480 | - goto End; |
481 | + goto Unlock; |
482 | |
483 | if (pm_wakeup_pending()) { |
484 | async_error = -EBUSY; |
485 | - goto End; |
486 | + goto Unlock; |
487 | } |
488 | |
489 | if (dev->type && dev->type->pm) { |
490 | @@ -876,6 +887,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) |
491 | } |
492 | |
493 | End: |
494 | + dev->power.is_suspended = !error; |
495 | + |
496 | + Unlock: |
497 | device_unlock(dev); |
498 | complete_all(&dev->power.completion); |
499 | |
500 | @@ -1037,7 +1051,7 @@ static int dpm_prepare(pm_message_t state) |
501 | put_device(dev); |
502 | break; |
503 | } |
504 | - dev->power.in_suspend = true; |
505 | + dev->power.is_prepared = true; |
506 | if (!list_empty(&dev->power.entry)) |
507 | list_move_tail(&dev->power.entry, &dpm_prepared_list); |
508 | put_device(dev); |
509 | diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c |
510 | index 219d88a..dde6a0f 100644 |
511 | --- a/drivers/connector/connector.c |
512 | +++ b/drivers/connector/connector.c |
513 | @@ -139,6 +139,7 @@ static int cn_call_callback(struct sk_buff *skb) |
514 | spin_unlock_bh(&dev->cbdev->queue_lock); |
515 | |
516 | if (cbq != NULL) { |
517 | + err = 0; |
518 | cbq->callback(msg, nsp); |
519 | kfree_skb(skb); |
520 | cn_queue_release_callback(cbq); |
521 | diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c |
522 | index e1aee4f..b6a19cb 100644 |
523 | --- a/drivers/gpu/drm/drm_pci.c |
524 | +++ b/drivers/gpu/drm/drm_pci.c |
525 | @@ -251,7 +251,7 @@ err: |
526 | } |
527 | |
528 | |
529 | -int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p) |
530 | +static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p) |
531 | { |
532 | if ((p->busnum >> 8) != drm_get_pci_domain(dev) || |
533 | (p->busnum & 0xff) != dev->pdev->bus->number || |
534 | @@ -292,6 +292,7 @@ static struct drm_bus drm_pci_bus = { |
535 | .get_name = drm_pci_get_name, |
536 | .set_busid = drm_pci_set_busid, |
537 | .set_unique = drm_pci_set_unique, |
538 | + .irq_by_busid = drm_pci_irq_by_busid, |
539 | .agp_init = drm_pci_agp_init, |
540 | }; |
541 | |
542 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
543 | index 188b497..58c7f27 100644 |
544 | --- a/drivers/gpu/drm/i915/i915_irq.c |
545 | +++ b/drivers/gpu/drm/i915/i915_irq.c |
546 | @@ -1567,6 +1567,17 @@ static void ironlake_irq_preinstall(struct drm_device *dev) |
547 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
548 | |
549 | I915_WRITE(HWSTAM, 0xeffe); |
550 | + if (IS_GEN6(dev)) { |
551 | + /* Workaround stalls observed on Sandy Bridge GPUs by |
552 | + * making the blitter command streamer generate a |
553 | + * write to the Hardware Status Page for |
554 | + * MI_USER_INTERRUPT. This appears to serialize the |
555 | + * previous seqno write out before the interrupt |
556 | + * happens. |
557 | + */ |
558 | + I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT); |
559 | + I915_WRITE(GEN6_BSD_HWSTAM, ~GEN6_BSD_USER_INTERRUPT); |
560 | + } |
561 | |
562 | /* XXX hotplug from PCH */ |
563 | |
564 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
565 | index f39ac3a..5a96fd1 100644 |
566 | --- a/drivers/gpu/drm/i915/i915_reg.h |
567 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
568 | @@ -528,6 +528,7 @@ |
569 | #define GEN6_BSD_SLEEP_PSMI_CONTROL_RC_ILDL_MESSAGE_ENABLE 0 |
570 | #define GEN6_BSD_SLEEP_PSMI_CONTROL_IDLE_INDICATOR (1 << 3) |
571 | |
572 | +#define GEN6_BSD_HWSTAM 0x12098 |
573 | #define GEN6_BSD_IMR 0x120a8 |
574 | #define GEN6_BSD_USER_INTERRUPT (1 << 12) |
575 | |
576 | diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c |
577 | index d3b903b..d98cee6 100644 |
578 | --- a/drivers/gpu/drm/i915/intel_i2c.c |
579 | +++ b/drivers/gpu/drm/i915/intel_i2c.c |
580 | @@ -401,8 +401,7 @@ int intel_setup_gmbus(struct drm_device *dev) |
581 | bus->reg0 = i | GMBUS_RATE_100KHZ; |
582 | |
583 | /* XXX force bit banging until GMBUS is fully debugged */ |
584 | - if (IS_GEN2(dev)) |
585 | - bus->force_bit = intel_gpio_create(dev_priv, i); |
586 | + bus->force_bit = intel_gpio_create(dev_priv, i); |
587 | } |
588 | |
589 | intel_i2c_reset(dev_priv->dev); |
590 | diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c |
591 | index b427488..9423fba 100644 |
592 | --- a/drivers/gpu/drm/radeon/radeon_encoders.c |
593 | +++ b/drivers/gpu/drm/radeon/radeon_encoders.c |
594 | @@ -1294,7 +1294,11 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) |
595 | if (is_dig) { |
596 | switch (mode) { |
597 | case DRM_MODE_DPMS_ON: |
598 | - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
599 | + /* some early dce3.2 boards have a bug in their transmitter control table */ |
600 | + if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) |
601 | + atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
602 | + else |
603 | + atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
604 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { |
605 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
606 | |
607 | diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c |
608 | index ef8a5ba..05aa674 100644 |
609 | --- a/drivers/gpu/drm/radeon/rv770.c |
610 | +++ b/drivers/gpu/drm/radeon/rv770.c |
611 | @@ -572,6 +572,12 @@ static void rv770_program_channel_remap(struct radeon_device *rdev) |
612 | else |
613 | tcp_chan_steer = 0x00fac688; |
614 | |
615 | + /* RV770 CE has special chremap setup */ |
616 | + if (rdev->pdev->device == 0x944e) { |
617 | + tcp_chan_steer = 0x00b08b08; |
618 | + mc_shared_chremap = 0x00b08b08; |
619 | + } |
620 | + |
621 | WREG32(TCP_CHAN_STEER, tcp_chan_steer); |
622 | WREG32(MC_SHARED_CHREMAP, mc_shared_chremap); |
623 | } |
624 | diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c |
625 | index bc6e2ab..affc17e 100644 |
626 | --- a/drivers/hwmon/ibmaem.c |
627 | +++ b/drivers/hwmon/ibmaem.c |
628 | @@ -947,6 +947,7 @@ static int aem_register_sensors(struct aem_data *data, |
629 | |
630 | /* Set up read-only sensors */ |
631 | while (ro->label) { |
632 | + sysfs_attr_init(&sensors->dev_attr.attr); |
633 | sensors->dev_attr.attr.name = ro->label; |
634 | sensors->dev_attr.attr.mode = S_IRUGO; |
635 | sensors->dev_attr.show = ro->show; |
636 | @@ -963,6 +964,7 @@ static int aem_register_sensors(struct aem_data *data, |
637 | |
638 | /* Set up read-write sensors */ |
639 | while (rw->label) { |
640 | + sysfs_attr_init(&sensors->dev_attr.attr); |
641 | sensors->dev_attr.attr.name = rw->label; |
642 | sensors->dev_attr.attr.mode = S_IRUGO | S_IWUSR; |
643 | sensors->dev_attr.show = rw->show; |
644 | diff --git a/drivers/hwmon/ibmpex.c b/drivers/hwmon/ibmpex.c |
645 | index 06d4eaf..41dbf81 100644 |
646 | --- a/drivers/hwmon/ibmpex.c |
647 | +++ b/drivers/hwmon/ibmpex.c |
648 | @@ -358,6 +358,7 @@ static int create_sensor(struct ibmpex_bmc_data *data, int type, |
649 | else if (type == POWER_SENSOR) |
650 | sprintf(n, power_sensor_name_templates[func], "power", counter); |
651 | |
652 | + sysfs_attr_init(&data->sensors[sensor].attr[func].dev_attr.attr); |
653 | data->sensors[sensor].attr[func].dev_attr.attr.name = n; |
654 | data->sensors[sensor].attr[func].dev_attr.attr.mode = S_IRUGO; |
655 | data->sensors[sensor].attr[func].dev_attr.show = ibmpex_show_sensor; |
656 | diff --git a/drivers/hwmon/s3c-hwmon.c b/drivers/hwmon/s3c-hwmon.c |
657 | index 92b42db..b39f52e 100644 |
658 | --- a/drivers/hwmon/s3c-hwmon.c |
659 | +++ b/drivers/hwmon/s3c-hwmon.c |
660 | @@ -232,6 +232,7 @@ static int s3c_hwmon_create_attr(struct device *dev, |
661 | |
662 | attr = &attrs->in; |
663 | attr->index = channel; |
664 | + sysfs_attr_init(&attr->dev_attr.attr); |
665 | attr->dev_attr.attr.name = attrs->in_name; |
666 | attr->dev_attr.attr.mode = S_IRUGO; |
667 | attr->dev_attr.show = s3c_hwmon_ch_show; |
668 | @@ -249,6 +250,7 @@ static int s3c_hwmon_create_attr(struct device *dev, |
669 | |
670 | attr = &attrs->label; |
671 | attr->index = channel; |
672 | + sysfs_attr_init(&attr->dev_attr.attr); |
673 | attr->dev_attr.attr.name = attrs->label_name; |
674 | attr->dev_attr.attr.mode = S_IRUGO; |
675 | attr->dev_attr.show = s3c_hwmon_label_show; |
676 | diff --git a/drivers/i2c/busses/i2c-taos-evm.c b/drivers/i2c/busses/i2c-taos-evm.c |
677 | index dd39c1e..26c352a 100644 |
678 | --- a/drivers/i2c/busses/i2c-taos-evm.c |
679 | +++ b/drivers/i2c/busses/i2c-taos-evm.c |
680 | @@ -234,7 +234,7 @@ static int taos_connect(struct serio *serio, struct serio_driver *drv) |
681 | |
682 | if (taos->state != TAOS_STATE_IDLE) { |
683 | err = -ENODEV; |
684 | - dev_dbg(&serio->dev, "TAOS EVM reset failed (state=%d, " |
685 | + dev_err(&serio->dev, "TAOS EVM reset failed (state=%d, " |
686 | "pos=%d)\n", taos->state, taos->pos); |
687 | goto exit_close; |
688 | } |
689 | @@ -255,7 +255,7 @@ static int taos_connect(struct serio *serio, struct serio_driver *drv) |
690 | msecs_to_jiffies(250)); |
691 | if (taos->state != TAOS_STATE_IDLE) { |
692 | err = -ENODEV; |
693 | - dev_err(&adapter->dev, "Echo off failed " |
694 | + dev_err(&serio->dev, "TAOS EVM echo off failed " |
695 | "(state=%d)\n", taos->state); |
696 | goto exit_close; |
697 | } |
698 | @@ -263,7 +263,7 @@ static int taos_connect(struct serio *serio, struct serio_driver *drv) |
699 | err = i2c_add_adapter(adapter); |
700 | if (err) |
701 | goto exit_close; |
702 | - dev_dbg(&serio->dev, "Connected to TAOS EVM\n"); |
703 | + dev_info(&serio->dev, "Connected to TAOS EVM\n"); |
704 | |
705 | taos->client = taos_instantiate_device(adapter); |
706 | return 0; |
707 | @@ -288,7 +288,7 @@ static void taos_disconnect(struct serio *serio) |
708 | serio_set_drvdata(serio, NULL); |
709 | kfree(taos); |
710 | |
711 | - dev_dbg(&serio->dev, "Disconnected from TAOS EVM\n"); |
712 | + dev_info(&serio->dev, "Disconnected from TAOS EVM\n"); |
713 | } |
714 | |
715 | static struct serio_device_id taos_serio_ids[] = { |
716 | diff --git a/drivers/i2c/muxes/pca954x.c b/drivers/i2c/muxes/pca954x.c |
717 | index 54e1ce7..6f89536 100644 |
718 | --- a/drivers/i2c/muxes/pca954x.c |
719 | +++ b/drivers/i2c/muxes/pca954x.c |
720 | @@ -201,10 +201,11 @@ static int pca954x_probe(struct i2c_client *client, |
721 | |
722 | i2c_set_clientdata(client, data); |
723 | |
724 | - /* Read the mux register at addr to verify |
725 | - * that the mux is in fact present. |
726 | + /* Write the mux register at addr to verify |
727 | + * that the mux is in fact present. This also |
728 | + * initializes the mux to disconnected state. |
729 | */ |
730 | - if (i2c_smbus_read_byte(client) < 0) { |
731 | + if (i2c_smbus_write_byte(client, 0) < 0) { |
732 | dev_warn(&client->dev, "probe failed\n"); |
733 | goto exit_free; |
734 | } |
735 | diff --git a/drivers/input/input.c b/drivers/input/input.c |
736 | index ebbceed..e3c88fc 100644 |
737 | --- a/drivers/input/input.c |
738 | +++ b/drivers/input/input.c |
739 | @@ -1757,7 +1757,7 @@ static unsigned int input_estimate_events_per_packet(struct input_dev *dev) |
740 | } else if (test_bit(ABS_MT_TRACKING_ID, dev->absbit)) { |
741 | mt_slots = dev->absinfo[ABS_MT_TRACKING_ID].maximum - |
742 | dev->absinfo[ABS_MT_TRACKING_ID].minimum + 1, |
743 | - clamp(mt_slots, 2, 32); |
744 | + mt_slots = clamp(mt_slots, 2, 32); |
745 | } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { |
746 | mt_slots = 2; |
747 | } else { |
748 | diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c |
749 | index 7630273..f8ba7c9 100644 |
750 | --- a/drivers/input/mousedev.c |
751 | +++ b/drivers/input/mousedev.c |
752 | @@ -187,7 +187,7 @@ static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, |
753 | if (size == 0) |
754 | size = xres ? : 1; |
755 | |
756 | - clamp(value, min, max); |
757 | + value = clamp(value, min, max); |
758 | |
759 | mousedev->packet.x = ((value - min) * xres) / size; |
760 | mousedev->packet.abs_event = 1; |
761 | @@ -201,7 +201,7 @@ static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, |
762 | if (size == 0) |
763 | size = yres ? : 1; |
764 | |
765 | - clamp(value, min, max); |
766 | + value = clamp(value, min, max); |
767 | |
768 | mousedev->packet.y = yres - ((value - min) * yres) / size; |
769 | mousedev->packet.abs_event = 1; |
770 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
771 | index 9930792..a7ed02c 100644 |
772 | --- a/drivers/md/md.c |
773 | +++ b/drivers/md/md.c |
774 | @@ -7062,6 +7062,7 @@ static int remove_and_add_spares(mddev_t *mddev) |
775 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
776 | if (rdev->raid_disk >= 0 && |
777 | !test_bit(In_sync, &rdev->flags) && |
778 | + !test_bit(Faulty, &rdev->flags) && |
779 | !test_bit(Blocked, &rdev->flags)) |
780 | spares++; |
781 | if (rdev->raid_disk < 0 |
782 | diff --git a/drivers/media/rc/ir-raw.c b/drivers/media/rc/ir-raw.c |
783 | index 11c19d8..423ed45 100644 |
784 | --- a/drivers/media/rc/ir-raw.c |
785 | +++ b/drivers/media/rc/ir-raw.c |
786 | @@ -114,18 +114,20 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type) |
787 | s64 delta; /* ns */ |
788 | DEFINE_IR_RAW_EVENT(ev); |
789 | int rc = 0; |
790 | + int delay; |
791 | |
792 | if (!dev->raw) |
793 | return -EINVAL; |
794 | |
795 | now = ktime_get(); |
796 | delta = ktime_to_ns(ktime_sub(now, dev->raw->last_event)); |
797 | + delay = MS_TO_NS(dev->input_dev->rep[REP_DELAY]); |
798 | |
799 | /* Check for a long duration since last event or if we're |
800 | * being called for the first time, note that delta can't |
801 | * possibly be negative. |
802 | */ |
803 | - if (delta > IR_MAX_DURATION || !dev->raw->last_type) |
804 | + if (delta > delay || !dev->raw->last_type) |
805 | type |= IR_START_EVENT; |
806 | else |
807 | ev.duration = delta; |
808 | diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c |
809 | index 43908a7..c1717bf 100644 |
810 | --- a/drivers/media/rc/ite-cir.c |
811 | +++ b/drivers/media/rc/ite-cir.c |
812 | @@ -1357,6 +1357,7 @@ static const struct ite_dev_params ite_dev_descs[] = { |
813 | { /* 0: ITE8704 */ |
814 | .model = "ITE8704 CIR transceiver", |
815 | .io_region_size = IT87_IOREG_LENGTH, |
816 | + .io_rsrc_no = 0, |
817 | .hw_tx_capable = true, |
818 | .sample_period = (u32) (1000000000ULL / 115200), |
819 | .tx_carrier_freq = 38000, |
820 | @@ -1381,6 +1382,7 @@ static const struct ite_dev_params ite_dev_descs[] = { |
821 | { /* 1: ITE8713 */ |
822 | .model = "ITE8713 CIR transceiver", |
823 | .io_region_size = IT87_IOREG_LENGTH, |
824 | + .io_rsrc_no = 0, |
825 | .hw_tx_capable = true, |
826 | .sample_period = (u32) (1000000000ULL / 115200), |
827 | .tx_carrier_freq = 38000, |
828 | @@ -1405,6 +1407,7 @@ static const struct ite_dev_params ite_dev_descs[] = { |
829 | { /* 2: ITE8708 */ |
830 | .model = "ITE8708 CIR transceiver", |
831 | .io_region_size = IT8708_IOREG_LENGTH, |
832 | + .io_rsrc_no = 0, |
833 | .hw_tx_capable = true, |
834 | .sample_period = (u32) (1000000000ULL / 115200), |
835 | .tx_carrier_freq = 38000, |
836 | @@ -1430,6 +1433,7 @@ static const struct ite_dev_params ite_dev_descs[] = { |
837 | { /* 3: ITE8709 */ |
838 | .model = "ITE8709 CIR transceiver", |
839 | .io_region_size = IT8709_IOREG_LENGTH, |
840 | + .io_rsrc_no = 2, |
841 | .hw_tx_capable = true, |
842 | .sample_period = (u32) (1000000000ULL / 115200), |
843 | .tx_carrier_freq = 38000, |
844 | @@ -1471,6 +1475,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id |
845 | struct rc_dev *rdev = NULL; |
846 | int ret = -ENOMEM; |
847 | int model_no; |
848 | + int io_rsrc_no; |
849 | |
850 | ite_dbg("%s called", __func__); |
851 | |
852 | @@ -1500,10 +1505,11 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id |
853 | |
854 | /* get the description for the device */ |
855 | dev_desc = &ite_dev_descs[model_no]; |
856 | + io_rsrc_no = dev_desc->io_rsrc_no; |
857 | |
858 | /* validate pnp resources */ |
859 | - if (!pnp_port_valid(pdev, 0) || |
860 | - pnp_port_len(pdev, 0) != dev_desc->io_region_size) { |
861 | + if (!pnp_port_valid(pdev, io_rsrc_no) || |
862 | + pnp_port_len(pdev, io_rsrc_no) != dev_desc->io_region_size) { |
863 | dev_err(&pdev->dev, "IR PNP Port not valid!\n"); |
864 | goto failure; |
865 | } |
866 | @@ -1514,7 +1520,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id |
867 | } |
868 | |
869 | /* store resource values */ |
870 | - itdev->cir_addr = pnp_port_start(pdev, 0); |
871 | + itdev->cir_addr = pnp_port_start(pdev, io_rsrc_no); |
872 | itdev->cir_irq = pnp_irq(pdev, 0); |
873 | |
874 | /* initialize spinlocks */ |
875 | diff --git a/drivers/media/rc/ite-cir.h b/drivers/media/rc/ite-cir.h |
876 | index 16a19f5..aa899a0 100644 |
877 | --- a/drivers/media/rc/ite-cir.h |
878 | +++ b/drivers/media/rc/ite-cir.h |
879 | @@ -57,6 +57,9 @@ struct ite_dev_params { |
880 | /* size of the I/O region */ |
881 | int io_region_size; |
882 | |
883 | + /* IR pnp I/O resource number */ |
884 | + int io_rsrc_no; |
885 | + |
886 | /* true if the hardware supports transmission */ |
887 | bool hw_tx_capable; |
888 | |
889 | diff --git a/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c b/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c |
890 | index bb10ffe..8d558ae 100644 |
891 | --- a/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c |
892 | +++ b/drivers/media/rc/keymaps/rc-pinnacle-pctv-hd.c |
893 | @@ -15,43 +15,39 @@ |
894 | /* Pinnacle PCTV HD 800i mini remote */ |
895 | |
896 | static struct rc_map_table pinnacle_pctv_hd[] = { |
897 | - |
898 | - { 0x0f, KEY_1 }, |
899 | - { 0x15, KEY_2 }, |
900 | - { 0x10, KEY_3 }, |
901 | - { 0x18, KEY_4 }, |
902 | - { 0x1b, KEY_5 }, |
903 | - { 0x1e, KEY_6 }, |
904 | - { 0x11, KEY_7 }, |
905 | - { 0x21, KEY_8 }, |
906 | - { 0x12, KEY_9 }, |
907 | - { 0x27, KEY_0 }, |
908 | - |
909 | - { 0x24, KEY_ZOOM }, |
910 | - { 0x2a, KEY_SUBTITLE }, |
911 | - |
912 | - { 0x00, KEY_MUTE }, |
913 | - { 0x01, KEY_ENTER }, /* Pinnacle Logo */ |
914 | - { 0x39, KEY_POWER }, |
915 | - |
916 | - { 0x03, KEY_VOLUMEUP }, |
917 | - { 0x09, KEY_VOLUMEDOWN }, |
918 | - { 0x06, KEY_CHANNELUP }, |
919 | - { 0x0c, KEY_CHANNELDOWN }, |
920 | - |
921 | - { 0x2d, KEY_REWIND }, |
922 | - { 0x30, KEY_PLAYPAUSE }, |
923 | - { 0x33, KEY_FASTFORWARD }, |
924 | - { 0x3c, KEY_STOP }, |
925 | - { 0x36, KEY_RECORD }, |
926 | - { 0x3f, KEY_EPG }, /* Labeled "?" */ |
927 | + /* Key codes for the tiny Pinnacle remote*/ |
928 | + { 0x0700, KEY_MUTE }, |
929 | + { 0x0701, KEY_MENU }, /* Pinnacle logo */ |
930 | + { 0x0739, KEY_POWER }, |
931 | + { 0x0703, KEY_VOLUMEUP }, |
932 | + { 0x0709, KEY_VOLUMEDOWN }, |
933 | + { 0x0706, KEY_CHANNELUP }, |
934 | + { 0x070c, KEY_CHANNELDOWN }, |
935 | + { 0x070f, KEY_1 }, |
936 | + { 0x0715, KEY_2 }, |
937 | + { 0x0710, KEY_3 }, |
938 | + { 0x0718, KEY_4 }, |
939 | + { 0x071b, KEY_5 }, |
940 | + { 0x071e, KEY_6 }, |
941 | + { 0x0711, KEY_7 }, |
942 | + { 0x0721, KEY_8 }, |
943 | + { 0x0712, KEY_9 }, |
944 | + { 0x0727, KEY_0 }, |
945 | + { 0x0724, KEY_ZOOM }, /* 'Square' key */ |
946 | + { 0x072a, KEY_SUBTITLE }, /* 'T' key */ |
947 | + { 0x072d, KEY_REWIND }, |
948 | + { 0x0730, KEY_PLAYPAUSE }, |
949 | + { 0x0733, KEY_FASTFORWARD }, |
950 | + { 0x0736, KEY_RECORD }, |
951 | + { 0x073c, KEY_STOP }, |
952 | + { 0x073f, KEY_HELP }, /* '?' key */ |
953 | }; |
954 | |
955 | static struct rc_map_list pinnacle_pctv_hd_map = { |
956 | .map = { |
957 | .scan = pinnacle_pctv_hd, |
958 | .size = ARRAY_SIZE(pinnacle_pctv_hd), |
959 | - .rc_type = RC_TYPE_UNKNOWN, /* Legacy IR type */ |
960 | + .rc_type = RC_TYPE_RC5, |
961 | .name = RC_MAP_PINNACLE_PCTV_HD, |
962 | } |
963 | }; |
964 | diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c |
965 | index f14581b..48c5c57 100644 |
966 | --- a/drivers/media/video/uvc/uvc_queue.c |
967 | +++ b/drivers/media/video/uvc/uvc_queue.c |
968 | @@ -104,6 +104,8 @@ static int __uvc_free_buffers(struct uvc_video_queue *queue) |
969 | } |
970 | |
971 | if (queue->count) { |
972 | + uvc_queue_cancel(queue, 0); |
973 | + INIT_LIST_HEAD(&queue->mainqueue); |
974 | vfree(queue->mem); |
975 | queue->count = 0; |
976 | } |
977 | diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c |
978 | index 81d7fa4..150cd70 100644 |
979 | --- a/drivers/misc/lkdtm.c |
980 | +++ b/drivers/misc/lkdtm.c |
981 | @@ -120,6 +120,7 @@ static int recur_count = REC_NUM_DEFAULT; |
982 | static enum cname cpoint = CN_INVALID; |
983 | static enum ctype cptype = CT_NONE; |
984 | static int count = DEFAULT_COUNT; |
985 | +static DEFINE_SPINLOCK(count_lock); |
986 | |
987 | module_param(recur_count, int, 0644); |
988 | MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\ |
989 | @@ -230,11 +231,14 @@ static const char *cp_name_to_str(enum cname name) |
990 | static int lkdtm_parse_commandline(void) |
991 | { |
992 | int i; |
993 | + unsigned long flags; |
994 | |
995 | if (cpoint_count < 1 || recur_count < 1) |
996 | return -EINVAL; |
997 | |
998 | + spin_lock_irqsave(&count_lock, flags); |
999 | count = cpoint_count; |
1000 | + spin_unlock_irqrestore(&count_lock, flags); |
1001 | |
1002 | /* No special parameters */ |
1003 | if (!cpoint_type && !cpoint_name) |
1004 | @@ -349,6 +353,9 @@ static void lkdtm_do_action(enum ctype which) |
1005 | |
1006 | static void lkdtm_handler(void) |
1007 | { |
1008 | + unsigned long flags; |
1009 | + |
1010 | + spin_lock_irqsave(&count_lock, flags); |
1011 | count--; |
1012 | printk(KERN_INFO "lkdtm: Crash point %s of type %s hit, trigger in %d rounds\n", |
1013 | cp_name_to_str(cpoint), cp_type_to_str(cptype), count); |
1014 | @@ -357,6 +364,7 @@ static void lkdtm_handler(void) |
1015 | lkdtm_do_action(cptype); |
1016 | count = cpoint_count; |
1017 | } |
1018 | + spin_unlock_irqrestore(&count_lock, flags); |
1019 | } |
1020 | |
1021 | static int lkdtm_register_cpoint(enum cname which) |
1022 | diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c |
1023 | index 710339a..b98196c 100644 |
1024 | --- a/drivers/mmc/host/tmio_mmc_pio.c |
1025 | +++ b/drivers/mmc/host/tmio_mmc_pio.c |
1026 | @@ -760,8 +760,8 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc) |
1027 | struct tmio_mmc_host *host = mmc_priv(mmc); |
1028 | struct tmio_mmc_data *pdata = host->pdata; |
1029 | |
1030 | - return ((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) || |
1031 | - !(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT)); |
1032 | + return !((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) || |
1033 | + (sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT)); |
1034 | } |
1035 | |
1036 | static int tmio_mmc_get_cd(struct mmc_host *mmc) |
1037 | diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c |
1038 | index 3e5d0b6..0d28378 100644 |
1039 | --- a/drivers/net/hamradio/6pack.c |
1040 | +++ b/drivers/net/hamradio/6pack.c |
1041 | @@ -692,10 +692,10 @@ static void sixpack_close(struct tty_struct *tty) |
1042 | { |
1043 | struct sixpack *sp; |
1044 | |
1045 | - write_lock(&disc_data_lock); |
1046 | + write_lock_bh(&disc_data_lock); |
1047 | sp = tty->disc_data; |
1048 | tty->disc_data = NULL; |
1049 | - write_unlock(&disc_data_lock); |
1050 | + write_unlock_bh(&disc_data_lock); |
1051 | if (!sp) |
1052 | return; |
1053 | |
1054 | diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c |
1055 | index 4c62839..bc02968 100644 |
1056 | --- a/drivers/net/hamradio/mkiss.c |
1057 | +++ b/drivers/net/hamradio/mkiss.c |
1058 | @@ -813,10 +813,10 @@ static void mkiss_close(struct tty_struct *tty) |
1059 | { |
1060 | struct mkiss *ax; |
1061 | |
1062 | - write_lock(&disc_data_lock); |
1063 | + write_lock_bh(&disc_data_lock); |
1064 | ax = tty->disc_data; |
1065 | tty->disc_data = NULL; |
1066 | - write_unlock(&disc_data_lock); |
1067 | + write_unlock_bh(&disc_data_lock); |
1068 | |
1069 | if (!ax) |
1070 | return; |
1071 | diff --git a/drivers/net/pxa168_eth.c b/drivers/net/pxa168_eth.c |
1072 | index 89f7540..5f597ca 100644 |
1073 | --- a/drivers/net/pxa168_eth.c |
1074 | +++ b/drivers/net/pxa168_eth.c |
1075 | @@ -1273,7 +1273,7 @@ static int pxa168_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) |
1076 | wmb(); |
1077 | wrl(pep, SDMA_CMD, SDMA_CMD_TXDH | SDMA_CMD_ERD); |
1078 | |
1079 | - stats->tx_bytes += skb->len; |
1080 | + stats->tx_bytes += length; |
1081 | stats->tx_packets++; |
1082 | dev->trans_start = jiffies; |
1083 | if (pep->tx_ring_size - pep->tx_desc_count <= 1) { |
1084 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c |
1085 | index 349a596..76d5089 100644 |
1086 | --- a/drivers/net/wireless/ath/ath5k/base.c |
1087 | +++ b/drivers/net/wireless/ath/ath5k/base.c |
1088 | @@ -72,6 +72,11 @@ static int modparam_all_channels; |
1089 | module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO); |
1090 | MODULE_PARM_DESC(all_channels, "Expose all channels the device can use."); |
1091 | |
1092 | +static int modparam_fastchanswitch; |
1093 | +module_param_named(fastchanswitch, modparam_fastchanswitch, bool, S_IRUGO); |
1094 | +MODULE_PARM_DESC(fastchanswitch, "Enable fast channel switching for AR2413/AR5413 radios."); |
1095 | + |
1096 | + |
1097 | /* Module info */ |
1098 | MODULE_AUTHOR("Jiri Slaby"); |
1099 | MODULE_AUTHOR("Nick Kossifidis"); |
1100 | @@ -2644,6 +2649,7 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan, |
1101 | struct ath5k_hw *ah = sc->ah; |
1102 | struct ath_common *common = ath5k_hw_common(ah); |
1103 | int ret, ani_mode; |
1104 | + bool fast; |
1105 | |
1106 | ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "resetting\n"); |
1107 | |
1108 | @@ -2663,7 +2669,10 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan, |
1109 | ath5k_drain_tx_buffs(sc); |
1110 | if (chan) |
1111 | sc->curchan = chan; |
1112 | - ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, chan != NULL, |
1113 | + |
1114 | + fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0; |
1115 | + |
1116 | + ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, fast, |
1117 | skip_pcu); |
1118 | if (ret) { |
1119 | ATH5K_ERR(sc, "can't reset hardware (%d)\n", ret); |
1120 | diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c |
1121 | index efb672c..a33ae01 100644 |
1122 | --- a/drivers/net/wireless/ath/ath5k/eeprom.c |
1123 | +++ b/drivers/net/wireless/ath/ath5k/eeprom.c |
1124 | @@ -1565,14 +1565,12 @@ ath5k_eeprom_free_pcal_info(struct ath5k_hw *ah, int mode) |
1125 | if (!chinfo[pier].pd_curves) |
1126 | continue; |
1127 | |
1128 | - for (pdg = 0; pdg < ee->ee_pd_gains[mode]; pdg++) { |
1129 | + for (pdg = 0; pdg < AR5K_EEPROM_N_PD_CURVES; pdg++) { |
1130 | struct ath5k_pdgain_info *pd = |
1131 | &chinfo[pier].pd_curves[pdg]; |
1132 | |
1133 | - if (pd != NULL) { |
1134 | - kfree(pd->pd_step); |
1135 | - kfree(pd->pd_pwr); |
1136 | - } |
1137 | + kfree(pd->pd_step); |
1138 | + kfree(pd->pd_pwr); |
1139 | } |
1140 | |
1141 | kfree(chinfo[pier].pd_curves); |
1142 | diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c |
1143 | index 8420689..6f53d2b 100644 |
1144 | --- a/drivers/net/wireless/ath/ath5k/reset.c |
1145 | +++ b/drivers/net/wireless/ath/ath5k/reset.c |
1146 | @@ -1119,8 +1119,11 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, |
1147 | /* Non fatal, can happen eg. |
1148 | * on mode change */ |
1149 | ret = 0; |
1150 | - } else |
1151 | + } else { |
1152 | + ATH5K_DBG(ah->ah_sc, ATH5K_DEBUG_RESET, |
1153 | + "fast chan change successful\n"); |
1154 | return 0; |
1155 | + } |
1156 | } |
1157 | |
1158 | /* |
1159 | diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c |
1160 | index 9c65459..e137212 100644 |
1161 | --- a/drivers/net/wireless/ath/ath9k/pci.c |
1162 | +++ b/drivers/net/wireless/ath/ath9k/pci.c |
1163 | @@ -278,6 +278,12 @@ static int ath_pci_suspend(struct device *device) |
1164 | |
1165 | ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); |
1166 | |
1167 | + /* The device has to be moved to FULLSLEEP forcibly. |
1168 | + * Otherwise the chip never moved to full sleep, |
1169 | + * when no interface is up. |
1170 | + */ |
1171 | + ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP); |
1172 | + |
1173 | return 0; |
1174 | } |
1175 | |
1176 | diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c |
1177 | index 7950bc4..7fd7fe6 100644 |
1178 | --- a/drivers/net/wireless/iwlwifi/iwl-core.c |
1179 | +++ b/drivers/net/wireless/iwlwifi/iwl-core.c |
1180 | @@ -1772,6 +1772,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1181 | struct iwl_priv *priv = hw->priv; |
1182 | struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif); |
1183 | struct iwl_rxon_context *tmp; |
1184 | + enum nl80211_iftype newviftype = newtype; |
1185 | u32 interface_modes; |
1186 | int err; |
1187 | |
1188 | @@ -1814,7 +1815,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1189 | |
1190 | /* success */ |
1191 | iwl_teardown_interface(priv, vif, true); |
1192 | - vif->type = newtype; |
1193 | + vif->type = newviftype; |
1194 | vif->p2p = newp2p; |
1195 | err = iwl_setup_interface(priv, ctx); |
1196 | WARN_ON(err); |
1197 | diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c |
1198 | index 135df16..46767c5 100644 |
1199 | --- a/drivers/pci/pci-driver.c |
1200 | +++ b/drivers/pci/pci-driver.c |
1201 | @@ -624,7 +624,7 @@ static int pci_pm_prepare(struct device *dev) |
1202 | * system from the sleep state, we'll have to prevent it from signaling |
1203 | * wake-up. |
1204 | */ |
1205 | - pm_runtime_resume(dev); |
1206 | + pm_runtime_get_sync(dev); |
1207 | |
1208 | if (drv && drv->pm && drv->pm->prepare) |
1209 | error = drv->pm->prepare(dev); |
1210 | @@ -638,6 +638,8 @@ static void pci_pm_complete(struct device *dev) |
1211 | |
1212 | if (drv && drv->pm && drv->pm->complete) |
1213 | drv->pm->complete(dev); |
1214 | + |
1215 | + pm_runtime_put_sync(dev); |
1216 | } |
1217 | |
1218 | #else /* !CONFIG_PM_SLEEP */ |
1219 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
1220 | index 4b2bbe8..a5747c2 100644 |
1221 | --- a/drivers/pci/quirks.c |
1222 | +++ b/drivers/pci/quirks.c |
1223 | @@ -2758,6 +2758,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) |
1224 | } |
1225 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
1226 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
1227 | +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); |
1228 | +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832); |
1229 | #endif /*CONFIG_MMC_RICOH_MMC*/ |
1230 | |
1231 | #if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP) |
1232 | diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c |
1233 | index dd6a57c..4e051f6 100644 |
1234 | --- a/drivers/staging/lirc/lirc_zilog.c |
1235 | +++ b/drivers/staging/lirc/lirc_zilog.c |
1236 | @@ -475,14 +475,14 @@ static int lirc_thread(void *arg) |
1237 | dprintk("poll thread started\n"); |
1238 | |
1239 | while (!kthread_should_stop()) { |
1240 | + set_current_state(TASK_INTERRUPTIBLE); |
1241 | + |
1242 | /* if device not opened, we can sleep half a second */ |
1243 | if (atomic_read(&ir->open_count) == 0) { |
1244 | schedule_timeout(HZ/2); |
1245 | continue; |
1246 | } |
1247 | |
1248 | - set_current_state(TASK_INTERRUPTIBLE); |
1249 | - |
1250 | /* |
1251 | * This is ~113*2 + 24 + jitter (2*repeat gap + code length). |
1252 | * We use this interval as the chip resets every time you poll |
1253 | diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c |
1254 | index 26403b8..da9270e 100644 |
1255 | --- a/drivers/tty/serial/pch_uart.c |
1256 | +++ b/drivers/tty/serial/pch_uart.c |
1257 | @@ -1392,6 +1392,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, |
1258 | int fifosize, base_baud; |
1259 | int port_type; |
1260 | struct pch_uart_driver_data *board; |
1261 | + const char *board_name; |
1262 | |
1263 | board = &drv_dat[id->driver_data]; |
1264 | port_type = board->port_type; |
1265 | @@ -1407,7 +1408,8 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, |
1266 | base_baud = 1843200; /* 1.8432MHz */ |
1267 | |
1268 | /* quirk for CM-iTC board */ |
1269 | - if (strstr(dmi_get_system_info(DMI_BOARD_NAME), "CM-iTC")) |
1270 | + board_name = dmi_get_system_info(DMI_BOARD_NAME); |
1271 | + if (board_name && strstr(board_name, "CM-iTC")) |
1272 | base_baud = 192000000; /* 192.0MHz */ |
1273 | |
1274 | switch (port_type) { |
1275 | diff --git a/drivers/tty/serial/s5pv210.c b/drivers/tty/serial/s5pv210.c |
1276 | index 6ebccd7..453e5b7 100644 |
1277 | --- a/drivers/tty/serial/s5pv210.c |
1278 | +++ b/drivers/tty/serial/s5pv210.c |
1279 | @@ -31,7 +31,7 @@ static int s5pv210_serial_setsource(struct uart_port *port, |
1280 | struct s3c2410_uartcfg *cfg = port->dev->platform_data; |
1281 | unsigned long ucon = rd_regl(port, S3C2410_UCON); |
1282 | |
1283 | - if ((cfg->clocks_size) == 1) |
1284 | + if (cfg->flags & NO_NEED_CHECK_CLKSRC) |
1285 | return 0; |
1286 | |
1287 | if (strcmp(clk->name, "pclk") == 0) |
1288 | @@ -56,7 +56,7 @@ static int s5pv210_serial_getsource(struct uart_port *port, |
1289 | |
1290 | clk->divisor = 1; |
1291 | |
1292 | - if ((cfg->clocks_size) == 1) |
1293 | + if (cfg->flags & NO_NEED_CHECK_CLKSRC) |
1294 | return 0; |
1295 | |
1296 | switch (ucon & S5PV210_UCON_CLKMASK) { |
1297 | diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c |
1298 | index e19e136..1104c9d 100644 |
1299 | --- a/drivers/tty/tty_ldisc.c |
1300 | +++ b/drivers/tty/tty_ldisc.c |
1301 | @@ -555,7 +555,7 @@ static void tty_ldisc_flush_works(struct tty_struct *tty) |
1302 | static int tty_ldisc_wait_idle(struct tty_struct *tty) |
1303 | { |
1304 | int ret; |
1305 | - ret = wait_event_interruptible_timeout(tty_ldisc_idle, |
1306 | + ret = wait_event_timeout(tty_ldisc_idle, |
1307 | atomic_read(&tty->ldisc->users) == 1, 5 * HZ); |
1308 | if (ret < 0) |
1309 | return ret; |
1310 | @@ -763,6 +763,8 @@ static int tty_ldisc_reinit(struct tty_struct *tty, int ldisc) |
1311 | if (IS_ERR(ld)) |
1312 | return -1; |
1313 | |
1314 | + WARN_ON_ONCE(tty_ldisc_wait_idle(tty)); |
1315 | + |
1316 | tty_ldisc_close(tty, tty->ldisc); |
1317 | tty_ldisc_put(tty->ldisc); |
1318 | tty->ldisc = NULL; |
1319 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
1320 | index e35a176..34e3da5 100644 |
1321 | --- a/drivers/usb/core/driver.c |
1322 | +++ b/drivers/usb/core/driver.c |
1323 | @@ -375,7 +375,7 @@ static int usb_unbind_interface(struct device *dev) |
1324 | * Just re-enable it without affecting the endpoint toggles. |
1325 | */ |
1326 | usb_enable_interface(udev, intf, false); |
1327 | - } else if (!error && !intf->dev.power.in_suspend) { |
1328 | + } else if (!error && !intf->dev.power.is_prepared) { |
1329 | r = usb_set_interface(udev, intf->altsetting[0]. |
1330 | desc.bInterfaceNumber, 0); |
1331 | if (r < 0) |
1332 | @@ -960,7 +960,7 @@ void usb_rebind_intf(struct usb_interface *intf) |
1333 | } |
1334 | |
1335 | /* Try to rebind the interface */ |
1336 | - if (!intf->dev.power.in_suspend) { |
1337 | + if (!intf->dev.power.is_prepared) { |
1338 | intf->needs_binding = 0; |
1339 | rc = device_attach(&intf->dev); |
1340 | if (rc < 0) |
1341 | @@ -1107,7 +1107,7 @@ static int usb_resume_interface(struct usb_device *udev, |
1342 | if (intf->condition == USB_INTERFACE_UNBOUND) { |
1343 | |
1344 | /* Carry out a deferred switch to altsetting 0 */ |
1345 | - if (intf->needs_altsetting0 && !intf->dev.power.in_suspend) { |
1346 | + if (intf->needs_altsetting0 && !intf->dev.power.is_prepared) { |
1347 | usb_set_interface(udev, intf->altsetting[0]. |
1348 | desc.bInterfaceNumber, 0); |
1349 | intf->needs_altsetting0 = 0; |
1350 | @@ -1187,13 +1187,22 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) |
1351 | for (i = n - 1; i >= 0; --i) { |
1352 | intf = udev->actconfig->interface[i]; |
1353 | status = usb_suspend_interface(udev, intf, msg); |
1354 | + |
1355 | + /* Ignore errors during system sleep transitions */ |
1356 | + if (!(msg.event & PM_EVENT_AUTO)) |
1357 | + status = 0; |
1358 | if (status != 0) |
1359 | break; |
1360 | } |
1361 | } |
1362 | - if (status == 0) |
1363 | + if (status == 0) { |
1364 | status = usb_suspend_device(udev, msg); |
1365 | |
1366 | + /* Again, ignore errors during system sleep transitions */ |
1367 | + if (!(msg.event & PM_EVENT_AUTO)) |
1368 | + status = 0; |
1369 | + } |
1370 | + |
1371 | /* If the suspend failed, resume interfaces that did get suspended */ |
1372 | if (status != 0) { |
1373 | msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); |
1374 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1375 | index 78e7f25..64edb30 100644 |
1376 | --- a/drivers/usb/core/hub.c |
1377 | +++ b/drivers/usb/core/hub.c |
1378 | @@ -1643,6 +1643,7 @@ void usb_disconnect(struct usb_device **pdev) |
1379 | { |
1380 | struct usb_device *udev = *pdev; |
1381 | int i; |
1382 | + struct usb_hcd *hcd = bus_to_hcd(udev->bus); |
1383 | |
1384 | if (!udev) { |
1385 | pr_debug ("%s nodev\n", __func__); |
1386 | @@ -1670,7 +1671,9 @@ void usb_disconnect(struct usb_device **pdev) |
1387 | * so that the hardware is now fully quiesced. |
1388 | */ |
1389 | dev_dbg (&udev->dev, "unregistering device\n"); |
1390 | + mutex_lock(hcd->bandwidth_mutex); |
1391 | usb_disable_device(udev, 0); |
1392 | + mutex_unlock(hcd->bandwidth_mutex); |
1393 | usb_hcd_synchronize_unlinks(udev); |
1394 | |
1395 | usb_remove_ep_devs(&udev->ep0); |
1396 | @@ -2308,6 +2311,10 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
1397 | USB_DEVICE_REMOTE_WAKEUP, 0, |
1398 | NULL, 0, |
1399 | USB_CTRL_SET_TIMEOUT); |
1400 | + |
1401 | + /* System sleep transitions should never fail */ |
1402 | + if (!(msg.event & PM_EVENT_AUTO)) |
1403 | + status = 0; |
1404 | } else { |
1405 | /* device has up to 10 msec to fully suspend */ |
1406 | dev_dbg(&udev->dev, "usb %ssuspend\n", |
1407 | @@ -2546,16 +2553,15 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) |
1408 | struct usb_device *hdev = hub->hdev; |
1409 | unsigned port1; |
1410 | |
1411 | - /* fail if children aren't already suspended */ |
1412 | + /* Warn if children aren't already suspended */ |
1413 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
1414 | struct usb_device *udev; |
1415 | |
1416 | udev = hdev->children [port1-1]; |
1417 | if (udev && udev->can_submit) { |
1418 | - if (!(msg.event & PM_EVENT_AUTO)) |
1419 | - dev_dbg(&intf->dev, "port %d nyet suspended\n", |
1420 | - port1); |
1421 | - return -EBUSY; |
1422 | + dev_warn(&intf->dev, "port %d nyet suspended\n", port1); |
1423 | + if (msg.event & PM_EVENT_AUTO) |
1424 | + return -EBUSY; |
1425 | } |
1426 | } |
1427 | |
1428 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
1429 | index 5701e85..0b5ec23 100644 |
1430 | --- a/drivers/usb/core/message.c |
1431 | +++ b/drivers/usb/core/message.c |
1432 | @@ -1135,15 +1135,26 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf, |
1433 | * Deallocates hcd/hardware state for the endpoints (nuking all or most |
1434 | * pending urbs) and usbcore state for the interfaces, so that usbcore |
1435 | * must usb_set_configuration() before any interfaces could be used. |
1436 | + * |
1437 | + * Must be called with hcd->bandwidth_mutex held. |
1438 | */ |
1439 | void usb_disable_device(struct usb_device *dev, int skip_ep0) |
1440 | { |
1441 | int i; |
1442 | + struct usb_hcd *hcd = bus_to_hcd(dev->bus); |
1443 | |
1444 | /* getting rid of interfaces will disconnect |
1445 | * any drivers bound to them (a key side effect) |
1446 | */ |
1447 | if (dev->actconfig) { |
1448 | + /* |
1449 | + * FIXME: In order to avoid self-deadlock involving the |
1450 | + * bandwidth_mutex, we have to mark all the interfaces |
1451 | + * before unregistering any of them. |
1452 | + */ |
1453 | + for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) |
1454 | + dev->actconfig->interface[i]->unregistering = 1; |
1455 | + |
1456 | for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { |
1457 | struct usb_interface *interface; |
1458 | |
1459 | @@ -1153,7 +1164,6 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) |
1460 | continue; |
1461 | dev_dbg(&dev->dev, "unregistering interface %s\n", |
1462 | dev_name(&interface->dev)); |
1463 | - interface->unregistering = 1; |
1464 | remove_intf_ep_devs(interface); |
1465 | device_del(&interface->dev); |
1466 | } |
1467 | @@ -1172,6 +1182,16 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) |
1468 | |
1469 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__, |
1470 | skip_ep0 ? "non-ep0" : "all"); |
1471 | + if (hcd->driver->check_bandwidth) { |
1472 | + /* First pass: Cancel URBs, leave endpoint pointers intact. */ |
1473 | + for (i = skip_ep0; i < 16; ++i) { |
1474 | + usb_disable_endpoint(dev, i, false); |
1475 | + usb_disable_endpoint(dev, i + USB_DIR_IN, false); |
1476 | + } |
1477 | + /* Remove endpoints from the host controller internal state */ |
1478 | + usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); |
1479 | + /* Second pass: remove endpoint pointers */ |
1480 | + } |
1481 | for (i = skip_ep0; i < 16; ++i) { |
1482 | usb_disable_endpoint(dev, i, true); |
1483 | usb_disable_endpoint(dev, i + USB_DIR_IN, true); |
1484 | @@ -1273,6 +1293,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) |
1485 | interface); |
1486 | return -EINVAL; |
1487 | } |
1488 | + if (iface->unregistering) |
1489 | + return -ENODEV; |
1490 | |
1491 | alt = usb_altnum_to_altsetting(iface, alternate); |
1492 | if (!alt) { |
1493 | @@ -1727,6 +1749,7 @@ free_interfaces: |
1494 | /* if it's already configured, clear out old state first. |
1495 | * getting rid of old interfaces means unbinding their drivers. |
1496 | */ |
1497 | + mutex_lock(hcd->bandwidth_mutex); |
1498 | if (dev->state != USB_STATE_ADDRESS) |
1499 | usb_disable_device(dev, 1); /* Skip ep0 */ |
1500 | |
1501 | @@ -1739,7 +1762,6 @@ free_interfaces: |
1502 | * host controller will not allow submissions to dropped endpoints. If |
1503 | * this call fails, the device state is unchanged. |
1504 | */ |
1505 | - mutex_lock(hcd->bandwidth_mutex); |
1506 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); |
1507 | if (ret < 0) { |
1508 | mutex_unlock(hcd->bandwidth_mutex); |
1509 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
1510 | index 4940717..6fce318 100644 |
1511 | --- a/drivers/usb/host/xhci-pci.c |
1512 | +++ b/drivers/usb/host/xhci-pci.c |
1513 | @@ -28,6 +28,9 @@ |
1514 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
1515 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
1516 | |
1517 | +#define PCI_VENDOR_ID_ETRON 0x1b6f |
1518 | +#define PCI_DEVICE_ID_ASROCK_P67 0x7023 |
1519 | + |
1520 | static const char hcd_name[] = "xhci_hcd"; |
1521 | |
1522 | /* called after powerup, by probe or system-pm "wakeup" */ |
1523 | @@ -120,6 +123,11 @@ static int xhci_pci_setup(struct usb_hcd *hcd) |
1524 | "has broken MSI implementation\n", |
1525 | pdev->revision); |
1526 | } |
1527 | + if (pdev->vendor == PCI_VENDOR_ID_ETRON && |
1528 | + pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
1529 | + xhci->quirks |= XHCI_RESET_ON_RESUME; |
1530 | + xhci_dbg(xhci, "QUIRK: Resetting on resume\n"); |
1531 | + } |
1532 | |
1533 | if (pdev->vendor == PCI_VENDOR_ID_NEC) |
1534 | xhci->quirks |= XHCI_NEC_HOST; |
1535 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1536 | index 078b566..a5e96cb 100644 |
1537 | --- a/drivers/usb/host/xhci-ring.c |
1538 | +++ b/drivers/usb/host/xhci-ring.c |
1539 | @@ -1768,9 +1768,6 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, |
1540 | } |
1541 | } |
1542 | |
1543 | - if ((idx == urb_priv->length - 1) && *status == -EINPROGRESS) |
1544 | - *status = 0; |
1545 | - |
1546 | return finish_td(xhci, td, event_trb, event, ep, status, false); |
1547 | } |
1548 | |
1549 | @@ -1788,8 +1785,7 @@ static int skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, |
1550 | idx = urb_priv->td_cnt; |
1551 | frame = &td->urb->iso_frame_desc[idx]; |
1552 | |
1553 | - /* The transfer is partly done */ |
1554 | - *status = -EXDEV; |
1555 | + /* The transfer is partly done. */ |
1556 | frame->status = -EXDEV; |
1557 | |
1558 | /* calc actual length */ |
1559 | @@ -2139,6 +2135,11 @@ cleanup: |
1560 | "status = %d\n", |
1561 | urb, urb->actual_length, status); |
1562 | spin_unlock(&xhci->lock); |
1563 | + /* EHCI, UHCI, and OHCI always unconditionally set the |
1564 | + * urb->status of an isochronous endpoint to 0. |
1565 | + */ |
1566 | + if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) |
1567 | + status = 0; |
1568 | usb_hcd_giveback_urb(bus_to_hcd(urb->dev->bus), urb, status); |
1569 | spin_lock(&xhci->lock); |
1570 | } |
1571 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1572 | index e5c4861..4209b02 100644 |
1573 | --- a/drivers/usb/host/xhci.c |
1574 | +++ b/drivers/usb/host/xhci.c |
1575 | @@ -759,6 +759,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
1576 | msleep(100); |
1577 | |
1578 | spin_lock_irq(&xhci->lock); |
1579 | + if (xhci->quirks & XHCI_RESET_ON_RESUME) |
1580 | + hibernated = true; |
1581 | |
1582 | if (!hibernated) { |
1583 | /* step 1: restore register */ |
1584 | @@ -1396,6 +1398,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, |
1585 | u32 added_ctxs; |
1586 | unsigned int last_ctx; |
1587 | u32 new_add_flags, new_drop_flags, new_slot_info; |
1588 | + struct xhci_virt_device *virt_dev; |
1589 | int ret = 0; |
1590 | |
1591 | ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); |
1592 | @@ -1418,11 +1421,25 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, |
1593 | return 0; |
1594 | } |
1595 | |
1596 | - in_ctx = xhci->devs[udev->slot_id]->in_ctx; |
1597 | - out_ctx = xhci->devs[udev->slot_id]->out_ctx; |
1598 | + virt_dev = xhci->devs[udev->slot_id]; |
1599 | + in_ctx = virt_dev->in_ctx; |
1600 | + out_ctx = virt_dev->out_ctx; |
1601 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
1602 | ep_index = xhci_get_endpoint_index(&ep->desc); |
1603 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
1604 | + |
1605 | + /* If this endpoint is already in use, and the upper layers are trying |
1606 | + * to add it again without dropping it, reject the addition. |
1607 | + */ |
1608 | + if (virt_dev->eps[ep_index].ring && |
1609 | + !(le32_to_cpu(ctrl_ctx->drop_flags) & |
1610 | + xhci_get_endpoint_flag(&ep->desc))) { |
1611 | + xhci_warn(xhci, "Trying to add endpoint 0x%x " |
1612 | + "without dropping it.\n", |
1613 | + (unsigned int) ep->desc.bEndpointAddress); |
1614 | + return -EINVAL; |
1615 | + } |
1616 | + |
1617 | /* If the HCD has already noted the endpoint is enabled, |
1618 | * ignore this request. |
1619 | */ |
1620 | @@ -1437,8 +1454,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, |
1621 | * process context, not interrupt context (or so documenation |
1622 | * for usb_set_interface() and usb_set_configuration() claim). |
1623 | */ |
1624 | - if (xhci_endpoint_init(xhci, xhci->devs[udev->slot_id], |
1625 | - udev, ep, GFP_NOIO) < 0) { |
1626 | + if (xhci_endpoint_init(xhci, virt_dev, udev, ep, GFP_NOIO) < 0) { |
1627 | dev_dbg(&udev->dev, "%s - could not initialize ep %#x\n", |
1628 | __func__, ep->desc.bEndpointAddress); |
1629 | return -ENOMEM; |
1630 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
1631 | index fb85ce3..1e52d5e 100644 |
1632 | --- a/drivers/usb/host/xhci.h |
1633 | +++ b/drivers/usb/host/xhci.h |
1634 | @@ -1287,6 +1287,7 @@ struct xhci_hcd { |
1635 | #define XHCI_NEC_HOST (1 << 2) |
1636 | #define XHCI_AMD_PLL_FIX (1 << 3) |
1637 | #define XHCI_BROKEN_MSI (1 << 6) |
1638 | +#define XHCI_RESET_ON_RESUME (1 << 7) |
1639 | /* There are two roothubs to keep track of bus suspend info for */ |
1640 | struct xhci_bus_state bus_state[2]; |
1641 | /* Is each xHCI roothub port a USB 3.0, USB 2.0, or USB 1.1 port? */ |
1642 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1643 | index 1627289..2e06b90 100644 |
1644 | --- a/drivers/usb/serial/ftdi_sio.c |
1645 | +++ b/drivers/usb/serial/ftdi_sio.c |
1646 | @@ -179,6 +179,7 @@ static struct usb_device_id id_table_combined [] = { |
1647 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, |
1648 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
1649 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, |
1650 | + { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, |
1651 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
1652 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
1653 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, |
1654 | @@ -848,7 +849,8 @@ static const char *ftdi_chip_name[] = { |
1655 | [FT2232C] = "FT2232C", |
1656 | [FT232RL] = "FT232RL", |
1657 | [FT2232H] = "FT2232H", |
1658 | - [FT4232H] = "FT4232H" |
1659 | + [FT4232H] = "FT4232H", |
1660 | + [FT232H] = "FT232H" |
1661 | }; |
1662 | |
1663 | |
1664 | @@ -1168,6 +1170,7 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, |
1665 | break; |
1666 | case FT2232H: /* FT2232H chip */ |
1667 | case FT4232H: /* FT4232H chip */ |
1668 | + case FT232H: /* FT232H chip */ |
1669 | if ((baud <= 12000000) & (baud >= 1200)) { |
1670 | div_value = ftdi_2232h_baud_to_divisor(baud); |
1671 | } else if (baud < 1200) { |
1672 | @@ -1429,9 +1432,12 @@ static void ftdi_determine_type(struct usb_serial_port *port) |
1673 | } else if (version < 0x600) { |
1674 | /* Assume it's an FT232BM (or FT245BM) */ |
1675 | priv->chip_type = FT232BM; |
1676 | - } else { |
1677 | - /* Assume it's an FT232R */ |
1678 | + } else if (version < 0x900) { |
1679 | + /* Assume it's an FT232RL */ |
1680 | priv->chip_type = FT232RL; |
1681 | + } else { |
1682 | + /* Assume it's an FT232H */ |
1683 | + priv->chip_type = FT232H; |
1684 | } |
1685 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); |
1686 | } |
1687 | @@ -1559,7 +1565,8 @@ static int create_sysfs_attrs(struct usb_serial_port *port) |
1688 | priv->chip_type == FT2232C || |
1689 | priv->chip_type == FT232RL || |
1690 | priv->chip_type == FT2232H || |
1691 | - priv->chip_type == FT4232H)) { |
1692 | + priv->chip_type == FT4232H || |
1693 | + priv->chip_type == FT232H)) { |
1694 | retval = device_create_file(&port->dev, |
1695 | &dev_attr_latency_timer); |
1696 | } |
1697 | @@ -1580,7 +1587,8 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) |
1698 | priv->chip_type == FT2232C || |
1699 | priv->chip_type == FT232RL || |
1700 | priv->chip_type == FT2232H || |
1701 | - priv->chip_type == FT4232H) { |
1702 | + priv->chip_type == FT4232H || |
1703 | + priv->chip_type == FT232H) { |
1704 | device_remove_file(&port->dev, &dev_attr_latency_timer); |
1705 | } |
1706 | } |
1707 | @@ -2212,6 +2220,7 @@ static int ftdi_tiocmget(struct tty_struct *tty) |
1708 | case FT232RL: |
1709 | case FT2232H: |
1710 | case FT4232H: |
1711 | + case FT232H: |
1712 | len = 2; |
1713 | break; |
1714 | default: |
1715 | diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h |
1716 | index 213fe3d..19584fa 100644 |
1717 | --- a/drivers/usb/serial/ftdi_sio.h |
1718 | +++ b/drivers/usb/serial/ftdi_sio.h |
1719 | @@ -156,7 +156,8 @@ enum ftdi_chip_type { |
1720 | FT2232C = 4, |
1721 | FT232RL = 5, |
1722 | FT2232H = 6, |
1723 | - FT4232H = 7 |
1724 | + FT4232H = 7, |
1725 | + FT232H = 8 |
1726 | }; |
1727 | |
1728 | enum ftdi_sio_baudrate { |
1729 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
1730 | index ab1fcdf..19156d1 100644 |
1731 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
1732 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
1733 | @@ -22,6 +22,7 @@ |
1734 | #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ |
1735 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ |
1736 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ |
1737 | +#define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ |
1738 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ |
1739 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ |
1740 | |
1741 | diff --git a/drivers/watchdog/mtx-1_wdt.c b/drivers/watchdog/mtx-1_wdt.c |
1742 | index 5ec5ac1..befbe80 100644 |
1743 | --- a/drivers/watchdog/mtx-1_wdt.c |
1744 | +++ b/drivers/watchdog/mtx-1_wdt.c |
1745 | @@ -211,6 +211,12 @@ static int __devinit mtx1_wdt_probe(struct platform_device *pdev) |
1746 | int ret; |
1747 | |
1748 | mtx1_wdt_device.gpio = pdev->resource[0].start; |
1749 | + ret = gpio_request_one(mtx1_wdt_device.gpio, |
1750 | + GPIOF_OUT_INIT_HIGH, "mtx1-wdt"); |
1751 | + if (ret < 0) { |
1752 | + dev_err(&pdev->dev, "failed to request gpio"); |
1753 | + return ret; |
1754 | + } |
1755 | |
1756 | spin_lock_init(&mtx1_wdt_device.lock); |
1757 | init_completion(&mtx1_wdt_device.stop); |
1758 | @@ -236,6 +242,8 @@ static int __devexit mtx1_wdt_remove(struct platform_device *pdev) |
1759 | mtx1_wdt_device.queue = 0; |
1760 | wait_for_completion(&mtx1_wdt_device.stop); |
1761 | } |
1762 | + |
1763 | + gpio_free(mtx1_wdt_device.gpio); |
1764 | misc_deregister(&mtx1_wdt_misc); |
1765 | return 0; |
1766 | } |
1767 | diff --git a/fs/block_dev.c b/fs/block_dev.c |
1768 | index 1a2421f..610e8e0 100644 |
1769 | --- a/fs/block_dev.c |
1770 | +++ b/fs/block_dev.c |
1771 | @@ -762,7 +762,19 @@ static struct block_device *bd_start_claiming(struct block_device *bdev, |
1772 | if (!disk) |
1773 | return ERR_PTR(-ENXIO); |
1774 | |
1775 | - whole = bdget_disk(disk, 0); |
1776 | + /* |
1777 | + * Normally, @bdev should equal what's returned from bdget_disk() |
1778 | + * if partno is 0; however, some drivers (floppy) use multiple |
1779 | + * bdev's for the same physical device and @bdev may be one of the |
1780 | + * aliases. Keep @bdev if partno is 0. This means claimer |
1781 | + * tracking is broken for those devices but it has always been that |
1782 | + * way. |
1783 | + */ |
1784 | + if (partno) |
1785 | + whole = bdget_disk(disk, 0); |
1786 | + else |
1787 | + whole = bdgrab(bdev); |
1788 | + |
1789 | module_put(disk->fops->owner); |
1790 | put_disk(disk); |
1791 | if (!whole) |
1792 | diff --git a/fs/cifs/fscache.c b/fs/cifs/fscache.c |
1793 | index 297a43d..05268cf 100644 |
1794 | --- a/fs/cifs/fscache.c |
1795 | +++ b/fs/cifs/fscache.c |
1796 | @@ -94,6 +94,7 @@ static void cifs_fscache_disable_inode_cookie(struct inode *inode) |
1797 | if (cifsi->fscache) { |
1798 | cFYI(1, "CIFS disabling inode cookie (0x%p)", |
1799 | cifsi->fscache); |
1800 | + fscache_uncache_all_inode_pages(cifsi->fscache, inode); |
1801 | fscache_relinquish_cookie(cifsi->fscache, 1); |
1802 | cifsi->fscache = NULL; |
1803 | } |
1804 | diff --git a/fs/fscache/page.c b/fs/fscache/page.c |
1805 | index 41c441c..52b59e2 100644 |
1806 | --- a/fs/fscache/page.c |
1807 | +++ b/fs/fscache/page.c |
1808 | @@ -967,3 +967,47 @@ void fscache_mark_pages_cached(struct fscache_retrieval *op, |
1809 | pagevec_reinit(pagevec); |
1810 | } |
1811 | EXPORT_SYMBOL(fscache_mark_pages_cached); |
1812 | + |
1813 | +/* |
1814 | + * Uncache all the pages in an inode that are marked PG_fscache, assuming them |
1815 | + * to be associated with the given cookie. |
1816 | + */ |
1817 | +void __fscache_uncache_all_inode_pages(struct fscache_cookie *cookie, |
1818 | + struct inode *inode) |
1819 | +{ |
1820 | + struct address_space *mapping = inode->i_mapping; |
1821 | + struct pagevec pvec; |
1822 | + pgoff_t next; |
1823 | + int i; |
1824 | + |
1825 | + _enter("%p,%p", cookie, inode); |
1826 | + |
1827 | + if (!mapping || mapping->nrpages == 0) { |
1828 | + _leave(" [no pages]"); |
1829 | + return; |
1830 | + } |
1831 | + |
1832 | + pagevec_init(&pvec, 0); |
1833 | + next = 0; |
1834 | + while (next <= (loff_t)-1 && |
1835 | + pagevec_lookup(&pvec, mapping, next, PAGEVEC_SIZE) |
1836 | + ) { |
1837 | + for (i = 0; i < pagevec_count(&pvec); i++) { |
1838 | + struct page *page = pvec.pages[i]; |
1839 | + pgoff_t page_index = page->index; |
1840 | + |
1841 | + ASSERTCMP(page_index, >=, next); |
1842 | + next = page_index + 1; |
1843 | + |
1844 | + if (PageFsCache(page)) { |
1845 | + __fscache_wait_on_page_write(cookie, page); |
1846 | + __fscache_uncache_page(cookie, page); |
1847 | + } |
1848 | + } |
1849 | + pagevec_release(&pvec); |
1850 | + cond_resched(); |
1851 | + } |
1852 | + |
1853 | + _leave(""); |
1854 | +} |
1855 | +EXPORT_SYMBOL(__fscache_uncache_all_inode_pages); |
1856 | diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c |
1857 | index 3031d81..4ac88ff 100644 |
1858 | --- a/fs/hfsplus/wrapper.c |
1859 | +++ b/fs/hfsplus/wrapper.c |
1860 | @@ -36,6 +36,7 @@ int hfsplus_submit_bio(struct block_device *bdev, sector_t sector, |
1861 | { |
1862 | DECLARE_COMPLETION_ONSTACK(wait); |
1863 | struct bio *bio; |
1864 | + int ret = 0; |
1865 | |
1866 | bio = bio_alloc(GFP_NOIO, 1); |
1867 | bio->bi_sector = sector; |
1868 | @@ -54,8 +55,10 @@ int hfsplus_submit_bio(struct block_device *bdev, sector_t sector, |
1869 | wait_for_completion(&wait); |
1870 | |
1871 | if (!bio_flagged(bio, BIO_UPTODATE)) |
1872 | - return -EIO; |
1873 | - return 0; |
1874 | + ret = -EIO; |
1875 | + |
1876 | + bio_put(bio); |
1877 | + return ret; |
1878 | } |
1879 | |
1880 | static int hfsplus_read_mdb(void *bufptr, struct hfsplus_wd *wd) |
1881 | diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c |
1882 | index adb45ec..e374050 100644 |
1883 | --- a/fs/lockd/clntproc.c |
1884 | +++ b/fs/lockd/clntproc.c |
1885 | @@ -708,7 +708,13 @@ static void nlmclnt_unlock_callback(struct rpc_task *task, void *data) |
1886 | |
1887 | if (task->tk_status < 0) { |
1888 | dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status); |
1889 | - goto retry_rebind; |
1890 | + switch (task->tk_status) { |
1891 | + case -EACCES: |
1892 | + case -EIO: |
1893 | + goto die; |
1894 | + default: |
1895 | + goto retry_rebind; |
1896 | + } |
1897 | } |
1898 | if (status == NLM_LCK_DENIED_GRACE_PERIOD) { |
1899 | rpc_delay(task, NLMCLNT_GRACE_WAIT); |
1900 | diff --git a/fs/locks.c b/fs/locks.c |
1901 | index 0a4f50d..b286539 100644 |
1902 | --- a/fs/locks.c |
1903 | +++ b/fs/locks.c |
1904 | @@ -160,10 +160,28 @@ EXPORT_SYMBOL_GPL(unlock_flocks); |
1905 | |
1906 | static struct kmem_cache *filelock_cache __read_mostly; |
1907 | |
1908 | +static void locks_init_lock_always(struct file_lock *fl) |
1909 | +{ |
1910 | + fl->fl_next = NULL; |
1911 | + fl->fl_fasync = NULL; |
1912 | + fl->fl_owner = NULL; |
1913 | + fl->fl_pid = 0; |
1914 | + fl->fl_nspid = NULL; |
1915 | + fl->fl_file = NULL; |
1916 | + fl->fl_flags = 0; |
1917 | + fl->fl_type = 0; |
1918 | + fl->fl_start = fl->fl_end = 0; |
1919 | +} |
1920 | + |
1921 | /* Allocate an empty lock structure. */ |
1922 | struct file_lock *locks_alloc_lock(void) |
1923 | { |
1924 | - return kmem_cache_alloc(filelock_cache, GFP_KERNEL); |
1925 | + struct file_lock *fl = kmem_cache_alloc(filelock_cache, GFP_KERNEL); |
1926 | + |
1927 | + if (fl) |
1928 | + locks_init_lock_always(fl); |
1929 | + |
1930 | + return fl; |
1931 | } |
1932 | EXPORT_SYMBOL_GPL(locks_alloc_lock); |
1933 | |
1934 | @@ -200,17 +218,9 @@ void locks_init_lock(struct file_lock *fl) |
1935 | INIT_LIST_HEAD(&fl->fl_link); |
1936 | INIT_LIST_HEAD(&fl->fl_block); |
1937 | init_waitqueue_head(&fl->fl_wait); |
1938 | - fl->fl_next = NULL; |
1939 | - fl->fl_fasync = NULL; |
1940 | - fl->fl_owner = NULL; |
1941 | - fl->fl_pid = 0; |
1942 | - fl->fl_nspid = NULL; |
1943 | - fl->fl_file = NULL; |
1944 | - fl->fl_flags = 0; |
1945 | - fl->fl_type = 0; |
1946 | - fl->fl_start = fl->fl_end = 0; |
1947 | fl->fl_ops = NULL; |
1948 | fl->fl_lmops = NULL; |
1949 | + locks_init_lock_always(fl); |
1950 | } |
1951 | |
1952 | EXPORT_SYMBOL(locks_init_lock); |
1953 | diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c |
1954 | index ce153a6..419119c 100644 |
1955 | --- a/fs/nfs/fscache.c |
1956 | +++ b/fs/nfs/fscache.c |
1957 | @@ -259,12 +259,10 @@ static void nfs_fscache_disable_inode_cookie(struct inode *inode) |
1958 | dfprintk(FSCACHE, |
1959 | "NFS: nfsi 0x%p turning cache off\n", NFS_I(inode)); |
1960 | |
1961 | - /* Need to invalidate any mapped pages that were read in before |
1962 | - * turning off the cache. |
1963 | + /* Need to uncache any pages attached to this inode that |
1964 | + * fscache knows about before turning off the cache. |
1965 | */ |
1966 | - if (inode->i_mapping && inode->i_mapping->nrpages) |
1967 | - invalidate_inode_pages2(inode->i_mapping); |
1968 | - |
1969 | + fscache_uncache_all_inode_pages(NFS_I(inode)->fscache, inode); |
1970 | nfs_fscache_zap_inode_cookie(inode); |
1971 | } |
1972 | } |
1973 | diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
1974 | index 57bb31a..19877db 100644 |
1975 | --- a/fs/nfs/inode.c |
1976 | +++ b/fs/nfs/inode.c |
1977 | @@ -256,7 +256,8 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) |
1978 | |
1979 | nfs_attr_check_mountpoint(sb, fattr); |
1980 | |
1981 | - if ((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0 && (fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) |
1982 | + if (((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0) && |
1983 | + !nfs_attr_use_mounted_on_fileid(fattr)) |
1984 | goto out_no_inode; |
1985 | if ((fattr->valid & NFS_ATTR_FATTR_TYPE) == 0) |
1986 | goto out_no_inode; |
1987 | @@ -1294,7 +1295,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) |
1988 | if (new_isize != cur_isize) { |
1989 | /* Do we perhaps have any outstanding writes, or has |
1990 | * the file grown beyond our last write? */ |
1991 | - if (nfsi->npages == 0 || new_isize > cur_isize) { |
1992 | + if ((nfsi->npages == 0 && !test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) || |
1993 | + new_isize > cur_isize) { |
1994 | i_size_write(inode, new_isize); |
1995 | invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA; |
1996 | } |
1997 | diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h |
1998 | index ce118ce..d10eb7e 100644 |
1999 | --- a/fs/nfs/internal.h |
2000 | +++ b/fs/nfs/internal.h |
2001 | @@ -45,6 +45,17 @@ static inline void nfs_attr_check_mountpoint(struct super_block *parent, struct |
2002 | fattr->valid |= NFS_ATTR_FATTR_MOUNTPOINT; |
2003 | } |
2004 | |
2005 | +static inline int nfs_attr_use_mounted_on_fileid(struct nfs_fattr *fattr) |
2006 | +{ |
2007 | + if (((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) == 0) || |
2008 | + (((fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) && |
2009 | + ((fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) == 0))) |
2010 | + return 0; |
2011 | + |
2012 | + fattr->fileid = fattr->mounted_on_fileid; |
2013 | + return 1; |
2014 | +} |
2015 | + |
2016 | struct nfs_clone_mount { |
2017 | const struct super_block *sb; |
2018 | const struct dentry *dentry; |
2019 | diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c |
2020 | index be79dc9..590c09c 100644 |
2021 | --- a/fs/nfs/nfs4filelayout.c |
2022 | +++ b/fs/nfs/nfs4filelayout.c |
2023 | @@ -554,13 +554,18 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo, |
2024 | __func__, nfl_util, fl->num_fh, fl->first_stripe_index, |
2025 | fl->pattern_offset); |
2026 | |
2027 | - if (!fl->num_fh) |
2028 | + /* Note that a zero value for num_fh is legal for STRIPE_SPARSE. |
2029 | + * Futher checking is done in filelayout_check_layout */ |
2030 | + if (fl->num_fh < 0 || fl->num_fh > |
2031 | + max(NFS4_PNFS_MAX_STRIPE_CNT, NFS4_PNFS_MAX_MULTI_CNT)) |
2032 | goto out_err; |
2033 | |
2034 | - fl->fh_array = kzalloc(fl->num_fh * sizeof(struct nfs_fh *), |
2035 | - gfp_flags); |
2036 | - if (!fl->fh_array) |
2037 | - goto out_err; |
2038 | + if (fl->num_fh > 0) { |
2039 | + fl->fh_array = kzalloc(fl->num_fh * sizeof(struct nfs_fh *), |
2040 | + gfp_flags); |
2041 | + if (!fl->fh_array) |
2042 | + goto out_err; |
2043 | + } |
2044 | |
2045 | for (i = 0; i < fl->num_fh; i++) { |
2046 | /* Do we want to use a mempool here? */ |
2047 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
2048 | index d0e15db..d348326 100644 |
2049 | --- a/fs/nfs/nfs4proc.c |
2050 | +++ b/fs/nfs/nfs4proc.c |
2051 | @@ -2265,12 +2265,14 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, |
2052 | return nfs4_map_errors(status); |
2053 | } |
2054 | |
2055 | +static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr); |
2056 | /* |
2057 | * Get locations and (maybe) other attributes of a referral. |
2058 | * Note that we'll actually follow the referral later when |
2059 | * we detect fsid mismatch in inode revalidation |
2060 | */ |
2061 | -static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct nfs_fattr *fattr, struct nfs_fh *fhandle) |
2062 | +static int nfs4_get_referral(struct inode *dir, const struct qstr *name, |
2063 | + struct nfs_fattr *fattr, struct nfs_fh *fhandle) |
2064 | { |
2065 | int status = -ENOMEM; |
2066 | struct page *page = NULL; |
2067 | @@ -2288,15 +2290,16 @@ static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct |
2068 | goto out; |
2069 | /* Make sure server returned a different fsid for the referral */ |
2070 | if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) { |
2071 | - dprintk("%s: server did not return a different fsid for a referral at %s\n", __func__, name->name); |
2072 | + dprintk("%s: server did not return a different fsid for" |
2073 | + " a referral at %s\n", __func__, name->name); |
2074 | status = -EIO; |
2075 | goto out; |
2076 | } |
2077 | + /* Fixup attributes for the nfs_lookup() call to nfs_fhget() */ |
2078 | + nfs_fixup_referral_attributes(&locations->fattr); |
2079 | |
2080 | + /* replace the lookup nfs_fattr with the locations nfs_fattr */ |
2081 | memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr)); |
2082 | - fattr->valid |= NFS_ATTR_FATTR_V4_REFERRAL; |
2083 | - if (!fattr->mode) |
2084 | - fattr->mode = S_IFDIR; |
2085 | memset(fhandle, 0, sizeof(struct nfs_fh)); |
2086 | out: |
2087 | if (page) |
2088 | @@ -4657,11 +4660,15 @@ static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list, |
2089 | return len; |
2090 | } |
2091 | |
2092 | +/* |
2093 | + * nfs_fhget will use either the mounted_on_fileid or the fileid |
2094 | + */ |
2095 | static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr) |
2096 | { |
2097 | - if (!((fattr->valid & NFS_ATTR_FATTR_FILEID) && |
2098 | - (fattr->valid & NFS_ATTR_FATTR_FSID) && |
2099 | - (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL))) |
2100 | + if (!(((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) || |
2101 | + (fattr->valid & NFS_ATTR_FATTR_FILEID)) && |
2102 | + (fattr->valid & NFS_ATTR_FATTR_FSID) && |
2103 | + (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL))) |
2104 | return; |
2105 | |
2106 | fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE | |
2107 | @@ -4676,7 +4683,6 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, |
2108 | struct nfs_server *server = NFS_SERVER(dir); |
2109 | u32 bitmask[2] = { |
2110 | [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, |
2111 | - [1] = FATTR4_WORD1_MOUNTED_ON_FILEID, |
2112 | }; |
2113 | struct nfs4_fs_locations_arg args = { |
2114 | .dir_fh = NFS_FH(dir), |
2115 | @@ -4695,11 +4701,18 @@ int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, |
2116 | int status; |
2117 | |
2118 | dprintk("%s: start\n", __func__); |
2119 | + |
2120 | + /* Ask for the fileid of the absent filesystem if mounted_on_fileid |
2121 | + * is not supported */ |
2122 | + if (NFS_SERVER(dir)->attr_bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID) |
2123 | + bitmask[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID; |
2124 | + else |
2125 | + bitmask[0] |= FATTR4_WORD0_FILEID; |
2126 | + |
2127 | nfs_fattr_init(&fs_locations->fattr); |
2128 | fs_locations->server = server; |
2129 | fs_locations->nlocations = 0; |
2130 | status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); |
2131 | - nfs_fixup_referral_attributes(&fs_locations->fattr); |
2132 | dprintk("%s: returned status = %d\n", __func__, status); |
2133 | return status; |
2134 | } |
2135 | diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c |
2136 | index c3ccd2c..7685279 100644 |
2137 | --- a/fs/nfs/nfs4xdr.c |
2138 | +++ b/fs/nfs/nfs4xdr.c |
2139 | @@ -3030,7 +3030,7 @@ out_overflow: |
2140 | return -EIO; |
2141 | } |
2142 | |
2143 | -static int decode_attr_error(struct xdr_stream *xdr, uint32_t *bitmap) |
2144 | +static int decode_attr_error(struct xdr_stream *xdr, uint32_t *bitmap, int32_t *res) |
2145 | { |
2146 | __be32 *p; |
2147 | |
2148 | @@ -3041,7 +3041,7 @@ static int decode_attr_error(struct xdr_stream *xdr, uint32_t *bitmap) |
2149 | if (unlikely(!p)) |
2150 | goto out_overflow; |
2151 | bitmap[0] &= ~FATTR4_WORD0_RDATTR_ERROR; |
2152 | - return -be32_to_cpup(p); |
2153 | + *res = -be32_to_cpup(p); |
2154 | } |
2155 | return 0; |
2156 | out_overflow: |
2157 | @@ -4002,6 +4002,7 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap, |
2158 | int status; |
2159 | umode_t fmode = 0; |
2160 | uint32_t type; |
2161 | + int32_t err; |
2162 | |
2163 | status = decode_attr_type(xdr, bitmap, &type); |
2164 | if (status < 0) |
2165 | @@ -4027,13 +4028,12 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap, |
2166 | goto xdr_error; |
2167 | fattr->valid |= status; |
2168 | |
2169 | - status = decode_attr_error(xdr, bitmap); |
2170 | - if (status == -NFS4ERR_WRONGSEC) { |
2171 | - nfs_fixup_secinfo_attributes(fattr, fh); |
2172 | - status = 0; |
2173 | - } |
2174 | + err = 0; |
2175 | + status = decode_attr_error(xdr, bitmap, &err); |
2176 | if (status < 0) |
2177 | goto xdr_error; |
2178 | + if (err == -NFS4ERR_WRONGSEC) |
2179 | + nfs_fixup_secinfo_attributes(fattr, fh); |
2180 | |
2181 | status = decode_attr_filehandle(xdr, bitmap, fh); |
2182 | if (status < 0) |
2183 | diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig |
2184 | index 18b3e89..fbb2a5e 100644 |
2185 | --- a/fs/nfsd/Kconfig |
2186 | +++ b/fs/nfsd/Kconfig |
2187 | @@ -82,6 +82,7 @@ config NFSD_V4 |
2188 | select NFSD_V3 |
2189 | select FS_POSIX_ACL |
2190 | select SUNRPC_GSS |
2191 | + select CRYPTO |
2192 | help |
2193 | This option enables support in your system's NFS server for |
2194 | version 4 of the NFS protocol (RFC 3530). |
2195 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c |
2196 | index 1f5eae4..2b1449d 100644 |
2197 | --- a/fs/nfsd/nfsctl.c |
2198 | +++ b/fs/nfsd/nfsctl.c |
2199 | @@ -13,6 +13,7 @@ |
2200 | #include <linux/lockd/lockd.h> |
2201 | #include <linux/sunrpc/clnt.h> |
2202 | #include <linux/sunrpc/gss_api.h> |
2203 | +#include <linux/sunrpc/gss_krb5_enctypes.h> |
2204 | |
2205 | #include "idmap.h" |
2206 | #include "nfsd.h" |
2207 | @@ -189,18 +190,10 @@ static struct file_operations export_features_operations = { |
2208 | .release = single_release, |
2209 | }; |
2210 | |
2211 | -#ifdef CONFIG_SUNRPC_GSS |
2212 | +#if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) |
2213 | static int supported_enctypes_show(struct seq_file *m, void *v) |
2214 | { |
2215 | - struct gss_api_mech *k5mech; |
2216 | - |
2217 | - k5mech = gss_mech_get_by_name("krb5"); |
2218 | - if (k5mech == NULL) |
2219 | - goto out; |
2220 | - if (k5mech->gm_upcall_enctypes != NULL) |
2221 | - seq_printf(m, k5mech->gm_upcall_enctypes); |
2222 | - gss_mech_put(k5mech); |
2223 | -out: |
2224 | + seq_printf(m, KRB5_SUPPORTED_ENCTYPES); |
2225 | return 0; |
2226 | } |
2227 | |
2228 | @@ -215,7 +208,7 @@ static struct file_operations supported_enctypes_ops = { |
2229 | .llseek = seq_lseek, |
2230 | .release = single_release, |
2231 | }; |
2232 | -#endif /* CONFIG_SUNRPC_GSS */ |
2233 | +#endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ |
2234 | |
2235 | extern int nfsd_pool_stats_open(struct inode *inode, struct file *file); |
2236 | extern int nfsd_pool_stats_release(struct inode *inode, struct file *file); |
2237 | @@ -1427,9 +1420,9 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent) |
2238 | [NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR}, |
2239 | [NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO}, |
2240 | [NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO}, |
2241 | -#ifdef CONFIG_SUNRPC_GSS |
2242 | +#if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE) |
2243 | [NFSD_SupportedEnctypes] = {"supported_krb5_enctypes", &supported_enctypes_ops, S_IRUGO}, |
2244 | -#endif /* CONFIG_SUNRPC_GSS */ |
2245 | +#endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */ |
2246 | #ifdef CONFIG_NFSD_V4 |
2247 | [NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR}, |
2248 | [NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR}, |
2249 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
2250 | index 129f3c9..d80b2d8 100644 |
2251 | --- a/fs/nfsd/vfs.c |
2252 | +++ b/fs/nfsd/vfs.c |
2253 | @@ -699,7 +699,15 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor |
2254 | } |
2255 | #endif /* CONFIG_NFSD_V3 */ |
2256 | |
2257 | +static int nfsd_open_break_lease(struct inode *inode, int access) |
2258 | +{ |
2259 | + unsigned int mode; |
2260 | |
2261 | + if (access & NFSD_MAY_NOT_BREAK_LEASE) |
2262 | + return 0; |
2263 | + mode = (access & NFSD_MAY_WRITE) ? O_WRONLY : O_RDONLY; |
2264 | + return break_lease(inode, mode | O_NONBLOCK); |
2265 | +} |
2266 | |
2267 | /* |
2268 | * Open an existing file or directory. |
2269 | @@ -747,12 +755,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, |
2270 | if (!inode->i_fop) |
2271 | goto out; |
2272 | |
2273 | - /* |
2274 | - * Check to see if there are any leases on this file. |
2275 | - * This may block while leases are broken. |
2276 | - */ |
2277 | - if (!(access & NFSD_MAY_NOT_BREAK_LEASE)) |
2278 | - host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0)); |
2279 | + host_err = nfsd_open_break_lease(inode, access); |
2280 | if (host_err) /* NOMEM or WOULDBLOCK */ |
2281 | goto out_nfserr; |
2282 | |
2283 | @@ -1653,8 +1656,10 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp, |
2284 | if (!dold->d_inode) |
2285 | goto out_drop_write; |
2286 | host_err = nfsd_break_lease(dold->d_inode); |
2287 | - if (host_err) |
2288 | + if (host_err) { |
2289 | + err = nfserrno(host_err); |
2290 | goto out_drop_write; |
2291 | + } |
2292 | host_err = vfs_link(dold, dirp, dnew); |
2293 | if (!host_err) { |
2294 | err = nfserrno(commit_metadata(ffhp)); |
2295 | diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h |
2296 | index e5a3f58..dfb0ec6 100644 |
2297 | --- a/include/asm-generic/bug.h |
2298 | +++ b/include/asm-generic/bug.h |
2299 | @@ -162,9 +162,6 @@ extern void warn_slowpath_null(const char *file, const int line); |
2300 | unlikely(__ret_warn_once); \ |
2301 | }) |
2302 | |
2303 | -#define WARN_ON_RATELIMIT(condition, state) \ |
2304 | - WARN_ON((condition) && __ratelimit(state)) |
2305 | - |
2306 | /* |
2307 | * WARN_ON_SMP() is for cases that the warning is either |
2308 | * meaningless for !SMP or may even cause failures. |
2309 | diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h |
2310 | index be50d9e..acdb143 100644 |
2311 | --- a/include/linux/blk_types.h |
2312 | +++ b/include/linux/blk_types.h |
2313 | @@ -168,7 +168,7 @@ enum rq_flag_bits { |
2314 | (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) |
2315 | #define REQ_COMMON_MASK \ |
2316 | (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_DISCARD | \ |
2317 | - REQ_NOIDLE | REQ_FLUSH | REQ_FUA) |
2318 | + REQ_NOIDLE | REQ_FLUSH | REQ_FUA | REQ_SECURE) |
2319 | #define REQ_CLONE_MASK REQ_COMMON_MASK |
2320 | |
2321 | #define REQ_RAHEAD (1 << __REQ_RAHEAD) |
2322 | diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h |
2323 | index c37b21a..24e2932 100644 |
2324 | --- a/include/linux/clocksource.h |
2325 | +++ b/include/linux/clocksource.h |
2326 | @@ -192,6 +192,7 @@ struct clocksource { |
2327 | #ifdef CONFIG_CLOCKSOURCE_WATCHDOG |
2328 | /* Watchdog related data, used by the framework */ |
2329 | struct list_head wd_list; |
2330 | + cycle_t cs_last; |
2331 | cycle_t wd_last; |
2332 | #endif |
2333 | }; |
2334 | diff --git a/include/linux/connector.h b/include/linux/connector.h |
2335 | index 7c60d09..f696bcc 100644 |
2336 | --- a/include/linux/connector.h |
2337 | +++ b/include/linux/connector.h |
2338 | @@ -44,7 +44,7 @@ |
2339 | #define CN_VAL_DRBD 0x1 |
2340 | #define CN_KVP_IDX 0x9 /* HyperV KVP */ |
2341 | |
2342 | -#define CN_NETLINK_USERS 9 |
2343 | +#define CN_NETLINK_USERS 10 /* Highest index + 1 */ |
2344 | |
2345 | /* |
2346 | * Maximum connector's message size. |
2347 | diff --git a/include/linux/device.h b/include/linux/device.h |
2348 | index d08399d..779e860 100644 |
2349 | --- a/include/linux/device.h |
2350 | +++ b/include/linux/device.h |
2351 | @@ -506,13 +506,13 @@ static inline int device_is_registered(struct device *dev) |
2352 | |
2353 | static inline void device_enable_async_suspend(struct device *dev) |
2354 | { |
2355 | - if (!dev->power.in_suspend) |
2356 | + if (!dev->power.is_prepared) |
2357 | dev->power.async_suspend = true; |
2358 | } |
2359 | |
2360 | static inline void device_disable_async_suspend(struct device *dev) |
2361 | { |
2362 | - if (!dev->power.in_suspend) |
2363 | + if (!dev->power.is_prepared) |
2364 | dev->power.async_suspend = false; |
2365 | } |
2366 | |
2367 | diff --git a/include/linux/fscache.h b/include/linux/fscache.h |
2368 | index 7c4d72f..9ec20de 100644 |
2369 | --- a/include/linux/fscache.h |
2370 | +++ b/include/linux/fscache.h |
2371 | @@ -204,6 +204,8 @@ extern bool __fscache_check_page_write(struct fscache_cookie *, struct page *); |
2372 | extern void __fscache_wait_on_page_write(struct fscache_cookie *, struct page *); |
2373 | extern bool __fscache_maybe_release_page(struct fscache_cookie *, struct page *, |
2374 | gfp_t); |
2375 | +extern void __fscache_uncache_all_inode_pages(struct fscache_cookie *, |
2376 | + struct inode *); |
2377 | |
2378 | /** |
2379 | * fscache_register_netfs - Register a filesystem as desiring caching services |
2380 | @@ -643,4 +645,23 @@ bool fscache_maybe_release_page(struct fscache_cookie *cookie, |
2381 | return false; |
2382 | } |
2383 | |
2384 | +/** |
2385 | + * fscache_uncache_all_inode_pages - Uncache all an inode's pages |
2386 | + * @cookie: The cookie representing the inode's cache object. |
2387 | + * @inode: The inode to uncache pages from. |
2388 | + * |
2389 | + * Uncache all the pages in an inode that are marked PG_fscache, assuming them |
2390 | + * to be associated with the given cookie. |
2391 | + * |
2392 | + * This function may sleep. It will wait for pages that are being written out |
2393 | + * and will wait whilst the PG_fscache mark is removed by the cache. |
2394 | + */ |
2395 | +static inline |
2396 | +void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie, |
2397 | + struct inode *inode) |
2398 | +{ |
2399 | + if (fscache_cookie_valid(cookie)) |
2400 | + __fscache_uncache_all_inode_pages(cookie, inode); |
2401 | +} |
2402 | + |
2403 | #endif /* _LINUX_FSCACHE_H */ |
2404 | diff --git a/include/linux/if_packet.h b/include/linux/if_packet.h |
2405 | index 72bfa5a..8e37fba 100644 |
2406 | --- a/include/linux/if_packet.h |
2407 | +++ b/include/linux/if_packet.h |
2408 | @@ -62,6 +62,7 @@ struct tpacket_auxdata { |
2409 | __u16 tp_mac; |
2410 | __u16 tp_net; |
2411 | __u16 tp_vlan_tci; |
2412 | + __u16 tp_padding; |
2413 | }; |
2414 | |
2415 | /* Rx ring - header status */ |
2416 | @@ -100,6 +101,7 @@ struct tpacket2_hdr { |
2417 | __u32 tp_sec; |
2418 | __u32 tp_nsec; |
2419 | __u16 tp_vlan_tci; |
2420 | + __u16 tp_padding; |
2421 | }; |
2422 | |
2423 | #define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll)) |
2424 | diff --git a/include/linux/netfilter/ipset/ip_set_ahash.h b/include/linux/netfilter/ipset/ip_set_ahash.h |
2425 | index a0196ac..ac3c822 100644 |
2426 | --- a/include/linux/netfilter/ipset/ip_set_ahash.h |
2427 | +++ b/include/linux/netfilter/ipset/ip_set_ahash.h |
2428 | @@ -839,7 +839,7 @@ type_pf_tdel(struct ip_set *set, void *value, u32 timeout) |
2429 | struct htable *t = h->table; |
2430 | const struct type_pf_elem *d = value; |
2431 | struct hbucket *n; |
2432 | - int i, ret = 0; |
2433 | + int i; |
2434 | struct type_pf_elem *data; |
2435 | u32 key; |
2436 | |
2437 | @@ -850,7 +850,7 @@ type_pf_tdel(struct ip_set *set, void *value, u32 timeout) |
2438 | if (!type_pf_data_equal(data, d)) |
2439 | continue; |
2440 | if (type_pf_data_expired(data)) |
2441 | - ret = -IPSET_ERR_EXIST; |
2442 | + return -IPSET_ERR_EXIST; |
2443 | if (i != n->pos - 1) |
2444 | /* Not last one */ |
2445 | type_pf_data_copy(data, ahash_tdata(n, n->pos - 1)); |
2446 | diff --git a/include/linux/netfilter/ipset/ip_set_timeout.h b/include/linux/netfilter/ipset/ip_set_timeout.h |
2447 | index 9f30c5f..bb773c1 100644 |
2448 | --- a/include/linux/netfilter/ipset/ip_set_timeout.h |
2449 | +++ b/include/linux/netfilter/ipset/ip_set_timeout.h |
2450 | @@ -45,7 +45,7 @@ ip_set_timeout_test(unsigned long timeout) |
2451 | { |
2452 | return timeout != IPSET_ELEM_UNSET && |
2453 | (timeout == IPSET_ELEM_PERMANENT || |
2454 | - time_after(timeout, jiffies)); |
2455 | + time_is_after_jiffies(timeout)); |
2456 | } |
2457 | |
2458 | static inline bool |
2459 | @@ -53,7 +53,7 @@ ip_set_timeout_expired(unsigned long timeout) |
2460 | { |
2461 | return timeout != IPSET_ELEM_UNSET && |
2462 | timeout != IPSET_ELEM_PERMANENT && |
2463 | - time_before(timeout, jiffies); |
2464 | + time_is_before_jiffies(timeout); |
2465 | } |
2466 | |
2467 | static inline unsigned long |
2468 | @@ -64,7 +64,7 @@ ip_set_timeout_set(u32 timeout) |
2469 | if (!timeout) |
2470 | return IPSET_ELEM_PERMANENT; |
2471 | |
2472 | - t = timeout * HZ + jiffies; |
2473 | + t = msecs_to_jiffies(timeout * 1000) + jiffies; |
2474 | if (t == IPSET_ELEM_UNSET || t == IPSET_ELEM_PERMANENT) |
2475 | /* Bingo! */ |
2476 | t++; |
2477 | @@ -75,7 +75,8 @@ ip_set_timeout_set(u32 timeout) |
2478 | static inline u32 |
2479 | ip_set_timeout_get(unsigned long timeout) |
2480 | { |
2481 | - return timeout == IPSET_ELEM_PERMANENT ? 0 : (timeout - jiffies)/HZ; |
2482 | + return timeout == IPSET_ELEM_PERMANENT ? 0 : |
2483 | + jiffies_to_msecs(timeout - jiffies)/1000; |
2484 | } |
2485 | |
2486 | #else |
2487 | @@ -89,14 +90,14 @@ static inline bool |
2488 | ip_set_timeout_test(unsigned long timeout) |
2489 | { |
2490 | return timeout == IPSET_ELEM_PERMANENT || |
2491 | - time_after(timeout, jiffies); |
2492 | + time_is_after_jiffies(timeout); |
2493 | } |
2494 | |
2495 | static inline bool |
2496 | ip_set_timeout_expired(unsigned long timeout) |
2497 | { |
2498 | return timeout != IPSET_ELEM_PERMANENT && |
2499 | - time_before(timeout, jiffies); |
2500 | + time_is_before_jiffies(timeout); |
2501 | } |
2502 | |
2503 | static inline unsigned long |
2504 | @@ -107,7 +108,7 @@ ip_set_timeout_set(u32 timeout) |
2505 | if (!timeout) |
2506 | return IPSET_ELEM_PERMANENT; |
2507 | |
2508 | - t = timeout * HZ + jiffies; |
2509 | + t = msecs_to_jiffies(timeout * 1000) + jiffies; |
2510 | if (t == IPSET_ELEM_PERMANENT) |
2511 | /* Bingo! :-) */ |
2512 | t++; |
2513 | @@ -118,7 +119,8 @@ ip_set_timeout_set(u32 timeout) |
2514 | static inline u32 |
2515 | ip_set_timeout_get(unsigned long timeout) |
2516 | { |
2517 | - return timeout == IPSET_ELEM_PERMANENT ? 0 : (timeout - jiffies)/HZ; |
2518 | + return timeout == IPSET_ELEM_PERMANENT ? 0 : |
2519 | + jiffies_to_msecs(timeout - jiffies)/1000; |
2520 | } |
2521 | #endif /* ! IP_SET_BITMAP_TIMEOUT */ |
2522 | |
2523 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
2524 | index 8652a4f..d041a4a 100644 |
2525 | --- a/include/linux/pci_ids.h |
2526 | +++ b/include/linux/pci_ids.h |
2527 | @@ -1537,6 +1537,7 @@ |
2528 | #define PCI_DEVICE_ID_RICOH_RL5C476 0x0476 |
2529 | #define PCI_DEVICE_ID_RICOH_RL5C478 0x0478 |
2530 | #define PCI_DEVICE_ID_RICOH_R5C822 0x0822 |
2531 | +#define PCI_DEVICE_ID_RICOH_R5CE823 0xe823 |
2532 | #define PCI_DEVICE_ID_RICOH_R5C832 0x0832 |
2533 | #define PCI_DEVICE_ID_RICOH_R5C843 0x0843 |
2534 | |
2535 | diff --git a/include/linux/pm.h b/include/linux/pm.h |
2536 | index 512e091..fffb12f 100644 |
2537 | --- a/include/linux/pm.h |
2538 | +++ b/include/linux/pm.h |
2539 | @@ -425,7 +425,8 @@ struct dev_pm_info { |
2540 | pm_message_t power_state; |
2541 | unsigned int can_wakeup:1; |
2542 | unsigned int async_suspend:1; |
2543 | - unsigned int in_suspend:1; /* Owned by the PM core */ |
2544 | + bool is_prepared:1; /* Owned by the PM core */ |
2545 | + bool is_suspended:1; /* Ditto */ |
2546 | spinlock_t lock; |
2547 | #ifdef CONFIG_PM_SLEEP |
2548 | struct list_head entry; |
2549 | diff --git a/include/linux/ratelimit.h b/include/linux/ratelimit.h |
2550 | index 03ff67b..2f00715 100644 |
2551 | --- a/include/linux/ratelimit.h |
2552 | +++ b/include/linux/ratelimit.h |
2553 | @@ -41,4 +41,44 @@ extern struct ratelimit_state printk_ratelimit_state; |
2554 | extern int ___ratelimit(struct ratelimit_state *rs, const char *func); |
2555 | #define __ratelimit(state) ___ratelimit(state, __func__) |
2556 | |
2557 | +#ifdef CONFIG_PRINTK |
2558 | + |
2559 | +#define WARN_ON_RATELIMIT(condition, state) \ |
2560 | + WARN_ON((condition) && __ratelimit(state)) |
2561 | + |
2562 | +#define __WARN_RATELIMIT(condition, state, format...) \ |
2563 | +({ \ |
2564 | + int rtn = 0; \ |
2565 | + if (unlikely(__ratelimit(state))) \ |
2566 | + rtn = WARN(condition, format); \ |
2567 | + rtn; \ |
2568 | +}) |
2569 | + |
2570 | +#define WARN_RATELIMIT(condition, format...) \ |
2571 | +({ \ |
2572 | + static DEFINE_RATELIMIT_STATE(_rs, \ |
2573 | + DEFAULT_RATELIMIT_INTERVAL, \ |
2574 | + DEFAULT_RATELIMIT_BURST); \ |
2575 | + __WARN_RATELIMIT(condition, &_rs, format); \ |
2576 | +}) |
2577 | + |
2578 | +#else |
2579 | + |
2580 | +#define WARN_ON_RATELIMIT(condition, state) \ |
2581 | + WARN_ON(condition) |
2582 | + |
2583 | +#define __WARN_RATELIMIT(condition, state, format...) \ |
2584 | +({ \ |
2585 | + int rtn = WARN(condition, format); \ |
2586 | + rtn; \ |
2587 | +}) |
2588 | + |
2589 | +#define WARN_RATELIMIT(condition, format...) \ |
2590 | +({ \ |
2591 | + int rtn = WARN(condition, format); \ |
2592 | + rtn; \ |
2593 | +}) |
2594 | + |
2595 | +#endif |
2596 | + |
2597 | #endif /* _LINUX_RATELIMIT_H */ |
2598 | diff --git a/include/linux/sunrpc/gss_krb5_enctypes.h b/include/linux/sunrpc/gss_krb5_enctypes.h |
2599 | new file mode 100644 |
2600 | index 0000000..ec6234e |
2601 | --- /dev/null |
2602 | +++ b/include/linux/sunrpc/gss_krb5_enctypes.h |
2603 | @@ -0,0 +1,4 @@ |
2604 | +/* |
2605 | + * Dumb way to share this static piece of information with nfsd |
2606 | + */ |
2607 | +#define KRB5_SUPPORTED_ENCTYPES "18,17,16,23,3,1,2" |
2608 | diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h |
2609 | index f73c482..fe2d8e6 100644 |
2610 | --- a/include/linux/sunrpc/sched.h |
2611 | +++ b/include/linux/sunrpc/sched.h |
2612 | @@ -84,7 +84,8 @@ struct rpc_task { |
2613 | #endif |
2614 | unsigned char tk_priority : 2,/* Task priority */ |
2615 | tk_garb_retry : 2, |
2616 | - tk_cred_retry : 2; |
2617 | + tk_cred_retry : 2, |
2618 | + tk_rebind_retry : 2; |
2619 | }; |
2620 | #define tk_xprt tk_client->cl_xprt |
2621 | |
2622 | diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h |
2623 | index 86aefed..e5bf4c8 100644 |
2624 | --- a/include/net/ip_vs.h |
2625 | +++ b/include/net/ip_vs.h |
2626 | @@ -802,7 +802,8 @@ struct netns_ipvs { |
2627 | struct list_head rs_table[IP_VS_RTAB_SIZE]; |
2628 | /* ip_vs_app */ |
2629 | struct list_head app_list; |
2630 | - |
2631 | + /* ip_vs_ftp */ |
2632 | + struct ip_vs_app *ftp_app; |
2633 | /* ip_vs_proto */ |
2634 | #define IP_VS_PROTO_TAB_SIZE 32 /* must be power of 2 */ |
2635 | struct ip_vs_proto_data *proto_data_table[IP_VS_PROTO_TAB_SIZE]; |
2636 | diff --git a/init/calibrate.c b/init/calibrate.c |
2637 | index 76ac919..30a44cd 100644 |
2638 | --- a/init/calibrate.c |
2639 | +++ b/init/calibrate.c |
2640 | @@ -185,30 +185,32 @@ recalibrate: |
2641 | |
2642 | void __cpuinit calibrate_delay(void) |
2643 | { |
2644 | + unsigned long lpj; |
2645 | static bool printed; |
2646 | |
2647 | if (preset_lpj) { |
2648 | - loops_per_jiffy = preset_lpj; |
2649 | + lpj = preset_lpj; |
2650 | if (!printed) |
2651 | pr_info("Calibrating delay loop (skipped) " |
2652 | "preset value.. "); |
2653 | } else if ((!printed) && lpj_fine) { |
2654 | - loops_per_jiffy = lpj_fine; |
2655 | + lpj = lpj_fine; |
2656 | pr_info("Calibrating delay loop (skipped), " |
2657 | "value calculated using timer frequency.. "); |
2658 | - } else if ((loops_per_jiffy = calibrate_delay_direct()) != 0) { |
2659 | + } else if ((lpj = calibrate_delay_direct()) != 0) { |
2660 | if (!printed) |
2661 | pr_info("Calibrating delay using timer " |
2662 | "specific routine.. "); |
2663 | } else { |
2664 | if (!printed) |
2665 | pr_info("Calibrating delay loop... "); |
2666 | - loops_per_jiffy = calibrate_delay_converge(); |
2667 | + lpj = calibrate_delay_converge(); |
2668 | } |
2669 | if (!printed) |
2670 | pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n", |
2671 | - loops_per_jiffy/(500000/HZ), |
2672 | - (loops_per_jiffy/(5000/HZ)) % 100, loops_per_jiffy); |
2673 | + lpj/(500000/HZ), |
2674 | + (lpj/(5000/HZ)) % 100, lpj); |
2675 | |
2676 | + loops_per_jiffy = lpj; |
2677 | printed = true; |
2678 | } |
2679 | diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c |
2680 | index ca0aacc..1a78c1a 100644 |
2681 | --- a/kernel/power/snapshot.c |
2682 | +++ b/kernel/power/snapshot.c |
2683 | @@ -1199,7 +1199,11 @@ static void free_unnecessary_pages(void) |
2684 | to_free_highmem = alloc_highmem - save; |
2685 | } else { |
2686 | to_free_highmem = 0; |
2687 | - to_free_normal -= save - alloc_highmem; |
2688 | + save -= alloc_highmem; |
2689 | + if (to_free_normal > save) |
2690 | + to_free_normal -= save; |
2691 | + else |
2692 | + to_free_normal = 0; |
2693 | } |
2694 | |
2695 | memory_bm_position_reset(©_bm); |
2696 | diff --git a/kernel/power/user.c b/kernel/power/user.c |
2697 | index 7d02d33..42ddbc6 100644 |
2698 | --- a/kernel/power/user.c |
2699 | +++ b/kernel/power/user.c |
2700 | @@ -113,8 +113,10 @@ static int snapshot_open(struct inode *inode, struct file *filp) |
2701 | if (error) |
2702 | pm_notifier_call_chain(PM_POST_RESTORE); |
2703 | } |
2704 | - if (error) |
2705 | + if (error) { |
2706 | + free_basic_memory_bitmaps(); |
2707 | atomic_inc(&snapshot_device_available); |
2708 | + } |
2709 | data->frozen = 0; |
2710 | data->ready = 0; |
2711 | data->platform_support = 0; |
2712 | diff --git a/kernel/taskstats.c b/kernel/taskstats.c |
2713 | index 9ffea36..fc0f220 100644 |
2714 | --- a/kernel/taskstats.c |
2715 | +++ b/kernel/taskstats.c |
2716 | @@ -285,16 +285,18 @@ ret: |
2717 | static int add_del_listener(pid_t pid, const struct cpumask *mask, int isadd) |
2718 | { |
2719 | struct listener_list *listeners; |
2720 | - struct listener *s, *tmp; |
2721 | + struct listener *s, *tmp, *s2; |
2722 | unsigned int cpu; |
2723 | |
2724 | if (!cpumask_subset(mask, cpu_possible_mask)) |
2725 | return -EINVAL; |
2726 | |
2727 | + s = NULL; |
2728 | if (isadd == REGISTER) { |
2729 | for_each_cpu(cpu, mask) { |
2730 | - s = kmalloc_node(sizeof(struct listener), GFP_KERNEL, |
2731 | - cpu_to_node(cpu)); |
2732 | + if (!s) |
2733 | + s = kmalloc_node(sizeof(struct listener), |
2734 | + GFP_KERNEL, cpu_to_node(cpu)); |
2735 | if (!s) |
2736 | goto cleanup; |
2737 | s->pid = pid; |
2738 | @@ -303,9 +305,16 @@ static int add_del_listener(pid_t pid, const struct cpumask *mask, int isadd) |
2739 | |
2740 | listeners = &per_cpu(listener_array, cpu); |
2741 | down_write(&listeners->sem); |
2742 | + list_for_each_entry_safe(s2, tmp, &listeners->list, list) { |
2743 | + if (s2->pid == pid) |
2744 | + goto next_cpu; |
2745 | + } |
2746 | list_add(&s->list, &listeners->list); |
2747 | + s = NULL; |
2748 | +next_cpu: |
2749 | up_write(&listeners->sem); |
2750 | } |
2751 | + kfree(s); |
2752 | return 0; |
2753 | } |
2754 | |
2755 | diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c |
2756 | index 0e17c10..727da92 100644 |
2757 | --- a/kernel/time/clocksource.c |
2758 | +++ b/kernel/time/clocksource.c |
2759 | @@ -185,7 +185,6 @@ static struct clocksource *watchdog; |
2760 | static struct timer_list watchdog_timer; |
2761 | static DECLARE_WORK(watchdog_work, clocksource_watchdog_work); |
2762 | static DEFINE_SPINLOCK(watchdog_lock); |
2763 | -static cycle_t watchdog_last; |
2764 | static int watchdog_running; |
2765 | |
2766 | static int clocksource_watchdog_kthread(void *data); |
2767 | @@ -254,11 +253,6 @@ static void clocksource_watchdog(unsigned long data) |
2768 | if (!watchdog_running) |
2769 | goto out; |
2770 | |
2771 | - wdnow = watchdog->read(watchdog); |
2772 | - wd_nsec = clocksource_cyc2ns((wdnow - watchdog_last) & watchdog->mask, |
2773 | - watchdog->mult, watchdog->shift); |
2774 | - watchdog_last = wdnow; |
2775 | - |
2776 | list_for_each_entry(cs, &watchdog_list, wd_list) { |
2777 | |
2778 | /* Clocksource already marked unstable? */ |
2779 | @@ -268,19 +262,28 @@ static void clocksource_watchdog(unsigned long data) |
2780 | continue; |
2781 | } |
2782 | |
2783 | + local_irq_disable(); |
2784 | csnow = cs->read(cs); |
2785 | + wdnow = watchdog->read(watchdog); |
2786 | + local_irq_enable(); |
2787 | |
2788 | /* Clocksource initialized ? */ |
2789 | if (!(cs->flags & CLOCK_SOURCE_WATCHDOG)) { |
2790 | cs->flags |= CLOCK_SOURCE_WATCHDOG; |
2791 | - cs->wd_last = csnow; |
2792 | + cs->wd_last = wdnow; |
2793 | + cs->cs_last = csnow; |
2794 | continue; |
2795 | } |
2796 | |
2797 | - /* Check the deviation from the watchdog clocksource. */ |
2798 | - cs_nsec = clocksource_cyc2ns((csnow - cs->wd_last) & |
2799 | + wd_nsec = clocksource_cyc2ns((wdnow - cs->wd_last) & watchdog->mask, |
2800 | + watchdog->mult, watchdog->shift); |
2801 | + |
2802 | + cs_nsec = clocksource_cyc2ns((csnow - cs->cs_last) & |
2803 | cs->mask, cs->mult, cs->shift); |
2804 | - cs->wd_last = csnow; |
2805 | + cs->cs_last = csnow; |
2806 | + cs->wd_last = wdnow; |
2807 | + |
2808 | + /* Check the deviation from the watchdog clocksource. */ |
2809 | if (abs(cs_nsec - wd_nsec) > WATCHDOG_THRESHOLD) { |
2810 | clocksource_unstable(cs, cs_nsec - wd_nsec); |
2811 | continue; |
2812 | @@ -318,7 +321,6 @@ static inline void clocksource_start_watchdog(void) |
2813 | return; |
2814 | init_timer(&watchdog_timer); |
2815 | watchdog_timer.function = clocksource_watchdog; |
2816 | - watchdog_last = watchdog->read(watchdog); |
2817 | watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL; |
2818 | add_timer_on(&watchdog_timer, cpumask_first(cpu_online_mask)); |
2819 | watchdog_running = 1; |
2820 | diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
2821 | index 9d86e45..a78b7c6 100644 |
2822 | --- a/lib/debugobjects.c |
2823 | +++ b/lib/debugobjects.c |
2824 | @@ -198,7 +198,7 @@ static void free_object(struct debug_obj *obj) |
2825 | * initialized: |
2826 | */ |
2827 | if (obj_pool_free > ODEBUG_POOL_SIZE && obj_cache) |
2828 | - sched = !work_pending(&debug_obj_work); |
2829 | + sched = keventd_up() && !work_pending(&debug_obj_work); |
2830 | hlist_add_head(&obj->node, &obj_pool); |
2831 | obj_pool_free++; |
2832 | obj_pool_used--; |
2833 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
2834 | index 39f86fc..f7c32fb 100644 |
2835 | --- a/mm/hugetlb.c |
2836 | +++ b/mm/hugetlb.c |
2837 | @@ -1111,6 +1111,14 @@ static void __init gather_bootmem_prealloc(void) |
2838 | WARN_ON(page_count(page) != 1); |
2839 | prep_compound_huge_page(page, h->order); |
2840 | prep_new_huge_page(h, page, page_to_nid(page)); |
2841 | + /* |
2842 | + * If we had gigantic hugepages allocated at boot time, we need |
2843 | + * to restore the 'stolen' pages to totalram_pages in order to |
2844 | + * fix confusing memory reports from free(1) and another |
2845 | + * side-effects, like CommitLimit going negative. |
2846 | + */ |
2847 | + if (h->order > (MAX_ORDER - 1)) |
2848 | + totalram_pages += 1 << h->order; |
2849 | } |
2850 | } |
2851 | |
2852 | diff --git a/mm/ksm.c b/mm/ksm.c |
2853 | index 942dfc7..e48c86e 100644 |
2854 | --- a/mm/ksm.c |
2855 | +++ b/mm/ksm.c |
2856 | @@ -1301,6 +1301,12 @@ static struct rmap_item *scan_get_next_rmap_item(struct page **page) |
2857 | slot = list_entry(slot->mm_list.next, struct mm_slot, mm_list); |
2858 | ksm_scan.mm_slot = slot; |
2859 | spin_unlock(&ksm_mmlist_lock); |
2860 | + /* |
2861 | + * Although we tested list_empty() above, a racing __ksm_exit |
2862 | + * of the last mm on the list may have removed it since then. |
2863 | + */ |
2864 | + if (slot == &ksm_mm_head) |
2865 | + return NULL; |
2866 | next_mm: |
2867 | ksm_scan.address = 0; |
2868 | ksm_scan.rmap_list = &slot->rmap_list; |
2869 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c |
2870 | index 2b9a5ee..9568e0b 100644 |
2871 | --- a/mm/memory-failure.c |
2872 | +++ b/mm/memory-failure.c |
2873 | @@ -52,6 +52,7 @@ |
2874 | #include <linux/swapops.h> |
2875 | #include <linux/hugetlb.h> |
2876 | #include <linux/memory_hotplug.h> |
2877 | +#include <linux/mm_inline.h> |
2878 | #include "internal.h" |
2879 | |
2880 | int sysctl_memory_failure_early_kill __read_mostly = 0; |
2881 | @@ -1463,7 +1464,8 @@ int soft_offline_page(struct page *page, int flags) |
2882 | ret = isolate_lru_page(page); |
2883 | if (!ret) { |
2884 | LIST_HEAD(pagelist); |
2885 | - |
2886 | + inc_zone_page_state(page, NR_ISOLATED_ANON + |
2887 | + page_is_file_cache(page)); |
2888 | list_add(&page->lru, &pagelist); |
2889 | ret = migrate_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, |
2890 | 0, true); |
2891 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c |
2892 | index 9ca1d60..fc5e0ba 100644 |
2893 | --- a/mm/memory_hotplug.c |
2894 | +++ b/mm/memory_hotplug.c |
2895 | @@ -518,7 +518,7 @@ int mem_online_node(int nid) |
2896 | |
2897 | lock_memory_hotplug(); |
2898 | pgdat = hotadd_new_pgdat(nid, 0); |
2899 | - if (pgdat) { |
2900 | + if (!pgdat) { |
2901 | ret = -ENOMEM; |
2902 | goto out; |
2903 | } |
2904 | diff --git a/mm/migrate.c b/mm/migrate.c |
2905 | index 34132f8..3179891 100644 |
2906 | --- a/mm/migrate.c |
2907 | +++ b/mm/migrate.c |
2908 | @@ -288,7 +288,7 @@ static int migrate_page_move_mapping(struct address_space *mapping, |
2909 | */ |
2910 | __dec_zone_page_state(page, NR_FILE_PAGES); |
2911 | __inc_zone_page_state(newpage, NR_FILE_PAGES); |
2912 | - if (PageSwapBacked(page)) { |
2913 | + if (!PageSwapCache(page) && PageSwapBacked(page)) { |
2914 | __dec_zone_page_state(page, NR_SHMEM); |
2915 | __inc_zone_page_state(newpage, NR_SHMEM); |
2916 | } |
2917 | diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c |
2918 | index b2ff6c8..f11e61e 100644 |
2919 | --- a/net/8021q/vlan_dev.c |
2920 | +++ b/net/8021q/vlan_dev.c |
2921 | @@ -338,7 +338,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb, |
2922 | u64_stats_update_begin(&stats->syncp); |
2923 | stats->tx_packets++; |
2924 | stats->tx_bytes += len; |
2925 | - u64_stats_update_begin(&stats->syncp); |
2926 | + u64_stats_update_end(&stats->syncp); |
2927 | } else { |
2928 | this_cpu_inc(vlan_dev_info(dev)->vlan_pcpu_stats->tx_dropped); |
2929 | } |
2930 | diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c |
2931 | index 5f9c091..ecaaa00 100644 |
2932 | --- a/net/bridge/br_netfilter.c |
2933 | +++ b/net/bridge/br_netfilter.c |
2934 | @@ -104,10 +104,16 @@ static void fake_update_pmtu(struct dst_entry *dst, u32 mtu) |
2935 | { |
2936 | } |
2937 | |
2938 | +static u32 *fake_cow_metrics(struct dst_entry *dst, unsigned long old) |
2939 | +{ |
2940 | + return NULL; |
2941 | +} |
2942 | + |
2943 | static struct dst_ops fake_dst_ops = { |
2944 | .family = AF_INET, |
2945 | .protocol = cpu_to_be16(ETH_P_IP), |
2946 | .update_pmtu = fake_update_pmtu, |
2947 | + .cow_metrics = fake_cow_metrics, |
2948 | }; |
2949 | |
2950 | /* |
2951 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c |
2952 | index f337525..76ed645 100644 |
2953 | --- a/net/core/ethtool.c |
2954 | +++ b/net/core/ethtool.c |
2955 | @@ -231,6 +231,29 @@ static int ethtool_set_feature_compat(struct net_device *dev, |
2956 | return 1; |
2957 | } |
2958 | |
2959 | +static int ethtool_set_flags_compat(struct net_device *dev, |
2960 | + int (*legacy_set)(struct net_device *, u32), |
2961 | + struct ethtool_set_features_block *features, u32 mask) |
2962 | +{ |
2963 | + u32 value; |
2964 | + |
2965 | + if (!legacy_set) |
2966 | + return 0; |
2967 | + |
2968 | + if (!(features[0].valid & mask)) |
2969 | + return 0; |
2970 | + |
2971 | + value = dev->features & ~features[0].valid; |
2972 | + value |= features[0].requested; |
2973 | + |
2974 | + features[0].valid &= ~mask; |
2975 | + |
2976 | + if (legacy_set(dev, value & mask) < 0) |
2977 | + netdev_info(dev, "Legacy flags change failed\n"); |
2978 | + |
2979 | + return 1; |
2980 | +} |
2981 | + |
2982 | static int ethtool_set_features_compat(struct net_device *dev, |
2983 | struct ethtool_set_features_block *features) |
2984 | { |
2985 | @@ -247,7 +270,7 @@ static int ethtool_set_features_compat(struct net_device *dev, |
2986 | features, NETIF_F_ALL_TSO); |
2987 | compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_rx_csum, |
2988 | features, NETIF_F_RXCSUM); |
2989 | - compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_flags, |
2990 | + compat |= ethtool_set_flags_compat(dev, dev->ethtool_ops->set_flags, |
2991 | features, flags_dup_features); |
2992 | |
2993 | return compat; |
2994 | diff --git a/net/core/filter.c b/net/core/filter.c |
2995 | index afb8afb..1238cbd 100644 |
2996 | --- a/net/core/filter.c |
2997 | +++ b/net/core/filter.c |
2998 | @@ -38,6 +38,7 @@ |
2999 | #include <asm/unaligned.h> |
3000 | #include <linux/filter.h> |
3001 | #include <linux/reciprocal_div.h> |
3002 | +#include <linux/ratelimit.h> |
3003 | |
3004 | enum { |
3005 | BPF_S_RET_K = 1, |
3006 | @@ -409,7 +410,9 @@ load_b: |
3007 | continue; |
3008 | } |
3009 | default: |
3010 | - WARN_ON(1); |
3011 | + WARN_RATELIMIT(1, "Unknown code:%u jt:%u tf:%u k:%u\n", |
3012 | + fentry->code, fentry->jt, |
3013 | + fentry->jf, fentry->k); |
3014 | return 0; |
3015 | } |
3016 | } |
3017 | diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c |
3018 | index 807d83c..6bab50e 100644 |
3019 | --- a/net/ipv4/af_inet.c |
3020 | +++ b/net/ipv4/af_inet.c |
3021 | @@ -464,6 +464,9 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
3022 | if (addr_len < sizeof(struct sockaddr_in)) |
3023 | goto out; |
3024 | |
3025 | + if (addr->sin_family != AF_INET) |
3026 | + goto out; |
3027 | + |
3028 | chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr); |
3029 | |
3030 | /* Not specified by any standard per-se, however it breaks too |
3031 | diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c |
3032 | index 2ada171..65c23d9 100644 |
3033 | --- a/net/ipv4/inet_diag.c |
3034 | +++ b/net/ipv4/inet_diag.c |
3035 | @@ -437,7 +437,7 @@ static int valid_cc(const void *bc, int len, int cc) |
3036 | return 0; |
3037 | if (cc == len) |
3038 | return 1; |
3039 | - if (op->yes < 4) |
3040 | + if (op->yes < 4 || op->yes & 3) |
3041 | return 0; |
3042 | len -= op->yes; |
3043 | bc += op->yes; |
3044 | @@ -447,11 +447,11 @@ static int valid_cc(const void *bc, int len, int cc) |
3045 | |
3046 | static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
3047 | { |
3048 | - const unsigned char *bc = bytecode; |
3049 | + const void *bc = bytecode; |
3050 | int len = bytecode_len; |
3051 | |
3052 | while (len > 0) { |
3053 | - struct inet_diag_bc_op *op = (struct inet_diag_bc_op *)bc; |
3054 | + const struct inet_diag_bc_op *op = bc; |
3055 | |
3056 | //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len); |
3057 | switch (op->code) { |
3058 | @@ -462,22 +462,20 @@ static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
3059 | case INET_DIAG_BC_S_LE: |
3060 | case INET_DIAG_BC_D_GE: |
3061 | case INET_DIAG_BC_D_LE: |
3062 | - if (op->yes < 4 || op->yes > len + 4) |
3063 | - return -EINVAL; |
3064 | case INET_DIAG_BC_JMP: |
3065 | - if (op->no < 4 || op->no > len + 4) |
3066 | + if (op->no < 4 || op->no > len + 4 || op->no & 3) |
3067 | return -EINVAL; |
3068 | if (op->no < len && |
3069 | !valid_cc(bytecode, bytecode_len, len - op->no)) |
3070 | return -EINVAL; |
3071 | break; |
3072 | case INET_DIAG_BC_NOP: |
3073 | - if (op->yes < 4 || op->yes > len + 4) |
3074 | - return -EINVAL; |
3075 | break; |
3076 | default: |
3077 | return -EINVAL; |
3078 | } |
3079 | + if (op->yes < 4 || op->yes > len + 4 || op->yes & 3) |
3080 | + return -EINVAL; |
3081 | bc += op->yes; |
3082 | len -= op->yes; |
3083 | } |
3084 | diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c |
3085 | index 9df4e63..ce616d9 100644 |
3086 | --- a/net/ipv4/inetpeer.c |
3087 | +++ b/net/ipv4/inetpeer.c |
3088 | @@ -154,11 +154,9 @@ void __init inet_initpeers(void) |
3089 | /* Called with or without local BH being disabled. */ |
3090 | static void unlink_from_unused(struct inet_peer *p) |
3091 | { |
3092 | - if (!list_empty(&p->unused)) { |
3093 | - spin_lock_bh(&unused_peers.lock); |
3094 | - list_del_init(&p->unused); |
3095 | - spin_unlock_bh(&unused_peers.lock); |
3096 | - } |
3097 | + spin_lock_bh(&unused_peers.lock); |
3098 | + list_del_init(&p->unused); |
3099 | + spin_unlock_bh(&unused_peers.lock); |
3100 | } |
3101 | |
3102 | static int addr_compare(const struct inetpeer_addr *a, |
3103 | @@ -205,6 +203,20 @@ static int addr_compare(const struct inetpeer_addr *a, |
3104 | u; \ |
3105 | }) |
3106 | |
3107 | +static bool atomic_add_unless_return(atomic_t *ptr, int a, int u, int *newv) |
3108 | +{ |
3109 | + int cur, old = atomic_read(ptr); |
3110 | + |
3111 | + while (old != u) { |
3112 | + *newv = old + a; |
3113 | + cur = atomic_cmpxchg(ptr, old, *newv); |
3114 | + if (cur == old) |
3115 | + return true; |
3116 | + old = cur; |
3117 | + } |
3118 | + return false; |
3119 | +} |
3120 | + |
3121 | /* |
3122 | * Called with rcu_read_lock() |
3123 | * Because we hold no lock against a writer, its quite possible we fall |
3124 | @@ -213,7 +225,8 @@ static int addr_compare(const struct inetpeer_addr *a, |
3125 | * We exit from this function if number of links exceeds PEER_MAXDEPTH |
3126 | */ |
3127 | static struct inet_peer *lookup_rcu(const struct inetpeer_addr *daddr, |
3128 | - struct inet_peer_base *base) |
3129 | + struct inet_peer_base *base, |
3130 | + int *newrefcnt) |
3131 | { |
3132 | struct inet_peer *u = rcu_dereference(base->root); |
3133 | int count = 0; |
3134 | @@ -226,7 +239,7 @@ static struct inet_peer *lookup_rcu(const struct inetpeer_addr *daddr, |
3135 | * distinction between an unused entry (refcnt=0) and |
3136 | * a freed one. |
3137 | */ |
3138 | - if (unlikely(!atomic_add_unless(&u->refcnt, 1, -1))) |
3139 | + if (!atomic_add_unless_return(&u->refcnt, 1, -1, newrefcnt)) |
3140 | u = NULL; |
3141 | return u; |
3142 | } |
3143 | @@ -465,22 +478,23 @@ struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create) |
3144 | struct inet_peer_base *base = family_to_base(daddr->family); |
3145 | struct inet_peer *p; |
3146 | unsigned int sequence; |
3147 | - int invalidated; |
3148 | + int invalidated, newrefcnt = 0; |
3149 | |
3150 | /* Look up for the address quickly, lockless. |
3151 | * Because of a concurrent writer, we might not find an existing entry. |
3152 | */ |
3153 | rcu_read_lock(); |
3154 | sequence = read_seqbegin(&base->lock); |
3155 | - p = lookup_rcu(daddr, base); |
3156 | + p = lookup_rcu(daddr, base, &newrefcnt); |
3157 | invalidated = read_seqretry(&base->lock, sequence); |
3158 | rcu_read_unlock(); |
3159 | |
3160 | if (p) { |
3161 | - /* The existing node has been found. |
3162 | +found: /* The existing node has been found. |
3163 | * Remove the entry from unused list if it was there. |
3164 | */ |
3165 | - unlink_from_unused(p); |
3166 | + if (newrefcnt == 1) |
3167 | + unlink_from_unused(p); |
3168 | return p; |
3169 | } |
3170 | |
3171 | @@ -494,11 +508,9 @@ struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create) |
3172 | write_seqlock_bh(&base->lock); |
3173 | p = lookup(daddr, stack, base); |
3174 | if (p != peer_avl_empty) { |
3175 | - atomic_inc(&p->refcnt); |
3176 | + newrefcnt = atomic_inc_return(&p->refcnt); |
3177 | write_sequnlock_bh(&base->lock); |
3178 | - /* Remove the entry from unused list if it was there. */ |
3179 | - unlink_from_unused(p); |
3180 | - return p; |
3181 | + goto found; |
3182 | } |
3183 | p = create ? kmem_cache_alloc(peer_cachep, GFP_ATOMIC) : NULL; |
3184 | if (p) { |
3185 | diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c |
3186 | index 4614bab..2e97e3e 100644 |
3187 | --- a/net/ipv4/netfilter.c |
3188 | +++ b/net/ipv4/netfilter.c |
3189 | @@ -17,51 +17,35 @@ int ip_route_me_harder(struct sk_buff *skb, unsigned addr_type) |
3190 | const struct iphdr *iph = ip_hdr(skb); |
3191 | struct rtable *rt; |
3192 | struct flowi4 fl4 = {}; |
3193 | - unsigned long orefdst; |
3194 | + __be32 saddr = iph->saddr; |
3195 | + __u8 flags = 0; |
3196 | unsigned int hh_len; |
3197 | - unsigned int type; |
3198 | |
3199 | - type = inet_addr_type(net, iph->saddr); |
3200 | - if (skb->sk && inet_sk(skb->sk)->transparent) |
3201 | - type = RTN_LOCAL; |
3202 | - if (addr_type == RTN_UNSPEC) |
3203 | - addr_type = type; |
3204 | + if (!skb->sk && addr_type != RTN_LOCAL) { |
3205 | + if (addr_type == RTN_UNSPEC) |
3206 | + addr_type = inet_addr_type(net, saddr); |
3207 | + if (addr_type == RTN_LOCAL || addr_type == RTN_UNICAST) |
3208 | + flags |= FLOWI_FLAG_ANYSRC; |
3209 | + else |
3210 | + saddr = 0; |
3211 | + } |
3212 | |
3213 | /* some non-standard hacks like ipt_REJECT.c:send_reset() can cause |
3214 | * packets with foreign saddr to appear on the NF_INET_LOCAL_OUT hook. |
3215 | */ |
3216 | - if (addr_type == RTN_LOCAL) { |
3217 | - fl4.daddr = iph->daddr; |
3218 | - if (type == RTN_LOCAL) |
3219 | - fl4.saddr = iph->saddr; |
3220 | - fl4.flowi4_tos = RT_TOS(iph->tos); |
3221 | - fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0; |
3222 | - fl4.flowi4_mark = skb->mark; |
3223 | - fl4.flowi4_flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : 0; |
3224 | - rt = ip_route_output_key(net, &fl4); |
3225 | - if (IS_ERR(rt)) |
3226 | - return -1; |
3227 | - |
3228 | - /* Drop old route. */ |
3229 | - skb_dst_drop(skb); |
3230 | - skb_dst_set(skb, &rt->dst); |
3231 | - } else { |
3232 | - /* non-local src, find valid iif to satisfy |
3233 | - * rp-filter when calling ip_route_input. */ |
3234 | - fl4.daddr = iph->saddr; |
3235 | - rt = ip_route_output_key(net, &fl4); |
3236 | - if (IS_ERR(rt)) |
3237 | - return -1; |
3238 | + fl4.daddr = iph->daddr; |
3239 | + fl4.saddr = saddr; |
3240 | + fl4.flowi4_tos = RT_TOS(iph->tos); |
3241 | + fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0; |
3242 | + fl4.flowi4_mark = skb->mark; |
3243 | + fl4.flowi4_flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : flags; |
3244 | + rt = ip_route_output_key(net, &fl4); |
3245 | + if (IS_ERR(rt)) |
3246 | + return -1; |
3247 | |
3248 | - orefdst = skb->_skb_refdst; |
3249 | - if (ip_route_input(skb, iph->daddr, iph->saddr, |
3250 | - RT_TOS(iph->tos), rt->dst.dev) != 0) { |
3251 | - dst_release(&rt->dst); |
3252 | - return -1; |
3253 | - } |
3254 | - dst_release(&rt->dst); |
3255 | - refdst_drop(orefdst); |
3256 | - } |
3257 | + /* Drop old route. */ |
3258 | + skb_dst_drop(skb); |
3259 | + skb_dst_set(skb, &rt->dst); |
3260 | |
3261 | if (skb_dst(skb)->error) |
3262 | return -1; |
3263 | diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c |
3264 | index 1ff79e5..51f13f8 100644 |
3265 | --- a/net/ipv4/netfilter/ipt_REJECT.c |
3266 | +++ b/net/ipv4/netfilter/ipt_REJECT.c |
3267 | @@ -40,7 +40,6 @@ static void send_reset(struct sk_buff *oldskb, int hook) |
3268 | struct iphdr *niph; |
3269 | const struct tcphdr *oth; |
3270 | struct tcphdr _otcph, *tcph; |
3271 | - unsigned int addr_type; |
3272 | |
3273 | /* IP header checks: fragment. */ |
3274 | if (ip_hdr(oldskb)->frag_off & htons(IP_OFFSET)) |
3275 | @@ -55,6 +54,9 @@ static void send_reset(struct sk_buff *oldskb, int hook) |
3276 | if (oth->rst) |
3277 | return; |
3278 | |
3279 | + if (skb_rtable(oldskb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) |
3280 | + return; |
3281 | + |
3282 | /* Check checksum */ |
3283 | if (nf_ip_checksum(oldskb, hook, ip_hdrlen(oldskb), IPPROTO_TCP)) |
3284 | return; |
3285 | @@ -101,19 +103,11 @@ static void send_reset(struct sk_buff *oldskb, int hook) |
3286 | nskb->csum_start = (unsigned char *)tcph - nskb->head; |
3287 | nskb->csum_offset = offsetof(struct tcphdr, check); |
3288 | |
3289 | - addr_type = RTN_UNSPEC; |
3290 | - if (hook != NF_INET_FORWARD |
3291 | -#ifdef CONFIG_BRIDGE_NETFILTER |
3292 | - || (nskb->nf_bridge && nskb->nf_bridge->mask & BRNF_BRIDGED) |
3293 | -#endif |
3294 | - ) |
3295 | - addr_type = RTN_LOCAL; |
3296 | - |
3297 | /* ip_route_me_harder expects skb->dst to be set */ |
3298 | skb_dst_set_noref(nskb, skb_dst(oldskb)); |
3299 | |
3300 | nskb->protocol = htons(ETH_P_IP); |
3301 | - if (ip_route_me_harder(nskb, addr_type)) |
3302 | + if (ip_route_me_harder(nskb, RTN_UNSPEC)) |
3303 | goto free_nskb; |
3304 | |
3305 | niph->ttl = ip4_dst_hoplimit(skb_dst(nskb)); |
3306 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
3307 | index 99e6e4b..b8b5c3f 100644 |
3308 | --- a/net/ipv4/route.c |
3309 | +++ b/net/ipv4/route.c |
3310 | @@ -1914,9 +1914,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr, |
3311 | |
3312 | hash = rt_hash(daddr, saddr, dev->ifindex, rt_genid(dev_net(dev))); |
3313 | rth = rt_intern_hash(hash, rth, skb, dev->ifindex); |
3314 | - err = 0; |
3315 | - if (IS_ERR(rth)) |
3316 | - err = PTR_ERR(rth); |
3317 | + return IS_ERR(rth) ? PTR_ERR(rth) : 0; |
3318 | |
3319 | e_nobufs: |
3320 | return -ENOBUFS; |
3321 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
3322 | index f87a8eb..0e33e34 100644 |
3323 | --- a/net/ipv4/udp.c |
3324 | +++ b/net/ipv4/udp.c |
3325 | @@ -1241,6 +1241,9 @@ csum_copy_err: |
3326 | |
3327 | if (noblock) |
3328 | return -EAGAIN; |
3329 | + |
3330 | + /* starting over for a new packet */ |
3331 | + msg->msg_flags &= ~MSG_TRUNC; |
3332 | goto try_again; |
3333 | } |
3334 | |
3335 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
3336 | index 9e305d74..b31a2f3 100644 |
3337 | --- a/net/ipv6/udp.c |
3338 | +++ b/net/ipv6/udp.c |
3339 | @@ -453,8 +453,11 @@ csum_copy_err: |
3340 | } |
3341 | unlock_sock_fast(sk, slow); |
3342 | |
3343 | - if (flags & MSG_DONTWAIT) |
3344 | + if (noblock) |
3345 | return -EAGAIN; |
3346 | + |
3347 | + /* starting over for a new packet */ |
3348 | + msg->msg_flags &= ~MSG_TRUNC; |
3349 | goto try_again; |
3350 | } |
3351 | |
3352 | diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c |
3353 | index 72d1ac6..8041bef 100644 |
3354 | --- a/net/netfilter/ipset/ip_set_core.c |
3355 | +++ b/net/netfilter/ipset/ip_set_core.c |
3356 | @@ -815,7 +815,7 @@ ip_set_flush(struct sock *ctnl, struct sk_buff *skb, |
3357 | ip_set_id_t i; |
3358 | |
3359 | if (unlikely(protocol_failed(attr))) |
3360 | - return -EPROTO; |
3361 | + return -IPSET_ERR_PROTOCOL; |
3362 | |
3363 | if (!attr[IPSET_ATTR_SETNAME]) { |
3364 | for (i = 0; i < ip_set_max; i++) |
3365 | diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c |
3366 | index bf28ac2..782db27 100644 |
3367 | --- a/net/netfilter/ipvs/ip_vs_conn.c |
3368 | +++ b/net/netfilter/ipvs/ip_vs_conn.c |
3369 | @@ -776,8 +776,16 @@ static void ip_vs_conn_expire(unsigned long data) |
3370 | if (cp->control) |
3371 | ip_vs_control_del(cp); |
3372 | |
3373 | - if (cp->flags & IP_VS_CONN_F_NFCT) |
3374 | + if (cp->flags & IP_VS_CONN_F_NFCT) { |
3375 | ip_vs_conn_drop_conntrack(cp); |
3376 | + /* Do not access conntracks during subsys cleanup |
3377 | + * because nf_conntrack_find_get can not be used after |
3378 | + * conntrack cleanup for the net. |
3379 | + */ |
3380 | + smp_rmb(); |
3381 | + if (ipvs->enable) |
3382 | + ip_vs_conn_drop_conntrack(cp); |
3383 | + } |
3384 | |
3385 | ip_vs_pe_put(cp->pe); |
3386 | kfree(cp->pe_data); |
3387 | diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c |
3388 | index a74dae6..7729eae 100644 |
3389 | --- a/net/netfilter/ipvs/ip_vs_core.c |
3390 | +++ b/net/netfilter/ipvs/ip_vs_core.c |
3391 | @@ -1965,6 +1965,7 @@ static void __net_exit __ip_vs_dev_cleanup(struct net *net) |
3392 | { |
3393 | EnterFunction(2); |
3394 | net_ipvs(net)->enable = 0; /* Disable packet reception */ |
3395 | + smp_wmb(); |
3396 | __ip_vs_sync_cleanup(net); |
3397 | LeaveFunction(2); |
3398 | } |
3399 | diff --git a/net/netfilter/ipvs/ip_vs_ftp.c b/net/netfilter/ipvs/ip_vs_ftp.c |
3400 | index 6b5dd6d..af63553 100644 |
3401 | --- a/net/netfilter/ipvs/ip_vs_ftp.c |
3402 | +++ b/net/netfilter/ipvs/ip_vs_ftp.c |
3403 | @@ -411,25 +411,35 @@ static struct ip_vs_app ip_vs_ftp = { |
3404 | static int __net_init __ip_vs_ftp_init(struct net *net) |
3405 | { |
3406 | int i, ret; |
3407 | - struct ip_vs_app *app = &ip_vs_ftp; |
3408 | + struct ip_vs_app *app; |
3409 | + struct netns_ipvs *ipvs = net_ipvs(net); |
3410 | + |
3411 | + app = kmemdup(&ip_vs_ftp, sizeof(struct ip_vs_app), GFP_KERNEL); |
3412 | + if (!app) |
3413 | + return -ENOMEM; |
3414 | + INIT_LIST_HEAD(&app->a_list); |
3415 | + INIT_LIST_HEAD(&app->incs_list); |
3416 | + ipvs->ftp_app = app; |
3417 | |
3418 | ret = register_ip_vs_app(net, app); |
3419 | if (ret) |
3420 | - return ret; |
3421 | + goto err_exit; |
3422 | |
3423 | for (i=0; i<IP_VS_APP_MAX_PORTS; i++) { |
3424 | if (!ports[i]) |
3425 | continue; |
3426 | ret = register_ip_vs_app_inc(net, app, app->protocol, ports[i]); |
3427 | if (ret) |
3428 | - break; |
3429 | + goto err_unreg; |
3430 | pr_info("%s: loaded support on port[%d] = %d\n", |
3431 | app->name, i, ports[i]); |
3432 | } |
3433 | + return 0; |
3434 | |
3435 | - if (ret) |
3436 | - unregister_ip_vs_app(net, app); |
3437 | - |
3438 | +err_unreg: |
3439 | + unregister_ip_vs_app(net, app); |
3440 | +err_exit: |
3441 | + kfree(ipvs->ftp_app); |
3442 | return ret; |
3443 | } |
3444 | /* |
3445 | @@ -437,9 +447,10 @@ static int __net_init __ip_vs_ftp_init(struct net *net) |
3446 | */ |
3447 | static void __ip_vs_ftp_exit(struct net *net) |
3448 | { |
3449 | - struct ip_vs_app *app = &ip_vs_ftp; |
3450 | + struct netns_ipvs *ipvs = net_ipvs(net); |
3451 | |
3452 | - unregister_ip_vs_app(net, app); |
3453 | + unregister_ip_vs_app(net, ipvs->ftp_app); |
3454 | + kfree(ipvs->ftp_app); |
3455 | } |
3456 | |
3457 | static struct pernet_operations ip_vs_ftp_ops = { |
3458 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
3459 | index b5362e9..04098c2 100644 |
3460 | --- a/net/packet/af_packet.c |
3461 | +++ b/net/packet/af_packet.c |
3462 | @@ -799,6 +799,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, |
3463 | h.h2->tp_sec = ts.tv_sec; |
3464 | h.h2->tp_nsec = ts.tv_nsec; |
3465 | h.h2->tp_vlan_tci = vlan_tx_tag_get(skb); |
3466 | + h.h2->tp_padding = 0; |
3467 | hdrlen = sizeof(*h.h2); |
3468 | break; |
3469 | default: |
3470 | @@ -1727,6 +1728,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, |
3471 | aux.tp_net = skb_network_offset(skb); |
3472 | aux.tp_vlan_tci = vlan_tx_tag_get(skb); |
3473 | |
3474 | + aux.tp_padding = 0; |
3475 | put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux); |
3476 | } |
3477 | |
3478 | diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c |
3479 | index 339ba64..5daf6cc 100644 |
3480 | --- a/net/sunrpc/auth_gss/auth_gss.c |
3481 | +++ b/net/sunrpc/auth_gss/auth_gss.c |
3482 | @@ -577,13 +577,13 @@ retry: |
3483 | } |
3484 | inode = &gss_msg->inode->vfs_inode; |
3485 | for (;;) { |
3486 | - prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_INTERRUPTIBLE); |
3487 | + prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); |
3488 | spin_lock(&inode->i_lock); |
3489 | if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { |
3490 | break; |
3491 | } |
3492 | spin_unlock(&inode->i_lock); |
3493 | - if (signalled()) { |
3494 | + if (fatal_signal_pending(current)) { |
3495 | err = -ERESTARTSYS; |
3496 | goto out_intr; |
3497 | } |
3498 | diff --git a/net/sunrpc/auth_gss/gss_krb5_mech.c b/net/sunrpc/auth_gss/gss_krb5_mech.c |
3499 | index 0a9a2ec..c3b7533 100644 |
3500 | --- a/net/sunrpc/auth_gss/gss_krb5_mech.c |
3501 | +++ b/net/sunrpc/auth_gss/gss_krb5_mech.c |
3502 | @@ -43,6 +43,7 @@ |
3503 | #include <linux/sunrpc/gss_krb5.h> |
3504 | #include <linux/sunrpc/xdr.h> |
3505 | #include <linux/crypto.h> |
3506 | +#include <linux/sunrpc/gss_krb5_enctypes.h> |
3507 | |
3508 | #ifdef RPC_DEBUG |
3509 | # define RPCDBG_FACILITY RPCDBG_AUTH |
3510 | @@ -750,7 +751,7 @@ static struct gss_api_mech gss_kerberos_mech = { |
3511 | .gm_ops = &gss_kerberos_ops, |
3512 | .gm_pf_num = ARRAY_SIZE(gss_kerberos_pfs), |
3513 | .gm_pfs = gss_kerberos_pfs, |
3514 | - .gm_upcall_enctypes = "18,17,16,23,3,1,2", |
3515 | + .gm_upcall_enctypes = KRB5_SUPPORTED_ENCTYPES, |
3516 | }; |
3517 | |
3518 | static int __init init_kerberos_module(void) |
3519 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
3520 | index 8d83f9d..00df09b 100644 |
3521 | --- a/net/sunrpc/clnt.c |
3522 | +++ b/net/sunrpc/clnt.c |
3523 | @@ -1058,7 +1058,7 @@ call_allocate(struct rpc_task *task) |
3524 | |
3525 | dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid); |
3526 | |
3527 | - if (RPC_IS_ASYNC(task) || !signalled()) { |
3528 | + if (RPC_IS_ASYNC(task) || !fatal_signal_pending(current)) { |
3529 | task->tk_action = call_allocate; |
3530 | rpc_delay(task, HZ>>4); |
3531 | return; |
3532 | @@ -1172,6 +1172,9 @@ call_bind_status(struct rpc_task *task) |
3533 | status = -EOPNOTSUPP; |
3534 | break; |
3535 | } |
3536 | + if (task->tk_rebind_retry == 0) |
3537 | + break; |
3538 | + task->tk_rebind_retry--; |
3539 | rpc_delay(task, 3*HZ); |
3540 | goto retry_timeout; |
3541 | case -ETIMEDOUT: |
3542 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c |
3543 | index 6b43ee7..a27406b 100644 |
3544 | --- a/net/sunrpc/sched.c |
3545 | +++ b/net/sunrpc/sched.c |
3546 | @@ -792,6 +792,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta |
3547 | /* Initialize retry counters */ |
3548 | task->tk_garb_retry = 2; |
3549 | task->tk_cred_retry = 2; |
3550 | + task->tk_rebind_retry = 2; |
3551 | |
3552 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; |
3553 | task->tk_owner = current->tgid; |
3554 | diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c |
3555 | index 47f1b86..b11ea69 100644 |
3556 | --- a/net/xfrm/xfrm_replay.c |
3557 | +++ b/net/xfrm/xfrm_replay.c |
3558 | @@ -265,7 +265,7 @@ static void xfrm_replay_advance_bmp(struct xfrm_state *x, __be32 net_seq) |
3559 | bitnr = bitnr & 0x1F; |
3560 | replay_esn->bmp[nr] |= (1U << bitnr); |
3561 | } else { |
3562 | - nr = replay_esn->replay_window >> 5; |
3563 | + nr = (replay_esn->replay_window - 1) >> 5; |
3564 | for (i = 0; i <= nr; i++) |
3565 | replay_esn->bmp[i] = 0; |
3566 | |
3567 | @@ -471,7 +471,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) |
3568 | bitnr = bitnr & 0x1F; |
3569 | replay_esn->bmp[nr] |= (1U << bitnr); |
3570 | } else { |
3571 | - nr = replay_esn->replay_window >> 5; |
3572 | + nr = (replay_esn->replay_window - 1) >> 5; |
3573 | for (i = 0; i <= nr; i++) |
3574 | replay_esn->bmp[i] = 0; |
3575 | |
3576 | diff --git a/security/keys/request_key.c b/security/keys/request_key.c |
3577 | index df3c041..6197a26 100644 |
3578 | --- a/security/keys/request_key.c |
3579 | +++ b/security/keys/request_key.c |
3580 | @@ -470,7 +470,7 @@ static struct key *construct_key_and_link(struct key_type *type, |
3581 | } else if (ret == -EINPROGRESS) { |
3582 | ret = 0; |
3583 | } else { |
3584 | - key = ERR_PTR(ret); |
3585 | + goto couldnt_alloc_key; |
3586 | } |
3587 | |
3588 | key_put(dest_keyring); |
3589 | @@ -480,6 +480,7 @@ static struct key *construct_key_and_link(struct key_type *type, |
3590 | construction_failed: |
3591 | key_negate_and_link(key, key_negative_timeout, NULL, NULL); |
3592 | key_put(key); |
3593 | +couldnt_alloc_key: |
3594 | key_put(dest_keyring); |
3595 | kleave(" = %d", ret); |
3596 | return ERR_PTR(ret); |
3597 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
3598 | index 15b9d16..e47f22c 100644 |
3599 | --- a/sound/pci/hda/patch_conexant.c |
3600 | +++ b/sound/pci/hda/patch_conexant.c |
3601 | @@ -3846,6 +3846,8 @@ static struct hda_codec_preset snd_hda_preset_conexant[] = { |
3602 | .patch = patch_cxt5066 }, |
3603 | { .id = 0x14f15069, .name = "CX20585", |
3604 | .patch = patch_cxt5066 }, |
3605 | + { .id = 0x14f1506c, .name = "CX20588", |
3606 | + .patch = patch_cxt5066 }, |
3607 | { .id = 0x14f1506e, .name = "CX20590", |
3608 | .patch = patch_cxt5066 }, |
3609 | { .id = 0x14f15097, .name = "CX20631", |
3610 | @@ -3874,6 +3876,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15066"); |
3611 | MODULE_ALIAS("snd-hda-codec-id:14f15067"); |
3612 | MODULE_ALIAS("snd-hda-codec-id:14f15068"); |
3613 | MODULE_ALIAS("snd-hda-codec-id:14f15069"); |
3614 | +MODULE_ALIAS("snd-hda-codec-id:14f1506c"); |
3615 | MODULE_ALIAS("snd-hda-codec-id:14f1506e"); |
3616 | MODULE_ALIAS("snd-hda-codec-id:14f15097"); |
3617 | MODULE_ALIAS("snd-hda-codec-id:14f15098"); |
3618 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3619 | index 2e95f01..4145c3c 100644 |
3620 | --- a/sound/pci/hda/patch_realtek.c |
3621 | +++ b/sound/pci/hda/patch_realtek.c |
3622 | @@ -4607,7 +4607,6 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = { |
3623 | SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG), |
3624 | SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST), |
3625 | SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG), |
3626 | - SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST), |
3627 | SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V), |
3628 | SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG), |
3629 | SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG), |
3630 | diff --git a/sound/soc/pxa/pxa2xx-pcm.c b/sound/soc/pxa/pxa2xx-pcm.c |
3631 | index 2ce0b2d..fab20a5 100644 |
3632 | --- a/sound/soc/pxa/pxa2xx-pcm.c |
3633 | +++ b/sound/soc/pxa/pxa2xx-pcm.c |
3634 | @@ -95,14 +95,14 @@ static int pxa2xx_soc_pcm_new(struct snd_card *card, struct snd_soc_dai *dai, |
3635 | if (!card->dev->coherent_dma_mask) |
3636 | card->dev->coherent_dma_mask = DMA_BIT_MASK(32); |
3637 | |
3638 | - if (dai->driver->playback.channels_min) { |
3639 | + if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { |
3640 | ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, |
3641 | SNDRV_PCM_STREAM_PLAYBACK); |
3642 | if (ret) |
3643 | goto out; |
3644 | } |
3645 | |
3646 | - if (dai->driver->capture.channels_min) { |
3647 | + if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { |
3648 | ret = pxa2xx_pcm_preallocate_dma_buffer(pcm, |
3649 | SNDRV_PCM_STREAM_CAPTURE); |
3650 | if (ret) |
3651 | diff --git a/virt/kvm/assigned-dev.c b/virt/kvm/assigned-dev.c |
3652 | index ae72ae6..e3f1235 100644 |
3653 | --- a/virt/kvm/assigned-dev.c |
3654 | +++ b/virt/kvm/assigned-dev.c |
3655 | @@ -197,8 +197,7 @@ static void kvm_free_assigned_device(struct kvm *kvm, |
3656 | { |
3657 | kvm_free_assigned_irq(kvm, assigned_dev); |
3658 | |
3659 | - __pci_reset_function(assigned_dev->dev); |
3660 | - pci_restore_state(assigned_dev->dev); |
3661 | + pci_reset_function(assigned_dev->dev); |
3662 | |
3663 | pci_release_regions(assigned_dev->dev); |
3664 | pci_disable_device(assigned_dev->dev); |
3665 | @@ -515,7 +514,6 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm, |
3666 | } |
3667 | |
3668 | pci_reset_function(dev); |
3669 | - pci_save_state(dev); |
3670 | |
3671 | match->assigned_dev_id = assigned_dev->assigned_dev_id; |
3672 | match->host_segnr = assigned_dev->segnr; |
3673 | @@ -546,7 +544,6 @@ out: |
3674 | mutex_unlock(&kvm->lock); |
3675 | return r; |
3676 | out_list_del: |
3677 | - pci_restore_state(dev); |
3678 | list_del(&match->list); |
3679 | pci_release_regions(dev); |
3680 | out_disable: |