Annotation of /trunk/kernel26-alx/patches-3.10/0120-3.10.21-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(hide annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 89991 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 89991 byte(s)
-3.10.84-alx-r1
1 | niro | 2672 | diff --git a/Makefile b/Makefile |
2 | index ba784b7b0f51..c0635fbab87f 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 10 | ||
8 | -SUBLEVEL = 20 | ||
9 | +SUBLEVEL = 21 | ||
10 | EXTRAVERSION = | ||
11 | NAME = TOSSUG Baby Fish | ||
12 | |||
13 | diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c | ||
14 | index 84ba67b982c0..e04613906f1b 100644 | ||
15 | --- a/arch/arm/kvm/mmu.c | ||
16 | +++ b/arch/arm/kvm/mmu.c | ||
17 | @@ -313,6 +313,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 | @@ -324,16 +335,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/cris/include/asm/io.h b/arch/cris/include/asm/io.h | ||
70 | index ac12ae2b9286..db9a16c704f3 100644 | ||
71 | --- a/arch/cris/include/asm/io.h | ||
72 | +++ b/arch/cris/include/asm/io.h | ||
73 | @@ -3,6 +3,7 @@ | ||
74 | |||
75 | #include <asm/page.h> /* for __va, __pa */ | ||
76 | #include <arch/io.h> | ||
77 | +#include <asm-generic/iomap.h> | ||
78 | #include <linux/kernel.h> | ||
79 | |||
80 | struct cris_io_operations | ||
81 | diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h | ||
82 | index e0a899a1a8a6..5a84b3a50741 100644 | ||
83 | --- a/arch/ia64/include/asm/processor.h | ||
84 | +++ b/arch/ia64/include/asm/processor.h | ||
85 | @@ -319,7 +319,7 @@ struct thread_struct { | ||
86 | regs->loadrs = 0; \ | ||
87 | regs->r8 = get_dumpable(current->mm); /* set "don't zap registers" flag */ \ | ||
88 | regs->r12 = new_sp - 16; /* allocate 16 byte scratch area */ \ | ||
89 | - if (unlikely(!get_dumpable(current->mm))) { \ | ||
90 | + if (unlikely(get_dumpable(current->mm) != SUID_DUMP_USER)) { \ | ||
91 | /* \ | ||
92 | * Zap scratch regs to avoid leaking bits between processes with different \ | ||
93 | * uid/privileges. \ | ||
94 | diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c | ||
95 | index 0f83122e6676..323309963cd3 100644 | ||
96 | --- a/arch/powerpc/kernel/signal_32.c | ||
97 | +++ b/arch/powerpc/kernel/signal_32.c | ||
98 | @@ -454,7 +454,15 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, | ||
99 | if (copy_vsx_to_user(&frame->mc_vsregs, current)) | ||
100 | return 1; | ||
101 | msr |= MSR_VSX; | ||
102 | - } | ||
103 | + } else if (!ctx_has_vsx_region) | ||
104 | + /* | ||
105 | + * With a small context structure we can't hold the VSX | ||
106 | + * registers, hence clear the MSR value to indicate the state | ||
107 | + * was not saved. | ||
108 | + */ | ||
109 | + msr &= ~MSR_VSX; | ||
110 | + | ||
111 | + | ||
112 | #endif /* CONFIG_VSX */ | ||
113 | #ifdef CONFIG_SPE | ||
114 | /* save spe registers */ | ||
115 | diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c | ||
116 | index 2d845d8199fc..56d2e72c85de 100644 | ||
117 | --- a/arch/powerpc/kernel/vio.c | ||
118 | +++ b/arch/powerpc/kernel/vio.c | ||
119 | @@ -1530,12 +1530,12 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | ||
120 | |||
121 | dn = dev->of_node; | ||
122 | if (!dn) { | ||
123 | - strcat(buf, "\n"); | ||
124 | + strcpy(buf, "\n"); | ||
125 | return strlen(buf); | ||
126 | } | ||
127 | cp = of_get_property(dn, "compatible", NULL); | ||
128 | if (!cp) { | ||
129 | - strcat(buf, "\n"); | ||
130 | + strcpy(buf, "\n"); | ||
131 | return strlen(buf); | ||
132 | } | ||
133 | |||
134 | diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c | ||
135 | index 3e99c149271a..7ce9cf3b6988 100644 | ||
136 | --- a/arch/powerpc/mm/slice.c | ||
137 | +++ b/arch/powerpc/mm/slice.c | ||
138 | @@ -258,7 +258,7 @@ static bool slice_scan_available(unsigned long addr, | ||
139 | slice = GET_HIGH_SLICE_INDEX(addr); | ||
140 | *boundary_addr = (slice + end) ? | ||
141 | ((slice + end) << SLICE_HIGH_SHIFT) : SLICE_LOW_TOP; | ||
142 | - return !!(available.high_slices & (1u << slice)); | ||
143 | + return !!(available.high_slices & (1ul << slice)); | ||
144 | } | ||
145 | } | ||
146 | |||
147 | diff --git a/arch/powerpc/platforms/52xx/Kconfig b/arch/powerpc/platforms/52xx/Kconfig | ||
148 | index 90f4496017e4..af54174801f7 100644 | ||
149 | --- a/arch/powerpc/platforms/52xx/Kconfig | ||
150 | +++ b/arch/powerpc/platforms/52xx/Kconfig | ||
151 | @@ -57,5 +57,5 @@ config PPC_MPC5200_BUGFIX | ||
152 | |||
153 | config PPC_MPC5200_LPBFIFO | ||
154 | tristate "MPC5200 LocalPlus bus FIFO driver" | ||
155 | - depends on PPC_MPC52xx | ||
156 | + depends on PPC_MPC52xx && PPC_BESTCOMM | ||
157 | select PPC_BESTCOMM_GEN_BD | ||
158 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c | ||
159 | index 7816beff1db8..f75607c93e8a 100644 | ||
160 | --- a/arch/powerpc/platforms/powernv/pci-ioda.c | ||
161 | +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | ||
162 | @@ -151,13 +151,23 @@ static int pnv_ioda_configure_pe(struct pnv_phb *phb, struct pnv_ioda_pe *pe) | ||
163 | rid_end = pe->rid + 1; | ||
164 | } | ||
165 | |||
166 | - /* Associate PE in PELT */ | ||
167 | + /* | ||
168 | + * Associate PE in PELT. We need add the PE into the | ||
169 | + * corresponding PELT-V as well. Otherwise, the error | ||
170 | + * originated from the PE might contribute to other | ||
171 | + * PEs. | ||
172 | + */ | ||
173 | rc = opal_pci_set_pe(phb->opal_id, pe->pe_number, pe->rid, | ||
174 | bcomp, dcomp, fcomp, OPAL_MAP_PE); | ||
175 | if (rc) { | ||
176 | pe_err(pe, "OPAL error %ld trying to setup PELT table\n", rc); | ||
177 | return -ENXIO; | ||
178 | } | ||
179 | + | ||
180 | + rc = opal_pci_set_peltv(phb->opal_id, pe->pe_number, | ||
181 | + pe->pe_number, OPAL_ADD_PE_TO_DOMAIN); | ||
182 | + if (rc) | ||
183 | + pe_warn(pe, "OPAL error %d adding self to PELTV\n", rc); | ||
184 | opal_pci_eeh_freeze_clear(phb->opal_id, pe->pe_number, | ||
185 | OPAL_EEH_ACTION_CLEAR_FREEZE_ALL); | ||
186 | |||
187 | diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c | ||
188 | index b4dbade8ca24..2e4b5be31a1b 100644 | ||
189 | --- a/arch/s390/crypto/aes_s390.c | ||
190 | +++ b/arch/s390/crypto/aes_s390.c | ||
191 | @@ -35,7 +35,6 @@ static u8 *ctrblk; | ||
192 | static char keylen_flag; | ||
193 | |||
194 | struct s390_aes_ctx { | ||
195 | - u8 iv[AES_BLOCK_SIZE]; | ||
196 | u8 key[AES_MAX_KEY_SIZE]; | ||
197 | long enc; | ||
198 | long dec; | ||
199 | @@ -441,30 +440,36 @@ static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
200 | return aes_set_key(tfm, in_key, key_len); | ||
201 | } | ||
202 | |||
203 | -static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param, | ||
204 | +static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, | ||
205 | struct blkcipher_walk *walk) | ||
206 | { | ||
207 | + struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
208 | int ret = blkcipher_walk_virt(desc, walk); | ||
209 | unsigned int nbytes = walk->nbytes; | ||
210 | + struct { | ||
211 | + u8 iv[AES_BLOCK_SIZE]; | ||
212 | + u8 key[AES_MAX_KEY_SIZE]; | ||
213 | + } param; | ||
214 | |||
215 | if (!nbytes) | ||
216 | goto out; | ||
217 | |||
218 | - memcpy(param, walk->iv, AES_BLOCK_SIZE); | ||
219 | + memcpy(param.iv, walk->iv, AES_BLOCK_SIZE); | ||
220 | + memcpy(param.key, sctx->key, sctx->key_len); | ||
221 | do { | ||
222 | /* only use complete blocks */ | ||
223 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); | ||
224 | u8 *out = walk->dst.virt.addr; | ||
225 | u8 *in = walk->src.virt.addr; | ||
226 | |||
227 | - ret = crypt_s390_kmc(func, param, out, in, n); | ||
228 | + ret = crypt_s390_kmc(func, ¶m, out, in, n); | ||
229 | if (ret < 0 || ret != n) | ||
230 | return -EIO; | ||
231 | |||
232 | nbytes &= AES_BLOCK_SIZE - 1; | ||
233 | ret = blkcipher_walk_done(desc, walk, nbytes); | ||
234 | } while ((nbytes = walk->nbytes)); | ||
235 | - memcpy(walk->iv, param, AES_BLOCK_SIZE); | ||
236 | + memcpy(walk->iv, param.iv, AES_BLOCK_SIZE); | ||
237 | |||
238 | out: | ||
239 | return ret; | ||
240 | @@ -481,7 +486,7 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, | ||
241 | return fallback_blk_enc(desc, dst, src, nbytes); | ||
242 | |||
243 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
244 | - return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); | ||
245 | + return cbc_aes_crypt(desc, sctx->enc, &walk); | ||
246 | } | ||
247 | |||
248 | static int cbc_aes_decrypt(struct blkcipher_desc *desc, | ||
249 | @@ -495,7 +500,7 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, | ||
250 | return fallback_blk_dec(desc, dst, src, nbytes); | ||
251 | |||
252 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
253 | - return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); | ||
254 | + return cbc_aes_crypt(desc, sctx->dec, &walk); | ||
255 | } | ||
256 | |||
257 | static struct crypto_alg cbc_aes_alg = { | ||
258 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c | ||
259 | index 4f977d0d25c2..14647fe09d0c 100644 | ||
260 | --- a/arch/s390/kernel/smp.c | ||
261 | +++ b/arch/s390/kernel/smp.c | ||
262 | @@ -933,7 +933,7 @@ static ssize_t show_idle_count(struct device *dev, | ||
263 | idle_count = ACCESS_ONCE(idle->idle_count); | ||
264 | if (ACCESS_ONCE(idle->clock_idle_enter)) | ||
265 | idle_count++; | ||
266 | - } while ((sequence & 1) || (idle->sequence != sequence)); | ||
267 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); | ||
268 | return sprintf(buf, "%llu\n", idle_count); | ||
269 | } | ||
270 | static DEVICE_ATTR(idle_count, 0444, show_idle_count, NULL); | ||
271 | @@ -951,7 +951,7 @@ static ssize_t show_idle_time(struct device *dev, | ||
272 | idle_time = ACCESS_ONCE(idle->idle_time); | ||
273 | idle_enter = ACCESS_ONCE(idle->clock_idle_enter); | ||
274 | idle_exit = ACCESS_ONCE(idle->clock_idle_exit); | ||
275 | - } while ((sequence & 1) || (idle->sequence != sequence)); | ||
276 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); | ||
277 | idle_time += idle_enter ? ((idle_exit ? : now) - idle_enter) : 0; | ||
278 | return sprintf(buf, "%llu\n", idle_time >> 12); | ||
279 | } | ||
280 | diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c | ||
281 | index 3fb09359eda6..737d50caa4fe 100644 | ||
282 | --- a/arch/s390/kernel/vtime.c | ||
283 | +++ b/arch/s390/kernel/vtime.c | ||
284 | @@ -190,7 +190,7 @@ cputime64_t s390_get_idle_time(int cpu) | ||
285 | sequence = ACCESS_ONCE(idle->sequence); | ||
286 | idle_enter = ACCESS_ONCE(idle->clock_idle_enter); | ||
287 | idle_exit = ACCESS_ONCE(idle->clock_idle_exit); | ||
288 | - } while ((sequence & 1) || (idle->sequence != sequence)); | ||
289 | + } while ((sequence & 1) || (ACCESS_ONCE(idle->sequence) != sequence)); | ||
290 | return idle_enter ? ((idle_exit ?: now) - idle_enter) : 0; | ||
291 | } | ||
292 | |||
293 | diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c | ||
294 | index 42a392a9fd02..d4bdd253fea7 100644 | ||
295 | --- a/arch/x86/kernel/ftrace.c | ||
296 | +++ b/arch/x86/kernel/ftrace.c | ||
297 | @@ -248,6 +248,15 @@ int ftrace_update_ftrace_func(ftrace_func_t func) | ||
298 | return ret; | ||
299 | } | ||
300 | |||
301 | +static int is_ftrace_caller(unsigned long ip) | ||
302 | +{ | ||
303 | + if (ip == (unsigned long)(&ftrace_call) || | ||
304 | + ip == (unsigned long)(&ftrace_regs_call)) | ||
305 | + return 1; | ||
306 | + | ||
307 | + return 0; | ||
308 | +} | ||
309 | + | ||
310 | /* | ||
311 | * A breakpoint was added to the code address we are about to | ||
312 | * modify, and this is the handle that will just skip over it. | ||
313 | @@ -257,10 +266,13 @@ int ftrace_update_ftrace_func(ftrace_func_t func) | ||
314 | */ | ||
315 | int ftrace_int3_handler(struct pt_regs *regs) | ||
316 | { | ||
317 | + unsigned long ip; | ||
318 | + | ||
319 | if (WARN_ON_ONCE(!regs)) | ||
320 | return 0; | ||
321 | |||
322 | - if (!ftrace_location(regs->ip - 1)) | ||
323 | + ip = regs->ip - 1; | ||
324 | + if (!ftrace_location(ip) && !is_ftrace_caller(ip)) | ||
325 | return 0; | ||
326 | |||
327 | regs->ip += MCOUNT_INSN_SIZE - 1; | ||
328 | diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c | ||
329 | index efdec7cd8e01..b516dfb411ec 100644 | ||
330 | --- a/arch/x86/kernel/microcode_amd.c | ||
331 | +++ b/arch/x86/kernel/microcode_amd.c | ||
332 | @@ -430,7 +430,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, | ||
333 | snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); | ||
334 | |||
335 | if (request_firmware(&fw, (const char *)fw_name, device)) { | ||
336 | - pr_err("failed to load file %s\n", fw_name); | ||
337 | + pr_debug("failed to load file %s\n", fw_name); | ||
338 | goto out; | ||
339 | } | ||
340 | |||
341 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c | ||
342 | index 81a5f5e8f142..59b90379cb6a 100644 | ||
343 | --- a/arch/x86/kernel/process.c | ||
344 | +++ b/arch/x86/kernel/process.c | ||
345 | @@ -391,9 +391,9 @@ static void amd_e400_idle(void) | ||
346 | * The switch back from broadcast mode needs to be | ||
347 | * called with interrupts disabled. | ||
348 | */ | ||
349 | - local_irq_disable(); | ||
350 | - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); | ||
351 | - local_irq_enable(); | ||
352 | + local_irq_disable(); | ||
353 | + clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); | ||
354 | + local_irq_enable(); | ||
355 | } else | ||
356 | default_idle(); | ||
357 | } | ||
358 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
359 | index 5953dcea752d..5484d54582ca 100644 | ||
360 | --- a/arch/x86/kvm/emulate.c | ||
361 | +++ b/arch/x86/kvm/emulate.c | ||
362 | @@ -4207,7 +4207,10 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op, | ||
363 | case OpMem8: | ||
364 | ctxt->memop.bytes = 1; | ||
365 | if (ctxt->memop.type == OP_REG) { | ||
366 | - ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, 1); | ||
367 | + int highbyte_regs = ctxt->rex_prefix == 0; | ||
368 | + | ||
369 | + ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, | ||
370 | + highbyte_regs); | ||
371 | fetch_register_operand(&ctxt->memop); | ||
372 | } | ||
373 | goto mem_common; | ||
374 | diff --git a/block/blk-core.c b/block/blk-core.c | ||
375 | index d5745b5833c9..45f3a51f6b56 100644 | ||
376 | --- a/block/blk-core.c | ||
377 | +++ b/block/blk-core.c | ||
378 | @@ -2229,6 +2229,7 @@ void blk_start_request(struct request *req) | ||
379 | if (unlikely(blk_bidi_rq(req))) | ||
380 | req->next_rq->resid_len = blk_rq_bytes(req->next_rq); | ||
381 | |||
382 | + BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); | ||
383 | blk_add_timer(req); | ||
384 | } | ||
385 | EXPORT_SYMBOL(blk_start_request); | ||
386 | diff --git a/block/blk-settings.c b/block/blk-settings.c | ||
387 | index c50ecf0ea3b1..53309333c2f0 100644 | ||
388 | --- a/block/blk-settings.c | ||
389 | +++ b/block/blk-settings.c | ||
390 | @@ -144,6 +144,7 @@ void blk_set_stacking_limits(struct queue_limits *lim) | ||
391 | lim->discard_zeroes_data = 1; | ||
392 | lim->max_segments = USHRT_MAX; | ||
393 | lim->max_hw_sectors = UINT_MAX; | ||
394 | + lim->max_segment_size = UINT_MAX; | ||
395 | lim->max_sectors = UINT_MAX; | ||
396 | lim->max_write_same_sectors = UINT_MAX; | ||
397 | } | ||
398 | diff --git a/block/blk-timeout.c b/block/blk-timeout.c | ||
399 | index 6e4744cbfb56..5a6296ef9a81 100644 | ||
400 | --- a/block/blk-timeout.c | ||
401 | +++ b/block/blk-timeout.c | ||
402 | @@ -90,8 +90,8 @@ static void blk_rq_timed_out(struct request *req) | ||
403 | __blk_complete_request(req); | ||
404 | break; | ||
405 | case BLK_EH_RESET_TIMER: | ||
406 | - blk_clear_rq_complete(req); | ||
407 | blk_add_timer(req); | ||
408 | + blk_clear_rq_complete(req); | ||
409 | break; | ||
410 | case BLK_EH_NOT_HANDLED: | ||
411 | /* | ||
412 | @@ -173,7 +173,6 @@ void blk_add_timer(struct request *req) | ||
413 | return; | ||
414 | |||
415 | BUG_ON(!list_empty(&req->timeout_list)); | ||
416 | - BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); | ||
417 | |||
418 | /* | ||
419 | * Some LLDs, like scsi, peek at the timeout to prevent a | ||
420 | diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c | ||
421 | index c0bb3778f1ae..666f1962a160 100644 | ||
422 | --- a/crypto/ansi_cprng.c | ||
423 | +++ b/crypto/ansi_cprng.c | ||
424 | @@ -230,11 +230,11 @@ remainder: | ||
425 | */ | ||
426 | if (byte_count < DEFAULT_BLK_SZ) { | ||
427 | empty_rbuf: | ||
428 | - for (; ctx->rand_data_valid < DEFAULT_BLK_SZ; | ||
429 | - ctx->rand_data_valid++) { | ||
430 | + while (ctx->rand_data_valid < DEFAULT_BLK_SZ) { | ||
431 | *ptr = ctx->rand_data[ctx->rand_data_valid]; | ||
432 | ptr++; | ||
433 | byte_count--; | ||
434 | + ctx->rand_data_valid++; | ||
435 | if (byte_count == 0) | ||
436 | goto done; | ||
437 | } | ||
438 | diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c | ||
439 | index b60c877f5906..c3241b188434 100644 | ||
440 | --- a/drivers/acpi/acpica/exoparg1.c | ||
441 | +++ b/drivers/acpi/acpica/exoparg1.c | ||
442 | @@ -963,10 +963,17 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | ||
443 | */ | ||
444 | return_desc = | ||
445 | *(operand[0]->reference.where); | ||
446 | - if (return_desc) { | ||
447 | - acpi_ut_add_reference | ||
448 | - (return_desc); | ||
449 | + if (!return_desc) { | ||
450 | + /* | ||
451 | + * Element is NULL, do not allow the dereference. | ||
452 | + * This provides compatibility with other ACPI | ||
453 | + * implementations. | ||
454 | + */ | ||
455 | + return_ACPI_STATUS | ||
456 | + (AE_AML_UNINITIALIZED_ELEMENT); | ||
457 | } | ||
458 | + | ||
459 | + acpi_ut_add_reference(return_desc); | ||
460 | break; | ||
461 | |||
462 | default: | ||
463 | @@ -991,11 +998,40 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | ||
464 | acpi_namespace_node | ||
465 | *) | ||
466 | return_desc); | ||
467 | - } | ||
468 | + if (!return_desc) { | ||
469 | + break; | ||
470 | + } | ||
471 | |||
472 | - /* Add another reference to the object! */ | ||
473 | + /* | ||
474 | + * June 2013: | ||
475 | + * buffer_fields/field_units require additional resolution | ||
476 | + */ | ||
477 | + switch (return_desc->common.type) { | ||
478 | + case ACPI_TYPE_BUFFER_FIELD: | ||
479 | + case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
480 | + case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
481 | + case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
482 | |||
483 | - acpi_ut_add_reference(return_desc); | ||
484 | + status = | ||
485 | + acpi_ex_read_data_from_field | ||
486 | + (walk_state, return_desc, | ||
487 | + &temp_desc); | ||
488 | + if (ACPI_FAILURE(status)) { | ||
489 | + goto cleanup; | ||
490 | + } | ||
491 | + | ||
492 | + return_desc = temp_desc; | ||
493 | + break; | ||
494 | + | ||
495 | + default: | ||
496 | + | ||
497 | + /* Add another reference to the object */ | ||
498 | + | ||
499 | + acpi_ut_add_reference | ||
500 | + (return_desc); | ||
501 | + break; | ||
502 | + } | ||
503 | + } | ||
504 | break; | ||
505 | |||
506 | default: | ||
507 | diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c | ||
508 | index 93c6049c2d75..b1ad39443cb6 100644 | ||
509 | --- a/drivers/acpi/acpica/exstore.c | ||
510 | +++ b/drivers/acpi/acpica/exstore.c | ||
511 | @@ -57,6 +57,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, | ||
512 | union acpi_operand_object *dest_desc, | ||
513 | struct acpi_walk_state *walk_state); | ||
514 | |||
515 | +static acpi_status | ||
516 | +acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, | ||
517 | + struct acpi_namespace_node *node, | ||
518 | + struct acpi_walk_state *walk_state); | ||
519 | + | ||
520 | /******************************************************************************* | ||
521 | * | ||
522 | * FUNCTION: acpi_ex_store | ||
523 | @@ -376,7 +381,11 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, | ||
524 | * When storing into an object the data is converted to the | ||
525 | * target object type then stored in the object. This means | ||
526 | * that the target object type (for an initialized target) will | ||
527 | - * not be changed by a store operation. | ||
528 | + * not be changed by a store operation. A copy_object can change | ||
529 | + * the target type, however. | ||
530 | + * | ||
531 | + * The implicit_conversion flag is set to NO/FALSE only when | ||
532 | + * storing to an arg_x -- as per the rules of the ACPI spec. | ||
533 | * | ||
534 | * Assumes parameters are already validated. | ||
535 | * | ||
536 | @@ -400,7 +409,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | ||
537 | target_type = acpi_ns_get_type(node); | ||
538 | target_desc = acpi_ns_get_attached_object(node); | ||
539 | |||
540 | - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n", | ||
541 | + ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n", | ||
542 | source_desc, | ||
543 | acpi_ut_get_object_type_name(source_desc), node, | ||
544 | acpi_ut_get_type_name(target_type))); | ||
545 | @@ -414,46 +423,31 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | ||
546 | return_ACPI_STATUS(status); | ||
547 | } | ||
548 | |||
549 | - /* If no implicit conversion, drop into the default case below */ | ||
550 | - | ||
551 | - if ((!implicit_conversion) || | ||
552 | - ((walk_state->opcode == AML_COPY_OP) && | ||
553 | - (target_type != ACPI_TYPE_LOCAL_REGION_FIELD) && | ||
554 | - (target_type != ACPI_TYPE_LOCAL_BANK_FIELD) && | ||
555 | - (target_type != ACPI_TYPE_LOCAL_INDEX_FIELD))) { | ||
556 | - /* | ||
557 | - * Force execution of default (no implicit conversion). Note: | ||
558 | - * copy_object does not perform an implicit conversion, as per the ACPI | ||
559 | - * spec -- except in case of region/bank/index fields -- because these | ||
560 | - * objects must retain their original type permanently. | ||
561 | - */ | ||
562 | - target_type = ACPI_TYPE_ANY; | ||
563 | - } | ||
564 | - | ||
565 | /* Do the actual store operation */ | ||
566 | |||
567 | switch (target_type) { | ||
568 | - case ACPI_TYPE_BUFFER_FIELD: | ||
569 | - case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
570 | - case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
571 | - case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
572 | - | ||
573 | - /* For fields, copy the source data to the target field. */ | ||
574 | - | ||
575 | - status = acpi_ex_write_data_to_field(source_desc, target_desc, | ||
576 | - &walk_state->result_obj); | ||
577 | - break; | ||
578 | - | ||
579 | case ACPI_TYPE_INTEGER: | ||
580 | case ACPI_TYPE_STRING: | ||
581 | case ACPI_TYPE_BUFFER: | ||
582 | |||
583 | /* | ||
584 | - * These target types are all of type Integer/String/Buffer, and | ||
585 | - * therefore support implicit conversion before the store. | ||
586 | - * | ||
587 | - * Copy and/or convert the source object to a new target object | ||
588 | + * The simple data types all support implicit source operand | ||
589 | + * conversion before the store. | ||
590 | */ | ||
591 | + | ||
592 | + if ((walk_state->opcode == AML_COPY_OP) || !implicit_conversion) { | ||
593 | + /* | ||
594 | + * However, copy_object and Stores to arg_x do not perform | ||
595 | + * an implicit conversion, as per the ACPI specification. | ||
596 | + * A direct store is performed instead. | ||
597 | + */ | ||
598 | + status = acpi_ex_store_direct_to_node(source_desc, node, | ||
599 | + walk_state); | ||
600 | + break; | ||
601 | + } | ||
602 | + | ||
603 | + /* Store with implicit source operand conversion support */ | ||
604 | + | ||
605 | status = | ||
606 | acpi_ex_store_object_to_object(source_desc, target_desc, | ||
607 | &new_desc, walk_state); | ||
608 | @@ -467,13 +461,12 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | ||
609 | * the Name's type to that of the value being stored in it. | ||
610 | * source_desc reference count is incremented by attach_object. | ||
611 | * | ||
612 | - * Note: This may change the type of the node if an explicit store | ||
613 | - * has been performed such that the node/object type has been | ||
614 | - * changed. | ||
615 | + * Note: This may change the type of the node if an explicit | ||
616 | + * store has been performed such that the node/object type | ||
617 | + * has been changed. | ||
618 | */ | ||
619 | - status = | ||
620 | - acpi_ns_attach_object(node, new_desc, | ||
621 | - new_desc->common.type); | ||
622 | + status = acpi_ns_attach_object(node, new_desc, | ||
623 | + new_desc->common.type); | ||
624 | |||
625 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
626 | "Store %s into %s via Convert/Attach\n", | ||
627 | @@ -484,38 +477,83 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, | ||
628 | } | ||
629 | break; | ||
630 | |||
631 | - default: | ||
632 | - | ||
633 | - ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
634 | - "Storing [%s] (%p) directly into node [%s] (%p)" | ||
635 | - " with no implicit conversion\n", | ||
636 | - acpi_ut_get_object_type_name(source_desc), | ||
637 | - source_desc, | ||
638 | - acpi_ut_get_object_type_name(target_desc), | ||
639 | - node)); | ||
640 | + case ACPI_TYPE_BUFFER_FIELD: | ||
641 | + case ACPI_TYPE_LOCAL_REGION_FIELD: | ||
642 | + case ACPI_TYPE_LOCAL_BANK_FIELD: | ||
643 | + case ACPI_TYPE_LOCAL_INDEX_FIELD: | ||
644 | + /* | ||
645 | + * For all fields, always write the source data to the target | ||
646 | + * field. Any required implicit source operand conversion is | ||
647 | + * performed in the function below as necessary. Note, field | ||
648 | + * objects must retain their original type permanently. | ||
649 | + */ | ||
650 | + status = acpi_ex_write_data_to_field(source_desc, target_desc, | ||
651 | + &walk_state->result_obj); | ||
652 | + break; | ||
653 | |||
654 | + default: | ||
655 | /* | ||
656 | * No conversions for all other types. Directly store a copy of | ||
657 | - * the source object. NOTE: This is a departure from the ACPI | ||
658 | - * spec, which states "If conversion is impossible, abort the | ||
659 | - * running control method". | ||
660 | + * the source object. This is the ACPI spec-defined behavior for | ||
661 | + * the copy_object operator. | ||
662 | * | ||
663 | - * This code implements "If conversion is impossible, treat the | ||
664 | - * Store operation as a CopyObject". | ||
665 | + * NOTE: For the Store operator, this is a departure from the | ||
666 | + * ACPI spec, which states "If conversion is impossible, abort | ||
667 | + * the running control method". Instead, this code implements | ||
668 | + * "If conversion is impossible, treat the Store operation as | ||
669 | + * a CopyObject". | ||
670 | */ | ||
671 | - status = | ||
672 | - acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, | ||
673 | - walk_state); | ||
674 | - if (ACPI_FAILURE(status)) { | ||
675 | - return_ACPI_STATUS(status); | ||
676 | - } | ||
677 | - | ||
678 | - status = | ||
679 | - acpi_ns_attach_object(node, new_desc, | ||
680 | - new_desc->common.type); | ||
681 | - acpi_ut_remove_reference(new_desc); | ||
682 | + status = acpi_ex_store_direct_to_node(source_desc, node, | ||
683 | + walk_state); | ||
684 | break; | ||
685 | } | ||
686 | |||
687 | return_ACPI_STATUS(status); | ||
688 | } | ||
689 | + | ||
690 | +/******************************************************************************* | ||
691 | + * | ||
692 | + * FUNCTION: acpi_ex_store_direct_to_node | ||
693 | + * | ||
694 | + * PARAMETERS: source_desc - Value to be stored | ||
695 | + * node - Named object to receive the value | ||
696 | + * walk_state - Current walk state | ||
697 | + * | ||
698 | + * RETURN: Status | ||
699 | + * | ||
700 | + * DESCRIPTION: "Store" an object directly to a node. This involves a copy | ||
701 | + * and an attach. | ||
702 | + * | ||
703 | + ******************************************************************************/ | ||
704 | + | ||
705 | +static acpi_status | ||
706 | +acpi_ex_store_direct_to_node(union acpi_operand_object *source_desc, | ||
707 | + struct acpi_namespace_node *node, | ||
708 | + struct acpi_walk_state *walk_state) | ||
709 | +{ | ||
710 | + acpi_status status; | ||
711 | + union acpi_operand_object *new_desc; | ||
712 | + | ||
713 | + ACPI_FUNCTION_TRACE(ex_store_direct_to_node); | ||
714 | + | ||
715 | + ACPI_DEBUG_PRINT((ACPI_DB_EXEC, | ||
716 | + "Storing [%s] (%p) directly into node [%s] (%p)" | ||
717 | + " with no implicit conversion\n", | ||
718 | + acpi_ut_get_object_type_name(source_desc), | ||
719 | + source_desc, acpi_ut_get_type_name(node->type), | ||
720 | + node)); | ||
721 | + | ||
722 | + /* Copy the source object to a new object */ | ||
723 | + | ||
724 | + status = | ||
725 | + acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc, walk_state); | ||
726 | + if (ACPI_FAILURE(status)) { | ||
727 | + return_ACPI_STATUS(status); | ||
728 | + } | ||
729 | + | ||
730 | + /* Attach the new object to the node */ | ||
731 | + | ||
732 | + status = acpi_ns_attach_object(node, new_desc, new_desc->common.type); | ||
733 | + acpi_ut_remove_reference(new_desc); | ||
734 | + return_ACPI_STATUS(status); | ||
735 | +} | ||
736 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c | ||
737 | index 45af90a1ec1b..1ad5a4f9e0c3 100644 | ||
738 | --- a/drivers/acpi/ec.c | ||
739 | +++ b/drivers/acpi/ec.c | ||
740 | @@ -175,9 +175,10 @@ static void start_transaction(struct acpi_ec *ec) | ||
741 | static void advance_transaction(struct acpi_ec *ec, u8 status) | ||
742 | { | ||
743 | unsigned long flags; | ||
744 | - struct transaction *t = ec->curr; | ||
745 | + struct transaction *t; | ||
746 | |||
747 | spin_lock_irqsave(&ec->lock, flags); | ||
748 | + t = ec->curr; | ||
749 | if (!t) | ||
750 | goto unlock; | ||
751 | if (t->wlen > t->wi) { | ||
752 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c | ||
753 | index e427dc516c76..e36842b9e1fa 100644 | ||
754 | --- a/drivers/acpi/pci_root.c | ||
755 | +++ b/drivers/acpi/pci_root.c | ||
756 | @@ -614,9 +614,12 @@ static void handle_root_bridge_removal(struct acpi_device *device) | ||
757 | ej_event->device = device; | ||
758 | ej_event->event = ACPI_NOTIFY_EJECT_REQUEST; | ||
759 | |||
760 | + get_device(&device->dev); | ||
761 | status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event); | ||
762 | - if (ACPI_FAILURE(status)) | ||
763 | + if (ACPI_FAILURE(status)) { | ||
764 | + put_device(&device->dev); | ||
765 | kfree(ej_event); | ||
766 | + } | ||
767 | } | ||
768 | |||
769 | static void _handle_hotplug_event_root(struct work_struct *work) | ||
770 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c | ||
771 | index eb133c77aadb..4056d3175178 100644 | ||
772 | --- a/drivers/acpi/processor_idle.c | ||
773 | +++ b/drivers/acpi/processor_idle.c | ||
774 | @@ -121,17 +121,10 @@ static struct dmi_system_id __cpuinitdata processor_power_dmi_table[] = { | ||
775 | */ | ||
776 | static void acpi_safe_halt(void) | ||
777 | { | ||
778 | - current_thread_info()->status &= ~TS_POLLING; | ||
779 | - /* | ||
780 | - * TS_POLLING-cleared state must be visible before we | ||
781 | - * test NEED_RESCHED: | ||
782 | - */ | ||
783 | - smp_mb(); | ||
784 | - if (!need_resched()) { | ||
785 | + if (!tif_need_resched()) { | ||
786 | safe_halt(); | ||
787 | local_irq_disable(); | ||
788 | } | ||
789 | - current_thread_info()->status |= TS_POLLING; | ||
790 | } | ||
791 | |||
792 | #ifdef ARCH_APICTIMER_STOPS_ON_C3 | ||
793 | @@ -739,6 +732,11 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev, | ||
794 | if (unlikely(!pr)) | ||
795 | return -EINVAL; | ||
796 | |||
797 | + if (cx->entry_method == ACPI_CSTATE_FFH) { | ||
798 | + if (current_set_polling_and_test()) | ||
799 | + return -EINVAL; | ||
800 | + } | ||
801 | + | ||
802 | lapic_timer_state_broadcast(pr, cx, 1); | ||
803 | acpi_idle_do_entry(cx); | ||
804 | |||
805 | @@ -792,18 +790,9 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | ||
806 | if (unlikely(!pr)) | ||
807 | return -EINVAL; | ||
808 | |||
809 | - if (cx->entry_method != ACPI_CSTATE_FFH) { | ||
810 | - current_thread_info()->status &= ~TS_POLLING; | ||
811 | - /* | ||
812 | - * TS_POLLING-cleared state must be visible before we test | ||
813 | - * NEED_RESCHED: | ||
814 | - */ | ||
815 | - smp_mb(); | ||
816 | - | ||
817 | - if (unlikely(need_resched())) { | ||
818 | - current_thread_info()->status |= TS_POLLING; | ||
819 | + if (cx->entry_method == ACPI_CSTATE_FFH) { | ||
820 | + if (current_set_polling_and_test()) | ||
821 | return -EINVAL; | ||
822 | - } | ||
823 | } | ||
824 | |||
825 | /* | ||
826 | @@ -821,9 +810,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | ||
827 | |||
828 | sched_clock_idle_wakeup_event(0); | ||
829 | |||
830 | - if (cx->entry_method != ACPI_CSTATE_FFH) | ||
831 | - current_thread_info()->status |= TS_POLLING; | ||
832 | - | ||
833 | lapic_timer_state_broadcast(pr, cx, 0); | ||
834 | return index; | ||
835 | } | ||
836 | @@ -860,18 +846,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | ||
837 | } | ||
838 | } | ||
839 | |||
840 | - if (cx->entry_method != ACPI_CSTATE_FFH) { | ||
841 | - current_thread_info()->status &= ~TS_POLLING; | ||
842 | - /* | ||
843 | - * TS_POLLING-cleared state must be visible before we test | ||
844 | - * NEED_RESCHED: | ||
845 | - */ | ||
846 | - smp_mb(); | ||
847 | - | ||
848 | - if (unlikely(need_resched())) { | ||
849 | - current_thread_info()->status |= TS_POLLING; | ||
850 | + if (cx->entry_method == ACPI_CSTATE_FFH) { | ||
851 | + if (current_set_polling_and_test()) | ||
852 | return -EINVAL; | ||
853 | - } | ||
854 | } | ||
855 | |||
856 | acpi_unlazy_tlb(smp_processor_id()); | ||
857 | @@ -917,9 +894,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | ||
858 | |||
859 | sched_clock_idle_wakeup_event(0); | ||
860 | |||
861 | - if (cx->entry_method != ACPI_CSTATE_FFH) | ||
862 | - current_thread_info()->status |= TS_POLLING; | ||
863 | - | ||
864 | lapic_timer_state_broadcast(pr, cx, 0); | ||
865 | return index; | ||
866 | } | ||
867 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
868 | index af658b2ff279..362f0c2aa1ea 100644 | ||
869 | --- a/drivers/acpi/scan.c | ||
870 | +++ b/drivers/acpi/scan.c | ||
871 | @@ -244,8 +244,6 @@ static void acpi_scan_bus_device_check(acpi_handle handle, u32 ost_source) | ||
872 | goto out; | ||
873 | } | ||
874 | } | ||
875 | - acpi_evaluate_hotplug_ost(handle, ost_source, | ||
876 | - ACPI_OST_SC_INSERT_IN_PROGRESS, NULL); | ||
877 | error = acpi_bus_scan(handle); | ||
878 | if (error) { | ||
879 | acpi_handle_warn(handle, "Namespace scan failure\n"); | ||
880 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c | ||
881 | index 0e4b96b62c75..055dfdfd7348 100644 | ||
882 | --- a/drivers/acpi/video.c | ||
883 | +++ b/drivers/acpi/video.c | ||
884 | @@ -846,7 +846,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) | ||
885 | for (i = 2; i < br->count; i++) | ||
886 | if (level_old == br->levels[i]) | ||
887 | break; | ||
888 | - if (i == br->count) | ||
889 | + if (i == br->count || !level) | ||
890 | level = max_level; | ||
891 | } | ||
892 | |||
893 | diff --git a/drivers/block/brd.c b/drivers/block/brd.c | ||
894 | index 9bf4371755f2..d91f1a56e861 100644 | ||
895 | --- a/drivers/block/brd.c | ||
896 | +++ b/drivers/block/brd.c | ||
897 | @@ -545,7 +545,7 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data) | ||
898 | |||
899 | mutex_lock(&brd_devices_mutex); | ||
900 | brd = brd_init_one(MINOR(dev) >> part_shift); | ||
901 | - kobj = brd ? get_disk(brd->brd_disk) : ERR_PTR(-ENOMEM); | ||
902 | + kobj = brd ? get_disk(brd->brd_disk) : NULL; | ||
903 | mutex_unlock(&brd_devices_mutex); | ||
904 | |||
905 | *part = 0; | ||
906 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c | ||
907 | index d92d50fd84b7..00559736cee4 100644 | ||
908 | --- a/drivers/block/loop.c | ||
909 | +++ b/drivers/block/loop.c | ||
910 | @@ -1741,7 +1741,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data) | ||
911 | if (err < 0) | ||
912 | err = loop_add(&lo, MINOR(dev) >> part_shift); | ||
913 | if (err < 0) | ||
914 | - kobj = ERR_PTR(err); | ||
915 | + kobj = NULL; | ||
916 | else | ||
917 | kobj = get_disk(lo->lo_disk); | ||
918 | mutex_unlock(&loop_index_mutex); | ||
919 | diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c | ||
920 | index b95159b33c39..eb760a218da4 100644 | ||
921 | --- a/drivers/firmware/dmi_scan.c | ||
922 | +++ b/drivers/firmware/dmi_scan.c | ||
923 | @@ -551,9 +551,15 @@ static bool dmi_matches(const struct dmi_system_id *dmi) | ||
924 | int s = dmi->matches[i].slot; | ||
925 | if (s == DMI_NONE) | ||
926 | break; | ||
927 | - if (dmi_ident[s] | ||
928 | - && strstr(dmi_ident[s], dmi->matches[i].substr)) | ||
929 | - continue; | ||
930 | + if (dmi_ident[s]) { | ||
931 | + if (!dmi->matches[i].exact_match && | ||
932 | + strstr(dmi_ident[s], dmi->matches[i].substr)) | ||
933 | + continue; | ||
934 | + else if (dmi->matches[i].exact_match && | ||
935 | + !strcmp(dmi_ident[s], dmi->matches[i].substr)) | ||
936 | + continue; | ||
937 | + } | ||
938 | + | ||
939 | /* No match */ | ||
940 | return false; | ||
941 | } | ||
942 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c | ||
943 | index 29412cc89c7a..f77d42f74427 100644 | ||
944 | --- a/drivers/gpu/drm/i915/intel_lvds.c | ||
945 | +++ b/drivers/gpu/drm/i915/intel_lvds.c | ||
946 | @@ -869,6 +869,30 @@ static const struct dmi_system_id intel_no_lvds[] = { | ||
947 | DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Q900"), | ||
948 | }, | ||
949 | }, | ||
950 | + { | ||
951 | + .callback = intel_no_lvds_dmi_callback, | ||
952 | + .ident = "Intel D410PT", | ||
953 | + .matches = { | ||
954 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), | ||
955 | + DMI_MATCH(DMI_BOARD_NAME, "D410PT"), | ||
956 | + }, | ||
957 | + }, | ||
958 | + { | ||
959 | + .callback = intel_no_lvds_dmi_callback, | ||
960 | + .ident = "Intel D425KT", | ||
961 | + .matches = { | ||
962 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), | ||
963 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "D425KT"), | ||
964 | + }, | ||
965 | + }, | ||
966 | + { | ||
967 | + .callback = intel_no_lvds_dmi_callback, | ||
968 | + .ident = "Intel D510MO", | ||
969 | + .matches = { | ||
970 | + DMI_MATCH(DMI_BOARD_VENDOR, "Intel"), | ||
971 | + DMI_EXACT_MATCH(DMI_BOARD_NAME, "D510MO"), | ||
972 | + }, | ||
973 | + }, | ||
974 | |||
975 | { } /* terminating entry */ | ||
976 | }; | ||
977 | diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c | ||
978 | index 373dbcc523b2..a19e7d79b847 100644 | ||
979 | --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c | ||
980 | +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c | ||
981 | @@ -36,6 +36,8 @@ nva3_hda_eld(struct nv50_disp_priv *priv, int or, u8 *data, u32 size) | ||
982 | if (data && data[0]) { | ||
983 | for (i = 0; i < size; i++) | ||
984 | nv_wr32(priv, 0x61c440 + soff, (i << 8) | data[i]); | ||
985 | + for (; i < 0x60; i++) | ||
986 | + nv_wr32(priv, 0x61c440 + soff, (i << 8)); | ||
987 | nv_mask(priv, 0x61c448 + soff, 0x80000003, 0x80000003); | ||
988 | } else | ||
989 | if (data) { | ||
990 | diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c | ||
991 | index dc57e24fc1df..717639386ced 100644 | ||
992 | --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c | ||
993 | +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c | ||
994 | @@ -41,6 +41,8 @@ nvd0_hda_eld(struct nv50_disp_priv *priv, int or, u8 *data, u32 size) | ||
995 | if (data && data[0]) { | ||
996 | for (i = 0; i < size; i++) | ||
997 | nv_wr32(priv, 0x10ec00 + soff, (i << 8) | data[i]); | ||
998 | + for (; i < 0x60; i++) | ||
999 | + nv_wr32(priv, 0x10ec00 + soff, (i << 8)); | ||
1000 | nv_mask(priv, 0x10ec10 + soff, 0x80000003, 0x80000003); | ||
1001 | } else | ||
1002 | if (data) { | ||
1003 | diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | ||
1004 | index ab1e918469a8..526b75242899 100644 | ||
1005 | --- a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | ||
1006 | +++ b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c | ||
1007 | @@ -47,14 +47,8 @@ int | ||
1008 | nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | ||
1009 | { | ||
1010 | struct nv50_disp_priv *priv = (void *)object->engine; | ||
1011 | - struct nouveau_bios *bios = nouveau_bios(priv); | ||
1012 | - const u16 type = (mthd & NV50_DISP_SOR_MTHD_TYPE) >> 12; | ||
1013 | const u8 head = (mthd & NV50_DISP_SOR_MTHD_HEAD) >> 3; | ||
1014 | - const u8 link = (mthd & NV50_DISP_SOR_MTHD_LINK) >> 2; | ||
1015 | const u8 or = (mthd & NV50_DISP_SOR_MTHD_OR); | ||
1016 | - const u16 mask = (0x0100 << head) | (0x0040 << link) | (0x0001 << or); | ||
1017 | - struct dcb_output outp; | ||
1018 | - u8 ver, hdr; | ||
1019 | u32 data; | ||
1020 | int ret = -EINVAL; | ||
1021 | |||
1022 | @@ -62,8 +56,6 @@ nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) | ||
1023 | return -EINVAL; | ||
1024 | data = *(u32 *)args; | ||
1025 | |||
1026 | - if (type && !dcb_outp_match(bios, type, mask, &ver, &hdr, &outp)) | ||
1027 | - return -ENODEV; | ||
1028 | |||
1029 | switch (mthd & ~0x3f) { | ||
1030 | case NV50_DISP_SOR_PWR: | ||
1031 | diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c | ||
1032 | index 8eeb141c85ac..74813130d211 100644 | ||
1033 | --- a/drivers/hwmon/lm90.c | ||
1034 | +++ b/drivers/hwmon/lm90.c | ||
1035 | @@ -278,7 +278,7 @@ static const struct lm90_params lm90_params[] = { | ||
1036 | [max6696] = { | ||
1037 | .flags = LM90_HAVE_EMERGENCY | ||
1038 | | LM90_HAVE_EMERGENCY_ALARM | LM90_HAVE_TEMP3, | ||
1039 | - .alert_alarms = 0x187c, | ||
1040 | + .alert_alarms = 0x1c7c, | ||
1041 | .max_convrate = 6, | ||
1042 | .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL, | ||
1043 | }, | ||
1044 | @@ -1500,19 +1500,22 @@ static void lm90_alert(struct i2c_client *client, unsigned int flag) | ||
1045 | if ((alarms & 0x7f) == 0 && (alarms2 & 0xfe) == 0) { | ||
1046 | dev_info(&client->dev, "Everything OK\n"); | ||
1047 | } else { | ||
1048 | - if (alarms & 0x61) | ||
1049 | + if ((alarms & 0x61) || (alarms2 & 0x80)) | ||
1050 | dev_warn(&client->dev, | ||
1051 | "temp%d out of range, please check!\n", 1); | ||
1052 | - if (alarms & 0x1a) | ||
1053 | + if ((alarms & 0x1a) || (alarms2 & 0x20)) | ||
1054 | dev_warn(&client->dev, | ||
1055 | "temp%d out of range, please check!\n", 2); | ||
1056 | if (alarms & 0x04) | ||
1057 | dev_warn(&client->dev, | ||
1058 | "temp%d diode open, please check!\n", 2); | ||
1059 | |||
1060 | - if (alarms2 & 0x18) | ||
1061 | + if (alarms2 & 0x5a) | ||
1062 | dev_warn(&client->dev, | ||
1063 | "temp%d out of range, please check!\n", 3); | ||
1064 | + if (alarms2 & 0x04) | ||
1065 | + dev_warn(&client->dev, | ||
1066 | + "temp%d diode open, please check!\n", 3); | ||
1067 | |||
1068 | /* | ||
1069 | * Disable ALERT# output, because these chips don't implement | ||
1070 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c | ||
1071 | index fa6964d8681a..f116d664b473 100644 | ||
1072 | --- a/drivers/idle/intel_idle.c | ||
1073 | +++ b/drivers/idle/intel_idle.c | ||
1074 | @@ -359,7 +359,7 @@ static int intel_idle(struct cpuidle_device *dev, | ||
1075 | if (!(lapic_timer_reliable_states & (1 << (cstate)))) | ||
1076 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); | ||
1077 | |||
1078 | - if (!need_resched()) { | ||
1079 | + if (!current_set_polling_and_test()) { | ||
1080 | |||
1081 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
1082 | smp_mb(); | ||
1083 | diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c | ||
1084 | index d0c6907dfd92..994ca4aff1a3 100644 | ||
1085 | --- a/drivers/misc/mei/nfc.c | ||
1086 | +++ b/drivers/misc/mei/nfc.c | ||
1087 | @@ -485,8 +485,11 @@ int mei_nfc_host_init(struct mei_device *dev) | ||
1088 | if (ndev->cl_info) | ||
1089 | return 0; | ||
1090 | |||
1091 | - cl_info = mei_cl_allocate(dev); | ||
1092 | - cl = mei_cl_allocate(dev); | ||
1093 | + ndev->cl_info = mei_cl_allocate(dev); | ||
1094 | + ndev->cl = mei_cl_allocate(dev); | ||
1095 | + | ||
1096 | + cl = ndev->cl; | ||
1097 | + cl_info = ndev->cl_info; | ||
1098 | |||
1099 | if (!cl || !cl_info) { | ||
1100 | ret = -ENOMEM; | ||
1101 | @@ -527,10 +530,9 @@ int mei_nfc_host_init(struct mei_device *dev) | ||
1102 | |||
1103 | cl->device_uuid = mei_nfc_guid; | ||
1104 | |||
1105 | + | ||
1106 | list_add_tail(&cl->device_link, &dev->device_list); | ||
1107 | |||
1108 | - ndev->cl_info = cl_info; | ||
1109 | - ndev->cl = cl; | ||
1110 | ndev->req_id = 1; | ||
1111 | |||
1112 | INIT_WORK(&ndev->init_work, mei_nfc_init); | ||
1113 | diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c | ||
1114 | index a668cd491cb3..e3fc07cf2f62 100644 | ||
1115 | --- a/drivers/net/can/c_can/c_can.c | ||
1116 | +++ b/drivers/net/can/c_can/c_can.c | ||
1117 | @@ -814,9 +814,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) | ||
1118 | msg_ctrl_save = priv->read_reg(priv, | ||
1119 | C_CAN_IFACE(MSGCTRL_REG, 0)); | ||
1120 | |||
1121 | - if (msg_ctrl_save & IF_MCONT_EOB) | ||
1122 | - return num_rx_pkts; | ||
1123 | - | ||
1124 | if (msg_ctrl_save & IF_MCONT_MSGLST) { | ||
1125 | c_can_handle_lost_msg_obj(dev, 0, msg_obj); | ||
1126 | num_rx_pkts++; | ||
1127 | @@ -824,6 +821,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) | ||
1128 | continue; | ||
1129 | } | ||
1130 | |||
1131 | + if (msg_ctrl_save & IF_MCONT_EOB) | ||
1132 | + return num_rx_pkts; | ||
1133 | + | ||
1134 | if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) | ||
1135 | continue; | ||
1136 | |||
1137 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c | ||
1138 | index 3b9546588240..4b2d5ed62b11 100644 | ||
1139 | --- a/drivers/net/can/usb/kvaser_usb.c | ||
1140 | +++ b/drivers/net/can/usb/kvaser_usb.c | ||
1141 | @@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | ||
1142 | return 0; | ||
1143 | } | ||
1144 | |||
1145 | -static void kvaser_usb_get_endpoints(const struct usb_interface *intf, | ||
1146 | - struct usb_endpoint_descriptor **in, | ||
1147 | - struct usb_endpoint_descriptor **out) | ||
1148 | +static int kvaser_usb_get_endpoints(const struct usb_interface *intf, | ||
1149 | + struct usb_endpoint_descriptor **in, | ||
1150 | + struct usb_endpoint_descriptor **out) | ||
1151 | { | ||
1152 | const struct usb_host_interface *iface_desc; | ||
1153 | struct usb_endpoint_descriptor *endpoint; | ||
1154 | @@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf, | ||
1155 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | ||
1156 | endpoint = &iface_desc->endpoint[i].desc; | ||
1157 | |||
1158 | - if (usb_endpoint_is_bulk_in(endpoint)) | ||
1159 | + if (!*in && usb_endpoint_is_bulk_in(endpoint)) | ||
1160 | *in = endpoint; | ||
1161 | |||
1162 | - if (usb_endpoint_is_bulk_out(endpoint)) | ||
1163 | + if (!*out && usb_endpoint_is_bulk_out(endpoint)) | ||
1164 | *out = endpoint; | ||
1165 | + | ||
1166 | + /* use first bulk endpoint for in and out */ | ||
1167 | + if (*in && *out) | ||
1168 | + return 0; | ||
1169 | } | ||
1170 | + | ||
1171 | + return -ENODEV; | ||
1172 | } | ||
1173 | |||
1174 | static int kvaser_usb_probe(struct usb_interface *intf, | ||
1175 | @@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
1176 | if (!dev) | ||
1177 | return -ENOMEM; | ||
1178 | |||
1179 | - kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); | ||
1180 | - if (!dev->bulk_in || !dev->bulk_out) { | ||
1181 | + err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); | ||
1182 | + if (err) { | ||
1183 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); | ||
1184 | return err; | ||
1185 | } | ||
1186 | diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c | ||
1187 | index 668dd27616a0..cc6a0a586f0b 100644 | ||
1188 | --- a/drivers/net/wireless/libertas/debugfs.c | ||
1189 | +++ b/drivers/net/wireless/libertas/debugfs.c | ||
1190 | @@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | ||
1191 | char *p2; | ||
1192 | struct debug_data *d = f->private_data; | ||
1193 | |||
1194 | - pdata = kmalloc(cnt, GFP_KERNEL); | ||
1195 | + if (cnt == 0) | ||
1196 | + return 0; | ||
1197 | + | ||
1198 | + pdata = kmalloc(cnt + 1, GFP_KERNEL); | ||
1199 | if (pdata == NULL) | ||
1200 | return 0; | ||
1201 | |||
1202 | @@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | ||
1203 | kfree(pdata); | ||
1204 | return 0; | ||
1205 | } | ||
1206 | + pdata[cnt] = '\0'; | ||
1207 | |||
1208 | p0 = pdata; | ||
1209 | for (i = 0; i < num_of_items; i++) { | ||
1210 | diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c | ||
1211 | index f281971919f5..12652d204f7e 100644 | ||
1212 | --- a/drivers/net/wireless/rt2x00/rt2800lib.c | ||
1213 | +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | ||
1214 | @@ -3400,10 +3400,13 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual, | ||
1215 | |||
1216 | vgc = rt2800_get_default_vgc(rt2x00dev); | ||
1217 | |||
1218 | - if (rt2x00_rt(rt2x00dev, RT5592) && qual->rssi > -65) | ||
1219 | - vgc += 0x20; | ||
1220 | - else if (qual->rssi > -80) | ||
1221 | - vgc += 0x10; | ||
1222 | + if (rt2x00_rt(rt2x00dev, RT5592)) { | ||
1223 | + if (qual->rssi > -65) | ||
1224 | + vgc += 0x20; | ||
1225 | + } else { | ||
1226 | + if (qual->rssi > -80) | ||
1227 | + vgc += 0x10; | ||
1228 | + } | ||
1229 | |||
1230 | rt2800_set_vgc(rt2x00dev, qual, vgc); | ||
1231 | } | ||
1232 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
1233 | index ac854d75bd6c..9ef0711a5cc1 100644 | ||
1234 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c | ||
1235 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
1236 | @@ -148,6 +148,8 @@ static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev) | ||
1237 | return false; | ||
1238 | } | ||
1239 | |||
1240 | +#define TXSTATUS_READ_INTERVAL 1000000 | ||
1241 | + | ||
1242 | static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, | ||
1243 | int urb_status, u32 tx_status) | ||
1244 | { | ||
1245 | @@ -176,8 +178,9 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, | ||
1246 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); | ||
1247 | |||
1248 | if (rt2800usb_txstatus_pending(rt2x00dev)) { | ||
1249 | - /* Read register after 250 us */ | ||
1250 | - hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000), | ||
1251 | + /* Read register after 1 ms */ | ||
1252 | + hrtimer_start(&rt2x00dev->txstatus_timer, | ||
1253 | + ktime_set(0, TXSTATUS_READ_INTERVAL), | ||
1254 | HRTIMER_MODE_REL); | ||
1255 | return false; | ||
1256 | } | ||
1257 | @@ -202,8 +205,9 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev) | ||
1258 | if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) | ||
1259 | return; | ||
1260 | |||
1261 | - /* Read TX_STA_FIFO register after 500 us */ | ||
1262 | - hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000), | ||
1263 | + /* Read TX_STA_FIFO register after 2 ms */ | ||
1264 | + hrtimer_start(&rt2x00dev->txstatus_timer, | ||
1265 | + ktime_set(0, 2*TXSTATUS_READ_INTERVAL), | ||
1266 | HRTIMER_MODE_REL); | ||
1267 | } | ||
1268 | |||
1269 | diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
1270 | index 90dc14336980..a2889d1cfe37 100644 | ||
1271 | --- a/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
1272 | +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
1273 | @@ -181,6 +181,7 @@ static void rt2x00lib_autowakeup(struct work_struct *work) | ||
1274 | static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac, | ||
1275 | struct ieee80211_vif *vif) | ||
1276 | { | ||
1277 | + struct ieee80211_tx_control control = {}; | ||
1278 | struct rt2x00_dev *rt2x00dev = data; | ||
1279 | struct sk_buff *skb; | ||
1280 | |||
1281 | @@ -195,7 +196,7 @@ static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac, | ||
1282 | */ | ||
1283 | skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif); | ||
1284 | while (skb) { | ||
1285 | - rt2x00mac_tx(rt2x00dev->hw, NULL, skb); | ||
1286 | + rt2x00mac_tx(rt2x00dev->hw, &control, skb); | ||
1287 | skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif); | ||
1288 | } | ||
1289 | } | ||
1290 | diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h | ||
1291 | index a0935987fa3a..7f40ab8e1bd8 100644 | ||
1292 | --- a/drivers/net/wireless/rt2x00/rt2x00lib.h | ||
1293 | +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | ||
1294 | @@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length); | ||
1295 | * @local: frame is not from mac80211 | ||
1296 | */ | ||
1297 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | ||
1298 | - bool local); | ||
1299 | + struct ieee80211_sta *sta, bool local); | ||
1300 | |||
1301 | /** | ||
1302 | * rt2x00queue_update_beacon - Send new beacon from mac80211 | ||
1303 | diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c | ||
1304 | index f883802f3505..f8cff1f0b6b7 100644 | ||
1305 | --- a/drivers/net/wireless/rt2x00/rt2x00mac.c | ||
1306 | +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | ||
1307 | @@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, | ||
1308 | frag_skb->data, data_length, tx_info, | ||
1309 | (struct ieee80211_rts *)(skb->data)); | ||
1310 | |||
1311 | - retval = rt2x00queue_write_tx_frame(queue, skb, true); | ||
1312 | + retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true); | ||
1313 | if (retval) { | ||
1314 | dev_kfree_skb_any(skb); | ||
1315 | rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); | ||
1316 | @@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, | ||
1317 | goto exit_fail; | ||
1318 | } | ||
1319 | |||
1320 | - if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) | ||
1321 | + if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false))) | ||
1322 | goto exit_fail; | ||
1323 | |||
1324 | /* | ||
1325 | @@ -754,6 +754,9 @@ void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop) | ||
1326 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
1327 | struct data_queue *queue; | ||
1328 | |||
1329 | + if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) | ||
1330 | + return; | ||
1331 | + | ||
1332 | tx_queue_for_each(rt2x00dev, queue) | ||
1333 | rt2x00queue_flush_queue(queue, drop); | ||
1334 | } | ||
1335 | diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c | ||
1336 | index d955741e48ff..1f17f5b64625 100644 | ||
1337 | --- a/drivers/net/wireless/rt2x00/rt2x00queue.c | ||
1338 | +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | ||
1339 | @@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry) | ||
1340 | } | ||
1341 | |||
1342 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | ||
1343 | - bool local) | ||
1344 | + struct ieee80211_sta *sta, bool local) | ||
1345 | { | ||
1346 | struct ieee80211_tx_info *tx_info; | ||
1347 | struct queue_entry *entry; | ||
1348 | @@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | ||
1349 | * after that we are free to use the skb->cb array | ||
1350 | * for our information. | ||
1351 | */ | ||
1352 | - rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, NULL); | ||
1353 | + rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, sta); | ||
1354 | |||
1355 | /* | ||
1356 | * All information is retrieved from the skb->cb array, | ||
1357 | diff --git a/drivers/pci/access.c b/drivers/pci/access.c | ||
1358 | index 1cc23661f79b..061da8c3ab4b 100644 | ||
1359 | --- a/drivers/pci/access.c | ||
1360 | +++ b/drivers/pci/access.c | ||
1361 | @@ -484,28 +484,29 @@ static inline bool pcie_cap_has_lnkctl(const struct pci_dev *dev) | ||
1362 | { | ||
1363 | int type = pci_pcie_type(dev); | ||
1364 | |||
1365 | - return pcie_cap_version(dev) > 1 || | ||
1366 | + return type == PCI_EXP_TYPE_ENDPOINT || | ||
1367 | + type == PCI_EXP_TYPE_LEG_END || | ||
1368 | type == PCI_EXP_TYPE_ROOT_PORT || | ||
1369 | - type == PCI_EXP_TYPE_ENDPOINT || | ||
1370 | - type == PCI_EXP_TYPE_LEG_END; | ||
1371 | + type == PCI_EXP_TYPE_UPSTREAM || | ||
1372 | + type == PCI_EXP_TYPE_DOWNSTREAM || | ||
1373 | + type == PCI_EXP_TYPE_PCI_BRIDGE || | ||
1374 | + type == PCI_EXP_TYPE_PCIE_BRIDGE; | ||
1375 | } | ||
1376 | |||
1377 | static inline bool pcie_cap_has_sltctl(const struct pci_dev *dev) | ||
1378 | { | ||
1379 | int type = pci_pcie_type(dev); | ||
1380 | |||
1381 | - return pcie_cap_version(dev) > 1 || | ||
1382 | - type == PCI_EXP_TYPE_ROOT_PORT || | ||
1383 | - (type == PCI_EXP_TYPE_DOWNSTREAM && | ||
1384 | - pcie_caps_reg(dev) & PCI_EXP_FLAGS_SLOT); | ||
1385 | + return (type == PCI_EXP_TYPE_ROOT_PORT || | ||
1386 | + type == PCI_EXP_TYPE_DOWNSTREAM) && | ||
1387 | + pcie_caps_reg(dev) & PCI_EXP_FLAGS_SLOT; | ||
1388 | } | ||
1389 | |||
1390 | static inline bool pcie_cap_has_rtctl(const struct pci_dev *dev) | ||
1391 | { | ||
1392 | int type = pci_pcie_type(dev); | ||
1393 | |||
1394 | - return pcie_cap_version(dev) > 1 || | ||
1395 | - type == PCI_EXP_TYPE_ROOT_PORT || | ||
1396 | + return type == PCI_EXP_TYPE_ROOT_PORT || | ||
1397 | type == PCI_EXP_TYPE_RC_EC; | ||
1398 | } | ||
1399 | |||
1400 | diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c | ||
1401 | index 1ef041bc60c8..ee6caddd978c 100644 | ||
1402 | --- a/drivers/scsi/aacraid/commctrl.c | ||
1403 | +++ b/drivers/scsi/aacraid/commctrl.c | ||
1404 | @@ -510,7 +510,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | ||
1405 | goto cleanup; | ||
1406 | } | ||
1407 | |||
1408 | - if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) { | ||
1409 | + if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) || | ||
1410 | + (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) { | ||
1411 | rcode = -EINVAL; | ||
1412 | goto cleanup; | ||
1413 | } | ||
1414 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
1415 | index c8b9fa0e9275..1424a8988849 100644 | ||
1416 | --- a/drivers/usb/core/hub.c | ||
1417 | +++ b/drivers/usb/core/hub.c | ||
1418 | @@ -1129,6 +1129,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | ||
1419 | usb_clear_port_feature(hub->hdev, port1, | ||
1420 | USB_PORT_FEAT_C_ENABLE); | ||
1421 | } | ||
1422 | + if (portchange & USB_PORT_STAT_C_RESET) { | ||
1423 | + need_debounce_delay = true; | ||
1424 | + usb_clear_port_feature(hub->hdev, port1, | ||
1425 | + USB_PORT_FEAT_C_RESET); | ||
1426 | + } | ||
1427 | if ((portchange & USB_PORT_STAT_C_BH_RESET) && | ||
1428 | hub_is_superspeed(hub->hdev)) { | ||
1429 | need_debounce_delay = true; | ||
1430 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c | ||
1431 | index 2c1749da1f7e..8b3d0abe7e14 100644 | ||
1432 | --- a/drivers/usb/serial/mos7840.c | ||
1433 | +++ b/drivers/usb/serial/mos7840.c | ||
1434 | @@ -1593,7 +1593,11 @@ static int mos7840_tiocmget(struct tty_struct *tty) | ||
1435 | return -ENODEV; | ||
1436 | |||
1437 | status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr); | ||
1438 | + if (status != 1) | ||
1439 | + return -EIO; | ||
1440 | status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr); | ||
1441 | + if (status != 1) | ||
1442 | + return -EIO; | ||
1443 | result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) | ||
1444 | | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) | ||
1445 | | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0) | ||
1446 | diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c | ||
1447 | index 7aabc6ad4e9b..fa38d076697d 100644 | ||
1448 | --- a/fs/configfs/dir.c | ||
1449 | +++ b/fs/configfs/dir.c | ||
1450 | @@ -56,10 +56,19 @@ static void configfs_d_iput(struct dentry * dentry, | ||
1451 | struct configfs_dirent *sd = dentry->d_fsdata; | ||
1452 | |||
1453 | if (sd) { | ||
1454 | - BUG_ON(sd->s_dentry != dentry); | ||
1455 | /* Coordinate with configfs_readdir */ | ||
1456 | spin_lock(&configfs_dirent_lock); | ||
1457 | - sd->s_dentry = NULL; | ||
1458 | + /* Coordinate with configfs_attach_attr where will increase | ||
1459 | + * sd->s_count and update sd->s_dentry to new allocated one. | ||
1460 | + * Only set sd->dentry to null when this dentry is the only | ||
1461 | + * sd owner. | ||
1462 | + * If not do so, configfs_d_iput may run just after | ||
1463 | + * configfs_attach_attr and set sd->s_dentry to null | ||
1464 | + * even it's still in use. | ||
1465 | + */ | ||
1466 | + if (atomic_read(&sd->s_count) <= 2) | ||
1467 | + sd->s_dentry = NULL; | ||
1468 | + | ||
1469 | spin_unlock(&configfs_dirent_lock); | ||
1470 | configfs_put(sd); | ||
1471 | } | ||
1472 | @@ -426,8 +435,11 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den | ||
1473 | struct configfs_attribute * attr = sd->s_element; | ||
1474 | int error; | ||
1475 | |||
1476 | + spin_lock(&configfs_dirent_lock); | ||
1477 | dentry->d_fsdata = configfs_get(sd); | ||
1478 | sd->s_dentry = dentry; | ||
1479 | + spin_unlock(&configfs_dirent_lock); | ||
1480 | + | ||
1481 | error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG, | ||
1482 | configfs_init_file); | ||
1483 | if (error) { | ||
1484 | diff --git a/fs/exec.c b/fs/exec.c | ||
1485 | index 1f446705636b..bb60cda5ee30 100644 | ||
1486 | --- a/fs/exec.c | ||
1487 | +++ b/fs/exec.c | ||
1488 | @@ -1669,6 +1669,12 @@ int __get_dumpable(unsigned long mm_flags) | ||
1489 | return (ret > SUID_DUMP_USER) ? SUID_DUMP_ROOT : ret; | ||
1490 | } | ||
1491 | |||
1492 | +/* | ||
1493 | + * This returns the actual value of the suid_dumpable flag. For things | ||
1494 | + * that are using this for checking for privilege transitions, it must | ||
1495 | + * test against SUID_DUMP_USER rather than treating it as a boolean | ||
1496 | + * value. | ||
1497 | + */ | ||
1498 | int get_dumpable(struct mm_struct *mm) | ||
1499 | { | ||
1500 | return __get_dumpable(mm->flags); | ||
1501 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
1502 | index d7ba5616989c..e78b8c2656ee 100644 | ||
1503 | --- a/fs/nfs/nfs4proc.c | ||
1504 | +++ b/fs/nfs/nfs4proc.c | ||
1505 | @@ -1160,29 +1160,24 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) | ||
1506 | int ret; | ||
1507 | |||
1508 | if (!data->rpc_done) { | ||
1509 | - ret = data->rpc_status; | ||
1510 | - goto err; | ||
1511 | + if (data->rpc_status) { | ||
1512 | + ret = data->rpc_status; | ||
1513 | + goto err; | ||
1514 | + } | ||
1515 | + /* cached opens have already been processed */ | ||
1516 | + goto update; | ||
1517 | } | ||
1518 | |||
1519 | - ret = -ESTALE; | ||
1520 | - if (!(data->f_attr.valid & NFS_ATTR_FATTR_TYPE) || | ||
1521 | - !(data->f_attr.valid & NFS_ATTR_FATTR_FILEID) || | ||
1522 | - !(data->f_attr.valid & NFS_ATTR_FATTR_CHANGE)) | ||
1523 | - goto err; | ||
1524 | - | ||
1525 | - ret = -ENOMEM; | ||
1526 | - state = nfs4_get_open_state(inode, data->owner); | ||
1527 | - if (state == NULL) | ||
1528 | - goto err; | ||
1529 | - | ||
1530 | ret = nfs_refresh_inode(inode, &data->f_attr); | ||
1531 | if (ret) | ||
1532 | goto err; | ||
1533 | |||
1534 | if (data->o_res.delegation_type != 0) | ||
1535 | nfs4_opendata_check_deleg(data, state); | ||
1536 | +update: | ||
1537 | update_open_stateid(state, &data->o_res.stateid, NULL, | ||
1538 | data->o_arg.fmode); | ||
1539 | + atomic_inc(&state->count); | ||
1540 | |||
1541 | return state; | ||
1542 | err: | ||
1543 | @@ -4572,6 +4567,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock | ||
1544 | status = 0; | ||
1545 | } | ||
1546 | request->fl_ops->fl_release_private(request); | ||
1547 | + request->fl_ops = NULL; | ||
1548 | out: | ||
1549 | return status; | ||
1550 | } | ||
1551 | diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c | ||
1552 | index 5f38ea36e266..af51cf9bf2e3 100644 | ||
1553 | --- a/fs/nfsd/export.c | ||
1554 | +++ b/fs/nfsd/export.c | ||
1555 | @@ -536,16 +536,12 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) | ||
1556 | if (err) | ||
1557 | goto out3; | ||
1558 | exp.ex_anon_uid= make_kuid(&init_user_ns, an_int); | ||
1559 | - if (!uid_valid(exp.ex_anon_uid)) | ||
1560 | - goto out3; | ||
1561 | |||
1562 | /* anon gid */ | ||
1563 | err = get_int(&mesg, &an_int); | ||
1564 | if (err) | ||
1565 | goto out3; | ||
1566 | exp.ex_anon_gid= make_kgid(&init_user_ns, an_int); | ||
1567 | - if (!gid_valid(exp.ex_anon_gid)) | ||
1568 | - goto out3; | ||
1569 | |||
1570 | /* fsid */ | ||
1571 | err = get_int(&mesg, &an_int); | ||
1572 | @@ -583,6 +579,17 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) | ||
1573 | exp.ex_uuid); | ||
1574 | if (err) | ||
1575 | goto out4; | ||
1576 | + /* | ||
1577 | + * For some reason exportfs has been passing down an | ||
1578 | + * invalid (-1) uid & gid on the "dummy" export which it | ||
1579 | + * uses to test export support. To make sure exportfs | ||
1580 | + * sees errors from check_export we therefore need to | ||
1581 | + * delay these checks till after check_export: | ||
1582 | + */ | ||
1583 | + if (!uid_valid(exp.ex_anon_uid)) | ||
1584 | + goto out4; | ||
1585 | + if (!gid_valid(exp.ex_anon_gid)) | ||
1586 | + goto out4; | ||
1587 | } | ||
1588 | |||
1589 | expp = svc_export_lookup(&exp); | ||
1590 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c | ||
1591 | index baf149a85263..62fd6616801d 100644 | ||
1592 | --- a/fs/nfsd/vfs.c | ||
1593 | +++ b/fs/nfsd/vfs.c | ||
1594 | @@ -297,41 +297,12 @@ commit_metadata(struct svc_fh *fhp) | ||
1595 | } | ||
1596 | |||
1597 | /* | ||
1598 | - * Set various file attributes. | ||
1599 | - * N.B. After this call fhp needs an fh_put | ||
1600 | + * Go over the attributes and take care of the small differences between | ||
1601 | + * NFS semantics and what Linux expects. | ||
1602 | */ | ||
1603 | -__be32 | ||
1604 | -nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
1605 | - int check_guard, time_t guardtime) | ||
1606 | +static void | ||
1607 | +nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap) | ||
1608 | { | ||
1609 | - struct dentry *dentry; | ||
1610 | - struct inode *inode; | ||
1611 | - int accmode = NFSD_MAY_SATTR; | ||
1612 | - umode_t ftype = 0; | ||
1613 | - __be32 err; | ||
1614 | - int host_err; | ||
1615 | - int size_change = 0; | ||
1616 | - | ||
1617 | - if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) | ||
1618 | - accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; | ||
1619 | - if (iap->ia_valid & ATTR_SIZE) | ||
1620 | - ftype = S_IFREG; | ||
1621 | - | ||
1622 | - /* Get inode */ | ||
1623 | - err = fh_verify(rqstp, fhp, ftype, accmode); | ||
1624 | - if (err) | ||
1625 | - goto out; | ||
1626 | - | ||
1627 | - dentry = fhp->fh_dentry; | ||
1628 | - inode = dentry->d_inode; | ||
1629 | - | ||
1630 | - /* Ignore any mode updates on symlinks */ | ||
1631 | - if (S_ISLNK(inode->i_mode)) | ||
1632 | - iap->ia_valid &= ~ATTR_MODE; | ||
1633 | - | ||
1634 | - if (!iap->ia_valid) | ||
1635 | - goto out; | ||
1636 | - | ||
1637 | /* | ||
1638 | * NFSv2 does not differentiate between "set-[ac]time-to-now" | ||
1639 | * which only requires access, and "set-[ac]time-to-X" which | ||
1640 | @@ -341,8 +312,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
1641 | * convert to "set to now" instead of "set to explicit time" | ||
1642 | * | ||
1643 | * We only call inode_change_ok as the last test as technically | ||
1644 | - * it is not an interface that we should be using. It is only | ||
1645 | - * valid if the filesystem does not define it's own i_op->setattr. | ||
1646 | + * it is not an interface that we should be using. | ||
1647 | */ | ||
1648 | #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET) | ||
1649 | #define MAX_TOUCH_TIME_ERROR (30*60) | ||
1650 | @@ -368,30 +338,6 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
1651 | iap->ia_valid &= ~BOTH_TIME_SET; | ||
1652 | } | ||
1653 | } | ||
1654 | - | ||
1655 | - /* | ||
1656 | - * The size case is special. | ||
1657 | - * It changes the file as well as the attributes. | ||
1658 | - */ | ||
1659 | - if (iap->ia_valid & ATTR_SIZE) { | ||
1660 | - if (iap->ia_size < inode->i_size) { | ||
1661 | - err = nfsd_permission(rqstp, fhp->fh_export, dentry, | ||
1662 | - NFSD_MAY_TRUNC|NFSD_MAY_OWNER_OVERRIDE); | ||
1663 | - if (err) | ||
1664 | - goto out; | ||
1665 | - } | ||
1666 | - | ||
1667 | - host_err = get_write_access(inode); | ||
1668 | - if (host_err) | ||
1669 | - goto out_nfserr; | ||
1670 | - | ||
1671 | - size_change = 1; | ||
1672 | - host_err = locks_verify_truncate(inode, NULL, iap->ia_size); | ||
1673 | - if (host_err) { | ||
1674 | - put_write_access(inode); | ||
1675 | - goto out_nfserr; | ||
1676 | - } | ||
1677 | - } | ||
1678 | |||
1679 | /* sanitize the mode change */ | ||
1680 | if (iap->ia_valid & ATTR_MODE) { | ||
1681 | @@ -414,32 +360,111 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
1682 | iap->ia_valid |= (ATTR_KILL_SUID | ATTR_KILL_SGID); | ||
1683 | } | ||
1684 | } | ||
1685 | +} | ||
1686 | |||
1687 | - /* Change the attributes. */ | ||
1688 | +static __be32 | ||
1689 | +nfsd_get_write_access(struct svc_rqst *rqstp, struct svc_fh *fhp, | ||
1690 | + struct iattr *iap) | ||
1691 | +{ | ||
1692 | + struct inode *inode = fhp->fh_dentry->d_inode; | ||
1693 | + int host_err; | ||
1694 | |||
1695 | - iap->ia_valid |= ATTR_CTIME; | ||
1696 | + if (iap->ia_size < inode->i_size) { | ||
1697 | + __be32 err; | ||
1698 | |||
1699 | - err = nfserr_notsync; | ||
1700 | - if (!check_guard || guardtime == inode->i_ctime.tv_sec) { | ||
1701 | - host_err = nfsd_break_lease(inode); | ||
1702 | - if (host_err) | ||
1703 | - goto out_nfserr; | ||
1704 | - fh_lock(fhp); | ||
1705 | + err = nfsd_permission(rqstp, fhp->fh_export, fhp->fh_dentry, | ||
1706 | + NFSD_MAY_TRUNC | NFSD_MAY_OWNER_OVERRIDE); | ||
1707 | + if (err) | ||
1708 | + return err; | ||
1709 | + } | ||
1710 | |||
1711 | - host_err = notify_change(dentry, iap); | ||
1712 | - err = nfserrno(host_err); | ||
1713 | - fh_unlock(fhp); | ||
1714 | + host_err = get_write_access(inode); | ||
1715 | + if (host_err) | ||
1716 | + goto out_nfserrno; | ||
1717 | + | ||
1718 | + host_err = locks_verify_truncate(inode, NULL, iap->ia_size); | ||
1719 | + if (host_err) | ||
1720 | + goto out_put_write_access; | ||
1721 | + return 0; | ||
1722 | + | ||
1723 | +out_put_write_access: | ||
1724 | + put_write_access(inode); | ||
1725 | +out_nfserrno: | ||
1726 | + return nfserrno(host_err); | ||
1727 | +} | ||
1728 | + | ||
1729 | +/* | ||
1730 | + * Set various file attributes. After this call fhp needs an fh_put. | ||
1731 | + */ | ||
1732 | +__be32 | ||
1733 | +nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | ||
1734 | + int check_guard, time_t guardtime) | ||
1735 | +{ | ||
1736 | + struct dentry *dentry; | ||
1737 | + struct inode *inode; | ||
1738 | + int accmode = NFSD_MAY_SATTR; | ||
1739 | + umode_t ftype = 0; | ||
1740 | + __be32 err; | ||
1741 | + int host_err; | ||
1742 | + int size_change = 0; | ||
1743 | + | ||
1744 | + if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) | ||
1745 | + accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE; | ||
1746 | + if (iap->ia_valid & ATTR_SIZE) | ||
1747 | + ftype = S_IFREG; | ||
1748 | + | ||
1749 | + /* Get inode */ | ||
1750 | + err = fh_verify(rqstp, fhp, ftype, accmode); | ||
1751 | + if (err) | ||
1752 | + goto out; | ||
1753 | + | ||
1754 | + dentry = fhp->fh_dentry; | ||
1755 | + inode = dentry->d_inode; | ||
1756 | + | ||
1757 | + /* Ignore any mode updates on symlinks */ | ||
1758 | + if (S_ISLNK(inode->i_mode)) | ||
1759 | + iap->ia_valid &= ~ATTR_MODE; | ||
1760 | + | ||
1761 | + if (!iap->ia_valid) | ||
1762 | + goto out; | ||
1763 | + | ||
1764 | + nfsd_sanitize_attrs(inode, iap); | ||
1765 | + | ||
1766 | + /* | ||
1767 | + * The size case is special, it changes the file in addition to the | ||
1768 | + * attributes. | ||
1769 | + */ | ||
1770 | + if (iap->ia_valid & ATTR_SIZE) { | ||
1771 | + err = nfsd_get_write_access(rqstp, fhp, iap); | ||
1772 | + if (err) | ||
1773 | + goto out; | ||
1774 | + size_change = 1; | ||
1775 | } | ||
1776 | + | ||
1777 | + iap->ia_valid |= ATTR_CTIME; | ||
1778 | + | ||
1779 | + if (check_guard && guardtime != inode->i_ctime.tv_sec) { | ||
1780 | + err = nfserr_notsync; | ||
1781 | + goto out_put_write_access; | ||
1782 | + } | ||
1783 | + | ||
1784 | + host_err = nfsd_break_lease(inode); | ||
1785 | + if (host_err) | ||
1786 | + goto out_put_write_access_nfserror; | ||
1787 | + | ||
1788 | + fh_lock(fhp); | ||
1789 | + host_err = notify_change(dentry, iap); | ||
1790 | + fh_unlock(fhp); | ||
1791 | + | ||
1792 | +out_put_write_access_nfserror: | ||
1793 | + err = nfserrno(host_err); | ||
1794 | +out_put_write_access: | ||
1795 | if (size_change) | ||
1796 | put_write_access(inode); | ||
1797 | if (!err) | ||
1798 | commit_metadata(fhp); | ||
1799 | out: | ||
1800 | return err; | ||
1801 | - | ||
1802 | -out_nfserr: | ||
1803 | - err = nfserrno(host_err); | ||
1804 | - goto out; | ||
1805 | } | ||
1806 | |||
1807 | #if defined(CONFIG_NFSD_V2_ACL) || \ | ||
1808 | diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h | ||
1809 | index 70cf138690e9..df97ca4aae52 100644 | ||
1810 | --- a/include/linux/binfmts.h | ||
1811 | +++ b/include/linux/binfmts.h | ||
1812 | @@ -99,9 +99,6 @@ extern void setup_new_exec(struct linux_binprm * bprm); | ||
1813 | extern void would_dump(struct linux_binprm *, struct file *); | ||
1814 | |||
1815 | extern int suid_dumpable; | ||
1816 | -#define SUID_DUMP_DISABLE 0 /* No setuid dumping */ | ||
1817 | -#define SUID_DUMP_USER 1 /* Dump as user of process */ | ||
1818 | -#define SUID_DUMP_ROOT 2 /* Dump as root */ | ||
1819 | |||
1820 | /* Stack area protections */ | ||
1821 | #define EXSTACK_DEFAULT 0 /* Whatever the arch defaults to */ | ||
1822 | diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h | ||
1823 | index b508016fb76d..b3bd7e737e8b 100644 | ||
1824 | --- a/include/linux/mod_devicetable.h | ||
1825 | +++ b/include/linux/mod_devicetable.h | ||
1826 | @@ -456,7 +456,8 @@ enum dmi_field { | ||
1827 | }; | ||
1828 | |||
1829 | struct dmi_strmatch { | ||
1830 | - unsigned char slot; | ||
1831 | + unsigned char slot:7; | ||
1832 | + unsigned char exact_match:1; | ||
1833 | char substr[79]; | ||
1834 | }; | ||
1835 | |||
1836 | @@ -474,7 +475,8 @@ struct dmi_system_id { | ||
1837 | */ | ||
1838 | #define dmi_device_id dmi_system_id | ||
1839 | |||
1840 | -#define DMI_MATCH(a, b) { a, b } | ||
1841 | +#define DMI_MATCH(a, b) { .slot = a, .substr = b } | ||
1842 | +#define DMI_EXACT_MATCH(a, b) { .slot = a, .substr = b, .exact_match = 1 } | ||
1843 | |||
1844 | #define PLATFORM_NAME_SIZE 20 | ||
1845 | #define PLATFORM_MODULE_PREFIX "platform:" | ||
1846 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
1847 | index 178a8d909f14..597c8ab005a0 100644 | ||
1848 | --- a/include/linux/sched.h | ||
1849 | +++ b/include/linux/sched.h | ||
1850 | @@ -332,6 +332,10 @@ static inline void arch_pick_mmap_layout(struct mm_struct *mm) {} | ||
1851 | extern void set_dumpable(struct mm_struct *mm, int value); | ||
1852 | extern int get_dumpable(struct mm_struct *mm); | ||
1853 | |||
1854 | +#define SUID_DUMP_DISABLE 0 /* No setuid dumping */ | ||
1855 | +#define SUID_DUMP_USER 1 /* Dump as user of process */ | ||
1856 | +#define SUID_DUMP_ROOT 2 /* Dump as root */ | ||
1857 | + | ||
1858 | /* mm flags */ | ||
1859 | /* dumpable bits */ | ||
1860 | #define MMF_DUMPABLE 0 /* core dump is permitted */ | ||
1861 | @@ -2469,34 +2473,98 @@ static inline int tsk_is_polling(struct task_struct *p) | ||
1862 | { | ||
1863 | return task_thread_info(p)->status & TS_POLLING; | ||
1864 | } | ||
1865 | -static inline void current_set_polling(void) | ||
1866 | +static inline void __current_set_polling(void) | ||
1867 | { | ||
1868 | current_thread_info()->status |= TS_POLLING; | ||
1869 | } | ||
1870 | |||
1871 | -static inline void current_clr_polling(void) | ||
1872 | +static inline bool __must_check current_set_polling_and_test(void) | ||
1873 | +{ | ||
1874 | + __current_set_polling(); | ||
1875 | + | ||
1876 | + /* | ||
1877 | + * Polling state must be visible before we test NEED_RESCHED, | ||
1878 | + * paired by resched_task() | ||
1879 | + */ | ||
1880 | + smp_mb(); | ||
1881 | + | ||
1882 | + return unlikely(tif_need_resched()); | ||
1883 | +} | ||
1884 | + | ||
1885 | +static inline void __current_clr_polling(void) | ||
1886 | { | ||
1887 | current_thread_info()->status &= ~TS_POLLING; | ||
1888 | - smp_mb__after_clear_bit(); | ||
1889 | +} | ||
1890 | + | ||
1891 | +static inline bool __must_check current_clr_polling_and_test(void) | ||
1892 | +{ | ||
1893 | + __current_clr_polling(); | ||
1894 | + | ||
1895 | + /* | ||
1896 | + * Polling state must be visible before we test NEED_RESCHED, | ||
1897 | + * paired by resched_task() | ||
1898 | + */ | ||
1899 | + smp_mb(); | ||
1900 | + | ||
1901 | + return unlikely(tif_need_resched()); | ||
1902 | } | ||
1903 | #elif defined(TIF_POLLING_NRFLAG) | ||
1904 | static inline int tsk_is_polling(struct task_struct *p) | ||
1905 | { | ||
1906 | return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); | ||
1907 | } | ||
1908 | -static inline void current_set_polling(void) | ||
1909 | + | ||
1910 | +static inline void __current_set_polling(void) | ||
1911 | { | ||
1912 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
1913 | } | ||
1914 | |||
1915 | -static inline void current_clr_polling(void) | ||
1916 | +static inline bool __must_check current_set_polling_and_test(void) | ||
1917 | +{ | ||
1918 | + __current_set_polling(); | ||
1919 | + | ||
1920 | + /* | ||
1921 | + * Polling state must be visible before we test NEED_RESCHED, | ||
1922 | + * paired by resched_task() | ||
1923 | + * | ||
1924 | + * XXX: assumes set/clear bit are identical barrier wise. | ||
1925 | + */ | ||
1926 | + smp_mb__after_clear_bit(); | ||
1927 | + | ||
1928 | + return unlikely(tif_need_resched()); | ||
1929 | +} | ||
1930 | + | ||
1931 | +static inline void __current_clr_polling(void) | ||
1932 | { | ||
1933 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
1934 | } | ||
1935 | + | ||
1936 | +static inline bool __must_check current_clr_polling_and_test(void) | ||
1937 | +{ | ||
1938 | + __current_clr_polling(); | ||
1939 | + | ||
1940 | + /* | ||
1941 | + * Polling state must be visible before we test NEED_RESCHED, | ||
1942 | + * paired by resched_task() | ||
1943 | + */ | ||
1944 | + smp_mb__after_clear_bit(); | ||
1945 | + | ||
1946 | + return unlikely(tif_need_resched()); | ||
1947 | +} | ||
1948 | + | ||
1949 | #else | ||
1950 | static inline int tsk_is_polling(struct task_struct *p) { return 0; } | ||
1951 | -static inline void current_set_polling(void) { } | ||
1952 | -static inline void current_clr_polling(void) { } | ||
1953 | +static inline void __current_set_polling(void) { } | ||
1954 | +static inline void __current_clr_polling(void) { } | ||
1955 | + | ||
1956 | +static inline bool __must_check current_set_polling_and_test(void) | ||
1957 | +{ | ||
1958 | + return unlikely(tif_need_resched()); | ||
1959 | +} | ||
1960 | +static inline bool __must_check current_clr_polling_and_test(void) | ||
1961 | +{ | ||
1962 | + return unlikely(tif_need_resched()); | ||
1963 | +} | ||
1964 | #endif | ||
1965 | |||
1966 | /* | ||
1967 | diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h | ||
1968 | index e7e04736802f..4ae6f32c8033 100644 | ||
1969 | --- a/include/linux/thread_info.h | ||
1970 | +++ b/include/linux/thread_info.h | ||
1971 | @@ -107,6 +107,8 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) | ||
1972 | #define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) | ||
1973 | #define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) | ||
1974 | |||
1975 | +#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) | ||
1976 | + | ||
1977 | #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK | ||
1978 | /* | ||
1979 | * An arch can define its own version of set_restore_sigmask() to get the | ||
1980 | diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h | ||
1981 | index 9031a26249b5..ae6c3b8ed2f5 100644 | ||
1982 | --- a/include/sound/compress_driver.h | ||
1983 | +++ b/include/sound/compress_driver.h | ||
1984 | @@ -171,4 +171,13 @@ static inline void snd_compr_fragment_elapsed(struct snd_compr_stream *stream) | ||
1985 | wake_up(&stream->runtime->sleep); | ||
1986 | } | ||
1987 | |||
1988 | +static inline void snd_compr_drain_notify(struct snd_compr_stream *stream) | ||
1989 | +{ | ||
1990 | + if (snd_BUG_ON(!stream)) | ||
1991 | + return; | ||
1992 | + | ||
1993 | + stream->runtime->state = SNDRV_PCM_STATE_SETUP; | ||
1994 | + wake_up(&stream->runtime->sleep); | ||
1995 | +} | ||
1996 | + | ||
1997 | #endif | ||
1998 | diff --git a/ipc/shm.c b/ipc/shm.c | ||
1999 | index 7b87bea5245b..6dc55af8a29b 100644 | ||
2000 | --- a/ipc/shm.c | ||
2001 | +++ b/ipc/shm.c | ||
2002 | @@ -208,15 +208,18 @@ static void shm_open(struct vm_area_struct *vma) | ||
2003 | */ | ||
2004 | static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp) | ||
2005 | { | ||
2006 | + struct file *shm_file; | ||
2007 | + | ||
2008 | + shm_file = shp->shm_file; | ||
2009 | + shp->shm_file = NULL; | ||
2010 | ns->shm_tot -= (shp->shm_segsz + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
2011 | shm_rmid(ns, shp); | ||
2012 | shm_unlock(shp); | ||
2013 | - if (!is_file_hugepages(shp->shm_file)) | ||
2014 | - shmem_lock(shp->shm_file, 0, shp->mlock_user); | ||
2015 | + if (!is_file_hugepages(shm_file)) | ||
2016 | + shmem_lock(shm_file, 0, shp->mlock_user); | ||
2017 | else if (shp->mlock_user) | ||
2018 | - user_shm_unlock(file_inode(shp->shm_file)->i_size, | ||
2019 | - shp->mlock_user); | ||
2020 | - fput (shp->shm_file); | ||
2021 | + user_shm_unlock(file_inode(shm_file)->i_size, shp->mlock_user); | ||
2022 | + fput(shm_file); | ||
2023 | ipc_rcu_putref(shp, shm_rcu_free); | ||
2024 | } | ||
2025 | |||
2026 | @@ -974,15 +977,25 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) | ||
2027 | ipc_lock_object(&shp->shm_perm); | ||
2028 | if (!ns_capable(ns->user_ns, CAP_IPC_LOCK)) { | ||
2029 | kuid_t euid = current_euid(); | ||
2030 | - err = -EPERM; | ||
2031 | if (!uid_eq(euid, shp->shm_perm.uid) && | ||
2032 | - !uid_eq(euid, shp->shm_perm.cuid)) | ||
2033 | + !uid_eq(euid, shp->shm_perm.cuid)) { | ||
2034 | + err = -EPERM; | ||
2035 | goto out_unlock0; | ||
2036 | - if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) | ||
2037 | + } | ||
2038 | + if (cmd == SHM_LOCK && !rlimit(RLIMIT_MEMLOCK)) { | ||
2039 | + err = -EPERM; | ||
2040 | goto out_unlock0; | ||
2041 | + } | ||
2042 | } | ||
2043 | |||
2044 | shm_file = shp->shm_file; | ||
2045 | + | ||
2046 | + /* check if shm_destroy() is tearing down shp */ | ||
2047 | + if (shm_file == NULL) { | ||
2048 | + err = -EIDRM; | ||
2049 | + goto out_unlock0; | ||
2050 | + } | ||
2051 | + | ||
2052 | if (is_file_hugepages(shm_file)) | ||
2053 | goto out_unlock0; | ||
2054 | |||
2055 | @@ -1101,6 +1114,14 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr, | ||
2056 | goto out_unlock; | ||
2057 | |||
2058 | ipc_lock_object(&shp->shm_perm); | ||
2059 | + | ||
2060 | + /* check if shm_destroy() is tearing down shp */ | ||
2061 | + if (shp->shm_file == NULL) { | ||
2062 | + ipc_unlock_object(&shp->shm_perm); | ||
2063 | + err = -EIDRM; | ||
2064 | + goto out_unlock; | ||
2065 | + } | ||
2066 | + | ||
2067 | path = shp->shm_file->f_path; | ||
2068 | path_get(&path); | ||
2069 | shp->shm_nattch++; | ||
2070 | diff --git a/kernel/cpu/idle.c b/kernel/cpu/idle.c | ||
2071 | index e695c0a0bcb5..c261409500e4 100644 | ||
2072 | --- a/kernel/cpu/idle.c | ||
2073 | +++ b/kernel/cpu/idle.c | ||
2074 | @@ -44,7 +44,7 @@ static inline int cpu_idle_poll(void) | ||
2075 | rcu_idle_enter(); | ||
2076 | trace_cpu_idle_rcuidle(0, smp_processor_id()); | ||
2077 | local_irq_enable(); | ||
2078 | - while (!need_resched()) | ||
2079 | + while (!tif_need_resched()) | ||
2080 | cpu_relax(); | ||
2081 | trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); | ||
2082 | rcu_idle_exit(); | ||
2083 | @@ -92,8 +92,7 @@ static void cpu_idle_loop(void) | ||
2084 | if (cpu_idle_force_poll || tick_check_broadcast_expired()) { | ||
2085 | cpu_idle_poll(); | ||
2086 | } else { | ||
2087 | - current_clr_polling(); | ||
2088 | - if (!need_resched()) { | ||
2089 | + if (!current_clr_polling_and_test()) { | ||
2090 | stop_critical_timings(); | ||
2091 | rcu_idle_enter(); | ||
2092 | arch_cpu_idle(); | ||
2093 | @@ -103,7 +102,7 @@ static void cpu_idle_loop(void) | ||
2094 | } else { | ||
2095 | local_irq_enable(); | ||
2096 | } | ||
2097 | - current_set_polling(); | ||
2098 | + __current_set_polling(); | ||
2099 | } | ||
2100 | arch_cpu_idle_exit(); | ||
2101 | } | ||
2102 | @@ -129,7 +128,7 @@ void cpu_startup_entry(enum cpuhp_state state) | ||
2103 | */ | ||
2104 | boot_init_stack_canary(); | ||
2105 | #endif | ||
2106 | - current_set_polling(); | ||
2107 | + __current_set_polling(); | ||
2108 | arch_cpu_idle_prepare(); | ||
2109 | cpu_idle_loop(); | ||
2110 | } | ||
2111 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c | ||
2112 | index 335a7ae697f5..afadcf7b4a22 100644 | ||
2113 | --- a/kernel/ptrace.c | ||
2114 | +++ b/kernel/ptrace.c | ||
2115 | @@ -257,7 +257,8 @@ ok: | ||
2116 | if (task->mm) | ||
2117 | dumpable = get_dumpable(task->mm); | ||
2118 | rcu_read_lock(); | ||
2119 | - if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { | ||
2120 | + if (dumpable != SUID_DUMP_USER && | ||
2121 | + !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { | ||
2122 | rcu_read_unlock(); | ||
2123 | return -EPERM; | ||
2124 | } | ||
2125 | diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c | ||
2126 | index 84b1e045faba..8354dc81ae64 100644 | ||
2127 | --- a/kernel/trace/trace_event_perf.c | ||
2128 | +++ b/kernel/trace/trace_event_perf.c | ||
2129 | @@ -26,7 +26,7 @@ static int perf_trace_event_perm(struct ftrace_event_call *tp_event, | ||
2130 | { | ||
2131 | /* The ftrace function trace is allowed only for root. */ | ||
2132 | if (ftrace_event_is_function(tp_event) && | ||
2133 | - perf_paranoid_kernel() && !capable(CAP_SYS_ADMIN)) | ||
2134 | + perf_paranoid_tracepoint_raw() && !capable(CAP_SYS_ADMIN)) | ||
2135 | return -EPERM; | ||
2136 | |||
2137 | /* No tracing, just counting, so no obvious leak */ | ||
2138 | diff --git a/mm/slub.c b/mm/slub.c | ||
2139 | index 57707f01bcfb..c34bd44e8be9 100644 | ||
2140 | --- a/mm/slub.c | ||
2141 | +++ b/mm/slub.c | ||
2142 | @@ -1201,8 +1201,8 @@ static unsigned long kmem_cache_flags(unsigned long object_size, | ||
2143 | /* | ||
2144 | * Enable debugging if selected on the kernel commandline. | ||
2145 | */ | ||
2146 | - if (slub_debug && (!slub_debug_slabs || | ||
2147 | - !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs)))) | ||
2148 | + if (slub_debug && (!slub_debug_slabs || (name && | ||
2149 | + !strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs))))) | ||
2150 | flags |= slub_debug; | ||
2151 | |||
2152 | return flags; | ||
2153 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c | ||
2154 | index 426f8fcc4c6c..5b1bf7b530f1 100644 | ||
2155 | --- a/net/sunrpc/clnt.c | ||
2156 | +++ b/net/sunrpc/clnt.c | ||
2157 | @@ -1407,9 +1407,9 @@ call_refreshresult(struct rpc_task *task) | ||
2158 | return; | ||
2159 | case -ETIMEDOUT: | ||
2160 | rpc_delay(task, 3*HZ); | ||
2161 | - case -EKEYEXPIRED: | ||
2162 | case -EAGAIN: | ||
2163 | status = -EACCES; | ||
2164 | + case -EKEYEXPIRED: | ||
2165 | if (!task->tk_cred_retry) | ||
2166 | break; | ||
2167 | task->tk_cred_retry--; | ||
2168 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c | ||
2169 | index ffd50348a509..8a0e04d0928a 100644 | ||
2170 | --- a/net/sunrpc/xprtsock.c | ||
2171 | +++ b/net/sunrpc/xprtsock.c | ||
2172 | @@ -391,8 +391,10 @@ static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, | ||
2173 | return kernel_sendmsg(sock, &msg, NULL, 0, 0); | ||
2174 | } | ||
2175 | |||
2176 | -static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more) | ||
2177 | +static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more, bool zerocopy) | ||
2178 | { | ||
2179 | + ssize_t (*do_sendpage)(struct socket *sock, struct page *page, | ||
2180 | + int offset, size_t size, int flags); | ||
2181 | struct page **ppage; | ||
2182 | unsigned int remainder; | ||
2183 | int err, sent = 0; | ||
2184 | @@ -401,6 +403,9 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i | ||
2185 | base += xdr->page_base; | ||
2186 | ppage = xdr->pages + (base >> PAGE_SHIFT); | ||
2187 | base &= ~PAGE_MASK; | ||
2188 | + do_sendpage = sock->ops->sendpage; | ||
2189 | + if (!zerocopy) | ||
2190 | + do_sendpage = sock_no_sendpage; | ||
2191 | for(;;) { | ||
2192 | unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); | ||
2193 | int flags = XS_SENDMSG_FLAGS; | ||
2194 | @@ -408,7 +413,7 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i | ||
2195 | remainder -= len; | ||
2196 | if (remainder != 0 || more) | ||
2197 | flags |= MSG_MORE; | ||
2198 | - err = sock->ops->sendpage(sock, *ppage, base, len, flags); | ||
2199 | + err = do_sendpage(sock, *ppage, base, len, flags); | ||
2200 | if (remainder == 0 || err != len) | ||
2201 | break; | ||
2202 | sent += err; | ||
2203 | @@ -429,9 +434,10 @@ static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned i | ||
2204 | * @addrlen: UDP only -- length of destination address | ||
2205 | * @xdr: buffer containing this request | ||
2206 | * @base: starting position in the buffer | ||
2207 | + * @zerocopy: true if it is safe to use sendpage() | ||
2208 | * | ||
2209 | */ | ||
2210 | -static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base) | ||
2211 | +static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base, bool zerocopy) | ||
2212 | { | ||
2213 | unsigned int remainder = xdr->len - base; | ||
2214 | int err, sent = 0; | ||
2215 | @@ -459,7 +465,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, | ||
2216 | if (base < xdr->page_len) { | ||
2217 | unsigned int len = xdr->page_len - base; | ||
2218 | remainder -= len; | ||
2219 | - err = xs_send_pagedata(sock, xdr, base, remainder != 0); | ||
2220 | + err = xs_send_pagedata(sock, xdr, base, remainder != 0, zerocopy); | ||
2221 | if (remainder == 0 || err != len) | ||
2222 | goto out; | ||
2223 | sent += err; | ||
2224 | @@ -562,7 +568,7 @@ static int xs_local_send_request(struct rpc_task *task) | ||
2225 | req->rq_svec->iov_base, req->rq_svec->iov_len); | ||
2226 | |||
2227 | status = xs_sendpages(transport->sock, NULL, 0, | ||
2228 | - xdr, req->rq_bytes_sent); | ||
2229 | + xdr, req->rq_bytes_sent, true); | ||
2230 | dprintk("RPC: %s(%u) = %d\n", | ||
2231 | __func__, xdr->len - req->rq_bytes_sent, status); | ||
2232 | if (likely(status >= 0)) { | ||
2233 | @@ -618,7 +624,7 @@ static int xs_udp_send_request(struct rpc_task *task) | ||
2234 | status = xs_sendpages(transport->sock, | ||
2235 | xs_addr(xprt), | ||
2236 | xprt->addrlen, xdr, | ||
2237 | - req->rq_bytes_sent); | ||
2238 | + req->rq_bytes_sent, true); | ||
2239 | |||
2240 | dprintk("RPC: xs_udp_send_request(%u) = %d\n", | ||
2241 | xdr->len - req->rq_bytes_sent, status); | ||
2242 | @@ -689,6 +695,7 @@ static int xs_tcp_send_request(struct rpc_task *task) | ||
2243 | struct rpc_xprt *xprt = req->rq_xprt; | ||
2244 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | ||
2245 | struct xdr_buf *xdr = &req->rq_snd_buf; | ||
2246 | + bool zerocopy = true; | ||
2247 | int status; | ||
2248 | |||
2249 | xs_encode_stream_record_marker(&req->rq_snd_buf); | ||
2250 | @@ -696,13 +703,20 @@ static int xs_tcp_send_request(struct rpc_task *task) | ||
2251 | xs_pktdump("packet data:", | ||
2252 | req->rq_svec->iov_base, | ||
2253 | req->rq_svec->iov_len); | ||
2254 | + /* Don't use zero copy if this is a resend. If the RPC call | ||
2255 | + * completes while the socket holds a reference to the pages, | ||
2256 | + * then we may end up resending corrupted data. | ||
2257 | + */ | ||
2258 | + if (task->tk_flags & RPC_TASK_SENT) | ||
2259 | + zerocopy = false; | ||
2260 | |||
2261 | /* Continue transmitting the packet/record. We must be careful | ||
2262 | * to cope with writespace callbacks arriving _after_ we have | ||
2263 | * called sendmsg(). */ | ||
2264 | while (1) { | ||
2265 | status = xs_sendpages(transport->sock, | ||
2266 | - NULL, 0, xdr, req->rq_bytes_sent); | ||
2267 | + NULL, 0, xdr, req->rq_bytes_sent, | ||
2268 | + zerocopy); | ||
2269 | |||
2270 | dprintk("RPC: xs_tcp_send_request(%u) = %d\n", | ||
2271 | xdr->len - req->rq_bytes_sent, status); | ||
2272 | diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c | ||
2273 | index 399433ad614e..a9c3d3cd1990 100644 | ||
2274 | --- a/security/integrity/ima/ima_policy.c | ||
2275 | +++ b/security/integrity/ima/ima_policy.c | ||
2276 | @@ -73,7 +73,6 @@ static struct ima_rule_entry default_rules[] = { | ||
2277 | {.action = DONT_MEASURE,.fsmagic = SYSFS_MAGIC,.flags = IMA_FSMAGIC}, | ||
2278 | {.action = DONT_MEASURE,.fsmagic = DEBUGFS_MAGIC,.flags = IMA_FSMAGIC}, | ||
2279 | {.action = DONT_MEASURE,.fsmagic = TMPFS_MAGIC,.flags = IMA_FSMAGIC}, | ||
2280 | - {.action = DONT_MEASURE,.fsmagic = RAMFS_MAGIC,.flags = IMA_FSMAGIC}, | ||
2281 | {.action = DONT_MEASURE,.fsmagic = DEVPTS_SUPER_MAGIC,.flags = IMA_FSMAGIC}, | ||
2282 | {.action = DONT_MEASURE,.fsmagic = BINFMTFS_MAGIC,.flags = IMA_FSMAGIC}, | ||
2283 | {.action = DONT_MEASURE,.fsmagic = SECURITYFS_MAGIC,.flags = IMA_FSMAGIC}, | ||
2284 | diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c | ||
2285 | index 5863ba6dd12b..19799931c51d 100644 | ||
2286 | --- a/sound/core/compress_offload.c | ||
2287 | +++ b/sound/core/compress_offload.c | ||
2288 | @@ -668,14 +668,48 @@ static int snd_compr_stop(struct snd_compr_stream *stream) | ||
2289 | return -EPERM; | ||
2290 | retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); | ||
2291 | if (!retval) { | ||
2292 | - stream->runtime->state = SNDRV_PCM_STATE_SETUP; | ||
2293 | - wake_up(&stream->runtime->sleep); | ||
2294 | + snd_compr_drain_notify(stream); | ||
2295 | stream->runtime->total_bytes_available = 0; | ||
2296 | stream->runtime->total_bytes_transferred = 0; | ||
2297 | } | ||
2298 | return retval; | ||
2299 | } | ||
2300 | |||
2301 | +static int snd_compress_wait_for_drain(struct snd_compr_stream *stream) | ||
2302 | +{ | ||
2303 | + int ret; | ||
2304 | + | ||
2305 | + /* | ||
2306 | + * We are called with lock held. So drop the lock while we wait for | ||
2307 | + * drain complete notfication from the driver | ||
2308 | + * | ||
2309 | + * It is expected that driver will notify the drain completion and then | ||
2310 | + * stream will be moved to SETUP state, even if draining resulted in an | ||
2311 | + * error. We can trigger next track after this. | ||
2312 | + */ | ||
2313 | + stream->runtime->state = SNDRV_PCM_STATE_DRAINING; | ||
2314 | + mutex_unlock(&stream->device->lock); | ||
2315 | + | ||
2316 | + /* we wait for drain to complete here, drain can return when | ||
2317 | + * interruption occurred, wait returned error or success. | ||
2318 | + * For the first two cases we don't do anything different here and | ||
2319 | + * return after waking up | ||
2320 | + */ | ||
2321 | + | ||
2322 | + ret = wait_event_interruptible(stream->runtime->sleep, | ||
2323 | + (stream->runtime->state != SNDRV_PCM_STATE_DRAINING)); | ||
2324 | + if (ret == -ERESTARTSYS) | ||
2325 | + pr_debug("wait aborted by a signal"); | ||
2326 | + else if (ret) | ||
2327 | + pr_debug("wait for drain failed with %d\n", ret); | ||
2328 | + | ||
2329 | + | ||
2330 | + wake_up(&stream->runtime->sleep); | ||
2331 | + mutex_lock(&stream->device->lock); | ||
2332 | + | ||
2333 | + return ret; | ||
2334 | +} | ||
2335 | + | ||
2336 | static int snd_compr_drain(struct snd_compr_stream *stream) | ||
2337 | { | ||
2338 | int retval; | ||
2339 | @@ -683,12 +717,15 @@ static int snd_compr_drain(struct snd_compr_stream *stream) | ||
2340 | if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || | ||
2341 | stream->runtime->state == SNDRV_PCM_STATE_SETUP) | ||
2342 | return -EPERM; | ||
2343 | + | ||
2344 | retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); | ||
2345 | - if (!retval) { | ||
2346 | - stream->runtime->state = SNDRV_PCM_STATE_DRAINING; | ||
2347 | + if (retval) { | ||
2348 | + pr_debug("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval); | ||
2349 | wake_up(&stream->runtime->sleep); | ||
2350 | + return retval; | ||
2351 | } | ||
2352 | - return retval; | ||
2353 | + | ||
2354 | + return snd_compress_wait_for_drain(stream); | ||
2355 | } | ||
2356 | |||
2357 | static int snd_compr_next_track(struct snd_compr_stream *stream) | ||
2358 | @@ -724,9 +761,14 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream) | ||
2359 | return -EPERM; | ||
2360 | |||
2361 | retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN); | ||
2362 | + if (retval) { | ||
2363 | + pr_debug("Partial drain returned failure\n"); | ||
2364 | + wake_up(&stream->runtime->sleep); | ||
2365 | + return retval; | ||
2366 | + } | ||
2367 | |||
2368 | stream->next_track = false; | ||
2369 | - return retval; | ||
2370 | + return snd_compress_wait_for_drain(stream); | ||
2371 | } | ||
2372 | |||
2373 | static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) | ||
2374 | diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c | ||
2375 | index ddabb406b14c..3a7946ebbe23 100644 | ||
2376 | --- a/sound/isa/msnd/msnd_pinnacle.c | ||
2377 | +++ b/sound/isa/msnd/msnd_pinnacle.c | ||
2378 | @@ -73,9 +73,11 @@ | ||
2379 | #ifdef MSND_CLASSIC | ||
2380 | # include "msnd_classic.h" | ||
2381 | # define LOGNAME "msnd_classic" | ||
2382 | +# define DEV_NAME "msnd-classic" | ||
2383 | #else | ||
2384 | # include "msnd_pinnacle.h" | ||
2385 | # define LOGNAME "snd_msnd_pinnacle" | ||
2386 | +# define DEV_NAME "msnd-pinnacle" | ||
2387 | #endif | ||
2388 | |||
2389 | static void set_default_audio_parameters(struct snd_msnd *chip) | ||
2390 | @@ -1068,8 +1070,6 @@ static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev) | ||
2391 | return 0; | ||
2392 | } | ||
2393 | |||
2394 | -#define DEV_NAME "msnd-pinnacle" | ||
2395 | - | ||
2396 | static struct isa_driver snd_msnd_driver = { | ||
2397 | .match = snd_msnd_isa_match, | ||
2398 | .probe = snd_msnd_isa_probe, | ||
2399 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c | ||
2400 | index 31461ba32d3c..aeefec74a061 100644 | ||
2401 | --- a/sound/pci/hda/hda_codec.c | ||
2402 | +++ b/sound/pci/hda/hda_codec.c | ||
2403 | @@ -2517,9 +2517,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) | ||
2404 | cancel_delayed_work_sync(&codec->jackpoll_work); | ||
2405 | #ifdef CONFIG_PM | ||
2406 | cancel_delayed_work_sync(&codec->power_work); | ||
2407 | - codec->power_on = 0; | ||
2408 | - codec->power_transition = 0; | ||
2409 | - codec->power_jiffies = jiffies; | ||
2410 | flush_workqueue(bus->workq); | ||
2411 | #endif | ||
2412 | snd_hda_ctls_clear(codec); | ||
2413 | @@ -3927,6 +3924,10 @@ static void hda_call_codec_resume(struct hda_codec *codec) | ||
2414 | * in the resume / power-save sequence | ||
2415 | */ | ||
2416 | hda_keep_power_on(codec); | ||
2417 | + if (codec->pm_down_notified) { | ||
2418 | + codec->pm_down_notified = 0; | ||
2419 | + hda_call_pm_notify(codec->bus, true); | ||
2420 | + } | ||
2421 | hda_set_power_state(codec, AC_PWRST_D0); | ||
2422 | restore_shutup_pins(codec); | ||
2423 | hda_exec_init_verbs(codec); | ||
2424 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c | ||
2425 | index d0cc796f778a..26ed56f00b7c 100644 | ||
2426 | --- a/sound/pci/hda/hda_generic.c | ||
2427 | +++ b/sound/pci/hda/hda_generic.c | ||
2428 | @@ -786,10 +786,10 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) | ||
2429 | if (spec->own_eapd_ctl || | ||
2430 | !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)) | ||
2431 | return; | ||
2432 | - if (codec->inv_eapd) | ||
2433 | - enable = !enable; | ||
2434 | if (spec->keep_eapd_on && !enable) | ||
2435 | return; | ||
2436 | + if (codec->inv_eapd) | ||
2437 | + enable = !enable; | ||
2438 | snd_hda_codec_update_cache(codec, pin, 0, | ||
2439 | AC_VERB_SET_EAPD_BTLENABLE, | ||
2440 | enable ? 0x02 : 0x00); | ||
2441 | diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c | ||
2442 | index d97f0d61a15b..e17b55a95bc5 100644 | ||
2443 | --- a/sound/pci/hda/patch_analog.c | ||
2444 | +++ b/sound/pci/hda/patch_analog.c | ||
2445 | @@ -1197,8 +1197,12 @@ static int alloc_ad_spec(struct hda_codec *codec) | ||
2446 | static void ad_fixup_inv_jack_detect(struct hda_codec *codec, | ||
2447 | const struct hda_fixup *fix, int action) | ||
2448 | { | ||
2449 | - if (action == HDA_FIXUP_ACT_PRE_PROBE) | ||
2450 | + struct ad198x_spec *spec = codec->spec; | ||
2451 | + | ||
2452 | + if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
2453 | codec->inv_jack_detect = 1; | ||
2454 | + spec->gen.keep_eapd_on = 1; | ||
2455 | + } | ||
2456 | } | ||
2457 | |||
2458 | enum { | ||
2459 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
2460 | index c96e1945059d..1868d3a6e310 100644 | ||
2461 | --- a/sound/pci/hda/patch_conexant.c | ||
2462 | +++ b/sound/pci/hda/patch_conexant.c | ||
2463 | @@ -3491,6 +3491,8 @@ static const struct hda_codec_preset snd_hda_preset_conexant[] = { | ||
2464 | .patch = patch_conexant_auto }, | ||
2465 | { .id = 0x14f15115, .name = "CX20757", | ||
2466 | .patch = patch_conexant_auto }, | ||
2467 | + { .id = 0x14f151d7, .name = "CX20952", | ||
2468 | + .patch = patch_conexant_auto }, | ||
2469 | {} /* terminator */ | ||
2470 | }; | ||
2471 | |||
2472 | @@ -3517,6 +3519,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15111"); | ||
2473 | MODULE_ALIAS("snd-hda-codec-id:14f15113"); | ||
2474 | MODULE_ALIAS("snd-hda-codec-id:14f15114"); | ||
2475 | MODULE_ALIAS("snd-hda-codec-id:14f15115"); | ||
2476 | +MODULE_ALIAS("snd-hda-codec-id:14f151d7"); | ||
2477 | |||
2478 | MODULE_LICENSE("GPL"); | ||
2479 | MODULE_DESCRIPTION("Conexant HD-audio codec"); | ||
2480 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
2481 | index 4496e0ab693d..8bce044583ed 100644 | ||
2482 | --- a/sound/pci/hda/patch_realtek.c | ||
2483 | +++ b/sound/pci/hda/patch_realtek.c | ||
2484 | @@ -1037,6 +1037,7 @@ enum { | ||
2485 | ALC880_FIXUP_UNIWILL, | ||
2486 | ALC880_FIXUP_UNIWILL_DIG, | ||
2487 | ALC880_FIXUP_Z71V, | ||
2488 | + ALC880_FIXUP_ASUS_W5A, | ||
2489 | ALC880_FIXUP_3ST_BASE, | ||
2490 | ALC880_FIXUP_3ST, | ||
2491 | ALC880_FIXUP_3ST_DIG, | ||
2492 | @@ -1207,6 +1208,26 @@ static const struct hda_fixup alc880_fixups[] = { | ||
2493 | { } | ||
2494 | } | ||
2495 | }, | ||
2496 | + [ALC880_FIXUP_ASUS_W5A] = { | ||
2497 | + .type = HDA_FIXUP_PINS, | ||
2498 | + .v.pins = (const struct hda_pintbl[]) { | ||
2499 | + /* set up the whole pins as BIOS is utterly broken */ | ||
2500 | + { 0x14, 0x0121411f }, /* HP */ | ||
2501 | + { 0x15, 0x411111f0 }, /* N/A */ | ||
2502 | + { 0x16, 0x411111f0 }, /* N/A */ | ||
2503 | + { 0x17, 0x411111f0 }, /* N/A */ | ||
2504 | + { 0x18, 0x90a60160 }, /* mic */ | ||
2505 | + { 0x19, 0x411111f0 }, /* N/A */ | ||
2506 | + { 0x1a, 0x411111f0 }, /* N/A */ | ||
2507 | + { 0x1b, 0x411111f0 }, /* N/A */ | ||
2508 | + { 0x1c, 0x411111f0 }, /* N/A */ | ||
2509 | + { 0x1d, 0x411111f0 }, /* N/A */ | ||
2510 | + { 0x1e, 0xb743111e }, /* SPDIF out */ | ||
2511 | + { } | ||
2512 | + }, | ||
2513 | + .chained = true, | ||
2514 | + .chain_id = ALC880_FIXUP_GPIO1, | ||
2515 | + }, | ||
2516 | [ALC880_FIXUP_3ST_BASE] = { | ||
2517 | .type = HDA_FIXUP_PINS, | ||
2518 | .v.pins = (const struct hda_pintbl[]) { | ||
2519 | @@ -1328,6 +1349,7 @@ static const struct hda_fixup alc880_fixups[] = { | ||
2520 | |||
2521 | static const struct snd_pci_quirk alc880_fixup_tbl[] = { | ||
2522 | SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810), | ||
2523 | + SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A), | ||
2524 | SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V), | ||
2525 | SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1), | ||
2526 | SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2), | ||
2527 | @@ -1473,6 +1495,7 @@ enum { | ||
2528 | ALC260_FIXUP_KN1, | ||
2529 | ALC260_FIXUP_FSC_S7020, | ||
2530 | ALC260_FIXUP_FSC_S7020_JWSE, | ||
2531 | + ALC260_FIXUP_VAIO_PINS, | ||
2532 | }; | ||
2533 | |||
2534 | static void alc260_gpio1_automute(struct hda_codec *codec) | ||
2535 | @@ -1613,6 +1636,24 @@ static const struct hda_fixup alc260_fixups[] = { | ||
2536 | .chained = true, | ||
2537 | .chain_id = ALC260_FIXUP_FSC_S7020, | ||
2538 | }, | ||
2539 | + [ALC260_FIXUP_VAIO_PINS] = { | ||
2540 | + .type = HDA_FIXUP_PINS, | ||
2541 | + .v.pins = (const struct hda_pintbl[]) { | ||
2542 | + /* Pin configs are missing completely on some VAIOs */ | ||
2543 | + { 0x0f, 0x01211020 }, | ||
2544 | + { 0x10, 0x0001003f }, | ||
2545 | + { 0x11, 0x411111f0 }, | ||
2546 | + { 0x12, 0x01a15930 }, | ||
2547 | + { 0x13, 0x411111f0 }, | ||
2548 | + { 0x14, 0x411111f0 }, | ||
2549 | + { 0x15, 0x411111f0 }, | ||
2550 | + { 0x16, 0x411111f0 }, | ||
2551 | + { 0x17, 0x411111f0 }, | ||
2552 | + { 0x18, 0x411111f0 }, | ||
2553 | + { 0x19, 0x411111f0 }, | ||
2554 | + { } | ||
2555 | + } | ||
2556 | + }, | ||
2557 | }; | ||
2558 | |||
2559 | static const struct snd_pci_quirk alc260_fixup_tbl[] = { | ||
2560 | @@ -1621,6 +1662,8 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = { | ||
2561 | SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1), | ||
2562 | SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750), | ||
2563 | SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900), | ||
2564 | + SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS), | ||
2565 | + SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F), | ||
2566 | SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020), | ||
2567 | SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), | ||
2568 | SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1), | ||
2569 | @@ -2380,6 +2423,7 @@ static const struct hda_verb alc268_beep_init_verbs[] = { | ||
2570 | enum { | ||
2571 | ALC268_FIXUP_INV_DMIC, | ||
2572 | ALC268_FIXUP_HP_EAPD, | ||
2573 | + ALC268_FIXUP_SPDIF, | ||
2574 | }; | ||
2575 | |||
2576 | static const struct hda_fixup alc268_fixups[] = { | ||
2577 | @@ -2394,6 +2438,13 @@ static const struct hda_fixup alc268_fixups[] = { | ||
2578 | {} | ||
2579 | } | ||
2580 | }, | ||
2581 | + [ALC268_FIXUP_SPDIF] = { | ||
2582 | + .type = HDA_FIXUP_PINS, | ||
2583 | + .v.pins = (const struct hda_pintbl[]) { | ||
2584 | + { 0x1e, 0x014b1180 }, /* enable SPDIF out */ | ||
2585 | + {} | ||
2586 | + } | ||
2587 | + }, | ||
2588 | }; | ||
2589 | |||
2590 | static const struct hda_model_fixup alc268_fixup_models[] = { | ||
2591 | @@ -2403,6 +2454,7 @@ static const struct hda_model_fixup alc268_fixup_models[] = { | ||
2592 | }; | ||
2593 | |||
2594 | static const struct snd_pci_quirk alc268_fixup_tbl[] = { | ||
2595 | + SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF), | ||
2596 | SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC), | ||
2597 | /* below is codec SSID since multiple Toshiba laptops have the | ||
2598 | * same PCI SSID 1179:ff00 | ||
2599 | @@ -2531,6 +2583,7 @@ enum { | ||
2600 | ALC269_TYPE_ALC282, | ||
2601 | ALC269_TYPE_ALC284, | ||
2602 | ALC269_TYPE_ALC286, | ||
2603 | + ALC269_TYPE_ALC255, | ||
2604 | }; | ||
2605 | |||
2606 | /* | ||
2607 | @@ -2555,6 +2608,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | ||
2608 | case ALC269_TYPE_ALC269VD: | ||
2609 | case ALC269_TYPE_ALC282: | ||
2610 | case ALC269_TYPE_ALC286: | ||
2611 | + case ALC269_TYPE_ALC255: | ||
2612 | ssids = alc269_ssids; | ||
2613 | break; | ||
2614 | default: | ||
2615 | @@ -2754,6 +2808,23 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) | ||
2616 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); | ||
2617 | } | ||
2618 | |||
2619 | +/* Make sure the led works even in runtime suspend */ | ||
2620 | +static unsigned int led_power_filter(struct hda_codec *codec, | ||
2621 | + hda_nid_t nid, | ||
2622 | + unsigned int power_state) | ||
2623 | +{ | ||
2624 | + struct alc_spec *spec = codec->spec; | ||
2625 | + | ||
2626 | + if (power_state != AC_PWRST_D3 || nid != spec->mute_led_nid) | ||
2627 | + return power_state; | ||
2628 | + | ||
2629 | + /* Set pin ctl again, it might have just been set to 0 */ | ||
2630 | + snd_hda_set_pin_ctl(codec, nid, | ||
2631 | + snd_hda_codec_get_pin_target(codec, nid)); | ||
2632 | + | ||
2633 | + return AC_PWRST_D0; | ||
2634 | +} | ||
2635 | + | ||
2636 | static void alc269_fixup_hp_mute_led(struct hda_codec *codec, | ||
2637 | const struct hda_fixup *fix, int action) | ||
2638 | { | ||
2639 | @@ -2773,6 +2844,7 @@ static void alc269_fixup_hp_mute_led(struct hda_codec *codec, | ||
2640 | spec->mute_led_nid = pin - 0x0a + 0x18; | ||
2641 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; | ||
2642 | spec->gen.vmaster_mute_enum = 1; | ||
2643 | + codec->power_filter = led_power_filter; | ||
2644 | snd_printd("Detected mute LED for %x:%d\n", spec->mute_led_nid, | ||
2645 | spec->mute_led_polarity); | ||
2646 | break; | ||
2647 | @@ -2788,6 +2860,7 @@ static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec, | ||
2648 | spec->mute_led_nid = 0x18; | ||
2649 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; | ||
2650 | spec->gen.vmaster_mute_enum = 1; | ||
2651 | + codec->power_filter = led_power_filter; | ||
2652 | } | ||
2653 | } | ||
2654 | |||
2655 | @@ -2800,6 +2873,7 @@ static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec, | ||
2656 | spec->mute_led_nid = 0x19; | ||
2657 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; | ||
2658 | spec->gen.vmaster_mute_enum = 1; | ||
2659 | + codec->power_filter = led_power_filter; | ||
2660 | } | ||
2661 | } | ||
2662 | |||
2663 | @@ -3040,8 +3114,10 @@ static void alc_update_headset_mode(struct hda_codec *codec) | ||
2664 | else | ||
2665 | new_headset_mode = ALC_HEADSET_MODE_HEADPHONE; | ||
2666 | |||
2667 | - if (new_headset_mode == spec->current_headset_mode) | ||
2668 | + if (new_headset_mode == spec->current_headset_mode) { | ||
2669 | + snd_hda_gen_update_outputs(codec); | ||
2670 | return; | ||
2671 | + } | ||
2672 | |||
2673 | switch (new_headset_mode) { | ||
2674 | case ALC_HEADSET_MODE_UNPLUGGED: | ||
2675 | @@ -3545,6 +3621,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
2676 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
2677 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
2678 | SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
2679 | + SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
2680 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS), | ||
2681 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | ||
2682 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), | ||
2683 | @@ -3765,6 +3842,9 @@ static int patch_alc269(struct hda_codec *codec) | ||
2684 | case 0x10ec0286: | ||
2685 | spec->codec_variant = ALC269_TYPE_ALC286; | ||
2686 | break; | ||
2687 | + case 0x10ec0255: | ||
2688 | + spec->codec_variant = ALC269_TYPE_ALC255; | ||
2689 | + break; | ||
2690 | } | ||
2691 | |||
2692 | /* automatic parse from the BIOS config */ | ||
2693 | @@ -4472,6 +4552,7 @@ static int patch_alc680(struct hda_codec *codec) | ||
2694 | static const struct hda_codec_preset snd_hda_preset_realtek[] = { | ||
2695 | { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 }, | ||
2696 | { .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 }, | ||
2697 | + { .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 }, | ||
2698 | { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, | ||
2699 | { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, | ||
2700 | { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, | ||
2701 | diff --git a/sound/usb/6fire/chip.c b/sound/usb/6fire/chip.c | ||
2702 | index 4394ae796356..0716ba691398 100644 | ||
2703 | --- a/sound/usb/6fire/chip.c | ||
2704 | +++ b/sound/usb/6fire/chip.c | ||
2705 | @@ -101,7 +101,7 @@ static int usb6fire_chip_probe(struct usb_interface *intf, | ||
2706 | usb_set_intfdata(intf, chips[i]); | ||
2707 | mutex_unlock(®ister_mutex); | ||
2708 | return 0; | ||
2709 | - } else if (regidx < 0) | ||
2710 | + } else if (!devices[i] && regidx < 0) | ||
2711 | regidx = i; | ||
2712 | } | ||
2713 | if (regidx < 0) { | ||
2714 | diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c | ||
2715 | index 72a130bc448a..c329c8fc57f4 100644 | ||
2716 | --- a/virt/kvm/iommu.c | ||
2717 | +++ b/virt/kvm/iommu.c | ||
2718 | @@ -103,6 +103,10 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) | ||
2719 | while ((gfn << PAGE_SHIFT) & (page_size - 1)) | ||
2720 | page_size >>= 1; | ||
2721 | |||
2722 | + /* Make sure hva is aligned to the page size we want to map */ | ||
2723 | + while (__gfn_to_hva_memslot(slot, gfn) & (page_size - 1)) | ||
2724 | + page_size >>= 1; | ||
2725 | + | ||
2726 | /* | ||
2727 | * Pin all pages we are about to map in memory. This is | ||
2728 | * important because we unmap and unpin in 4kb steps later. |