Contents of /trunk/kernel-alx/patches-3.14/0118-3.14.19-all-fixes.patch
Parent Directory | Revision Log
Revision 2506 -
(show annotations)
(download)
Fri Oct 17 07:55:45 2014 UTC (9 years, 11 months ago) by niro
File size: 154080 byte(s)
Fri Oct 17 07:55:45 2014 UTC (9 years, 11 months ago) by niro
File size: 154080 byte(s)
-patches for 3.14
1 | diff --git a/Documentation/devicetree/bindings/sound/adi,axi-spdif-tx.txt b/Documentation/devicetree/bindings/sound/adi,axi-spdif-tx.txt |
2 | index 46f344965313..4eb7997674a0 100644 |
3 | --- a/Documentation/devicetree/bindings/sound/adi,axi-spdif-tx.txt |
4 | +++ b/Documentation/devicetree/bindings/sound/adi,axi-spdif-tx.txt |
5 | @@ -1,7 +1,7 @@ |
6 | ADI AXI-SPDIF controller |
7 | |
8 | Required properties: |
9 | - - compatible : Must be "adi,axi-spdif-1.00.a" |
10 | + - compatible : Must be "adi,axi-spdif-tx-1.00.a" |
11 | - reg : Must contain SPDIF core's registers location and length |
12 | - clocks : Pairs of phandle and specifier referencing the controller's clocks. |
13 | The controller expects two clocks, the clock used for the AXI interface and |
14 | diff --git a/Makefile b/Makefile |
15 | index 05279d4f44c9..b1746b486646 100644 |
16 | --- a/Makefile |
17 | +++ b/Makefile |
18 | @@ -1,6 +1,6 @@ |
19 | VERSION = 3 |
20 | PATCHLEVEL = 14 |
21 | -SUBLEVEL = 18 |
22 | +SUBLEVEL = 19 |
23 | EXTRAVERSION = |
24 | NAME = Remembering Coco |
25 | |
26 | diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c |
27 | index 331b837cec57..270cb3c6c498 100644 |
28 | --- a/arch/mips/cavium-octeon/setup.c |
29 | +++ b/arch/mips/cavium-octeon/setup.c |
30 | @@ -458,6 +458,18 @@ static void octeon_halt(void) |
31 | octeon_kill_core(NULL); |
32 | } |
33 | |
34 | +static char __read_mostly octeon_system_type[80]; |
35 | + |
36 | +static int __init init_octeon_system_type(void) |
37 | +{ |
38 | + snprintf(octeon_system_type, sizeof(octeon_system_type), "%s (%s)", |
39 | + cvmx_board_type_to_string(octeon_bootinfo->board_type), |
40 | + octeon_model_get_string(read_c0_prid())); |
41 | + |
42 | + return 0; |
43 | +} |
44 | +early_initcall(init_octeon_system_type); |
45 | + |
46 | /** |
47 | * Return a string representing the system type |
48 | * |
49 | @@ -465,11 +477,7 @@ static void octeon_halt(void) |
50 | */ |
51 | const char *octeon_board_type_string(void) |
52 | { |
53 | - static char name[80]; |
54 | - sprintf(name, "%s (%s)", |
55 | - cvmx_board_type_to_string(octeon_bootinfo->board_type), |
56 | - octeon_model_get_string(read_c0_prid())); |
57 | - return name; |
58 | + return octeon_system_type; |
59 | } |
60 | |
61 | const char *get_system_type(void) |
62 | diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h |
63 | index 7bba9da110af..6d019ca1bead 100644 |
64 | --- a/arch/mips/include/asm/ptrace.h |
65 | +++ b/arch/mips/include/asm/ptrace.h |
66 | @@ -23,7 +23,7 @@ |
67 | struct pt_regs { |
68 | #ifdef CONFIG_32BIT |
69 | /* Pad bytes for argument save space on the stack. */ |
70 | - unsigned long pad0[6]; |
71 | + unsigned long pad0[8]; |
72 | #endif |
73 | |
74 | /* Saved main processor registers. */ |
75 | diff --git a/arch/mips/include/asm/reg.h b/arch/mips/include/asm/reg.h |
76 | index 910e71a12466..b8343ccbc989 100644 |
77 | --- a/arch/mips/include/asm/reg.h |
78 | +++ b/arch/mips/include/asm/reg.h |
79 | @@ -12,116 +12,194 @@ |
80 | #ifndef __ASM_MIPS_REG_H |
81 | #define __ASM_MIPS_REG_H |
82 | |
83 | - |
84 | -#if defined(CONFIG_32BIT) || defined(WANT_COMPAT_REG_H) |
85 | - |
86 | -#define EF_R0 6 |
87 | -#define EF_R1 7 |
88 | -#define EF_R2 8 |
89 | -#define EF_R3 9 |
90 | -#define EF_R4 10 |
91 | -#define EF_R5 11 |
92 | -#define EF_R6 12 |
93 | -#define EF_R7 13 |
94 | -#define EF_R8 14 |
95 | -#define EF_R9 15 |
96 | -#define EF_R10 16 |
97 | -#define EF_R11 17 |
98 | -#define EF_R12 18 |
99 | -#define EF_R13 19 |
100 | -#define EF_R14 20 |
101 | -#define EF_R15 21 |
102 | -#define EF_R16 22 |
103 | -#define EF_R17 23 |
104 | -#define EF_R18 24 |
105 | -#define EF_R19 25 |
106 | -#define EF_R20 26 |
107 | -#define EF_R21 27 |
108 | -#define EF_R22 28 |
109 | -#define EF_R23 29 |
110 | -#define EF_R24 30 |
111 | -#define EF_R25 31 |
112 | +#define MIPS32_EF_R0 6 |
113 | +#define MIPS32_EF_R1 7 |
114 | +#define MIPS32_EF_R2 8 |
115 | +#define MIPS32_EF_R3 9 |
116 | +#define MIPS32_EF_R4 10 |
117 | +#define MIPS32_EF_R5 11 |
118 | +#define MIPS32_EF_R6 12 |
119 | +#define MIPS32_EF_R7 13 |
120 | +#define MIPS32_EF_R8 14 |
121 | +#define MIPS32_EF_R9 15 |
122 | +#define MIPS32_EF_R10 16 |
123 | +#define MIPS32_EF_R11 17 |
124 | +#define MIPS32_EF_R12 18 |
125 | +#define MIPS32_EF_R13 19 |
126 | +#define MIPS32_EF_R14 20 |
127 | +#define MIPS32_EF_R15 21 |
128 | +#define MIPS32_EF_R16 22 |
129 | +#define MIPS32_EF_R17 23 |
130 | +#define MIPS32_EF_R18 24 |
131 | +#define MIPS32_EF_R19 25 |
132 | +#define MIPS32_EF_R20 26 |
133 | +#define MIPS32_EF_R21 27 |
134 | +#define MIPS32_EF_R22 28 |
135 | +#define MIPS32_EF_R23 29 |
136 | +#define MIPS32_EF_R24 30 |
137 | +#define MIPS32_EF_R25 31 |
138 | |
139 | /* |
140 | * k0/k1 unsaved |
141 | */ |
142 | -#define EF_R26 32 |
143 | -#define EF_R27 33 |
144 | +#define MIPS32_EF_R26 32 |
145 | +#define MIPS32_EF_R27 33 |
146 | |
147 | -#define EF_R28 34 |
148 | -#define EF_R29 35 |
149 | -#define EF_R30 36 |
150 | -#define EF_R31 37 |
151 | +#define MIPS32_EF_R28 34 |
152 | +#define MIPS32_EF_R29 35 |
153 | +#define MIPS32_EF_R30 36 |
154 | +#define MIPS32_EF_R31 37 |
155 | |
156 | /* |
157 | * Saved special registers |
158 | */ |
159 | -#define EF_LO 38 |
160 | -#define EF_HI 39 |
161 | - |
162 | -#define EF_CP0_EPC 40 |
163 | -#define EF_CP0_BADVADDR 41 |
164 | -#define EF_CP0_STATUS 42 |
165 | -#define EF_CP0_CAUSE 43 |
166 | -#define EF_UNUSED0 44 |
167 | - |
168 | -#define EF_SIZE 180 |
169 | - |
170 | -#endif |
171 | - |
172 | -#if defined(CONFIG_64BIT) && !defined(WANT_COMPAT_REG_H) |
173 | - |
174 | -#define EF_R0 0 |
175 | -#define EF_R1 1 |
176 | -#define EF_R2 2 |
177 | -#define EF_R3 3 |
178 | -#define EF_R4 4 |
179 | -#define EF_R5 5 |
180 | -#define EF_R6 6 |
181 | -#define EF_R7 7 |
182 | -#define EF_R8 8 |
183 | -#define EF_R9 9 |
184 | -#define EF_R10 10 |
185 | -#define EF_R11 11 |
186 | -#define EF_R12 12 |
187 | -#define EF_R13 13 |
188 | -#define EF_R14 14 |
189 | -#define EF_R15 15 |
190 | -#define EF_R16 16 |
191 | -#define EF_R17 17 |
192 | -#define EF_R18 18 |
193 | -#define EF_R19 19 |
194 | -#define EF_R20 20 |
195 | -#define EF_R21 21 |
196 | -#define EF_R22 22 |
197 | -#define EF_R23 23 |
198 | -#define EF_R24 24 |
199 | -#define EF_R25 25 |
200 | +#define MIPS32_EF_LO 38 |
201 | +#define MIPS32_EF_HI 39 |
202 | + |
203 | +#define MIPS32_EF_CP0_EPC 40 |
204 | +#define MIPS32_EF_CP0_BADVADDR 41 |
205 | +#define MIPS32_EF_CP0_STATUS 42 |
206 | +#define MIPS32_EF_CP0_CAUSE 43 |
207 | +#define MIPS32_EF_UNUSED0 44 |
208 | + |
209 | +#define MIPS32_EF_SIZE 180 |
210 | + |
211 | +#define MIPS64_EF_R0 0 |
212 | +#define MIPS64_EF_R1 1 |
213 | +#define MIPS64_EF_R2 2 |
214 | +#define MIPS64_EF_R3 3 |
215 | +#define MIPS64_EF_R4 4 |
216 | +#define MIPS64_EF_R5 5 |
217 | +#define MIPS64_EF_R6 6 |
218 | +#define MIPS64_EF_R7 7 |
219 | +#define MIPS64_EF_R8 8 |
220 | +#define MIPS64_EF_R9 9 |
221 | +#define MIPS64_EF_R10 10 |
222 | +#define MIPS64_EF_R11 11 |
223 | +#define MIPS64_EF_R12 12 |
224 | +#define MIPS64_EF_R13 13 |
225 | +#define MIPS64_EF_R14 14 |
226 | +#define MIPS64_EF_R15 15 |
227 | +#define MIPS64_EF_R16 16 |
228 | +#define MIPS64_EF_R17 17 |
229 | +#define MIPS64_EF_R18 18 |
230 | +#define MIPS64_EF_R19 19 |
231 | +#define MIPS64_EF_R20 20 |
232 | +#define MIPS64_EF_R21 21 |
233 | +#define MIPS64_EF_R22 22 |
234 | +#define MIPS64_EF_R23 23 |
235 | +#define MIPS64_EF_R24 24 |
236 | +#define MIPS64_EF_R25 25 |
237 | |
238 | /* |
239 | * k0/k1 unsaved |
240 | */ |
241 | -#define EF_R26 26 |
242 | -#define EF_R27 27 |
243 | +#define MIPS64_EF_R26 26 |
244 | +#define MIPS64_EF_R27 27 |
245 | |
246 | |
247 | -#define EF_R28 28 |
248 | -#define EF_R29 29 |
249 | -#define EF_R30 30 |
250 | -#define EF_R31 31 |
251 | +#define MIPS64_EF_R28 28 |
252 | +#define MIPS64_EF_R29 29 |
253 | +#define MIPS64_EF_R30 30 |
254 | +#define MIPS64_EF_R31 31 |
255 | |
256 | /* |
257 | * Saved special registers |
258 | */ |
259 | -#define EF_LO 32 |
260 | -#define EF_HI 33 |
261 | - |
262 | -#define EF_CP0_EPC 34 |
263 | -#define EF_CP0_BADVADDR 35 |
264 | -#define EF_CP0_STATUS 36 |
265 | -#define EF_CP0_CAUSE 37 |
266 | - |
267 | -#define EF_SIZE 304 /* size in bytes */ |
268 | +#define MIPS64_EF_LO 32 |
269 | +#define MIPS64_EF_HI 33 |
270 | + |
271 | +#define MIPS64_EF_CP0_EPC 34 |
272 | +#define MIPS64_EF_CP0_BADVADDR 35 |
273 | +#define MIPS64_EF_CP0_STATUS 36 |
274 | +#define MIPS64_EF_CP0_CAUSE 37 |
275 | + |
276 | +#define MIPS64_EF_SIZE 304 /* size in bytes */ |
277 | + |
278 | +#if defined(CONFIG_32BIT) |
279 | + |
280 | +#define EF_R0 MIPS32_EF_R0 |
281 | +#define EF_R1 MIPS32_EF_R1 |
282 | +#define EF_R2 MIPS32_EF_R2 |
283 | +#define EF_R3 MIPS32_EF_R3 |
284 | +#define EF_R4 MIPS32_EF_R4 |
285 | +#define EF_R5 MIPS32_EF_R5 |
286 | +#define EF_R6 MIPS32_EF_R6 |
287 | +#define EF_R7 MIPS32_EF_R7 |
288 | +#define EF_R8 MIPS32_EF_R8 |
289 | +#define EF_R9 MIPS32_EF_R9 |
290 | +#define EF_R10 MIPS32_EF_R10 |
291 | +#define EF_R11 MIPS32_EF_R11 |
292 | +#define EF_R12 MIPS32_EF_R12 |
293 | +#define EF_R13 MIPS32_EF_R13 |
294 | +#define EF_R14 MIPS32_EF_R14 |
295 | +#define EF_R15 MIPS32_EF_R15 |
296 | +#define EF_R16 MIPS32_EF_R16 |
297 | +#define EF_R17 MIPS32_EF_R17 |
298 | +#define EF_R18 MIPS32_EF_R18 |
299 | +#define EF_R19 MIPS32_EF_R19 |
300 | +#define EF_R20 MIPS32_EF_R20 |
301 | +#define EF_R21 MIPS32_EF_R21 |
302 | +#define EF_R22 MIPS32_EF_R22 |
303 | +#define EF_R23 MIPS32_EF_R23 |
304 | +#define EF_R24 MIPS32_EF_R24 |
305 | +#define EF_R25 MIPS32_EF_R25 |
306 | +#define EF_R26 MIPS32_EF_R26 |
307 | +#define EF_R27 MIPS32_EF_R27 |
308 | +#define EF_R28 MIPS32_EF_R28 |
309 | +#define EF_R29 MIPS32_EF_R29 |
310 | +#define EF_R30 MIPS32_EF_R30 |
311 | +#define EF_R31 MIPS32_EF_R31 |
312 | +#define EF_LO MIPS32_EF_LO |
313 | +#define EF_HI MIPS32_EF_HI |
314 | +#define EF_CP0_EPC MIPS32_EF_CP0_EPC |
315 | +#define EF_CP0_BADVADDR MIPS32_EF_CP0_BADVADDR |
316 | +#define EF_CP0_STATUS MIPS32_EF_CP0_STATUS |
317 | +#define EF_CP0_CAUSE MIPS32_EF_CP0_CAUSE |
318 | +#define EF_UNUSED0 MIPS32_EF_UNUSED0 |
319 | +#define EF_SIZE MIPS32_EF_SIZE |
320 | + |
321 | +#elif defined(CONFIG_64BIT) |
322 | + |
323 | +#define EF_R0 MIPS64_EF_R0 |
324 | +#define EF_R1 MIPS64_EF_R1 |
325 | +#define EF_R2 MIPS64_EF_R2 |
326 | +#define EF_R3 MIPS64_EF_R3 |
327 | +#define EF_R4 MIPS64_EF_R4 |
328 | +#define EF_R5 MIPS64_EF_R5 |
329 | +#define EF_R6 MIPS64_EF_R6 |
330 | +#define EF_R7 MIPS64_EF_R7 |
331 | +#define EF_R8 MIPS64_EF_R8 |
332 | +#define EF_R9 MIPS64_EF_R9 |
333 | +#define EF_R10 MIPS64_EF_R10 |
334 | +#define EF_R11 MIPS64_EF_R11 |
335 | +#define EF_R12 MIPS64_EF_R12 |
336 | +#define EF_R13 MIPS64_EF_R13 |
337 | +#define EF_R14 MIPS64_EF_R14 |
338 | +#define EF_R15 MIPS64_EF_R15 |
339 | +#define EF_R16 MIPS64_EF_R16 |
340 | +#define EF_R17 MIPS64_EF_R17 |
341 | +#define EF_R18 MIPS64_EF_R18 |
342 | +#define EF_R19 MIPS64_EF_R19 |
343 | +#define EF_R20 MIPS64_EF_R20 |
344 | +#define EF_R21 MIPS64_EF_R21 |
345 | +#define EF_R22 MIPS64_EF_R22 |
346 | +#define EF_R23 MIPS64_EF_R23 |
347 | +#define EF_R24 MIPS64_EF_R24 |
348 | +#define EF_R25 MIPS64_EF_R25 |
349 | +#define EF_R26 MIPS64_EF_R26 |
350 | +#define EF_R27 MIPS64_EF_R27 |
351 | +#define EF_R28 MIPS64_EF_R28 |
352 | +#define EF_R29 MIPS64_EF_R29 |
353 | +#define EF_R30 MIPS64_EF_R30 |
354 | +#define EF_R31 MIPS64_EF_R31 |
355 | +#define EF_LO MIPS64_EF_LO |
356 | +#define EF_HI MIPS64_EF_HI |
357 | +#define EF_CP0_EPC MIPS64_EF_CP0_EPC |
358 | +#define EF_CP0_BADVADDR MIPS64_EF_CP0_BADVADDR |
359 | +#define EF_CP0_STATUS MIPS64_EF_CP0_STATUS |
360 | +#define EF_CP0_CAUSE MIPS64_EF_CP0_CAUSE |
361 | +#define EF_SIZE MIPS64_EF_SIZE |
362 | |
363 | #endif /* CONFIG_64BIT */ |
364 | |
365 | diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c |
366 | index 7faf5f2bee25..71df942fb77c 100644 |
367 | --- a/arch/mips/kernel/binfmt_elfo32.c |
368 | +++ b/arch/mips/kernel/binfmt_elfo32.c |
369 | @@ -72,12 +72,6 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; |
370 | |
371 | #include <asm/processor.h> |
372 | |
373 | -/* |
374 | - * When this file is selected, we are definitely running a 64bit kernel. |
375 | - * So using the right regs define in asm/reg.h |
376 | - */ |
377 | -#define WANT_COMPAT_REG_H |
378 | - |
379 | /* These MUST be defined before elf.h gets included */ |
380 | extern void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs); |
381 | #define ELF_CORE_COPY_REGS(_dest, _regs) elf32_core_copy_regs(_dest, _regs); |
382 | @@ -149,21 +143,21 @@ void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs) |
383 | { |
384 | int i; |
385 | |
386 | - for (i = 0; i < EF_R0; i++) |
387 | + for (i = 0; i < MIPS32_EF_R0; i++) |
388 | grp[i] = 0; |
389 | - grp[EF_R0] = 0; |
390 | + grp[MIPS32_EF_R0] = 0; |
391 | for (i = 1; i <= 31; i++) |
392 | - grp[EF_R0 + i] = (elf_greg_t) regs->regs[i]; |
393 | - grp[EF_R26] = 0; |
394 | - grp[EF_R27] = 0; |
395 | - grp[EF_LO] = (elf_greg_t) regs->lo; |
396 | - grp[EF_HI] = (elf_greg_t) regs->hi; |
397 | - grp[EF_CP0_EPC] = (elf_greg_t) regs->cp0_epc; |
398 | - grp[EF_CP0_BADVADDR] = (elf_greg_t) regs->cp0_badvaddr; |
399 | - grp[EF_CP0_STATUS] = (elf_greg_t) regs->cp0_status; |
400 | - grp[EF_CP0_CAUSE] = (elf_greg_t) regs->cp0_cause; |
401 | -#ifdef EF_UNUSED0 |
402 | - grp[EF_UNUSED0] = 0; |
403 | + grp[MIPS32_EF_R0 + i] = (elf_greg_t) regs->regs[i]; |
404 | + grp[MIPS32_EF_R26] = 0; |
405 | + grp[MIPS32_EF_R27] = 0; |
406 | + grp[MIPS32_EF_LO] = (elf_greg_t) regs->lo; |
407 | + grp[MIPS32_EF_HI] = (elf_greg_t) regs->hi; |
408 | + grp[MIPS32_EF_CP0_EPC] = (elf_greg_t) regs->cp0_epc; |
409 | + grp[MIPS32_EF_CP0_BADVADDR] = (elf_greg_t) regs->cp0_badvaddr; |
410 | + grp[MIPS32_EF_CP0_STATUS] = (elf_greg_t) regs->cp0_status; |
411 | + grp[MIPS32_EF_CP0_CAUSE] = (elf_greg_t) regs->cp0_cause; |
412 | +#ifdef MIPS32_EF_UNUSED0 |
413 | + grp[MIPS32_EF_UNUSED0] = 0; |
414 | #endif |
415 | } |
416 | |
417 | diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c |
418 | index 5b5ddb231f26..78f18436cdf2 100644 |
419 | --- a/arch/mips/kernel/irq-gic.c |
420 | +++ b/arch/mips/kernel/irq-gic.c |
421 | @@ -255,11 +255,13 @@ static void __init gic_setup_intr(unsigned int intr, unsigned int cpu, |
422 | |
423 | /* Setup Intr to Pin mapping */ |
424 | if (pin & GIC_MAP_TO_NMI_MSK) { |
425 | + int i; |
426 | + |
427 | GICWRITE(GIC_REG_ADDR(SHARED, GIC_SH_MAP_TO_PIN(intr)), pin); |
428 | /* FIXME: hack to route NMI to all cpu's */ |
429 | - for (cpu = 0; cpu < NR_CPUS; cpu += 32) { |
430 | + for (i = 0; i < NR_CPUS; i += 32) { |
431 | GICWRITE(GIC_REG_ADDR(SHARED, |
432 | - GIC_SH_MAP_TO_VPE_REG_OFF(intr, cpu)), |
433 | + GIC_SH_MAP_TO_VPE_REG_OFF(intr, i)), |
434 | 0xffffffff); |
435 | } |
436 | } else { |
437 | diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c |
438 | index 7da9b76db4d9..60f48febe762 100644 |
439 | --- a/arch/mips/kernel/ptrace.c |
440 | +++ b/arch/mips/kernel/ptrace.c |
441 | @@ -170,6 +170,7 @@ int ptrace_setfpregs(struct task_struct *child, __u32 __user *data) |
442 | __get_user(fregs[i], i + (__u64 __user *) data); |
443 | |
444 | __get_user(child->thread.fpu.fcr31, data + 64); |
445 | + child->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X; |
446 | |
447 | /* FIR may not be written. */ |
448 | |
449 | @@ -265,36 +266,160 @@ int ptrace_set_watch_regs(struct task_struct *child, |
450 | |
451 | /* regset get/set implementations */ |
452 | |
453 | -static int gpr_get(struct task_struct *target, |
454 | - const struct user_regset *regset, |
455 | - unsigned int pos, unsigned int count, |
456 | - void *kbuf, void __user *ubuf) |
457 | +#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_O32) |
458 | + |
459 | +static int gpr32_get(struct task_struct *target, |
460 | + const struct user_regset *regset, |
461 | + unsigned int pos, unsigned int count, |
462 | + void *kbuf, void __user *ubuf) |
463 | { |
464 | struct pt_regs *regs = task_pt_regs(target); |
465 | + u32 uregs[ELF_NGREG] = {}; |
466 | + unsigned i; |
467 | |
468 | - return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
469 | - regs, 0, sizeof(*regs)); |
470 | + for (i = MIPS32_EF_R1; i <= MIPS32_EF_R31; i++) { |
471 | + /* k0/k1 are copied as zero. */ |
472 | + if (i == MIPS32_EF_R26 || i == MIPS32_EF_R27) |
473 | + continue; |
474 | + |
475 | + uregs[i] = regs->regs[i - MIPS32_EF_R0]; |
476 | + } |
477 | + |
478 | + uregs[MIPS32_EF_LO] = regs->lo; |
479 | + uregs[MIPS32_EF_HI] = regs->hi; |
480 | + uregs[MIPS32_EF_CP0_EPC] = regs->cp0_epc; |
481 | + uregs[MIPS32_EF_CP0_BADVADDR] = regs->cp0_badvaddr; |
482 | + uregs[MIPS32_EF_CP0_STATUS] = regs->cp0_status; |
483 | + uregs[MIPS32_EF_CP0_CAUSE] = regs->cp0_cause; |
484 | + |
485 | + return user_regset_copyout(&pos, &count, &kbuf, &ubuf, uregs, 0, |
486 | + sizeof(uregs)); |
487 | } |
488 | |
489 | -static int gpr_set(struct task_struct *target, |
490 | - const struct user_regset *regset, |
491 | - unsigned int pos, unsigned int count, |
492 | - const void *kbuf, const void __user *ubuf) |
493 | +static int gpr32_set(struct task_struct *target, |
494 | + const struct user_regset *regset, |
495 | + unsigned int pos, unsigned int count, |
496 | + const void *kbuf, const void __user *ubuf) |
497 | { |
498 | - struct pt_regs newregs; |
499 | - int ret; |
500 | + struct pt_regs *regs = task_pt_regs(target); |
501 | + u32 uregs[ELF_NGREG]; |
502 | + unsigned start, num_regs, i; |
503 | + int err; |
504 | |
505 | - ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
506 | - &newregs, |
507 | - 0, sizeof(newregs)); |
508 | - if (ret) |
509 | - return ret; |
510 | + start = pos / sizeof(u32); |
511 | + num_regs = count / sizeof(u32); |
512 | |
513 | - *task_pt_regs(target) = newregs; |
514 | + if (start + num_regs > ELF_NGREG) |
515 | + return -EIO; |
516 | + |
517 | + err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, uregs, 0, |
518 | + sizeof(uregs)); |
519 | + if (err) |
520 | + return err; |
521 | + |
522 | + for (i = start; i < num_regs; i++) { |
523 | + /* |
524 | + * Cast all values to signed here so that if this is a 64-bit |
525 | + * kernel, the supplied 32-bit values will be sign extended. |
526 | + */ |
527 | + switch (i) { |
528 | + case MIPS32_EF_R1 ... MIPS32_EF_R25: |
529 | + /* k0/k1 are ignored. */ |
530 | + case MIPS32_EF_R28 ... MIPS32_EF_R31: |
531 | + regs->regs[i - MIPS32_EF_R0] = (s32)uregs[i]; |
532 | + break; |
533 | + case MIPS32_EF_LO: |
534 | + regs->lo = (s32)uregs[i]; |
535 | + break; |
536 | + case MIPS32_EF_HI: |
537 | + regs->hi = (s32)uregs[i]; |
538 | + break; |
539 | + case MIPS32_EF_CP0_EPC: |
540 | + regs->cp0_epc = (s32)uregs[i]; |
541 | + break; |
542 | + } |
543 | + } |
544 | |
545 | return 0; |
546 | } |
547 | |
548 | +#endif /* CONFIG_32BIT || CONFIG_MIPS32_O32 */ |
549 | + |
550 | +#ifdef CONFIG_64BIT |
551 | + |
552 | +static int gpr64_get(struct task_struct *target, |
553 | + const struct user_regset *regset, |
554 | + unsigned int pos, unsigned int count, |
555 | + void *kbuf, void __user *ubuf) |
556 | +{ |
557 | + struct pt_regs *regs = task_pt_regs(target); |
558 | + u64 uregs[ELF_NGREG] = {}; |
559 | + unsigned i; |
560 | + |
561 | + for (i = MIPS64_EF_R1; i <= MIPS64_EF_R31; i++) { |
562 | + /* k0/k1 are copied as zero. */ |
563 | + if (i == MIPS64_EF_R26 || i == MIPS64_EF_R27) |
564 | + continue; |
565 | + |
566 | + uregs[i] = regs->regs[i - MIPS64_EF_R0]; |
567 | + } |
568 | + |
569 | + uregs[MIPS64_EF_LO] = regs->lo; |
570 | + uregs[MIPS64_EF_HI] = regs->hi; |
571 | + uregs[MIPS64_EF_CP0_EPC] = regs->cp0_epc; |
572 | + uregs[MIPS64_EF_CP0_BADVADDR] = regs->cp0_badvaddr; |
573 | + uregs[MIPS64_EF_CP0_STATUS] = regs->cp0_status; |
574 | + uregs[MIPS64_EF_CP0_CAUSE] = regs->cp0_cause; |
575 | + |
576 | + return user_regset_copyout(&pos, &count, &kbuf, &ubuf, uregs, 0, |
577 | + sizeof(uregs)); |
578 | +} |
579 | + |
580 | +static int gpr64_set(struct task_struct *target, |
581 | + const struct user_regset *regset, |
582 | + unsigned int pos, unsigned int count, |
583 | + const void *kbuf, const void __user *ubuf) |
584 | +{ |
585 | + struct pt_regs *regs = task_pt_regs(target); |
586 | + u64 uregs[ELF_NGREG]; |
587 | + unsigned start, num_regs, i; |
588 | + int err; |
589 | + |
590 | + start = pos / sizeof(u64); |
591 | + num_regs = count / sizeof(u64); |
592 | + |
593 | + if (start + num_regs > ELF_NGREG) |
594 | + return -EIO; |
595 | + |
596 | + err = user_regset_copyin(&pos, &count, &kbuf, &ubuf, uregs, 0, |
597 | + sizeof(uregs)); |
598 | + if (err) |
599 | + return err; |
600 | + |
601 | + for (i = start; i < num_regs; i++) { |
602 | + switch (i) { |
603 | + case MIPS64_EF_R1 ... MIPS64_EF_R25: |
604 | + /* k0/k1 are ignored. */ |
605 | + case MIPS64_EF_R28 ... MIPS64_EF_R31: |
606 | + regs->regs[i - MIPS64_EF_R0] = uregs[i]; |
607 | + break; |
608 | + case MIPS64_EF_LO: |
609 | + regs->lo = uregs[i]; |
610 | + break; |
611 | + case MIPS64_EF_HI: |
612 | + regs->hi = uregs[i]; |
613 | + break; |
614 | + case MIPS64_EF_CP0_EPC: |
615 | + regs->cp0_epc = uregs[i]; |
616 | + break; |
617 | + } |
618 | + } |
619 | + |
620 | + return 0; |
621 | +} |
622 | + |
623 | +#endif /* CONFIG_64BIT */ |
624 | + |
625 | static int fpr_get(struct task_struct *target, |
626 | const struct user_regset *regset, |
627 | unsigned int pos, unsigned int count, |
628 | @@ -322,14 +447,16 @@ enum mips_regset { |
629 | REGSET_FPR, |
630 | }; |
631 | |
632 | +#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_O32) |
633 | + |
634 | static const struct user_regset mips_regsets[] = { |
635 | [REGSET_GPR] = { |
636 | .core_note_type = NT_PRSTATUS, |
637 | .n = ELF_NGREG, |
638 | .size = sizeof(unsigned int), |
639 | .align = sizeof(unsigned int), |
640 | - .get = gpr_get, |
641 | - .set = gpr_set, |
642 | + .get = gpr32_get, |
643 | + .set = gpr32_set, |
644 | }, |
645 | [REGSET_FPR] = { |
646 | .core_note_type = NT_PRFPREG, |
647 | @@ -349,14 +476,18 @@ static const struct user_regset_view user_mips_view = { |
648 | .n = ARRAY_SIZE(mips_regsets), |
649 | }; |
650 | |
651 | +#endif /* CONFIG_32BIT || CONFIG_MIPS32_O32 */ |
652 | + |
653 | +#ifdef CONFIG_64BIT |
654 | + |
655 | static const struct user_regset mips64_regsets[] = { |
656 | [REGSET_GPR] = { |
657 | .core_note_type = NT_PRSTATUS, |
658 | .n = ELF_NGREG, |
659 | .size = sizeof(unsigned long), |
660 | .align = sizeof(unsigned long), |
661 | - .get = gpr_get, |
662 | - .set = gpr_set, |
663 | + .get = gpr64_get, |
664 | + .set = gpr64_set, |
665 | }, |
666 | [REGSET_FPR] = { |
667 | .core_note_type = NT_PRFPREG, |
668 | @@ -369,25 +500,26 @@ static const struct user_regset mips64_regsets[] = { |
669 | }; |
670 | |
671 | static const struct user_regset_view user_mips64_view = { |
672 | - .name = "mips", |
673 | + .name = "mips64", |
674 | .e_machine = ELF_ARCH, |
675 | .ei_osabi = ELF_OSABI, |
676 | .regsets = mips64_regsets, |
677 | - .n = ARRAY_SIZE(mips_regsets), |
678 | + .n = ARRAY_SIZE(mips64_regsets), |
679 | }; |
680 | |
681 | +#endif /* CONFIG_64BIT */ |
682 | + |
683 | const struct user_regset_view *task_user_regset_view(struct task_struct *task) |
684 | { |
685 | #ifdef CONFIG_32BIT |
686 | return &user_mips_view; |
687 | -#endif |
688 | - |
689 | +#else |
690 | #ifdef CONFIG_MIPS32_O32 |
691 | - if (test_thread_flag(TIF_32BIT_REGS)) |
692 | - return &user_mips_view; |
693 | + if (test_tsk_thread_flag(task, TIF_32BIT_REGS)) |
694 | + return &user_mips_view; |
695 | #endif |
696 | - |
697 | return &user_mips64_view; |
698 | +#endif |
699 | } |
700 | |
701 | long arch_ptrace(struct task_struct *child, long request, |
702 | @@ -593,7 +725,7 @@ long arch_ptrace(struct task_struct *child, long request, |
703 | break; |
704 | #endif |
705 | case FPC_CSR: |
706 | - child->thread.fpu.fcr31 = data; |
707 | + child->thread.fpu.fcr31 = data & ~FPU_CSR_ALL_X; |
708 | break; |
709 | case DSP_BASE ... DSP_BASE + 5: { |
710 | dspreg_t *dregs; |
711 | diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c |
712 | index c369a5d35527..b897dde93e7a 100644 |
713 | --- a/arch/mips/kernel/unaligned.c |
714 | +++ b/arch/mips/kernel/unaligned.c |
715 | @@ -605,7 +605,6 @@ static void emulate_load_store_insn(struct pt_regs *regs, |
716 | case sdc1_op: |
717 | die_if_kernel("Unaligned FP access in kernel code", regs); |
718 | BUG_ON(!used_math()); |
719 | - BUG_ON(!is_fpu_owner()); |
720 | |
721 | lose_fpu(1); /* Save FPU state for the emulator. */ |
722 | res = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1, |
723 | diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c |
724 | index b234b1b5ccad..65d452aa1fda 100644 |
725 | --- a/arch/mips/mm/tlbex.c |
726 | +++ b/arch/mips/mm/tlbex.c |
727 | @@ -1295,6 +1295,7 @@ static void build_r4000_tlb_refill_handler(void) |
728 | } |
729 | #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT |
730 | uasm_l_tlb_huge_update(&l, p); |
731 | + UASM_i_LW(&p, K0, 0, K1); |
732 | build_huge_update_entries(&p, htlb_info.huge_pte, K1); |
733 | build_huge_tlb_write_entry(&p, &l, &r, K0, tlb_random, |
734 | htlb_info.restore_scratch); |
735 | diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h |
736 | index ad3025d0880b..f20786825b8f 100644 |
737 | --- a/arch/powerpc/include/asm/machdep.h |
738 | +++ b/arch/powerpc/include/asm/machdep.h |
739 | @@ -57,10 +57,10 @@ struct machdep_calls { |
740 | void (*hpte_removebolted)(unsigned long ea, |
741 | int psize, int ssize); |
742 | void (*flush_hash_range)(unsigned long number, int local); |
743 | - void (*hugepage_invalidate)(struct mm_struct *mm, |
744 | + void (*hugepage_invalidate)(unsigned long vsid, |
745 | + unsigned long addr, |
746 | unsigned char *hpte_slot_array, |
747 | - unsigned long addr, int psize); |
748 | - |
749 | + int psize, int ssize); |
750 | /* special for kexec, to be called in real mode, linear mapping is |
751 | * destroyed as well */ |
752 | void (*hpte_clear_all)(void); |
753 | diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h |
754 | index eb9261024f51..7b3d54fae46f 100644 |
755 | --- a/arch/powerpc/include/asm/pgtable-ppc64.h |
756 | +++ b/arch/powerpc/include/asm/pgtable-ppc64.h |
757 | @@ -413,7 +413,7 @@ static inline char *get_hpte_slot_array(pmd_t *pmdp) |
758 | } |
759 | |
760 | extern void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, |
761 | - pmd_t *pmdp); |
762 | + pmd_t *pmdp, unsigned long old_pmd); |
763 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
764 | extern pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot); |
765 | extern pmd_t mk_pmd(struct page *page, pgprot_t pgprot); |
766 | diff --git a/arch/powerpc/include/asm/pte-hash64-64k.h b/arch/powerpc/include/asm/pte-hash64-64k.h |
767 | index d836d945068d..9ecede1e124c 100644 |
768 | --- a/arch/powerpc/include/asm/pte-hash64-64k.h |
769 | +++ b/arch/powerpc/include/asm/pte-hash64-64k.h |
770 | @@ -46,11 +46,31 @@ |
771 | * in order to deal with 64K made of 4K HW pages. Thus we override the |
772 | * generic accessors and iterators here |
773 | */ |
774 | -#define __real_pte(e,p) ((real_pte_t) { \ |
775 | - (e), (pte_val(e) & _PAGE_COMBO) ? \ |
776 | - (pte_val(*((p) + PTRS_PER_PTE))) : 0 }) |
777 | -#define __rpte_to_hidx(r,index) ((pte_val((r).pte) & _PAGE_COMBO) ? \ |
778 | - (((r).hidx >> ((index)<<2)) & 0xf) : ((pte_val((r).pte) >> 12) & 0xf)) |
779 | +#define __real_pte __real_pte |
780 | +static inline real_pte_t __real_pte(pte_t pte, pte_t *ptep) |
781 | +{ |
782 | + real_pte_t rpte; |
783 | + |
784 | + rpte.pte = pte; |
785 | + rpte.hidx = 0; |
786 | + if (pte_val(pte) & _PAGE_COMBO) { |
787 | + /* |
788 | + * Make sure we order the hidx load against the _PAGE_COMBO |
789 | + * check. The store side ordering is done in __hash_page_4K |
790 | + */ |
791 | + smp_rmb(); |
792 | + rpte.hidx = pte_val(*((ptep) + PTRS_PER_PTE)); |
793 | + } |
794 | + return rpte; |
795 | +} |
796 | + |
797 | +static inline unsigned long __rpte_to_hidx(real_pte_t rpte, unsigned long index) |
798 | +{ |
799 | + if ((pte_val(rpte.pte) & _PAGE_COMBO)) |
800 | + return (rpte.hidx >> (index<<2)) & 0xf; |
801 | + return (pte_val(rpte.pte) >> 12) & 0xf; |
802 | +} |
803 | + |
804 | #define __rpte_to_pte(r) ((r).pte) |
805 | #define __rpte_sub_valid(rpte, index) \ |
806 | (pte_val(rpte.pte) & (_PAGE_HPTE_SUB0 >> (index))) |
807 | diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c |
808 | index 3ea26c25590b..838de8e17dc5 100644 |
809 | --- a/arch/powerpc/mm/hash_native_64.c |
810 | +++ b/arch/powerpc/mm/hash_native_64.c |
811 | @@ -418,18 +418,18 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long vpn, |
812 | local_irq_restore(flags); |
813 | } |
814 | |
815 | -static void native_hugepage_invalidate(struct mm_struct *mm, |
816 | +static void native_hugepage_invalidate(unsigned long vsid, |
817 | + unsigned long addr, |
818 | unsigned char *hpte_slot_array, |
819 | - unsigned long addr, int psize) |
820 | + int psize, int ssize) |
821 | { |
822 | - int ssize = 0, i; |
823 | - int lock_tlbie; |
824 | + int i; |
825 | struct hash_pte *hptep; |
826 | int actual_psize = MMU_PAGE_16M; |
827 | unsigned int max_hpte_count, valid; |
828 | unsigned long flags, s_addr = addr; |
829 | unsigned long hpte_v, want_v, shift; |
830 | - unsigned long hidx, vpn = 0, vsid, hash, slot; |
831 | + unsigned long hidx, vpn = 0, hash, slot; |
832 | |
833 | shift = mmu_psize_defs[psize].shift; |
834 | max_hpte_count = 1U << (PMD_SHIFT - shift); |
835 | @@ -443,15 +443,6 @@ static void native_hugepage_invalidate(struct mm_struct *mm, |
836 | |
837 | /* get the vpn */ |
838 | addr = s_addr + (i * (1ul << shift)); |
839 | - if (!is_kernel_addr(addr)) { |
840 | - ssize = user_segment_size(addr); |
841 | - vsid = get_vsid(mm->context.id, addr, ssize); |
842 | - WARN_ON(vsid == 0); |
843 | - } else { |
844 | - vsid = get_kernel_vsid(addr, mmu_kernel_ssize); |
845 | - ssize = mmu_kernel_ssize; |
846 | - } |
847 | - |
848 | vpn = hpt_vpn(addr, vsid, ssize); |
849 | hash = hpt_hash(vpn, shift, ssize); |
850 | if (hidx & _PTEIDX_SECONDARY) |
851 | @@ -471,22 +462,13 @@ static void native_hugepage_invalidate(struct mm_struct *mm, |
852 | else |
853 | /* Invalidate the hpte. NOTE: this also unlocks it */ |
854 | hptep->v = 0; |
855 | + /* |
856 | + * We need to do tlb invalidate for all the address, tlbie |
857 | + * instruction compares entry_VA in tlb with the VA specified |
858 | + * here |
859 | + */ |
860 | + tlbie(vpn, psize, actual_psize, ssize, 0); |
861 | } |
862 | - /* |
863 | - * Since this is a hugepage, we just need a single tlbie. |
864 | - * use the last vpn. |
865 | - */ |
866 | - lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE); |
867 | - if (lock_tlbie) |
868 | - raw_spin_lock(&native_tlbie_lock); |
869 | - |
870 | - asm volatile("ptesync":::"memory"); |
871 | - __tlbie(vpn, psize, actual_psize, ssize); |
872 | - asm volatile("eieio; tlbsync; ptesync":::"memory"); |
873 | - |
874 | - if (lock_tlbie) |
875 | - raw_spin_unlock(&native_tlbie_lock); |
876 | - |
877 | local_irq_restore(flags); |
878 | } |
879 | |
880 | diff --git a/arch/powerpc/mm/hugepage-hash64.c b/arch/powerpc/mm/hugepage-hash64.c |
881 | index 826893fcb3a7..5f5e6328c21c 100644 |
882 | --- a/arch/powerpc/mm/hugepage-hash64.c |
883 | +++ b/arch/powerpc/mm/hugepage-hash64.c |
884 | @@ -18,6 +18,57 @@ |
885 | #include <linux/mm.h> |
886 | #include <asm/machdep.h> |
887 | |
888 | +static void invalidate_old_hpte(unsigned long vsid, unsigned long addr, |
889 | + pmd_t *pmdp, unsigned int psize, int ssize) |
890 | +{ |
891 | + int i, max_hpte_count, valid; |
892 | + unsigned long s_addr; |
893 | + unsigned char *hpte_slot_array; |
894 | + unsigned long hidx, shift, vpn, hash, slot; |
895 | + |
896 | + s_addr = addr & HPAGE_PMD_MASK; |
897 | + hpte_slot_array = get_hpte_slot_array(pmdp); |
898 | + /* |
899 | + * IF we try to do a HUGE PTE update after a withdraw is done. |
900 | + * we will find the below NULL. This happens when we do |
901 | + * split_huge_page_pmd |
902 | + */ |
903 | + if (!hpte_slot_array) |
904 | + return; |
905 | + |
906 | + if (ppc_md.hugepage_invalidate) |
907 | + return ppc_md.hugepage_invalidate(vsid, s_addr, hpte_slot_array, |
908 | + psize, ssize); |
909 | + /* |
910 | + * No bluk hpte removal support, invalidate each entry |
911 | + */ |
912 | + shift = mmu_psize_defs[psize].shift; |
913 | + max_hpte_count = HPAGE_PMD_SIZE >> shift; |
914 | + for (i = 0; i < max_hpte_count; i++) { |
915 | + /* |
916 | + * 8 bits per each hpte entries |
917 | + * 000| [ secondary group (one bit) | hidx (3 bits) | valid bit] |
918 | + */ |
919 | + valid = hpte_valid(hpte_slot_array, i); |
920 | + if (!valid) |
921 | + continue; |
922 | + hidx = hpte_hash_index(hpte_slot_array, i); |
923 | + |
924 | + /* get the vpn */ |
925 | + addr = s_addr + (i * (1ul << shift)); |
926 | + vpn = hpt_vpn(addr, vsid, ssize); |
927 | + hash = hpt_hash(vpn, shift, ssize); |
928 | + if (hidx & _PTEIDX_SECONDARY) |
929 | + hash = ~hash; |
930 | + |
931 | + slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; |
932 | + slot += hidx & _PTEIDX_GROUP_IX; |
933 | + ppc_md.hpte_invalidate(slot, vpn, psize, |
934 | + MMU_PAGE_16M, ssize, 0); |
935 | + } |
936 | +} |
937 | + |
938 | + |
939 | int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, |
940 | pmd_t *pmdp, unsigned long trap, int local, int ssize, |
941 | unsigned int psize) |
942 | @@ -33,7 +84,9 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, |
943 | * atomically mark the linux large page PMD busy and dirty |
944 | */ |
945 | do { |
946 | - old_pmd = pmd_val(*pmdp); |
947 | + pmd_t pmd = ACCESS_ONCE(*pmdp); |
948 | + |
949 | + old_pmd = pmd_val(pmd); |
950 | /* If PMD busy, retry the access */ |
951 | if (unlikely(old_pmd & _PAGE_BUSY)) |
952 | return 0; |
953 | @@ -85,6 +138,15 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, |
954 | vpn = hpt_vpn(ea, vsid, ssize); |
955 | hash = hpt_hash(vpn, shift, ssize); |
956 | hpte_slot_array = get_hpte_slot_array(pmdp); |
957 | + if (psize == MMU_PAGE_4K) { |
958 | + /* |
959 | + * invalidate the old hpte entry if we have that mapped via 64K |
960 | + * base page size. This is because demote_segment won't flush |
961 | + * hash page table entries. |
962 | + */ |
963 | + if ((old_pmd & _PAGE_HASHPTE) && !(old_pmd & _PAGE_COMBO)) |
964 | + invalidate_old_hpte(vsid, ea, pmdp, MMU_PAGE_64K, ssize); |
965 | + } |
966 | |
967 | valid = hpte_valid(hpte_slot_array, index); |
968 | if (valid) { |
969 | @@ -107,11 +169,8 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, |
970 | * safely update this here. |
971 | */ |
972 | valid = 0; |
973 | - new_pmd &= ~_PAGE_HPTEFLAGS; |
974 | hpte_slot_array[index] = 0; |
975 | - } else |
976 | - /* clear the busy bits and set the hash pte bits */ |
977 | - new_pmd = (new_pmd & ~_PAGE_HPTEFLAGS) | _PAGE_HASHPTE; |
978 | + } |
979 | } |
980 | |
981 | if (!valid) { |
982 | @@ -119,11 +178,7 @@ int __hash_page_thp(unsigned long ea, unsigned long access, unsigned long vsid, |
983 | |
984 | /* insert new entry */ |
985 | pa = pmd_pfn(__pmd(old_pmd)) << PAGE_SHIFT; |
986 | -repeat: |
987 | - hpte_group = ((hash & htab_hash_mask) * HPTES_PER_GROUP) & ~0x7UL; |
988 | - |
989 | - /* clear the busy bits and set the hash pte bits */ |
990 | - new_pmd = (new_pmd & ~_PAGE_HPTEFLAGS) | _PAGE_HASHPTE; |
991 | + new_pmd |= _PAGE_HASHPTE; |
992 | |
993 | /* Add in WIMG bits */ |
994 | rflags |= (new_pmd & (_PAGE_WRITETHRU | _PAGE_NO_CACHE | |
995 | @@ -132,6 +187,8 @@ repeat: |
996 | * enable the memory coherence always |
997 | */ |
998 | rflags |= HPTE_R_M; |
999 | +repeat: |
1000 | + hpte_group = ((hash & htab_hash_mask) * HPTES_PER_GROUP) & ~0x7UL; |
1001 | |
1002 | /* Insert into the hash table, primary slot */ |
1003 | slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags, 0, |
1004 | @@ -172,8 +229,17 @@ repeat: |
1005 | mark_hpte_slot_valid(hpte_slot_array, index, slot); |
1006 | } |
1007 | /* |
1008 | - * No need to use ldarx/stdcx here |
1009 | + * Mark the pte with _PAGE_COMBO, if we are trying to hash it with |
1010 | + * base page size 4k. |
1011 | + */ |
1012 | + if (psize == MMU_PAGE_4K) |
1013 | + new_pmd |= _PAGE_COMBO; |
1014 | + /* |
1015 | + * The hpte valid is stored in the pgtable whose address is in the |
1016 | + * second half of the PMD. Order this against clearing of the busy bit in |
1017 | + * huge pmd. |
1018 | */ |
1019 | + smp_wmb(); |
1020 | *pmdp = __pmd(new_pmd & ~_PAGE_BUSY); |
1021 | return 0; |
1022 | } |
1023 | diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c |
1024 | index 30a42e24bf14..a5fff173be4f 100644 |
1025 | --- a/arch/powerpc/mm/numa.c |
1026 | +++ b/arch/powerpc/mm/numa.c |
1027 | @@ -610,8 +610,8 @@ static int cpu_numa_callback(struct notifier_block *nfb, unsigned long action, |
1028 | case CPU_UP_CANCELED: |
1029 | case CPU_UP_CANCELED_FROZEN: |
1030 | unmap_cpu_from_node(lcpu); |
1031 | - break; |
1032 | ret = NOTIFY_OK; |
1033 | + break; |
1034 | #endif |
1035 | } |
1036 | return ret; |
1037 | diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c |
1038 | index 62bf5e8e78da..c64da56d7582 100644 |
1039 | --- a/arch/powerpc/mm/pgtable_64.c |
1040 | +++ b/arch/powerpc/mm/pgtable_64.c |
1041 | @@ -538,7 +538,7 @@ unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, |
1042 | *pmdp = __pmd((old & ~clr) | set); |
1043 | #endif |
1044 | if (old & _PAGE_HASHPTE) |
1045 | - hpte_do_hugepage_flush(mm, addr, pmdp); |
1046 | + hpte_do_hugepage_flush(mm, addr, pmdp, old); |
1047 | return old; |
1048 | } |
1049 | |
1050 | @@ -645,7 +645,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, |
1051 | if (!(old & _PAGE_SPLITTING)) { |
1052 | /* We need to flush the hpte */ |
1053 | if (old & _PAGE_HASHPTE) |
1054 | - hpte_do_hugepage_flush(vma->vm_mm, address, pmdp); |
1055 | + hpte_do_hugepage_flush(vma->vm_mm, address, pmdp, old); |
1056 | } |
1057 | } |
1058 | |
1059 | @@ -718,7 +718,7 @@ void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, |
1060 | * neesd to be flushed. |
1061 | */ |
1062 | void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, |
1063 | - pmd_t *pmdp) |
1064 | + pmd_t *pmdp, unsigned long old_pmd) |
1065 | { |
1066 | int ssize, i; |
1067 | unsigned long s_addr; |
1068 | @@ -740,12 +740,29 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, |
1069 | if (!hpte_slot_array) |
1070 | return; |
1071 | |
1072 | - /* get the base page size */ |
1073 | + /* get the base page size,vsid and segment size */ |
1074 | +#ifdef CONFIG_DEBUG_VM |
1075 | psize = get_slice_psize(mm, s_addr); |
1076 | + BUG_ON(psize == MMU_PAGE_16M); |
1077 | +#endif |
1078 | + if (old_pmd & _PAGE_COMBO) |
1079 | + psize = MMU_PAGE_4K; |
1080 | + else |
1081 | + psize = MMU_PAGE_64K; |
1082 | + |
1083 | + if (!is_kernel_addr(s_addr)) { |
1084 | + ssize = user_segment_size(s_addr); |
1085 | + vsid = get_vsid(mm->context.id, s_addr, ssize); |
1086 | + WARN_ON(vsid == 0); |
1087 | + } else { |
1088 | + vsid = get_kernel_vsid(s_addr, mmu_kernel_ssize); |
1089 | + ssize = mmu_kernel_ssize; |
1090 | + } |
1091 | |
1092 | if (ppc_md.hugepage_invalidate) |
1093 | - return ppc_md.hugepage_invalidate(mm, hpte_slot_array, |
1094 | - s_addr, psize); |
1095 | + return ppc_md.hugepage_invalidate(vsid, s_addr, |
1096 | + hpte_slot_array, |
1097 | + psize, ssize); |
1098 | /* |
1099 | * No bluk hpte removal support, invalidate each entry |
1100 | */ |
1101 | @@ -763,15 +780,6 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr, |
1102 | |
1103 | /* get the vpn */ |
1104 | addr = s_addr + (i * (1ul << shift)); |
1105 | - if (!is_kernel_addr(addr)) { |
1106 | - ssize = user_segment_size(addr); |
1107 | - vsid = get_vsid(mm->context.id, addr, ssize); |
1108 | - WARN_ON(vsid == 0); |
1109 | - } else { |
1110 | - vsid = get_kernel_vsid(addr, mmu_kernel_ssize); |
1111 | - ssize = mmu_kernel_ssize; |
1112 | - } |
1113 | - |
1114 | vpn = hpt_vpn(addr, vsid, ssize); |
1115 | hash = hpt_hash(vpn, shift, ssize); |
1116 | if (hidx & _PTEIDX_SECONDARY) |
1117 | diff --git a/arch/powerpc/mm/tlb_hash64.c b/arch/powerpc/mm/tlb_hash64.c |
1118 | index c99f6510a0b2..9adda5790463 100644 |
1119 | --- a/arch/powerpc/mm/tlb_hash64.c |
1120 | +++ b/arch/powerpc/mm/tlb_hash64.c |
1121 | @@ -216,7 +216,7 @@ void __flush_hash_table_range(struct mm_struct *mm, unsigned long start, |
1122 | if (!(pte & _PAGE_HASHPTE)) |
1123 | continue; |
1124 | if (unlikely(hugepage_shift && pmd_trans_huge(*(pmd_t *)pte))) |
1125 | - hpte_do_hugepage_flush(mm, start, (pmd_t *)pte); |
1126 | + hpte_do_hugepage_flush(mm, start, (pmd_t *)ptep, pte); |
1127 | else |
1128 | hpte_need_flush(mm, start, ptep, pte, 0); |
1129 | } |
1130 | diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c |
1131 | index 9590dbb756f2..b9a82042760f 100644 |
1132 | --- a/arch/powerpc/platforms/pseries/hotplug-memory.c |
1133 | +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c |
1134 | @@ -160,7 +160,7 @@ static int pseries_remove_memory(struct device_node *np) |
1135 | static inline int pseries_remove_memblock(unsigned long base, |
1136 | unsigned int memblock_size) |
1137 | { |
1138 | - return -EOPNOTSUPP; |
1139 | + return 0; |
1140 | } |
1141 | static inline int pseries_remove_memory(struct device_node *np) |
1142 | { |
1143 | diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c |
1144 | index 33b552ffbe57..4642d6a4d356 100644 |
1145 | --- a/arch/powerpc/platforms/pseries/iommu.c |
1146 | +++ b/arch/powerpc/platforms/pseries/iommu.c |
1147 | @@ -721,13 +721,13 @@ static int __init disable_ddw_setup(char *str) |
1148 | |
1149 | early_param("disable_ddw", disable_ddw_setup); |
1150 | |
1151 | -static void remove_ddw(struct device_node *np) |
1152 | +static void remove_ddw(struct device_node *np, bool remove_prop) |
1153 | { |
1154 | struct dynamic_dma_window_prop *dwp; |
1155 | struct property *win64; |
1156 | const u32 *ddw_avail; |
1157 | u64 liobn; |
1158 | - int len, ret; |
1159 | + int len, ret = 0; |
1160 | |
1161 | ddw_avail = of_get_property(np, "ibm,ddw-applicable", &len); |
1162 | win64 = of_find_property(np, DIRECT64_PROPNAME, NULL); |
1163 | @@ -761,7 +761,8 @@ static void remove_ddw(struct device_node *np) |
1164 | np->full_name, ret, ddw_avail[2], liobn); |
1165 | |
1166 | delprop: |
1167 | - ret = of_remove_property(np, win64); |
1168 | + if (remove_prop) |
1169 | + ret = of_remove_property(np, win64); |
1170 | if (ret) |
1171 | pr_warning("%s: failed to remove direct window property: %d\n", |
1172 | np->full_name, ret); |
1173 | @@ -805,7 +806,7 @@ static int find_existing_ddw_windows(void) |
1174 | window = kzalloc(sizeof(*window), GFP_KERNEL); |
1175 | if (!window || len < sizeof(struct dynamic_dma_window_prop)) { |
1176 | kfree(window); |
1177 | - remove_ddw(pdn); |
1178 | + remove_ddw(pdn, true); |
1179 | continue; |
1180 | } |
1181 | |
1182 | @@ -1045,7 +1046,7 @@ out_free_window: |
1183 | kfree(window); |
1184 | |
1185 | out_clear_window: |
1186 | - remove_ddw(pdn); |
1187 | + remove_ddw(pdn, true); |
1188 | |
1189 | out_free_prop: |
1190 | kfree(win64->name); |
1191 | @@ -1255,7 +1256,14 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti |
1192 | |
1193 | switch (action) { |
1194 | case OF_RECONFIG_DETACH_NODE: |
1195 | - remove_ddw(np); |
1196 | + /* |
1197 | + * Removing the property will invoke the reconfig |
1198 | + * notifier again, which causes dead-lock on the |
1199 | + * read-write semaphore of the notifier chain. So |
1200 | + * we have to remove the property when releasing |
1201 | + * the device node. |
1202 | + */ |
1203 | + remove_ddw(np, false); |
1204 | if (pci && pci->iommu_table) |
1205 | iommu_free_table(pci->iommu_table, np->full_name); |
1206 | |
1207 | diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c |
1208 | index b02af9ef3ff6..ccf6f162f69c 100644 |
1209 | --- a/arch/powerpc/platforms/pseries/lpar.c |
1210 | +++ b/arch/powerpc/platforms/pseries/lpar.c |
1211 | @@ -430,16 +430,17 @@ static void __pSeries_lpar_hugepage_invalidate(unsigned long *slot, |
1212 | spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags); |
1213 | } |
1214 | |
1215 | -static void pSeries_lpar_hugepage_invalidate(struct mm_struct *mm, |
1216 | - unsigned char *hpte_slot_array, |
1217 | - unsigned long addr, int psize) |
1218 | +static void pSeries_lpar_hugepage_invalidate(unsigned long vsid, |
1219 | + unsigned long addr, |
1220 | + unsigned char *hpte_slot_array, |
1221 | + int psize, int ssize) |
1222 | { |
1223 | - int ssize = 0, i, index = 0; |
1224 | + int i, index = 0; |
1225 | unsigned long s_addr = addr; |
1226 | unsigned int max_hpte_count, valid; |
1227 | unsigned long vpn_array[PPC64_HUGE_HPTE_BATCH]; |
1228 | unsigned long slot_array[PPC64_HUGE_HPTE_BATCH]; |
1229 | - unsigned long shift, hidx, vpn = 0, vsid, hash, slot; |
1230 | + unsigned long shift, hidx, vpn = 0, hash, slot; |
1231 | |
1232 | shift = mmu_psize_defs[psize].shift; |
1233 | max_hpte_count = 1U << (PMD_SHIFT - shift); |
1234 | @@ -452,15 +453,6 @@ static void pSeries_lpar_hugepage_invalidate(struct mm_struct *mm, |
1235 | |
1236 | /* get the vpn */ |
1237 | addr = s_addr + (i * (1ul << shift)); |
1238 | - if (!is_kernel_addr(addr)) { |
1239 | - ssize = user_segment_size(addr); |
1240 | - vsid = get_vsid(mm->context.id, addr, ssize); |
1241 | - WARN_ON(vsid == 0); |
1242 | - } else { |
1243 | - vsid = get_kernel_vsid(addr, mmu_kernel_ssize); |
1244 | - ssize = mmu_kernel_ssize; |
1245 | - } |
1246 | - |
1247 | vpn = hpt_vpn(addr, vsid, ssize); |
1248 | hash = hpt_hash(vpn, shift, ssize); |
1249 | if (hidx & _PTEIDX_SECONDARY) |
1250 | diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig |
1251 | index bb74b21f007a..a0a3bed6e4dc 100644 |
1252 | --- a/arch/s390/Kconfig |
1253 | +++ b/arch/s390/Kconfig |
1254 | @@ -93,6 +93,7 @@ config S390 |
1255 | select ARCH_INLINE_WRITE_UNLOCK_IRQ |
1256 | select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE |
1257 | select ARCH_SAVE_PAGE_KEYS if HIBERNATION |
1258 | + select ARCH_SUPPORTS_ATOMIC_RMW |
1259 | select ARCH_USE_CMPXCHG_LOCKREF |
1260 | select ARCH_WANT_IPC_PARSE_VERSION |
1261 | select BUILDTIME_EXTABLE_SORT |
1262 | diff --git a/drivers/acpi/acpica/utcopy.c b/drivers/acpi/acpica/utcopy.c |
1263 | index edff4e653d9a..c66bca17e736 100644 |
1264 | --- a/drivers/acpi/acpica/utcopy.c |
1265 | +++ b/drivers/acpi/acpica/utcopy.c |
1266 | @@ -1001,5 +1001,11 @@ acpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc, |
1267 | status = acpi_ut_copy_simple_object(source_desc, *dest_desc); |
1268 | } |
1269 | |
1270 | + /* Delete the allocated object if copy failed */ |
1271 | + |
1272 | + if (ACPI_FAILURE(status)) { |
1273 | + acpi_ut_remove_reference(*dest_desc); |
1274 | + } |
1275 | + |
1276 | return_ACPI_STATUS(status); |
1277 | } |
1278 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c |
1279 | index 3dca36d4ad26..17f9ec501972 100644 |
1280 | --- a/drivers/acpi/processor_idle.c |
1281 | +++ b/drivers/acpi/processor_idle.c |
1282 | @@ -1071,9 +1071,9 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) |
1283 | |
1284 | if (pr->id == 0 && cpuidle_get_driver() == &acpi_idle_driver) { |
1285 | |
1286 | - cpuidle_pause_and_lock(); |
1287 | /* Protect against cpu-hotplug */ |
1288 | get_online_cpus(); |
1289 | + cpuidle_pause_and_lock(); |
1290 | |
1291 | /* Disable all cpuidle devices */ |
1292 | for_each_online_cpu(cpu) { |
1293 | @@ -1100,8 +1100,8 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr) |
1294 | cpuidle_enable_device(dev); |
1295 | } |
1296 | } |
1297 | - put_online_cpus(); |
1298 | cpuidle_resume_and_unlock(); |
1299 | + put_online_cpus(); |
1300 | } |
1301 | |
1302 | return 0; |
1303 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c |
1304 | index 57b053f424d1..92d5184e3654 100644 |
1305 | --- a/drivers/acpi/scan.c |
1306 | +++ b/drivers/acpi/scan.c |
1307 | @@ -329,7 +329,8 @@ static int acpi_scan_hot_remove(struct acpi_device *device) |
1308 | unsigned long long sta; |
1309 | acpi_status status; |
1310 | |
1311 | - if (device->handler->hotplug.demand_offline && !acpi_force_hot_remove) { |
1312 | + if (device->handler && device->handler->hotplug.demand_offline |
1313 | + && !acpi_force_hot_remove) { |
1314 | if (!acpi_scan_is_offline(device, true)) |
1315 | return -EBUSY; |
1316 | } else { |
1317 | @@ -660,8 +661,14 @@ static ssize_t |
1318 | acpi_device_sun_show(struct device *dev, struct device_attribute *attr, |
1319 | char *buf) { |
1320 | struct acpi_device *acpi_dev = to_acpi_device(dev); |
1321 | + acpi_status status; |
1322 | + unsigned long long sun; |
1323 | + |
1324 | + status = acpi_evaluate_integer(acpi_dev->handle, "_SUN", NULL, &sun); |
1325 | + if (ACPI_FAILURE(status)) |
1326 | + return -ENODEV; |
1327 | |
1328 | - return sprintf(buf, "%lu\n", acpi_dev->pnp.sun); |
1329 | + return sprintf(buf, "%llu\n", sun); |
1330 | } |
1331 | static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL); |
1332 | |
1333 | @@ -683,7 +690,6 @@ static int acpi_device_setup_files(struct acpi_device *dev) |
1334 | { |
1335 | struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; |
1336 | acpi_status status; |
1337 | - unsigned long long sun; |
1338 | int result = 0; |
1339 | |
1340 | /* |
1341 | @@ -724,14 +730,10 @@ static int acpi_device_setup_files(struct acpi_device *dev) |
1342 | if (dev->pnp.unique_id) |
1343 | result = device_create_file(&dev->dev, &dev_attr_uid); |
1344 | |
1345 | - status = acpi_evaluate_integer(dev->handle, "_SUN", NULL, &sun); |
1346 | - if (ACPI_SUCCESS(status)) { |
1347 | - dev->pnp.sun = (unsigned long)sun; |
1348 | + if (acpi_has_method(dev->handle, "_SUN")) { |
1349 | result = device_create_file(&dev->dev, &dev_attr_sun); |
1350 | if (result) |
1351 | goto end; |
1352 | - } else { |
1353 | - dev->pnp.sun = (unsigned long)-1; |
1354 | } |
1355 | |
1356 | if (acpi_has_method(dev->handle, "_STA")) { |
1357 | @@ -915,12 +917,17 @@ static void acpi_device_notify(acpi_handle handle, u32 event, void *data) |
1358 | device->driver->ops.notify(device, event); |
1359 | } |
1360 | |
1361 | -static acpi_status acpi_device_notify_fixed(void *data) |
1362 | +static void acpi_device_notify_fixed(void *data) |
1363 | { |
1364 | struct acpi_device *device = data; |
1365 | |
1366 | /* Fixed hardware devices have no handles */ |
1367 | acpi_device_notify(NULL, ACPI_FIXED_HARDWARE_EVENT, device); |
1368 | +} |
1369 | + |
1370 | +static acpi_status acpi_device_fixed_event(void *data) |
1371 | +{ |
1372 | + acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_device_notify_fixed, data); |
1373 | return AE_OK; |
1374 | } |
1375 | |
1376 | @@ -931,12 +938,12 @@ static int acpi_device_install_notify_handler(struct acpi_device *device) |
1377 | if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON) |
1378 | status = |
1379 | acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, |
1380 | - acpi_device_notify_fixed, |
1381 | + acpi_device_fixed_event, |
1382 | device); |
1383 | else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON) |
1384 | status = |
1385 | acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, |
1386 | - acpi_device_notify_fixed, |
1387 | + acpi_device_fixed_event, |
1388 | device); |
1389 | else |
1390 | status = acpi_install_notify_handler(device->handle, |
1391 | @@ -953,10 +960,10 @@ static void acpi_device_remove_notify_handler(struct acpi_device *device) |
1392 | { |
1393 | if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON) |
1394 | acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, |
1395 | - acpi_device_notify_fixed); |
1396 | + acpi_device_fixed_event); |
1397 | else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON) |
1398 | acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, |
1399 | - acpi_device_notify_fixed); |
1400 | + acpi_device_fixed_event); |
1401 | else |
1402 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, |
1403 | acpi_device_notify); |
1404 | diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h |
1405 | index 7399303d7d99..9e81a3d01d2b 100644 |
1406 | --- a/drivers/bluetooth/btmrvl_drv.h |
1407 | +++ b/drivers/bluetooth/btmrvl_drv.h |
1408 | @@ -66,6 +66,7 @@ struct btmrvl_adapter { |
1409 | u8 hs_state; |
1410 | u8 wakeup_tries; |
1411 | wait_queue_head_t cmd_wait_q; |
1412 | + wait_queue_head_t event_hs_wait_q; |
1413 | u8 cmd_complete; |
1414 | bool is_suspended; |
1415 | }; |
1416 | diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c |
1417 | index 1e0320af00c6..49d20989b45a 100644 |
1418 | --- a/drivers/bluetooth/btmrvl_main.c |
1419 | +++ b/drivers/bluetooth/btmrvl_main.c |
1420 | @@ -112,6 +112,7 @@ int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb) |
1421 | adapter->hs_state = HS_ACTIVATED; |
1422 | if (adapter->psmode) |
1423 | adapter->ps_state = PS_SLEEP; |
1424 | + wake_up_interruptible(&adapter->event_hs_wait_q); |
1425 | BT_DBG("HS ACTIVATED!"); |
1426 | } else { |
1427 | BT_DBG("HS Enable failed"); |
1428 | @@ -251,11 +252,31 @@ EXPORT_SYMBOL_GPL(btmrvl_enable_ps); |
1429 | |
1430 | int btmrvl_enable_hs(struct btmrvl_private *priv) |
1431 | { |
1432 | + struct btmrvl_adapter *adapter = priv->adapter; |
1433 | int ret; |
1434 | |
1435 | ret = btmrvl_send_sync_cmd(priv, BT_CMD_HOST_SLEEP_ENABLE, NULL, 0); |
1436 | - if (ret) |
1437 | + if (ret) { |
1438 | BT_ERR("Host sleep enable command failed\n"); |
1439 | + return ret; |
1440 | + } |
1441 | + |
1442 | + ret = wait_event_interruptible_timeout(adapter->event_hs_wait_q, |
1443 | + adapter->hs_state, |
1444 | + msecs_to_jiffies(WAIT_UNTIL_HS_STATE_CHANGED)); |
1445 | + if (ret < 0) { |
1446 | + BT_ERR("event_hs_wait_q terminated (%d): %d,%d,%d", |
1447 | + ret, adapter->hs_state, adapter->ps_state, |
1448 | + adapter->wakeup_tries); |
1449 | + } else if (!ret) { |
1450 | + BT_ERR("hs_enable timeout: %d,%d,%d", adapter->hs_state, |
1451 | + adapter->ps_state, adapter->wakeup_tries); |
1452 | + ret = -ETIMEDOUT; |
1453 | + } else { |
1454 | + BT_DBG("host sleep enabled: %d,%d,%d", adapter->hs_state, |
1455 | + adapter->ps_state, adapter->wakeup_tries); |
1456 | + ret = 0; |
1457 | + } |
1458 | |
1459 | return ret; |
1460 | } |
1461 | @@ -341,6 +362,7 @@ static void btmrvl_init_adapter(struct btmrvl_private *priv) |
1462 | priv->adapter->ps_state = PS_AWAKE; |
1463 | |
1464 | init_waitqueue_head(&priv->adapter->cmd_wait_q); |
1465 | + init_waitqueue_head(&priv->adapter->event_hs_wait_q); |
1466 | } |
1467 | |
1468 | static void btmrvl_free_adapter(struct btmrvl_private *priv) |
1469 | @@ -648,6 +670,7 @@ int btmrvl_remove_card(struct btmrvl_private *priv) |
1470 | hdev = priv->btmrvl_dev.hcidev; |
1471 | |
1472 | wake_up_interruptible(&priv->adapter->cmd_wait_q); |
1473 | + wake_up_interruptible(&priv->adapter->event_hs_wait_q); |
1474 | |
1475 | kthread_stop(priv->main_thread.task); |
1476 | |
1477 | diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c |
1478 | index 62e10fd1e1cb..6af17002a115 100644 |
1479 | --- a/drivers/char/tpm/tpm-interface.c |
1480 | +++ b/drivers/char/tpm/tpm-interface.c |
1481 | @@ -491,11 +491,10 @@ static int tpm_startup(struct tpm_chip *chip, __be16 startup_type) |
1482 | int tpm_get_timeouts(struct tpm_chip *chip) |
1483 | { |
1484 | struct tpm_cmd_t tpm_cmd; |
1485 | - struct timeout_t *timeout_cap; |
1486 | + unsigned long new_timeout[4]; |
1487 | + unsigned long old_timeout[4]; |
1488 | struct duration_t *duration_cap; |
1489 | ssize_t rc; |
1490 | - u32 timeout; |
1491 | - unsigned int scale = 1; |
1492 | |
1493 | tpm_cmd.header.in = tpm_getcap_header; |
1494 | tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP; |
1495 | @@ -529,25 +528,46 @@ int tpm_get_timeouts(struct tpm_chip *chip) |
1496 | != sizeof(tpm_cmd.header.out) + sizeof(u32) + 4 * sizeof(u32)) |
1497 | return -EINVAL; |
1498 | |
1499 | - timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout; |
1500 | - /* Don't overwrite default if value is 0 */ |
1501 | - timeout = be32_to_cpu(timeout_cap->a); |
1502 | - if (timeout && timeout < 1000) { |
1503 | - /* timeouts in msec rather usec */ |
1504 | - scale = 1000; |
1505 | - chip->vendor.timeout_adjusted = true; |
1506 | + old_timeout[0] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.a); |
1507 | + old_timeout[1] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.b); |
1508 | + old_timeout[2] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.c); |
1509 | + old_timeout[3] = be32_to_cpu(tpm_cmd.params.getcap_out.cap.timeout.d); |
1510 | + memcpy(new_timeout, old_timeout, sizeof(new_timeout)); |
1511 | + |
1512 | + /* |
1513 | + * Provide ability for vendor overrides of timeout values in case |
1514 | + * of misreporting. |
1515 | + */ |
1516 | + if (chip->ops->update_timeouts != NULL) |
1517 | + chip->vendor.timeout_adjusted = |
1518 | + chip->ops->update_timeouts(chip, new_timeout); |
1519 | + |
1520 | + if (!chip->vendor.timeout_adjusted) { |
1521 | + /* Don't overwrite default if value is 0 */ |
1522 | + if (new_timeout[0] != 0 && new_timeout[0] < 1000) { |
1523 | + int i; |
1524 | + |
1525 | + /* timeouts in msec rather usec */ |
1526 | + for (i = 0; i != ARRAY_SIZE(new_timeout); i++) |
1527 | + new_timeout[i] *= 1000; |
1528 | + chip->vendor.timeout_adjusted = true; |
1529 | + } |
1530 | + } |
1531 | + |
1532 | + /* Report adjusted timeouts */ |
1533 | + if (chip->vendor.timeout_adjusted) { |
1534 | + dev_info(chip->dev, |
1535 | + HW_ERR "Adjusting reported timeouts: A %lu->%luus B %lu->%luus C %lu->%luus D %lu->%luus\n", |
1536 | + old_timeout[0], new_timeout[0], |
1537 | + old_timeout[1], new_timeout[1], |
1538 | + old_timeout[2], new_timeout[2], |
1539 | + old_timeout[3], new_timeout[3]); |
1540 | } |
1541 | - if (timeout) |
1542 | - chip->vendor.timeout_a = usecs_to_jiffies(timeout * scale); |
1543 | - timeout = be32_to_cpu(timeout_cap->b); |
1544 | - if (timeout) |
1545 | - chip->vendor.timeout_b = usecs_to_jiffies(timeout * scale); |
1546 | - timeout = be32_to_cpu(timeout_cap->c); |
1547 | - if (timeout) |
1548 | - chip->vendor.timeout_c = usecs_to_jiffies(timeout * scale); |
1549 | - timeout = be32_to_cpu(timeout_cap->d); |
1550 | - if (timeout) |
1551 | - chip->vendor.timeout_d = usecs_to_jiffies(timeout * scale); |
1552 | + |
1553 | + chip->vendor.timeout_a = usecs_to_jiffies(new_timeout[0]); |
1554 | + chip->vendor.timeout_b = usecs_to_jiffies(new_timeout[1]); |
1555 | + chip->vendor.timeout_c = usecs_to_jiffies(new_timeout[2]); |
1556 | + chip->vendor.timeout_d = usecs_to_jiffies(new_timeout[3]); |
1557 | |
1558 | duration: |
1559 | tpm_cmd.header.in = tpm_getcap_header; |
1560 | @@ -991,13 +1011,13 @@ int tpm_get_random(u32 chip_num, u8 *out, size_t max) |
1561 | int err, total = 0, retries = 5; |
1562 | u8 *dest = out; |
1563 | |
1564 | + if (!out || !num_bytes || max > TPM_MAX_RNG_DATA) |
1565 | + return -EINVAL; |
1566 | + |
1567 | chip = tpm_chip_find_get(chip_num); |
1568 | if (chip == NULL) |
1569 | return -ENODEV; |
1570 | |
1571 | - if (!out || !num_bytes || max > TPM_MAX_RNG_DATA) |
1572 | - return -EINVAL; |
1573 | - |
1574 | do { |
1575 | tpm_cmd.header.in = tpm_getrandom_header; |
1576 | tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes); |
1577 | @@ -1016,6 +1036,7 @@ int tpm_get_random(u32 chip_num, u8 *out, size_t max) |
1578 | num_bytes -= recd; |
1579 | } while (retries-- && total < max); |
1580 | |
1581 | + tpm_chip_put(chip); |
1582 | return total ? total : -EIO; |
1583 | } |
1584 | EXPORT_SYMBOL_GPL(tpm_get_random); |
1585 | @@ -1095,7 +1116,7 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, |
1586 | goto del_misc; |
1587 | |
1588 | if (tpm_add_ppi(&dev->kobj)) |
1589 | - goto del_misc; |
1590 | + goto del_sysfs; |
1591 | |
1592 | chip->bios_dir = tpm_bios_log_setup(chip->devname); |
1593 | |
1594 | @@ -1106,6 +1127,8 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, |
1595 | |
1596 | return chip; |
1597 | |
1598 | +del_sysfs: |
1599 | + tpm_sysfs_del_device(chip); |
1600 | del_misc: |
1601 | tpm_dev_del_device(chip); |
1602 | put_device: |
1603 | diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c |
1604 | index a9ed2270c25d..2c46734b266d 100644 |
1605 | --- a/drivers/char/tpm/tpm_tis.c |
1606 | +++ b/drivers/char/tpm/tpm_tis.c |
1607 | @@ -373,6 +373,36 @@ out_err: |
1608 | return rc; |
1609 | } |
1610 | |
1611 | +struct tis_vendor_timeout_override { |
1612 | + u32 did_vid; |
1613 | + unsigned long timeout_us[4]; |
1614 | +}; |
1615 | + |
1616 | +static const struct tis_vendor_timeout_override vendor_timeout_overrides[] = { |
1617 | + /* Atmel 3204 */ |
1618 | + { 0x32041114, { (TIS_SHORT_TIMEOUT*1000), (TIS_LONG_TIMEOUT*1000), |
1619 | + (TIS_SHORT_TIMEOUT*1000), (TIS_SHORT_TIMEOUT*1000) } }, |
1620 | +}; |
1621 | + |
1622 | +static bool tpm_tis_update_timeouts(struct tpm_chip *chip, |
1623 | + unsigned long *timeout_cap) |
1624 | +{ |
1625 | + int i; |
1626 | + u32 did_vid; |
1627 | + |
1628 | + did_vid = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); |
1629 | + |
1630 | + for (i = 0; i != ARRAY_SIZE(vendor_timeout_overrides); i++) { |
1631 | + if (vendor_timeout_overrides[i].did_vid != did_vid) |
1632 | + continue; |
1633 | + memcpy(timeout_cap, vendor_timeout_overrides[i].timeout_us, |
1634 | + sizeof(vendor_timeout_overrides[i].timeout_us)); |
1635 | + return true; |
1636 | + } |
1637 | + |
1638 | + return false; |
1639 | +} |
1640 | + |
1641 | /* |
1642 | * Early probing for iTPM with STS_DATA_EXPECT flaw. |
1643 | * Try sending command without itpm flag set and if that |
1644 | @@ -437,6 +467,7 @@ static const struct tpm_class_ops tpm_tis = { |
1645 | .recv = tpm_tis_recv, |
1646 | .send = tpm_tis_send, |
1647 | .cancel = tpm_tis_ready, |
1648 | + .update_timeouts = tpm_tis_update_timeouts, |
1649 | .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID, |
1650 | .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID, |
1651 | .req_canceled = tpm_tis_req_canceled, |
1652 | diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c |
1653 | index b22659cccca4..e6125522860a 100644 |
1654 | --- a/drivers/firmware/efi/vars.c |
1655 | +++ b/drivers/firmware/efi/vars.c |
1656 | @@ -481,7 +481,7 @@ EXPORT_SYMBOL_GPL(efivar_entry_remove); |
1657 | */ |
1658 | static void efivar_entry_list_del_unlock(struct efivar_entry *entry) |
1659 | { |
1660 | - WARN_ON(!spin_is_locked(&__efivars->lock)); |
1661 | + lockdep_assert_held(&__efivars->lock); |
1662 | |
1663 | list_del(&entry->list); |
1664 | spin_unlock_irq(&__efivars->lock); |
1665 | @@ -507,7 +507,7 @@ int __efivar_entry_delete(struct efivar_entry *entry) |
1666 | const struct efivar_operations *ops = __efivars->ops; |
1667 | efi_status_t status; |
1668 | |
1669 | - WARN_ON(!spin_is_locked(&__efivars->lock)); |
1670 | + lockdep_assert_held(&__efivars->lock); |
1671 | |
1672 | status = ops->set_variable(entry->var.VariableName, |
1673 | &entry->var.VendorGuid, |
1674 | @@ -667,7 +667,7 @@ struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, |
1675 | int strsize1, strsize2; |
1676 | bool found = false; |
1677 | |
1678 | - WARN_ON(!spin_is_locked(&__efivars->lock)); |
1679 | + lockdep_assert_held(&__efivars->lock); |
1680 | |
1681 | list_for_each_entry_safe(entry, n, head, list) { |
1682 | strsize1 = ucs2_strsize(name, 1024); |
1683 | @@ -739,7 +739,7 @@ int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes, |
1684 | const struct efivar_operations *ops = __efivars->ops; |
1685 | efi_status_t status; |
1686 | |
1687 | - WARN_ON(!spin_is_locked(&__efivars->lock)); |
1688 | + lockdep_assert_held(&__efivars->lock); |
1689 | |
1690 | status = ops->get_variable(entry->var.VariableName, |
1691 | &entry->var.VendorGuid, |
1692 | diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.h b/drivers/gpu/drm/nouveau/nouveau_drm.h |
1693 | index 23ca7a517246..74ed08a750f4 100644 |
1694 | --- a/drivers/gpu/drm/nouveau/nouveau_drm.h |
1695 | +++ b/drivers/gpu/drm/nouveau/nouveau_drm.h |
1696 | @@ -10,7 +10,7 @@ |
1697 | |
1698 | #define DRIVER_MAJOR 1 |
1699 | #define DRIVER_MINOR 1 |
1700 | -#define DRIVER_PATCHLEVEL 1 |
1701 | +#define DRIVER_PATCHLEVEL 2 |
1702 | |
1703 | /* |
1704 | * 1.1.1: |
1705 | @@ -21,6 +21,8 @@ |
1706 | * to control registers on the MPs to enable performance counters, |
1707 | * and to control the warp error enable mask (OpenGL requires out of |
1708 | * bounds access to local memory to be silently ignored / return 0). |
1709 | + * 1.1.2: |
1710 | + * - fixes multiple bugs in flip completion events and timestamping |
1711 | */ |
1712 | |
1713 | #include <core/client.h> |
1714 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c |
1715 | index bc9e56eb4e9c..7b3537c55c77 100644 |
1716 | --- a/drivers/gpu/drm/radeon/cik.c |
1717 | +++ b/drivers/gpu/drm/radeon/cik.c |
1718 | @@ -7779,6 +7779,7 @@ restart_ih: |
1719 | static int cik_startup(struct radeon_device *rdev) |
1720 | { |
1721 | struct radeon_ring *ring; |
1722 | + u32 nop; |
1723 | int r; |
1724 | |
1725 | /* enable pcie gen2/3 link */ |
1726 | @@ -7896,9 +7897,15 @@ static int cik_startup(struct radeon_device *rdev) |
1727 | } |
1728 | cik_irq_set(rdev); |
1729 | |
1730 | + if (rdev->family == CHIP_HAWAII) { |
1731 | + nop = RADEON_CP_PACKET2; |
1732 | + } else { |
1733 | + nop = PACKET3(PACKET3_NOP, 0x3FFF); |
1734 | + } |
1735 | + |
1736 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
1737 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, |
1738 | - PACKET3(PACKET3_NOP, 0x3FFF)); |
1739 | + nop); |
1740 | if (r) |
1741 | return r; |
1742 | |
1743 | @@ -7906,7 +7913,7 @@ static int cik_startup(struct radeon_device *rdev) |
1744 | /* type-2 packets are deprecated on MEC, use type-3 instead */ |
1745 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; |
1746 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, |
1747 | - PACKET3(PACKET3_NOP, 0x3FFF)); |
1748 | + nop); |
1749 | if (r) |
1750 | return r; |
1751 | ring->me = 1; /* first MEC */ |
1752 | @@ -7917,7 +7924,7 @@ static int cik_startup(struct radeon_device *rdev) |
1753 | /* type-2 packets are deprecated on MEC, use type-3 instead */ |
1754 | ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; |
1755 | r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, |
1756 | - PACKET3(PACKET3_NOP, 0x3FFF)); |
1757 | + nop); |
1758 | if (r) |
1759 | return r; |
1760 | /* dGPU only have 1 MEC */ |
1761 | diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c |
1762 | index 3d2e489ab732..ff9163dc1596 100644 |
1763 | --- a/drivers/infiniband/core/iwcm.c |
1764 | +++ b/drivers/infiniband/core/iwcm.c |
1765 | @@ -46,6 +46,7 @@ |
1766 | #include <linux/completion.h> |
1767 | #include <linux/slab.h> |
1768 | #include <linux/module.h> |
1769 | +#include <linux/sysctl.h> |
1770 | |
1771 | #include <rdma/iw_cm.h> |
1772 | #include <rdma/ib_addr.h> |
1773 | @@ -65,6 +66,20 @@ struct iwcm_work { |
1774 | struct list_head free_list; |
1775 | }; |
1776 | |
1777 | +static unsigned int default_backlog = 256; |
1778 | + |
1779 | +static struct ctl_table_header *iwcm_ctl_table_hdr; |
1780 | +static struct ctl_table iwcm_ctl_table[] = { |
1781 | + { |
1782 | + .procname = "default_backlog", |
1783 | + .data = &default_backlog, |
1784 | + .maxlen = sizeof(default_backlog), |
1785 | + .mode = 0644, |
1786 | + .proc_handler = proc_dointvec, |
1787 | + }, |
1788 | + { } |
1789 | +}; |
1790 | + |
1791 | /* |
1792 | * The following services provide a mechanism for pre-allocating iwcm_work |
1793 | * elements. The design pre-allocates them based on the cm_id type: |
1794 | @@ -425,6 +440,9 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog) |
1795 | |
1796 | cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); |
1797 | |
1798 | + if (!backlog) |
1799 | + backlog = default_backlog; |
1800 | + |
1801 | ret = alloc_work_entries(cm_id_priv, backlog); |
1802 | if (ret) |
1803 | return ret; |
1804 | @@ -1030,11 +1048,20 @@ static int __init iw_cm_init(void) |
1805 | if (!iwcm_wq) |
1806 | return -ENOMEM; |
1807 | |
1808 | + iwcm_ctl_table_hdr = register_net_sysctl(&init_net, "net/iw_cm", |
1809 | + iwcm_ctl_table); |
1810 | + if (!iwcm_ctl_table_hdr) { |
1811 | + pr_err("iw_cm: couldn't register sysctl paths\n"); |
1812 | + destroy_workqueue(iwcm_wq); |
1813 | + return -ENOMEM; |
1814 | + } |
1815 | + |
1816 | return 0; |
1817 | } |
1818 | |
1819 | static void __exit iw_cm_cleanup(void) |
1820 | { |
1821 | + unregister_net_sysctl_table(iwcm_ctl_table_hdr); |
1822 | destroy_workqueue(iwcm_wq); |
1823 | } |
1824 | |
1825 | diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c |
1826 | index e96c07ee6756..ca0bc6c67abe 100644 |
1827 | --- a/drivers/infiniband/ulp/srp/ib_srp.c |
1828 | +++ b/drivers/infiniband/ulp/srp/ib_srp.c |
1829 | @@ -120,6 +120,7 @@ static void srp_send_completion(struct ib_cq *cq, void *target_ptr); |
1830 | static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event); |
1831 | |
1832 | static struct scsi_transport_template *ib_srp_transport_template; |
1833 | +static struct workqueue_struct *srp_remove_wq; |
1834 | |
1835 | static struct ib_client srp_client = { |
1836 | .name = "srp", |
1837 | @@ -539,7 +540,7 @@ static bool srp_queue_remove_work(struct srp_target_port *target) |
1838 | spin_unlock_irq(&target->lock); |
1839 | |
1840 | if (changed) |
1841 | - queue_work(system_long_wq, &target->remove_work); |
1842 | + queue_work(srp_remove_wq, &target->remove_work); |
1843 | |
1844 | return changed; |
1845 | } |
1846 | @@ -2886,9 +2887,10 @@ static void srp_remove_one(struct ib_device *device) |
1847 | spin_unlock(&host->target_lock); |
1848 | |
1849 | /* |
1850 | - * Wait for target port removal tasks. |
1851 | + * Wait for tl_err and target port removal tasks. |
1852 | */ |
1853 | flush_workqueue(system_long_wq); |
1854 | + flush_workqueue(srp_remove_wq); |
1855 | |
1856 | kfree(host); |
1857 | } |
1858 | @@ -2940,16 +2942,22 @@ static int __init srp_init_module(void) |
1859 | indirect_sg_entries = cmd_sg_entries; |
1860 | } |
1861 | |
1862 | + srp_remove_wq = create_workqueue("srp_remove"); |
1863 | + if (IS_ERR(srp_remove_wq)) { |
1864 | + ret = PTR_ERR(srp_remove_wq); |
1865 | + goto out; |
1866 | + } |
1867 | + |
1868 | + ret = -ENOMEM; |
1869 | ib_srp_transport_template = |
1870 | srp_attach_transport(&ib_srp_transport_functions); |
1871 | if (!ib_srp_transport_template) |
1872 | - return -ENOMEM; |
1873 | + goto destroy_wq; |
1874 | |
1875 | ret = class_register(&srp_class); |
1876 | if (ret) { |
1877 | pr_err("couldn't register class infiniband_srp\n"); |
1878 | - srp_release_transport(ib_srp_transport_template); |
1879 | - return ret; |
1880 | + goto release_tr; |
1881 | } |
1882 | |
1883 | ib_sa_register_client(&srp_sa_client); |
1884 | @@ -2957,13 +2965,22 @@ static int __init srp_init_module(void) |
1885 | ret = ib_register_client(&srp_client); |
1886 | if (ret) { |
1887 | pr_err("couldn't register IB client\n"); |
1888 | - srp_release_transport(ib_srp_transport_template); |
1889 | - ib_sa_unregister_client(&srp_sa_client); |
1890 | - class_unregister(&srp_class); |
1891 | - return ret; |
1892 | + goto unreg_sa; |
1893 | } |
1894 | |
1895 | - return 0; |
1896 | +out: |
1897 | + return ret; |
1898 | + |
1899 | +unreg_sa: |
1900 | + ib_sa_unregister_client(&srp_sa_client); |
1901 | + class_unregister(&srp_class); |
1902 | + |
1903 | +release_tr: |
1904 | + srp_release_transport(ib_srp_transport_template); |
1905 | + |
1906 | +destroy_wq: |
1907 | + destroy_workqueue(srp_remove_wq); |
1908 | + goto out; |
1909 | } |
1910 | |
1911 | static void __exit srp_cleanup_module(void) |
1912 | @@ -2972,6 +2989,7 @@ static void __exit srp_cleanup_module(void) |
1913 | ib_sa_unregister_client(&srp_sa_client); |
1914 | class_unregister(&srp_class); |
1915 | srp_release_transport(ib_srp_transport_template); |
1916 | + destroy_workqueue(srp_remove_wq); |
1917 | } |
1918 | |
1919 | module_init(srp_init_module); |
1920 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
1921 | index 71776ff5aedc..9cbef59d404a 100644 |
1922 | --- a/drivers/iommu/amd_iommu.c |
1923 | +++ b/drivers/iommu/amd_iommu.c |
1924 | @@ -3227,14 +3227,16 @@ free_domains: |
1925 | |
1926 | static void cleanup_domain(struct protection_domain *domain) |
1927 | { |
1928 | - struct iommu_dev_data *dev_data, *next; |
1929 | + struct iommu_dev_data *entry; |
1930 | unsigned long flags; |
1931 | |
1932 | write_lock_irqsave(&amd_iommu_devtable_lock, flags); |
1933 | |
1934 | - list_for_each_entry_safe(dev_data, next, &domain->dev_list, list) { |
1935 | - __detach_device(dev_data); |
1936 | - atomic_set(&dev_data->bind, 0); |
1937 | + while (!list_empty(&domain->dev_list)) { |
1938 | + entry = list_first_entry(&domain->dev_list, |
1939 | + struct iommu_dev_data, list); |
1940 | + __detach_device(entry); |
1941 | + atomic_set(&entry->bind, 0); |
1942 | } |
1943 | |
1944 | write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); |
1945 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c |
1946 | index 56e24c072b62..d7690f86fdb9 100644 |
1947 | --- a/drivers/md/raid1.c |
1948 | +++ b/drivers/md/raid1.c |
1949 | @@ -1501,12 +1501,12 @@ static void error(struct mddev *mddev, struct md_rdev *rdev) |
1950 | mddev->degraded++; |
1951 | set_bit(Faulty, &rdev->flags); |
1952 | spin_unlock_irqrestore(&conf->device_lock, flags); |
1953 | - /* |
1954 | - * if recovery is running, make sure it aborts. |
1955 | - */ |
1956 | - set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
1957 | } else |
1958 | set_bit(Faulty, &rdev->flags); |
1959 | + /* |
1960 | + * if recovery is running, make sure it aborts. |
1961 | + */ |
1962 | + set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
1963 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
1964 | printk(KERN_ALERT |
1965 | "md/raid1:%s: Disk failure on %s, disabling device.\n" |
1966 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
1967 | index cb882aae9e20..a46124ecafc7 100644 |
1968 | --- a/drivers/md/raid10.c |
1969 | +++ b/drivers/md/raid10.c |
1970 | @@ -1684,13 +1684,12 @@ static void error(struct mddev *mddev, struct md_rdev *rdev) |
1971 | spin_unlock_irqrestore(&conf->device_lock, flags); |
1972 | return; |
1973 | } |
1974 | - if (test_and_clear_bit(In_sync, &rdev->flags)) { |
1975 | + if (test_and_clear_bit(In_sync, &rdev->flags)) |
1976 | mddev->degraded++; |
1977 | - /* |
1978 | - * if recovery is running, make sure it aborts. |
1979 | - */ |
1980 | - set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
1981 | - } |
1982 | + /* |
1983 | + * If recovery is running, make sure it aborts. |
1984 | + */ |
1985 | + set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
1986 | set_bit(Blocked, &rdev->flags); |
1987 | set_bit(Faulty, &rdev->flags); |
1988 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
1989 | @@ -2954,6 +2953,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, |
1990 | */ |
1991 | if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) { |
1992 | end_reshape(conf); |
1993 | + close_sync(conf); |
1994 | return 0; |
1995 | } |
1996 | |
1997 | @@ -4411,7 +4411,7 @@ read_more: |
1998 | read_bio->bi_private = r10_bio; |
1999 | read_bio->bi_end_io = end_sync_read; |
2000 | read_bio->bi_rw = READ; |
2001 | - read_bio->bi_flags &= ~(BIO_POOL_MASK - 1); |
2002 | + read_bio->bi_flags &= (~0UL << BIO_RESET_BITS); |
2003 | read_bio->bi_flags |= 1 << BIO_UPTODATE; |
2004 | read_bio->bi_vcnt = 0; |
2005 | read_bio->bi_iter.bi_size = 0; |
2006 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
2007 | index 16f5c21963db..18cda77b4f79 100644 |
2008 | --- a/drivers/md/raid5.c |
2009 | +++ b/drivers/md/raid5.c |
2010 | @@ -3779,6 +3779,8 @@ static void handle_stripe(struct stripe_head *sh) |
2011 | set_bit(R5_Wantwrite, &dev->flags); |
2012 | if (prexor) |
2013 | continue; |
2014 | + if (s.failed > 1) |
2015 | + continue; |
2016 | if (!test_bit(R5_Insync, &dev->flags) || |
2017 | ((i == sh->pd_idx || i == sh->qd_idx) && |
2018 | s.failed == 0)) |
2019 | diff --git a/drivers/media/common/siano/Kconfig b/drivers/media/common/siano/Kconfig |
2020 | index f953d33ee151..4bfbd5f463d1 100644 |
2021 | --- a/drivers/media/common/siano/Kconfig |
2022 | +++ b/drivers/media/common/siano/Kconfig |
2023 | @@ -22,8 +22,7 @@ config SMS_SIANO_DEBUGFS |
2024 | bool "Enable debugfs for smsdvb" |
2025 | depends on SMS_SIANO_MDTV |
2026 | depends on DEBUG_FS |
2027 | - depends on SMS_USB_DRV |
2028 | - depends on CONFIG_SMS_USB_DRV = CONFIG_SMS_SDIO_DRV |
2029 | + depends on SMS_USB_DRV = SMS_SDIO_DRV |
2030 | |
2031 | ---help--- |
2032 | Choose Y to enable visualizing a dump of the frontend |
2033 | diff --git a/drivers/media/i2c/mt9v032.c b/drivers/media/i2c/mt9v032.c |
2034 | index 36c504b78f2c..008ac87a9031 100644 |
2035 | --- a/drivers/media/i2c/mt9v032.c |
2036 | +++ b/drivers/media/i2c/mt9v032.c |
2037 | @@ -305,8 +305,8 @@ mt9v032_update_hblank(struct mt9v032 *mt9v032) |
2038 | |
2039 | if (mt9v032->version->version == MT9V034_CHIP_ID_REV1) |
2040 | min_hblank += (mt9v032->hratio - 1) * 10; |
2041 | - min_hblank = max_t(unsigned int, (int)mt9v032->model->data->min_row_time - crop->width, |
2042 | - (int)min_hblank); |
2043 | + min_hblank = max_t(int, mt9v032->model->data->min_row_time - crop->width, |
2044 | + min_hblank); |
2045 | hblank = max_t(unsigned int, mt9v032->hblank, min_hblank); |
2046 | |
2047 | return mt9v032_write(client, MT9V032_HORIZONTAL_BLANKING, hblank); |
2048 | diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c |
2049 | index 703560fa5e73..88c1606fd555 100644 |
2050 | --- a/drivers/media/media-device.c |
2051 | +++ b/drivers/media/media-device.c |
2052 | @@ -106,8 +106,6 @@ static long media_device_enum_entities(struct media_device *mdev, |
2053 | if (ent->name) { |
2054 | strncpy(u_ent.name, ent->name, sizeof(u_ent.name)); |
2055 | u_ent.name[sizeof(u_ent.name) - 1] = '\0'; |
2056 | - } else { |
2057 | - memset(u_ent.name, 0, sizeof(u_ent.name)); |
2058 | } |
2059 | u_ent.type = ent->type; |
2060 | u_ent.revision = ent->revision; |
2061 | diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c |
2062 | index b4687a834f85..7245cca89257 100644 |
2063 | --- a/drivers/media/platform/vsp1/vsp1_video.c |
2064 | +++ b/drivers/media/platform/vsp1/vsp1_video.c |
2065 | @@ -635,8 +635,6 @@ static int vsp1_video_buffer_prepare(struct vb2_buffer *vb) |
2066 | if (vb->num_planes < format->num_planes) |
2067 | return -EINVAL; |
2068 | |
2069 | - buf->video = video; |
2070 | - |
2071 | for (i = 0; i < vb->num_planes; ++i) { |
2072 | buf->addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); |
2073 | buf->length[i] = vb2_plane_size(vb, i); |
2074 | diff --git a/drivers/media/platform/vsp1/vsp1_video.h b/drivers/media/platform/vsp1/vsp1_video.h |
2075 | index d8612a378345..47b7a8ab5e2f 100644 |
2076 | --- a/drivers/media/platform/vsp1/vsp1_video.h |
2077 | +++ b/drivers/media/platform/vsp1/vsp1_video.h |
2078 | @@ -89,7 +89,6 @@ static inline struct vsp1_pipeline *to_vsp1_pipeline(struct media_entity *e) |
2079 | } |
2080 | |
2081 | struct vsp1_video_buffer { |
2082 | - struct vsp1_video *video; |
2083 | struct vb2_buffer buf; |
2084 | struct list_head queue; |
2085 | |
2086 | diff --git a/drivers/media/tuners/xc4000.c b/drivers/media/tuners/xc4000.c |
2087 | index 2018befabb5a..e71decbfd0af 100644 |
2088 | --- a/drivers/media/tuners/xc4000.c |
2089 | +++ b/drivers/media/tuners/xc4000.c |
2090 | @@ -93,7 +93,7 @@ struct xc4000_priv { |
2091 | struct firmware_description *firm; |
2092 | int firm_size; |
2093 | u32 if_khz; |
2094 | - u32 freq_hz; |
2095 | + u32 freq_hz, freq_offset; |
2096 | u32 bandwidth; |
2097 | u8 video_standard; |
2098 | u8 rf_mode; |
2099 | @@ -1157,14 +1157,14 @@ static int xc4000_set_params(struct dvb_frontend *fe) |
2100 | case SYS_ATSC: |
2101 | dprintk(1, "%s() VSB modulation\n", __func__); |
2102 | priv->rf_mode = XC_RF_MODE_AIR; |
2103 | - priv->freq_hz = c->frequency - 1750000; |
2104 | + priv->freq_offset = 1750000; |
2105 | priv->video_standard = XC4000_DTV6; |
2106 | type = DTV6; |
2107 | break; |
2108 | case SYS_DVBC_ANNEX_B: |
2109 | dprintk(1, "%s() QAM modulation\n", __func__); |
2110 | priv->rf_mode = XC_RF_MODE_CABLE; |
2111 | - priv->freq_hz = c->frequency - 1750000; |
2112 | + priv->freq_offset = 1750000; |
2113 | priv->video_standard = XC4000_DTV6; |
2114 | type = DTV6; |
2115 | break; |
2116 | @@ -1173,23 +1173,23 @@ static int xc4000_set_params(struct dvb_frontend *fe) |
2117 | dprintk(1, "%s() OFDM\n", __func__); |
2118 | if (bw == 0) { |
2119 | if (c->frequency < 400000000) { |
2120 | - priv->freq_hz = c->frequency - 2250000; |
2121 | + priv->freq_offset = 2250000; |
2122 | } else { |
2123 | - priv->freq_hz = c->frequency - 2750000; |
2124 | + priv->freq_offset = 2750000; |
2125 | } |
2126 | priv->video_standard = XC4000_DTV7_8; |
2127 | type = DTV78; |
2128 | } else if (bw <= 6000000) { |
2129 | priv->video_standard = XC4000_DTV6; |
2130 | - priv->freq_hz = c->frequency - 1750000; |
2131 | + priv->freq_offset = 1750000; |
2132 | type = DTV6; |
2133 | } else if (bw <= 7000000) { |
2134 | priv->video_standard = XC4000_DTV7; |
2135 | - priv->freq_hz = c->frequency - 2250000; |
2136 | + priv->freq_offset = 2250000; |
2137 | type = DTV7; |
2138 | } else { |
2139 | priv->video_standard = XC4000_DTV8; |
2140 | - priv->freq_hz = c->frequency - 2750000; |
2141 | + priv->freq_offset = 2750000; |
2142 | type = DTV8; |
2143 | } |
2144 | priv->rf_mode = XC_RF_MODE_AIR; |
2145 | @@ -1200,6 +1200,8 @@ static int xc4000_set_params(struct dvb_frontend *fe) |
2146 | goto fail; |
2147 | } |
2148 | |
2149 | + priv->freq_hz = c->frequency - priv->freq_offset; |
2150 | + |
2151 | dprintk(1, "%s() frequency=%d (compensated)\n", |
2152 | __func__, priv->freq_hz); |
2153 | |
2154 | @@ -1520,7 +1522,7 @@ static int xc4000_get_frequency(struct dvb_frontend *fe, u32 *freq) |
2155 | { |
2156 | struct xc4000_priv *priv = fe->tuner_priv; |
2157 | |
2158 | - *freq = priv->freq_hz; |
2159 | + *freq = priv->freq_hz + priv->freq_offset; |
2160 | |
2161 | if (debug) { |
2162 | mutex_lock(&priv->lock); |
2163 | diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c |
2164 | index 5cd09a681b6a..b2d9e9cb97f7 100644 |
2165 | --- a/drivers/media/tuners/xc5000.c |
2166 | +++ b/drivers/media/tuners/xc5000.c |
2167 | @@ -55,7 +55,7 @@ struct xc5000_priv { |
2168 | |
2169 | u32 if_khz; |
2170 | u16 xtal_khz; |
2171 | - u32 freq_hz; |
2172 | + u32 freq_hz, freq_offset; |
2173 | u32 bandwidth; |
2174 | u8 video_standard; |
2175 | u8 rf_mode; |
2176 | @@ -755,13 +755,13 @@ static int xc5000_set_params(struct dvb_frontend *fe) |
2177 | case SYS_ATSC: |
2178 | dprintk(1, "%s() VSB modulation\n", __func__); |
2179 | priv->rf_mode = XC_RF_MODE_AIR; |
2180 | - priv->freq_hz = freq - 1750000; |
2181 | + priv->freq_offset = 1750000; |
2182 | priv->video_standard = DTV6; |
2183 | break; |
2184 | case SYS_DVBC_ANNEX_B: |
2185 | dprintk(1, "%s() QAM modulation\n", __func__); |
2186 | priv->rf_mode = XC_RF_MODE_CABLE; |
2187 | - priv->freq_hz = freq - 1750000; |
2188 | + priv->freq_offset = 1750000; |
2189 | priv->video_standard = DTV6; |
2190 | break; |
2191 | case SYS_ISDBT: |
2192 | @@ -776,15 +776,15 @@ static int xc5000_set_params(struct dvb_frontend *fe) |
2193 | switch (bw) { |
2194 | case 6000000: |
2195 | priv->video_standard = DTV6; |
2196 | - priv->freq_hz = freq - 1750000; |
2197 | + priv->freq_offset = 1750000; |
2198 | break; |
2199 | case 7000000: |
2200 | priv->video_standard = DTV7; |
2201 | - priv->freq_hz = freq - 2250000; |
2202 | + priv->freq_offset = 2250000; |
2203 | break; |
2204 | case 8000000: |
2205 | priv->video_standard = DTV8; |
2206 | - priv->freq_hz = freq - 2750000; |
2207 | + priv->freq_offset = 2750000; |
2208 | break; |
2209 | default: |
2210 | printk(KERN_ERR "xc5000 bandwidth not set!\n"); |
2211 | @@ -798,15 +798,15 @@ static int xc5000_set_params(struct dvb_frontend *fe) |
2212 | priv->rf_mode = XC_RF_MODE_CABLE; |
2213 | if (bw <= 6000000) { |
2214 | priv->video_standard = DTV6; |
2215 | - priv->freq_hz = freq - 1750000; |
2216 | + priv->freq_offset = 1750000; |
2217 | b = 6; |
2218 | } else if (bw <= 7000000) { |
2219 | priv->video_standard = DTV7; |
2220 | - priv->freq_hz = freq - 2250000; |
2221 | + priv->freq_offset = 2250000; |
2222 | b = 7; |
2223 | } else { |
2224 | priv->video_standard = DTV7_8; |
2225 | - priv->freq_hz = freq - 2750000; |
2226 | + priv->freq_offset = 2750000; |
2227 | b = 8; |
2228 | } |
2229 | dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__, |
2230 | @@ -817,6 +817,8 @@ static int xc5000_set_params(struct dvb_frontend *fe) |
2231 | return -EINVAL; |
2232 | } |
2233 | |
2234 | + priv->freq_hz = freq - priv->freq_offset; |
2235 | + |
2236 | dprintk(1, "%s() frequency=%d (compensated to %d)\n", |
2237 | __func__, freq, priv->freq_hz); |
2238 | |
2239 | @@ -1067,7 +1069,7 @@ static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq) |
2240 | { |
2241 | struct xc5000_priv *priv = fe->tuner_priv; |
2242 | dprintk(1, "%s()\n", __func__); |
2243 | - *freq = priv->freq_hz; |
2244 | + *freq = priv->freq_hz + priv->freq_offset; |
2245 | return 0; |
2246 | } |
2247 | |
2248 | diff --git a/drivers/media/usb/au0828/au0828-video.c b/drivers/media/usb/au0828/au0828-video.c |
2249 | index f6154546b5c0..7ed75efa1c36 100644 |
2250 | --- a/drivers/media/usb/au0828/au0828-video.c |
2251 | +++ b/drivers/media/usb/au0828/au0828-video.c |
2252 | @@ -787,11 +787,27 @@ static int au0828_i2s_init(struct au0828_dev *dev) |
2253 | |
2254 | /* |
2255 | * Auvitek au0828 analog stream enable |
2256 | - * Please set interface0 to AS5 before enable the stream |
2257 | */ |
2258 | static int au0828_analog_stream_enable(struct au0828_dev *d) |
2259 | { |
2260 | + struct usb_interface *iface; |
2261 | + int ret; |
2262 | + |
2263 | dprintk(1, "au0828_analog_stream_enable called\n"); |
2264 | + |
2265 | + iface = usb_ifnum_to_if(d->usbdev, 0); |
2266 | + if (iface && iface->cur_altsetting->desc.bAlternateSetting != 5) { |
2267 | + dprintk(1, "Changing intf#0 to alt 5\n"); |
2268 | + /* set au0828 interface0 to AS5 here again */ |
2269 | + ret = usb_set_interface(d->usbdev, 0, 5); |
2270 | + if (ret < 0) { |
2271 | + printk(KERN_INFO "Au0828 can't set alt setting to 5!\n"); |
2272 | + return -EBUSY; |
2273 | + } |
2274 | + } |
2275 | + |
2276 | + /* FIXME: size should be calculated using d->width, d->height */ |
2277 | + |
2278 | au0828_writereg(d, AU0828_SENSORCTRL_VBI_103, 0x00); |
2279 | au0828_writereg(d, 0x106, 0x00); |
2280 | /* set x position */ |
2281 | @@ -1002,15 +1018,6 @@ static int au0828_v4l2_open(struct file *filp) |
2282 | return -ERESTARTSYS; |
2283 | } |
2284 | if (dev->users == 0) { |
2285 | - /* set au0828 interface0 to AS5 here again */ |
2286 | - ret = usb_set_interface(dev->usbdev, 0, 5); |
2287 | - if (ret < 0) { |
2288 | - mutex_unlock(&dev->lock); |
2289 | - printk(KERN_INFO "Au0828 can't set alternate to 5!\n"); |
2290 | - kfree(fh); |
2291 | - return -EBUSY; |
2292 | - } |
2293 | - |
2294 | au0828_analog_stream_enable(dev); |
2295 | au0828_analog_stream_reset(dev); |
2296 | |
2297 | @@ -1252,13 +1259,6 @@ static int au0828_set_format(struct au0828_dev *dev, unsigned int cmd, |
2298 | } |
2299 | } |
2300 | |
2301 | - /* set au0828 interface0 to AS5 here again */ |
2302 | - ret = usb_set_interface(dev->usbdev, 0, 5); |
2303 | - if (ret < 0) { |
2304 | - printk(KERN_INFO "Au0828 can't set alt setting to 5!\n"); |
2305 | - return -EBUSY; |
2306 | - } |
2307 | - |
2308 | au0828_analog_stream_enable(dev); |
2309 | |
2310 | return 0; |
2311 | diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c |
2312 | index 90b630ccc8bc..0aefe501fd3c 100644 |
2313 | --- a/drivers/mfd/omap-usb-host.c |
2314 | +++ b/drivers/mfd/omap-usb-host.c |
2315 | @@ -445,7 +445,7 @@ static unsigned omap_usbhs_rev1_hostconfig(struct usbhs_hcd_omap *omap, |
2316 | |
2317 | for (i = 0; i < omap->nports; i++) { |
2318 | if (is_ehci_phy_mode(pdata->port_mode[i])) { |
2319 | - reg &= OMAP_UHH_HOSTCONFIG_ULPI_BYPASS; |
2320 | + reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_BYPASS; |
2321 | break; |
2322 | } |
2323 | } |
2324 | diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c |
2325 | index 19d637266fcd..71e4f6ccae2f 100644 |
2326 | --- a/drivers/mtd/ftl.c |
2327 | +++ b/drivers/mtd/ftl.c |
2328 | @@ -1075,7 +1075,6 @@ static void ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) |
2329 | return; |
2330 | } |
2331 | |
2332 | - ftl_freepart(partition); |
2333 | kfree(partition); |
2334 | } |
2335 | |
2336 | diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c |
2337 | index 6f55d92dc233..64d8e32b6ca0 100644 |
2338 | --- a/drivers/mtd/nand/omap2.c |
2339 | +++ b/drivers/mtd/nand/omap2.c |
2340 | @@ -933,7 +933,7 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat, |
2341 | u32 val; |
2342 | |
2343 | val = readl(info->reg.gpmc_ecc_config); |
2344 | - if (((val >> ECC_CONFIG_CS_SHIFT) & ~CS_MASK) != info->gpmc_cs) |
2345 | + if (((val >> ECC_CONFIG_CS_SHIFT) & CS_MASK) != info->gpmc_cs) |
2346 | return -EINVAL; |
2347 | |
2348 | /* read ecc result */ |
2349 | diff --git a/drivers/power/bq2415x_charger.c b/drivers/power/bq2415x_charger.c |
2350 | index 79a37f6d3307..e384844a1ae1 100644 |
2351 | --- a/drivers/power/bq2415x_charger.c |
2352 | +++ b/drivers/power/bq2415x_charger.c |
2353 | @@ -840,8 +840,7 @@ static int bq2415x_notifier_call(struct notifier_block *nb, |
2354 | if (bq->automode < 1) |
2355 | return NOTIFY_OK; |
2356 | |
2357 | - sysfs_notify(&bq->charger.dev->kobj, NULL, "reported_mode"); |
2358 | - bq2415x_set_mode(bq, bq->reported_mode); |
2359 | + schedule_delayed_work(&bq->work, 0); |
2360 | |
2361 | return NOTIFY_OK; |
2362 | } |
2363 | @@ -892,6 +891,11 @@ static void bq2415x_timer_work(struct work_struct *work) |
2364 | int error; |
2365 | int boost; |
2366 | |
2367 | + if (bq->automode > 0 && (bq->reported_mode != bq->mode)) { |
2368 | + sysfs_notify(&bq->charger.dev->kobj, NULL, "reported_mode"); |
2369 | + bq2415x_set_mode(bq, bq->reported_mode); |
2370 | + } |
2371 | + |
2372 | if (!bq->autotimer) |
2373 | return; |
2374 | |
2375 | diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c |
2376 | index f0ea4fdfde87..8b963a757883 100644 |
2377 | --- a/drivers/regulator/arizona-ldo1.c |
2378 | +++ b/drivers/regulator/arizona-ldo1.c |
2379 | @@ -141,8 +141,6 @@ static struct regulator_ops arizona_ldo1_ops = { |
2380 | .map_voltage = regulator_map_voltage_linear, |
2381 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
2382 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
2383 | - .get_bypass = regulator_get_bypass_regmap, |
2384 | - .set_bypass = regulator_set_bypass_regmap, |
2385 | }; |
2386 | |
2387 | static const struct regulator_desc arizona_ldo1 = { |
2388 | diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h |
2389 | index 2e28392c2fb6..a38aafa030b3 100644 |
2390 | --- a/drivers/scsi/bfa/bfa_ioc.h |
2391 | +++ b/drivers/scsi/bfa/bfa_ioc.h |
2392 | @@ -72,7 +72,7 @@ struct bfa_sge_s { |
2393 | } while (0) |
2394 | |
2395 | #define bfa_swap_words(_x) ( \ |
2396 | - ((_x) << 32) | ((_x) >> 32)) |
2397 | + ((u64)(_x) << 32) | ((u64)(_x) >> 32)) |
2398 | |
2399 | #ifdef __BIG_ENDIAN |
2400 | #define bfa_sge_to_be(_x) |
2401 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c |
2402 | index f969aca0b54e..49014a143c6a 100644 |
2403 | --- a/drivers/scsi/scsi_devinfo.c |
2404 | +++ b/drivers/scsi/scsi_devinfo.c |
2405 | @@ -222,6 +222,7 @@ static struct { |
2406 | {"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
2407 | {"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
2408 | {"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
2409 | + {"Promise", "VTrak E610f", NULL, BLIST_SPARSELUN | BLIST_NO_RSOC}, |
2410 | {"Promise", "", NULL, BLIST_SPARSELUN}, |
2411 | {"QUANTUM", "XP34301", "1071", BLIST_NOTQ}, |
2412 | {"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN}, |
2413 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c |
2414 | index 4109530e92a0..054ec2c412a4 100644 |
2415 | --- a/drivers/scsi/scsi_scan.c |
2416 | +++ b/drivers/scsi/scsi_scan.c |
2417 | @@ -922,6 +922,12 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, |
2418 | if (*bflags & BLIST_USE_10_BYTE_MS) |
2419 | sdev->use_10_for_ms = 1; |
2420 | |
2421 | + /* some devices don't like REPORT SUPPORTED OPERATION CODES |
2422 | + * and will simply timeout causing sd_mod init to take a very |
2423 | + * very long time */ |
2424 | + if (*bflags & BLIST_NO_RSOC) |
2425 | + sdev->no_report_opcodes = 1; |
2426 | + |
2427 | /* set the device running here so that slave configure |
2428 | * may do I/O */ |
2429 | ret = scsi_device_set_state(sdev, SDEV_RUNNING); |
2430 | @@ -950,7 +956,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, |
2431 | |
2432 | sdev->eh_timeout = SCSI_DEFAULT_EH_TIMEOUT; |
2433 | |
2434 | - if (*bflags & BLIST_SKIP_VPD_PAGES) |
2435 | + if (*bflags & BLIST_TRY_VPD_PAGES) |
2436 | + sdev->try_vpd_pages = 1; |
2437 | + else if (*bflags & BLIST_SKIP_VPD_PAGES) |
2438 | sdev->skip_vpd_pages = 1; |
2439 | |
2440 | transport_configure_device(&sdev->sdev_gendev); |
2441 | @@ -1236,6 +1244,12 @@ static void scsi_sequential_lun_scan(struct scsi_target *starget, |
2442 | max_dev_lun = min(8U, max_dev_lun); |
2443 | |
2444 | /* |
2445 | + * Stop scanning at 255 unless BLIST_SCSI3LUN |
2446 | + */ |
2447 | + if (!(bflags & BLIST_SCSI3LUN)) |
2448 | + max_dev_lun = min(256U, max_dev_lun); |
2449 | + |
2450 | + /* |
2451 | * We have already scanned LUN 0, so start at LUN 1. Keep scanning |
2452 | * until we reach the max, or no LUN is found and we are not |
2453 | * sparse_lun. |
2454 | diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c |
2455 | index d47ffc8d3e43..e3e794ee7ddd 100644 |
2456 | --- a/drivers/scsi/scsi_transport_srp.c |
2457 | +++ b/drivers/scsi/scsi_transport_srp.c |
2458 | @@ -473,7 +473,8 @@ static void __srp_start_tl_fail_timers(struct srp_rport *rport) |
2459 | if (delay > 0) |
2460 | queue_delayed_work(system_long_wq, &rport->reconnect_work, |
2461 | 1UL * delay * HZ); |
2462 | - if (srp_rport_set_state(rport, SRP_RPORT_BLOCKED) == 0) { |
2463 | + if ((fast_io_fail_tmo >= 0 || dev_loss_tmo >= 0) && |
2464 | + srp_rport_set_state(rport, SRP_RPORT_BLOCKED) == 0) { |
2465 | pr_debug("%s new state: %d\n", dev_name(&shost->shost_gendev), |
2466 | rport->state); |
2467 | scsi_target_block(&shost->shost_gendev); |
2468 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
2469 | index 36d1a23f14be..e8abb731c7ec 100644 |
2470 | --- a/drivers/scsi/sd.c |
2471 | +++ b/drivers/scsi/sd.c |
2472 | @@ -2686,6 +2686,11 @@ static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer) |
2473 | |
2474 | static int sd_try_extended_inquiry(struct scsi_device *sdp) |
2475 | { |
2476 | + /* Attempt VPD inquiry if the device blacklist explicitly calls |
2477 | + * for it. |
2478 | + */ |
2479 | + if (sdp->try_vpd_pages) |
2480 | + return 1; |
2481 | /* |
2482 | * Although VPD inquiries can go to SCSI-2 type devices, |
2483 | * some USB ones crash on receiving them, and the pages |
2484 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c |
2485 | index 9969fa1ef7c4..ed0f899e8aa5 100644 |
2486 | --- a/drivers/scsi/storvsc_drv.c |
2487 | +++ b/drivers/scsi/storvsc_drv.c |
2488 | @@ -33,6 +33,7 @@ |
2489 | #include <linux/device.h> |
2490 | #include <linux/hyperv.h> |
2491 | #include <linux/mempool.h> |
2492 | +#include <linux/blkdev.h> |
2493 | #include <scsi/scsi.h> |
2494 | #include <scsi/scsi_cmnd.h> |
2495 | #include <scsi/scsi_host.h> |
2496 | @@ -330,17 +331,17 @@ static int storvsc_timeout = 180; |
2497 | |
2498 | static void storvsc_on_channel_callback(void *context); |
2499 | |
2500 | -/* |
2501 | - * In Hyper-V, each port/path/target maps to 1 scsi host adapter. In |
2502 | - * reality, the path/target is not used (ie always set to 0) so our |
2503 | - * scsi host adapter essentially has 1 bus with 1 target that contains |
2504 | - * up to 256 luns. |
2505 | - */ |
2506 | -#define STORVSC_MAX_LUNS_PER_TARGET 64 |
2507 | -#define STORVSC_MAX_TARGETS 1 |
2508 | -#define STORVSC_MAX_CHANNELS 1 |
2509 | +#define STORVSC_MAX_LUNS_PER_TARGET 255 |
2510 | +#define STORVSC_MAX_TARGETS 2 |
2511 | +#define STORVSC_MAX_CHANNELS 8 |
2512 | |
2513 | +#define STORVSC_FC_MAX_LUNS_PER_TARGET 255 |
2514 | +#define STORVSC_FC_MAX_TARGETS 128 |
2515 | +#define STORVSC_FC_MAX_CHANNELS 8 |
2516 | |
2517 | +#define STORVSC_IDE_MAX_LUNS_PER_TARGET 64 |
2518 | +#define STORVSC_IDE_MAX_TARGETS 1 |
2519 | +#define STORVSC_IDE_MAX_CHANNELS 1 |
2520 | |
2521 | struct storvsc_cmd_request { |
2522 | struct list_head entry; |
2523 | @@ -1017,6 +1018,13 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb, |
2524 | case ATA_12: |
2525 | set_host_byte(scmnd, DID_PASSTHROUGH); |
2526 | break; |
2527 | + /* |
2528 | + * On Some Windows hosts TEST_UNIT_READY command can return |
2529 | + * SRB_STATUS_ERROR, let the upper level code deal with it |
2530 | + * based on the sense information. |
2531 | + */ |
2532 | + case TEST_UNIT_READY: |
2533 | + break; |
2534 | default: |
2535 | set_host_byte(scmnd, DID_TARGET_FAILURE); |
2536 | } |
2537 | @@ -1518,6 +1526,16 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd) |
2538 | return SUCCESS; |
2539 | } |
2540 | |
2541 | +/* |
2542 | + * The host guarantees to respond to each command, although I/O latencies might |
2543 | + * be unbounded on Azure. Reset the timer unconditionally to give the host a |
2544 | + * chance to perform EH. |
2545 | + */ |
2546 | +static enum blk_eh_timer_return storvsc_eh_timed_out(struct scsi_cmnd *scmnd) |
2547 | +{ |
2548 | + return BLK_EH_RESET_TIMER; |
2549 | +} |
2550 | + |
2551 | static bool storvsc_scsi_cmd_ok(struct scsi_cmnd *scmnd) |
2552 | { |
2553 | bool allowed = true; |
2554 | @@ -1553,9 +1571,19 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd) |
2555 | struct vmscsi_request *vm_srb; |
2556 | struct stor_mem_pools *memp = scmnd->device->hostdata; |
2557 | |
2558 | - if (!storvsc_scsi_cmd_ok(scmnd)) { |
2559 | - scmnd->scsi_done(scmnd); |
2560 | - return 0; |
2561 | + if (vmstor_current_major <= VMSTOR_WIN8_MAJOR) { |
2562 | + /* |
2563 | + * On legacy hosts filter unimplemented commands. |
2564 | + * Future hosts are expected to correctly handle |
2565 | + * unsupported commands. Furthermore, it is |
2566 | + * possible that some of the currently |
2567 | + * unsupported commands maybe supported in |
2568 | + * future versions of the host. |
2569 | + */ |
2570 | + if (!storvsc_scsi_cmd_ok(scmnd)) { |
2571 | + scmnd->scsi_done(scmnd); |
2572 | + return 0; |
2573 | + } |
2574 | } |
2575 | |
2576 | request_size = sizeof(struct storvsc_cmd_request); |
2577 | @@ -1580,26 +1608,24 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd) |
2578 | vm_srb = &cmd_request->vstor_packet.vm_srb; |
2579 | vm_srb->win8_extension.time_out_value = 60; |
2580 | |
2581 | + vm_srb->win8_extension.srb_flags |= |
2582 | + (SRB_FLAGS_QUEUE_ACTION_ENABLE | |
2583 | + SRB_FLAGS_DISABLE_SYNCH_TRANSFER); |
2584 | |
2585 | /* Build the SRB */ |
2586 | switch (scmnd->sc_data_direction) { |
2587 | case DMA_TO_DEVICE: |
2588 | vm_srb->data_in = WRITE_TYPE; |
2589 | vm_srb->win8_extension.srb_flags |= SRB_FLAGS_DATA_OUT; |
2590 | - vm_srb->win8_extension.srb_flags |= |
2591 | - (SRB_FLAGS_QUEUE_ACTION_ENABLE | |
2592 | - SRB_FLAGS_DISABLE_SYNCH_TRANSFER); |
2593 | break; |
2594 | case DMA_FROM_DEVICE: |
2595 | vm_srb->data_in = READ_TYPE; |
2596 | vm_srb->win8_extension.srb_flags |= SRB_FLAGS_DATA_IN; |
2597 | - vm_srb->win8_extension.srb_flags |= |
2598 | - (SRB_FLAGS_QUEUE_ACTION_ENABLE | |
2599 | - SRB_FLAGS_DISABLE_SYNCH_TRANSFER); |
2600 | break; |
2601 | default: |
2602 | vm_srb->data_in = UNKNOWN_TYPE; |
2603 | - vm_srb->win8_extension.srb_flags = 0; |
2604 | + vm_srb->win8_extension.srb_flags |= (SRB_FLAGS_DATA_IN | |
2605 | + SRB_FLAGS_DATA_OUT); |
2606 | break; |
2607 | } |
2608 | |
2609 | @@ -1687,11 +1713,11 @@ static struct scsi_host_template scsi_driver = { |
2610 | .bios_param = storvsc_get_chs, |
2611 | .queuecommand = storvsc_queuecommand, |
2612 | .eh_host_reset_handler = storvsc_host_reset_handler, |
2613 | + .eh_timed_out = storvsc_eh_timed_out, |
2614 | .slave_alloc = storvsc_device_alloc, |
2615 | .slave_destroy = storvsc_device_destroy, |
2616 | .slave_configure = storvsc_device_configure, |
2617 | - .cmd_per_lun = 1, |
2618 | - /* 64 max_queue * 1 target */ |
2619 | + .cmd_per_lun = 255, |
2620 | .can_queue = STORVSC_MAX_IO_REQUESTS*STORVSC_MAX_TARGETS, |
2621 | .this_id = -1, |
2622 | /* no use setting to 0 since ll_blk_rw reset it to 1 */ |
2623 | @@ -1743,19 +1769,25 @@ static int storvsc_probe(struct hv_device *device, |
2624 | * set state to properly communicate with the host. |
2625 | */ |
2626 | |
2627 | - if (vmbus_proto_version == VERSION_WIN8) { |
2628 | - sense_buffer_size = POST_WIN7_STORVSC_SENSE_BUFFER_SIZE; |
2629 | - vmscsi_size_delta = 0; |
2630 | - vmstor_current_major = VMSTOR_WIN8_MAJOR; |
2631 | - vmstor_current_minor = VMSTOR_WIN8_MINOR; |
2632 | - } else { |
2633 | + switch (vmbus_proto_version) { |
2634 | + case VERSION_WS2008: |
2635 | + case VERSION_WIN7: |
2636 | sense_buffer_size = PRE_WIN8_STORVSC_SENSE_BUFFER_SIZE; |
2637 | vmscsi_size_delta = sizeof(struct vmscsi_win8_extension); |
2638 | vmstor_current_major = VMSTOR_WIN7_MAJOR; |
2639 | vmstor_current_minor = VMSTOR_WIN7_MINOR; |
2640 | + break; |
2641 | + default: |
2642 | + sense_buffer_size = POST_WIN7_STORVSC_SENSE_BUFFER_SIZE; |
2643 | + vmscsi_size_delta = 0; |
2644 | + vmstor_current_major = VMSTOR_WIN8_MAJOR; |
2645 | + vmstor_current_minor = VMSTOR_WIN8_MINOR; |
2646 | + break; |
2647 | } |
2648 | |
2649 | - |
2650 | + if (dev_id->driver_data == SFC_GUID) |
2651 | + scsi_driver.can_queue = (STORVSC_MAX_IO_REQUESTS * |
2652 | + STORVSC_FC_MAX_TARGETS); |
2653 | host = scsi_host_alloc(&scsi_driver, |
2654 | sizeof(struct hv_host_device)); |
2655 | if (!host) |
2656 | @@ -1789,12 +1821,25 @@ static int storvsc_probe(struct hv_device *device, |
2657 | host_dev->path = stor_device->path_id; |
2658 | host_dev->target = stor_device->target_id; |
2659 | |
2660 | - /* max # of devices per target */ |
2661 | - host->max_lun = STORVSC_MAX_LUNS_PER_TARGET; |
2662 | - /* max # of targets per channel */ |
2663 | - host->max_id = STORVSC_MAX_TARGETS; |
2664 | - /* max # of channels */ |
2665 | - host->max_channel = STORVSC_MAX_CHANNELS - 1; |
2666 | + switch (dev_id->driver_data) { |
2667 | + case SFC_GUID: |
2668 | + host->max_lun = STORVSC_FC_MAX_LUNS_PER_TARGET; |
2669 | + host->max_id = STORVSC_FC_MAX_TARGETS; |
2670 | + host->max_channel = STORVSC_FC_MAX_CHANNELS - 1; |
2671 | + break; |
2672 | + |
2673 | + case SCSI_GUID: |
2674 | + host->max_lun = STORVSC_MAX_LUNS_PER_TARGET; |
2675 | + host->max_id = STORVSC_MAX_TARGETS; |
2676 | + host->max_channel = STORVSC_MAX_CHANNELS - 1; |
2677 | + break; |
2678 | + |
2679 | + default: |
2680 | + host->max_lun = STORVSC_IDE_MAX_LUNS_PER_TARGET; |
2681 | + host->max_id = STORVSC_IDE_MAX_TARGETS; |
2682 | + host->max_channel = STORVSC_IDE_MAX_CHANNELS - 1; |
2683 | + break; |
2684 | + } |
2685 | /* max cmd length */ |
2686 | host->max_cmd_len = STORVSC_MAX_CMD_LEN; |
2687 | |
2688 | diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c |
2689 | index a72127f08e39..a64f1557c156 100644 |
2690 | --- a/drivers/spi/spi-omap2-mcspi.c |
2691 | +++ b/drivers/spi/spi-omap2-mcspi.c |
2692 | @@ -147,6 +147,7 @@ struct omap2_mcspi_cs { |
2693 | void __iomem *base; |
2694 | unsigned long phys; |
2695 | int word_len; |
2696 | + u16 mode; |
2697 | struct list_head node; |
2698 | /* Context save and restore shadow register */ |
2699 | u32 chconf0; |
2700 | @@ -899,6 +900,8 @@ static int omap2_mcspi_setup_transfer(struct spi_device *spi, |
2701 | |
2702 | mcspi_write_chconf0(spi, l); |
2703 | |
2704 | + cs->mode = spi->mode; |
2705 | + |
2706 | dev_dbg(&spi->dev, "setup: speed %d, sample %s edge, clk %s\n", |
2707 | OMAP2_MCSPI_MAX_FREQ >> div, |
2708 | (spi->mode & SPI_CPHA) ? "trailing" : "leading", |
2709 | @@ -971,6 +974,7 @@ static int omap2_mcspi_setup(struct spi_device *spi) |
2710 | return -ENOMEM; |
2711 | cs->base = mcspi->base + spi->chip_select * 0x14; |
2712 | cs->phys = mcspi->phys + spi->chip_select * 0x14; |
2713 | + cs->mode = 0; |
2714 | cs->chconf0 = 0; |
2715 | spi->controller_state = cs; |
2716 | /* Link this to context save list */ |
2717 | @@ -1051,6 +1055,16 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m) |
2718 | cs = spi->controller_state; |
2719 | cd = spi->controller_data; |
2720 | |
2721 | + /* |
2722 | + * The slave driver could have changed spi->mode in which case |
2723 | + * it will be different from cs->mode (the current hardware setup). |
2724 | + * If so, set par_override (even though its not a parity issue) so |
2725 | + * omap2_mcspi_setup_transfer will be called to configure the hardware |
2726 | + * with the correct mode on the first iteration of the loop below. |
2727 | + */ |
2728 | + if (spi->mode != cs->mode) |
2729 | + par_override = 1; |
2730 | + |
2731 | omap2_mcspi_set_enable(spi, 0); |
2732 | list_for_each_entry(t, &m->transfers, transfer_list) { |
2733 | if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) { |
2734 | diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c |
2735 | index 7f2121fe2622..977b0619bb78 100644 |
2736 | --- a/drivers/spi/spi-orion.c |
2737 | +++ b/drivers/spi/spi-orion.c |
2738 | @@ -404,8 +404,6 @@ static int orion_spi_probe(struct platform_device *pdev) |
2739 | struct resource *r; |
2740 | unsigned long tclk_hz; |
2741 | int status = 0; |
2742 | - const u32 *iprop; |
2743 | - int size; |
2744 | |
2745 | master = spi_alloc_master(&pdev->dev, sizeof(*spi)); |
2746 | if (master == NULL) { |
2747 | @@ -416,10 +414,10 @@ static int orion_spi_probe(struct platform_device *pdev) |
2748 | if (pdev->id != -1) |
2749 | master->bus_num = pdev->id; |
2750 | if (pdev->dev.of_node) { |
2751 | - iprop = of_get_property(pdev->dev.of_node, "cell-index", |
2752 | - &size); |
2753 | - if (iprop && size == sizeof(*iprop)) |
2754 | - master->bus_num = *iprop; |
2755 | + u32 cell_index; |
2756 | + if (!of_property_read_u32(pdev->dev.of_node, "cell-index", |
2757 | + &cell_index)) |
2758 | + master->bus_num = cell_index; |
2759 | } |
2760 | |
2761 | /* we support only mode 0, and no options */ |
2762 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c |
2763 | index c702fc536a77..ced9ecffa163 100644 |
2764 | --- a/drivers/spi/spi-pxa2xx.c |
2765 | +++ b/drivers/spi/spi-pxa2xx.c |
2766 | @@ -1078,6 +1078,7 @@ static struct acpi_device_id pxa2xx_spi_acpi_match[] = { |
2767 | { "INT3430", 0 }, |
2768 | { "INT3431", 0 }, |
2769 | { "80860F0E", 0 }, |
2770 | + { "8086228E", 0 }, |
2771 | { }, |
2772 | }; |
2773 | MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); |
2774 | diff --git a/drivers/xen/events/events_fifo.c b/drivers/xen/events/events_fifo.c |
2775 | index 172a8bc27abd..ef7d446e07ee 100644 |
2776 | --- a/drivers/xen/events/events_fifo.c |
2777 | +++ b/drivers/xen/events/events_fifo.c |
2778 | @@ -99,6 +99,25 @@ static unsigned evtchn_fifo_nr_channels(void) |
2779 | return event_array_pages * EVENT_WORDS_PER_PAGE; |
2780 | } |
2781 | |
2782 | +static int init_control_block(int cpu, |
2783 | + struct evtchn_fifo_control_block *control_block) |
2784 | +{ |
2785 | + struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu); |
2786 | + struct evtchn_init_control init_control; |
2787 | + unsigned int i; |
2788 | + |
2789 | + /* Reset the control block and the local HEADs. */ |
2790 | + clear_page(control_block); |
2791 | + for (i = 0; i < EVTCHN_FIFO_MAX_QUEUES; i++) |
2792 | + q->head[i] = 0; |
2793 | + |
2794 | + init_control.control_gfn = virt_to_mfn(control_block); |
2795 | + init_control.offset = 0; |
2796 | + init_control.vcpu = cpu; |
2797 | + |
2798 | + return HYPERVISOR_event_channel_op(EVTCHNOP_init_control, &init_control); |
2799 | +} |
2800 | + |
2801 | static void free_unused_array_pages(void) |
2802 | { |
2803 | unsigned i; |
2804 | @@ -327,7 +346,6 @@ static void evtchn_fifo_resume(void) |
2805 | |
2806 | for_each_possible_cpu(cpu) { |
2807 | void *control_block = per_cpu(cpu_control_block, cpu); |
2808 | - struct evtchn_init_control init_control; |
2809 | int ret; |
2810 | |
2811 | if (!control_block) |
2812 | @@ -344,12 +362,7 @@ static void evtchn_fifo_resume(void) |
2813 | continue; |
2814 | } |
2815 | |
2816 | - init_control.control_gfn = virt_to_mfn(control_block); |
2817 | - init_control.offset = 0; |
2818 | - init_control.vcpu = cpu; |
2819 | - |
2820 | - ret = HYPERVISOR_event_channel_op(EVTCHNOP_init_control, |
2821 | - &init_control); |
2822 | + ret = init_control_block(cpu, control_block); |
2823 | if (ret < 0) |
2824 | BUG(); |
2825 | } |
2826 | @@ -377,30 +390,25 @@ static const struct evtchn_ops evtchn_ops_fifo = { |
2827 | .resume = evtchn_fifo_resume, |
2828 | }; |
2829 | |
2830 | -static int evtchn_fifo_init_control_block(unsigned cpu) |
2831 | +static int evtchn_fifo_alloc_control_block(unsigned cpu) |
2832 | { |
2833 | - struct page *control_block = NULL; |
2834 | - struct evtchn_init_control init_control; |
2835 | + void *control_block = NULL; |
2836 | int ret = -ENOMEM; |
2837 | |
2838 | - control_block = alloc_page(GFP_KERNEL|__GFP_ZERO); |
2839 | + control_block = (void *)__get_free_page(GFP_KERNEL); |
2840 | if (control_block == NULL) |
2841 | goto error; |
2842 | |
2843 | - init_control.control_gfn = virt_to_mfn(page_address(control_block)); |
2844 | - init_control.offset = 0; |
2845 | - init_control.vcpu = cpu; |
2846 | - |
2847 | - ret = HYPERVISOR_event_channel_op(EVTCHNOP_init_control, &init_control); |
2848 | + ret = init_control_block(cpu, control_block); |
2849 | if (ret < 0) |
2850 | goto error; |
2851 | |
2852 | - per_cpu(cpu_control_block, cpu) = page_address(control_block); |
2853 | + per_cpu(cpu_control_block, cpu) = control_block; |
2854 | |
2855 | return 0; |
2856 | |
2857 | error: |
2858 | - __free_page(control_block); |
2859 | + free_page((unsigned long)control_block); |
2860 | return ret; |
2861 | } |
2862 | |
2863 | @@ -414,7 +422,7 @@ static int evtchn_fifo_cpu_notification(struct notifier_block *self, |
2864 | switch (action) { |
2865 | case CPU_UP_PREPARE: |
2866 | if (!per_cpu(cpu_control_block, cpu)) |
2867 | - ret = evtchn_fifo_init_control_block(cpu); |
2868 | + ret = evtchn_fifo_alloc_control_block(cpu); |
2869 | break; |
2870 | default: |
2871 | break; |
2872 | @@ -431,7 +439,7 @@ int __init xen_evtchn_fifo_init(void) |
2873 | int cpu = get_cpu(); |
2874 | int ret; |
2875 | |
2876 | - ret = evtchn_fifo_init_control_block(cpu); |
2877 | + ret = evtchn_fifo_alloc_control_block(cpu); |
2878 | if (ret < 0) |
2879 | goto out; |
2880 | |
2881 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
2882 | index 30f6e9251a4a..f15d4353f30f 100644 |
2883 | --- a/fs/cifs/cifsglob.h |
2884 | +++ b/fs/cifs/cifsglob.h |
2885 | @@ -70,11 +70,6 @@ |
2886 | #define SERVER_NAME_LENGTH 40 |
2887 | #define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1) |
2888 | |
2889 | -/* used to define string lengths for reversing unicode strings */ |
2890 | -/* (256+1)*2 = 514 */ |
2891 | -/* (max path length + 1 for null) * 2 for unicode */ |
2892 | -#define MAX_NAME 514 |
2893 | - |
2894 | /* SMB echo "timeout" -- FIXME: tunable? */ |
2895 | #define SMB_ECHO_INTERVAL (60 * HZ) |
2896 | |
2897 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
2898 | index 87c4dd072cde..8175b18df819 100644 |
2899 | --- a/fs/cifs/file.c |
2900 | +++ b/fs/cifs/file.c |
2901 | @@ -2844,7 +2844,7 @@ cifs_uncached_read_into_pages(struct TCP_Server_Info *server, |
2902 | total_read += result; |
2903 | } |
2904 | |
2905 | - return total_read > 0 ? total_read : result; |
2906 | + return total_read > 0 && result != -EAGAIN ? total_read : result; |
2907 | } |
2908 | |
2909 | static ssize_t |
2910 | @@ -3267,7 +3267,7 @@ cifs_readpages_read_into_pages(struct TCP_Server_Info *server, |
2911 | total_read += result; |
2912 | } |
2913 | |
2914 | - return total_read > 0 ? total_read : result; |
2915 | + return total_read > 0 && result != -EAGAIN ? total_read : result; |
2916 | } |
2917 | |
2918 | static int cifs_readpages(struct file *file, struct address_space *mapping, |
2919 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c |
2920 | index aadc2b68678b..f2ddcf7ac9c3 100644 |
2921 | --- a/fs/cifs/inode.c |
2922 | +++ b/fs/cifs/inode.c |
2923 | @@ -1706,13 +1706,22 @@ cifs_rename(struct inode *source_dir, struct dentry *source_dentry, |
2924 | unlink_target: |
2925 | /* Try unlinking the target dentry if it's not negative */ |
2926 | if (target_dentry->d_inode && (rc == -EACCES || rc == -EEXIST)) { |
2927 | - tmprc = cifs_unlink(target_dir, target_dentry); |
2928 | + if (d_is_dir(target_dentry)) |
2929 | + tmprc = cifs_rmdir(target_dir, target_dentry); |
2930 | + else |
2931 | + tmprc = cifs_unlink(target_dir, target_dentry); |
2932 | if (tmprc) |
2933 | goto cifs_rename_exit; |
2934 | rc = cifs_do_rename(xid, source_dentry, from_name, |
2935 | target_dentry, to_name); |
2936 | } |
2937 | |
2938 | + /* force revalidate to go get info when needed */ |
2939 | + CIFS_I(source_dir)->time = CIFS_I(target_dir)->time = 0; |
2940 | + |
2941 | + source_dir->i_ctime = source_dir->i_mtime = target_dir->i_ctime = |
2942 | + target_dir->i_mtime = current_fs_time(source_dir->i_sb); |
2943 | + |
2944 | cifs_rename_exit: |
2945 | kfree(info_buf_source); |
2946 | kfree(from_name); |
2947 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
2948 | index b15862e0f68c..2bbf11b09214 100644 |
2949 | --- a/fs/cifs/readdir.c |
2950 | +++ b/fs/cifs/readdir.c |
2951 | @@ -596,8 +596,8 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos, |
2952 | if (!cfile->srch_inf.endOfSearch && !cfile->invalidHandle) { |
2953 | cfile->invalidHandle = true; |
2954 | spin_unlock(&cifs_file_list_lock); |
2955 | - if (server->ops->close) |
2956 | - server->ops->close(xid, tcon, &cfile->fid); |
2957 | + if (server->ops->close_dir) |
2958 | + server->ops->close_dir(xid, tcon, &cfile->fid); |
2959 | } else |
2960 | spin_unlock(&cifs_file_list_lock); |
2961 | if (cfile->srch_inf.ntwrk_buf_start) { |
2962 | diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c |
2963 | index 3f17b4550831..45992944e238 100644 |
2964 | --- a/fs/cifs/smb2file.c |
2965 | +++ b/fs/cifs/smb2file.c |
2966 | @@ -50,7 +50,7 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms, |
2967 | goto out; |
2968 | } |
2969 | |
2970 | - smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2, |
2971 | + smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + PATH_MAX * 2, |
2972 | GFP_KERNEL); |
2973 | if (smb2_data == NULL) { |
2974 | rc = -ENOMEM; |
2975 | diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c |
2976 | index 84c012a6aba0..215f8d3e3e53 100644 |
2977 | --- a/fs/cifs/smb2inode.c |
2978 | +++ b/fs/cifs/smb2inode.c |
2979 | @@ -131,7 +131,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, |
2980 | *adjust_tz = false; |
2981 | *symlink = false; |
2982 | |
2983 | - smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2, |
2984 | + smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + PATH_MAX * 2, |
2985 | GFP_KERNEL); |
2986 | if (smb2_data == NULL) |
2987 | return -ENOMEM; |
2988 | diff --git a/fs/cifs/smb2maperror.c b/fs/cifs/smb2maperror.c |
2989 | index 94bd4fbb13d3..e31a9dfdcd39 100644 |
2990 | --- a/fs/cifs/smb2maperror.c |
2991 | +++ b/fs/cifs/smb2maperror.c |
2992 | @@ -605,7 +605,7 @@ static const struct status_to_posix_error smb2_error_map_table[] = { |
2993 | {STATUS_MAPPED_FILE_SIZE_ZERO, -EIO, "STATUS_MAPPED_FILE_SIZE_ZERO"}, |
2994 | {STATUS_TOO_MANY_OPENED_FILES, -EMFILE, "STATUS_TOO_MANY_OPENED_FILES"}, |
2995 | {STATUS_CANCELLED, -EIO, "STATUS_CANCELLED"}, |
2996 | - {STATUS_CANNOT_DELETE, -EIO, "STATUS_CANNOT_DELETE"}, |
2997 | + {STATUS_CANNOT_DELETE, -EACCES, "STATUS_CANNOT_DELETE"}, |
2998 | {STATUS_INVALID_COMPUTER_NAME, -EIO, "STATUS_INVALID_COMPUTER_NAME"}, |
2999 | {STATUS_FILE_DELETED, -EIO, "STATUS_FILE_DELETED"}, |
3000 | {STATUS_SPECIAL_ACCOUNT, -EIO, "STATUS_SPECIAL_ACCOUNT"}, |
3001 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
3002 | index 35ddc3ed119d..f8977b2d9187 100644 |
3003 | --- a/fs/cifs/smb2ops.c |
3004 | +++ b/fs/cifs/smb2ops.c |
3005 | @@ -339,7 +339,7 @@ smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, |
3006 | int rc; |
3007 | struct smb2_file_all_info *smb2_data; |
3008 | |
3009 | - smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2, |
3010 | + smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + PATH_MAX * 2, |
3011 | GFP_KERNEL); |
3012 | if (smb2_data == NULL) |
3013 | return -ENOMEM; |
3014 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
3015 | index 049a3f2693ba..9aab8fe0e508 100644 |
3016 | --- a/fs/cifs/smb2pdu.c |
3017 | +++ b/fs/cifs/smb2pdu.c |
3018 | @@ -916,7 +916,8 @@ tcon_exit: |
3019 | tcon_error_exit: |
3020 | if (rsp->hdr.Status == STATUS_BAD_NETWORK_NAME) { |
3021 | cifs_dbg(VFS, "BAD_NETWORK_NAME: %s\n", tree); |
3022 | - tcon->bad_network_name = true; |
3023 | + if (tcon) |
3024 | + tcon->bad_network_name = true; |
3025 | } |
3026 | goto tcon_exit; |
3027 | } |
3028 | @@ -1539,7 +1540,7 @@ SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon, |
3029 | { |
3030 | return query_info(xid, tcon, persistent_fid, volatile_fid, |
3031 | FILE_ALL_INFORMATION, |
3032 | - sizeof(struct smb2_file_all_info) + MAX_NAME * 2, |
3033 | + sizeof(struct smb2_file_all_info) + PATH_MAX * 2, |
3034 | sizeof(struct smb2_file_all_info), data); |
3035 | } |
3036 | |
3037 | diff --git a/fs/dcache.c b/fs/dcache.c |
3038 | index 7f3b4004c6c3..58d57da91d2a 100644 |
3039 | --- a/fs/dcache.c |
3040 | +++ b/fs/dcache.c |
3041 | @@ -106,8 +106,7 @@ static inline struct hlist_bl_head *d_hash(const struct dentry *parent, |
3042 | unsigned int hash) |
3043 | { |
3044 | hash += (unsigned long) parent / L1_CACHE_BYTES; |
3045 | - hash = hash + (hash >> d_hash_shift); |
3046 | - return dentry_hashtable + (hash & d_hash_mask); |
3047 | + return dentry_hashtable + hash_32(hash, d_hash_shift); |
3048 | } |
3049 | |
3050 | /* Statistics gathering. */ |
3051 | diff --git a/fs/namei.c b/fs/namei.c |
3052 | index bdea10963aa5..d5a4faeb39a5 100644 |
3053 | --- a/fs/namei.c |
3054 | +++ b/fs/namei.c |
3055 | @@ -34,6 +34,7 @@ |
3056 | #include <linux/device_cgroup.h> |
3057 | #include <linux/fs_struct.h> |
3058 | #include <linux/posix_acl.h> |
3059 | +#include <linux/hash.h> |
3060 | #include <asm/uaccess.h> |
3061 | |
3062 | #include "internal.h" |
3063 | @@ -1624,8 +1625,7 @@ static inline int nested_symlink(struct path *path, struct nameidata *nd) |
3064 | |
3065 | static inline unsigned int fold_hash(unsigned long hash) |
3066 | { |
3067 | - hash += hash >> (8*sizeof(int)); |
3068 | - return hash; |
3069 | + return hash_64(hash, 32); |
3070 | } |
3071 | |
3072 | #else /* 32-bit case */ |
3073 | @@ -1797,7 +1797,7 @@ static int link_path_walk(const char *name, struct nameidata *nd) |
3074 | if (err) |
3075 | return err; |
3076 | } |
3077 | - if (!d_is_directory(nd->path.dentry)) { |
3078 | + if (!d_can_lookup(nd->path.dentry)) { |
3079 | err = -ENOTDIR; |
3080 | break; |
3081 | } |
3082 | @@ -1818,7 +1818,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, |
3083 | struct dentry *root = nd->root.dentry; |
3084 | struct inode *inode = root->d_inode; |
3085 | if (*name) { |
3086 | - if (!d_is_directory(root)) |
3087 | + if (!d_can_lookup(root)) |
3088 | return -ENOTDIR; |
3089 | retval = inode_permission(inode, MAY_EXEC); |
3090 | if (retval) |
3091 | @@ -1874,7 +1874,7 @@ static int path_init(int dfd, const char *name, unsigned int flags, |
3092 | dentry = f.file->f_path.dentry; |
3093 | |
3094 | if (*name) { |
3095 | - if (!d_is_directory(dentry)) { |
3096 | + if (!d_can_lookup(dentry)) { |
3097 | fdput(f); |
3098 | return -ENOTDIR; |
3099 | } |
3100 | @@ -1956,7 +1956,7 @@ static int path_lookupat(int dfd, const char *name, |
3101 | err = complete_walk(nd); |
3102 | |
3103 | if (!err && nd->flags & LOOKUP_DIRECTORY) { |
3104 | - if (!d_is_directory(nd->path.dentry)) { |
3105 | + if (!d_can_lookup(nd->path.dentry)) { |
3106 | path_put(&nd->path); |
3107 | err = -ENOTDIR; |
3108 | } |
3109 | @@ -2416,11 +2416,11 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) |
3110 | IS_IMMUTABLE(inode) || IS_SWAPFILE(inode)) |
3111 | return -EPERM; |
3112 | if (isdir) { |
3113 | - if (!d_is_directory(victim) && !d_is_autodir(victim)) |
3114 | + if (!d_is_dir(victim)) |
3115 | return -ENOTDIR; |
3116 | if (IS_ROOT(victim)) |
3117 | return -EBUSY; |
3118 | - } else if (d_is_directory(victim) || d_is_autodir(victim)) |
3119 | + } else if (d_is_dir(victim)) |
3120 | return -EISDIR; |
3121 | if (IS_DEADDIR(dir)) |
3122 | return -ENOENT; |
3123 | @@ -3018,11 +3018,10 @@ finish_open: |
3124 | } |
3125 | audit_inode(name, nd->path.dentry, 0); |
3126 | error = -EISDIR; |
3127 | - if ((open_flag & O_CREAT) && |
3128 | - (d_is_directory(nd->path.dentry) || d_is_autodir(nd->path.dentry))) |
3129 | + if ((open_flag & O_CREAT) && d_is_dir(nd->path.dentry)) |
3130 | goto out; |
3131 | error = -ENOTDIR; |
3132 | - if ((nd->flags & LOOKUP_DIRECTORY) && !d_is_directory(nd->path.dentry)) |
3133 | + if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) |
3134 | goto out; |
3135 | if (!S_ISREG(nd->inode->i_mode)) |
3136 | will_truncate = false; |
3137 | @@ -3746,7 +3745,7 @@ exit1: |
3138 | slashes: |
3139 | if (d_is_negative(dentry)) |
3140 | error = -ENOENT; |
3141 | - else if (d_is_directory(dentry) || d_is_autodir(dentry)) |
3142 | + else if (d_is_dir(dentry)) |
3143 | error = -EISDIR; |
3144 | else |
3145 | error = -ENOTDIR; |
3146 | @@ -4125,7 +4124,7 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
3147 | struct inode **delegated_inode) |
3148 | { |
3149 | int error; |
3150 | - int is_dir = d_is_directory(old_dentry) || d_is_autodir(old_dentry); |
3151 | + int is_dir = d_is_dir(old_dentry); |
3152 | const unsigned char *old_name; |
3153 | |
3154 | if (old_dentry->d_inode == new_dentry->d_inode) |
3155 | @@ -4218,7 +4217,7 @@ retry_deleg: |
3156 | if (d_is_negative(old_dentry)) |
3157 | goto exit4; |
3158 | /* unless the source is a directory trailing slashes give -ENOTDIR */ |
3159 | - if (!d_is_directory(old_dentry) && !d_is_autodir(old_dentry)) { |
3160 | + if (!d_is_dir(old_dentry)) { |
3161 | error = -ENOTDIR; |
3162 | if (oldnd.last.name[oldnd.last.len]) |
3163 | goto exit4; |
3164 | diff --git a/fs/namespace.c b/fs/namespace.c |
3165 | index 65233a5f390a..75536db4b69b 100644 |
3166 | --- a/fs/namespace.c |
3167 | +++ b/fs/namespace.c |
3168 | @@ -777,6 +777,20 @@ static void attach_mnt(struct mount *mnt, |
3169 | list_add_tail(&mnt->mnt_child, &parent->mnt_mounts); |
3170 | } |
3171 | |
3172 | +static void attach_shadowed(struct mount *mnt, |
3173 | + struct mount *parent, |
3174 | + struct mount *shadows) |
3175 | +{ |
3176 | + if (shadows) { |
3177 | + hlist_add_after_rcu(&shadows->mnt_hash, &mnt->mnt_hash); |
3178 | + list_add(&mnt->mnt_child, &shadows->mnt_child); |
3179 | + } else { |
3180 | + hlist_add_head_rcu(&mnt->mnt_hash, |
3181 | + m_hash(&parent->mnt, mnt->mnt_mountpoint)); |
3182 | + list_add_tail(&mnt->mnt_child, &parent->mnt_mounts); |
3183 | + } |
3184 | +} |
3185 | + |
3186 | /* |
3187 | * vfsmount lock must be held for write |
3188 | */ |
3189 | @@ -795,12 +809,7 @@ static void commit_tree(struct mount *mnt, struct mount *shadows) |
3190 | |
3191 | list_splice(&head, n->list.prev); |
3192 | |
3193 | - if (shadows) |
3194 | - hlist_add_after_rcu(&shadows->mnt_hash, &mnt->mnt_hash); |
3195 | - else |
3196 | - hlist_add_head_rcu(&mnt->mnt_hash, |
3197 | - m_hash(&parent->mnt, mnt->mnt_mountpoint)); |
3198 | - list_add_tail(&mnt->mnt_child, &parent->mnt_mounts); |
3199 | + attach_shadowed(mnt, parent, shadows); |
3200 | touch_mnt_namespace(n); |
3201 | } |
3202 | |
3203 | @@ -887,8 +896,21 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root, |
3204 | |
3205 | mnt->mnt.mnt_flags = old->mnt.mnt_flags & ~(MNT_WRITE_HOLD|MNT_MARKED); |
3206 | /* Don't allow unprivileged users to change mount flags */ |
3207 | - if ((flag & CL_UNPRIVILEGED) && (mnt->mnt.mnt_flags & MNT_READONLY)) |
3208 | - mnt->mnt.mnt_flags |= MNT_LOCK_READONLY; |
3209 | + if (flag & CL_UNPRIVILEGED) { |
3210 | + mnt->mnt.mnt_flags |= MNT_LOCK_ATIME; |
3211 | + |
3212 | + if (mnt->mnt.mnt_flags & MNT_READONLY) |
3213 | + mnt->mnt.mnt_flags |= MNT_LOCK_READONLY; |
3214 | + |
3215 | + if (mnt->mnt.mnt_flags & MNT_NODEV) |
3216 | + mnt->mnt.mnt_flags |= MNT_LOCK_NODEV; |
3217 | + |
3218 | + if (mnt->mnt.mnt_flags & MNT_NOSUID) |
3219 | + mnt->mnt.mnt_flags |= MNT_LOCK_NOSUID; |
3220 | + |
3221 | + if (mnt->mnt.mnt_flags & MNT_NOEXEC) |
3222 | + mnt->mnt.mnt_flags |= MNT_LOCK_NOEXEC; |
3223 | + } |
3224 | |
3225 | /* Don't allow unprivileged users to reveal what is under a mount */ |
3226 | if ((flag & CL_UNPRIVILEGED) && list_empty(&old->mnt_expire)) |
3227 | @@ -1204,6 +1226,11 @@ static void namespace_unlock(void) |
3228 | head.first->pprev = &head.first; |
3229 | INIT_HLIST_HEAD(&unmounted); |
3230 | |
3231 | + /* undo decrements we'd done in umount_tree() */ |
3232 | + hlist_for_each_entry(mnt, &head, mnt_hash) |
3233 | + if (mnt->mnt_ex_mountpoint.mnt) |
3234 | + mntget(mnt->mnt_ex_mountpoint.mnt); |
3235 | + |
3236 | up_write(&namespace_sem); |
3237 | |
3238 | synchronize_rcu(); |
3239 | @@ -1240,6 +1267,9 @@ void umount_tree(struct mount *mnt, int how) |
3240 | hlist_add_head(&p->mnt_hash, &tmp_list); |
3241 | } |
3242 | |
3243 | + hlist_for_each_entry(p, &tmp_list, mnt_hash) |
3244 | + list_del_init(&p->mnt_child); |
3245 | + |
3246 | if (how) |
3247 | propagate_umount(&tmp_list); |
3248 | |
3249 | @@ -1250,9 +1280,9 @@ void umount_tree(struct mount *mnt, int how) |
3250 | p->mnt_ns = NULL; |
3251 | if (how < 2) |
3252 | p->mnt.mnt_flags |= MNT_SYNC_UMOUNT; |
3253 | - list_del_init(&p->mnt_child); |
3254 | if (mnt_has_parent(p)) { |
3255 | put_mountpoint(p->mnt_mp); |
3256 | + mnt_add_count(p->mnt_parent, -1); |
3257 | /* move the reference to mountpoint into ->mnt_ex_mountpoint */ |
3258 | p->mnt_ex_mountpoint.dentry = p->mnt_mountpoint; |
3259 | p->mnt_ex_mountpoint.mnt = &p->mnt_parent->mnt; |
3260 | @@ -1483,6 +1513,7 @@ struct mount *copy_tree(struct mount *mnt, struct dentry *dentry, |
3261 | continue; |
3262 | |
3263 | for (s = r; s; s = next_mnt(s, r)) { |
3264 | + struct mount *t = NULL; |
3265 | if (!(flag & CL_COPY_UNBINDABLE) && |
3266 | IS_MNT_UNBINDABLE(s)) { |
3267 | s = skip_mnt_tree(s); |
3268 | @@ -1504,7 +1535,14 @@ struct mount *copy_tree(struct mount *mnt, struct dentry *dentry, |
3269 | goto out; |
3270 | lock_mount_hash(); |
3271 | list_add_tail(&q->mnt_list, &res->mnt_list); |
3272 | - attach_mnt(q, parent, p->mnt_mp); |
3273 | + mnt_set_mountpoint(parent, p->mnt_mp, q); |
3274 | + if (!list_empty(&parent->mnt_mounts)) { |
3275 | + t = list_last_entry(&parent->mnt_mounts, |
3276 | + struct mount, mnt_child); |
3277 | + if (t->mnt_mp != p->mnt_mp) |
3278 | + t = NULL; |
3279 | + } |
3280 | + attach_shadowed(q, parent, t); |
3281 | unlock_mount_hash(); |
3282 | } |
3283 | } |
3284 | @@ -1887,9 +1925,6 @@ static int change_mount_flags(struct vfsmount *mnt, int ms_flags) |
3285 | if (readonly_request == __mnt_is_readonly(mnt)) |
3286 | return 0; |
3287 | |
3288 | - if (mnt->mnt_flags & MNT_LOCK_READONLY) |
3289 | - return -EPERM; |
3290 | - |
3291 | if (readonly_request) |
3292 | error = mnt_make_readonly(real_mount(mnt)); |
3293 | else |
3294 | @@ -1915,6 +1950,33 @@ static int do_remount(struct path *path, int flags, int mnt_flags, |
3295 | if (path->dentry != path->mnt->mnt_root) |
3296 | return -EINVAL; |
3297 | |
3298 | + /* Don't allow changing of locked mnt flags. |
3299 | + * |
3300 | + * No locks need to be held here while testing the various |
3301 | + * MNT_LOCK flags because those flags can never be cleared |
3302 | + * once they are set. |
3303 | + */ |
3304 | + if ((mnt->mnt.mnt_flags & MNT_LOCK_READONLY) && |
3305 | + !(mnt_flags & MNT_READONLY)) { |
3306 | + return -EPERM; |
3307 | + } |
3308 | + if ((mnt->mnt.mnt_flags & MNT_LOCK_NODEV) && |
3309 | + !(mnt_flags & MNT_NODEV)) { |
3310 | + return -EPERM; |
3311 | + } |
3312 | + if ((mnt->mnt.mnt_flags & MNT_LOCK_NOSUID) && |
3313 | + !(mnt_flags & MNT_NOSUID)) { |
3314 | + return -EPERM; |
3315 | + } |
3316 | + if ((mnt->mnt.mnt_flags & MNT_LOCK_NOEXEC) && |
3317 | + !(mnt_flags & MNT_NOEXEC)) { |
3318 | + return -EPERM; |
3319 | + } |
3320 | + if ((mnt->mnt.mnt_flags & MNT_LOCK_ATIME) && |
3321 | + ((mnt->mnt.mnt_flags & MNT_ATIME_MASK) != (mnt_flags & MNT_ATIME_MASK))) { |
3322 | + return -EPERM; |
3323 | + } |
3324 | + |
3325 | err = security_sb_remount(sb, data); |
3326 | if (err) |
3327 | return err; |
3328 | @@ -1928,7 +1990,7 @@ static int do_remount(struct path *path, int flags, int mnt_flags, |
3329 | err = do_remount_sb(sb, flags, data, 0); |
3330 | if (!err) { |
3331 | lock_mount_hash(); |
3332 | - mnt_flags |= mnt->mnt.mnt_flags & MNT_PROPAGATION_MASK; |
3333 | + mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK; |
3334 | mnt->mnt.mnt_flags = mnt_flags; |
3335 | touch_mnt_namespace(mnt->mnt_ns); |
3336 | unlock_mount_hash(); |
3337 | @@ -2113,7 +2175,7 @@ static int do_new_mount(struct path *path, const char *fstype, int flags, |
3338 | */ |
3339 | if (!(type->fs_flags & FS_USERNS_DEV_MOUNT)) { |
3340 | flags |= MS_NODEV; |
3341 | - mnt_flags |= MNT_NODEV; |
3342 | + mnt_flags |= MNT_NODEV | MNT_LOCK_NODEV; |
3343 | } |
3344 | } |
3345 | |
3346 | @@ -2427,6 +2489,14 @@ long do_mount(const char *dev_name, const char *dir_name, |
3347 | if (flags & MS_RDONLY) |
3348 | mnt_flags |= MNT_READONLY; |
3349 | |
3350 | + /* The default atime for remount is preservation */ |
3351 | + if ((flags & MS_REMOUNT) && |
3352 | + ((flags & (MS_NOATIME | MS_NODIRATIME | MS_RELATIME | |
3353 | + MS_STRICTATIME)) == 0)) { |
3354 | + mnt_flags &= ~MNT_ATIME_MASK; |
3355 | + mnt_flags |= path.mnt->mnt_flags & MNT_ATIME_MASK; |
3356 | + } |
3357 | + |
3358 | flags &= ~(MS_NOSUID | MS_NOEXEC | MS_NODEV | MS_ACTIVE | MS_BORN | |
3359 | MS_NOATIME | MS_NODIRATIME | MS_RELATIME| MS_KERNMOUNT | |
3360 | MS_STRICTATIME); |
3361 | diff --git a/fs/pnode.c b/fs/pnode.c |
3362 | index a364a704333b..b7f831089500 100644 |
3363 | --- a/fs/pnode.c |
3364 | +++ b/fs/pnode.c |
3365 | @@ -381,6 +381,7 @@ static void __propagate_umount(struct mount *mnt) |
3366 | * other children |
3367 | */ |
3368 | if (child && list_empty(&child->mnt_mounts)) { |
3369 | + list_del_init(&child->mnt_child); |
3370 | hlist_del_init_rcu(&child->mnt_hash); |
3371 | hlist_add_before_rcu(&child->mnt_hash, &mnt->mnt_hash); |
3372 | } |
3373 | diff --git a/fs/proc/array.c b/fs/proc/array.c |
3374 | index 656e401794de..baf3464bbce0 100644 |
3375 | --- a/fs/proc/array.c |
3376 | +++ b/fs/proc/array.c |
3377 | @@ -297,15 +297,11 @@ static void render_cap_t(struct seq_file *m, const char *header, |
3378 | seq_puts(m, header); |
3379 | CAP_FOR_EACH_U32(__capi) { |
3380 | seq_printf(m, "%08x", |
3381 | - a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]); |
3382 | + a->cap[CAP_LAST_U32 - __capi]); |
3383 | } |
3384 | seq_putc(m, '\n'); |
3385 | } |
3386 | |
3387 | -/* Remove non-existent capabilities */ |
3388 | -#define NORM_CAPS(v) (v.cap[CAP_TO_INDEX(CAP_LAST_CAP)] &= \ |
3389 | - CAP_TO_MASK(CAP_LAST_CAP + 1) - 1) |
3390 | - |
3391 | static inline void task_cap(struct seq_file *m, struct task_struct *p) |
3392 | { |
3393 | const struct cred *cred; |
3394 | @@ -319,11 +315,6 @@ static inline void task_cap(struct seq_file *m, struct task_struct *p) |
3395 | cap_bset = cred->cap_bset; |
3396 | rcu_read_unlock(); |
3397 | |
3398 | - NORM_CAPS(cap_inheritable); |
3399 | - NORM_CAPS(cap_permitted); |
3400 | - NORM_CAPS(cap_effective); |
3401 | - NORM_CAPS(cap_bset); |
3402 | - |
3403 | render_cap_t(m, "CapInh:\t", &cap_inheritable); |
3404 | render_cap_t(m, "CapPrm:\t", &cap_permitted); |
3405 | render_cap_t(m, "CapEff:\t", &cap_effective); |
3406 | diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c |
3407 | index db2cfb067d0b..5d2518b24cea 100644 |
3408 | --- a/fs/xfs/xfs_aops.c |
3409 | +++ b/fs/xfs/xfs_aops.c |
3410 | @@ -1660,11 +1660,72 @@ xfs_vm_readpages( |
3411 | return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); |
3412 | } |
3413 | |
3414 | +/* |
3415 | + * This is basically a copy of __set_page_dirty_buffers() with one |
3416 | + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them |
3417 | + * dirty, we'll never be able to clean them because we don't write buffers |
3418 | + * beyond EOF, and that means we can't invalidate pages that span EOF |
3419 | + * that have been marked dirty. Further, the dirty state can leak into |
3420 | + * the file interior if the file is extended, resulting in all sorts of |
3421 | + * bad things happening as the state does not match the underlying data. |
3422 | + * |
3423 | + * XXX: this really indicates that bufferheads in XFS need to die. Warts like |
3424 | + * this only exist because of bufferheads and how the generic code manages them. |
3425 | + */ |
3426 | +STATIC int |
3427 | +xfs_vm_set_page_dirty( |
3428 | + struct page *page) |
3429 | +{ |
3430 | + struct address_space *mapping = page->mapping; |
3431 | + struct inode *inode = mapping->host; |
3432 | + loff_t end_offset; |
3433 | + loff_t offset; |
3434 | + int newly_dirty; |
3435 | + |
3436 | + if (unlikely(!mapping)) |
3437 | + return !TestSetPageDirty(page); |
3438 | + |
3439 | + end_offset = i_size_read(inode); |
3440 | + offset = page_offset(page); |
3441 | + |
3442 | + spin_lock(&mapping->private_lock); |
3443 | + if (page_has_buffers(page)) { |
3444 | + struct buffer_head *head = page_buffers(page); |
3445 | + struct buffer_head *bh = head; |
3446 | + |
3447 | + do { |
3448 | + if (offset < end_offset) |
3449 | + set_buffer_dirty(bh); |
3450 | + bh = bh->b_this_page; |
3451 | + offset += 1 << inode->i_blkbits; |
3452 | + } while (bh != head); |
3453 | + } |
3454 | + newly_dirty = !TestSetPageDirty(page); |
3455 | + spin_unlock(&mapping->private_lock); |
3456 | + |
3457 | + if (newly_dirty) { |
3458 | + /* sigh - __set_page_dirty() is static, so copy it here, too */ |
3459 | + unsigned long flags; |
3460 | + |
3461 | + spin_lock_irqsave(&mapping->tree_lock, flags); |
3462 | + if (page->mapping) { /* Race with truncate? */ |
3463 | + WARN_ON_ONCE(!PageUptodate(page)); |
3464 | + account_page_dirtied(page, mapping); |
3465 | + radix_tree_tag_set(&mapping->page_tree, |
3466 | + page_index(page), PAGECACHE_TAG_DIRTY); |
3467 | + } |
3468 | + spin_unlock_irqrestore(&mapping->tree_lock, flags); |
3469 | + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); |
3470 | + } |
3471 | + return newly_dirty; |
3472 | +} |
3473 | + |
3474 | const struct address_space_operations xfs_address_space_operations = { |
3475 | .readpage = xfs_vm_readpage, |
3476 | .readpages = xfs_vm_readpages, |
3477 | .writepage = xfs_vm_writepage, |
3478 | .writepages = xfs_vm_writepages, |
3479 | + .set_page_dirty = xfs_vm_set_page_dirty, |
3480 | .releasepage = xfs_vm_releasepage, |
3481 | .invalidatepage = xfs_vm_invalidatepage, |
3482 | .write_begin = xfs_vm_write_begin, |
3483 | diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c |
3484 | index 7aeb4c895b32..95f94483c3d7 100644 |
3485 | --- a/fs/xfs/xfs_dquot.c |
3486 | +++ b/fs/xfs/xfs_dquot.c |
3487 | @@ -1011,7 +1011,8 @@ xfs_qm_dqflush( |
3488 | * Get the buffer containing the on-disk dquot |
3489 | */ |
3490 | error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, dqp->q_blkno, |
3491 | - mp->m_quotainfo->qi_dqchunklen, 0, &bp, NULL); |
3492 | + mp->m_quotainfo->qi_dqchunklen, 0, &bp, |
3493 | + &xfs_dquot_buf_ops); |
3494 | if (error) |
3495 | goto out_unlock; |
3496 | |
3497 | diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c |
3498 | index 64b48eade91d..f50def6018a9 100644 |
3499 | --- a/fs/xfs/xfs_file.c |
3500 | +++ b/fs/xfs/xfs_file.c |
3501 | @@ -302,7 +302,16 @@ xfs_file_aio_read( |
3502 | xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); |
3503 | return ret; |
3504 | } |
3505 | - truncate_pagecache_range(VFS_I(ip), pos, -1); |
3506 | + |
3507 | + /* |
3508 | + * Invalidate whole pages. This can return an error if |
3509 | + * we fail to invalidate a page, but this should never |
3510 | + * happen on XFS. Warn if it does fail. |
3511 | + */ |
3512 | + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, |
3513 | + pos >> PAGE_CACHE_SHIFT, -1); |
3514 | + WARN_ON_ONCE(ret); |
3515 | + ret = 0; |
3516 | } |
3517 | xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); |
3518 | } |
3519 | @@ -683,7 +692,15 @@ xfs_file_dio_aio_write( |
3520 | pos, -1); |
3521 | if (ret) |
3522 | goto out; |
3523 | - truncate_pagecache_range(VFS_I(ip), pos, -1); |
3524 | + /* |
3525 | + * Invalidate whole pages. This can return an error if |
3526 | + * we fail to invalidate a page, but this should never |
3527 | + * happen on XFS. Warn if it does fail. |
3528 | + */ |
3529 | + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, |
3530 | + pos >> PAGE_CACHE_SHIFT, -1); |
3531 | + WARN_ON_ONCE(ret); |
3532 | + ret = 0; |
3533 | } |
3534 | |
3535 | /* |
3536 | diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c |
3537 | index bce53ac81096..eb26418814fe 100644 |
3538 | --- a/fs/xfs/xfs_log_recover.c |
3539 | +++ b/fs/xfs/xfs_log_recover.c |
3540 | @@ -2125,6 +2125,17 @@ xlog_recover_validate_buf_type( |
3541 | __uint16_t magic16; |
3542 | __uint16_t magicda; |
3543 | |
3544 | + /* |
3545 | + * We can only do post recovery validation on items on CRC enabled |
3546 | + * fielsystems as we need to know when the buffer was written to be able |
3547 | + * to determine if we should have replayed the item. If we replay old |
3548 | + * metadata over a newer buffer, then it will enter a temporarily |
3549 | + * inconsistent state resulting in verification failures. Hence for now |
3550 | + * just avoid the verification stage for non-crc filesystems |
3551 | + */ |
3552 | + if (!xfs_sb_version_hascrc(&mp->m_sb)) |
3553 | + return; |
3554 | + |
3555 | magic32 = be32_to_cpu(*(__be32 *)bp->b_addr); |
3556 | magic16 = be16_to_cpu(*(__be16*)bp->b_addr); |
3557 | magicda = be16_to_cpu(info->magic); |
3558 | @@ -2160,8 +2171,6 @@ xlog_recover_validate_buf_type( |
3559 | bp->b_ops = &xfs_agf_buf_ops; |
3560 | break; |
3561 | case XFS_BLFT_AGFL_BUF: |
3562 | - if (!xfs_sb_version_hascrc(&mp->m_sb)) |
3563 | - break; |
3564 | if (magic32 != XFS_AGFL_MAGIC) { |
3565 | xfs_warn(mp, "Bad AGFL block magic!"); |
3566 | ASSERT(0); |
3567 | @@ -2194,10 +2203,6 @@ xlog_recover_validate_buf_type( |
3568 | #endif |
3569 | break; |
3570 | case XFS_BLFT_DINO_BUF: |
3571 | - /* |
3572 | - * we get here with inode allocation buffers, not buffers that |
3573 | - * track unlinked list changes. |
3574 | - */ |
3575 | if (magic16 != XFS_DINODE_MAGIC) { |
3576 | xfs_warn(mp, "Bad INODE block magic!"); |
3577 | ASSERT(0); |
3578 | @@ -2277,8 +2282,6 @@ xlog_recover_validate_buf_type( |
3579 | bp->b_ops = &xfs_attr3_leaf_buf_ops; |
3580 | break; |
3581 | case XFS_BLFT_ATTR_RMT_BUF: |
3582 | - if (!xfs_sb_version_hascrc(&mp->m_sb)) |
3583 | - break; |
3584 | if (magic32 != XFS_ATTR3_RMT_MAGIC) { |
3585 | xfs_warn(mp, "Bad attr remote magic!"); |
3586 | ASSERT(0); |
3587 | @@ -2385,16 +2388,7 @@ xlog_recover_do_reg_buffer( |
3588 | /* Shouldn't be any more regions */ |
3589 | ASSERT(i == item->ri_total); |
3590 | |
3591 | - /* |
3592 | - * We can only do post recovery validation on items on CRC enabled |
3593 | - * fielsystems as we need to know when the buffer was written to be able |
3594 | - * to determine if we should have replayed the item. If we replay old |
3595 | - * metadata over a newer buffer, then it will enter a temporarily |
3596 | - * inconsistent state resulting in verification failures. Hence for now |
3597 | - * just avoid the verification stage for non-crc filesystems |
3598 | - */ |
3599 | - if (xfs_sb_version_hascrc(&mp->m_sb)) |
3600 | - xlog_recover_validate_buf_type(mp, bp, buf_f); |
3601 | + xlog_recover_validate_buf_type(mp, bp, buf_f); |
3602 | } |
3603 | |
3604 | /* |
3605 | @@ -2502,12 +2496,29 @@ xlog_recover_buffer_pass2( |
3606 | } |
3607 | |
3608 | /* |
3609 | - * recover the buffer only if we get an LSN from it and it's less than |
3610 | + * Recover the buffer only if we get an LSN from it and it's less than |
3611 | * the lsn of the transaction we are replaying. |
3612 | + * |
3613 | + * Note that we have to be extremely careful of readahead here. |
3614 | + * Readahead does not attach verfiers to the buffers so if we don't |
3615 | + * actually do any replay after readahead because of the LSN we found |
3616 | + * in the buffer if more recent than that current transaction then we |
3617 | + * need to attach the verifier directly. Failure to do so can lead to |
3618 | + * future recovery actions (e.g. EFI and unlinked list recovery) can |
3619 | + * operate on the buffers and they won't get the verifier attached. This |
3620 | + * can lead to blocks on disk having the correct content but a stale |
3621 | + * CRC. |
3622 | + * |
3623 | + * It is safe to assume these clean buffers are currently up to date. |
3624 | + * If the buffer is dirtied by a later transaction being replayed, then |
3625 | + * the verifier will be reset to match whatever recover turns that |
3626 | + * buffer into. |
3627 | */ |
3628 | lsn = xlog_recover_get_buf_lsn(mp, bp); |
3629 | - if (lsn && lsn != -1 && XFS_LSN_CMP(lsn, current_lsn) >= 0) |
3630 | + if (lsn && lsn != -1 && XFS_LSN_CMP(lsn, current_lsn) >= 0) { |
3631 | + xlog_recover_validate_buf_type(mp, bp, buf_f); |
3632 | goto out_release; |
3633 | + } |
3634 | |
3635 | if (buf_f->blf_flags & XFS_BLF_INODE_BUF) { |
3636 | error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); |
3637 | diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c |
3638 | index 348e4d2ed6e6..6d7d1de13403 100644 |
3639 | --- a/fs/xfs/xfs_qm.c |
3640 | +++ b/fs/xfs/xfs_qm.c |
3641 | @@ -1176,6 +1176,12 @@ xfs_qm_dqiter_bufs( |
3642 | if (error) |
3643 | break; |
3644 | |
3645 | + /* |
3646 | + * A corrupt buffer might not have a verifier attached, so |
3647 | + * make sure we have the correct one attached before writeback |
3648 | + * occurs. |
3649 | + */ |
3650 | + bp->b_ops = &xfs_dquot_buf_ops; |
3651 | xfs_qm_reset_dqcounts(mp, bp, firstid, type); |
3652 | xfs_buf_delwri_queue(bp, buffer_list); |
3653 | xfs_buf_relse(bp); |
3654 | @@ -1261,7 +1267,7 @@ xfs_qm_dqiterate( |
3655 | xfs_buf_readahead(mp->m_ddev_targp, |
3656 | XFS_FSB_TO_DADDR(mp, rablkno), |
3657 | mp->m_quotainfo->qi_dqchunklen, |
3658 | - NULL); |
3659 | + &xfs_dquot_buf_ops); |
3660 | rablkno++; |
3661 | } |
3662 | } |
3663 | diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h |
3664 | index 8256eb4ad057..e9c4f190ffae 100644 |
3665 | --- a/include/acpi/acpi_bus.h |
3666 | +++ b/include/acpi/acpi_bus.h |
3667 | @@ -228,7 +228,6 @@ struct acpi_device_pnp { |
3668 | acpi_device_name device_name; /* Driver-determined */ |
3669 | acpi_device_class device_class; /* " */ |
3670 | union acpi_object *str_obj; /* unicode string for _STR method */ |
3671 | - unsigned long sun; /* _SUN */ |
3672 | }; |
3673 | |
3674 | #define acpi_device_bid(d) ((d)->pnp.bus_id) |
3675 | diff --git a/include/linux/capability.h b/include/linux/capability.h |
3676 | index 84b13ad67c1c..aa93e5ef594c 100644 |
3677 | --- a/include/linux/capability.h |
3678 | +++ b/include/linux/capability.h |
3679 | @@ -78,8 +78,11 @@ extern const kernel_cap_t __cap_init_eff_set; |
3680 | # error Fix up hand-coded capability macro initializers |
3681 | #else /* HAND-CODED capability initializers */ |
3682 | |
3683 | +#define CAP_LAST_U32 ((_KERNEL_CAPABILITY_U32S) - 1) |
3684 | +#define CAP_LAST_U32_VALID_MASK (CAP_TO_MASK(CAP_LAST_CAP + 1) -1) |
3685 | + |
3686 | # define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }}) |
3687 | -# define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }}) |
3688 | +# define CAP_FULL_SET ((kernel_cap_t){{ ~0, CAP_LAST_U32_VALID_MASK }}) |
3689 | # define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \ |
3690 | | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \ |
3691 | CAP_FS_MASK_B1 } }) |
3692 | diff --git a/include/linux/dcache.h b/include/linux/dcache.h |
3693 | index bf72e9ac6de0..3b50cac7ccb3 100644 |
3694 | --- a/include/linux/dcache.h |
3695 | +++ b/include/linux/dcache.h |
3696 | @@ -429,7 +429,7 @@ static inline unsigned __d_entry_type(const struct dentry *dentry) |
3697 | return dentry->d_flags & DCACHE_ENTRY_TYPE; |
3698 | } |
3699 | |
3700 | -static inline bool d_is_directory(const struct dentry *dentry) |
3701 | +static inline bool d_can_lookup(const struct dentry *dentry) |
3702 | { |
3703 | return __d_entry_type(dentry) == DCACHE_DIRECTORY_TYPE; |
3704 | } |
3705 | @@ -439,6 +439,11 @@ static inline bool d_is_autodir(const struct dentry *dentry) |
3706 | return __d_entry_type(dentry) == DCACHE_AUTODIR_TYPE; |
3707 | } |
3708 | |
3709 | +static inline bool d_is_dir(const struct dentry *dentry) |
3710 | +{ |
3711 | + return d_can_lookup(dentry) || d_is_autodir(dentry); |
3712 | +} |
3713 | + |
3714 | static inline bool d_is_symlink(const struct dentry *dentry) |
3715 | { |
3716 | return __d_entry_type(dentry) == DCACHE_SYMLINK_TYPE; |
3717 | diff --git a/include/linux/mount.h b/include/linux/mount.h |
3718 | index 839bac270904..b0c1e6574e7f 100644 |
3719 | --- a/include/linux/mount.h |
3720 | +++ b/include/linux/mount.h |
3721 | @@ -42,13 +42,20 @@ struct mnt_namespace; |
3722 | * flag, consider how it interacts with shared mounts. |
3723 | */ |
3724 | #define MNT_SHARED_MASK (MNT_UNBINDABLE) |
3725 | -#define MNT_PROPAGATION_MASK (MNT_SHARED | MNT_UNBINDABLE) |
3726 | +#define MNT_USER_SETTABLE_MASK (MNT_NOSUID | MNT_NODEV | MNT_NOEXEC \ |
3727 | + | MNT_NOATIME | MNT_NODIRATIME | MNT_RELATIME \ |
3728 | + | MNT_READONLY) |
3729 | +#define MNT_ATIME_MASK (MNT_NOATIME | MNT_NODIRATIME | MNT_RELATIME ) |
3730 | |
3731 | #define MNT_INTERNAL_FLAGS (MNT_SHARED | MNT_WRITE_HOLD | MNT_INTERNAL | \ |
3732 | MNT_DOOMED | MNT_SYNC_UMOUNT | MNT_MARKED) |
3733 | |
3734 | #define MNT_INTERNAL 0x4000 |
3735 | |
3736 | +#define MNT_LOCK_ATIME 0x040000 |
3737 | +#define MNT_LOCK_NOEXEC 0x080000 |
3738 | +#define MNT_LOCK_NOSUID 0x100000 |
3739 | +#define MNT_LOCK_NODEV 0x200000 |
3740 | #define MNT_LOCK_READONLY 0x400000 |
3741 | #define MNT_LOCKED 0x800000 |
3742 | #define MNT_DOOMED 0x1000000 |
3743 | diff --git a/include/linux/tpm.h b/include/linux/tpm.h |
3744 | index fff1d0976f80..8350c538b486 100644 |
3745 | --- a/include/linux/tpm.h |
3746 | +++ b/include/linux/tpm.h |
3747 | @@ -39,6 +39,9 @@ struct tpm_class_ops { |
3748 | int (*send) (struct tpm_chip *chip, u8 *buf, size_t len); |
3749 | void (*cancel) (struct tpm_chip *chip); |
3750 | u8 (*status) (struct tpm_chip *chip); |
3751 | + bool (*update_timeouts)(struct tpm_chip *chip, |
3752 | + unsigned long *timeout_cap); |
3753 | + |
3754 | }; |
3755 | |
3756 | #if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE) |
3757 | diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h |
3758 | index b4f1effc9216..409fafb63f63 100644 |
3759 | --- a/include/scsi/scsi_device.h |
3760 | +++ b/include/scsi/scsi_device.h |
3761 | @@ -149,6 +149,7 @@ struct scsi_device { |
3762 | unsigned skip_ms_page_8:1; /* do not use MODE SENSE page 0x08 */ |
3763 | unsigned skip_ms_page_3f:1; /* do not use MODE SENSE page 0x3f */ |
3764 | unsigned skip_vpd_pages:1; /* do not read VPD pages */ |
3765 | + unsigned try_vpd_pages:1; /* attempt to read VPD pages */ |
3766 | unsigned use_192_bytes_for_3f:1; /* ask for 192 bytes from page 0x3f */ |
3767 | unsigned no_start_on_add:1; /* do not issue start on add */ |
3768 | unsigned allow_restart:1; /* issue START_UNIT in error handler */ |
3769 | diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h |
3770 | index 447d2d7466fc..183eaab7c380 100644 |
3771 | --- a/include/scsi/scsi_devinfo.h |
3772 | +++ b/include/scsi/scsi_devinfo.h |
3773 | @@ -32,4 +32,9 @@ |
3774 | #define BLIST_ATTACH_PQ3 0x1000000 /* Scan: Attach to PQ3 devices */ |
3775 | #define BLIST_NO_DIF 0x2000000 /* Disable T10 PI (DIF) */ |
3776 | #define BLIST_SKIP_VPD_PAGES 0x4000000 /* Ignore SBC-3 VPD pages */ |
3777 | +#define BLIST_SCSI3LUN 0x8000000 /* Scan more than 256 LUNs |
3778 | + for sequential scan */ |
3779 | +#define BLIST_TRY_VPD_PAGES 0x10000000 /* Attempt to read VPD pages */ |
3780 | +#define BLIST_NO_RSOC 0x20000000 /* don't try to issue RSOC */ |
3781 | + |
3782 | #endif |
3783 | diff --git a/include/uapi/rdma/rdma_user_cm.h b/include/uapi/rdma/rdma_user_cm.h |
3784 | index 99b80abf360a..3066718eb120 100644 |
3785 | --- a/include/uapi/rdma/rdma_user_cm.h |
3786 | +++ b/include/uapi/rdma/rdma_user_cm.h |
3787 | @@ -34,6 +34,7 @@ |
3788 | #define RDMA_USER_CM_H |
3789 | |
3790 | #include <linux/types.h> |
3791 | +#include <linux/socket.h> |
3792 | #include <linux/in6.h> |
3793 | #include <rdma/ib_user_verbs.h> |
3794 | #include <rdma/ib_user_sa.h> |
3795 | diff --git a/kernel/audit.c b/kernel/audit.c |
3796 | index 0c9dc860cc15..2c0ecd1753de 100644 |
3797 | --- a/kernel/audit.c |
3798 | +++ b/kernel/audit.c |
3799 | @@ -1628,7 +1628,7 @@ void audit_log_cap(struct audit_buffer *ab, char *prefix, kernel_cap_t *cap) |
3800 | audit_log_format(ab, " %s=", prefix); |
3801 | CAP_FOR_EACH_U32(i) { |
3802 | audit_log_format(ab, "%08x", |
3803 | - cap->cap[(_KERNEL_CAPABILITY_U32S-1) - i]); |
3804 | + cap->cap[CAP_LAST_U32 - i]); |
3805 | } |
3806 | } |
3807 | |
3808 | diff --git a/kernel/capability.c b/kernel/capability.c |
3809 | index 1191a44786df..00adb2193d01 100644 |
3810 | --- a/kernel/capability.c |
3811 | +++ b/kernel/capability.c |
3812 | @@ -268,6 +268,10 @@ SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data) |
3813 | i++; |
3814 | } |
3815 | |
3816 | + effective.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; |
3817 | + permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; |
3818 | + inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; |
3819 | + |
3820 | new = prepare_creds(); |
3821 | if (!new) |
3822 | return -ENOMEM; |
3823 | diff --git a/kernel/smp.c b/kernel/smp.c |
3824 | index ffee35bef179..ff87d4479558 100644 |
3825 | --- a/kernel/smp.c |
3826 | +++ b/kernel/smp.c |
3827 | @@ -617,7 +617,7 @@ void on_each_cpu_cond(bool (*cond_func)(int cpu, void *info), |
3828 | if (cond_func(cpu, info)) { |
3829 | ret = smp_call_function_single(cpu, func, |
3830 | info, wait); |
3831 | - WARN_ON_ONCE(!ret); |
3832 | + WARN_ON_ONCE(ret); |
3833 | } |
3834 | preempt_enable(); |
3835 | } |
3836 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
3837 | index 0954450df7dc..a53f1bbc546b 100644 |
3838 | --- a/kernel/trace/ring_buffer.c |
3839 | +++ b/kernel/trace/ring_buffer.c |
3840 | @@ -1981,7 +1981,7 @@ rb_add_time_stamp(struct ring_buffer_event *event, u64 delta) |
3841 | |
3842 | /** |
3843 | * rb_update_event - update event type and data |
3844 | - * @event: the even to update |
3845 | + * @event: the event to update |
3846 | * @type: the type of event |
3847 | * @length: the size of the event field in the ring buffer |
3848 | * |
3849 | @@ -3354,21 +3354,16 @@ static void rb_iter_reset(struct ring_buffer_iter *iter) |
3850 | struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; |
3851 | |
3852 | /* Iterator usage is expected to have record disabled */ |
3853 | - if (list_empty(&cpu_buffer->reader_page->list)) { |
3854 | - iter->head_page = rb_set_head_page(cpu_buffer); |
3855 | - if (unlikely(!iter->head_page)) |
3856 | - return; |
3857 | - iter->head = iter->head_page->read; |
3858 | - } else { |
3859 | - iter->head_page = cpu_buffer->reader_page; |
3860 | - iter->head = cpu_buffer->reader_page->read; |
3861 | - } |
3862 | + iter->head_page = cpu_buffer->reader_page; |
3863 | + iter->head = cpu_buffer->reader_page->read; |
3864 | + |
3865 | + iter->cache_reader_page = iter->head_page; |
3866 | + iter->cache_read = iter->head; |
3867 | + |
3868 | if (iter->head) |
3869 | iter->read_stamp = cpu_buffer->read_stamp; |
3870 | else |
3871 | iter->read_stamp = iter->head_page->page->time_stamp; |
3872 | - iter->cache_reader_page = cpu_buffer->reader_page; |
3873 | - iter->cache_read = cpu_buffer->read; |
3874 | } |
3875 | |
3876 | /** |
3877 | @@ -3761,12 +3756,14 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts) |
3878 | return NULL; |
3879 | |
3880 | /* |
3881 | - * We repeat when a time extend is encountered. |
3882 | - * Since the time extend is always attached to a data event, |
3883 | - * we should never loop more than once. |
3884 | - * (We never hit the following condition more than twice). |
3885 | + * We repeat when a time extend is encountered or we hit |
3886 | + * the end of the page. Since the time extend is always attached |
3887 | + * to a data event, we should never loop more than three times. |
3888 | + * Once for going to next page, once on time extend, and |
3889 | + * finally once to get the event. |
3890 | + * (We never hit the following condition more than thrice). |
3891 | */ |
3892 | - if (RB_WARN_ON(cpu_buffer, ++nr_loops > 2)) |
3893 | + if (RB_WARN_ON(cpu_buffer, ++nr_loops > 3)) |
3894 | return NULL; |
3895 | |
3896 | if (rb_per_cpu_empty(cpu_buffer)) |
3897 | diff --git a/lib/assoc_array.c b/lib/assoc_array.c |
3898 | index c0b1007011e1..2404d03e251a 100644 |
3899 | --- a/lib/assoc_array.c |
3900 | +++ b/lib/assoc_array.c |
3901 | @@ -1723,11 +1723,13 @@ ascend_old_tree: |
3902 | shortcut = assoc_array_ptr_to_shortcut(ptr); |
3903 | slot = shortcut->parent_slot; |
3904 | cursor = shortcut->back_pointer; |
3905 | + if (!cursor) |
3906 | + goto gc_complete; |
3907 | } else { |
3908 | slot = node->parent_slot; |
3909 | cursor = ptr; |
3910 | } |
3911 | - BUG_ON(!ptr); |
3912 | + BUG_ON(!cursor); |
3913 | node = assoc_array_ptr_to_node(cursor); |
3914 | slot++; |
3915 | goto continue_node; |
3916 | @@ -1735,7 +1737,7 @@ ascend_old_tree: |
3917 | gc_complete: |
3918 | edit->set[0].to = new_root; |
3919 | assoc_array_apply_edit(edit); |
3920 | - edit->array->nr_leaves_on_tree = nr_leaves_on_tree; |
3921 | + array->nr_leaves_on_tree = nr_leaves_on_tree; |
3922 | return 0; |
3923 | |
3924 | enomem: |
3925 | diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c |
3926 | index 27ae84154586..06a7a769737f 100644 |
3927 | --- a/net/bluetooth/l2cap_sock.c |
3928 | +++ b/net/bluetooth/l2cap_sock.c |
3929 | @@ -1112,7 +1112,8 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) |
3930 | l2cap_chan_close(chan, 0); |
3931 | lock_sock(sk); |
3932 | |
3933 | - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) |
3934 | + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && |
3935 | + !(current->flags & PF_EXITING)) |
3936 | err = bt_sock_wait_state(sk, BT_CLOSED, |
3937 | sk->sk_lingertime); |
3938 | } |
3939 | diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c |
3940 | index facd8a79c038..b08865111024 100644 |
3941 | --- a/net/bluetooth/rfcomm/core.c |
3942 | +++ b/net/bluetooth/rfcomm/core.c |
3943 | @@ -1859,10 +1859,13 @@ static struct rfcomm_session *rfcomm_process_rx(struct rfcomm_session *s) |
3944 | /* Get data directly from socket receive queue without copying it. */ |
3945 | while ((skb = skb_dequeue(&sk->sk_receive_queue))) { |
3946 | skb_orphan(skb); |
3947 | - if (!skb_linearize(skb)) |
3948 | + if (!skb_linearize(skb)) { |
3949 | s = rfcomm_recv_frame(s, skb); |
3950 | - else |
3951 | + if (!s) |
3952 | + break; |
3953 | + } else { |
3954 | kfree_skb(skb); |
3955 | + } |
3956 | } |
3957 | |
3958 | if (s && (sk->sk_state == BT_CLOSED)) |
3959 | diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c |
3960 | index 3c2d3e4aa2f5..a0050de6f1f1 100644 |
3961 | --- a/net/bluetooth/rfcomm/sock.c |
3962 | +++ b/net/bluetooth/rfcomm/sock.c |
3963 | @@ -898,7 +898,8 @@ static int rfcomm_sock_shutdown(struct socket *sock, int how) |
3964 | sk->sk_shutdown = SHUTDOWN_MASK; |
3965 | __rfcomm_sock_close(sk); |
3966 | |
3967 | - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) |
3968 | + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && |
3969 | + !(current->flags & PF_EXITING)) |
3970 | err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); |
3971 | } |
3972 | release_sock(sk); |
3973 | diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c |
3974 | index 24fa3964b3c8..316dd4e0af39 100644 |
3975 | --- a/net/bluetooth/sco.c |
3976 | +++ b/net/bluetooth/sco.c |
3977 | @@ -909,7 +909,8 @@ static int sco_sock_shutdown(struct socket *sock, int how) |
3978 | sco_sock_clear_timer(sk); |
3979 | __sco_sock_close(sk); |
3980 | |
3981 | - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) |
3982 | + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && |
3983 | + !(current->flags & PF_EXITING)) |
3984 | err = bt_sock_wait_state(sk, BT_CLOSED, |
3985 | sk->sk_lingertime); |
3986 | } |
3987 | @@ -929,7 +930,8 @@ static int sco_sock_release(struct socket *sock) |
3988 | |
3989 | sco_sock_close(sk); |
3990 | |
3991 | - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) { |
3992 | + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && |
3993 | + !(current->flags & PF_EXITING)) { |
3994 | lock_sock(sk); |
3995 | err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime); |
3996 | release_sock(sk); |
3997 | diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c |
3998 | index 96238ba95f2b..de6662b14e1f 100644 |
3999 | --- a/net/ceph/auth_x.c |
4000 | +++ b/net/ceph/auth_x.c |
4001 | @@ -13,8 +13,6 @@ |
4002 | #include "auth_x.h" |
4003 | #include "auth_x_protocol.h" |
4004 | |
4005 | -#define TEMP_TICKET_BUF_LEN 256 |
4006 | - |
4007 | static void ceph_x_validate_tickets(struct ceph_auth_client *ac, int *pneed); |
4008 | |
4009 | static int ceph_x_is_authenticated(struct ceph_auth_client *ac) |
4010 | @@ -64,7 +62,7 @@ static int ceph_x_encrypt(struct ceph_crypto_key *secret, |
4011 | } |
4012 | |
4013 | static int ceph_x_decrypt(struct ceph_crypto_key *secret, |
4014 | - void **p, void *end, void *obuf, size_t olen) |
4015 | + void **p, void *end, void **obuf, size_t olen) |
4016 | { |
4017 | struct ceph_x_encrypt_header head; |
4018 | size_t head_len = sizeof(head); |
4019 | @@ -75,8 +73,14 @@ static int ceph_x_decrypt(struct ceph_crypto_key *secret, |
4020 | return -EINVAL; |
4021 | |
4022 | dout("ceph_x_decrypt len %d\n", len); |
4023 | - ret = ceph_decrypt2(secret, &head, &head_len, obuf, &olen, |
4024 | - *p, len); |
4025 | + if (*obuf == NULL) { |
4026 | + *obuf = kmalloc(len, GFP_NOFS); |
4027 | + if (!*obuf) |
4028 | + return -ENOMEM; |
4029 | + olen = len; |
4030 | + } |
4031 | + |
4032 | + ret = ceph_decrypt2(secret, &head, &head_len, *obuf, &olen, *p, len); |
4033 | if (ret) |
4034 | return ret; |
4035 | if (head.struct_v != 1 || le64_to_cpu(head.magic) != CEPHX_ENC_MAGIC) |
4036 | @@ -129,139 +133,120 @@ static void remove_ticket_handler(struct ceph_auth_client *ac, |
4037 | kfree(th); |
4038 | } |
4039 | |
4040 | -static int ceph_x_proc_ticket_reply(struct ceph_auth_client *ac, |
4041 | - struct ceph_crypto_key *secret, |
4042 | - void *buf, void *end) |
4043 | +static int process_one_ticket(struct ceph_auth_client *ac, |
4044 | + struct ceph_crypto_key *secret, |
4045 | + void **p, void *end) |
4046 | { |
4047 | struct ceph_x_info *xi = ac->private; |
4048 | - int num; |
4049 | - void *p = buf; |
4050 | + int type; |
4051 | + u8 tkt_struct_v, blob_struct_v; |
4052 | + struct ceph_x_ticket_handler *th; |
4053 | + void *dbuf = NULL; |
4054 | + void *dp, *dend; |
4055 | + int dlen; |
4056 | + char is_enc; |
4057 | + struct timespec validity; |
4058 | + struct ceph_crypto_key old_key; |
4059 | + void *ticket_buf = NULL; |
4060 | + void *tp, *tpend; |
4061 | + struct ceph_timespec new_validity; |
4062 | + struct ceph_crypto_key new_session_key; |
4063 | + struct ceph_buffer *new_ticket_blob; |
4064 | + unsigned long new_expires, new_renew_after; |
4065 | + u64 new_secret_id; |
4066 | int ret; |
4067 | - char *dbuf; |
4068 | - char *ticket_buf; |
4069 | - u8 reply_struct_v; |
4070 | |
4071 | - dbuf = kmalloc(TEMP_TICKET_BUF_LEN, GFP_NOFS); |
4072 | - if (!dbuf) |
4073 | - return -ENOMEM; |
4074 | + ceph_decode_need(p, end, sizeof(u32) + 1, bad); |
4075 | |
4076 | - ret = -ENOMEM; |
4077 | - ticket_buf = kmalloc(TEMP_TICKET_BUF_LEN, GFP_NOFS); |
4078 | - if (!ticket_buf) |
4079 | - goto out_dbuf; |
4080 | + type = ceph_decode_32(p); |
4081 | + dout(" ticket type %d %s\n", type, ceph_entity_type_name(type)); |
4082 | |
4083 | - ceph_decode_need(&p, end, 1 + sizeof(u32), bad); |
4084 | - reply_struct_v = ceph_decode_8(&p); |
4085 | - if (reply_struct_v != 1) |
4086 | + tkt_struct_v = ceph_decode_8(p); |
4087 | + if (tkt_struct_v != 1) |
4088 | goto bad; |
4089 | - num = ceph_decode_32(&p); |
4090 | - dout("%d tickets\n", num); |
4091 | - while (num--) { |
4092 | - int type; |
4093 | - u8 tkt_struct_v, blob_struct_v; |
4094 | - struct ceph_x_ticket_handler *th; |
4095 | - void *dp, *dend; |
4096 | - int dlen; |
4097 | - char is_enc; |
4098 | - struct timespec validity; |
4099 | - struct ceph_crypto_key old_key; |
4100 | - void *tp, *tpend; |
4101 | - struct ceph_timespec new_validity; |
4102 | - struct ceph_crypto_key new_session_key; |
4103 | - struct ceph_buffer *new_ticket_blob; |
4104 | - unsigned long new_expires, new_renew_after; |
4105 | - u64 new_secret_id; |
4106 | - |
4107 | - ceph_decode_need(&p, end, sizeof(u32) + 1, bad); |
4108 | - |
4109 | - type = ceph_decode_32(&p); |
4110 | - dout(" ticket type %d %s\n", type, ceph_entity_type_name(type)); |
4111 | - |
4112 | - tkt_struct_v = ceph_decode_8(&p); |
4113 | - if (tkt_struct_v != 1) |
4114 | - goto bad; |
4115 | - |
4116 | - th = get_ticket_handler(ac, type); |
4117 | - if (IS_ERR(th)) { |
4118 | - ret = PTR_ERR(th); |
4119 | - goto out; |
4120 | - } |
4121 | |
4122 | - /* blob for me */ |
4123 | - dlen = ceph_x_decrypt(secret, &p, end, dbuf, |
4124 | - TEMP_TICKET_BUF_LEN); |
4125 | - if (dlen <= 0) { |
4126 | - ret = dlen; |
4127 | - goto out; |
4128 | - } |
4129 | - dout(" decrypted %d bytes\n", dlen); |
4130 | - dend = dbuf + dlen; |
4131 | - dp = dbuf; |
4132 | + th = get_ticket_handler(ac, type); |
4133 | + if (IS_ERR(th)) { |
4134 | + ret = PTR_ERR(th); |
4135 | + goto out; |
4136 | + } |
4137 | |
4138 | - tkt_struct_v = ceph_decode_8(&dp); |
4139 | - if (tkt_struct_v != 1) |
4140 | - goto bad; |
4141 | + /* blob for me */ |
4142 | + dlen = ceph_x_decrypt(secret, p, end, &dbuf, 0); |
4143 | + if (dlen <= 0) { |
4144 | + ret = dlen; |
4145 | + goto out; |
4146 | + } |
4147 | + dout(" decrypted %d bytes\n", dlen); |
4148 | + dp = dbuf; |
4149 | + dend = dp + dlen; |
4150 | |
4151 | - memcpy(&old_key, &th->session_key, sizeof(old_key)); |
4152 | - ret = ceph_crypto_key_decode(&new_session_key, &dp, dend); |
4153 | - if (ret) |
4154 | - goto out; |
4155 | + tkt_struct_v = ceph_decode_8(&dp); |
4156 | + if (tkt_struct_v != 1) |
4157 | + goto bad; |
4158 | |
4159 | - ceph_decode_copy(&dp, &new_validity, sizeof(new_validity)); |
4160 | - ceph_decode_timespec(&validity, &new_validity); |
4161 | - new_expires = get_seconds() + validity.tv_sec; |
4162 | - new_renew_after = new_expires - (validity.tv_sec / 4); |
4163 | - dout(" expires=%lu renew_after=%lu\n", new_expires, |
4164 | - new_renew_after); |
4165 | + memcpy(&old_key, &th->session_key, sizeof(old_key)); |
4166 | + ret = ceph_crypto_key_decode(&new_session_key, &dp, dend); |
4167 | + if (ret) |
4168 | + goto out; |
4169 | |
4170 | - /* ticket blob for service */ |
4171 | - ceph_decode_8_safe(&p, end, is_enc, bad); |
4172 | - tp = ticket_buf; |
4173 | - if (is_enc) { |
4174 | - /* encrypted */ |
4175 | - dout(" encrypted ticket\n"); |
4176 | - dlen = ceph_x_decrypt(&old_key, &p, end, ticket_buf, |
4177 | - TEMP_TICKET_BUF_LEN); |
4178 | - if (dlen < 0) { |
4179 | - ret = dlen; |
4180 | - goto out; |
4181 | - } |
4182 | - dlen = ceph_decode_32(&tp); |
4183 | - } else { |
4184 | - /* unencrypted */ |
4185 | - ceph_decode_32_safe(&p, end, dlen, bad); |
4186 | - ceph_decode_need(&p, end, dlen, bad); |
4187 | - ceph_decode_copy(&p, ticket_buf, dlen); |
4188 | + ceph_decode_copy(&dp, &new_validity, sizeof(new_validity)); |
4189 | + ceph_decode_timespec(&validity, &new_validity); |
4190 | + new_expires = get_seconds() + validity.tv_sec; |
4191 | + new_renew_after = new_expires - (validity.tv_sec / 4); |
4192 | + dout(" expires=%lu renew_after=%lu\n", new_expires, |
4193 | + new_renew_after); |
4194 | + |
4195 | + /* ticket blob for service */ |
4196 | + ceph_decode_8_safe(p, end, is_enc, bad); |
4197 | + if (is_enc) { |
4198 | + /* encrypted */ |
4199 | + dout(" encrypted ticket\n"); |
4200 | + dlen = ceph_x_decrypt(&old_key, p, end, &ticket_buf, 0); |
4201 | + if (dlen < 0) { |
4202 | + ret = dlen; |
4203 | + goto out; |
4204 | } |
4205 | - tpend = tp + dlen; |
4206 | - dout(" ticket blob is %d bytes\n", dlen); |
4207 | - ceph_decode_need(&tp, tpend, 1 + sizeof(u64), bad); |
4208 | - blob_struct_v = ceph_decode_8(&tp); |
4209 | - new_secret_id = ceph_decode_64(&tp); |
4210 | - ret = ceph_decode_buffer(&new_ticket_blob, &tp, tpend); |
4211 | - if (ret) |
4212 | + tp = ticket_buf; |
4213 | + dlen = ceph_decode_32(&tp); |
4214 | + } else { |
4215 | + /* unencrypted */ |
4216 | + ceph_decode_32_safe(p, end, dlen, bad); |
4217 | + ticket_buf = kmalloc(dlen, GFP_NOFS); |
4218 | + if (!ticket_buf) { |
4219 | + ret = -ENOMEM; |
4220 | goto out; |
4221 | - |
4222 | - /* all is well, update our ticket */ |
4223 | - ceph_crypto_key_destroy(&th->session_key); |
4224 | - if (th->ticket_blob) |
4225 | - ceph_buffer_put(th->ticket_blob); |
4226 | - th->session_key = new_session_key; |
4227 | - th->ticket_blob = new_ticket_blob; |
4228 | - th->validity = new_validity; |
4229 | - th->secret_id = new_secret_id; |
4230 | - th->expires = new_expires; |
4231 | - th->renew_after = new_renew_after; |
4232 | - dout(" got ticket service %d (%s) secret_id %lld len %d\n", |
4233 | - type, ceph_entity_type_name(type), th->secret_id, |
4234 | - (int)th->ticket_blob->vec.iov_len); |
4235 | - xi->have_keys |= th->service; |
4236 | + } |
4237 | + tp = ticket_buf; |
4238 | + ceph_decode_need(p, end, dlen, bad); |
4239 | + ceph_decode_copy(p, ticket_buf, dlen); |
4240 | } |
4241 | + tpend = tp + dlen; |
4242 | + dout(" ticket blob is %d bytes\n", dlen); |
4243 | + ceph_decode_need(&tp, tpend, 1 + sizeof(u64), bad); |
4244 | + blob_struct_v = ceph_decode_8(&tp); |
4245 | + new_secret_id = ceph_decode_64(&tp); |
4246 | + ret = ceph_decode_buffer(&new_ticket_blob, &tp, tpend); |
4247 | + if (ret) |
4248 | + goto out; |
4249 | + |
4250 | + /* all is well, update our ticket */ |
4251 | + ceph_crypto_key_destroy(&th->session_key); |
4252 | + if (th->ticket_blob) |
4253 | + ceph_buffer_put(th->ticket_blob); |
4254 | + th->session_key = new_session_key; |
4255 | + th->ticket_blob = new_ticket_blob; |
4256 | + th->validity = new_validity; |
4257 | + th->secret_id = new_secret_id; |
4258 | + th->expires = new_expires; |
4259 | + th->renew_after = new_renew_after; |
4260 | + dout(" got ticket service %d (%s) secret_id %lld len %d\n", |
4261 | + type, ceph_entity_type_name(type), th->secret_id, |
4262 | + (int)th->ticket_blob->vec.iov_len); |
4263 | + xi->have_keys |= th->service; |
4264 | |
4265 | - ret = 0; |
4266 | out: |
4267 | kfree(ticket_buf); |
4268 | -out_dbuf: |
4269 | kfree(dbuf); |
4270 | return ret; |
4271 | |
4272 | @@ -270,6 +255,34 @@ bad: |
4273 | goto out; |
4274 | } |
4275 | |
4276 | +static int ceph_x_proc_ticket_reply(struct ceph_auth_client *ac, |
4277 | + struct ceph_crypto_key *secret, |
4278 | + void *buf, void *end) |
4279 | +{ |
4280 | + void *p = buf; |
4281 | + u8 reply_struct_v; |
4282 | + u32 num; |
4283 | + int ret; |
4284 | + |
4285 | + ceph_decode_8_safe(&p, end, reply_struct_v, bad); |
4286 | + if (reply_struct_v != 1) |
4287 | + return -EINVAL; |
4288 | + |
4289 | + ceph_decode_32_safe(&p, end, num, bad); |
4290 | + dout("%d tickets\n", num); |
4291 | + |
4292 | + while (num--) { |
4293 | + ret = process_one_ticket(ac, secret, &p, end); |
4294 | + if (ret) |
4295 | + return ret; |
4296 | + } |
4297 | + |
4298 | + return 0; |
4299 | + |
4300 | +bad: |
4301 | + return -EINVAL; |
4302 | +} |
4303 | + |
4304 | static int ceph_x_build_authorizer(struct ceph_auth_client *ac, |
4305 | struct ceph_x_ticket_handler *th, |
4306 | struct ceph_x_authorizer *au) |
4307 | @@ -583,13 +596,14 @@ static int ceph_x_verify_authorizer_reply(struct ceph_auth_client *ac, |
4308 | struct ceph_x_ticket_handler *th; |
4309 | int ret = 0; |
4310 | struct ceph_x_authorize_reply reply; |
4311 | + void *preply = &reply; |
4312 | void *p = au->reply_buf; |
4313 | void *end = p + sizeof(au->reply_buf); |
4314 | |
4315 | th = get_ticket_handler(ac, au->service); |
4316 | if (IS_ERR(th)) |
4317 | return PTR_ERR(th); |
4318 | - ret = ceph_x_decrypt(&th->session_key, &p, end, &reply, sizeof(reply)); |
4319 | + ret = ceph_x_decrypt(&th->session_key, &p, end, &preply, sizeof(reply)); |
4320 | if (ret < 0) |
4321 | return ret; |
4322 | if (ret != sizeof(reply)) |
4323 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c |
4324 | index 988721a629eb..0a31298737ac 100644 |
4325 | --- a/net/ceph/messenger.c |
4326 | +++ b/net/ceph/messenger.c |
4327 | @@ -900,7 +900,7 @@ static void ceph_msg_data_pages_cursor_init(struct ceph_msg_data_cursor *cursor, |
4328 | BUG_ON(page_count > (int)USHRT_MAX); |
4329 | cursor->page_count = (unsigned short)page_count; |
4330 | BUG_ON(length > SIZE_MAX - cursor->page_offset); |
4331 | - cursor->last_piece = (size_t)cursor->page_offset + length <= PAGE_SIZE; |
4332 | + cursor->last_piece = cursor->page_offset + cursor->resid <= PAGE_SIZE; |
4333 | } |
4334 | |
4335 | static struct page * |
4336 | diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c |
4337 | index 2ac9ef35110b..dbcbf5a4707f 100644 |
4338 | --- a/net/ceph/mon_client.c |
4339 | +++ b/net/ceph/mon_client.c |
4340 | @@ -1041,7 +1041,15 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con, |
4341 | if (!m) { |
4342 | pr_info("alloc_msg unknown type %d\n", type); |
4343 | *skip = 1; |
4344 | + } else if (front_len > m->front_alloc_len) { |
4345 | + pr_warning("mon_alloc_msg front %d > prealloc %d (%u#%llu)\n", |
4346 | + front_len, m->front_alloc_len, |
4347 | + (unsigned int)con->peer_name.type, |
4348 | + le64_to_cpu(con->peer_name.num)); |
4349 | + ceph_msg_put(m); |
4350 | + m = ceph_msg_new(type, front_len, GFP_NOFS, false); |
4351 | } |
4352 | + |
4353 | return m; |
4354 | } |
4355 | |
4356 | diff --git a/security/commoncap.c b/security/commoncap.c |
4357 | index b9d613e0ef14..963dc5981661 100644 |
4358 | --- a/security/commoncap.c |
4359 | +++ b/security/commoncap.c |
4360 | @@ -421,6 +421,9 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data |
4361 | cpu_caps->inheritable.cap[i] = le32_to_cpu(caps.data[i].inheritable); |
4362 | } |
4363 | |
4364 | + cpu_caps->permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; |
4365 | + cpu_caps->inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; |
4366 | + |
4367 | return 0; |
4368 | } |
4369 | |
4370 | diff --git a/sound/soc/blackfin/bf5xx-i2s-pcm.c b/sound/soc/blackfin/bf5xx-i2s-pcm.c |
4371 | index a3881c4381c9..bcf591373a7a 100644 |
4372 | --- a/sound/soc/blackfin/bf5xx-i2s-pcm.c |
4373 | +++ b/sound/soc/blackfin/bf5xx-i2s-pcm.c |
4374 | @@ -290,19 +290,19 @@ static int bf5xx_pcm_silence(struct snd_pcm_substream *substream, |
4375 | unsigned int sample_size = runtime->sample_bits / 8; |
4376 | void *buf = runtime->dma_area; |
4377 | struct bf5xx_i2s_pcm_data *dma_data; |
4378 | - unsigned int offset, size; |
4379 | + unsigned int offset, samples; |
4380 | |
4381 | dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); |
4382 | |
4383 | if (dma_data->tdm_mode) { |
4384 | offset = pos * 8 * sample_size; |
4385 | - size = count * 8 * sample_size; |
4386 | + samples = count * 8; |
4387 | } else { |
4388 | offset = frames_to_bytes(runtime, pos); |
4389 | - size = frames_to_bytes(runtime, count); |
4390 | + samples = count * runtime->channels; |
4391 | } |
4392 | |
4393 | - snd_pcm_format_set_silence(runtime->format, buf + offset, size); |
4394 | + snd_pcm_format_set_silence(runtime->format, buf + offset, samples); |
4395 | |
4396 | return 0; |
4397 | } |
4398 | diff --git a/sound/soc/codecs/adau1701.c b/sound/soc/codecs/adau1701.c |
4399 | index d71c59cf7bdd..370b742117ef 100644 |
4400 | --- a/sound/soc/codecs/adau1701.c |
4401 | +++ b/sound/soc/codecs/adau1701.c |
4402 | @@ -230,8 +230,10 @@ static int adau1701_reg_read(void *context, unsigned int reg, |
4403 | |
4404 | *value = 0; |
4405 | |
4406 | - for (i = 0; i < size; i++) |
4407 | - *value |= recv_buf[i] << (i * 8); |
4408 | + for (i = 0; i < size; i++) { |
4409 | + *value <<= 8; |
4410 | + *value |= recv_buf[i]; |
4411 | + } |
4412 | |
4413 | return 0; |
4414 | } |
4415 | diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c |
4416 | index b3f7c9026a29..ddfb0fddd030 100644 |
4417 | --- a/sound/soc/codecs/max98090.c |
4418 | +++ b/sound/soc/codecs/max98090.c |
4419 | @@ -2250,7 +2250,7 @@ static int max98090_probe(struct snd_soc_codec *codec) |
4420 | /* Register for interrupts */ |
4421 | dev_dbg(codec->dev, "irq = %d\n", max98090->irq); |
4422 | |
4423 | - ret = request_threaded_irq(max98090->irq, NULL, |
4424 | + ret = devm_request_threaded_irq(codec->dev, max98090->irq, NULL, |
4425 | max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, |
4426 | "max98090_interrupt", codec); |
4427 | if (ret < 0) { |
4428 | diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c |
4429 | index 886924934aa5..5cb515b08a32 100644 |
4430 | --- a/sound/soc/codecs/rt5640.c |
4431 | +++ b/sound/soc/codecs/rt5640.c |
4432 | @@ -2071,6 +2071,7 @@ static struct snd_soc_codec_driver soc_codec_dev_rt5640 = { |
4433 | static const struct regmap_config rt5640_regmap = { |
4434 | .reg_bits = 8, |
4435 | .val_bits = 16, |
4436 | + .use_single_rw = true, |
4437 | |
4438 | .max_register = RT5640_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5640_ranges) * |
4439 | RT5640_PR_SPACING), |
4440 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
4441 | index adb72063d44e..d98e52f647d2 100644 |
4442 | --- a/sound/soc/codecs/wm8994.c |
4443 | +++ b/sound/soc/codecs/wm8994.c |
4444 | @@ -3497,6 +3497,7 @@ static irqreturn_t wm8994_mic_irq(int irq, void *data) |
4445 | return IRQ_HANDLED; |
4446 | } |
4447 | |
4448 | +/* Should be called with accdet_lock held */ |
4449 | static void wm1811_micd_stop(struct snd_soc_codec *codec) |
4450 | { |
4451 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); |
4452 | @@ -3504,14 +3505,10 @@ static void wm1811_micd_stop(struct snd_soc_codec *codec) |
4453 | if (!wm8994->jackdet) |
4454 | return; |
4455 | |
4456 | - mutex_lock(&wm8994->accdet_lock); |
4457 | - |
4458 | snd_soc_update_bits(codec, WM8958_MIC_DETECT_1, WM8958_MICD_ENA, 0); |
4459 | |
4460 | wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_JACK); |
4461 | |
4462 | - mutex_unlock(&wm8994->accdet_lock); |
4463 | - |
4464 | if (wm8994->wm8994->pdata.jd_ext_cap) |
4465 | snd_soc_dapm_disable_pin(&codec->dapm, |
4466 | "MICBIAS2"); |
4467 | @@ -3552,10 +3549,10 @@ static void wm8958_open_circuit_work(struct work_struct *work) |
4468 | open_circuit_work.work); |
4469 | struct device *dev = wm8994->wm8994->dev; |
4470 | |
4471 | - wm1811_micd_stop(wm8994->hubs.codec); |
4472 | - |
4473 | mutex_lock(&wm8994->accdet_lock); |
4474 | |
4475 | + wm1811_micd_stop(wm8994->hubs.codec); |
4476 | + |
4477 | dev_dbg(dev, "Reporting open circuit\n"); |
4478 | |
4479 | wm8994->jack_mic = false; |
4480 | diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c |
4481 | index 444626fcab40..53c03aff762e 100644 |
4482 | --- a/sound/soc/codecs/wm_adsp.c |
4483 | +++ b/sound/soc/codecs/wm_adsp.c |
4484 | @@ -1745,3 +1745,5 @@ int wm_adsp2_init(struct wm_adsp *adsp, bool dvfs) |
4485 | return 0; |
4486 | } |
4487 | EXPORT_SYMBOL_GPL(wm_adsp2_init); |
4488 | + |
4489 | +MODULE_LICENSE("GPL v2"); |
4490 | diff --git a/sound/soc/pxa/pxa-ssp.c b/sound/soc/pxa/pxa-ssp.c |
4491 | index a3119a00d8fa..6c6b35e471c8 100644 |
4492 | --- a/sound/soc/pxa/pxa-ssp.c |
4493 | +++ b/sound/soc/pxa/pxa-ssp.c |
4494 | @@ -725,7 +725,8 @@ static int pxa_ssp_probe(struct snd_soc_dai *dai) |
4495 | ssp_handle = of_parse_phandle(dev->of_node, "port", 0); |
4496 | if (!ssp_handle) { |
4497 | dev_err(dev, "unable to get 'port' phandle\n"); |
4498 | - return -ENODEV; |
4499 | + ret = -ENODEV; |
4500 | + goto err_priv; |
4501 | } |
4502 | |
4503 | priv->ssp = pxa_ssp_request_of(ssp_handle, "SoC audio"); |
4504 | @@ -766,9 +767,7 @@ static int pxa_ssp_remove(struct snd_soc_dai *dai) |
4505 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \ |
4506 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) |
4507 | |
4508 | -#define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ |
4509 | - SNDRV_PCM_FMTBIT_S24_LE | \ |
4510 | - SNDRV_PCM_FMTBIT_S32_LE) |
4511 | +#define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE) |
4512 | |
4513 | static const struct snd_soc_dai_ops pxa_ssp_dai_ops = { |
4514 | .startup = pxa_ssp_startup, |
4515 | diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c |
4516 | index 0a9b44c940ce..5dae66002a11 100644 |
4517 | --- a/sound/soc/samsung/i2s.c |
4518 | +++ b/sound/soc/samsung/i2s.c |
4519 | @@ -915,11 +915,9 @@ static int i2s_suspend(struct snd_soc_dai *dai) |
4520 | { |
4521 | struct i2s_dai *i2s = to_info(dai); |
4522 | |
4523 | - if (dai->active) { |
4524 | - i2s->suspend_i2smod = readl(i2s->addr + I2SMOD); |
4525 | - i2s->suspend_i2scon = readl(i2s->addr + I2SCON); |
4526 | - i2s->suspend_i2spsr = readl(i2s->addr + I2SPSR); |
4527 | - } |
4528 | + i2s->suspend_i2smod = readl(i2s->addr + I2SMOD); |
4529 | + i2s->suspend_i2scon = readl(i2s->addr + I2SCON); |
4530 | + i2s->suspend_i2spsr = readl(i2s->addr + I2SPSR); |
4531 | |
4532 | return 0; |
4533 | } |
4534 | @@ -928,11 +926,9 @@ static int i2s_resume(struct snd_soc_dai *dai) |
4535 | { |
4536 | struct i2s_dai *i2s = to_info(dai); |
4537 | |
4538 | - if (dai->active) { |
4539 | - writel(i2s->suspend_i2scon, i2s->addr + I2SCON); |
4540 | - writel(i2s->suspend_i2smod, i2s->addr + I2SMOD); |
4541 | - writel(i2s->suspend_i2spsr, i2s->addr + I2SPSR); |
4542 | - } |
4543 | + writel(i2s->suspend_i2scon, i2s->addr + I2SCON); |
4544 | + writel(i2s->suspend_i2smod, i2s->addr + I2SMOD); |
4545 | + writel(i2s->suspend_i2spsr, i2s->addr + I2SPSR); |
4546 | |
4547 | return 0; |
4548 | } |
4549 | diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c |
4550 | index 47e1ce771e65..02733ded2cb1 100644 |
4551 | --- a/sound/soc/soc-pcm.c |
4552 | +++ b/sound/soc/soc-pcm.c |
4553 | @@ -2011,6 +2011,7 @@ int soc_dpcm_runtime_update(struct snd_soc_card *card) |
4554 | dpcm_be_disconnect(fe, SNDRV_PCM_STREAM_PLAYBACK); |
4555 | } |
4556 | |
4557 | + dpcm_path_put(&list); |
4558 | capture: |
4559 | /* skip if FE doesn't have capture capability */ |
4560 | if (!fe->cpu_dai->driver->capture.channels_min) |
4561 | diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile |
4562 | index 32487ed18354..3d5979b23e50 100644 |
4563 | --- a/tools/testing/selftests/Makefile |
4564 | +++ b/tools/testing/selftests/Makefile |
4565 | @@ -4,6 +4,7 @@ TARGETS += efivarfs |
4566 | TARGETS += kcmp |
4567 | TARGETS += memory-hotplug |
4568 | TARGETS += mqueue |
4569 | +TARGETS += mount |
4570 | TARGETS += net |
4571 | TARGETS += ptrace |
4572 | TARGETS += timers |
4573 | diff --git a/tools/testing/selftests/mount/Makefile b/tools/testing/selftests/mount/Makefile |
4574 | new file mode 100644 |
4575 | index 000000000000..337d853c2b72 |
4576 | --- /dev/null |
4577 | +++ b/tools/testing/selftests/mount/Makefile |
4578 | @@ -0,0 +1,17 @@ |
4579 | +# Makefile for mount selftests. |
4580 | + |
4581 | +all: unprivileged-remount-test |
4582 | + |
4583 | +unprivileged-remount-test: unprivileged-remount-test.c |
4584 | + gcc -Wall -O2 unprivileged-remount-test.c -o unprivileged-remount-test |
4585 | + |
4586 | +# Allow specific tests to be selected. |
4587 | +test_unprivileged_remount: unprivileged-remount-test |
4588 | + @if [ -f /proc/self/uid_map ] ; then ./unprivileged-remount-test ; fi |
4589 | + |
4590 | +run_tests: all test_unprivileged_remount |
4591 | + |
4592 | +clean: |
4593 | + rm -f unprivileged-remount-test |
4594 | + |
4595 | +.PHONY: all test_unprivileged_remount |
4596 | diff --git a/tools/testing/selftests/mount/unprivileged-remount-test.c b/tools/testing/selftests/mount/unprivileged-remount-test.c |
4597 | new file mode 100644 |
4598 | index 000000000000..1b3ff2fda4d0 |
4599 | --- /dev/null |
4600 | +++ b/tools/testing/selftests/mount/unprivileged-remount-test.c |
4601 | @@ -0,0 +1,242 @@ |
4602 | +#define _GNU_SOURCE |
4603 | +#include <sched.h> |
4604 | +#include <stdio.h> |
4605 | +#include <errno.h> |
4606 | +#include <string.h> |
4607 | +#include <sys/types.h> |
4608 | +#include <sys/mount.h> |
4609 | +#include <sys/wait.h> |
4610 | +#include <stdlib.h> |
4611 | +#include <unistd.h> |
4612 | +#include <fcntl.h> |
4613 | +#include <grp.h> |
4614 | +#include <stdbool.h> |
4615 | +#include <stdarg.h> |
4616 | + |
4617 | +#ifndef CLONE_NEWNS |
4618 | +# define CLONE_NEWNS 0x00020000 |
4619 | +#endif |
4620 | +#ifndef CLONE_NEWUTS |
4621 | +# define CLONE_NEWUTS 0x04000000 |
4622 | +#endif |
4623 | +#ifndef CLONE_NEWIPC |
4624 | +# define CLONE_NEWIPC 0x08000000 |
4625 | +#endif |
4626 | +#ifndef CLONE_NEWNET |
4627 | +# define CLONE_NEWNET 0x40000000 |
4628 | +#endif |
4629 | +#ifndef CLONE_NEWUSER |
4630 | +# define CLONE_NEWUSER 0x10000000 |
4631 | +#endif |
4632 | +#ifndef CLONE_NEWPID |
4633 | +# define CLONE_NEWPID 0x20000000 |
4634 | +#endif |
4635 | + |
4636 | +#ifndef MS_RELATIME |
4637 | +#define MS_RELATIME (1 << 21) |
4638 | +#endif |
4639 | +#ifndef MS_STRICTATIME |
4640 | +#define MS_STRICTATIME (1 << 24) |
4641 | +#endif |
4642 | + |
4643 | +static void die(char *fmt, ...) |
4644 | +{ |
4645 | + va_list ap; |
4646 | + va_start(ap, fmt); |
4647 | + vfprintf(stderr, fmt, ap); |
4648 | + va_end(ap); |
4649 | + exit(EXIT_FAILURE); |
4650 | +} |
4651 | + |
4652 | +static void write_file(char *filename, char *fmt, ...) |
4653 | +{ |
4654 | + char buf[4096]; |
4655 | + int fd; |
4656 | + ssize_t written; |
4657 | + int buf_len; |
4658 | + va_list ap; |
4659 | + |
4660 | + va_start(ap, fmt); |
4661 | + buf_len = vsnprintf(buf, sizeof(buf), fmt, ap); |
4662 | + va_end(ap); |
4663 | + if (buf_len < 0) { |
4664 | + die("vsnprintf failed: %s\n", |
4665 | + strerror(errno)); |
4666 | + } |
4667 | + if (buf_len >= sizeof(buf)) { |
4668 | + die("vsnprintf output truncated\n"); |
4669 | + } |
4670 | + |
4671 | + fd = open(filename, O_WRONLY); |
4672 | + if (fd < 0) { |
4673 | + die("open of %s failed: %s\n", |
4674 | + filename, strerror(errno)); |
4675 | + } |
4676 | + written = write(fd, buf, buf_len); |
4677 | + if (written != buf_len) { |
4678 | + if (written >= 0) { |
4679 | + die("short write to %s\n", filename); |
4680 | + } else { |
4681 | + die("write to %s failed: %s\n", |
4682 | + filename, strerror(errno)); |
4683 | + } |
4684 | + } |
4685 | + if (close(fd) != 0) { |
4686 | + die("close of %s failed: %s\n", |
4687 | + filename, strerror(errno)); |
4688 | + } |
4689 | +} |
4690 | + |
4691 | +static void create_and_enter_userns(void) |
4692 | +{ |
4693 | + uid_t uid; |
4694 | + gid_t gid; |
4695 | + |
4696 | + uid = getuid(); |
4697 | + gid = getgid(); |
4698 | + |
4699 | + if (unshare(CLONE_NEWUSER) !=0) { |
4700 | + die("unshare(CLONE_NEWUSER) failed: %s\n", |
4701 | + strerror(errno)); |
4702 | + } |
4703 | + |
4704 | + write_file("/proc/self/uid_map", "0 %d 1", uid); |
4705 | + write_file("/proc/self/gid_map", "0 %d 1", gid); |
4706 | + |
4707 | + if (setgroups(0, NULL) != 0) { |
4708 | + die("setgroups failed: %s\n", |
4709 | + strerror(errno)); |
4710 | + } |
4711 | + if (setgid(0) != 0) { |
4712 | + die ("setgid(0) failed %s\n", |
4713 | + strerror(errno)); |
4714 | + } |
4715 | + if (setuid(0) != 0) { |
4716 | + die("setuid(0) failed %s\n", |
4717 | + strerror(errno)); |
4718 | + } |
4719 | +} |
4720 | + |
4721 | +static |
4722 | +bool test_unpriv_remount(int mount_flags, int remount_flags, int invalid_flags) |
4723 | +{ |
4724 | + pid_t child; |
4725 | + |
4726 | + child = fork(); |
4727 | + if (child == -1) { |
4728 | + die("fork failed: %s\n", |
4729 | + strerror(errno)); |
4730 | + } |
4731 | + if (child != 0) { /* parent */ |
4732 | + pid_t pid; |
4733 | + int status; |
4734 | + pid = waitpid(child, &status, 0); |
4735 | + if (pid == -1) { |
4736 | + die("waitpid failed: %s\n", |
4737 | + strerror(errno)); |
4738 | + } |
4739 | + if (pid != child) { |
4740 | + die("waited for %d got %d\n", |
4741 | + child, pid); |
4742 | + } |
4743 | + if (!WIFEXITED(status)) { |
4744 | + die("child did not terminate cleanly\n"); |
4745 | + } |
4746 | + return WEXITSTATUS(status) == EXIT_SUCCESS ? true : false; |
4747 | + } |
4748 | + |
4749 | + create_and_enter_userns(); |
4750 | + if (unshare(CLONE_NEWNS) != 0) { |
4751 | + die("unshare(CLONE_NEWNS) failed: %s\n", |
4752 | + strerror(errno)); |
4753 | + } |
4754 | + |
4755 | + if (mount("testing", "/tmp", "ramfs", mount_flags, NULL) != 0) { |
4756 | + die("mount of /tmp failed: %s\n", |
4757 | + strerror(errno)); |
4758 | + } |
4759 | + |
4760 | + create_and_enter_userns(); |
4761 | + |
4762 | + if (unshare(CLONE_NEWNS) != 0) { |
4763 | + die("unshare(CLONE_NEWNS) failed: %s\n", |
4764 | + strerror(errno)); |
4765 | + } |
4766 | + |
4767 | + if (mount("/tmp", "/tmp", "none", |
4768 | + MS_REMOUNT | MS_BIND | remount_flags, NULL) != 0) { |
4769 | + /* system("cat /proc/self/mounts"); */ |
4770 | + die("remount of /tmp failed: %s\n", |
4771 | + strerror(errno)); |
4772 | + } |
4773 | + |
4774 | + if (mount("/tmp", "/tmp", "none", |
4775 | + MS_REMOUNT | MS_BIND | invalid_flags, NULL) == 0) { |
4776 | + /* system("cat /proc/self/mounts"); */ |
4777 | + die("remount of /tmp with invalid flags " |
4778 | + "succeeded unexpectedly\n"); |
4779 | + } |
4780 | + exit(EXIT_SUCCESS); |
4781 | +} |
4782 | + |
4783 | +static bool test_unpriv_remount_simple(int mount_flags) |
4784 | +{ |
4785 | + return test_unpriv_remount(mount_flags, mount_flags, 0); |
4786 | +} |
4787 | + |
4788 | +static bool test_unpriv_remount_atime(int mount_flags, int invalid_flags) |
4789 | +{ |
4790 | + return test_unpriv_remount(mount_flags, mount_flags, invalid_flags); |
4791 | +} |
4792 | + |
4793 | +int main(int argc, char **argv) |
4794 | +{ |
4795 | + if (!test_unpriv_remount_simple(MS_RDONLY|MS_NODEV)) { |
4796 | + die("MS_RDONLY malfunctions\n"); |
4797 | + } |
4798 | + if (!test_unpriv_remount_simple(MS_NODEV)) { |
4799 | + die("MS_NODEV malfunctions\n"); |
4800 | + } |
4801 | + if (!test_unpriv_remount_simple(MS_NOSUID|MS_NODEV)) { |
4802 | + die("MS_NOSUID malfunctions\n"); |
4803 | + } |
4804 | + if (!test_unpriv_remount_simple(MS_NOEXEC|MS_NODEV)) { |
4805 | + die("MS_NOEXEC malfunctions\n"); |
4806 | + } |
4807 | + if (!test_unpriv_remount_atime(MS_RELATIME|MS_NODEV, |
4808 | + MS_NOATIME|MS_NODEV)) |
4809 | + { |
4810 | + die("MS_RELATIME malfunctions\n"); |
4811 | + } |
4812 | + if (!test_unpriv_remount_atime(MS_STRICTATIME|MS_NODEV, |
4813 | + MS_NOATIME|MS_NODEV)) |
4814 | + { |
4815 | + die("MS_STRICTATIME malfunctions\n"); |
4816 | + } |
4817 | + if (!test_unpriv_remount_atime(MS_NOATIME|MS_NODEV, |
4818 | + MS_STRICTATIME|MS_NODEV)) |
4819 | + { |
4820 | + die("MS_RELATIME malfunctions\n"); |
4821 | + } |
4822 | + if (!test_unpriv_remount_atime(MS_RELATIME|MS_NODIRATIME|MS_NODEV, |
4823 | + MS_NOATIME|MS_NODEV)) |
4824 | + { |
4825 | + die("MS_RELATIME malfunctions\n"); |
4826 | + } |
4827 | + if (!test_unpriv_remount_atime(MS_STRICTATIME|MS_NODIRATIME|MS_NODEV, |
4828 | + MS_NOATIME|MS_NODEV)) |
4829 | + { |
4830 | + die("MS_RELATIME malfunctions\n"); |
4831 | + } |
4832 | + if (!test_unpriv_remount_atime(MS_NOATIME|MS_NODIRATIME|MS_NODEV, |
4833 | + MS_STRICTATIME|MS_NODEV)) |
4834 | + { |
4835 | + die("MS_RELATIME malfunctions\n"); |
4836 | + } |
4837 | + if (!test_unpriv_remount(MS_STRICTATIME|MS_NODEV, MS_NODEV, |
4838 | + MS_NOATIME|MS_NODEV)) |
4839 | + { |
4840 | + die("Default atime malfunctions\n"); |
4841 | + } |
4842 | + return EXIT_SUCCESS; |
4843 | +} |