Contents of /trunk/kernel-magellan/patches-3.12/0101-3.12.2-all-fixes.patch
Parent Directory | Revision Log
Revision 2382 -
(show annotations)
(download)
Tue Jan 28 08:28:34 2014 UTC (10 years, 8 months ago) by niro
File size: 124358 byte(s)
Tue Jan 28 08:28:34 2014 UTC (10 years, 8 months ago) by niro
File size: 124358 byte(s)
-linux-3.12.2
1 | diff --git a/Makefile b/Makefile |
2 | index eb29ec754a9e..e6e72b629da7 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 12 |
8 | -SUBLEVEL = 1 |
9 | +SUBLEVEL = 2 |
10 | EXTRAVERSION = |
11 | NAME = One Giant Leap for Frogkind |
12 | |
13 | diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c |
14 | index b0de86b56c13..cb79a5dd6d96 100644 |
15 | --- a/arch/arm/kvm/mmu.c |
16 | +++ b/arch/arm/kvm/mmu.c |
17 | @@ -307,6 +307,17 @@ out: |
18 | return err; |
19 | } |
20 | |
21 | +static phys_addr_t kvm_kaddr_to_phys(void *kaddr) |
22 | +{ |
23 | + if (!is_vmalloc_addr(kaddr)) { |
24 | + BUG_ON(!virt_addr_valid(kaddr)); |
25 | + return __pa(kaddr); |
26 | + } else { |
27 | + return page_to_phys(vmalloc_to_page(kaddr)) + |
28 | + offset_in_page(kaddr); |
29 | + } |
30 | +} |
31 | + |
32 | /** |
33 | * create_hyp_mappings - duplicate a kernel virtual address range in Hyp mode |
34 | * @from: The virtual kernel start address of the range |
35 | @@ -318,16 +329,27 @@ out: |
36 | */ |
37 | int create_hyp_mappings(void *from, void *to) |
38 | { |
39 | - unsigned long phys_addr = virt_to_phys(from); |
40 | + phys_addr_t phys_addr; |
41 | + unsigned long virt_addr; |
42 | unsigned long start = KERN_TO_HYP((unsigned long)from); |
43 | unsigned long end = KERN_TO_HYP((unsigned long)to); |
44 | |
45 | - /* Check for a valid kernel memory mapping */ |
46 | - if (!virt_addr_valid(from) || !virt_addr_valid(to - 1)) |
47 | - return -EINVAL; |
48 | + start = start & PAGE_MASK; |
49 | + end = PAGE_ALIGN(end); |
50 | |
51 | - return __create_hyp_mappings(hyp_pgd, start, end, |
52 | - __phys_to_pfn(phys_addr), PAGE_HYP); |
53 | + for (virt_addr = start; virt_addr < end; virt_addr += PAGE_SIZE) { |
54 | + int err; |
55 | + |
56 | + phys_addr = kvm_kaddr_to_phys(from + virt_addr - start); |
57 | + err = __create_hyp_mappings(hyp_pgd, virt_addr, |
58 | + virt_addr + PAGE_SIZE, |
59 | + __phys_to_pfn(phys_addr), |
60 | + PAGE_HYP); |
61 | + if (err) |
62 | + return err; |
63 | + } |
64 | + |
65 | + return 0; |
66 | } |
67 | |
68 | /** |
69 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c |
70 | index d9ee0ff094d4..3d5db8c83b3c 100644 |
71 | --- a/arch/arm/mach-omap2/omap_hwmod.c |
72 | +++ b/arch/arm/mach-omap2/omap_hwmod.c |
73 | @@ -2361,21 +2361,23 @@ static struct device_node *of_dev_hwmod_lookup(struct device_node *np, |
74 | * Cache the virtual address used by the MPU to access this IP block's |
75 | * registers. This address is needed early so the OCP registers that |
76 | * are part of the device's address space can be ioremapped properly. |
77 | - * No return value. |
78 | + * |
79 | + * Returns 0 on success, -EINVAL if an invalid hwmod is passed, and |
80 | + * -ENXIO on absent or invalid register target address space. |
81 | */ |
82 | -static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) |
83 | +static int __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) |
84 | { |
85 | struct omap_hwmod_addr_space *mem; |
86 | void __iomem *va_start = NULL; |
87 | struct device_node *np; |
88 | |
89 | if (!oh) |
90 | - return; |
91 | + return -EINVAL; |
92 | |
93 | _save_mpu_port_index(oh); |
94 | |
95 | if (oh->_int_flags & _HWMOD_NO_MPU_PORT) |
96 | - return; |
97 | + return -ENXIO; |
98 | |
99 | mem = _find_mpu_rt_addr_space(oh); |
100 | if (!mem) { |
101 | @@ -2384,7 +2386,7 @@ static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) |
102 | |
103 | /* Extract the IO space from device tree blob */ |
104 | if (!of_have_populated_dt()) |
105 | - return; |
106 | + return -ENXIO; |
107 | |
108 | np = of_dev_hwmod_lookup(of_find_node_by_name(NULL, "ocp"), oh); |
109 | if (np) |
110 | @@ -2395,13 +2397,14 @@ static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) |
111 | |
112 | if (!va_start) { |
113 | pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name); |
114 | - return; |
115 | + return -ENXIO; |
116 | } |
117 | |
118 | pr_debug("omap_hwmod: %s: MPU register target at va %p\n", |
119 | oh->name, va_start); |
120 | |
121 | oh->_mpu_rt_va = va_start; |
122 | + return 0; |
123 | } |
124 | |
125 | /** |
126 | @@ -2414,8 +2417,8 @@ static void __init _init_mpu_rt_base(struct omap_hwmod *oh, void *data) |
127 | * registered at this point. This is the first of two phases for |
128 | * hwmod initialization. Code called here does not touch any hardware |
129 | * registers, it simply prepares internal data structures. Returns 0 |
130 | - * upon success or if the hwmod isn't registered, or -EINVAL upon |
131 | - * failure. |
132 | + * upon success or if the hwmod isn't registered or if the hwmod's |
133 | + * address space is not defined, or -EINVAL upon failure. |
134 | */ |
135 | static int __init _init(struct omap_hwmod *oh, void *data) |
136 | { |
137 | @@ -2424,8 +2427,14 @@ static int __init _init(struct omap_hwmod *oh, void *data) |
138 | if (oh->_state != _HWMOD_STATE_REGISTERED) |
139 | return 0; |
140 | |
141 | - if (oh->class->sysc) |
142 | - _init_mpu_rt_base(oh, NULL); |
143 | + if (oh->class->sysc) { |
144 | + r = _init_mpu_rt_base(oh, NULL); |
145 | + if (r < 0) { |
146 | + WARN(1, "omap_hwmod: %s: doesn't have mpu register target base\n", |
147 | + oh->name); |
148 | + return 0; |
149 | + } |
150 | + } |
151 | |
152 | r = _init_clocks(oh, NULL); |
153 | if (r < 0) { |
154 | diff --git a/arch/cris/include/asm/io.h b/arch/cris/include/asm/io.h |
155 | index 5d3047e5563b..4353cf239a13 100644 |
156 | --- a/arch/cris/include/asm/io.h |
157 | +++ b/arch/cris/include/asm/io.h |
158 | @@ -3,6 +3,7 @@ |
159 | |
160 | #include <asm/page.h> /* for __va, __pa */ |
161 | #include <arch/io.h> |
162 | +#include <asm-generic/iomap.h> |
163 | #include <linux/kernel.h> |
164 | |
165 | struct cris_io_operations |
166 | diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h |
167 | index e0a899a1a8a6..5a84b3a50741 100644 |
168 | --- a/arch/ia64/include/asm/processor.h |
169 | +++ b/arch/ia64/include/asm/processor.h |
170 | @@ -319,7 +319,7 @@ struct thread_struct { |
171 | regs->loadrs = 0; \ |
172 | regs->r8 = get_dumpable(current->mm); /* set "don't zap registers" flag */ \ |
173 | regs->r12 = new_sp - 16; /* allocate 16 byte scratch area */ \ |
174 | - if (unlikely(!get_dumpable(current->mm))) { \ |
175 | + if (unlikely(get_dumpable(current->mm) != SUID_DUMP_USER)) { \ |
176 | /* \ |
177 | * Zap scratch regs to avoid leaking bits between processes with different \ |
178 | * uid/privileges. \ |
179 | diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c |
180 | index 55593ee2d5aa..c766cf575520 100644 |
181 | --- a/arch/powerpc/kernel/eeh.c |
182 | +++ b/arch/powerpc/kernel/eeh.c |
183 | @@ -687,6 +687,15 @@ void eeh_save_bars(struct eeh_dev *edev) |
184 | |
185 | for (i = 0; i < 16; i++) |
186 | eeh_ops->read_config(dn, i * 4, 4, &edev->config_space[i]); |
187 | + |
188 | + /* |
189 | + * For PCI bridges including root port, we need enable bus |
190 | + * master explicitly. Otherwise, it can't fetch IODA table |
191 | + * entries correctly. So we cache the bit in advance so that |
192 | + * we can restore it after reset, either PHB range or PE range. |
193 | + */ |
194 | + if (edev->mode & EEH_DEV_BRIDGE) |
195 | + edev->config_space[1] |= PCI_COMMAND_MASTER; |
196 | } |
197 | |
198 | /** |
199 | diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c |
200 | index bebdf1a1a540..36d49e6b7c4c 100644 |
201 | --- a/arch/powerpc/kernel/signal_32.c |
202 | +++ b/arch/powerpc/kernel/signal_32.c |
203 | @@ -457,7 +457,15 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, |
204 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) |
205 | return 1; |
206 | msr |= MSR_VSX; |
207 | - } |
208 | + } else if (!ctx_has_vsx_region) |
209 | + /* |
210 | + * With a small context structure we can't hold the VSX |
211 | + * registers, hence clear the MSR value to indicate the state |
212 | + * was not saved. |
213 | + */ |
214 | + msr &= ~MSR_VSX; |
215 | + |
216 | + |
217 | #endif /* CONFIG_VSX */ |
218 | #ifdef CONFIG_SPE |
219 | /* save spe registers */ |
220 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c |
221 | index 192b051df97e..b3b144121cc9 100644 |
222 | --- a/arch/powerpc/kernel/time.c |
223 | +++ b/arch/powerpc/kernel/time.c |
224 | @@ -213,8 +213,6 @@ static u64 scan_dispatch_log(u64 stop_tb) |
225 | if (i == be64_to_cpu(vpa->dtl_idx)) |
226 | return 0; |
227 | while (i < be64_to_cpu(vpa->dtl_idx)) { |
228 | - if (dtl_consumer) |
229 | - dtl_consumer(dtl, i); |
230 | dtb = be64_to_cpu(dtl->timebase); |
231 | tb_delta = be32_to_cpu(dtl->enqueue_to_dispatch_time) + |
232 | be32_to_cpu(dtl->ready_to_enqueue_time); |
233 | @@ -227,6 +225,8 @@ static u64 scan_dispatch_log(u64 stop_tb) |
234 | } |
235 | if (dtb > stop_tb) |
236 | break; |
237 | + if (dtl_consumer) |
238 | + dtl_consumer(dtl, i); |
239 | stolen += tb_delta; |
240 | ++i; |
241 | ++dtl; |
242 | diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c |
243 | index d38cc08b16c7..cb92d8204ec7 100644 |
244 | --- a/arch/powerpc/kernel/vio.c |
245 | +++ b/arch/powerpc/kernel/vio.c |
246 | @@ -1531,12 +1531,12 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, |
247 | |
248 | dn = dev->of_node; |
249 | if (!dn) { |
250 | - strcat(buf, "\n"); |
251 | + strcpy(buf, "\n"); |
252 | return strlen(buf); |
253 | } |
254 | cp = of_get_property(dn, "compatible", NULL); |
255 | if (!cp) { |
256 | - strcat(buf, "\n"); |
257 | + strcpy(buf, "\n"); |
258 | return strlen(buf); |
259 | } |
260 | |
261 | diff --git a/arch/powerpc/mm/gup.c b/arch/powerpc/mm/gup.c |
262 | index 6936547018b8..c5f734e20b0f 100644 |
263 | --- a/arch/powerpc/mm/gup.c |
264 | +++ b/arch/powerpc/mm/gup.c |
265 | @@ -123,6 +123,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, |
266 | struct mm_struct *mm = current->mm; |
267 | unsigned long addr, len, end; |
268 | unsigned long next; |
269 | + unsigned long flags; |
270 | pgd_t *pgdp; |
271 | int nr = 0; |
272 | |
273 | @@ -156,7 +157,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, |
274 | * So long as we atomically load page table pointers versus teardown, |
275 | * we can follow the address down to the the page and take a ref on it. |
276 | */ |
277 | - local_irq_disable(); |
278 | + local_irq_save(flags); |
279 | |
280 | pgdp = pgd_offset(mm, addr); |
281 | do { |
282 | @@ -179,7 +180,7 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, |
283 | break; |
284 | } while (pgdp++, addr = next, addr != end); |
285 | |
286 | - local_irq_enable(); |
287 | + local_irq_restore(flags); |
288 | |
289 | return nr; |
290 | } |
291 | diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c |
292 | index 3e99c149271a..7ce9cf3b6988 100644 |
293 | --- a/arch/powerpc/mm/slice.c |
294 | +++ b/arch/powerpc/mm/slice.c |
295 | @@ -258,7 +258,7 @@ static bool slice_scan_available(unsigned long addr, |
296 | slice = GET_HIGH_SLICE_INDEX(addr); |
297 | *boundary_addr = (slice + end) ? |
298 | ((slice + end) << SLICE_HIGH_SHIFT) : SLICE_LOW_TOP; |
299 | - return !!(available.high_slices & (1u << slice)); |
300 | + return !!(available.high_slices & (1ul << slice)); |
301 | } |
302 | } |
303 | |
304 | diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c |
305 | index a82a41b4fd91..1a7b1d0f41df 100644 |
306 | --- a/arch/powerpc/platforms/512x/mpc512x_shared.c |
307 | +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c |
308 | @@ -303,6 +303,9 @@ void __init mpc512x_setup_diu(void) |
309 | diu_ops.release_bootmem = mpc512x_release_bootmem; |
310 | } |
311 | |
312 | +#else |
313 | +void __init mpc512x_setup_diu(void) { /* EMPTY */ } |
314 | +void __init mpc512x_init_diu(void) { /* EMPTY */ } |
315 | #endif |
316 | |
317 | void __init mpc512x_init_IRQ(void) |
318 | diff --git a/arch/powerpc/platforms/52xx/Kconfig b/arch/powerpc/platforms/52xx/Kconfig |
319 | index 90f4496017e4..af54174801f7 100644 |
320 | --- a/arch/powerpc/platforms/52xx/Kconfig |
321 | +++ b/arch/powerpc/platforms/52xx/Kconfig |
322 | @@ -57,5 +57,5 @@ config PPC_MPC5200_BUGFIX |
323 | |
324 | config PPC_MPC5200_LPBFIFO |
325 | tristate "MPC5200 LocalPlus bus FIFO driver" |
326 | - depends on PPC_MPC52xx |
327 | + depends on PPC_MPC52xx && PPC_BESTCOMM |
328 | select PPC_BESTCOMM_GEN_BD |
329 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c |
330 | index 74a5a5773b1f..930e1fe78214 100644 |
331 | --- a/arch/powerpc/platforms/powernv/pci-ioda.c |
332 | +++ b/arch/powerpc/platforms/powernv/pci-ioda.c |
333 | @@ -153,13 +153,23 @@ static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) |
334 | rid_end = pe->rid + 1; |
335 | } |
336 | |
337 | - /* Associate PE in PELT */ |
338 | + /* |
339 | + * Associate PE in PELT. We need add the PE into the |
340 | + * corresponding PELT-V as well. Otherwise, the error |
341 | + * originated from the PE might contribute to other |
342 | + * PEs. |
343 | + */ |
344 | rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, |
345 | bcomp, dcomp, fcomp, OPAL_MAP_PE); |
346 | if (rc) { |
347 | pe_err(pe, "OPAL error %ld trying to setup PELT table\n", rc); |
348 | return -ENXIO; |
349 | } |
350 | + |
351 | + rc = opal_pci_set_peltv(phb->opal_id, pe->pe_number, |
352 | + pe->pe_number, OPAL_ADD_PE_TO_DOMAIN); |
353 | + if (rc) |
354 | + pe_warn(pe, "OPAL error %d adding self to PELTV\n", rc); |
355 | opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, |
356 | OPAL_EEH_ACTION_CLEAR_FREEZE_ALL); |
357 | |
358 | diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c |
359 | index b4dbade8ca24..2e4b5be31a1b 100644 |
360 | --- a/arch/s390/crypto/aes_s390.c |
361 | +++ b/arch/s390/crypto/aes_s390.c |
362 | @@ -35,7 +35,6 @@ static u8 *ctrblk; |
363 | static char keylen_flag; |
364 | |
365 | struct s390_aes_ctx { |
366 | - u8 iv[AES_BLOCK_SIZE]; |
367 | u8 key[AES_MAX_KEY_SIZE]; |
368 | long enc; |
369 | long dec; |
370 | @@ -441,30 +440,36 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
371 | return aes_set_key(tfm, in_key, key_len); |
372 | } |
373 | |
374 | -static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param, |
375 | +static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, |
376 | struct blkcipher_walk *walk) |
377 | { |
378 | + struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
379 | int ret = blkcipher_walk_virt(desc, walk); |
380 | unsigned int nbytes = walk->nbytes; |
381 | + struct { |
382 | + u8 iv[AES_BLOCK_SIZE]; |
383 | + u8 key[AES_MAX_KEY_SIZE]; |
384 | + } param; |
385 | |
386 | if (!nbytes) |
387 | goto out; |
388 | |
389 | - memcpy(param, walk->iv, AES_BLOCK_SIZE); |
390 | + memcpy(param.iv, walk->iv, AES_BLOCK_SIZE); |
391 | + memcpy(param.key, sctx->key, sctx->key_len); |
392 | do { |
393 | /* only use complete blocks */ |
394 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); |
395 | u8 *out = walk->dst.virt.addr; |
396 | u8 *in = walk->src.virt.addr; |
397 | |
398 | - ret = crypt_s390_kmc(func, param, out, in, n); |
399 | + ret = crypt_s390_kmc(func, ¶m, out, in, n); |
400 | if (ret < 0 || ret != n) |
401 | return -EIO; |
402 | |
403 | nbytes &= AES_BLOCK_SIZE - 1; |
404 | ret = blkcipher_walk_done(desc, walk, nbytes); |
405 | } while ((nbytes = walk->nbytes)); |
406 | - memcpy(walk->iv, param, AES_BLOCK_SIZE); |
407 | + memcpy(walk->iv, param.iv, AES_BLOCK_SIZE); |
408 | |
409 | out: |
410 | return ret; |
411 | @@ -481,7 +486,7 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, |
412 | return fallback_blk_enc(desc, dst, src, nbytes); |
413 | |
414 | blkcipher_walk_init(&walk, dst, src, nbytes); |
415 | - return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); |
416 | + return cbc_aes_crypt(desc, sctx->enc, &walk); |
417 | } |
418 | |
419 | static int cbc_aes_decrypt(struct blkcipher_desc *desc, |
420 | @@ -495,7 +500,7 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, |
421 | return fallback_blk_dec(desc, dst, src, nbytes); |
422 | |
423 | blkcipher_walk_init(&walk, dst, src, nbytes); |
424 | - return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); |
425 | + return cbc_aes_crypt(desc, sctx->dec, &walk); |
426 | } |
427 | |
428 | static struct crypto_alg cbc_aes_alg = { |
429 | diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h |
430 | index 819b94d22720..8beee1cceba4 100644 |
431 | --- a/arch/s390/include/asm/timex.h |
432 | +++ b/arch/s390/include/asm/timex.h |
433 | @@ -71,9 +71,11 @@ static inline void local_tick_enable(unsigned long long comp) |
434 | |
435 | typedef unsigned long long cycles_t; |
436 | |
437 | -static inline void get_tod_clock_ext(char *clk) |
438 | +static inline void get_tod_clock_ext(char clk[16]) |
439 | { |
440 | - asm volatile("stcke %0" : "=Q" (*clk) : : "cc"); |
441 | + typedef struct { char _[sizeof(clk)]; } addrtype; |
442 | + |
443 | + asm volatile("stcke %0" : "=Q" (*(addrtype *) clk) : : "cc"); |
444 | } |
445 | |
446 | static inline unsigned long long get_tod_clock(void) |
447 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c |
448 | index 1a4313a1b60f..93439cd04406 100644 |
449 | --- a/arch/s390/kernel/smp.c |
450 | +++ b/arch/s390/kernel/smp.c |
451 | @@ -929,7 +929,7 @@ static ssize_t show_idle_count(struct device *dev, |
452 | idle_count = ACCESS_ONCE(idle->idle_count); |
453 | if (ACCESS_ONCE(idle->clock_idle_enter)) |
454 | idle_count++; |
455 | - } while ((sequence & 1) || (idle->sequence != sequence)); |
456 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); |
457 | return sprintf(buf, "%llu\n", idle_count); |
458 | } |
459 | static DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL); |
460 | @@ -947,7 +947,7 @@ static ssize_t show_idle_time(struct device *dev, |
461 | idle_time = ACCESS_ONCE(idle->idle_time); |
462 | idle_enter = ACCESS_ONCE(idle->clock_idle_enter); |
463 | idle_exit = ACCESS_ONCE(idle->clock_idle_exit); |
464 | - } while ((sequence & 1) || (idle->sequence != sequence)); |
465 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); |
466 | idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0; |
467 | return sprintf(buf, "%llu\n", idle_time >> 12); |
468 | } |
469 | diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c |
470 | index abcfab55f99b..bb06a76040bf 100644 |
471 | --- a/arch/s390/kernel/vtime.c |
472 | +++ b/arch/s390/kernel/vtime.c |
473 | @@ -191,7 +191,7 @@ cputime64_t s390_get_idle_time(int cpu) |
474 | sequence = ACCESS_ONCE(idle->sequence); |
475 | idle_enter = ACCESS_ONCE(idle->clock_idle_enter); |
476 | idle_exit = ACCESS_ONCE(idle->clock_idle_exit); |
477 | - } while ((sequence & 1) || (idle->sequence != sequence)); |
478 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); |
479 | return idle_enter ? ((idle_exit ?: now) - idle_enter) : 0; |
480 | } |
481 | |
482 | diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c |
483 | index e0e0841eef45..18677a90d6a3 100644 |
484 | --- a/arch/x86/kernel/crash.c |
485 | +++ b/arch/x86/kernel/crash.c |
486 | @@ -127,12 +127,12 @@ void native_machine_crash_shutdown(struct pt_regs *regs) |
487 | cpu_emergency_vmxoff(); |
488 | cpu_emergency_svm_disable(); |
489 | |
490 | - lapic_shutdown(); |
491 | #ifdef CONFIG_X86_IO_APIC |
492 | /* Prevent crash_kexec() from deadlocking on ioapic_lock. */ |
493 | ioapic_zap_locks(); |
494 | disable_IO_APIC(); |
495 | #endif |
496 | + lapic_shutdown(); |
497 | #ifdef CONFIG_HPET_TIMER |
498 | hpet_disable(); |
499 | #endif |
500 | diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c |
501 | index 42a392a9fd02..d4bdd253fea7 100644 |
502 | --- a/arch/x86/kernel/ftrace.c |
503 | +++ b/arch/x86/kernel/ftrace.c |
504 | @@ -248,6 +248,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func) |
505 | return ret; |
506 | } |
507 | |
508 | +static int is_ftrace_caller(unsigned long ip) |
509 | +{ |
510 | + if (ip == (unsigned long)(&ftrace_call) || |
511 | + ip == (unsigned long)(&ftrace_regs_call)) |
512 | + return 1; |
513 | + |
514 | + return 0; |
515 | +} |
516 | + |
517 | /* |
518 | * A breakpoint was added to the code address we are about to |
519 | * modify, and this is the handle that will just skip over it. |
520 | @@ -257,10 +266,13 @@ int ftrace_update_ftrace_func(ftrace_func_t func) |
521 | */ |
522 | int ftrace_int3_handler(struct pt_regs *regs) |
523 | { |
524 | + unsigned long ip; |
525 | + |
526 | if (WARN_ON_ONCE(!regs)) |
527 | return 0; |
528 | |
529 | - if (!ftrace_location(regs->ip - 1)) |
530 | + ip = regs->ip - 1; |
531 | + if (!ftrace_location(ip) && !is_ftrace_caller(ip)) |
532 | return 0; |
533 | |
534 | regs->ip += MCOUNT_INSN_SIZE - 1; |
535 | diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c |
536 | index af99f71aeb7f..c3d4cc972eca 100644 |
537 | --- a/arch/x86/kernel/microcode_amd.c |
538 | +++ b/arch/x86/kernel/microcode_amd.c |
539 | @@ -431,7 +431,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, |
540 | snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); |
541 | |
542 | if (request_firmware(&fw, (const char *)fw_name, device)) { |
543 | - pr_err("failed to load file %s\n", fw_name); |
544 | + pr_debug("failed to load file %s\n", fw_name); |
545 | goto out; |
546 | } |
547 | |
548 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c |
549 | index c83516be1052..3fb8d95ab8b5 100644 |
550 | --- a/arch/x86/kernel/process.c |
551 | +++ b/arch/x86/kernel/process.c |
552 | @@ -391,9 +391,9 @@ static void amd_e400_idle(void) |
553 | * The switch back from broadcast mode needs to be |
554 | * called with interrupts disabled. |
555 | */ |
556 | - local_irq_disable(); |
557 | - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); |
558 | - local_irq_enable(); |
559 | + local_irq_disable(); |
560 | + clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); |
561 | + local_irq_enable(); |
562 | } else |
563 | default_idle(); |
564 | } |
565 | diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c |
566 | index 7e920bff99a3..618ce264b237 100644 |
567 | --- a/arch/x86/kernel/reboot.c |
568 | +++ b/arch/x86/kernel/reboot.c |
569 | @@ -550,6 +550,10 @@ static void native_machine_emergency_restart(void) |
570 | void native_machine_shutdown(void) |
571 | { |
572 | /* Stop the cpus and apics */ |
573 | +#ifdef CONFIG_X86_IO_APIC |
574 | + disable_IO_APIC(); |
575 | +#endif |
576 | + |
577 | #ifdef CONFIG_SMP |
578 | /* |
579 | * Stop all of the others. Also disable the local irq to |
580 | @@ -562,10 +566,6 @@ void native_machine_shutdown(void) |
581 | |
582 | lapic_shutdown(); |
583 | |
584 | -#ifdef CONFIG_X86_IO_APIC |
585 | - disable_IO_APIC(); |
586 | -#endif |
587 | - |
588 | #ifdef CONFIG_HPET_TIMER |
589 | hpet_disable(); |
590 | #endif |
591 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
592 | index ddc3f3d2afdb..92e6f4a8ba0e 100644 |
593 | --- a/arch/x86/kvm/emulate.c |
594 | +++ b/arch/x86/kvm/emulate.c |
595 | @@ -4040,7 +4040,10 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op, |
596 | case OpMem8: |
597 | ctxt->memop.bytes = 1; |
598 | if (ctxt->memop.type == OP_REG) { |
599 | - ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, 1); |
600 | + int highbyte_regs = ctxt->rex_prefix == 0; |
601 | + |
602 | + ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, |
603 | + highbyte_regs); |
604 | fetch_register_operand(&ctxt->memop); |
605 | } |
606 | goto mem_common; |
607 | diff --git a/block/blk-core.c b/block/blk-core.c |
608 | index 0a00e4ecf87c..5e00b5a58f6a 100644 |
609 | --- a/block/blk-core.c |
610 | +++ b/block/blk-core.c |
611 | @@ -2227,6 +2227,7 @@ void blk_start_request(struct request *req) |
612 | if (unlikely(blk_bidi_rq(req))) |
613 | req->next_rq->resid_len = blk_rq_bytes(req->next_rq); |
614 | |
615 | + BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); |
616 | blk_add_timer(req); |
617 | } |
618 | EXPORT_SYMBOL(blk_start_request); |
619 | diff --git a/block/blk-settings.c b/block/blk-settings.c |
620 | index c50ecf0ea3b1..53309333c2f0 100644 |
621 | --- a/block/blk-settings.c |
622 | +++ b/block/blk-settings.c |
623 | @@ -144,6 +144,7 @@ void blk_set_stacking_limits(struct queue_limits *lim) |
624 | lim->discard_zeroes_data = 1; |
625 | lim->max_segments = USHRT_MAX; |
626 | lim->max_hw_sectors = UINT_MAX; |
627 | + lim->max_segment_size = UINT_MAX; |
628 | lim->max_sectors = UINT_MAX; |
629 | lim->max_write_same_sectors = UINT_MAX; |
630 | } |
631 | diff --git a/block/blk-timeout.c b/block/blk-timeout.c |
632 | index 65f103563969..655ba909cd6a 100644 |
633 | --- a/block/blk-timeout.c |
634 | +++ b/block/blk-timeout.c |
635 | @@ -91,8 +91,8 @@ static void blk_rq_timed_out(struct request *req) |
636 | __blk_complete_request(req); |
637 | break; |
638 | case BLK_EH_RESET_TIMER: |
639 | - blk_clear_rq_complete(req); |
640 | blk_add_timer(req); |
641 | + blk_clear_rq_complete(req); |
642 | break; |
643 | case BLK_EH_NOT_HANDLED: |
644 | /* |
645 | @@ -174,7 +174,6 @@ void blk_add_timer(struct request *req) |
646 | return; |
647 | |
648 | BUG_ON(!list_empty(&req->timeout_list)); |
649 | - BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); |
650 | |
651 | /* |
652 | * Some LLDs, like scsi, peek at the timeout to prevent a |
653 | diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c |
654 | index c0bb3778f1ae..666f1962a160 100644 |
655 | --- a/crypto/ansi_cprng.c |
656 | +++ b/crypto/ansi_cprng.c |
657 | @@ -230,11 +230,11 @@ remainder: |
658 | */ |
659 | if (byte_count < DEFAULT_BLK_SZ) { |
660 | empty_rbuf: |
661 | - for (; ctx->rand_data_valid < DEFAULT_BLK_SZ; |
662 | - ctx->rand_data_valid++) { |
663 | + while (ctx->rand_data_valid < DEFAULT_BLK_SZ) { |
664 | *ptr = ctx->rand_data[ctx->rand_data_valid]; |
665 | ptr++; |
666 | byte_count--; |
667 | + ctx->rand_data_valid++; |
668 | if (byte_count == 0) |
669 | goto done; |
670 | } |
671 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
672 | index a06d98374705..15986f32009e 100644 |
673 | --- a/drivers/acpi/ec.c |
674 | +++ b/drivers/acpi/ec.c |
675 | @@ -175,9 +175,10 @@ static void start_transaction(struct acpi_ec *ec) |
676 | static void advance_transaction(struct acpi_ec *ec, u8 status) |
677 | { |
678 | unsigned long flags; |
679 | - struct transaction *t = ec->curr; |
680 | + struct transaction *t; |
681 | |
682 | spin_lock_irqsave(&ec->lock, flags); |
683 | + t = ec->curr; |
684 | if (!t) |
685 | goto unlock; |
686 | if (t->wlen > t->wi) { |
687 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c |
688 | index d3874f425653..d7e53ea53d6c 100644 |
689 | --- a/drivers/acpi/pci_root.c |
690 | +++ b/drivers/acpi/pci_root.c |
691 | @@ -608,9 +608,12 @@ static void handle_root_bridge_removal(struct acpi_device *device) |
692 | ej_event->device = device; |
693 | ej_event->event = ACPI_NOTIFY_EJECT_REQUEST; |
694 | |
695 | + get_device(&device->dev); |
696 | status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event); |
697 | - if (ACPI_FAILURE(status)) |
698 | + if (ACPI_FAILURE(status)) { |
699 | + put_device(&device->dev); |
700 | kfree(ej_event); |
701 | + } |
702 | } |
703 | |
704 | static void _handle_hotplug_event_root(struct work_struct *work) |
705 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c |
706 | index f98dd00b51a9..c7414a545a4f 100644 |
707 | --- a/drivers/acpi/processor_idle.c |
708 | +++ b/drivers/acpi/processor_idle.c |
709 | @@ -119,17 +119,10 @@ static struct dmi_system_id processor_power_dmi_table[] = { |
710 | */ |
711 | static void acpi_safe_halt(void) |
712 | { |
713 | - current_thread_info()->status &= ~TS_POLLING; |
714 | - /* |
715 | - * TS_POLLING-cleared state must be visible before we |
716 | - * test NEED_RESCHED: |
717 | - */ |
718 | - smp_mb(); |
719 | - if (!need_resched()) { |
720 | + if (!tif_need_resched()) { |
721 | safe_halt(); |
722 | local_irq_disable(); |
723 | } |
724 | - current_thread_info()->status |= TS_POLLING; |
725 | } |
726 | |
727 | #ifdef ARCH_APICTIMER_STOPS_ON_C3 |
728 | @@ -737,6 +730,11 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev, |
729 | if (unlikely(!pr)) |
730 | return -EINVAL; |
731 | |
732 | + if (cx->entry_method == ACPI_CSTATE_FFH) { |
733 | + if (current_set_polling_and_test()) |
734 | + return -EINVAL; |
735 | + } |
736 | + |
737 | lapic_timer_state_broadcast(pr, cx, 1); |
738 | acpi_idle_do_entry(cx); |
739 | |
740 | @@ -790,18 +788,9 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, |
741 | if (unlikely(!pr)) |
742 | return -EINVAL; |
743 | |
744 | - if (cx->entry_method != ACPI_CSTATE_FFH) { |
745 | - current_thread_info()->status &= ~TS_POLLING; |
746 | - /* |
747 | - * TS_POLLING-cleared state must be visible before we test |
748 | - * NEED_RESCHED: |
749 | - */ |
750 | - smp_mb(); |
751 | - |
752 | - if (unlikely(need_resched())) { |
753 | - current_thread_info()->status |= TS_POLLING; |
754 | + if (cx->entry_method == ACPI_CSTATE_FFH) { |
755 | + if (current_set_polling_and_test()) |
756 | return -EINVAL; |
757 | - } |
758 | } |
759 | |
760 | /* |
761 | @@ -819,9 +808,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, |
762 | |
763 | sched_clock_idle_wakeup_event(0); |
764 | |
765 | - if (cx->entry_method != ACPI_CSTATE_FFH) |
766 | - current_thread_info()->status |= TS_POLLING; |
767 | - |
768 | lapic_timer_state_broadcast(pr, cx, 0); |
769 | return index; |
770 | } |
771 | @@ -858,18 +844,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, |
772 | } |
773 | } |
774 | |
775 | - if (cx->entry_method != ACPI_CSTATE_FFH) { |
776 | - current_thread_info()->status &= ~TS_POLLING; |
777 | - /* |
778 | - * TS_POLLING-cleared state must be visible before we test |
779 | - * NEED_RESCHED: |
780 | - */ |
781 | - smp_mb(); |
782 | - |
783 | - if (unlikely(need_resched())) { |
784 | - current_thread_info()->status |= TS_POLLING; |
785 | + if (cx->entry_method == ACPI_CSTATE_FFH) { |
786 | + if (current_set_polling_and_test()) |
787 | return -EINVAL; |
788 | - } |
789 | } |
790 | |
791 | acpi_unlazy_tlb(smp_processor_id()); |
792 | @@ -915,9 +892,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, |
793 | |
794 | sched_clock_idle_wakeup_event(0); |
795 | |
796 | - if (cx->entry_method != ACPI_CSTATE_FFH) |
797 | - current_thread_info()->status |= TS_POLLING; |
798 | - |
799 | lapic_timer_state_broadcast(pr, cx, 0); |
800 | return index; |
801 | } |
802 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
803 | index fee8a297c7d9..3601738ef6f4 100644 |
804 | --- a/drivers/acpi/scan.c |
805 | +++ b/drivers/acpi/scan.c |
806 | @@ -331,8 +331,6 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) |
807 | goto out; |
808 | } |
809 | } |
810 | - acpi_evaluate_hotplug_ost(handle, ost_source, |
811 | - ACPI_OST_SC_INSERT_IN_PROGRESS, NULL); |
812 | error = acpi_bus_scan(handle); |
813 | if (error) { |
814 | acpi_handle_warn(handle, "Namespace scan failure\n"); |
815 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
816 | index aebcf6355df4..f193285968f8 100644 |
817 | --- a/drivers/acpi/video.c |
818 | +++ b/drivers/acpi/video.c |
819 | @@ -832,7 +832,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) |
820 | for (i = 2; i < br->count; i++) |
821 | if (level_old == br->levels[i]) |
822 | break; |
823 | - if (i == br->count) |
824 | + if (i == br->count || !level) |
825 | level = max_level; |
826 | } |
827 | |
828 | diff --git a/drivers/block/brd.c b/drivers/block/brd.c |
829 | index 9bf4371755f2..d91f1a56e861 100644 |
830 | --- a/drivers/block/brd.c |
831 | +++ b/drivers/block/brd.c |
832 | @@ -545,7 +545,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data) |
833 | |
834 | mutex_lock(&brd_devices_mutex); |
835 | brd = brd_init_one(MINOR(dev) >> part_shift); |
836 | - kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM); |
837 | + kobj = brd ? get_disk(brd->brd_disk) : NULL; |
838 | mutex_unlock(&brd_devices_mutex); |
839 | |
840 | *part = 0; |
841 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c |
842 | index 40e715531aa6..2f036ca4b6ee 100644 |
843 | --- a/drivers/block/loop.c |
844 | +++ b/drivers/block/loop.c |
845 | @@ -1741,7 +1741,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data) |
846 | if (err < 0) |
847 | err = loop_add(&lo, MINOR(dev) >> part_shift); |
848 | if (err < 0) |
849 | - kobj = ERR_PTR(err); |
850 | + kobj = NULL; |
851 | else |
852 | kobj = get_disk(lo->lo_disk); |
853 | mutex_unlock(&loop_index_mutex); |
854 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
855 | index f3dfc0a88fdc..d593c99121c3 100644 |
856 | --- a/drivers/bluetooth/btusb.c |
857 | +++ b/drivers/bluetooth/btusb.c |
858 | @@ -1628,7 +1628,6 @@ static struct usb_driver btusb_driver = { |
859 | #ifdef CONFIG_PM |
860 | .suspend = btusb_suspend, |
861 | .resume = btusb_resume, |
862 | - .reset_resume = btusb_resume, |
863 | #endif |
864 | .id_table = btusb_table, |
865 | .supports_autosuspend = 1, |
866 | diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc1.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc1.c |
867 | index e5be3ee7f172..71b4283f7fad 100644 |
868 | --- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc1.c |
869 | +++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc1.c |
870 | @@ -587,6 +587,7 @@ nvc1_grctx_init_unk58xx[] = { |
871 | { 0x405870, 4, 0x04, 0x00000001 }, |
872 | { 0x405a00, 2, 0x04, 0x00000000 }, |
873 | { 0x405a18, 1, 0x04, 0x00000000 }, |
874 | + {} |
875 | }; |
876 | |
877 | static struct nvc0_graph_init |
878 | @@ -598,6 +599,7 @@ nvc1_grctx_init_rop[] = { |
879 | { 0x408904, 1, 0x04, 0x62000001 }, |
880 | { 0x408908, 1, 0x04, 0x00c80929 }, |
881 | { 0x408980, 1, 0x04, 0x0000011d }, |
882 | + {} |
883 | }; |
884 | |
885 | static struct nvc0_graph_init |
886 | @@ -671,6 +673,7 @@ nvc1_grctx_init_gpc_0[] = { |
887 | { 0x419000, 1, 0x04, 0x00000780 }, |
888 | { 0x419004, 2, 0x04, 0x00000000 }, |
889 | { 0x419014, 1, 0x04, 0x00000004 }, |
890 | + {} |
891 | }; |
892 | |
893 | static struct nvc0_graph_init |
894 | @@ -717,6 +720,7 @@ nvc1_grctx_init_tpc[] = { |
895 | { 0x419e98, 1, 0x04, 0x00000000 }, |
896 | { 0x419ee0, 1, 0x04, 0x00011110 }, |
897 | { 0x419f30, 11, 0x04, 0x00000000 }, |
898 | + {} |
899 | }; |
900 | |
901 | void |
902 | diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd7.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd7.c |
903 | index 438e78410808..c4740d528532 100644 |
904 | --- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd7.c |
905 | +++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd7.c |
906 | @@ -258,6 +258,7 @@ nvd7_grctx_init_hub[] = { |
907 | nvc0_grctx_init_unk78xx, |
908 | nvc0_grctx_init_unk80xx, |
909 | nvd9_grctx_init_rop, |
910 | + NULL |
911 | }; |
912 | |
913 | struct nvc0_graph_init * |
914 | diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd9.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd9.c |
915 | index 818a4751df46..a1102cbf2fdc 100644 |
916 | --- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd9.c |
917 | +++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd9.c |
918 | @@ -466,6 +466,7 @@ nvd9_grctx_init_hub[] = { |
919 | nvc0_grctx_init_unk78xx, |
920 | nvc0_grctx_init_unk80xx, |
921 | nvd9_grctx_init_rop, |
922 | + NULL |
923 | }; |
924 | |
925 | struct nvc0_graph_init * |
926 | diff --git a/drivers/gpu/drm/shmobile/Kconfig b/drivers/gpu/drm/shmobile/Kconfig |
927 | index ca498d151a76..5240690b96c3 100644 |
928 | --- a/drivers/gpu/drm/shmobile/Kconfig |
929 | +++ b/drivers/gpu/drm/shmobile/Kconfig |
930 | @@ -1,6 +1,7 @@ |
931 | config DRM_SHMOBILE |
932 | tristate "DRM Support for SH Mobile" |
933 | depends on DRM && (ARM || SUPERH) |
934 | + select BACKLIGHT_CLASS_DEVICE |
935 | select DRM_KMS_HELPER |
936 | select DRM_KMS_CMA_HELPER |
937 | select DRM_GEM_CMA_HELPER |
938 | diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c |
939 | index bbff5f200bef..fa920469bf10 100644 |
940 | --- a/drivers/hv/channel_mgmt.c |
941 | +++ b/drivers/hv/channel_mgmt.c |
942 | @@ -203,7 +203,8 @@ static void vmbus_process_rescind_offer(struct work_struct *work) |
943 | struct vmbus_channel *primary_channel; |
944 | struct vmbus_channel_relid_released msg; |
945 | |
946 | - vmbus_device_unregister(channel->device_obj); |
947 | + if (channel->device_obj) |
948 | + vmbus_device_unregister(channel->device_obj); |
949 | memset(&msg, 0, sizeof(struct vmbus_channel_relid_released)); |
950 | msg.child_relid = channel->offermsg.child_relid; |
951 | msg.header.msgtype = CHANNELMSG_RELID_RELEASED; |
952 | @@ -216,7 +217,7 @@ static void vmbus_process_rescind_offer(struct work_struct *work) |
953 | } else { |
954 | primary_channel = channel->primary_channel; |
955 | spin_lock_irqsave(&primary_channel->sc_lock, flags); |
956 | - list_del(&channel->listentry); |
957 | + list_del(&channel->sc_list); |
958 | spin_unlock_irqrestore(&primary_channel->sc_lock, flags); |
959 | } |
960 | free_channel(channel); |
961 | diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c |
962 | index cdff74282955..14e36c114d61 100644 |
963 | --- a/drivers/hwmon/lm90.c |
964 | +++ b/drivers/hwmon/lm90.c |
965 | @@ -278,7 +278,7 @@ static const struct lm90_params lm90_params[] = { |
966 | [max6696] = { |
967 | .flags = LM90_HAVE_EMERGENCY |
968 | | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3, |
969 | - .alert_alarms = 0x187c, |
970 | + .alert_alarms = 0x1c7c, |
971 | .max_convrate = 6, |
972 | .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, |
973 | }, |
974 | @@ -1500,19 +1500,22 @@ static void lm90_alert(struct i2c_client *client, unsigned int flag) |
975 | if ((alarms & 0x7f) == 0 && (alarms2 & 0xfe) == 0) { |
976 | dev_info(&client->dev, "Everything OK\n"); |
977 | } else { |
978 | - if (alarms & 0x61) |
979 | + if ((alarms & 0x61) || (alarms2 & 0x80)) |
980 | dev_warn(&client->dev, |
981 | "temp%d out of range, please check!\n", 1); |
982 | - if (alarms & 0x1a) |
983 | + if ((alarms & 0x1a) || (alarms2 & 0x20)) |
984 | dev_warn(&client->dev, |
985 | "temp%d out of range, please check!\n", 2); |
986 | if (alarms & 0x04) |
987 | dev_warn(&client->dev, |
988 | "temp%d diode open, please check!\n", 2); |
989 | |
990 | - if (alarms2 & 0x18) |
991 | + if (alarms2 & 0x5a) |
992 | dev_warn(&client->dev, |
993 | "temp%d out of range, please check!\n", 3); |
994 | + if (alarms2 & 0x04) |
995 | + dev_warn(&client->dev, |
996 | + "temp%d diode open, please check!\n", 3); |
997 | |
998 | /* |
999 | * Disable ALERT# output, because these chips don't implement |
1000 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c |
1001 | index fa6964d8681a..f116d664b473 100644 |
1002 | --- a/drivers/idle/intel_idle.c |
1003 | +++ b/drivers/idle/intel_idle.c |
1004 | @@ -359,7 +359,7 @@ static int intel_idle(struct cpuidle_device *dev, |
1005 | if (!(lapic_timer_reliable_states & (1 << (cstate)))) |
1006 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); |
1007 | |
1008 | - if (!need_resched()) { |
1009 | + if (!current_set_polling_and_test()) { |
1010 | |
1011 | __monitor((void *)¤t_thread_info()->flags, 0, 0); |
1012 | smp_mb(); |
1013 | diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c |
1014 | index 08e70232062f..9188ef5d677e 100644 |
1015 | --- a/drivers/memstick/core/ms_block.c |
1016 | +++ b/drivers/memstick/core/ms_block.c |
1017 | @@ -401,7 +401,7 @@ again: |
1018 | sizeof(struct ms_status_register))) |
1019 | return 0; |
1020 | |
1021 | - msb->state = MSB_RP_RECEIVE_OOB_READ; |
1022 | + msb->state = MSB_RP_RECIVE_STATUS_REG; |
1023 | return 0; |
1024 | |
1025 | case MSB_RP_RECIVE_STATUS_REG: |
1026 | diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c |
1027 | index 2fc0586ce3bb..9cbd0370ca44 100644 |
1028 | --- a/drivers/misc/lkdtm.c |
1029 | +++ b/drivers/misc/lkdtm.c |
1030 | @@ -297,6 +297,14 @@ static void do_nothing(void) |
1031 | return; |
1032 | } |
1033 | |
1034 | +static noinline void corrupt_stack(void) |
1035 | +{ |
1036 | + /* Use default char array length that triggers stack protection. */ |
1037 | + char data[8]; |
1038 | + |
1039 | + memset((void *)data, 0, 64); |
1040 | +} |
1041 | + |
1042 | static void execute_location(void *dst) |
1043 | { |
1044 | void (*func)(void) = dst; |
1045 | @@ -327,13 +335,9 @@ static void lkdtm_do_action(enum ctype which) |
1046 | case CT_OVERFLOW: |
1047 | (void) recursive_loop(0); |
1048 | break; |
1049 | - case CT_CORRUPT_STACK: { |
1050 | - /* Make sure the compiler creates and uses an 8 char array. */ |
1051 | - volatile char data[8]; |
1052 | - |
1053 | - memset((void *)data, 0, 64); |
1054 | + case CT_CORRUPT_STACK: |
1055 | + corrupt_stack(); |
1056 | break; |
1057 | - } |
1058 | case CT_UNALIGNED_LOAD_STORE_WRITE: { |
1059 | static u8 data[5] __attribute__((aligned(4))) = {1, 2, |
1060 | 3, 4, 5}; |
1061 | diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c |
1062 | index d0c6907dfd92..994ca4aff1a3 100644 |
1063 | --- a/drivers/misc/mei/nfc.c |
1064 | +++ b/drivers/misc/mei/nfc.c |
1065 | @@ -485,8 +485,11 @@ int mei_nfc_host_init(struct mei_device *dev) |
1066 | if (ndev->cl_info) |
1067 | return 0; |
1068 | |
1069 | - cl_info = mei_cl_allocate(dev); |
1070 | - cl = mei_cl_allocate(dev); |
1071 | + ndev->cl_info = mei_cl_allocate(dev); |
1072 | + ndev->cl = mei_cl_allocate(dev); |
1073 | + |
1074 | + cl = ndev->cl; |
1075 | + cl_info = ndev->cl_info; |
1076 | |
1077 | if (!cl || !cl_info) { |
1078 | ret = -ENOMEM; |
1079 | @@ -527,10 +530,9 @@ int mei_nfc_host_init(struct mei_device *dev) |
1080 | |
1081 | cl->device_uuid = mei_nfc_guid; |
1082 | |
1083 | + |
1084 | list_add_tail(&cl->device_link, &dev->device_list); |
1085 | |
1086 | - ndev->cl_info = cl_info; |
1087 | - ndev->cl = cl; |
1088 | ndev->req_id = 1; |
1089 | |
1090 | INIT_WORK(&ndev->init_work, mei_nfc_init); |
1091 | diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c |
1092 | index a668cd491cb3..e3fc07cf2f62 100644 |
1093 | --- a/drivers/net/can/c_can/c_can.c |
1094 | +++ b/drivers/net/can/c_can/c_can.c |
1095 | @@ -814,9 +814,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) |
1096 | msg_ctrl_save = priv->read_reg(priv, |
1097 | C_CAN_IFACE(MSGCTRL_REG, 0)); |
1098 | |
1099 | - if (msg_ctrl_save & IF_MCONT_EOB) |
1100 | - return num_rx_pkts; |
1101 | - |
1102 | if (msg_ctrl_save & IF_MCONT_MSGLST) { |
1103 | c_can_handle_lost_msg_obj(dev, 0, msg_obj); |
1104 | num_rx_pkts++; |
1105 | @@ -824,6 +821,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) |
1106 | continue; |
1107 | } |
1108 | |
1109 | + if (msg_ctrl_save & IF_MCONT_EOB) |
1110 | + return num_rx_pkts; |
1111 | + |
1112 | if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) |
1113 | continue; |
1114 | |
1115 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c |
1116 | index 3b9546588240..4b2d5ed62b11 100644 |
1117 | --- a/drivers/net/can/usb/kvaser_usb.c |
1118 | +++ b/drivers/net/can/usb/kvaser_usb.c |
1119 | @@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf, |
1120 | return 0; |
1121 | } |
1122 | |
1123 | -static void kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1124 | - struct usb_endpoint_descriptor **in, |
1125 | - struct usb_endpoint_descriptor **out) |
1126 | +static int kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1127 | + struct usb_endpoint_descriptor **in, |
1128 | + struct usb_endpoint_descriptor **out) |
1129 | { |
1130 | const struct usb_host_interface *iface_desc; |
1131 | struct usb_endpoint_descriptor *endpoint; |
1132 | @@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf, |
1133 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
1134 | endpoint = &iface_desc->endpoint[i].desc; |
1135 | |
1136 | - if (usb_endpoint_is_bulk_in(endpoint)) |
1137 | + if (!*in && usb_endpoint_is_bulk_in(endpoint)) |
1138 | *in = endpoint; |
1139 | |
1140 | - if (usb_endpoint_is_bulk_out(endpoint)) |
1141 | + if (!*out && usb_endpoint_is_bulk_out(endpoint)) |
1142 | *out = endpoint; |
1143 | + |
1144 | + /* use first bulk endpoint for in and out */ |
1145 | + if (*in && *out) |
1146 | + return 0; |
1147 | } |
1148 | + |
1149 | + return -ENODEV; |
1150 | } |
1151 | |
1152 | static int kvaser_usb_probe(struct usb_interface *intf, |
1153 | @@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf, |
1154 | if (!dev) |
1155 | return -ENOMEM; |
1156 | |
1157 | - kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
1158 | - if (!dev->bulk_in || !dev->bulk_out) { |
1159 | + err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); |
1160 | + if (err) { |
1161 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); |
1162 | return err; |
1163 | } |
1164 | diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c |
1165 | index fc95b235e210..6305a5d29db2 100644 |
1166 | --- a/drivers/net/ethernet/atheros/alx/main.c |
1167 | +++ b/drivers/net/ethernet/atheros/alx/main.c |
1168 | @@ -1389,6 +1389,9 @@ static int alx_resume(struct device *dev) |
1169 | { |
1170 | struct pci_dev *pdev = to_pci_dev(dev); |
1171 | struct alx_priv *alx = pci_get_drvdata(pdev); |
1172 | + struct alx_hw *hw = &alx->hw; |
1173 | + |
1174 | + alx_reset_phy(hw); |
1175 | |
1176 | if (!netif_running(alx->dev)) |
1177 | return 0; |
1178 | diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c |
1179 | index 668dd27616a0..cc6a0a586f0b 100644 |
1180 | --- a/drivers/net/wireless/libertas/debugfs.c |
1181 | +++ b/drivers/net/wireless/libertas/debugfs.c |
1182 | @@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, |
1183 | char *p2; |
1184 | struct debug_data *d = f->private_data; |
1185 | |
1186 | - pdata = kmalloc(cnt, GFP_KERNEL); |
1187 | + if (cnt == 0) |
1188 | + return 0; |
1189 | + |
1190 | + pdata = kmalloc(cnt + 1, GFP_KERNEL); |
1191 | if (pdata == NULL) |
1192 | return 0; |
1193 | |
1194 | @@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, |
1195 | kfree(pdata); |
1196 | return 0; |
1197 | } |
1198 | + pdata[cnt] = '\0'; |
1199 | |
1200 | p0 = pdata; |
1201 | for (i = 0; i < num_of_items; i++) { |
1202 | diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c |
1203 | index 88ce656f96cd..14007870302b 100644 |
1204 | --- a/drivers/net/wireless/rt2x00/rt2800lib.c |
1205 | +++ b/drivers/net/wireless/rt2x00/rt2800lib.c |
1206 | @@ -4461,10 +4461,13 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual, |
1207 | |
1208 | vgc = rt2800_get_default_vgc(rt2x00dev); |
1209 | |
1210 | - if (rt2x00_rt(rt2x00dev, RT5592) && qual->rssi > -65) |
1211 | - vgc += 0x20; |
1212 | - else if (qual->rssi > -80) |
1213 | - vgc += 0x10; |
1214 | + if (rt2x00_rt(rt2x00dev, RT5592)) { |
1215 | + if (qual->rssi > -65) |
1216 | + vgc += 0x20; |
1217 | + } else { |
1218 | + if (qual->rssi > -80) |
1219 | + vgc += 0x10; |
1220 | + } |
1221 | |
1222 | rt2800_set_vgc(rt2x00dev, qual, vgc); |
1223 | } |
1224 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c |
1225 | index 96961b9a395c..4feb35aef990 100644 |
1226 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c |
1227 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c |
1228 | @@ -148,6 +148,8 @@ static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev) |
1229 | return false; |
1230 | } |
1231 | |
1232 | +#define TXSTATUS_READ_INTERVAL 1000000 |
1233 | + |
1234 | static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, |
1235 | int urb_status, u32 tx_status) |
1236 | { |
1237 | @@ -176,8 +178,9 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, |
1238 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); |
1239 | |
1240 | if (rt2800usb_txstatus_pending(rt2x00dev)) { |
1241 | - /* Read register after 250 us */ |
1242 | - hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000), |
1243 | + /* Read register after 1 ms */ |
1244 | + hrtimer_start(&rt2x00dev->txstatus_timer, |
1245 | + ktime_set(0, TXSTATUS_READ_INTERVAL), |
1246 | HRTIMER_MODE_REL); |
1247 | return false; |
1248 | } |
1249 | @@ -202,8 +205,9 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev) |
1250 | if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) |
1251 | return; |
1252 | |
1253 | - /* Read TX_STA_FIFO register after 500 us */ |
1254 | - hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000), |
1255 | + /* Read TX_STA_FIFO register after 2 ms */ |
1256 | + hrtimer_start(&rt2x00dev->txstatus_timer, |
1257 | + ktime_set(0, 2*TXSTATUS_READ_INTERVAL), |
1258 | HRTIMER_MODE_REL); |
1259 | } |
1260 | |
1261 | diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c |
1262 | index 712eea9d398f..f12e909cbb48 100644 |
1263 | --- a/drivers/net/wireless/rt2x00/rt2x00dev.c |
1264 | +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c |
1265 | @@ -181,6 +181,7 @@ static void rt2x00lib_autowakeup(struct work_struct *work) |
1266 | static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac, |
1267 | struct ieee80211_vif *vif) |
1268 | { |
1269 | + struct ieee80211_tx_control control = {}; |
1270 | struct rt2x00_dev *rt2x00dev = data; |
1271 | struct sk_buff *skb; |
1272 | |
1273 | @@ -195,7 +196,7 @@ static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac, |
1274 | */ |
1275 | skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif); |
1276 | while (skb) { |
1277 | - rt2x00mac_tx(rt2x00dev->hw, NULL, skb); |
1278 | + rt2x00mac_tx(rt2x00dev->hw, &control, skb); |
1279 | skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif); |
1280 | } |
1281 | } |
1282 | diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h |
1283 | index a0935987fa3a..7f40ab8e1bd8 100644 |
1284 | --- a/drivers/net/wireless/rt2x00/rt2x00lib.h |
1285 | +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h |
1286 | @@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length); |
1287 | * @local: frame is not from mac80211 |
1288 | */ |
1289 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
1290 | - bool local); |
1291 | + struct ieee80211_sta *sta, bool local); |
1292 | |
1293 | /** |
1294 | * rt2x00queue_update_beacon - Send new beacon from mac80211 |
1295 | diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c |
1296 | index f883802f3505..f8cff1f0b6b7 100644 |
1297 | --- a/drivers/net/wireless/rt2x00/rt2x00mac.c |
1298 | +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c |
1299 | @@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, |
1300 | frag_skb->data, data_length, tx_info, |
1301 | (struct ieee80211_rts *)(skb->data)); |
1302 | |
1303 | - retval = rt2x00queue_write_tx_frame(queue, skb, true); |
1304 | + retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true); |
1305 | if (retval) { |
1306 | dev_kfree_skb_any(skb); |
1307 | rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); |
1308 | @@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, |
1309 | goto exit_fail; |
1310 | } |
1311 | |
1312 | - if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) |
1313 | + if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false))) |
1314 | goto exit_fail; |
1315 | |
1316 | /* |
1317 | @@ -754,6 +754,9 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop) |
1318 | struct rt2x00_dev *rt2x00dev = hw->priv; |
1319 | struct data_queue *queue; |
1320 | |
1321 | + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) |
1322 | + return; |
1323 | + |
1324 | tx_queue_for_each(rt2x00dev, queue) |
1325 | rt2x00queue_flush_queue(queue, drop); |
1326 | } |
1327 | diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c |
1328 | index 6c8a33b6ee22..66a2db8c260d 100644 |
1329 | --- a/drivers/net/wireless/rt2x00/rt2x00queue.c |
1330 | +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c |
1331 | @@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry) |
1332 | } |
1333 | |
1334 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
1335 | - bool local) |
1336 | + struct ieee80211_sta *sta, bool local) |
1337 | { |
1338 | struct ieee80211_tx_info *tx_info; |
1339 | struct queue_entry *entry; |
1340 | @@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
1341 | * after that we are free to use the skb->cb array |
1342 | * for our information. |
1343 | */ |
1344 | - rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, NULL); |
1345 | + rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, sta); |
1346 | |
1347 | /* |
1348 | * All information is retrieved from the skb->cb array, |
1349 | diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c |
1350 | index 03ca6c139f1a..4e86e9767ba6 100644 |
1351 | --- a/drivers/platform/x86/thinkpad_acpi.c |
1352 | +++ b/drivers/platform/x86/thinkpad_acpi.c |
1353 | @@ -6420,7 +6420,12 @@ static struct ibm_struct brightness_driver_data = { |
1354 | #define TPACPI_ALSA_SHRTNAME "ThinkPad Console Audio Control" |
1355 | #define TPACPI_ALSA_MIXERNAME TPACPI_ALSA_SHRTNAME |
1356 | |
1357 | -static int alsa_index = ~((1 << (SNDRV_CARDS - 3)) - 1); /* last three slots */ |
1358 | +#if SNDRV_CARDS <= 32 |
1359 | +#define DEFAULT_ALSA_IDX ~((1 << (SNDRV_CARDS - 3)) - 1) |
1360 | +#else |
1361 | +#define DEFAULT_ALSA_IDX ~((1 << (32 - 3)) - 1) |
1362 | +#endif |
1363 | +static int alsa_index = DEFAULT_ALSA_IDX; /* last three slots */ |
1364 | static char *alsa_id = "ThinkPadEC"; |
1365 | static bool alsa_enable = SNDRV_DEFAULT_ENABLE1; |
1366 | |
1367 | diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c |
1368 | index d85ac1a9d2c0..fbcd48d0bfc3 100644 |
1369 | --- a/drivers/scsi/aacraid/commctrl.c |
1370 | +++ b/drivers/scsi/aacraid/commctrl.c |
1371 | @@ -511,7 +511,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) |
1372 | goto cleanup; |
1373 | } |
1374 | |
1375 | - if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) { |
1376 | + if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) || |
1377 | + (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) { |
1378 | rcode = -EINVAL; |
1379 | goto cleanup; |
1380 | } |
1381 | diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c |
1382 | index 8e76ddca0999..5a5e9c915c25 100644 |
1383 | --- a/drivers/staging/android/ashmem.c |
1384 | +++ b/drivers/staging/android/ashmem.c |
1385 | @@ -706,7 +706,7 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
1386 | .gfp_mask = GFP_KERNEL, |
1387 | .nr_to_scan = LONG_MAX, |
1388 | }; |
1389 | - |
1390 | + ret = ashmem_shrink_count(&ashmem_shrinker, &sc); |
1391 | nodes_setall(sc.nodes_to_scan); |
1392 | ashmem_shrink_scan(&ashmem_shrinker, &sc); |
1393 | } |
1394 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c |
1395 | index 1636c7ca57e2..a3af4699eb4d 100644 |
1396 | --- a/drivers/staging/comedi/comedi_fops.c |
1397 | +++ b/drivers/staging/comedi/comedi_fops.c |
1398 | @@ -543,7 +543,7 @@ void *comedi_alloc_spriv(struct comedi_subdevice *s, size_t size) |
1399 | { |
1400 | s->private = kzalloc(size, GFP_KERNEL); |
1401 | if (s->private) |
1402 | - comedi_set_subdevice_runflags(s, ~0, SRF_FREE_SPRIV); |
1403 | + s->runflags |= SRF_FREE_SPRIV; |
1404 | return s->private; |
1405 | } |
1406 | EXPORT_SYMBOL_GPL(comedi_alloc_spriv); |
1407 | @@ -1485,7 +1485,8 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
1408 | if (async->cmd.flags & TRIG_WAKE_EOS) |
1409 | async->cb_mask |= COMEDI_CB_EOS; |
1410 | |
1411 | - comedi_set_subdevice_runflags(s, ~0, SRF_USER | SRF_RUNNING); |
1412 | + comedi_set_subdevice_runflags(s, SRF_USER | SRF_ERROR | SRF_RUNNING, |
1413 | + SRF_USER | SRF_RUNNING); |
1414 | |
1415 | /* set s->busy _after_ setting SRF_RUNNING flag to avoid race with |
1416 | * comedi_read() or comedi_write() */ |
1417 | diff --git a/drivers/staging/rtl8188eu/os_dep/os_intfs.c b/drivers/staging/rtl8188eu/os_dep/os_intfs.c |
1418 | index 63bc913eba6d..8b2b4a8d1f08 100644 |
1419 | --- a/drivers/staging/rtl8188eu/os_dep/os_intfs.c |
1420 | +++ b/drivers/staging/rtl8188eu/os_dep/os_intfs.c |
1421 | @@ -707,6 +707,10 @@ int rtw_init_netdev_name(struct net_device *pnetdev, const char *ifname) |
1422 | return 0; |
1423 | } |
1424 | |
1425 | +static const struct device_type wlan_type = { |
1426 | + .name = "wlan", |
1427 | +}; |
1428 | + |
1429 | struct net_device *rtw_init_netdev(struct adapter *old_padapter) |
1430 | { |
1431 | struct adapter *padapter; |
1432 | @@ -722,6 +726,7 @@ struct net_device *rtw_init_netdev(struct adapter *old_padapter) |
1433 | if (!pnetdev) |
1434 | return NULL; |
1435 | |
1436 | + pnetdev->dev.type = &wlan_type; |
1437 | padapter = rtw_netdev_priv(pnetdev); |
1438 | padapter->pnetdev = pnetdev; |
1439 | DBG_88E("register rtw_netdev_ops to netdev_ops\n"); |
1440 | diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c |
1441 | index 2c4ed52ca849..012ba15ec490 100644 |
1442 | --- a/drivers/staging/zram/zram_drv.c |
1443 | +++ b/drivers/staging/zram/zram_drv.c |
1444 | @@ -648,6 +648,9 @@ static ssize_t reset_store(struct device *dev, |
1445 | zram = dev_to_zram(dev); |
1446 | bdev = bdget_disk(zram->disk, 0); |
1447 | |
1448 | + if (!bdev) |
1449 | + return -ENOMEM; |
1450 | + |
1451 | /* Do not reset an active device! */ |
1452 | if (bdev->bd_holders) |
1453 | return -EBUSY; |
1454 | @@ -660,8 +663,7 @@ static ssize_t reset_store(struct device *dev, |
1455 | return -EINVAL; |
1456 | |
1457 | /* Make sure all pending I/O is finished */ |
1458 | - if (bdev) |
1459 | - fsync_bdev(bdev); |
1460 | + fsync_bdev(bdev); |
1461 | |
1462 | zram_reset_device(zram, true); |
1463 | return len; |
1464 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
1465 | index f7841d44feda..689433cdef25 100644 |
1466 | --- a/drivers/usb/core/driver.c |
1467 | +++ b/drivers/usb/core/driver.c |
1468 | @@ -1790,6 +1790,9 @@ int usb_set_usb2_hardware_lpm(struct usb_device *udev, int enable) |
1469 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); |
1470 | int ret = -EPERM; |
1471 | |
1472 | + if (enable && !udev->usb2_hw_lpm_allowed) |
1473 | + return 0; |
1474 | + |
1475 | if (hcd->driver->set_usb2_hw_lpm) { |
1476 | ret = hcd->driver->set_usb2_hw_lpm(hcd, udev, enable); |
1477 | if (!ret) |
1478 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1479 | index 879651cb6b45..243c6729c320 100644 |
1480 | --- a/drivers/usb/core/hub.c |
1481 | +++ b/drivers/usb/core/hub.c |
1482 | @@ -1135,6 +1135,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) |
1483 | usb_clear_port_feature(hub->hdev, port1, |
1484 | USB_PORT_FEAT_C_ENABLE); |
1485 | } |
1486 | + if (portchange & USB_PORT_STAT_C_RESET) { |
1487 | + need_debounce_delay = true; |
1488 | + usb_clear_port_feature(hub->hdev, port1, |
1489 | + USB_PORT_FEAT_C_RESET); |
1490 | + } |
1491 | if ((portchange & USB_PORT_STAT_C_BH_RESET) && |
1492 | hub_is_superspeed(hub->hdev)) { |
1493 | need_debounce_delay = true; |
1494 | @@ -3954,6 +3959,32 @@ static int hub_set_address(struct usb_device *udev, int devnum) |
1495 | return retval; |
1496 | } |
1497 | |
1498 | +/* |
1499 | + * There are reports of USB 3.0 devices that say they support USB 2.0 Link PM |
1500 | + * when they're plugged into a USB 2.0 port, but they don't work when LPM is |
1501 | + * enabled. |
1502 | + * |
1503 | + * Only enable USB 2.0 Link PM if the port is internal (hardwired), or the |
1504 | + * device says it supports the new USB 2.0 Link PM errata by setting the BESL |
1505 | + * support bit in the BOS descriptor. |
1506 | + */ |
1507 | +static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) |
1508 | +{ |
1509 | + int connect_type; |
1510 | + |
1511 | + if (!udev->usb2_hw_lpm_capable) |
1512 | + return; |
1513 | + |
1514 | + connect_type = usb_get_hub_port_connect_type(udev->parent, |
1515 | + udev->portnum); |
1516 | + |
1517 | + if ((udev->bos->ext_cap->bmAttributes & USB_BESL_SUPPORT) || |
1518 | + connect_type == USB_PORT_CONNECT_TYPE_HARD_WIRED) { |
1519 | + udev->usb2_hw_lpm_allowed = 1; |
1520 | + usb_set_usb2_hardware_lpm(udev, 1); |
1521 | + } |
1522 | +} |
1523 | + |
1524 | /* Reset device, (re)assign address, get device descriptor. |
1525 | * Device connection must be stable, no more debouncing needed. |
1526 | * Returns device in USB_STATE_ADDRESS, except on error. |
1527 | @@ -4247,6 +4278,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, |
1528 | /* notify HCD that we have a device connected and addressed */ |
1529 | if (hcd->driver->update_device) |
1530 | hcd->driver->update_device(hcd, udev); |
1531 | + hub_set_initial_usb2_lpm_policy(udev); |
1532 | fail: |
1533 | if (retval) { |
1534 | hub_port_disable(hub, port1, 0); |
1535 | @@ -5091,6 +5123,12 @@ static int usb_reset_and_verify_device(struct usb_device *udev) |
1536 | } |
1537 | parent_hub = usb_hub_to_struct_hub(parent_hdev); |
1538 | |
1539 | + /* Disable USB2 hardware LPM. |
1540 | + * It will be re-enabled by the enumeration process. |
1541 | + */ |
1542 | + if (udev->usb2_hw_lpm_enabled == 1) |
1543 | + usb_set_usb2_hardware_lpm(udev, 0); |
1544 | + |
1545 | bos = udev->bos; |
1546 | udev->bos = NULL; |
1547 | |
1548 | @@ -5198,6 +5236,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev) |
1549 | |
1550 | done: |
1551 | /* Now that the alt settings are re-installed, enable LTM and LPM. */ |
1552 | + usb_set_usb2_hardware_lpm(udev, 1); |
1553 | usb_unlocked_enable_lpm(udev); |
1554 | usb_enable_ltm(udev); |
1555 | usb_release_bos_descriptor(udev); |
1556 | diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c |
1557 | index 6d2c8edb1ffe..ca516ac0f234 100644 |
1558 | --- a/drivers/usb/core/sysfs.c |
1559 | +++ b/drivers/usb/core/sysfs.c |
1560 | @@ -449,7 +449,7 @@ static ssize_t usb2_hardware_lpm_show(struct device *dev, |
1561 | struct usb_device *udev = to_usb_device(dev); |
1562 | const char *p; |
1563 | |
1564 | - if (udev->usb2_hw_lpm_enabled == 1) |
1565 | + if (udev->usb2_hw_lpm_allowed == 1) |
1566 | p = "enabled"; |
1567 | else |
1568 | p = "disabled"; |
1569 | @@ -469,8 +469,10 @@ static ssize_t usb2_hardware_lpm_store(struct device *dev, |
1570 | |
1571 | ret = strtobool(buf, &value); |
1572 | |
1573 | - if (!ret) |
1574 | + if (!ret) { |
1575 | + udev->usb2_hw_lpm_allowed = value; |
1576 | ret = usb_set_usb2_hardware_lpm(udev, value); |
1577 | + } |
1578 | |
1579 | usb_unlock_device(udev); |
1580 | |
1581 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c |
1582 | index 83bcd13622c3..49b8bd063fab 100644 |
1583 | --- a/drivers/usb/host/xhci-mem.c |
1584 | +++ b/drivers/usb/host/xhci-mem.c |
1585 | @@ -1693,9 +1693,7 @@ void xhci_free_command(struct xhci_hcd *xhci, |
1586 | void xhci_mem_cleanup(struct xhci_hcd *xhci) |
1587 | { |
1588 | struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); |
1589 | - struct dev_info *dev_info, *next; |
1590 | struct xhci_cd *cur_cd, *next_cd; |
1591 | - unsigned long flags; |
1592 | int size; |
1593 | int i, j, num_ports; |
1594 | |
1595 | @@ -1756,13 +1754,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) |
1596 | |
1597 | scratchpad_free(xhci); |
1598 | |
1599 | - spin_lock_irqsave(&xhci->lock, flags); |
1600 | - list_for_each_entry_safe(dev_info, next, &xhci->lpm_failed_devs, list) { |
1601 | - list_del(&dev_info->list); |
1602 | - kfree(dev_info); |
1603 | - } |
1604 | - spin_unlock_irqrestore(&xhci->lock, flags); |
1605 | - |
1606 | if (!xhci->rh_bw) |
1607 | goto no_bw; |
1608 | |
1609 | @@ -2231,7 +2222,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) |
1610 | u32 page_size, temp; |
1611 | int i; |
1612 | |
1613 | - INIT_LIST_HEAD(&xhci->lpm_failed_devs); |
1614 | INIT_LIST_HEAD(&xhci->cancel_cmd_list); |
1615 | |
1616 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); |
1617 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1618 | index 6e0d886bcce5..ed6c186a5393 100644 |
1619 | --- a/drivers/usb/host/xhci.c |
1620 | +++ b/drivers/usb/host/xhci.c |
1621 | @@ -4025,133 +4025,6 @@ static int xhci_calculate_usb2_hw_lpm_params(struct usb_device *udev) |
1622 | return PORT_BESLD(besld) | PORT_L1_TIMEOUT(l1) | PORT_HIRDM(hirdm); |
1623 | } |
1624 | |
1625 | -static int xhci_usb2_software_lpm_test(struct usb_hcd *hcd, |
1626 | - struct usb_device *udev) |
1627 | -{ |
1628 | - struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
1629 | - struct dev_info *dev_info; |
1630 | - __le32 __iomem **port_array; |
1631 | - __le32 __iomem *addr, *pm_addr; |
1632 | - u32 temp, dev_id; |
1633 | - unsigned int port_num; |
1634 | - unsigned long flags; |
1635 | - int hird; |
1636 | - int ret; |
1637 | - |
1638 | - if (hcd->speed == HCD_USB3 || !xhci->sw_lpm_support || |
1639 | - !udev->lpm_capable) |
1640 | - return -EINVAL; |
1641 | - |
1642 | - /* we only support lpm for non-hub device connected to root hub yet */ |
1643 | - if (!udev->parent || udev->parent->parent || |
1644 | - udev->descriptor.bDeviceClass == USB_CLASS_HUB) |
1645 | - return -EINVAL; |
1646 | - |
1647 | - spin_lock_irqsave(&xhci->lock, flags); |
1648 | - |
1649 | - /* Look for devices in lpm_failed_devs list */ |
1650 | - dev_id = le16_to_cpu(udev->descriptor.idVendor) << 16 | |
1651 | - le16_to_cpu(udev->descriptor.idProduct); |
1652 | - list_for_each_entry(dev_info, &xhci->lpm_failed_devs, list) { |
1653 | - if (dev_info->dev_id == dev_id) { |
1654 | - ret = -EINVAL; |
1655 | - goto finish; |
1656 | - } |
1657 | - } |
1658 | - |
1659 | - port_array = xhci->usb2_ports; |
1660 | - port_num = udev->portnum - 1; |
1661 | - |
1662 | - if (port_num > HCS_MAX_PORTS(xhci->hcs_params1)) { |
1663 | - xhci_dbg(xhci, "invalid port number %d\n", udev->portnum); |
1664 | - ret = -EINVAL; |
1665 | - goto finish; |
1666 | - } |
1667 | - |
1668 | - /* |
1669 | - * Test USB 2.0 software LPM. |
1670 | - * FIXME: some xHCI 1.0 hosts may implement a new register to set up |
1671 | - * hardware-controlled USB 2.0 LPM. See section 5.4.11 and 4.23.5.1.1.1 |
1672 | - * in the June 2011 errata release. |
1673 | - */ |
1674 | - xhci_dbg(xhci, "test port %d software LPM\n", port_num); |
1675 | - /* |
1676 | - * Set L1 Device Slot and HIRD/BESL. |
1677 | - * Check device's USB 2.0 extension descriptor to determine whether |
1678 | - * HIRD or BESL shoule be used. See USB2.0 LPM errata. |
1679 | - */ |
1680 | - pm_addr = port_array[port_num] + PORTPMSC; |
1681 | - hird = xhci_calculate_hird_besl(xhci, udev); |
1682 | - temp = PORT_L1DS(udev->slot_id) | PORT_HIRD(hird); |
1683 | - xhci_writel(xhci, temp, pm_addr); |
1684 | - |
1685 | - /* Set port link state to U2(L1) */ |
1686 | - addr = port_array[port_num]; |
1687 | - xhci_set_link_state(xhci, port_array, port_num, XDEV_U2); |
1688 | - |
1689 | - /* wait for ACK */ |
1690 | - spin_unlock_irqrestore(&xhci->lock, flags); |
1691 | - msleep(10); |
1692 | - spin_lock_irqsave(&xhci->lock, flags); |
1693 | - |
1694 | - /* Check L1 Status */ |
1695 | - ret = xhci_handshake(xhci, pm_addr, |
1696 | - PORT_L1S_MASK, PORT_L1S_SUCCESS, 125); |
1697 | - if (ret != -ETIMEDOUT) { |
1698 | - /* enter L1 successfully */ |
1699 | - temp = xhci_readl(xhci, addr); |
1700 | - xhci_dbg(xhci, "port %d entered L1 state, port status 0x%x\n", |
1701 | - port_num, temp); |
1702 | - ret = 0; |
1703 | - } else { |
1704 | - temp = xhci_readl(xhci, pm_addr); |
1705 | - xhci_dbg(xhci, "port %d software lpm failed, L1 status %d\n", |
1706 | - port_num, temp & PORT_L1S_MASK); |
1707 | - ret = -EINVAL; |
1708 | - } |
1709 | - |
1710 | - /* Resume the port */ |
1711 | - xhci_set_link_state(xhci, port_array, port_num, XDEV_U0); |
1712 | - |
1713 | - spin_unlock_irqrestore(&xhci->lock, flags); |
1714 | - msleep(10); |
1715 | - spin_lock_irqsave(&xhci->lock, flags); |
1716 | - |
1717 | - /* Clear PLC */ |
1718 | - xhci_test_and_clear_bit(xhci, port_array, port_num, PORT_PLC); |
1719 | - |
1720 | - /* Check PORTSC to make sure the device is in the right state */ |
1721 | - if (!ret) { |
1722 | - temp = xhci_readl(xhci, addr); |
1723 | - xhci_dbg(xhci, "resumed port %d status 0x%x\n", port_num, temp); |
1724 | - if (!(temp & PORT_CONNECT) || !(temp & PORT_PE) || |
1725 | - (temp & PORT_PLS_MASK) != XDEV_U0) { |
1726 | - xhci_dbg(xhci, "port L1 resume fail\n"); |
1727 | - ret = -EINVAL; |
1728 | - } |
1729 | - } |
1730 | - |
1731 | - if (ret) { |
1732 | - /* Insert dev to lpm_failed_devs list */ |
1733 | - xhci_warn(xhci, "device LPM test failed, may disconnect and " |
1734 | - "re-enumerate\n"); |
1735 | - dev_info = kzalloc(sizeof(struct dev_info), GFP_ATOMIC); |
1736 | - if (!dev_info) { |
1737 | - ret = -ENOMEM; |
1738 | - goto finish; |
1739 | - } |
1740 | - dev_info->dev_id = dev_id; |
1741 | - INIT_LIST_HEAD(&dev_info->list); |
1742 | - list_add(&dev_info->list, &xhci->lpm_failed_devs); |
1743 | - } else { |
1744 | - xhci_ring_device(xhci, udev->slot_id); |
1745 | - } |
1746 | - |
1747 | -finish: |
1748 | - spin_unlock_irqrestore(&xhci->lock, flags); |
1749 | - return ret; |
1750 | -} |
1751 | - |
1752 | int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, |
1753 | struct usb_device *udev, int enable) |
1754 | { |
1755 | @@ -4228,7 +4101,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, |
1756 | } |
1757 | |
1758 | pm_val &= ~PORT_HIRD_MASK; |
1759 | - pm_val |= PORT_HIRD(hird) | PORT_RWE; |
1760 | + pm_val |= PORT_HIRD(hird) | PORT_RWE | PORT_L1DS(udev->slot_id); |
1761 | xhci_writel(xhci, pm_val, pm_addr); |
1762 | pm_val = xhci_readl(xhci, pm_addr); |
1763 | pm_val |= PORT_HLE; |
1764 | @@ -4236,7 +4109,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, |
1765 | /* flush write */ |
1766 | xhci_readl(xhci, pm_addr); |
1767 | } else { |
1768 | - pm_val &= ~(PORT_HLE | PORT_RWE | PORT_HIRD_MASK); |
1769 | + pm_val &= ~(PORT_HLE | PORT_RWE | PORT_HIRD_MASK | PORT_L1DS_MASK); |
1770 | xhci_writel(xhci, pm_val, pm_addr); |
1771 | /* flush write */ |
1772 | xhci_readl(xhci, pm_addr); |
1773 | @@ -4279,24 +4152,26 @@ static int xhci_check_usb2_port_capability(struct xhci_hcd *xhci, int port, |
1774 | int xhci_update_device(struct usb_hcd *hcd, struct usb_device *udev) |
1775 | { |
1776 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
1777 | - int ret; |
1778 | int portnum = udev->portnum - 1; |
1779 | |
1780 | - ret = xhci_usb2_software_lpm_test(hcd, udev); |
1781 | - if (!ret) { |
1782 | - xhci_dbg(xhci, "software LPM test succeed\n"); |
1783 | - if (xhci->hw_lpm_support == 1 && |
1784 | - xhci_check_usb2_port_capability(xhci, portnum, XHCI_HLC)) { |
1785 | - udev->usb2_hw_lpm_capable = 1; |
1786 | - udev->l1_params.timeout = XHCI_L1_TIMEOUT; |
1787 | - udev->l1_params.besl = XHCI_DEFAULT_BESL; |
1788 | - if (xhci_check_usb2_port_capability(xhci, portnum, |
1789 | - XHCI_BLC)) |
1790 | - udev->usb2_hw_lpm_besl_capable = 1; |
1791 | - ret = xhci_set_usb2_hardware_lpm(hcd, udev, 1); |
1792 | - if (!ret) |
1793 | - udev->usb2_hw_lpm_enabled = 1; |
1794 | - } |
1795 | + if (hcd->speed == HCD_USB3 || !xhci->sw_lpm_support || |
1796 | + !udev->lpm_capable) |
1797 | + return 0; |
1798 | + |
1799 | + /* we only support lpm for non-hub device connected to root hub yet */ |
1800 | + if (!udev->parent || udev->parent->parent || |
1801 | + udev->descriptor.bDeviceClass == USB_CLASS_HUB) |
1802 | + return 0; |
1803 | + |
1804 | + if (xhci->hw_lpm_support == 1 && |
1805 | + xhci_check_usb2_port_capability( |
1806 | + xhci, portnum, XHCI_HLC)) { |
1807 | + udev->usb2_hw_lpm_capable = 1; |
1808 | + udev->l1_params.timeout = XHCI_L1_TIMEOUT; |
1809 | + udev->l1_params.besl = XHCI_DEFAULT_BESL; |
1810 | + if (xhci_check_usb2_port_capability(xhci, portnum, |
1811 | + XHCI_BLC)) |
1812 | + udev->usb2_hw_lpm_besl_capable = 1; |
1813 | } |
1814 | |
1815 | return 0; |
1816 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
1817 | index 941d5f59e4dc..ed3a425de8ce 100644 |
1818 | --- a/drivers/usb/host/xhci.h |
1819 | +++ b/drivers/usb/host/xhci.h |
1820 | @@ -383,6 +383,7 @@ struct xhci_op_regs { |
1821 | #define PORT_RWE (1 << 3) |
1822 | #define PORT_HIRD(p) (((p) & 0xf) << 4) |
1823 | #define PORT_HIRD_MASK (0xf << 4) |
1824 | +#define PORT_L1DS_MASK (0xff << 8) |
1825 | #define PORT_L1DS(p) (((p) & 0xff) << 8) |
1826 | #define PORT_HLE (1 << 16) |
1827 | |
1828 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c |
1829 | index cd70cc886171..0d0d11880968 100644 |
1830 | --- a/drivers/usb/musb/musb_core.c |
1831 | +++ b/drivers/usb/musb/musb_core.c |
1832 | @@ -1809,6 +1809,7 @@ static void musb_free(struct musb *musb) |
1833 | disable_irq_wake(musb->nIrq); |
1834 | free_irq(musb->nIrq, musb); |
1835 | } |
1836 | + cancel_work_sync(&musb->irq_work); |
1837 | if (musb->dma_controller) |
1838 | dma_controller_destroy(musb->dma_controller); |
1839 | |
1840 | @@ -1946,6 +1947,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) |
1841 | if (status < 0) |
1842 | goto fail3; |
1843 | status = musb_gadget_setup(musb); |
1844 | + if (status) |
1845 | + musb_host_cleanup(musb); |
1846 | break; |
1847 | default: |
1848 | dev_err(dev, "unsupported port mode %d\n", musb->port_mode); |
1849 | @@ -1972,6 +1975,7 @@ fail5: |
1850 | |
1851 | fail4: |
1852 | musb_gadget_cleanup(musb); |
1853 | + musb_host_cleanup(musb); |
1854 | |
1855 | fail3: |
1856 | if (musb->dma_controller) |
1857 | diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c |
1858 | index bd4138d80a48..1edee7906b73 100644 |
1859 | --- a/drivers/usb/musb/musb_dsps.c |
1860 | +++ b/drivers/usb/musb/musb_dsps.c |
1861 | @@ -121,6 +121,7 @@ struct dsps_glue { |
1862 | unsigned long last_timer; /* last timer data for each instance */ |
1863 | }; |
1864 | |
1865 | +static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout); |
1866 | /** |
1867 | * dsps_musb_enable - enable interrupts |
1868 | */ |
1869 | @@ -143,6 +144,7 @@ static void dsps_musb_enable(struct musb *musb) |
1870 | /* Force the DRVVBUS IRQ so we can start polling for ID change. */ |
1871 | dsps_writel(reg_base, wrp->coreintr_set, |
1872 | (1 << wrp->drvvbus) << wrp->usb_shift); |
1873 | + dsps_musb_try_idle(musb, 0); |
1874 | } |
1875 | |
1876 | /** |
1877 | @@ -171,6 +173,7 @@ static void otg_timer(unsigned long _musb) |
1878 | const struct dsps_musb_wrapper *wrp = glue->wrp; |
1879 | u8 devctl; |
1880 | unsigned long flags; |
1881 | + int skip_session = 0; |
1882 | |
1883 | /* |
1884 | * We poll because DSPS IP's won't expose several OTG-critical |
1885 | @@ -183,10 +186,12 @@ static void otg_timer(unsigned long _musb) |
1886 | spin_lock_irqsave(&musb->lock, flags); |
1887 | switch (musb->xceiv->state) { |
1888 | case OTG_STATE_A_WAIT_BCON: |
1889 | - devctl &= ~MUSB_DEVCTL_SESSION; |
1890 | - dsps_writeb(musb->mregs, MUSB_DEVCTL, devctl); |
1891 | + dsps_writeb(musb->mregs, MUSB_DEVCTL, 0); |
1892 | + skip_session = 1; |
1893 | + /* fall */ |
1894 | |
1895 | - devctl = dsps_readb(musb->mregs, MUSB_DEVCTL); |
1896 | + case OTG_STATE_A_IDLE: |
1897 | + case OTG_STATE_B_IDLE: |
1898 | if (devctl & MUSB_DEVCTL_BDEVICE) { |
1899 | musb->xceiv->state = OTG_STATE_B_IDLE; |
1900 | MUSB_DEV_MODE(musb); |
1901 | @@ -194,20 +199,15 @@ static void otg_timer(unsigned long _musb) |
1902 | musb->xceiv->state = OTG_STATE_A_IDLE; |
1903 | MUSB_HST_MODE(musb); |
1904 | } |
1905 | + if (!(devctl & MUSB_DEVCTL_SESSION) && !skip_session) |
1906 | + dsps_writeb(mregs, MUSB_DEVCTL, MUSB_DEVCTL_SESSION); |
1907 | + mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ); |
1908 | break; |
1909 | case OTG_STATE_A_WAIT_VFALL: |
1910 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; |
1911 | dsps_writel(musb->ctrl_base, wrp->coreintr_set, |
1912 | MUSB_INTR_VBUSERROR << wrp->usb_shift); |
1913 | break; |
1914 | - case OTG_STATE_B_IDLE: |
1915 | - devctl = dsps_readb(mregs, MUSB_DEVCTL); |
1916 | - if (devctl & MUSB_DEVCTL_BDEVICE) |
1917 | - mod_timer(&glue->timer, |
1918 | - jiffies + wrp->poll_seconds * HZ); |
1919 | - else |
1920 | - musb->xceiv->state = OTG_STATE_A_IDLE; |
1921 | - break; |
1922 | default: |
1923 | break; |
1924 | } |
1925 | @@ -234,6 +234,9 @@ static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout) |
1926 | if (musb->port_mode == MUSB_PORT_MODE_HOST) |
1927 | return; |
1928 | |
1929 | + if (!musb->g.dev.driver) |
1930 | + return; |
1931 | + |
1932 | if (time_after(glue->last_timer, timeout) && |
1933 | timer_pending(&glue->timer)) { |
1934 | dev_dbg(musb->controller, |
1935 | diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c |
1936 | index d1d6b83aabca..9af6bba5eac9 100644 |
1937 | --- a/drivers/usb/musb/musb_virthub.c |
1938 | +++ b/drivers/usb/musb/musb_virthub.c |
1939 | @@ -220,6 +220,23 @@ int musb_hub_status_data(struct usb_hcd *hcd, char *buf) |
1940 | return retval; |
1941 | } |
1942 | |
1943 | +static int musb_has_gadget(struct musb *musb) |
1944 | +{ |
1945 | + /* |
1946 | + * In host-only mode we start a connection right away. In OTG mode |
1947 | + * we have to wait until we loaded a gadget. We don't really need a |
1948 | + * gadget if we operate as a host but we should not start a session |
1949 | + * as a device without a gadget or else we explode. |
1950 | + */ |
1951 | +#ifdef CONFIG_USB_MUSB_HOST |
1952 | + return 1; |
1953 | +#else |
1954 | + if (musb->port_mode == MUSB_PORT_MODE_HOST) |
1955 | + return 1; |
1956 | + return musb->g.dev.driver != NULL; |
1957 | +#endif |
1958 | +} |
1959 | + |
1960 | int musb_hub_control( |
1961 | struct usb_hcd *hcd, |
1962 | u16 typeReq, |
1963 | @@ -362,7 +379,7 @@ int musb_hub_control( |
1964 | * initialization logic, e.g. for OTG, or change any |
1965 | * logic relating to VBUS power-up. |
1966 | */ |
1967 | - if (!hcd->self.is_b_host) |
1968 | + if (!hcd->self.is_b_host && musb_has_gadget(musb)) |
1969 | musb_start(musb); |
1970 | break; |
1971 | case USB_PORT_FEAT_RESET: |
1972 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c |
1973 | index fdf953539c62..e5bdd987b9e8 100644 |
1974 | --- a/drivers/usb/serial/mos7840.c |
1975 | +++ b/drivers/usb/serial/mos7840.c |
1976 | @@ -1532,7 +1532,11 @@ static int mos7840_tiocmget(struct tty_struct *tty) |
1977 | return -ENODEV; |
1978 | |
1979 | status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr); |
1980 | + if (status != 1) |
1981 | + return -EIO; |
1982 | status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr); |
1983 | + if (status != 1) |
1984 | + return -EIO; |
1985 | result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) |
1986 | | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) |
1987 | | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0) |
1988 | diff --git a/drivers/usb/wusbcore/wa-rpipe.c b/drivers/usb/wusbcore/wa-rpipe.c |
1989 | index fd4f1ce6256a..b5e4fc19dec0 100644 |
1990 | --- a/drivers/usb/wusbcore/wa-rpipe.c |
1991 | +++ b/drivers/usb/wusbcore/wa-rpipe.c |
1992 | @@ -333,7 +333,10 @@ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa, |
1993 | /* FIXME: compute so seg_size > ep->maxpktsize */ |
1994 | rpipe->descr.wBlocks = cpu_to_le16(16); /* given */ |
1995 | /* ep0 maxpktsize is 0x200 (WUSB1.0[4.8.1]) */ |
1996 | - rpipe->descr.wMaxPacketSize = cpu_to_le16(ep->desc.wMaxPacketSize); |
1997 | + if (usb_endpoint_xfer_isoc(&ep->desc)) |
1998 | + rpipe->descr.wMaxPacketSize = epcd->wOverTheAirPacketSize; |
1999 | + else |
2000 | + rpipe->descr.wMaxPacketSize = ep->desc.wMaxPacketSize; |
2001 | |
2002 | rpipe->descr.hwa_bMaxBurst = max(min_t(unsigned int, |
2003 | epcd->bMaxBurst, 16U), 1U); |
2004 | diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c |
2005 | index 4a355726151e..26450d850f14 100644 |
2006 | --- a/fs/btrfs/relocation.c |
2007 | +++ b/fs/btrfs/relocation.c |
2008 | @@ -4481,6 +4481,7 @@ int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len) |
2009 | struct btrfs_root *root = BTRFS_I(inode)->root; |
2010 | int ret; |
2011 | u64 disk_bytenr; |
2012 | + u64 new_bytenr; |
2013 | LIST_HEAD(list); |
2014 | |
2015 | ordered = btrfs_lookup_ordered_extent(inode, file_pos); |
2016 | @@ -4492,13 +4493,24 @@ int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len) |
2017 | if (ret) |
2018 | goto out; |
2019 | |
2020 | - disk_bytenr = ordered->start; |
2021 | while (!list_empty(&list)) { |
2022 | sums = list_entry(list.next, struct btrfs_ordered_sum, list); |
2023 | list_del_init(&sums->list); |
2024 | |
2025 | - sums->bytenr = disk_bytenr; |
2026 | - disk_bytenr += sums->len; |
2027 | + /* |
2028 | + * We need to offset the new_bytenr based on where the csum is. |
2029 | + * We need to do this because we will read in entire prealloc |
2030 | + * extents but we may have written to say the middle of the |
2031 | + * prealloc extent, so we need to make sure the csum goes with |
2032 | + * the right disk offset. |
2033 | + * |
2034 | + * We can do this because the data reloc inode refers strictly |
2035 | + * to the on disk bytes, so we don't have to worry about |
2036 | + * disk_len vs real len like with real inodes since it's all |
2037 | + * disk length. |
2038 | + */ |
2039 | + new_bytenr = ordered->start + (sums->bytenr - disk_bytenr); |
2040 | + sums->bytenr = new_bytenr; |
2041 | |
2042 | btrfs_add_ordered_sum(inode, ordered, sums); |
2043 | } |
2044 | diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c |
2045 | index 277bd1be21fd..511d41546791 100644 |
2046 | --- a/fs/configfs/dir.c |
2047 | +++ b/fs/configfs/dir.c |
2048 | @@ -56,10 +56,19 @@ static void configfs_d_iput(struct dentry * dentry, |
2049 | struct configfs_dirent *sd = dentry->d_fsdata; |
2050 | |
2051 | if (sd) { |
2052 | - BUG_ON(sd->s_dentry != dentry); |
2053 | /* Coordinate with configfs_readdir */ |
2054 | spin_lock(&configfs_dirent_lock); |
2055 | - sd->s_dentry = NULL; |
2056 | + /* Coordinate with configfs_attach_attr where will increase |
2057 | + * sd->s_count and update sd->s_dentry to new allocated one. |
2058 | + * Only set sd->dentry to null when this dentry is the only |
2059 | + * sd owner. |
2060 | + * If not do so, configfs_d_iput may run just after |
2061 | + * configfs_attach_attr and set sd->s_dentry to null |
2062 | + * even it's still in use. |
2063 | + */ |
2064 | + if (atomic_read(&sd->s_count) <= 2) |
2065 | + sd->s_dentry = NULL; |
2066 | + |
2067 | spin_unlock(&configfs_dirent_lock); |
2068 | configfs_put(sd); |
2069 | } |
2070 | @@ -426,8 +435,11 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den |
2071 | struct configfs_attribute * attr = sd->s_element; |
2072 | int error; |
2073 | |
2074 | + spin_lock(&configfs_dirent_lock); |
2075 | dentry->d_fsdata = configfs_get(sd); |
2076 | sd->s_dentry = dentry; |
2077 | + spin_unlock(&configfs_dirent_lock); |
2078 | + |
2079 | error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG, |
2080 | configfs_init_file); |
2081 | if (error) { |
2082 | diff --git a/fs/dcache.c b/fs/dcache.c |
2083 | index ae6ebb88ceff..89f96719a29b 100644 |
2084 | --- a/fs/dcache.c |
2085 | +++ b/fs/dcache.c |
2086 | @@ -2881,9 +2881,9 @@ static int prepend_path(const struct path *path, |
2087 | const struct path *root, |
2088 | char **buffer, int *buflen) |
2089 | { |
2090 | - struct dentry *dentry = path->dentry; |
2091 | - struct vfsmount *vfsmnt = path->mnt; |
2092 | - struct mount *mnt = real_mount(vfsmnt); |
2093 | + struct dentry *dentry; |
2094 | + struct vfsmount *vfsmnt; |
2095 | + struct mount *mnt; |
2096 | int error = 0; |
2097 | unsigned seq = 0; |
2098 | char *bptr; |
2099 | @@ -2893,6 +2893,9 @@ static int prepend_path(const struct path *path, |
2100 | restart: |
2101 | bptr = *buffer; |
2102 | blen = *buflen; |
2103 | + dentry = path->dentry; |
2104 | + vfsmnt = path->mnt; |
2105 | + mnt = real_mount(vfsmnt); |
2106 | read_seqbegin_or_lock(&rename_lock, &seq); |
2107 | while (dentry != root->dentry || vfsmnt != root->mnt) { |
2108 | struct dentry * parent; |
2109 | diff --git a/fs/exec.c b/fs/exec.c |
2110 | index 8875dd10ae7a..bb8afc1d1df4 100644 |
2111 | --- a/fs/exec.c |
2112 | +++ b/fs/exec.c |
2113 | @@ -1668,6 +1668,12 @@ int __get_dumpable(unsigned long mm_flags) |
2114 | return (ret > SUID_DUMP_USER) ? SUID_DUMP_ROOT : ret; |
2115 | } |
2116 | |
2117 | +/* |
2118 | + * This returns the actual value of the suid_dumpable flag. For things |
2119 | + * that are using this for checking for privilege transitions, it must |
2120 | + * test against SUID_DUMP_USER rather than treating it as a boolean |
2121 | + * value. |
2122 | + */ |
2123 | int get_dumpable(struct mm_struct *mm) |
2124 | { |
2125 | return __get_dumpable(mm->flags); |
2126 | diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c |
2127 | index ced3257f06e8..968d4c56e5eb 100644 |
2128 | --- a/fs/gfs2/inode.c |
2129 | +++ b/fs/gfs2/inode.c |
2130 | @@ -584,17 +584,17 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, |
2131 | if (!IS_ERR(inode)) { |
2132 | d = d_splice_alias(inode, dentry); |
2133 | error = 0; |
2134 | - if (file && !IS_ERR(d)) { |
2135 | - if (d == NULL) |
2136 | - d = dentry; |
2137 | - if (S_ISREG(inode->i_mode)) |
2138 | - error = finish_open(file, d, gfs2_open_common, opened); |
2139 | - else |
2140 | + if (file) { |
2141 | + if (S_ISREG(inode->i_mode)) { |
2142 | + WARN_ON(d != NULL); |
2143 | + error = finish_open(file, dentry, gfs2_open_common, opened); |
2144 | + } else { |
2145 | error = finish_no_open(file, d); |
2146 | + } |
2147 | + } else { |
2148 | + dput(d); |
2149 | } |
2150 | gfs2_glock_dq_uninit(ghs); |
2151 | - if (IS_ERR(d)) |
2152 | - return PTR_ERR(d); |
2153 | return error; |
2154 | } else if (error != -ENOENT) { |
2155 | goto fail_gunlock; |
2156 | @@ -781,8 +781,10 @@ static struct dentry *__gfs2_lookup(struct inode *dir, struct dentry *dentry, |
2157 | error = finish_open(file, dentry, gfs2_open_common, opened); |
2158 | |
2159 | gfs2_glock_dq_uninit(&gh); |
2160 | - if (error) |
2161 | + if (error) { |
2162 | + dput(d); |
2163 | return ERR_PTR(error); |
2164 | + } |
2165 | return d; |
2166 | } |
2167 | |
2168 | @@ -1163,14 +1165,16 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry, |
2169 | d = __gfs2_lookup(dir, dentry, file, opened); |
2170 | if (IS_ERR(d)) |
2171 | return PTR_ERR(d); |
2172 | - if (d == NULL) |
2173 | - d = dentry; |
2174 | - if (d->d_inode) { |
2175 | + if (d != NULL) |
2176 | + dentry = d; |
2177 | + if (dentry->d_inode) { |
2178 | if (!(*opened & FILE_OPENED)) |
2179 | - return finish_no_open(file, d); |
2180 | + return finish_no_open(file, dentry); |
2181 | + dput(d); |
2182 | return 0; |
2183 | } |
2184 | |
2185 | + BUG_ON(d != NULL); |
2186 | if (!(flags & O_CREAT)) |
2187 | return -ENOENT; |
2188 | |
2189 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
2190 | index d53d6785cba2..3b115653d422 100644 |
2191 | --- a/fs/nfs/nfs4proc.c |
2192 | +++ b/fs/nfs/nfs4proc.c |
2193 | @@ -1318,21 +1318,14 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) |
2194 | int ret; |
2195 | |
2196 | if (!data->rpc_done) { |
2197 | - ret = data->rpc_status; |
2198 | - goto err; |
2199 | + if (data->rpc_status) { |
2200 | + ret = data->rpc_status; |
2201 | + goto err; |
2202 | + } |
2203 | + /* cached opens have already been processed */ |
2204 | + goto update; |
2205 | } |
2206 | |
2207 | - ret = -ESTALE; |
2208 | - if (!(data->f_attr.valid & NFS_ATTR_FATTR_TYPE) || |
2209 | - !(data->f_attr.valid & NFS_ATTR_FATTR_FILEID) || |
2210 | - !(data->f_attr.valid & NFS_ATTR_FATTR_CHANGE)) |
2211 | - goto err; |
2212 | - |
2213 | - ret = -ENOMEM; |
2214 | - state = nfs4_get_open_state(inode, data->owner); |
2215 | - if (state == NULL) |
2216 | - goto err; |
2217 | - |
2218 | ret = nfs_refresh_inode(inode, &data->f_attr); |
2219 | if (ret) |
2220 | goto err; |
2221 | @@ -1341,8 +1334,10 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) |
2222 | |
2223 | if (data->o_res.delegation_type != 0) |
2224 | nfs4_opendata_check_deleg(data, state); |
2225 | +update: |
2226 | update_open_stateid(state, &data->o_res.stateid, NULL, |
2227 | data->o_arg.fmode); |
2228 | + atomic_inc(&state->count); |
2229 | |
2230 | return state; |
2231 | err: |
2232 | @@ -4575,7 +4570,7 @@ static int _nfs4_get_security_label(struct inode *inode, void *buf, |
2233 | struct nfs4_label label = {0, 0, buflen, buf}; |
2234 | |
2235 | u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL }; |
2236 | - struct nfs4_getattr_arg args = { |
2237 | + struct nfs4_getattr_arg arg = { |
2238 | .fh = NFS_FH(inode), |
2239 | .bitmask = bitmask, |
2240 | }; |
2241 | @@ -4586,14 +4581,14 @@ static int _nfs4_get_security_label(struct inode *inode, void *buf, |
2242 | }; |
2243 | struct rpc_message msg = { |
2244 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR], |
2245 | - .rpc_argp = &args, |
2246 | + .rpc_argp = &arg, |
2247 | .rpc_resp = &res, |
2248 | }; |
2249 | int ret; |
2250 | |
2251 | nfs_fattr_init(&fattr); |
2252 | |
2253 | - ret = rpc_call_sync(server->client, &msg, 0); |
2254 | + ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 0); |
2255 | if (ret) |
2256 | return ret; |
2257 | if (!(fattr.valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL)) |
2258 | @@ -4630,7 +4625,7 @@ static int _nfs4_do_set_security_label(struct inode *inode, |
2259 | struct iattr sattr = {0}; |
2260 | struct nfs_server *server = NFS_SERVER(inode); |
2261 | const u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL }; |
2262 | - struct nfs_setattrargs args = { |
2263 | + struct nfs_setattrargs arg = { |
2264 | .fh = NFS_FH(inode), |
2265 | .iap = &sattr, |
2266 | .server = server, |
2267 | @@ -4644,14 +4639,14 @@ static int _nfs4_do_set_security_label(struct inode *inode, |
2268 | }; |
2269 | struct rpc_message msg = { |
2270 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], |
2271 | - .rpc_argp = &args, |
2272 | + .rpc_argp = &arg, |
2273 | .rpc_resp = &res, |
2274 | }; |
2275 | int status; |
2276 | |
2277 | - nfs4_stateid_copy(&args.stateid, &zero_stateid); |
2278 | + nfs4_stateid_copy(&arg.stateid, &zero_stateid); |
2279 | |
2280 | - status = rpc_call_sync(server->client, &msg, 0); |
2281 | + status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1); |
2282 | if (status) |
2283 | dprintk("%s failed: %d\n", __func__, status); |
2284 | |
2285 | @@ -5106,6 +5101,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock |
2286 | status = 0; |
2287 | } |
2288 | request->fl_ops->fl_release_private(request); |
2289 | + request->fl_ops = NULL; |
2290 | out: |
2291 | return status; |
2292 | } |
2293 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c |
2294 | index cc14cbb78b73..ebced8d71157 100644 |
2295 | --- a/fs/nfs/nfs4state.c |
2296 | +++ b/fs/nfs/nfs4state.c |
2297 | @@ -1422,7 +1422,7 @@ restart: |
2298 | if (status >= 0) { |
2299 | status = nfs4_reclaim_locks(state, ops); |
2300 | if (status >= 0) { |
2301 | - if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) { |
2302 | + if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) { |
2303 | spin_lock(&state->state_lock); |
2304 | list_for_each_entry(lock, &state->lock_states, ls_locks) { |
2305 | if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags)) |
2306 | @@ -1881,10 +1881,15 @@ again: |
2307 | nfs4_root_machine_cred(clp); |
2308 | goto again; |
2309 | } |
2310 | - if (i > 2) |
2311 | + if (clnt->cl_auth->au_flavor == RPC_AUTH_UNIX) |
2312 | break; |
2313 | case -NFS4ERR_CLID_INUSE: |
2314 | case -NFS4ERR_WRONGSEC: |
2315 | + /* No point in retrying if we already used RPC_AUTH_UNIX */ |
2316 | + if (clnt->cl_auth->au_flavor == RPC_AUTH_UNIX) { |
2317 | + status = -EPERM; |
2318 | + break; |
2319 | + } |
2320 | clnt = rpc_clone_client_set_auth(clnt, RPC_AUTH_UNIX); |
2321 | if (IS_ERR(clnt)) { |
2322 | status = PTR_ERR(clnt); |
2323 | diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c |
2324 | index 5f38ea36e266..af51cf9bf2e3 100644 |
2325 | --- a/fs/nfsd/export.c |
2326 | +++ b/fs/nfsd/export.c |
2327 | @@ -536,16 +536,12 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) |
2328 | if (err) |
2329 | goto out3; |
2330 | exp.ex_anon_uid= make_kuid(&init_user_ns, an_int); |
2331 | - if (!uid_valid(exp.ex_anon_uid)) |
2332 | - goto out3; |
2333 | |
2334 | /* anon gid */ |
2335 | err = get_int(&mesg, &an_int); |
2336 | if (err) |
2337 | goto out3; |
2338 | exp.ex_anon_gid= make_kgid(&init_user_ns, an_int); |
2339 | - if (!gid_valid(exp.ex_anon_gid)) |
2340 | - goto out3; |
2341 | |
2342 | /* fsid */ |
2343 | err = get_int(&mesg, &an_int); |
2344 | @@ -583,6 +579,17 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) |
2345 | exp.ex_uuid); |
2346 | if (err) |
2347 | goto out4; |
2348 | + /* |
2349 | + * For some reason exportfs has been passing down an |
2350 | + * invalid (-1) uid & gid on the "dummy" export which it |
2351 | + * uses to test export support. To make sure exportfs |
2352 | + * sees errors from check_export we therefore need to |
2353 | + * delay these checks till after check_export: |
2354 | + */ |
2355 | + if (!uid_valid(exp.ex_anon_uid)) |
2356 | + goto out4; |
2357 | + if (!gid_valid(exp.ex_anon_gid)) |
2358 | + goto out4; |
2359 | } |
2360 | |
2361 | expp = svc_export_lookup(&exp); |
2362 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
2363 | index d9454fe5653f..ecc735e30bea 100644 |
2364 | --- a/fs/nfsd/nfs4xdr.c |
2365 | +++ b/fs/nfsd/nfs4xdr.c |
2366 | @@ -141,8 +141,8 @@ xdr_error: \ |
2367 | |
2368 | static void next_decode_page(struct nfsd4_compoundargs *argp) |
2369 | { |
2370 | - argp->pagelist++; |
2371 | argp->p = page_address(argp->pagelist[0]); |
2372 | + argp->pagelist++; |
2373 | if (argp->pagelen < PAGE_SIZE) { |
2374 | argp->end = argp->p + (argp->pagelen>>2); |
2375 | argp->pagelen = 0; |
2376 | @@ -411,6 +411,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, |
2377 | label->data = kzalloc(dummy32 + 1, GFP_KERNEL); |
2378 | if (!label->data) |
2379 | return nfserr_jukebox; |
2380 | + label->len = dummy32; |
2381 | defer_free(argp, kfree, label->data); |
2382 | memcpy(label->data, buf, dummy32); |
2383 | } |
2384 | @@ -1208,6 +1209,7 @@ nfsd4_decode_write(struct nfsd4_compoundargs *argp, struct nfsd4_write *write) |
2385 | len -= pages * PAGE_SIZE; |
2386 | |
2387 | argp->p = (__be32 *)page_address(argp->pagelist[0]); |
2388 | + argp->pagelist++; |
2389 | argp->end = argp->p + XDR_QUADLEN(PAGE_SIZE); |
2390 | } |
2391 | argp->p += XDR_QUADLEN(len); |
2392 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
2393 | index c827acb0e943..72cb28e73ca0 100644 |
2394 | --- a/fs/nfsd/vfs.c |
2395 | +++ b/fs/nfsd/vfs.c |
2396 | @@ -298,41 +298,12 @@ commit_metadata(struct svc_fh *fhp) |
2397 | } |
2398 | |
2399 | /* |
2400 | - * Set various file attributes. |
2401 | - * N.B. After this call fhp needs an fh_put |
2402 | + * Go over the attributes and take care of the small differences between |
2403 | + * NFS semantics and what Linux expects. |
2404 | */ |
2405 | -__be32 |
2406 | -nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2407 | - int check_guard, time_t guardtime) |
2408 | +static void |
2409 | +nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap) |
2410 | { |
2411 | - struct dentry *dentry; |
2412 | - struct inode *inode; |
2413 | - int accmode = NFSD_MAY_SATTR; |
2414 | - umode_t ftype = 0; |
2415 | - __be32 err; |
2416 | - int host_err; |
2417 | - int size_change = 0; |
2418 | - |
2419 | - if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
2420 | - accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; |
2421 | - if (iap->ia_valid & ATTR_SIZE) |
2422 | - ftype = S_IFREG; |
2423 | - |
2424 | - /* Get inode */ |
2425 | - err = fh_verify(rqstp, fhp, ftype, accmode); |
2426 | - if (err) |
2427 | - goto out; |
2428 | - |
2429 | - dentry = fhp->fh_dentry; |
2430 | - inode = dentry->d_inode; |
2431 | - |
2432 | - /* Ignore any mode updates on symlinks */ |
2433 | - if (S_ISLNK(inode->i_mode)) |
2434 | - iap->ia_valid &= ~ATTR_MODE; |
2435 | - |
2436 | - if (!iap->ia_valid) |
2437 | - goto out; |
2438 | - |
2439 | /* |
2440 | * NFSv2 does not differentiate between "set-[ac]time-to-now" |
2441 | * which only requires access, and "set-[ac]time-to-X" which |
2442 | @@ -342,8 +313,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2443 | * convert to "set to now" instead of "set to explicit time" |
2444 | * |
2445 | * We only call inode_change_ok as the last test as technically |
2446 | - * it is not an interface that we should be using. It is only |
2447 | - * valid if the filesystem does not define it's own i_op->setattr. |
2448 | + * it is not an interface that we should be using. |
2449 | */ |
2450 | #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET) |
2451 | #define MAX_TOUCH_TIME_ERROR (30*60) |
2452 | @@ -369,30 +339,6 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2453 | iap->ia_valid &= ~BOTH_TIME_SET; |
2454 | } |
2455 | } |
2456 | - |
2457 | - /* |
2458 | - * The size case is special. |
2459 | - * It changes the file as well as the attributes. |
2460 | - */ |
2461 | - if (iap->ia_valid & ATTR_SIZE) { |
2462 | - if (iap->ia_size < inode->i_size) { |
2463 | - err = nfsd_permission(rqstp, fhp->fh_export, dentry, |
2464 | - NFSD_MAY_TRUNC|NFSD_MAY_OWNER_OVERRIDE); |
2465 | - if (err) |
2466 | - goto out; |
2467 | - } |
2468 | - |
2469 | - host_err = get_write_access(inode); |
2470 | - if (host_err) |
2471 | - goto out_nfserr; |
2472 | - |
2473 | - size_change = 1; |
2474 | - host_err = locks_verify_truncate(inode, NULL, iap->ia_size); |
2475 | - if (host_err) { |
2476 | - put_write_access(inode); |
2477 | - goto out_nfserr; |
2478 | - } |
2479 | - } |
2480 | |
2481 | /* sanitize the mode change */ |
2482 | if (iap->ia_valid & ATTR_MODE) { |
2483 | @@ -415,32 +361,111 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2484 | iap->ia_valid |= (ATTR_KILL_SUID | ATTR_KILL_SGID); |
2485 | } |
2486 | } |
2487 | +} |
2488 | |
2489 | - /* Change the attributes. */ |
2490 | +static __be32 |
2491 | +nfsd_get_write_access(struct svc_rqst *rqstp, struct svc_fh *fhp, |
2492 | + struct iattr *iap) |
2493 | +{ |
2494 | + struct inode *inode = fhp->fh_dentry->d_inode; |
2495 | + int host_err; |
2496 | |
2497 | - iap->ia_valid |= ATTR_CTIME; |
2498 | + if (iap->ia_size < inode->i_size) { |
2499 | + __be32 err; |
2500 | |
2501 | - err = nfserr_notsync; |
2502 | - if (!check_guard || guardtime == inode->i_ctime.tv_sec) { |
2503 | - host_err = nfsd_break_lease(inode); |
2504 | - if (host_err) |
2505 | - goto out_nfserr; |
2506 | - fh_lock(fhp); |
2507 | + err = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry, |
2508 | + NFSD_MAY_TRUNC | NFSD_MAY_OWNER_OVERRIDE); |
2509 | + if (err) |
2510 | + return err; |
2511 | + } |
2512 | |
2513 | - host_err = notify_change(dentry, iap); |
2514 | - err = nfserrno(host_err); |
2515 | - fh_unlock(fhp); |
2516 | + host_err = get_write_access(inode); |
2517 | + if (host_err) |
2518 | + goto out_nfserrno; |
2519 | + |
2520 | + host_err = locks_verify_truncate(inode, NULL, iap->ia_size); |
2521 | + if (host_err) |
2522 | + goto out_put_write_access; |
2523 | + return 0; |
2524 | + |
2525 | +out_put_write_access: |
2526 | + put_write_access(inode); |
2527 | +out_nfserrno: |
2528 | + return nfserrno(host_err); |
2529 | +} |
2530 | + |
2531 | +/* |
2532 | + * Set various file attributes. After this call fhp needs an fh_put. |
2533 | + */ |
2534 | +__be32 |
2535 | +nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
2536 | + int check_guard, time_t guardtime) |
2537 | +{ |
2538 | + struct dentry *dentry; |
2539 | + struct inode *inode; |
2540 | + int accmode = NFSD_MAY_SATTR; |
2541 | + umode_t ftype = 0; |
2542 | + __be32 err; |
2543 | + int host_err; |
2544 | + int size_change = 0; |
2545 | + |
2546 | + if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
2547 | + accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; |
2548 | + if (iap->ia_valid & ATTR_SIZE) |
2549 | + ftype = S_IFREG; |
2550 | + |
2551 | + /* Get inode */ |
2552 | + err = fh_verify(rqstp, fhp, ftype, accmode); |
2553 | + if (err) |
2554 | + goto out; |
2555 | + |
2556 | + dentry = fhp->fh_dentry; |
2557 | + inode = dentry->d_inode; |
2558 | + |
2559 | + /* Ignore any mode updates on symlinks */ |
2560 | + if (S_ISLNK(inode->i_mode)) |
2561 | + iap->ia_valid &= ~ATTR_MODE; |
2562 | + |
2563 | + if (!iap->ia_valid) |
2564 | + goto out; |
2565 | + |
2566 | + nfsd_sanitize_attrs(inode, iap); |
2567 | + |
2568 | + /* |
2569 | + * The size case is special, it changes the file in addition to the |
2570 | + * attributes. |
2571 | + */ |
2572 | + if (iap->ia_valid & ATTR_SIZE) { |
2573 | + err = nfsd_get_write_access(rqstp, fhp, iap); |
2574 | + if (err) |
2575 | + goto out; |
2576 | + size_change = 1; |
2577 | } |
2578 | + |
2579 | + iap->ia_valid |= ATTR_CTIME; |
2580 | + |
2581 | + if (check_guard && guardtime != inode->i_ctime.tv_sec) { |
2582 | + err = nfserr_notsync; |
2583 | + goto out_put_write_access; |
2584 | + } |
2585 | + |
2586 | + host_err = nfsd_break_lease(inode); |
2587 | + if (host_err) |
2588 | + goto out_put_write_access_nfserror; |
2589 | + |
2590 | + fh_lock(fhp); |
2591 | + host_err = notify_change(dentry, iap); |
2592 | + fh_unlock(fhp); |
2593 | + |
2594 | +out_put_write_access_nfserror: |
2595 | + err = nfserrno(host_err); |
2596 | +out_put_write_access: |
2597 | if (size_change) |
2598 | put_write_access(inode); |
2599 | if (!err) |
2600 | commit_metadata(fhp); |
2601 | out: |
2602 | return err; |
2603 | - |
2604 | -out_nfserr: |
2605 | - err = nfserrno(host_err); |
2606 | - goto out; |
2607 | } |
2608 | |
2609 | #if defined(CONFIG_NFSD_V2_ACL) || \ |
2610 | diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c |
2611 | index a5b59d92eb70..039708122038 100644 |
2612 | --- a/fs/xfs/xfs_sb.c |
2613 | +++ b/fs/xfs/xfs_sb.c |
2614 | @@ -596,6 +596,11 @@ xfs_sb_verify( |
2615 | * single bit error could clear the feature bit and unused parts of the |
2616 | * superblock are supposed to be zero. Hence a non-null crc field indicates that |
2617 | * we've potentially lost a feature bit and we should check it anyway. |
2618 | + * |
2619 | + * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the |
2620 | + * last field in V4 secondary superblocks. So for secondary superblocks, |
2621 | + * we are more forgiving, and ignore CRC failures if the primary doesn't |
2622 | + * indicate that the fs version is V5. |
2623 | */ |
2624 | static void |
2625 | xfs_sb_read_verify( |
2626 | @@ -616,8 +621,12 @@ xfs_sb_read_verify( |
2627 | |
2628 | if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), |
2629 | offsetof(struct xfs_sb, sb_crc))) { |
2630 | - error = EFSCORRUPTED; |
2631 | - goto out_error; |
2632 | + /* Only fail bad secondaries on a known V5 filesystem */ |
2633 | + if (bp->b_bn != XFS_SB_DADDR && |
2634 | + xfs_sb_version_hascrc(&mp->m_sb)) { |
2635 | + error = EFSCORRUPTED; |
2636 | + goto out_error; |
2637 | + } |
2638 | } |
2639 | } |
2640 | error = xfs_sb_verify(bp, true); |
2641 | diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h |
2642 | index e8112ae50531..7554fd410bcc 100644 |
2643 | --- a/include/linux/binfmts.h |
2644 | +++ b/include/linux/binfmts.h |
2645 | @@ -99,9 +99,6 @@ extern void setup_new_exec(struct linux_binprm * bprm); |
2646 | extern void would_dump(struct linux_binprm *, struct file *); |
2647 | |
2648 | extern int suid_dumpable; |
2649 | -#define SUID_DUMP_DISABLE 0 /* No setuid dumping */ |
2650 | -#define SUID_DUMP_USER 1 /* Dump as user of process */ |
2651 | -#define SUID_DUMP_ROOT 2 /* Dump as root */ |
2652 | |
2653 | /* Stack area protections */ |
2654 | #define EXSTACK_DEFAULT 0 /* Whatever the arch defaults to */ |
2655 | diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h |
2656 | index e36dee52f224..3859ddbecb5f 100644 |
2657 | --- a/include/linux/nfs4.h |
2658 | +++ b/include/linux/nfs4.h |
2659 | @@ -395,7 +395,7 @@ enum lock_type4 { |
2660 | #define FATTR4_WORD1_FS_LAYOUT_TYPES (1UL << 30) |
2661 | #define FATTR4_WORD2_LAYOUT_BLKSIZE (1UL << 1) |
2662 | #define FATTR4_WORD2_MDSTHRESHOLD (1UL << 4) |
2663 | -#define FATTR4_WORD2_SECURITY_LABEL (1UL << 17) |
2664 | +#define FATTR4_WORD2_SECURITY_LABEL (1UL << 16) |
2665 | |
2666 | /* MDS threshold bitmap bits */ |
2667 | #define THRESHOLD_RD (1UL << 0) |
2668 | diff --git a/include/linux/sched.h b/include/linux/sched.h |
2669 | index e27baeeda3f4..b1e963efbde8 100644 |
2670 | --- a/include/linux/sched.h |
2671 | +++ b/include/linux/sched.h |
2672 | @@ -322,6 +322,10 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) {} |
2673 | extern void set_dumpable(struct mm_struct *mm, int value); |
2674 | extern int get_dumpable(struct mm_struct *mm); |
2675 | |
2676 | +#define SUID_DUMP_DISABLE 0 /* No setuid dumping */ |
2677 | +#define SUID_DUMP_USER 1 /* Dump as user of process */ |
2678 | +#define SUID_DUMP_ROOT 2 /* Dump as root */ |
2679 | + |
2680 | /* mm flags */ |
2681 | /* dumpable bits */ |
2682 | #define MMF_DUMPABLE 0 /* core dump is permitted */ |
2683 | @@ -2474,34 +2478,98 @@ static inline int tsk_is_polling(struct task_struct *p) |
2684 | { |
2685 | return task_thread_info(p)->status & TS_POLLING; |
2686 | } |
2687 | -static inline void current_set_polling(void) |
2688 | +static inline void __current_set_polling(void) |
2689 | { |
2690 | current_thread_info()->status |= TS_POLLING; |
2691 | } |
2692 | |
2693 | -static inline void current_clr_polling(void) |
2694 | +static inline bool __must_check current_set_polling_and_test(void) |
2695 | +{ |
2696 | + __current_set_polling(); |
2697 | + |
2698 | + /* |
2699 | + * Polling state must be visible before we test NEED_RESCHED, |
2700 | + * paired by resched_task() |
2701 | + */ |
2702 | + smp_mb(); |
2703 | + |
2704 | + return unlikely(tif_need_resched()); |
2705 | +} |
2706 | + |
2707 | +static inline void __current_clr_polling(void) |
2708 | { |
2709 | current_thread_info()->status &= ~TS_POLLING; |
2710 | - smp_mb__after_clear_bit(); |
2711 | +} |
2712 | + |
2713 | +static inline bool __must_check current_clr_polling_and_test(void) |
2714 | +{ |
2715 | + __current_clr_polling(); |
2716 | + |
2717 | + /* |
2718 | + * Polling state must be visible before we test NEED_RESCHED, |
2719 | + * paired by resched_task() |
2720 | + */ |
2721 | + smp_mb(); |
2722 | + |
2723 | + return unlikely(tif_need_resched()); |
2724 | } |
2725 | #elif defined(TIF_POLLING_NRFLAG) |
2726 | static inline int tsk_is_polling(struct task_struct *p) |
2727 | { |
2728 | return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); |
2729 | } |
2730 | -static inline void current_set_polling(void) |
2731 | + |
2732 | +static inline void __current_set_polling(void) |
2733 | { |
2734 | set_thread_flag(TIF_POLLING_NRFLAG); |
2735 | } |
2736 | |
2737 | -static inline void current_clr_polling(void) |
2738 | +static inline bool __must_check current_set_polling_and_test(void) |
2739 | +{ |
2740 | + __current_set_polling(); |
2741 | + |
2742 | + /* |
2743 | + * Polling state must be visible before we test NEED_RESCHED, |
2744 | + * paired by resched_task() |
2745 | + * |
2746 | + * XXX: assumes set/clear bit are identical barrier wise. |
2747 | + */ |
2748 | + smp_mb__after_clear_bit(); |
2749 | + |
2750 | + return unlikely(tif_need_resched()); |
2751 | +} |
2752 | + |
2753 | +static inline void __current_clr_polling(void) |
2754 | { |
2755 | clear_thread_flag(TIF_POLLING_NRFLAG); |
2756 | } |
2757 | + |
2758 | +static inline bool __must_check current_clr_polling_and_test(void) |
2759 | +{ |
2760 | + __current_clr_polling(); |
2761 | + |
2762 | + /* |
2763 | + * Polling state must be visible before we test NEED_RESCHED, |
2764 | + * paired by resched_task() |
2765 | + */ |
2766 | + smp_mb__after_clear_bit(); |
2767 | + |
2768 | + return unlikely(tif_need_resched()); |
2769 | +} |
2770 | + |
2771 | #else |
2772 | static inline int tsk_is_polling(struct task_struct *p) { return 0; } |
2773 | -static inline void current_set_polling(void) { } |
2774 | -static inline void current_clr_polling(void) { } |
2775 | +static inline void __current_set_polling(void) { } |
2776 | +static inline void __current_clr_polling(void) { } |
2777 | + |
2778 | +static inline bool __must_check current_set_polling_and_test(void) |
2779 | +{ |
2780 | + return unlikely(tif_need_resched()); |
2781 | +} |
2782 | +static inline bool __must_check current_clr_polling_and_test(void) |
2783 | +{ |
2784 | + return unlikely(tif_need_resched()); |
2785 | +} |
2786 | #endif |
2787 | |
2788 | /* |
2789 | diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h |
2790 | index e7e04736802f..4ae6f32c8033 100644 |
2791 | --- a/include/linux/thread_info.h |
2792 | +++ b/include/linux/thread_info.h |
2793 | @@ -107,6 +107,8 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) |
2794 | #define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) |
2795 | #define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) |
2796 | |
2797 | +#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) |
2798 | + |
2799 | #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK |
2800 | /* |
2801 | * An arch can define its own version of set_restore_sigmask() to get the |
2802 | diff --git a/include/linux/usb.h b/include/linux/usb.h |
2803 | index 001629cd1a97..39cfa0aca91f 100644 |
2804 | --- a/include/linux/usb.h |
2805 | +++ b/include/linux/usb.h |
2806 | @@ -475,7 +475,8 @@ struct usb3_lpm_parameters { |
2807 | * @lpm_capable: device supports LPM |
2808 | * @usb2_hw_lpm_capable: device can perform USB2 hardware LPM |
2809 | * @usb2_hw_lpm_besl_capable: device can perform USB2 hardware BESL LPM |
2810 | - * @usb2_hw_lpm_enabled: USB2 hardware LPM enabled |
2811 | + * @usb2_hw_lpm_enabled: USB2 hardware LPM is enabled |
2812 | + * @usb2_hw_lpm_allowed: Userspace allows USB 2.0 LPM to be enabled |
2813 | * @usb3_lpm_enabled: USB3 hardware LPM enabled |
2814 | * @string_langid: language ID for strings |
2815 | * @product: iProduct string, if present (static) |
2816 | @@ -548,6 +549,7 @@ struct usb_device { |
2817 | unsigned usb2_hw_lpm_capable:1; |
2818 | unsigned usb2_hw_lpm_besl_capable:1; |
2819 | unsigned usb2_hw_lpm_enabled:1; |
2820 | + unsigned usb2_hw_lpm_allowed:1; |
2821 | unsigned usb3_lpm_enabled:1; |
2822 | int string_langid; |
2823 | |
2824 | diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h |
2825 | index 9031a26249b5..ae6c3b8ed2f5 100644 |
2826 | --- a/include/sound/compress_driver.h |
2827 | +++ b/include/sound/compress_driver.h |
2828 | @@ -171,4 +171,13 @@ static inline void snd_compr_fragment_elapsed(struct snd_compr_stream *stream) |
2829 | wake_up(&stream->runtime->sleep); |
2830 | } |
2831 | |
2832 | +static inline void snd_compr_drain_notify(struct snd_compr_stream *stream) |
2833 | +{ |
2834 | + if (snd_BUG_ON(!stream)) |
2835 | + return; |
2836 | + |
2837 | + stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
2838 | + wake_up(&stream->runtime->sleep); |
2839 | +} |
2840 | + |
2841 | #endif |
2842 | diff --git a/ipc/shm.c b/ipc/shm.c |
2843 | index d69739610fd4..7a51443a51d6 100644 |
2844 | --- a/ipc/shm.c |
2845 | +++ b/ipc/shm.c |
2846 | @@ -208,15 +208,18 @@ static void shm_open(struct vm_area_struct *vma) |
2847 | */ |
2848 | static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) |
2849 | { |
2850 | + struct file *shm_file; |
2851 | + |
2852 | + shm_file = shp->shm_file; |
2853 | + shp->shm_file = NULL; |
2854 | ns->shm_tot -= (shp->shm_segsz + PAGE_SIZE - 1) >> PAGE_SHIFT; |
2855 | shm_rmid(ns, shp); |
2856 | shm_unlock(shp); |
2857 | - if (!is_file_hugepages(shp->shm_file)) |
2858 | - shmem_lock(shp->shm_file, 0, shp->mlock_user); |
2859 | + if (!is_file_hugepages(shm_file)) |
2860 | + shmem_lock(shm_file, 0, shp->mlock_user); |
2861 | else if (shp->mlock_user) |
2862 | - user_shm_unlock(file_inode(shp->shm_file)->i_size, |
2863 | - shp->mlock_user); |
2864 | - fput (shp->shm_file); |
2865 | + user_shm_unlock(file_inode(shm_file)->i_size, shp->mlock_user); |
2866 | + fput(shm_file); |
2867 | ipc_rcu_putref(shp, shm_rcu_free); |
2868 | } |
2869 | |
2870 | @@ -974,15 +977,25 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) |
2871 | ipc_lock_object(&shp->shm_perm); |
2872 | if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) { |
2873 | kuid_t euid = current_euid(); |
2874 | - err = -EPERM; |
2875 | if (!uid_eq(euid, shp->shm_perm.uid) && |
2876 | - !uid_eq(euid, shp->shm_perm.cuid)) |
2877 | + !uid_eq(euid, shp->shm_perm.cuid)) { |
2878 | + err = -EPERM; |
2879 | goto out_unlock0; |
2880 | - if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) |
2881 | + } |
2882 | + if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) { |
2883 | + err = -EPERM; |
2884 | goto out_unlock0; |
2885 | + } |
2886 | } |
2887 | |
2888 | shm_file = shp->shm_file; |
2889 | + |
2890 | + /* check if shm_destroy() is tearing down shp */ |
2891 | + if (shm_file == NULL) { |
2892 | + err = -EIDRM; |
2893 | + goto out_unlock0; |
2894 | + } |
2895 | + |
2896 | if (is_file_hugepages(shm_file)) |
2897 | goto out_unlock0; |
2898 | |
2899 | @@ -1101,6 +1114,14 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, |
2900 | goto out_unlock; |
2901 | |
2902 | ipc_lock_object(&shp->shm_perm); |
2903 | + |
2904 | + /* check if shm_destroy() is tearing down shp */ |
2905 | + if (shp->shm_file == NULL) { |
2906 | + ipc_unlock_object(&shp->shm_perm); |
2907 | + err = -EIDRM; |
2908 | + goto out_unlock; |
2909 | + } |
2910 | + |
2911 | path = shp->shm_file->f_path; |
2912 | path_get(&path); |
2913 | shp->shm_nattch++; |
2914 | diff --git a/kernel/cpu/idle.c b/kernel/cpu/idle.c |
2915 | index e695c0a0bcb5..c261409500e4 100644 |
2916 | --- a/kernel/cpu/idle.c |
2917 | +++ b/kernel/cpu/idle.c |
2918 | @@ -44,7 +44,7 @@ static inline int cpu_idle_poll(void) |
2919 | rcu_idle_enter(); |
2920 | trace_cpu_idle_rcuidle(0, smp_processor_id()); |
2921 | local_irq_enable(); |
2922 | - while (!need_resched()) |
2923 | + while (!tif_need_resched()) |
2924 | cpu_relax(); |
2925 | trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); |
2926 | rcu_idle_exit(); |
2927 | @@ -92,8 +92,7 @@ static void cpu_idle_loop(void) |
2928 | if (cpu_idle_force_poll || tick_check_broadcast_expired()) { |
2929 | cpu_idle_poll(); |
2930 | } else { |
2931 | - current_clr_polling(); |
2932 | - if (!need_resched()) { |
2933 | + if (!current_clr_polling_and_test()) { |
2934 | stop_critical_timings(); |
2935 | rcu_idle_enter(); |
2936 | arch_cpu_idle(); |
2937 | @@ -103,7 +102,7 @@ static void cpu_idle_loop(void) |
2938 | } else { |
2939 | local_irq_enable(); |
2940 | } |
2941 | - current_set_polling(); |
2942 | + __current_set_polling(); |
2943 | } |
2944 | arch_cpu_idle_exit(); |
2945 | } |
2946 | @@ -129,7 +128,7 @@ void cpu_startup_entry(enum cpuhp_state state) |
2947 | */ |
2948 | boot_init_stack_canary(); |
2949 | #endif |
2950 | - current_set_polling(); |
2951 | + __current_set_polling(); |
2952 | arch_cpu_idle_prepare(); |
2953 | cpu_idle_loop(); |
2954 | } |
2955 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c |
2956 | index dd562e9aa2c8..1f4bcb3cc21c 100644 |
2957 | --- a/kernel/ptrace.c |
2958 | +++ b/kernel/ptrace.c |
2959 | @@ -257,7 +257,8 @@ ok: |
2960 | if (task->mm) |
2961 | dumpable = get_dumpable(task->mm); |
2962 | rcu_read_lock(); |
2963 | - if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { |
2964 | + if (dumpable != SUID_DUMP_USER && |
2965 | + !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { |
2966 | rcu_read_unlock(); |
2967 | return -EPERM; |
2968 | } |
2969 | diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c |
2970 | index 80c36bcf66e8..78e27e3b52ac 100644 |
2971 | --- a/kernel/trace/trace_event_perf.c |
2972 | +++ b/kernel/trace/trace_event_perf.c |
2973 | @@ -26,7 +26,7 @@ static int perf_trace_event_perm(struct ftrace_event_call *tp_event, |
2974 | { |
2975 | /* The ftrace function trace is allowed only for root. */ |
2976 | if (ftrace_event_is_function(tp_event) && |
2977 | - perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN)) |
2978 | + perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN)) |
2979 | return -EPERM; |
2980 | |
2981 | /* No tracing, just counting, so no obvious leak */ |
2982 | diff --git a/mm/slub.c b/mm/slub.c |
2983 | index c3eb3d3ca835..96f21691b67c 100644 |
2984 | --- a/mm/slub.c |
2985 | +++ b/mm/slub.c |
2986 | @@ -1217,8 +1217,8 @@ static unsigned long kmem_cache_flags(unsigned long object_size, |
2987 | /* |
2988 | * Enable debugging if selected on the kernel commandline. |
2989 | */ |
2990 | - if (slub_debug && (!slub_debug_slabs || |
2991 | - !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs)))) |
2992 | + if (slub_debug && (!slub_debug_slabs || (name && |
2993 | + !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs))))) |
2994 | flags |= slub_debug; |
2995 | |
2996 | return flags; |
2997 | diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c |
2998 | index 084656671d6e..cc24323d3045 100644 |
2999 | --- a/net/sunrpc/auth_gss/auth_gss.c |
3000 | +++ b/net/sunrpc/auth_gss/auth_gss.c |
3001 | @@ -482,6 +482,7 @@ gss_alloc_msg(struct gss_auth *gss_auth, |
3002 | switch (vers) { |
3003 | case 0: |
3004 | gss_encode_v0_msg(gss_msg); |
3005 | + break; |
3006 | default: |
3007 | gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); |
3008 | }; |
3009 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
3010 | index 77479606a971..941d19f8c999 100644 |
3011 | --- a/net/sunrpc/clnt.c |
3012 | +++ b/net/sunrpc/clnt.c |
3013 | @@ -656,14 +656,16 @@ EXPORT_SYMBOL_GPL(rpc_shutdown_client); |
3014 | /* |
3015 | * Free an RPC client |
3016 | */ |
3017 | -static void |
3018 | +static struct rpc_clnt * |
3019 | rpc_free_client(struct rpc_clnt *clnt) |
3020 | { |
3021 | + struct rpc_clnt *parent = NULL; |
3022 | + |
3023 | dprintk_rcu("RPC: destroying %s client for %s\n", |
3024 | clnt->cl_program->name, |
3025 | rcu_dereference(clnt->cl_xprt)->servername); |
3026 | if (clnt->cl_parent != clnt) |
3027 | - rpc_release_client(clnt->cl_parent); |
3028 | + parent = clnt->cl_parent; |
3029 | rpc_clnt_remove_pipedir(clnt); |
3030 | rpc_unregister_client(clnt); |
3031 | rpc_free_iostats(clnt->cl_metrics); |
3032 | @@ -672,18 +674,17 @@ rpc_free_client(struct rpc_clnt *clnt) |
3033 | rpciod_down(); |
3034 | rpc_free_clid(clnt); |
3035 | kfree(clnt); |
3036 | + return parent; |
3037 | } |
3038 | |
3039 | /* |
3040 | * Free an RPC client |
3041 | */ |
3042 | -static void |
3043 | +static struct rpc_clnt * |
3044 | rpc_free_auth(struct rpc_clnt *clnt) |
3045 | { |
3046 | - if (clnt->cl_auth == NULL) { |
3047 | - rpc_free_client(clnt); |
3048 | - return; |
3049 | - } |
3050 | + if (clnt->cl_auth == NULL) |
3051 | + return rpc_free_client(clnt); |
3052 | |
3053 | /* |
3054 | * Note: RPCSEC_GSS may need to send NULL RPC calls in order to |
3055 | @@ -694,7 +695,8 @@ rpc_free_auth(struct rpc_clnt *clnt) |
3056 | rpcauth_release(clnt->cl_auth); |
3057 | clnt->cl_auth = NULL; |
3058 | if (atomic_dec_and_test(&clnt->cl_count)) |
3059 | - rpc_free_client(clnt); |
3060 | + return rpc_free_client(clnt); |
3061 | + return NULL; |
3062 | } |
3063 | |
3064 | /* |
3065 | @@ -705,10 +707,13 @@ rpc_release_client(struct rpc_clnt *clnt) |
3066 | { |
3067 | dprintk("RPC: rpc_release_client(%p)\n", clnt); |
3068 | |
3069 | - if (list_empty(&clnt->cl_tasks)) |
3070 | - wake_up(&destroy_wait); |
3071 | - if (atomic_dec_and_test(&clnt->cl_count)) |
3072 | - rpc_free_auth(clnt); |
3073 | + do { |
3074 | + if (list_empty(&clnt->cl_tasks)) |
3075 | + wake_up(&destroy_wait); |
3076 | + if (!atomic_dec_and_test(&clnt->cl_count)) |
3077 | + break; |
3078 | + clnt = rpc_free_auth(clnt); |
3079 | + } while (clnt != NULL); |
3080 | } |
3081 | EXPORT_SYMBOL_GPL(rpc_release_client); |
3082 | |
3083 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
3084 | index ee03d35677d9..b752e1de2e7d 100644 |
3085 | --- a/net/sunrpc/xprtsock.c |
3086 | +++ b/net/sunrpc/xprtsock.c |
3087 | @@ -393,8 +393,10 @@ static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, |
3088 | return kernel_sendmsg(sock, &msg, NULL, 0, 0); |
3089 | } |
3090 | |
3091 | -static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more) |
3092 | +static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy) |
3093 | { |
3094 | + ssize_t (*do_sendpage)(struct socket *sock, struct page *page, |
3095 | + int offset, size_t size, int flags); |
3096 | struct page **ppage; |
3097 | unsigned int remainder; |
3098 | int err, sent = 0; |
3099 | @@ -403,6 +405,9 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i |
3100 | base += xdr->page_base; |
3101 | ppage = xdr->pages + (base >> PAGE_SHIFT); |
3102 | base &= ~PAGE_MASK; |
3103 | + do_sendpage = sock->ops->sendpage; |
3104 | + if (!zerocopy) |
3105 | + do_sendpage = sock_no_sendpage; |
3106 | for(;;) { |
3107 | unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); |
3108 | int flags = XS_SENDMSG_FLAGS; |
3109 | @@ -410,7 +415,7 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i |
3110 | remainder -= len; |
3111 | if (remainder != 0 || more) |
3112 | flags |= MSG_MORE; |
3113 | - err = sock->ops->sendpage(sock, *ppage, base, len, flags); |
3114 | + err = do_sendpage(sock, *ppage, base, len, flags); |
3115 | if (remainder == 0 || err != len) |
3116 | break; |
3117 | sent += err; |
3118 | @@ -431,9 +436,10 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i |
3119 | * @addrlen: UDP only -- length of destination address |
3120 | * @xdr: buffer containing this request |
3121 | * @base: starting position in the buffer |
3122 | + * @zerocopy: true if it is safe to use sendpage() |
3123 | * |
3124 | */ |
3125 | -static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base) |
3126 | +static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base, bool zerocopy) |
3127 | { |
3128 | unsigned int remainder = xdr->len - base; |
3129 | int err, sent = 0; |
3130 | @@ -461,7 +467,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, |
3131 | if (base < xdr->page_len) { |
3132 | unsigned int len = xdr->page_len - base; |
3133 | remainder -= len; |
3134 | - err = xs_send_pagedata(sock, xdr, base, remainder != 0); |
3135 | + err = xs_send_pagedata(sock, xdr, base, remainder != 0, zerocopy); |
3136 | if (remainder == 0 || err != len) |
3137 | goto out; |
3138 | sent += err; |
3139 | @@ -564,7 +570,7 @@ static int xs_local_send_request(struct rpc_task *task) |
3140 | req->rq_svec->iov_base, req->rq_svec->iov_len); |
3141 | |
3142 | status = xs_sendpages(transport->sock, NULL, 0, |
3143 | - xdr, req->rq_bytes_sent); |
3144 | + xdr, req->rq_bytes_sent, true); |
3145 | dprintk("RPC: %s(%u) = %d\n", |
3146 | __func__, xdr->len - req->rq_bytes_sent, status); |
3147 | if (likely(status >= 0)) { |
3148 | @@ -620,7 +626,7 @@ static int xs_udp_send_request(struct rpc_task *task) |
3149 | status = xs_sendpages(transport->sock, |
3150 | xs_addr(xprt), |
3151 | xprt->addrlen, xdr, |
3152 | - req->rq_bytes_sent); |
3153 | + req->rq_bytes_sent, true); |
3154 | |
3155 | dprintk("RPC: xs_udp_send_request(%u) = %d\n", |
3156 | xdr->len - req->rq_bytes_sent, status); |
3157 | @@ -693,6 +699,7 @@ static int xs_tcp_send_request(struct rpc_task *task) |
3158 | struct rpc_xprt *xprt = req->rq_xprt; |
3159 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
3160 | struct xdr_buf *xdr = &req->rq_snd_buf; |
3161 | + bool zerocopy = true; |
3162 | int status; |
3163 | |
3164 | xs_encode_stream_record_marker(&req->rq_snd_buf); |
3165 | @@ -700,13 +707,20 @@ static int xs_tcp_send_request(struct rpc_task *task) |
3166 | xs_pktdump("packet data:", |
3167 | req->rq_svec->iov_base, |
3168 | req->rq_svec->iov_len); |
3169 | + /* Don't use zero copy if this is a resend. If the RPC call |
3170 | + * completes while the socket holds a reference to the pages, |
3171 | + * then we may end up resending corrupted data. |
3172 | + */ |
3173 | + if (task->tk_flags & RPC_TASK_SENT) |
3174 | + zerocopy = false; |
3175 | |
3176 | /* Continue transmitting the packet/record. We must be careful |
3177 | * to cope with writespace callbacks arriving _after_ we have |
3178 | * called sendmsg(). */ |
3179 | while (1) { |
3180 | status = xs_sendpages(transport->sock, |
3181 | - NULL, 0, xdr, req->rq_bytes_sent); |
3182 | + NULL, 0, xdr, req->rq_bytes_sent, |
3183 | + zerocopy); |
3184 | |
3185 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", |
3186 | xdr->len - req->rq_bytes_sent, status); |
3187 | diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c |
3188 | index 399433ad614e..a9c3d3cd1990 100644 |
3189 | --- a/security/integrity/ima/ima_policy.c |
3190 | +++ b/security/integrity/ima/ima_policy.c |
3191 | @@ -73,7 +73,6 @@ static struct ima_rule_entry default_rules[] = { |
3192 | {.action = DONT_MEASURE,.fsmagic = SYSFS_MAGIC,.flags = IMA_FSMAGIC}, |
3193 | {.action = DONT_MEASURE,.fsmagic = DEBUGFS_MAGIC,.flags = IMA_FSMAGIC}, |
3194 | {.action = DONT_MEASURE,.fsmagic = TMPFS_MAGIC,.flags = IMA_FSMAGIC}, |
3195 | - {.action = DONT_MEASURE,.fsmagic = RAMFS_MAGIC,.flags = IMA_FSMAGIC}, |
3196 | {.action = DONT_MEASURE,.fsmagic = DEVPTS_SUPER_MAGIC,.flags = IMA_FSMAGIC}, |
3197 | {.action = DONT_MEASURE,.fsmagic = BINFMTFS_MAGIC,.flags = IMA_FSMAGIC}, |
3198 | {.action = DONT_MEASURE,.fsmagic = SECURITYFS_MAGIC,.flags = IMA_FSMAGIC}, |
3199 | diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c |
3200 | index bea523a5d852..d9af6387f37c 100644 |
3201 | --- a/sound/core/compress_offload.c |
3202 | +++ b/sound/core/compress_offload.c |
3203 | @@ -680,14 +680,48 @@ static int snd_compr_stop(struct snd_compr_stream *stream) |
3204 | return -EPERM; |
3205 | retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); |
3206 | if (!retval) { |
3207 | - stream->runtime->state = SNDRV_PCM_STATE_SETUP; |
3208 | - wake_up(&stream->runtime->sleep); |
3209 | + snd_compr_drain_notify(stream); |
3210 | stream->runtime->total_bytes_available = 0; |
3211 | stream->runtime->total_bytes_transferred = 0; |
3212 | } |
3213 | return retval; |
3214 | } |
3215 | |
3216 | +static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) |
3217 | +{ |
3218 | + int ret; |
3219 | + |
3220 | + /* |
3221 | + * We are called with lock held. So drop the lock while we wait for |
3222 | + * drain complete notfication from the driver |
3223 | + * |
3224 | + * It is expected that driver will notify the drain completion and then |
3225 | + * stream will be moved to SETUP state, even if draining resulted in an |
3226 | + * error. We can trigger next track after this. |
3227 | + */ |
3228 | + stream->runtime->state = SNDRV_PCM_STATE_DRAINING; |
3229 | + mutex_unlock(&stream->device->lock); |
3230 | + |
3231 | + /* we wait for drain to complete here, drain can return when |
3232 | + * interruption occurred, wait returned error or success. |
3233 | + * For the first two cases we don't do anything different here and |
3234 | + * return after waking up |
3235 | + */ |
3236 | + |
3237 | + ret = wait_event_interruptible(stream->runtime->sleep, |
3238 | + (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); |
3239 | + if (ret == -ERESTARTSYS) |
3240 | + pr_debug("wait aborted by a signal"); |
3241 | + else if (ret) |
3242 | + pr_debug("wait for drain failed with %d\n", ret); |
3243 | + |
3244 | + |
3245 | + wake_up(&stream->runtime->sleep); |
3246 | + mutex_lock(&stream->device->lock); |
3247 | + |
3248 | + return ret; |
3249 | +} |
3250 | + |
3251 | static int snd_compr_drain(struct snd_compr_stream *stream) |
3252 | { |
3253 | int retval; |
3254 | @@ -695,12 +729,15 @@ static int snd_compr_drain(struct snd_compr_stream *stream) |
3255 | if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || |
3256 | stream->runtime->state == SNDRV_PCM_STATE_SETUP) |
3257 | return -EPERM; |
3258 | + |
3259 | retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); |
3260 | - if (!retval) { |
3261 | - stream->runtime->state = SNDRV_PCM_STATE_DRAINING; |
3262 | + if (retval) { |
3263 | + pr_debug("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval); |
3264 | wake_up(&stream->runtime->sleep); |
3265 | + return retval; |
3266 | } |
3267 | - return retval; |
3268 | + |
3269 | + return snd_compress_wait_for_drain(stream); |
3270 | } |
3271 | |
3272 | static int snd_compr_next_track(struct snd_compr_stream *stream) |
3273 | @@ -736,9 +773,14 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream) |
3274 | return -EPERM; |
3275 | |
3276 | retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); |
3277 | + if (retval) { |
3278 | + pr_debug("Partial drain returned failure\n"); |
3279 | + wake_up(&stream->runtime->sleep); |
3280 | + return retval; |
3281 | + } |
3282 | |
3283 | stream->next_track = false; |
3284 | - return retval; |
3285 | + return snd_compress_wait_for_drain(stream); |
3286 | } |
3287 | |
3288 | static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) |
3289 | diff --git a/sound/drivers/pcsp/pcsp.c b/sound/drivers/pcsp/pcsp.c |
3290 | index 1c19cd7ad26e..83b8a9a9163e 100644 |
3291 | --- a/sound/drivers/pcsp/pcsp.c |
3292 | +++ b/sound/drivers/pcsp/pcsp.c |
3293 | @@ -187,8 +187,8 @@ static int pcsp_probe(struct platform_device *dev) |
3294 | static int pcsp_remove(struct platform_device *dev) |
3295 | { |
3296 | struct snd_pcsp *chip = platform_get_drvdata(dev); |
3297 | - alsa_card_pcsp_exit(chip); |
3298 | pcspkr_input_remove(chip->input_dev); |
3299 | + alsa_card_pcsp_exit(chip); |
3300 | return 0; |
3301 | } |
3302 | |
3303 | diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c |
3304 | index 81aeb934261a..0a90bd6ae232 100644 |
3305 | --- a/sound/isa/msnd/msnd_pinnacle.c |
3306 | +++ b/sound/isa/msnd/msnd_pinnacle.c |
3307 | @@ -73,9 +73,11 @@ |
3308 | #ifdef MSND_CLASSIC |
3309 | # include "msnd_classic.h" |
3310 | # define LOGNAME "msnd_classic" |
3311 | +# define DEV_NAME "msnd-classic" |
3312 | #else |
3313 | # include "msnd_pinnacle.h" |
3314 | # define LOGNAME "snd_msnd_pinnacle" |
3315 | +# define DEV_NAME "msnd-pinnacle" |
3316 | #endif |
3317 | |
3318 | static void set_default_audio_parameters(struct snd_msnd *chip) |
3319 | @@ -1067,8 +1069,6 @@ static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev) |
3320 | return 0; |
3321 | } |
3322 | |
3323 | -#define DEV_NAME "msnd-pinnacle" |
3324 | - |
3325 | static struct isa_driver snd_msnd_driver = { |
3326 | .match = snd_msnd_isa_match, |
3327 | .probe = snd_msnd_isa_probe, |
3328 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
3329 | index 748c6a941963..e938a68625ea 100644 |
3330 | --- a/sound/pci/hda/hda_codec.c |
3331 | +++ b/sound/pci/hda/hda_codec.c |
3332 | @@ -2579,9 +2579,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) |
3333 | cancel_delayed_work_sync(&codec->jackpoll_work); |
3334 | #ifdef CONFIG_PM |
3335 | cancel_delayed_work_sync(&codec->power_work); |
3336 | - codec->power_on = 0; |
3337 | - codec->power_transition = 0; |
3338 | - codec->power_jiffies = jiffies; |
3339 | flush_workqueue(bus->workq); |
3340 | #endif |
3341 | snd_hda_ctls_clear(codec); |
3342 | @@ -3991,6 +3988,10 @@ static void hda_call_codec_resume(struct hda_codec *codec) |
3343 | * in the resume / power-save sequence |
3344 | */ |
3345 | hda_keep_power_on(codec); |
3346 | + if (codec->pm_down_notified) { |
3347 | + codec->pm_down_notified = 0; |
3348 | + hda_call_pm_notify(codec->bus, true); |
3349 | + } |
3350 | hda_set_power_state(codec, AC_PWRST_D0); |
3351 | restore_shutup_pins(codec); |
3352 | hda_exec_init_verbs(codec); |
3353 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
3354 | index b7c89dff7066..3067ed4fe3b2 100644 |
3355 | --- a/sound/pci/hda/hda_generic.c |
3356 | +++ b/sound/pci/hda/hda_generic.c |
3357 | @@ -549,11 +549,15 @@ static hda_nid_t look_for_out_mute_nid(struct hda_codec *codec, |
3358 | static hda_nid_t look_for_out_vol_nid(struct hda_codec *codec, |
3359 | struct nid_path *path) |
3360 | { |
3361 | + struct hda_gen_spec *spec = codec->spec; |
3362 | int i; |
3363 | |
3364 | for (i = path->depth - 1; i >= 0; i--) { |
3365 | - if (nid_has_volume(codec, path->path[i], HDA_OUTPUT)) |
3366 | - return path->path[i]; |
3367 | + hda_nid_t nid = path->path[i]; |
3368 | + if ((spec->out_vol_mask >> nid) & 1) |
3369 | + continue; |
3370 | + if (nid_has_volume(codec, nid, HDA_OUTPUT)) |
3371 | + return nid; |
3372 | } |
3373 | return 0; |
3374 | } |
3375 | @@ -792,10 +796,10 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) |
3376 | if (spec->own_eapd_ctl || |
3377 | !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)) |
3378 | return; |
3379 | - if (codec->inv_eapd) |
3380 | - enable = !enable; |
3381 | if (spec->keep_eapd_on && !enable) |
3382 | return; |
3383 | + if (codec->inv_eapd) |
3384 | + enable = !enable; |
3385 | snd_hda_codec_update_cache(codec, pin, 0, |
3386 | AC_VERB_SET_EAPD_BTLENABLE, |
3387 | enable ? 0x02 : 0x00); |
3388 | diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h |
3389 | index 48d44026705b..7e45cb44d151 100644 |
3390 | --- a/sound/pci/hda/hda_generic.h |
3391 | +++ b/sound/pci/hda/hda_generic.h |
3392 | @@ -242,6 +242,9 @@ struct hda_gen_spec { |
3393 | /* additional mute flags (only effective with auto_mute_via_amp=1) */ |
3394 | u64 mute_bits; |
3395 | |
3396 | + /* bitmask for skipping volume controls */ |
3397 | + u64 out_vol_mask; |
3398 | + |
3399 | /* badness tables for output path evaluations */ |
3400 | const struct badness_table *main_out_badness; |
3401 | const struct badness_table *extra_out_badness; |
3402 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
3403 | index 6e61a019aa5e..a63aff2ca594 100644 |
3404 | --- a/sound/pci/hda/hda_intel.c |
3405 | +++ b/sound/pci/hda/hda_intel.c |
3406 | @@ -612,6 +612,11 @@ enum { |
3407 | #define AZX_DCAPS_INTEL_PCH \ |
3408 | (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME) |
3409 | |
3410 | +#define AZX_DCAPS_INTEL_HASWELL \ |
3411 | + (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_ALIGN_BUFSIZE | \ |
3412 | + AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME | \ |
3413 | + AZX_DCAPS_I915_POWERWELL) |
3414 | + |
3415 | /* quirks for ATI SB / AMD Hudson */ |
3416 | #define AZX_DCAPS_PRESET_ATI_SB \ |
3417 | (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \ |
3418 | @@ -3987,14 +3992,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { |
3419 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
3420 | /* Haswell */ |
3421 | { PCI_DEVICE(0x8086, 0x0a0c), |
3422 | - .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH | |
3423 | - AZX_DCAPS_I915_POWERWELL }, |
3424 | + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_HASWELL }, |
3425 | { PCI_DEVICE(0x8086, 0x0c0c), |
3426 | - .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH | |
3427 | - AZX_DCAPS_I915_POWERWELL }, |
3428 | + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_HASWELL }, |
3429 | { PCI_DEVICE(0x8086, 0x0d0c), |
3430 | - .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH | |
3431 | - AZX_DCAPS_I915_POWERWELL }, |
3432 | + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_HASWELL }, |
3433 | /* 5 Series/3400 */ |
3434 | { PCI_DEVICE(0x8086, 0x3b56), |
3435 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM }, |
3436 | diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c |
3437 | index 2aa2f579b4d6..a52d2a1a5e83 100644 |
3438 | --- a/sound/pci/hda/patch_analog.c |
3439 | +++ b/sound/pci/hda/patch_analog.c |
3440 | @@ -219,8 +219,12 @@ static int alloc_ad_spec(struct hda_codec *codec) |
3441 | static void ad_fixup_inv_jack_detect(struct hda_codec *codec, |
3442 | const struct hda_fixup *fix, int action) |
3443 | { |
3444 | - if (action == HDA_FIXUP_ACT_PRE_PROBE) |
3445 | + struct ad198x_spec *spec = codec->spec; |
3446 | + |
3447 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) { |
3448 | codec->inv_jack_detect = 1; |
3449 | + spec->gen.keep_eapd_on = 1; |
3450 | + } |
3451 | } |
3452 | |
3453 | enum { |
3454 | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c |
3455 | index 18d972501585..072755c8289c 100644 |
3456 | --- a/sound/pci/hda/patch_cirrus.c |
3457 | +++ b/sound/pci/hda/patch_cirrus.c |
3458 | @@ -597,6 +597,7 @@ static int patch_cs420x(struct hda_codec *codec) |
3459 | * Its layout is no longer compatible with CS4206/CS4207 |
3460 | */ |
3461 | enum { |
3462 | + CS4208_MAC_AUTO, |
3463 | CS4208_MBA6, |
3464 | CS4208_GPIO0, |
3465 | }; |
3466 | @@ -608,7 +609,12 @@ static const struct hda_model_fixup cs4208_models[] = { |
3467 | }; |
3468 | |
3469 | static const struct snd_pci_quirk cs4208_fixup_tbl[] = { |
3470 | - /* codec SSID */ |
3471 | + SND_PCI_QUIRK_VENDOR(0x106b, "Apple", CS4208_MAC_AUTO), |
3472 | + {} /* terminator */ |
3473 | +}; |
3474 | + |
3475 | +/* codec SSID matching */ |
3476 | +static const struct snd_pci_quirk cs4208_mac_fixup_tbl[] = { |
3477 | SND_PCI_QUIRK(0x106b, 0x7100, "MacBookAir 6,1", CS4208_MBA6), |
3478 | SND_PCI_QUIRK(0x106b, 0x7200, "MacBookAir 6,2", CS4208_MBA6), |
3479 | {} /* terminator */ |
3480 | @@ -626,6 +632,20 @@ static void cs4208_fixup_gpio0(struct hda_codec *codec, |
3481 | } |
3482 | } |
3483 | |
3484 | +static const struct hda_fixup cs4208_fixups[]; |
3485 | + |
3486 | +/* remap the fixup from codec SSID and apply it */ |
3487 | +static void cs4208_fixup_mac(struct hda_codec *codec, |
3488 | + const struct hda_fixup *fix, int action) |
3489 | +{ |
3490 | + if (action != HDA_FIXUP_ACT_PRE_PROBE) |
3491 | + return; |
3492 | + snd_hda_pick_fixup(codec, NULL, cs4208_mac_fixup_tbl, cs4208_fixups); |
3493 | + if (codec->fixup_id < 0 || codec->fixup_id == CS4208_MAC_AUTO) |
3494 | + codec->fixup_id = CS4208_GPIO0; /* default fixup */ |
3495 | + snd_hda_apply_fixup(codec, action); |
3496 | +} |
3497 | + |
3498 | static const struct hda_fixup cs4208_fixups[] = { |
3499 | [CS4208_MBA6] = { |
3500 | .type = HDA_FIXUP_PINS, |
3501 | @@ -637,6 +657,10 @@ static const struct hda_fixup cs4208_fixups[] = { |
3502 | .type = HDA_FIXUP_FUNC, |
3503 | .v.func = cs4208_fixup_gpio0, |
3504 | }, |
3505 | + [CS4208_MAC_AUTO] = { |
3506 | + .type = HDA_FIXUP_FUNC, |
3507 | + .v.func = cs4208_fixup_mac, |
3508 | + }, |
3509 | }; |
3510 | |
3511 | /* correct the 0dB offset of input pins */ |
3512 | @@ -660,6 +684,8 @@ static int patch_cs4208(struct hda_codec *codec) |
3513 | return -ENOMEM; |
3514 | |
3515 | spec->gen.automute_hook = cs_automute; |
3516 | + /* exclude NID 0x10 (HP) from output volumes due to different steps */ |
3517 | + spec->gen.out_vol_mask = 1ULL << 0x10; |
3518 | |
3519 | snd_hda_pick_fixup(codec, cs4208_models, cs4208_fixup_tbl, |
3520 | cs4208_fixups); |
3521 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
3522 | index ec68eaea0336..96f07ce56603 100644 |
3523 | --- a/sound/pci/hda/patch_conexant.c |
3524 | +++ b/sound/pci/hda/patch_conexant.c |
3525 | @@ -3568,6 +3568,8 @@ static const struct hda_codec_preset snd_hda_preset_conexant[] = { |
3526 | .patch = patch_conexant_auto }, |
3527 | { .id = 0x14f15115, .name = "CX20757", |
3528 | .patch = patch_conexant_auto }, |
3529 | + { .id = 0x14f151d7, .name = "CX20952", |
3530 | + .patch = patch_conexant_auto }, |
3531 | {} /* terminator */ |
3532 | }; |
3533 | |
3534 | @@ -3594,6 +3596,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15111"); |
3535 | MODULE_ALIAS("snd-hda-codec-id:14f15113"); |
3536 | MODULE_ALIAS("snd-hda-codec-id:14f15114"); |
3537 | MODULE_ALIAS("snd-hda-codec-id:14f15115"); |
3538 | +MODULE_ALIAS("snd-hda-codec-id:14f151d7"); |
3539 | |
3540 | MODULE_LICENSE("GPL"); |
3541 | MODULE_DESCRIPTION("Conexant HD-audio codec"); |
3542 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3543 | index 8ad554312b69..2f39631f54c8 100644 |
3544 | --- a/sound/pci/hda/patch_realtek.c |
3545 | +++ b/sound/pci/hda/patch_realtek.c |
3546 | @@ -1043,6 +1043,7 @@ enum { |
3547 | ALC880_FIXUP_UNIWILL, |
3548 | ALC880_FIXUP_UNIWILL_DIG, |
3549 | ALC880_FIXUP_Z71V, |
3550 | + ALC880_FIXUP_ASUS_W5A, |
3551 | ALC880_FIXUP_3ST_BASE, |
3552 | ALC880_FIXUP_3ST, |
3553 | ALC880_FIXUP_3ST_DIG, |
3554 | @@ -1213,6 +1214,26 @@ static const struct hda_fixup alc880_fixups[] = { |
3555 | { } |
3556 | } |
3557 | }, |
3558 | + [ALC880_FIXUP_ASUS_W5A] = { |
3559 | + .type = HDA_FIXUP_PINS, |
3560 | + .v.pins = (const struct hda_pintbl[]) { |
3561 | + /* set up the whole pins as BIOS is utterly broken */ |
3562 | + { 0x14, 0x0121411f }, /* HP */ |
3563 | + { 0x15, 0x411111f0 }, /* N/A */ |
3564 | + { 0x16, 0x411111f0 }, /* N/A */ |
3565 | + { 0x17, 0x411111f0 }, /* N/A */ |
3566 | + { 0x18, 0x90a60160 }, /* mic */ |
3567 | + { 0x19, 0x411111f0 }, /* N/A */ |
3568 | + { 0x1a, 0x411111f0 }, /* N/A */ |
3569 | + { 0x1b, 0x411111f0 }, /* N/A */ |
3570 | + { 0x1c, 0x411111f0 }, /* N/A */ |
3571 | + { 0x1d, 0x411111f0 }, /* N/A */ |
3572 | + { 0x1e, 0xb743111e }, /* SPDIF out */ |
3573 | + { } |
3574 | + }, |
3575 | + .chained = true, |
3576 | + .chain_id = ALC880_FIXUP_GPIO1, |
3577 | + }, |
3578 | [ALC880_FIXUP_3ST_BASE] = { |
3579 | .type = HDA_FIXUP_PINS, |
3580 | .v.pins = (const struct hda_pintbl[]) { |
3581 | @@ -1334,6 +1355,7 @@ static const struct hda_fixup alc880_fixups[] = { |
3582 | |
3583 | static const struct snd_pci_quirk alc880_fixup_tbl[] = { |
3584 | SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810), |
3585 | + SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A), |
3586 | SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V), |
3587 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1), |
3588 | SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2), |
3589 | @@ -1479,6 +1501,7 @@ enum { |
3590 | ALC260_FIXUP_KN1, |
3591 | ALC260_FIXUP_FSC_S7020, |
3592 | ALC260_FIXUP_FSC_S7020_JWSE, |
3593 | + ALC260_FIXUP_VAIO_PINS, |
3594 | }; |
3595 | |
3596 | static void alc260_gpio1_automute(struct hda_codec *codec) |
3597 | @@ -1619,6 +1642,24 @@ static const struct hda_fixup alc260_fixups[] = { |
3598 | .chained = true, |
3599 | .chain_id = ALC260_FIXUP_FSC_S7020, |
3600 | }, |
3601 | + [ALC260_FIXUP_VAIO_PINS] = { |
3602 | + .type = HDA_FIXUP_PINS, |
3603 | + .v.pins = (const struct hda_pintbl[]) { |
3604 | + /* Pin configs are missing completely on some VAIOs */ |
3605 | + { 0x0f, 0x01211020 }, |
3606 | + { 0x10, 0x0001003f }, |
3607 | + { 0x11, 0x411111f0 }, |
3608 | + { 0x12, 0x01a15930 }, |
3609 | + { 0x13, 0x411111f0 }, |
3610 | + { 0x14, 0x411111f0 }, |
3611 | + { 0x15, 0x411111f0 }, |
3612 | + { 0x16, 0x411111f0 }, |
3613 | + { 0x17, 0x411111f0 }, |
3614 | + { 0x18, 0x411111f0 }, |
3615 | + { 0x19, 0x411111f0 }, |
3616 | + { } |
3617 | + } |
3618 | + }, |
3619 | }; |
3620 | |
3621 | static const struct snd_pci_quirk alc260_fixup_tbl[] = { |
3622 | @@ -1627,6 +1668,8 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = { |
3623 | SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1), |
3624 | SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750), |
3625 | SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), |
3626 | + SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS), |
3627 | + SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F), |
3628 | SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020), |
3629 | SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), |
3630 | SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1), |
3631 | @@ -2388,6 +2431,7 @@ static const struct hda_verb alc268_beep_init_verbs[] = { |
3632 | enum { |
3633 | ALC268_FIXUP_INV_DMIC, |
3634 | ALC268_FIXUP_HP_EAPD, |
3635 | + ALC268_FIXUP_SPDIF, |
3636 | }; |
3637 | |
3638 | static const struct hda_fixup alc268_fixups[] = { |
3639 | @@ -2402,6 +2446,13 @@ static const struct hda_fixup alc268_fixups[] = { |
3640 | {} |
3641 | } |
3642 | }, |
3643 | + [ALC268_FIXUP_SPDIF] = { |
3644 | + .type = HDA_FIXUP_PINS, |
3645 | + .v.pins = (const struct hda_pintbl[]) { |
3646 | + { 0x1e, 0x014b1180 }, /* enable SPDIF out */ |
3647 | + {} |
3648 | + } |
3649 | + }, |
3650 | }; |
3651 | |
3652 | static const struct hda_model_fixup alc268_fixup_models[] = { |
3653 | @@ -2411,6 +2462,7 @@ static const struct hda_model_fixup alc268_fixup_models[] = { |
3654 | }; |
3655 | |
3656 | static const struct snd_pci_quirk alc268_fixup_tbl[] = { |
3657 | + SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF), |
3658 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC), |
3659 | /* below is codec SSID since multiple Toshiba laptops have the |
3660 | * same PCI SSID 1179:ff00 |
3661 | @@ -2540,6 +2592,7 @@ enum { |
3662 | ALC269_TYPE_ALC283, |
3663 | ALC269_TYPE_ALC284, |
3664 | ALC269_TYPE_ALC286, |
3665 | + ALC269_TYPE_ALC255, |
3666 | }; |
3667 | |
3668 | /* |
3669 | @@ -2565,6 +2618,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) |
3670 | case ALC269_TYPE_ALC282: |
3671 | case ALC269_TYPE_ALC283: |
3672 | case ALC269_TYPE_ALC286: |
3673 | + case ALC269_TYPE_ALC255: |
3674 | ssids = alc269_ssids; |
3675 | break; |
3676 | default: |
3677 | @@ -2944,6 +2998,23 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) |
3678 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); |
3679 | } |
3680 | |
3681 | +/* Make sure the led works even in runtime suspend */ |
3682 | +static unsigned int led_power_filter(struct hda_codec *codec, |
3683 | + hda_nid_t nid, |
3684 | + unsigned int power_state) |
3685 | +{ |
3686 | + struct alc_spec *spec = codec->spec; |
3687 | + |
3688 | + if (power_state != AC_PWRST_D3 || nid != spec->mute_led_nid) |
3689 | + return power_state; |
3690 | + |
3691 | + /* Set pin ctl again, it might have just been set to 0 */ |
3692 | + snd_hda_set_pin_ctl(codec, nid, |
3693 | + snd_hda_codec_get_pin_target(codec, nid)); |
3694 | + |
3695 | + return AC_PWRST_D0; |
3696 | +} |
3697 | + |
3698 | static void alc269_fixup_hp_mute_led(struct hda_codec *codec, |
3699 | const struct hda_fixup *fix, int action) |
3700 | { |
3701 | @@ -2963,6 +3034,7 @@ static void alc269_fixup_hp_mute_led(struct hda_codec *codec, |
3702 | spec->mute_led_nid = pin - 0x0a + 0x18; |
3703 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; |
3704 | spec->gen.vmaster_mute_enum = 1; |
3705 | + codec->power_filter = led_power_filter; |
3706 | snd_printd("Detected mute LED for %x:%d\n", spec->mute_led_nid, |
3707 | spec->mute_led_polarity); |
3708 | break; |
3709 | @@ -2978,6 +3050,7 @@ static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec, |
3710 | spec->mute_led_nid = 0x18; |
3711 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; |
3712 | spec->gen.vmaster_mute_enum = 1; |
3713 | + codec->power_filter = led_power_filter; |
3714 | } |
3715 | } |
3716 | |
3717 | @@ -2990,6 +3063,7 @@ static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec, |
3718 | spec->mute_led_nid = 0x19; |
3719 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; |
3720 | spec->gen.vmaster_mute_enum = 1; |
3721 | + codec->power_filter = led_power_filter; |
3722 | } |
3723 | } |
3724 | |
3725 | @@ -3230,8 +3304,10 @@ static void alc_update_headset_mode(struct hda_codec *codec) |
3726 | else |
3727 | new_headset_mode = ALC_HEADSET_MODE_HEADPHONE; |
3728 | |
3729 | - if (new_headset_mode == spec->current_headset_mode) |
3730 | + if (new_headset_mode == spec->current_headset_mode) { |
3731 | + snd_hda_gen_update_outputs(codec); |
3732 | return; |
3733 | + } |
3734 | |
3735 | switch (new_headset_mode) { |
3736 | case ALC_HEADSET_MODE_UNPLUGGED: |
3737 | @@ -3895,6 +3971,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
3738 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3739 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3740 | SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3741 | + SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3742 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS), |
3743 | SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
3744 | SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
3745 | @@ -4128,6 +4205,9 @@ static int patch_alc269(struct hda_codec *codec) |
3746 | case 0x10ec0286: |
3747 | spec->codec_variant = ALC269_TYPE_ALC286; |
3748 | break; |
3749 | + case 0x10ec0255: |
3750 | + spec->codec_variant = ALC269_TYPE_ALC255; |
3751 | + break; |
3752 | } |
3753 | |
3754 | if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) { |
3755 | @@ -4842,6 +4922,7 @@ static int patch_alc680(struct hda_codec *codec) |
3756 | static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
3757 | { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 }, |
3758 | { .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 }, |
3759 | + { .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 }, |
3760 | { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, |
3761 | { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, |
3762 | { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, |
3763 | diff --git a/sound/usb/6fire/chip.c b/sound/usb/6fire/chip.c |
3764 | index c39c77978468..66edc4a7917f 100644 |
3765 | --- a/sound/usb/6fire/chip.c |
3766 | +++ b/sound/usb/6fire/chip.c |
3767 | @@ -101,7 +101,7 @@ static int usb6fire_chip_probe(struct usb_interface *intf, |
3768 | usb_set_intfdata(intf, chips[i]); |
3769 | mutex_unlock(®ister_mutex); |
3770 | return 0; |
3771 | - } else if (regidx < 0) |
3772 | + } else if (!devices[i] && regidx < 0) |
3773 | regidx = i; |
3774 | } |
3775 | if (regidx < 0) { |
3776 | diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c |
3777 | index 72a130bc448a..c329c8fc57f4 100644 |
3778 | --- a/virt/kvm/iommu.c |
3779 | +++ b/virt/kvm/iommu.c |
3780 | @@ -103,6 +103,10 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) |
3781 | while ((gfn << PAGE_SHIFT) & (page_size - 1)) |
3782 | page_size >>= 1; |
3783 | |
3784 | + /* Make sure hva is aligned to the page size we want to map */ |
3785 | + while (__gfn_to_hva_memslot(slot, gfn) & (page_size - 1)) |
3786 | + page_size >>= 1; |
3787 | + |
3788 | /* |
3789 | * Pin all pages we are about to map in memory. This is |
3790 | * important because we unmap and unpin in 4kb steps later. |