Contents of /trunk/kernel-alx/patches-4.4/0127-4.4.28-all-fixes.patch
Parent Directory | Revision Log
Revision 2863 -
(show annotations)
(download)
Mon Mar 27 13:49:08 2017 UTC (7 years, 6 months ago) by niro
File size: 161566 byte(s)
Mon Mar 27 13:49:08 2017 UTC (7 years, 6 months ago) by niro
File size: 161566 byte(s)
linux-4.4.28
1 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index 0e4102ae1a61..c360f80c3473 100644 |
3 | --- a/Documentation/kernel-parameters.txt |
4 | +++ b/Documentation/kernel-parameters.txt |
5 | @@ -1371,7 +1371,14 @@ bytes respectively. Such letter suffixes can also be entirely omitted. |
6 | i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX |
7 | controllers |
8 | i8042.notimeout [HW] Ignore timeout condition signalled by controller |
9 | - i8042.reset [HW] Reset the controller during init and cleanup |
10 | + i8042.reset [HW] Reset the controller during init, cleanup and |
11 | + suspend-to-ram transitions, only during s2r |
12 | + transitions, or never reset |
13 | + Format: { 1 | Y | y | 0 | N | n } |
14 | + 1, Y, y: always reset controller |
15 | + 0, N, n: don't ever reset controller |
16 | + Default: only on s2r transitions on x86; most other |
17 | + architectures force reset to be always executed |
18 | i8042.unlock [HW] Unlock (ignore) the keylock |
19 | i8042.kbdreset [HW] Reset device connected to KBD port |
20 | |
21 | diff --git a/Makefile b/Makefile |
22 | index b6ee4ce561f8..391294301aaf 100644 |
23 | --- a/Makefile |
24 | +++ b/Makefile |
25 | @@ -1,6 +1,6 @@ |
26 | VERSION = 4 |
27 | PATCHLEVEL = 4 |
28 | -SUBLEVEL = 27 |
29 | +SUBLEVEL = 28 |
30 | EXTRAVERSION = |
31 | NAME = Blurry Fish Butt |
32 | |
33 | diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c |
34 | index 004b7f0bc76c..257b8699efde 100644 |
35 | --- a/arch/arc/kernel/signal.c |
36 | +++ b/arch/arc/kernel/signal.c |
37 | @@ -107,13 +107,13 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf) |
38 | struct user_regs_struct uregs; |
39 | |
40 | err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set)); |
41 | - if (!err) |
42 | - set_current_blocked(&set); |
43 | - |
44 | err |= __copy_from_user(&uregs.scratch, |
45 | &(sf->uc.uc_mcontext.regs.scratch), |
46 | sizeof(sf->uc.uc_mcontext.regs.scratch)); |
47 | + if (err) |
48 | + return err; |
49 | |
50 | + set_current_blocked(&set); |
51 | regs->bta = uregs.scratch.bta; |
52 | regs->lp_start = uregs.scratch.lp_start; |
53 | regs->lp_end = uregs.scratch.lp_end; |
54 | @@ -138,7 +138,7 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf) |
55 | regs->r0 = uregs.scratch.r0; |
56 | regs->sp = uregs.scratch.sp; |
57 | |
58 | - return err; |
59 | + return 0; |
60 | } |
61 | |
62 | static inline int is_do_ss_needed(unsigned int magic) |
63 | diff --git a/arch/arm64/include/asm/percpu.h b/arch/arm64/include/asm/percpu.h |
64 | index 0a456bef8c79..8a336852eeba 100644 |
65 | --- a/arch/arm64/include/asm/percpu.h |
66 | +++ b/arch/arm64/include/asm/percpu.h |
67 | @@ -44,48 +44,44 @@ static inline unsigned long __percpu_##op(void *ptr, \ |
68 | \ |
69 | switch (size) { \ |
70 | case 1: \ |
71 | - do { \ |
72 | - asm ("//__per_cpu_" #op "_1\n" \ |
73 | - "ldxrb %w[ret], %[ptr]\n" \ |
74 | + asm ("//__per_cpu_" #op "_1\n" \ |
75 | + "1: ldxrb %w[ret], %[ptr]\n" \ |
76 | #asm_op " %w[ret], %w[ret], %w[val]\n" \ |
77 | - "stxrb %w[loop], %w[ret], %[ptr]\n" \ |
78 | - : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
79 | - [ptr] "+Q"(*(u8 *)ptr) \ |
80 | - : [val] "Ir" (val)); \ |
81 | - } while (loop); \ |
82 | + " stxrb %w[loop], %w[ret], %[ptr]\n" \ |
83 | + " cbnz %w[loop], 1b" \ |
84 | + : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
85 | + [ptr] "+Q"(*(u8 *)ptr) \ |
86 | + : [val] "Ir" (val)); \ |
87 | break; \ |
88 | case 2: \ |
89 | - do { \ |
90 | - asm ("//__per_cpu_" #op "_2\n" \ |
91 | - "ldxrh %w[ret], %[ptr]\n" \ |
92 | + asm ("//__per_cpu_" #op "_2\n" \ |
93 | + "1: ldxrh %w[ret], %[ptr]\n" \ |
94 | #asm_op " %w[ret], %w[ret], %w[val]\n" \ |
95 | - "stxrh %w[loop], %w[ret], %[ptr]\n" \ |
96 | - : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
97 | - [ptr] "+Q"(*(u16 *)ptr) \ |
98 | - : [val] "Ir" (val)); \ |
99 | - } while (loop); \ |
100 | + " stxrh %w[loop], %w[ret], %[ptr]\n" \ |
101 | + " cbnz %w[loop], 1b" \ |
102 | + : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
103 | + [ptr] "+Q"(*(u16 *)ptr) \ |
104 | + : [val] "Ir" (val)); \ |
105 | break; \ |
106 | case 4: \ |
107 | - do { \ |
108 | - asm ("//__per_cpu_" #op "_4\n" \ |
109 | - "ldxr %w[ret], %[ptr]\n" \ |
110 | + asm ("//__per_cpu_" #op "_4\n" \ |
111 | + "1: ldxr %w[ret], %[ptr]\n" \ |
112 | #asm_op " %w[ret], %w[ret], %w[val]\n" \ |
113 | - "stxr %w[loop], %w[ret], %[ptr]\n" \ |
114 | - : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
115 | - [ptr] "+Q"(*(u32 *)ptr) \ |
116 | - : [val] "Ir" (val)); \ |
117 | - } while (loop); \ |
118 | + " stxr %w[loop], %w[ret], %[ptr]\n" \ |
119 | + " cbnz %w[loop], 1b" \ |
120 | + : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
121 | + [ptr] "+Q"(*(u32 *)ptr) \ |
122 | + : [val] "Ir" (val)); \ |
123 | break; \ |
124 | case 8: \ |
125 | - do { \ |
126 | - asm ("//__per_cpu_" #op "_8\n" \ |
127 | - "ldxr %[ret], %[ptr]\n" \ |
128 | + asm ("//__per_cpu_" #op "_8\n" \ |
129 | + "1: ldxr %[ret], %[ptr]\n" \ |
130 | #asm_op " %[ret], %[ret], %[val]\n" \ |
131 | - "stxr %w[loop], %[ret], %[ptr]\n" \ |
132 | - : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
133 | - [ptr] "+Q"(*(u64 *)ptr) \ |
134 | - : [val] "Ir" (val)); \ |
135 | - } while (loop); \ |
136 | + " stxr %w[loop], %[ret], %[ptr]\n" \ |
137 | + " cbnz %w[loop], 1b" \ |
138 | + : [loop] "=&r" (loop), [ret] "=&r" (ret), \ |
139 | + [ptr] "+Q"(*(u64 *)ptr) \ |
140 | + : [val] "Ir" (val)); \ |
141 | break; \ |
142 | default: \ |
143 | BUILD_BUG(); \ |
144 | @@ -150,44 +146,40 @@ static inline unsigned long __percpu_xchg(void *ptr, unsigned long val, |
145 | |
146 | switch (size) { |
147 | case 1: |
148 | - do { |
149 | - asm ("//__percpu_xchg_1\n" |
150 | - "ldxrb %w[ret], %[ptr]\n" |
151 | - "stxrb %w[loop], %w[val], %[ptr]\n" |
152 | - : [loop] "=&r"(loop), [ret] "=&r"(ret), |
153 | - [ptr] "+Q"(*(u8 *)ptr) |
154 | - : [val] "r" (val)); |
155 | - } while (loop); |
156 | + asm ("//__percpu_xchg_1\n" |
157 | + "1: ldxrb %w[ret], %[ptr]\n" |
158 | + " stxrb %w[loop], %w[val], %[ptr]\n" |
159 | + " cbnz %w[loop], 1b" |
160 | + : [loop] "=&r"(loop), [ret] "=&r"(ret), |
161 | + [ptr] "+Q"(*(u8 *)ptr) |
162 | + : [val] "r" (val)); |
163 | break; |
164 | case 2: |
165 | - do { |
166 | - asm ("//__percpu_xchg_2\n" |
167 | - "ldxrh %w[ret], %[ptr]\n" |
168 | - "stxrh %w[loop], %w[val], %[ptr]\n" |
169 | - : [loop] "=&r"(loop), [ret] "=&r"(ret), |
170 | - [ptr] "+Q"(*(u16 *)ptr) |
171 | - : [val] "r" (val)); |
172 | - } while (loop); |
173 | + asm ("//__percpu_xchg_2\n" |
174 | + "1: ldxrh %w[ret], %[ptr]\n" |
175 | + " stxrh %w[loop], %w[val], %[ptr]\n" |
176 | + " cbnz %w[loop], 1b" |
177 | + : [loop] "=&r"(loop), [ret] "=&r"(ret), |
178 | + [ptr] "+Q"(*(u16 *)ptr) |
179 | + : [val] "r" (val)); |
180 | break; |
181 | case 4: |
182 | - do { |
183 | - asm ("//__percpu_xchg_4\n" |
184 | - "ldxr %w[ret], %[ptr]\n" |
185 | - "stxr %w[loop], %w[val], %[ptr]\n" |
186 | - : [loop] "=&r"(loop), [ret] "=&r"(ret), |
187 | - [ptr] "+Q"(*(u32 *)ptr) |
188 | - : [val] "r" (val)); |
189 | - } while (loop); |
190 | + asm ("//__percpu_xchg_4\n" |
191 | + "1: ldxr %w[ret], %[ptr]\n" |
192 | + " stxr %w[loop], %w[val], %[ptr]\n" |
193 | + " cbnz %w[loop], 1b" |
194 | + : [loop] "=&r"(loop), [ret] "=&r"(ret), |
195 | + [ptr] "+Q"(*(u32 *)ptr) |
196 | + : [val] "r" (val)); |
197 | break; |
198 | case 8: |
199 | - do { |
200 | - asm ("//__percpu_xchg_8\n" |
201 | - "ldxr %[ret], %[ptr]\n" |
202 | - "stxr %w[loop], %[val], %[ptr]\n" |
203 | - : [loop] "=&r"(loop), [ret] "=&r"(ret), |
204 | - [ptr] "+Q"(*(u64 *)ptr) |
205 | - : [val] "r" (val)); |
206 | - } while (loop); |
207 | + asm ("//__percpu_xchg_8\n" |
208 | + "1: ldxr %[ret], %[ptr]\n" |
209 | + " stxr %w[loop], %[val], %[ptr]\n" |
210 | + " cbnz %w[loop], 1b" |
211 | + : [loop] "=&r"(loop), [ret] "=&r"(ret), |
212 | + [ptr] "+Q"(*(u64 *)ptr) |
213 | + : [val] "r" (val)); |
214 | break; |
215 | default: |
216 | BUILD_BUG(); |
217 | diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S |
218 | index b685257926f0..20ceb5edf7b8 100644 |
219 | --- a/arch/arm64/kernel/head.S |
220 | +++ b/arch/arm64/kernel/head.S |
221 | @@ -518,8 +518,9 @@ CPU_LE( movk x0, #0x30d0, lsl #16 ) // Clear EE and E0E on LE systems |
222 | b.lt 4f // Skip if no PMU present |
223 | mrs x0, pmcr_el0 // Disable debug access traps |
224 | ubfx x0, x0, #11, #5 // to EL2 and allow access to |
225 | - msr mdcr_el2, x0 // all PMU counters from EL1 |
226 | 4: |
227 | + csel x0, xzr, x0, lt // all PMU counters from EL1 |
228 | + msr mdcr_el2, x0 // (if they exist) |
229 | |
230 | /* Stage-2 translation */ |
231 | msr vttbr_el2, xzr |
232 | diff --git a/arch/metag/include/asm/atomic.h b/arch/metag/include/asm/atomic.h |
233 | index 470e365f04ea..8ff0a70865f6 100644 |
234 | --- a/arch/metag/include/asm/atomic.h |
235 | +++ b/arch/metag/include/asm/atomic.h |
236 | @@ -39,11 +39,10 @@ |
237 | #define atomic_dec(v) atomic_sub(1, (v)) |
238 | |
239 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
240 | +#define atomic_dec_if_positive(v) atomic_sub_if_positive(1, v) |
241 | |
242 | #endif |
243 | |
244 | -#define atomic_dec_if_positive(v) atomic_sub_if_positive(1, v) |
245 | - |
246 | #include <asm-generic/atomic64.h> |
247 | |
248 | #endif /* __ASM_METAG_ATOMIC_H */ |
249 | diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h |
250 | index f6fc6aac5496..b6578611dddb 100644 |
251 | --- a/arch/mips/include/asm/ptrace.h |
252 | +++ b/arch/mips/include/asm/ptrace.h |
253 | @@ -152,7 +152,7 @@ static inline int is_syscall_success(struct pt_regs *regs) |
254 | |
255 | static inline long regs_return_value(struct pt_regs *regs) |
256 | { |
257 | - if (is_syscall_success(regs)) |
258 | + if (is_syscall_success(regs) || !user_mode(regs)) |
259 | return regs->regs[2]; |
260 | else |
261 | return -regs->regs[2]; |
262 | diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile |
263 | index 090393aa0f20..6c7d78546eee 100644 |
264 | --- a/arch/mips/vdso/Makefile |
265 | +++ b/arch/mips/vdso/Makefile |
266 | @@ -75,7 +75,7 @@ obj-vdso := $(obj-vdso-y:%.o=$(obj)/%.o) |
267 | $(obj-vdso): KBUILD_CFLAGS := $(cflags-vdso) $(native-abi) |
268 | $(obj-vdso): KBUILD_AFLAGS := $(aflags-vdso) $(native-abi) |
269 | |
270 | -$(obj)/vdso.lds: KBUILD_CPPFLAGS := $(native-abi) |
271 | +$(obj)/vdso.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) $(native-abi) |
272 | |
273 | $(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) FORCE |
274 | $(call if_changed,vdsold) |
275 | diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h |
276 | index 291cee28ccb6..c2c43f714684 100644 |
277 | --- a/arch/parisc/include/asm/pgtable.h |
278 | +++ b/arch/parisc/include/asm/pgtable.h |
279 | @@ -83,10 +83,10 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) |
280 | printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, (unsigned long)pgd_val(e)) |
281 | |
282 | /* This is the size of the initially mapped kernel memory */ |
283 | -#ifdef CONFIG_64BIT |
284 | -#define KERNEL_INITIAL_ORDER 25 /* 1<<25 = 32MB */ |
285 | +#if defined(CONFIG_64BIT) |
286 | +#define KERNEL_INITIAL_ORDER 26 /* 1<<26 = 64MB */ |
287 | #else |
288 | -#define KERNEL_INITIAL_ORDER 24 /* 1<<24 = 16MB */ |
289 | +#define KERNEL_INITIAL_ORDER 25 /* 1<<25 = 32MB */ |
290 | #endif |
291 | #define KERNEL_INITIAL_SIZE (1 << KERNEL_INITIAL_ORDER) |
292 | |
293 | diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c |
294 | index f7ea626e29c9..81d6f6391944 100644 |
295 | --- a/arch/parisc/kernel/setup.c |
296 | +++ b/arch/parisc/kernel/setup.c |
297 | @@ -38,6 +38,7 @@ |
298 | #include <linux/export.h> |
299 | |
300 | #include <asm/processor.h> |
301 | +#include <asm/sections.h> |
302 | #include <asm/pdc.h> |
303 | #include <asm/led.h> |
304 | #include <asm/machdep.h> /* for pa7300lc_init() proto */ |
305 | @@ -140,6 +141,13 @@ void __init setup_arch(char **cmdline_p) |
306 | #endif |
307 | printk(KERN_CONT ".\n"); |
308 | |
309 | + /* |
310 | + * Check if initial kernel page mappings are sufficient. |
311 | + * panic early if not, else we may access kernel functions |
312 | + * and variables which can't be reached. |
313 | + */ |
314 | + if (__pa((unsigned long) &_end) >= KERNEL_INITIAL_SIZE) |
315 | + panic("KERNEL_INITIAL_ORDER too small!"); |
316 | |
317 | pdc_console_init(); |
318 | |
319 | diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S |
320 | index 308f29081d46..60771df10fde 100644 |
321 | --- a/arch/parisc/kernel/vmlinux.lds.S |
322 | +++ b/arch/parisc/kernel/vmlinux.lds.S |
323 | @@ -88,8 +88,9 @@ SECTIONS |
324 | /* Start of data section */ |
325 | _sdata = .; |
326 | |
327 | - RO_DATA_SECTION(8) |
328 | - |
329 | + /* Architecturally we need to keep __gp below 0x1000000 and thus |
330 | + * in front of RO_DATA_SECTION() which stores lots of tracepoint |
331 | + * and ftrace symbols. */ |
332 | #ifdef CONFIG_64BIT |
333 | . = ALIGN(16); |
334 | /* Linkage tables */ |
335 | @@ -104,6 +105,8 @@ SECTIONS |
336 | } |
337 | #endif |
338 | |
339 | + RO_DATA_SECTION(8) |
340 | + |
341 | /* unwind info */ |
342 | .PARISC.unwind : { |
343 | __start___unwind = .; |
344 | diff --git a/arch/powerpc/kernel/vdso64/datapage.S b/arch/powerpc/kernel/vdso64/datapage.S |
345 | index 2f01c4a0d8a0..7612eeb31da1 100644 |
346 | --- a/arch/powerpc/kernel/vdso64/datapage.S |
347 | +++ b/arch/powerpc/kernel/vdso64/datapage.S |
348 | @@ -59,7 +59,7 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map) |
349 | bl V_LOCAL_FUNC(__get_datapage) |
350 | mtlr r12 |
351 | addi r3,r3,CFG_SYSCALL_MAP64 |
352 | - cmpli cr0,r4,0 |
353 | + cmpldi cr0,r4,0 |
354 | crclr cr0*4+so |
355 | beqlr |
356 | li r0,__NR_syscalls |
357 | diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S |
358 | index a76b4af37ef2..382021324883 100644 |
359 | --- a/arch/powerpc/kernel/vdso64/gettimeofday.S |
360 | +++ b/arch/powerpc/kernel/vdso64/gettimeofday.S |
361 | @@ -145,7 +145,7 @@ V_FUNCTION_BEGIN(__kernel_clock_getres) |
362 | bne cr0,99f |
363 | |
364 | li r3,0 |
365 | - cmpli cr0,r4,0 |
366 | + cmpldi cr0,r4,0 |
367 | crclr cr0*4+so |
368 | beqlr |
369 | lis r5,CLOCK_REALTIME_RES@h |
370 | diff --git a/arch/powerpc/lib/copyuser_64.S b/arch/powerpc/lib/copyuser_64.S |
371 | index f09899e35991..7b22624f332c 100644 |
372 | --- a/arch/powerpc/lib/copyuser_64.S |
373 | +++ b/arch/powerpc/lib/copyuser_64.S |
374 | @@ -359,6 +359,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD) |
375 | addi r3,r3,8 |
376 | 171: |
377 | 177: |
378 | +179: |
379 | addi r3,r3,8 |
380 | 370: |
381 | 372: |
382 | @@ -373,7 +374,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD) |
383 | 173: |
384 | 174: |
385 | 175: |
386 | -179: |
387 | 181: |
388 | 184: |
389 | 186: |
390 | diff --git a/arch/powerpc/mm/copro_fault.c b/arch/powerpc/mm/copro_fault.c |
391 | index 6527882ce05e..ddfd2740a1b5 100644 |
392 | --- a/arch/powerpc/mm/copro_fault.c |
393 | +++ b/arch/powerpc/mm/copro_fault.c |
394 | @@ -106,6 +106,8 @@ int copro_calculate_slb(struct mm_struct *mm, u64 ea, struct copro_slb *slb) |
395 | switch (REGION_ID(ea)) { |
396 | case USER_REGION_ID: |
397 | pr_devel("%s: 0x%llx -- USER_REGION_ID\n", __func__, ea); |
398 | + if (mm == NULL) |
399 | + return 1; |
400 | psize = get_slice_psize(mm, ea); |
401 | ssize = user_segment_size(ea); |
402 | vsid = get_vsid(mm->context.id, ea, ssize); |
403 | diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c |
404 | index 2ba602591a20..ba0cae69a396 100644 |
405 | --- a/arch/powerpc/platforms/powernv/eeh-powernv.c |
406 | +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c |
407 | @@ -1163,7 +1163,7 @@ static void pnv_eeh_get_and_dump_hub_diag(struct pci_controller *hose) |
408 | return; |
409 | } |
410 | |
411 | - switch (data->type) { |
412 | + switch (be16_to_cpu(data->type)) { |
413 | case OPAL_P7IOC_DIAG_TYPE_RGC: |
414 | pr_info("P7IOC diag-data for RGC\n\n"); |
415 | pnv_eeh_dump_hub_diag_common(data); |
416 | @@ -1395,7 +1395,7 @@ static int pnv_eeh_next_error(struct eeh_pe **pe) |
417 | |
418 | /* Try best to clear it */ |
419 | opal_pci_eeh_freeze_clear(phb->opal_id, |
420 | - frozen_pe_no, |
421 | + be64_to_cpu(frozen_pe_no), |
422 | OPAL_EEH_ACTION_CLEAR_FREEZE_ALL); |
423 | ret = EEH_NEXT_ERR_NONE; |
424 | } else if ((*pe)->state & EEH_PE_ISOLATED || |
425 | diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c |
426 | index ad8c3f4a5e0b..dd5e0f3b1b5d 100644 |
427 | --- a/arch/powerpc/platforms/powernv/pci.c |
428 | +++ b/arch/powerpc/platforms/powernv/pci.c |
429 | @@ -197,8 +197,8 @@ static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose, |
430 | be64_to_cpu(data->dma1ErrorLog1)); |
431 | |
432 | for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { |
433 | - if ((data->pestA[i] >> 63) == 0 && |
434 | - (data->pestB[i] >> 63) == 0) |
435 | + if ((be64_to_cpu(data->pestA[i]) >> 63) == 0 && |
436 | + (be64_to_cpu(data->pestB[i]) >> 63) == 0) |
437 | continue; |
438 | |
439 | pr_info("PE[%3d] A/B: %016llx %016llx\n", |
440 | diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c |
441 | index b7a67e3d2201..3ae43282460e 100644 |
442 | --- a/arch/powerpc/platforms/pseries/lpar.c |
443 | +++ b/arch/powerpc/platforms/pseries/lpar.c |
444 | @@ -406,7 +406,7 @@ static void __pSeries_lpar_hugepage_invalidate(unsigned long *slot, |
445 | unsigned long *vpn, int count, |
446 | int psize, int ssize) |
447 | { |
448 | - unsigned long param[8]; |
449 | + unsigned long param[PLPAR_HCALL9_BUFSIZE]; |
450 | int i = 0, pix = 0, rc; |
451 | unsigned long flags = 0; |
452 | int lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE); |
453 | @@ -523,7 +523,7 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local) |
454 | unsigned long flags = 0; |
455 | struct ppc64_tlb_batch *batch = this_cpu_ptr(&ppc64_tlb_batch); |
456 | int lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE); |
457 | - unsigned long param[9]; |
458 | + unsigned long param[PLPAR_HCALL9_BUFSIZE]; |
459 | unsigned long hash, index, shift, hidx, slot; |
460 | real_pte_t pte; |
461 | int psize, ssize; |
462 | diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h |
463 | index a2e6ef32e054..0a2031618f7f 100644 |
464 | --- a/arch/s390/include/asm/tlbflush.h |
465 | +++ b/arch/s390/include/asm/tlbflush.h |
466 | @@ -81,7 +81,8 @@ static inline void __tlb_flush_full(struct mm_struct *mm) |
467 | } |
468 | |
469 | /* |
470 | - * Flush TLB entries for a specific ASCE on all CPUs. |
471 | + * Flush TLB entries for a specific ASCE on all CPUs. Should never be used |
472 | + * when more than one asce (e.g. gmap) ran on this mm. |
473 | */ |
474 | static inline void __tlb_flush_asce(struct mm_struct *mm, unsigned long asce) |
475 | { |
476 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c |
477 | index 471a370a527b..8345ae1f117d 100644 |
478 | --- a/arch/s390/mm/pgtable.c |
479 | +++ b/arch/s390/mm/pgtable.c |
480 | @@ -166,7 +166,7 @@ EXPORT_SYMBOL_GPL(gmap_alloc); |
481 | static void gmap_flush_tlb(struct gmap *gmap) |
482 | { |
483 | if (MACHINE_HAS_IDTE) |
484 | - __tlb_flush_asce(gmap->mm, gmap->asce); |
485 | + __tlb_flush_idte(gmap->asce); |
486 | else |
487 | __tlb_flush_global(); |
488 | } |
489 | @@ -205,7 +205,7 @@ void gmap_free(struct gmap *gmap) |
490 | |
491 | /* Flush tlb. */ |
492 | if (MACHINE_HAS_IDTE) |
493 | - __tlb_flush_asce(gmap->mm, gmap->asce); |
494 | + __tlb_flush_idte(gmap->asce); |
495 | else |
496 | __tlb_flush_global(); |
497 | |
498 | diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c |
499 | index 38b3ead7222d..52a2526c3fbe 100644 |
500 | --- a/arch/x86/kernel/e820.c |
501 | +++ b/arch/x86/kernel/e820.c |
502 | @@ -347,7 +347,7 @@ int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, |
503 | * continue building up new bios map based on this |
504 | * information |
505 | */ |
506 | - if (current_type != last_type) { |
507 | + if (current_type != last_type || current_type == E820_PRAM) { |
508 | if (last_type != 0) { |
509 | new_bios[new_bios_entry].size = |
510 | change_point[chgidx]->addr - last_addr; |
511 | diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c |
512 | index 88d0a92d3f94..3aab53f8cad2 100644 |
513 | --- a/arch/x86/kvm/ioapic.c |
514 | +++ b/arch/x86/kvm/ioapic.c |
515 | @@ -580,7 +580,7 @@ static void kvm_ioapic_reset(struct kvm_ioapic *ioapic) |
516 | ioapic->irr = 0; |
517 | ioapic->irr_delivered = 0; |
518 | ioapic->id = 0; |
519 | - memset(ioapic->irq_eoi, 0x00, IOAPIC_NUM_PINS); |
520 | + memset(ioapic->irq_eoi, 0x00, sizeof(ioapic->irq_eoi)); |
521 | rtc_irq_eoi_tracking_reset(ioapic); |
522 | } |
523 | |
524 | diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c |
525 | index 5a37188b559f..9d359e05fad7 100644 |
526 | --- a/block/blk-cgroup.c |
527 | +++ b/block/blk-cgroup.c |
528 | @@ -1331,10 +1331,8 @@ int blkcg_policy_register(struct blkcg_policy *pol) |
529 | struct blkcg_policy_data *cpd; |
530 | |
531 | cpd = pol->cpd_alloc_fn(GFP_KERNEL); |
532 | - if (!cpd) { |
533 | - mutex_unlock(&blkcg_pol_mutex); |
534 | + if (!cpd) |
535 | goto err_free_cpds; |
536 | - } |
537 | |
538 | blkcg->cpd[pol->plid] = cpd; |
539 | cpd->blkcg = blkcg; |
540 | diff --git a/crypto/asymmetric_keys/pkcs7_parser.c b/crypto/asymmetric_keys/pkcs7_parser.c |
541 | index 758acabf2d81..8f3056cd0399 100644 |
542 | --- a/crypto/asymmetric_keys/pkcs7_parser.c |
543 | +++ b/crypto/asymmetric_keys/pkcs7_parser.c |
544 | @@ -547,9 +547,7 @@ int pkcs7_sig_note_set_of_authattrs(void *context, size_t hdrlen, |
545 | struct pkcs7_signed_info *sinfo = ctx->sinfo; |
546 | |
547 | if (!test_bit(sinfo_has_content_type, &sinfo->aa_set) || |
548 | - !test_bit(sinfo_has_message_digest, &sinfo->aa_set) || |
549 | - (ctx->msg->data_type == OID_msIndirectData && |
550 | - !test_bit(sinfo_has_ms_opus_info, &sinfo->aa_set))) { |
551 | + !test_bit(sinfo_has_message_digest, &sinfo->aa_set)) { |
552 | pr_warn("Missing required AuthAttr\n"); |
553 | return -EBADMSG; |
554 | } |
555 | diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c |
556 | index 5230e8449d30..c097f477c74c 100644 |
557 | --- a/drivers/acpi/nfit.c |
558 | +++ b/drivers/acpi/nfit.c |
559 | @@ -1806,6 +1806,9 @@ static void acpi_nfit_notify(struct acpi_device *adev, u32 event) |
560 | |
561 | dev_dbg(dev, "%s: event: %d\n", __func__, event); |
562 | |
563 | + if (event != NFIT_NOTIFY_UPDATE) |
564 | + return; |
565 | + |
566 | device_lock(dev); |
567 | if (!dev->driver) { |
568 | /* dev->driver may be null if we're being removed */ |
569 | diff --git a/drivers/acpi/nfit.h b/drivers/acpi/nfit.h |
570 | index 3d549a383659..13d6ec1ff055 100644 |
571 | --- a/drivers/acpi/nfit.h |
572 | +++ b/drivers/acpi/nfit.h |
573 | @@ -45,6 +45,10 @@ enum { |
574 | ND_BLK_DCR_LATCH = 2, |
575 | }; |
576 | |
577 | +enum nfit_root_notifiers { |
578 | + NFIT_NOTIFY_UPDATE = 0x80, |
579 | +}; |
580 | + |
581 | struct nfit_spa { |
582 | struct acpi_nfit_system_address *spa; |
583 | struct list_head list; |
584 | diff --git a/drivers/base/platform.c b/drivers/base/platform.c |
585 | index 176b59f5bc47..ba66330cea67 100644 |
586 | --- a/drivers/base/platform.c |
587 | +++ b/drivers/base/platform.c |
588 | @@ -96,7 +96,7 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) |
589 | int ret; |
590 | |
591 | ret = of_irq_get(dev->dev.of_node, num); |
592 | - if (ret >= 0 || ret == -EPROBE_DEFER) |
593 | + if (ret > 0 || ret == -EPROBE_DEFER) |
594 | return ret; |
595 | } |
596 | |
597 | @@ -154,7 +154,7 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name) |
598 | int ret; |
599 | |
600 | ret = of_irq_get_byname(dev->dev.of_node, name); |
601 | - if (ret >= 0 || ret == -EPROBE_DEFER) |
602 | + if (ret > 0 || ret == -EPROBE_DEFER) |
603 | return ret; |
604 | } |
605 | |
606 | diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c |
607 | index c1935081d34a..aab64205d866 100644 |
608 | --- a/drivers/clk/imx/clk-imx6q.c |
609 | +++ b/drivers/clk/imx/clk-imx6q.c |
610 | @@ -550,6 +550,24 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) |
611 | if (IS_ENABLED(CONFIG_PCI_IMX6)) |
612 | clk_set_parent(clk[IMX6QDL_CLK_LVDS1_SEL], clk[IMX6QDL_CLK_SATA_REF_100M]); |
613 | |
614 | + /* |
615 | + * Initialize the GPU clock muxes, so that the maximum specified clock |
616 | + * rates for the respective SoC are not exceeded. |
617 | + */ |
618 | + if (clk_on_imx6dl()) { |
619 | + clk_set_parent(clk[IMX6QDL_CLK_GPU3D_CORE_SEL], |
620 | + clk[IMX6QDL_CLK_PLL2_PFD1_594M]); |
621 | + clk_set_parent(clk[IMX6QDL_CLK_GPU2D_CORE_SEL], |
622 | + clk[IMX6QDL_CLK_PLL2_PFD1_594M]); |
623 | + } else if (clk_on_imx6q()) { |
624 | + clk_set_parent(clk[IMX6QDL_CLK_GPU3D_CORE_SEL], |
625 | + clk[IMX6QDL_CLK_MMDC_CH0_AXI]); |
626 | + clk_set_parent(clk[IMX6QDL_CLK_GPU3D_SHADER_SEL], |
627 | + clk[IMX6QDL_CLK_PLL2_PFD1_594M]); |
628 | + clk_set_parent(clk[IMX6QDL_CLK_GPU2D_CORE_SEL], |
629 | + clk[IMX6QDL_CLK_PLL3_USB_OTG]); |
630 | + } |
631 | + |
632 | imx_register_uart_clocks(uart_clks); |
633 | } |
634 | CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init); |
635 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
636 | index 6e80e4298274..7ff8b15a3422 100644 |
637 | --- a/drivers/cpufreq/intel_pstate.c |
638 | +++ b/drivers/cpufreq/intel_pstate.c |
639 | @@ -285,14 +285,14 @@ static void intel_pstate_hwp_set(void) |
640 | int min, hw_min, max, hw_max, cpu, range, adj_range; |
641 | u64 value, cap; |
642 | |
643 | - rdmsrl(MSR_HWP_CAPABILITIES, cap); |
644 | - hw_min = HWP_LOWEST_PERF(cap); |
645 | - hw_max = HWP_HIGHEST_PERF(cap); |
646 | - range = hw_max - hw_min; |
647 | - |
648 | get_online_cpus(); |
649 | |
650 | for_each_online_cpu(cpu) { |
651 | + rdmsrl_on_cpu(cpu, MSR_HWP_CAPABILITIES, &cap); |
652 | + hw_min = HWP_LOWEST_PERF(cap); |
653 | + hw_max = HWP_HIGHEST_PERF(cap); |
654 | + range = hw_max - hw_min; |
655 | + |
656 | rdmsrl_on_cpu(cpu, MSR_HWP_REQUEST, &value); |
657 | adj_range = limits->min_perf_pct * range / 100; |
658 | min = hw_min + adj_range; |
659 | diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c |
660 | index 48ef368347ab..9e02cb6afb0b 100644 |
661 | --- a/drivers/gpio/gpio-mpc8xxx.c |
662 | +++ b/drivers/gpio/gpio-mpc8xxx.c |
663 | @@ -329,7 +329,7 @@ static int mpc8xxx_gpio_irq_map(struct irq_domain *h, unsigned int irq, |
664 | irq_hw_number_t hwirq) |
665 | { |
666 | irq_set_chip_data(irq, h->host_data); |
667 | - irq_set_chip_and_handler(irq, &mpc8xxx_irq_chip, handle_level_irq); |
668 | + irq_set_chip_and_handler(irq, &mpc8xxx_irq_chip, handle_edge_irq); |
669 | |
670 | return 0; |
671 | } |
672 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
673 | index be5b399da5d3..43482ae1e049 100644 |
674 | --- a/drivers/input/mouse/elantech.c |
675 | +++ b/drivers/input/mouse/elantech.c |
676 | @@ -1163,6 +1163,13 @@ static const struct dmi_system_id elantech_dmi_has_middle_button[] = { |
677 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), |
678 | }, |
679 | }, |
680 | + { |
681 | + /* Fujitsu H760 also has a middle button */ |
682 | + .matches = { |
683 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
684 | + DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H760"), |
685 | + }, |
686 | + }, |
687 | #endif |
688 | { } |
689 | }; |
690 | @@ -1507,10 +1514,10 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { |
691 | }, |
692 | }, |
693 | { |
694 | - /* Fujitsu LIFEBOOK E554 does not work with crc_enabled == 0 */ |
695 | + /* Fujitsu H760 does not work with crc_enabled == 0 */ |
696 | .matches = { |
697 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
698 | - DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E554"), |
699 | + DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H760"), |
700 | }, |
701 | }, |
702 | { |
703 | @@ -1521,6 +1528,20 @@ static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { |
704 | }, |
705 | }, |
706 | { |
707 | + /* Fujitsu LIFEBOOK E554 does not work with crc_enabled == 0 */ |
708 | + .matches = { |
709 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
710 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E554"), |
711 | + }, |
712 | + }, |
713 | + { |
714 | + /* Fujitsu LIFEBOOK E556 does not work with crc_enabled == 0 */ |
715 | + .matches = { |
716 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
717 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E556"), |
718 | + }, |
719 | + }, |
720 | + { |
721 | /* Fujitsu LIFEBOOK U745 does not work with crc_enabled == 0 */ |
722 | .matches = { |
723 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), |
724 | diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h |
725 | index a5eed2ade53d..34da81c006b6 100644 |
726 | --- a/drivers/input/serio/i8042-io.h |
727 | +++ b/drivers/input/serio/i8042-io.h |
728 | @@ -81,7 +81,7 @@ static inline int i8042_platform_init(void) |
729 | return -EBUSY; |
730 | #endif |
731 | |
732 | - i8042_reset = 1; |
733 | + i8042_reset = I8042_RESET_ALWAYS; |
734 | return 0; |
735 | } |
736 | |
737 | diff --git a/drivers/input/serio/i8042-ip22io.h b/drivers/input/serio/i8042-ip22io.h |
738 | index ee1ad27d6ed0..08a1c10a1448 100644 |
739 | --- a/drivers/input/serio/i8042-ip22io.h |
740 | +++ b/drivers/input/serio/i8042-ip22io.h |
741 | @@ -61,7 +61,7 @@ static inline int i8042_platform_init(void) |
742 | return -EBUSY; |
743 | #endif |
744 | |
745 | - i8042_reset = 1; |
746 | + i8042_reset = I8042_RESET_ALWAYS; |
747 | |
748 | return 0; |
749 | } |
750 | diff --git a/drivers/input/serio/i8042-ppcio.h b/drivers/input/serio/i8042-ppcio.h |
751 | index f708c75d16f1..1aabea43329e 100644 |
752 | --- a/drivers/input/serio/i8042-ppcio.h |
753 | +++ b/drivers/input/serio/i8042-ppcio.h |
754 | @@ -44,7 +44,7 @@ static inline void i8042_write_command(int val) |
755 | |
756 | static inline int i8042_platform_init(void) |
757 | { |
758 | - i8042_reset = 1; |
759 | + i8042_reset = I8042_RESET_ALWAYS; |
760 | return 0; |
761 | } |
762 | |
763 | diff --git a/drivers/input/serio/i8042-sparcio.h b/drivers/input/serio/i8042-sparcio.h |
764 | index afcd1c1a05b2..6231d63860ee 100644 |
765 | --- a/drivers/input/serio/i8042-sparcio.h |
766 | +++ b/drivers/input/serio/i8042-sparcio.h |
767 | @@ -130,7 +130,7 @@ static int __init i8042_platform_init(void) |
768 | } |
769 | } |
770 | |
771 | - i8042_reset = 1; |
772 | + i8042_reset = I8042_RESET_ALWAYS; |
773 | |
774 | return 0; |
775 | } |
776 | diff --git a/drivers/input/serio/i8042-unicore32io.h b/drivers/input/serio/i8042-unicore32io.h |
777 | index 73f5cc124a36..455747552f85 100644 |
778 | --- a/drivers/input/serio/i8042-unicore32io.h |
779 | +++ b/drivers/input/serio/i8042-unicore32io.h |
780 | @@ -61,7 +61,7 @@ static inline int i8042_platform_init(void) |
781 | if (!request_mem_region(I8042_REGION_START, I8042_REGION_SIZE, "i8042")) |
782 | return -EBUSY; |
783 | |
784 | - i8042_reset = 1; |
785 | + i8042_reset = I8042_RESET_ALWAYS; |
786 | return 0; |
787 | } |
788 | |
789 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
790 | index 68f5f4a0f1e7..f4bfb4b2d50a 100644 |
791 | --- a/drivers/input/serio/i8042-x86ia64io.h |
792 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
793 | @@ -510,6 +510,90 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
794 | { } |
795 | }; |
796 | |
797 | +/* |
798 | + * On some Asus laptops, just running self tests cause problems. |
799 | + */ |
800 | +static const struct dmi_system_id i8042_dmi_noselftest_table[] = { |
801 | + { |
802 | + .matches = { |
803 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
804 | + DMI_MATCH(DMI_PRODUCT_NAME, "A455LD"), |
805 | + }, |
806 | + }, |
807 | + { |
808 | + .matches = { |
809 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
810 | + DMI_MATCH(DMI_PRODUCT_NAME, "K401LB"), |
811 | + }, |
812 | + }, |
813 | + { |
814 | + .matches = { |
815 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
816 | + DMI_MATCH(DMI_PRODUCT_NAME, "K501LB"), |
817 | + }, |
818 | + }, |
819 | + { |
820 | + .matches = { |
821 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
822 | + DMI_MATCH(DMI_PRODUCT_NAME, "K501LX"), |
823 | + }, |
824 | + }, |
825 | + { |
826 | + .matches = { |
827 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
828 | + DMI_MATCH(DMI_PRODUCT_NAME, "R409L"), |
829 | + }, |
830 | + }, |
831 | + { |
832 | + .matches = { |
833 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
834 | + DMI_MATCH(DMI_PRODUCT_NAME, "V502LX"), |
835 | + }, |
836 | + }, |
837 | + { |
838 | + .matches = { |
839 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
840 | + DMI_MATCH(DMI_PRODUCT_NAME, "X302LA"), |
841 | + }, |
842 | + }, |
843 | + { |
844 | + .matches = { |
845 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
846 | + DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"), |
847 | + }, |
848 | + }, |
849 | + { |
850 | + .matches = { |
851 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
852 | + DMI_MATCH(DMI_PRODUCT_NAME, "X450LD"), |
853 | + }, |
854 | + }, |
855 | + { |
856 | + .matches = { |
857 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
858 | + DMI_MATCH(DMI_PRODUCT_NAME, "X455LAB"), |
859 | + }, |
860 | + }, |
861 | + { |
862 | + .matches = { |
863 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
864 | + DMI_MATCH(DMI_PRODUCT_NAME, "X455LDB"), |
865 | + }, |
866 | + }, |
867 | + { |
868 | + .matches = { |
869 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
870 | + DMI_MATCH(DMI_PRODUCT_NAME, "X455LF"), |
871 | + }, |
872 | + }, |
873 | + { |
874 | + .matches = { |
875 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), |
876 | + DMI_MATCH(DMI_PRODUCT_NAME, "Z450LA"), |
877 | + }, |
878 | + }, |
879 | + { } |
880 | +}; |
881 | static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { |
882 | { |
883 | /* MSI Wind U-100 */ |
884 | @@ -1072,12 +1156,18 @@ static int __init i8042_platform_init(void) |
885 | return retval; |
886 | |
887 | #if defined(__ia64__) |
888 | - i8042_reset = true; |
889 | + i8042_reset = I8042_RESET_ALWAYS; |
890 | #endif |
891 | |
892 | #ifdef CONFIG_X86 |
893 | - if (dmi_check_system(i8042_dmi_reset_table)) |
894 | - i8042_reset = true; |
895 | + /* Honor module parameter when value is not default */ |
896 | + if (i8042_reset == I8042_RESET_DEFAULT) { |
897 | + if (dmi_check_system(i8042_dmi_reset_table)) |
898 | + i8042_reset = I8042_RESET_ALWAYS; |
899 | + |
900 | + if (dmi_check_system(i8042_dmi_noselftest_table)) |
901 | + i8042_reset = I8042_RESET_NEVER; |
902 | + } |
903 | |
904 | if (dmi_check_system(i8042_dmi_noloop_table)) |
905 | i8042_noloop = true; |
906 | diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c |
907 | index 405252a884dd..89abfdb539ac 100644 |
908 | --- a/drivers/input/serio/i8042.c |
909 | +++ b/drivers/input/serio/i8042.c |
910 | @@ -48,9 +48,39 @@ static bool i8042_unlock; |
911 | module_param_named(unlock, i8042_unlock, bool, 0); |
912 | MODULE_PARM_DESC(unlock, "Ignore keyboard lock."); |
913 | |
914 | -static bool i8042_reset; |
915 | -module_param_named(reset, i8042_reset, bool, 0); |
916 | -MODULE_PARM_DESC(reset, "Reset controller during init and cleanup."); |
917 | +enum i8042_controller_reset_mode { |
918 | + I8042_RESET_NEVER, |
919 | + I8042_RESET_ALWAYS, |
920 | + I8042_RESET_ON_S2RAM, |
921 | +#define I8042_RESET_DEFAULT I8042_RESET_ON_S2RAM |
922 | +}; |
923 | +static enum i8042_controller_reset_mode i8042_reset = I8042_RESET_DEFAULT; |
924 | +static int i8042_set_reset(const char *val, const struct kernel_param *kp) |
925 | +{ |
926 | + enum i8042_controller_reset_mode *arg = kp->arg; |
927 | + int error; |
928 | + bool reset; |
929 | + |
930 | + if (val) { |
931 | + error = kstrtobool(val, &reset); |
932 | + if (error) |
933 | + return error; |
934 | + } else { |
935 | + reset = true; |
936 | + } |
937 | + |
938 | + *arg = reset ? I8042_RESET_ALWAYS : I8042_RESET_NEVER; |
939 | + return 0; |
940 | +} |
941 | + |
942 | +static const struct kernel_param_ops param_ops_reset_param = { |
943 | + .flags = KERNEL_PARAM_OPS_FL_NOARG, |
944 | + .set = i8042_set_reset, |
945 | +}; |
946 | +#define param_check_reset_param(name, p) \ |
947 | + __param_check(name, p, enum i8042_controller_reset_mode) |
948 | +module_param_named(reset, i8042_reset, reset_param, 0); |
949 | +MODULE_PARM_DESC(reset, "Reset controller on resume, cleanup or both"); |
950 | |
951 | static bool i8042_direct; |
952 | module_param_named(direct, i8042_direct, bool, 0); |
953 | @@ -1019,7 +1049,7 @@ static int i8042_controller_init(void) |
954 | * Reset the controller and reset CRT to the original value set by BIOS. |
955 | */ |
956 | |
957 | -static void i8042_controller_reset(bool force_reset) |
958 | +static void i8042_controller_reset(bool s2r_wants_reset) |
959 | { |
960 | i8042_flush(); |
961 | |
962 | @@ -1044,8 +1074,10 @@ static void i8042_controller_reset(bool force_reset) |
963 | * Reset the controller if requested. |
964 | */ |
965 | |
966 | - if (i8042_reset || force_reset) |
967 | + if (i8042_reset == I8042_RESET_ALWAYS || |
968 | + (i8042_reset == I8042_RESET_ON_S2RAM && s2r_wants_reset)) { |
969 | i8042_controller_selftest(); |
970 | + } |
971 | |
972 | /* |
973 | * Restore the original control register setting. |
974 | @@ -1110,7 +1142,7 @@ static void i8042_dritek_enable(void) |
975 | * before suspending. |
976 | */ |
977 | |
978 | -static int i8042_controller_resume(bool force_reset) |
979 | +static int i8042_controller_resume(bool s2r_wants_reset) |
980 | { |
981 | int error; |
982 | |
983 | @@ -1118,7 +1150,8 @@ static int i8042_controller_resume(bool force_reset) |
984 | if (error) |
985 | return error; |
986 | |
987 | - if (i8042_reset || force_reset) { |
988 | + if (i8042_reset == I8042_RESET_ALWAYS || |
989 | + (i8042_reset == I8042_RESET_ON_S2RAM && s2r_wants_reset)) { |
990 | error = i8042_controller_selftest(); |
991 | if (error) |
992 | return error; |
993 | @@ -1195,7 +1228,7 @@ static int i8042_pm_resume_noirq(struct device *dev) |
994 | |
995 | static int i8042_pm_resume(struct device *dev) |
996 | { |
997 | - bool force_reset; |
998 | + bool want_reset; |
999 | int i; |
1000 | |
1001 | for (i = 0; i < I8042_NUM_PORTS; i++) { |
1002 | @@ -1218,9 +1251,9 @@ static int i8042_pm_resume(struct device *dev) |
1003 | * off control to the platform firmware, otherwise we can simply restore |
1004 | * the mode. |
1005 | */ |
1006 | - force_reset = pm_resume_via_firmware(); |
1007 | + want_reset = pm_resume_via_firmware(); |
1008 | |
1009 | - return i8042_controller_resume(force_reset); |
1010 | + return i8042_controller_resume(want_reset); |
1011 | } |
1012 | |
1013 | static int i8042_pm_thaw(struct device *dev) |
1014 | @@ -1482,7 +1515,7 @@ static int __init i8042_probe(struct platform_device *dev) |
1015 | |
1016 | i8042_platform_device = dev; |
1017 | |
1018 | - if (i8042_reset) { |
1019 | + if (i8042_reset == I8042_RESET_ALWAYS) { |
1020 | error = i8042_controller_selftest(); |
1021 | if (error) |
1022 | return error; |
1023 | diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c |
1024 | index 44aa57edf207..e33c729b9f48 100644 |
1025 | --- a/drivers/irqchip/irq-gic-v3.c |
1026 | +++ b/drivers/irqchip/irq-gic-v3.c |
1027 | @@ -142,7 +142,7 @@ static void gic_enable_redist(bool enable) |
1028 | return; /* No PM support in this redistributor */ |
1029 | } |
1030 | |
1031 | - while (count--) { |
1032 | + while (--count) { |
1033 | val = readl_relaxed(rbase + GICR_WAKER); |
1034 | if (enable ^ (val & GICR_WAKER_ChildrenAsleep)) |
1035 | break; |
1036 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c |
1037 | index 51eda7235e32..5cac11d7a876 100644 |
1038 | --- a/drivers/md/dm-crypt.c |
1039 | +++ b/drivers/md/dm-crypt.c |
1040 | @@ -112,8 +112,7 @@ struct iv_tcw_private { |
1041 | * and encrypts / decrypts at the same time. |
1042 | */ |
1043 | enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID, |
1044 | - DM_CRYPT_SAME_CPU, DM_CRYPT_NO_OFFLOAD, |
1045 | - DM_CRYPT_EXIT_THREAD}; |
1046 | + DM_CRYPT_SAME_CPU, DM_CRYPT_NO_OFFLOAD }; |
1047 | |
1048 | /* |
1049 | * The fields in here must be read only after initialization. |
1050 | @@ -1204,18 +1203,20 @@ continue_locked: |
1051 | if (!RB_EMPTY_ROOT(&cc->write_tree)) |
1052 | goto pop_from_list; |
1053 | |
1054 | - if (unlikely(test_bit(DM_CRYPT_EXIT_THREAD, &cc->flags))) { |
1055 | - spin_unlock_irq(&cc->write_thread_wait.lock); |
1056 | - break; |
1057 | - } |
1058 | - |
1059 | - __set_current_state(TASK_INTERRUPTIBLE); |
1060 | + set_current_state(TASK_INTERRUPTIBLE); |
1061 | __add_wait_queue(&cc->write_thread_wait, &wait); |
1062 | |
1063 | spin_unlock_irq(&cc->write_thread_wait.lock); |
1064 | |
1065 | + if (unlikely(kthread_should_stop())) { |
1066 | + set_task_state(current, TASK_RUNNING); |
1067 | + remove_wait_queue(&cc->write_thread_wait, &wait); |
1068 | + break; |
1069 | + } |
1070 | + |
1071 | schedule(); |
1072 | |
1073 | + set_task_state(current, TASK_RUNNING); |
1074 | spin_lock_irq(&cc->write_thread_wait.lock); |
1075 | __remove_wait_queue(&cc->write_thread_wait, &wait); |
1076 | goto continue_locked; |
1077 | @@ -1530,13 +1531,8 @@ static void crypt_dtr(struct dm_target *ti) |
1078 | if (!cc) |
1079 | return; |
1080 | |
1081 | - if (cc->write_thread) { |
1082 | - spin_lock_irq(&cc->write_thread_wait.lock); |
1083 | - set_bit(DM_CRYPT_EXIT_THREAD, &cc->flags); |
1084 | - wake_up_locked(&cc->write_thread_wait); |
1085 | - spin_unlock_irq(&cc->write_thread_wait.lock); |
1086 | + if (cc->write_thread) |
1087 | kthread_stop(cc->write_thread); |
1088 | - } |
1089 | |
1090 | if (cc->io_queue) |
1091 | destroy_workqueue(cc->io_queue); |
1092 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
1093 | index cfa29f574c2a..5b2ef966012b 100644 |
1094 | --- a/drivers/md/dm-mpath.c |
1095 | +++ b/drivers/md/dm-mpath.c |
1096 | @@ -1220,10 +1220,10 @@ static void activate_path(struct work_struct *work) |
1097 | { |
1098 | struct pgpath *pgpath = |
1099 | container_of(work, struct pgpath, activate_path.work); |
1100 | + struct request_queue *q = bdev_get_queue(pgpath->path.dev->bdev); |
1101 | |
1102 | - if (pgpath->is_active) |
1103 | - scsi_dh_activate(bdev_get_queue(pgpath->path.dev->bdev), |
1104 | - pg_init_done, pgpath); |
1105 | + if (pgpath->is_active && !blk_queue_dying(q)) |
1106 | + scsi_dh_activate(q, pg_init_done, pgpath); |
1107 | else |
1108 | pg_init_done(pgpath, SCSI_DH_DEV_OFFLINED); |
1109 | } |
1110 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
1111 | index a42729ebf272..84aa8b1d0480 100644 |
1112 | --- a/drivers/md/dm.c |
1113 | +++ b/drivers/md/dm.c |
1114 | @@ -2869,6 +2869,7 @@ EXPORT_SYMBOL_GPL(dm_device_name); |
1115 | |
1116 | static void __dm_destroy(struct mapped_device *md, bool wait) |
1117 | { |
1118 | + struct request_queue *q = dm_get_md_queue(md); |
1119 | struct dm_table *map; |
1120 | int srcu_idx; |
1121 | |
1122 | @@ -2879,6 +2880,10 @@ static void __dm_destroy(struct mapped_device *md, bool wait) |
1123 | set_bit(DMF_FREEING, &md->flags); |
1124 | spin_unlock(&_minor_lock); |
1125 | |
1126 | + spin_lock_irq(q->queue_lock); |
1127 | + queue_flag_set(QUEUE_FLAG_DYING, q); |
1128 | + spin_unlock_irq(q->queue_lock); |
1129 | + |
1130 | if (dm_request_based(md) && md->kworker_task) |
1131 | flush_kthread_worker(&md->kworker); |
1132 | |
1133 | @@ -3245,10 +3250,11 @@ static int __dm_resume(struct mapped_device *md, struct dm_table *map) |
1134 | |
1135 | int dm_resume(struct mapped_device *md) |
1136 | { |
1137 | - int r = -EINVAL; |
1138 | + int r; |
1139 | struct dm_table *map = NULL; |
1140 | |
1141 | retry: |
1142 | + r = -EINVAL; |
1143 | mutex_lock_nested(&md->suspend_lock, SINGLE_DEPTH_NESTING); |
1144 | |
1145 | if (!dm_suspended_md(md)) |
1146 | @@ -3272,8 +3278,6 @@ retry: |
1147 | goto out; |
1148 | |
1149 | clear_bit(DMF_SUSPENDED, &md->flags); |
1150 | - |
1151 | - r = 0; |
1152 | out: |
1153 | mutex_unlock(&md->suspend_lock); |
1154 | |
1155 | diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c |
1156 | index cfc005ee11d8..7fc72de2434c 100644 |
1157 | --- a/drivers/media/dvb-frontends/mb86a20s.c |
1158 | +++ b/drivers/media/dvb-frontends/mb86a20s.c |
1159 | @@ -71,25 +71,27 @@ static struct regdata mb86a20s_init1[] = { |
1160 | }; |
1161 | |
1162 | static struct regdata mb86a20s_init2[] = { |
1163 | - { 0x28, 0x22 }, { 0x29, 0x00 }, { 0x2a, 0x1f }, { 0x2b, 0xf0 }, |
1164 | + { 0x50, 0xd1 }, { 0x51, 0x22 }, |
1165 | + { 0x39, 0x01 }, |
1166 | + { 0x71, 0x00 }, |
1167 | { 0x3b, 0x21 }, |
1168 | - { 0x3c, 0x38 }, |
1169 | + { 0x3c, 0x3a }, |
1170 | { 0x01, 0x0d }, |
1171 | - { 0x04, 0x08 }, { 0x05, 0x03 }, |
1172 | + { 0x04, 0x08 }, { 0x05, 0x05 }, |
1173 | { 0x04, 0x0e }, { 0x05, 0x00 }, |
1174 | - { 0x04, 0x0f }, { 0x05, 0x37 }, |
1175 | - { 0x04, 0x0b }, { 0x05, 0x78 }, |
1176 | + { 0x04, 0x0f }, { 0x05, 0x14 }, |
1177 | + { 0x04, 0x0b }, { 0x05, 0x8c }, |
1178 | { 0x04, 0x00 }, { 0x05, 0x00 }, |
1179 | - { 0x04, 0x01 }, { 0x05, 0x1e }, |
1180 | - { 0x04, 0x02 }, { 0x05, 0x07 }, |
1181 | - { 0x04, 0x03 }, { 0x05, 0xd0 }, |
1182 | + { 0x04, 0x01 }, { 0x05, 0x07 }, |
1183 | + { 0x04, 0x02 }, { 0x05, 0x0f }, |
1184 | + { 0x04, 0x03 }, { 0x05, 0xa0 }, |
1185 | { 0x04, 0x09 }, { 0x05, 0x00 }, |
1186 | { 0x04, 0x0a }, { 0x05, 0xff }, |
1187 | - { 0x04, 0x27 }, { 0x05, 0x00 }, |
1188 | + { 0x04, 0x27 }, { 0x05, 0x64 }, |
1189 | { 0x04, 0x28 }, { 0x05, 0x00 }, |
1190 | - { 0x04, 0x1e }, { 0x05, 0x00 }, |
1191 | - { 0x04, 0x29 }, { 0x05, 0x64 }, |
1192 | - { 0x04, 0x32 }, { 0x05, 0x02 }, |
1193 | + { 0x04, 0x1e }, { 0x05, 0xff }, |
1194 | + { 0x04, 0x29 }, { 0x05, 0x0a }, |
1195 | + { 0x04, 0x32 }, { 0x05, 0x0a }, |
1196 | { 0x04, 0x14 }, { 0x05, 0x02 }, |
1197 | { 0x04, 0x04 }, { 0x05, 0x00 }, |
1198 | { 0x04, 0x05 }, { 0x05, 0x22 }, |
1199 | @@ -97,8 +99,6 @@ static struct regdata mb86a20s_init2[] = { |
1200 | { 0x04, 0x07 }, { 0x05, 0xd8 }, |
1201 | { 0x04, 0x12 }, { 0x05, 0x00 }, |
1202 | { 0x04, 0x13 }, { 0x05, 0xff }, |
1203 | - { 0x04, 0x15 }, { 0x05, 0x4e }, |
1204 | - { 0x04, 0x16 }, { 0x05, 0x20 }, |
1205 | |
1206 | /* |
1207 | * On this demod, when the bit count reaches the count below, |
1208 | @@ -152,42 +152,36 @@ static struct regdata mb86a20s_init2[] = { |
1209 | { 0x50, 0x51 }, { 0x51, 0x04 }, /* MER symbol 4 */ |
1210 | { 0x45, 0x04 }, /* CN symbol 4 */ |
1211 | { 0x48, 0x04 }, /* CN manual mode */ |
1212 | - |
1213 | + { 0x50, 0xd5 }, { 0x51, 0x01 }, |
1214 | { 0x50, 0xd6 }, { 0x51, 0x1f }, |
1215 | { 0x50, 0xd2 }, { 0x51, 0x03 }, |
1216 | - { 0x50, 0xd7 }, { 0x51, 0xbf }, |
1217 | - { 0x28, 0x74 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0xff }, |
1218 | - { 0x28, 0x46 }, { 0x29, 0x00 }, { 0x2a, 0x1a }, { 0x2b, 0x0c }, |
1219 | - |
1220 | - { 0x04, 0x40 }, { 0x05, 0x00 }, |
1221 | - { 0x28, 0x00 }, { 0x2b, 0x08 }, |
1222 | - { 0x28, 0x05 }, { 0x2b, 0x00 }, |
1223 | + { 0x50, 0xd7 }, { 0x51, 0x3f }, |
1224 | { 0x1c, 0x01 }, |
1225 | - { 0x28, 0x06 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x1f }, |
1226 | - { 0x28, 0x07 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x18 }, |
1227 | - { 0x28, 0x08 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x12 }, |
1228 | - { 0x28, 0x09 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x30 }, |
1229 | - { 0x28, 0x0a }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x37 }, |
1230 | - { 0x28, 0x0b }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x02 }, |
1231 | - { 0x28, 0x0c }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x09 }, |
1232 | - { 0x28, 0x0d }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x06 }, |
1233 | - { 0x28, 0x0e }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x7b }, |
1234 | - { 0x28, 0x0f }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x76 }, |
1235 | - { 0x28, 0x10 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x7d }, |
1236 | - { 0x28, 0x11 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x08 }, |
1237 | - { 0x28, 0x12 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0b }, |
1238 | - { 0x28, 0x13 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x00 }, |
1239 | - { 0x28, 0x14 }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0xf2 }, |
1240 | - { 0x28, 0x15 }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0xf3 }, |
1241 | - { 0x28, 0x16 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x05 }, |
1242 | - { 0x28, 0x17 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x16 }, |
1243 | - { 0x28, 0x18 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0f }, |
1244 | - { 0x28, 0x19 }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0xef }, |
1245 | - { 0x28, 0x1a }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0xd8 }, |
1246 | - { 0x28, 0x1b }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0xf1 }, |
1247 | - { 0x28, 0x1c }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x3d }, |
1248 | - { 0x28, 0x1d }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x94 }, |
1249 | - { 0x28, 0x1e }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0xba }, |
1250 | + { 0x28, 0x06 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x03 }, |
1251 | + { 0x28, 0x07 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0d }, |
1252 | + { 0x28, 0x08 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x02 }, |
1253 | + { 0x28, 0x09 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x01 }, |
1254 | + { 0x28, 0x0a }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x21 }, |
1255 | + { 0x28, 0x0b }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x29 }, |
1256 | + { 0x28, 0x0c }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x16 }, |
1257 | + { 0x28, 0x0d }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x31 }, |
1258 | + { 0x28, 0x0e }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0e }, |
1259 | + { 0x28, 0x0f }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x4e }, |
1260 | + { 0x28, 0x10 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x46 }, |
1261 | + { 0x28, 0x11 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0f }, |
1262 | + { 0x28, 0x12 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x56 }, |
1263 | + { 0x28, 0x13 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x35 }, |
1264 | + { 0x28, 0x14 }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0xbe }, |
1265 | + { 0x28, 0x15 }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0x84 }, |
1266 | + { 0x28, 0x16 }, { 0x29, 0x00 }, { 0x2a, 0x03 }, { 0x2b, 0xee }, |
1267 | + { 0x28, 0x17 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x98 }, |
1268 | + { 0x28, 0x18 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x9f }, |
1269 | + { 0x28, 0x19 }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0xb2 }, |
1270 | + { 0x28, 0x1a }, { 0x29, 0x00 }, { 0x2a, 0x06 }, { 0x2b, 0xc2 }, |
1271 | + { 0x28, 0x1b }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0x4a }, |
1272 | + { 0x28, 0x1c }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0xbc }, |
1273 | + { 0x28, 0x1d }, { 0x29, 0x00 }, { 0x2a, 0x04 }, { 0x2b, 0xba }, |
1274 | + { 0x28, 0x1e }, { 0x29, 0x00 }, { 0x2a, 0x06 }, { 0x2b, 0x14 }, |
1275 | { 0x50, 0x1e }, { 0x51, 0x5d }, |
1276 | { 0x50, 0x22 }, { 0x51, 0x00 }, |
1277 | { 0x50, 0x23 }, { 0x51, 0xc8 }, |
1278 | @@ -196,9 +190,7 @@ static struct regdata mb86a20s_init2[] = { |
1279 | { 0x50, 0x26 }, { 0x51, 0x00 }, |
1280 | { 0x50, 0x27 }, { 0x51, 0xc3 }, |
1281 | { 0x50, 0x39 }, { 0x51, 0x02 }, |
1282 | - { 0xec, 0x0f }, |
1283 | - { 0xeb, 0x1f }, |
1284 | - { 0x28, 0x6a }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x00 }, |
1285 | + { 0x50, 0xd5 }, { 0x51, 0x01 }, |
1286 | { 0xd0, 0x00 }, |
1287 | }; |
1288 | |
1289 | @@ -317,7 +309,11 @@ static int mb86a20s_read_status(struct dvb_frontend *fe, enum fe_status *status) |
1290 | if (val >= 7) |
1291 | *status |= FE_HAS_SYNC; |
1292 | |
1293 | - if (val >= 8) /* Maybe 9? */ |
1294 | + /* |
1295 | + * Actually, on state S8, it starts receiving TS, but the TS |
1296 | + * output is only on normal state after the transition to S9. |
1297 | + */ |
1298 | + if (val >= 9) |
1299 | *status |= FE_HAS_LOCK; |
1300 | |
1301 | dev_dbg(&state->i2c->dev, "%s: Status = 0x%02x (state = %d)\n", |
1302 | @@ -2067,6 +2063,11 @@ static void mb86a20s_release(struct dvb_frontend *fe) |
1303 | kfree(state); |
1304 | } |
1305 | |
1306 | +static int mb86a20s_get_frontend_algo(struct dvb_frontend *fe) |
1307 | +{ |
1308 | + return DVBFE_ALGO_HW; |
1309 | +} |
1310 | + |
1311 | static struct dvb_frontend_ops mb86a20s_ops; |
1312 | |
1313 | struct dvb_frontend *mb86a20s_attach(const struct mb86a20s_config *config, |
1314 | @@ -2140,6 +2141,7 @@ static struct dvb_frontend_ops mb86a20s_ops = { |
1315 | .read_status = mb86a20s_read_status_and_stats, |
1316 | .read_signal_strength = mb86a20s_read_signal_strength_from_cache, |
1317 | .tune = mb86a20s_tune, |
1318 | + .get_frontend_algo = mb86a20s_get_frontend_algo, |
1319 | }; |
1320 | |
1321 | MODULE_DESCRIPTION("DVB Frontend module for Fujitsu mb86A20s hardware"); |
1322 | diff --git a/drivers/media/usb/cx231xx/cx231xx-avcore.c b/drivers/media/usb/cx231xx/cx231xx-avcore.c |
1323 | index 491913778bcc..2f52d66b4dae 100644 |
1324 | --- a/drivers/media/usb/cx231xx/cx231xx-avcore.c |
1325 | +++ b/drivers/media/usb/cx231xx/cx231xx-avcore.c |
1326 | @@ -1264,7 +1264,10 @@ int cx231xx_set_agc_analog_digital_mux_select(struct cx231xx *dev, |
1327 | dev->board.agc_analog_digital_select_gpio, |
1328 | analog_or_digital); |
1329 | |
1330 | - return status; |
1331 | + if (status < 0) |
1332 | + return status; |
1333 | + |
1334 | + return 0; |
1335 | } |
1336 | |
1337 | int cx231xx_enable_i2c_port_3(struct cx231xx *dev, bool is_port_3) |
1338 | diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c |
1339 | index 4a117a58c39a..8389c162bc89 100644 |
1340 | --- a/drivers/media/usb/cx231xx/cx231xx-cards.c |
1341 | +++ b/drivers/media/usb/cx231xx/cx231xx-cards.c |
1342 | @@ -486,7 +486,7 @@ struct cx231xx_board cx231xx_boards[] = { |
1343 | .output_mode = OUT_MODE_VIP11, |
1344 | .demod_xfer_mode = 0, |
1345 | .ctl_pin_status_mask = 0xFFFFFFC4, |
1346 | - .agc_analog_digital_select_gpio = 0x00, /* According with PV cxPolaris.inf file */ |
1347 | + .agc_analog_digital_select_gpio = 0x1c, |
1348 | .tuner_sif_gpio = -1, |
1349 | .tuner_scl_gpio = -1, |
1350 | .tuner_sda_gpio = -1, |
1351 | diff --git a/drivers/media/usb/cx231xx/cx231xx-core.c b/drivers/media/usb/cx231xx/cx231xx-core.c |
1352 | index a2fd49b6be83..19b0293312a0 100644 |
1353 | --- a/drivers/media/usb/cx231xx/cx231xx-core.c |
1354 | +++ b/drivers/media/usb/cx231xx/cx231xx-core.c |
1355 | @@ -712,6 +712,7 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode) |
1356 | break; |
1357 | case CX231XX_BOARD_CNXT_RDE_253S: |
1358 | case CX231XX_BOARD_CNXT_RDU_253S: |
1359 | + case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID: |
1360 | errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1); |
1361 | break; |
1362 | case CX231XX_BOARD_HAUPPAUGE_EXETER: |
1363 | @@ -738,7 +739,7 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode) |
1364 | case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID: |
1365 | case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL: |
1366 | case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC: |
1367 | - errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0); |
1368 | + errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0); |
1369 | break; |
1370 | default: |
1371 | break; |
1372 | diff --git a/drivers/memstick/host/rtsx_usb_ms.c b/drivers/memstick/host/rtsx_usb_ms.c |
1373 | index 1105db2355d2..83bfb1659abe 100644 |
1374 | --- a/drivers/memstick/host/rtsx_usb_ms.c |
1375 | +++ b/drivers/memstick/host/rtsx_usb_ms.c |
1376 | @@ -524,6 +524,7 @@ static void rtsx_usb_ms_handle_req(struct work_struct *work) |
1377 | int rc; |
1378 | |
1379 | if (!host->req) { |
1380 | + pm_runtime_get_sync(ms_dev(host)); |
1381 | do { |
1382 | rc = memstick_next_req(msh, &host->req); |
1383 | dev_dbg(ms_dev(host), "next req %d\n", rc); |
1384 | @@ -544,6 +545,7 @@ static void rtsx_usb_ms_handle_req(struct work_struct *work) |
1385 | host->req->error); |
1386 | } |
1387 | } while (!rc); |
1388 | + pm_runtime_put(ms_dev(host)); |
1389 | } |
1390 | |
1391 | } |
1392 | @@ -570,6 +572,7 @@ static int rtsx_usb_ms_set_param(struct memstick_host *msh, |
1393 | dev_dbg(ms_dev(host), "%s: param = %d, value = %d\n", |
1394 | __func__, param, value); |
1395 | |
1396 | + pm_runtime_get_sync(ms_dev(host)); |
1397 | mutex_lock(&ucr->dev_mutex); |
1398 | |
1399 | err = rtsx_usb_card_exclusive_check(ucr, RTSX_USB_MS_CARD); |
1400 | @@ -635,6 +638,7 @@ static int rtsx_usb_ms_set_param(struct memstick_host *msh, |
1401 | } |
1402 | out: |
1403 | mutex_unlock(&ucr->dev_mutex); |
1404 | + pm_runtime_put(ms_dev(host)); |
1405 | |
1406 | /* power-on delay */ |
1407 | if (param == MEMSTICK_POWER && value == MEMSTICK_POWER_ON) |
1408 | @@ -681,6 +685,7 @@ static int rtsx_usb_detect_ms_card(void *__host) |
1409 | int err; |
1410 | |
1411 | for (;;) { |
1412 | + pm_runtime_get_sync(ms_dev(host)); |
1413 | mutex_lock(&ucr->dev_mutex); |
1414 | |
1415 | /* Check pending MS card changes */ |
1416 | @@ -703,6 +708,7 @@ static int rtsx_usb_detect_ms_card(void *__host) |
1417 | } |
1418 | |
1419 | poll_again: |
1420 | + pm_runtime_put(ms_dev(host)); |
1421 | if (host->eject) |
1422 | break; |
1423 | |
1424 | diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h |
1425 | index a8a68acd3267..4e8069866c85 100644 |
1426 | --- a/drivers/misc/mei/hw-me-regs.h |
1427 | +++ b/drivers/misc/mei/hw-me-regs.h |
1428 | @@ -66,6 +66,9 @@ |
1429 | #ifndef _MEI_HW_MEI_REGS_H_ |
1430 | #define _MEI_HW_MEI_REGS_H_ |
1431 | |
1432 | +#define MEI_DEV_ID_KBP 0xA2BA /* Kaby Point */ |
1433 | +#define MEI_DEV_ID_KBP_2 0xA2BB /* Kaby Point 2 */ |
1434 | + |
1435 | /* |
1436 | * MEI device IDs |
1437 | */ |
1438 | diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c |
1439 | index 27678d8154e0..0af3d7d30419 100644 |
1440 | --- a/drivers/misc/mei/pci-me.c |
1441 | +++ b/drivers/misc/mei/pci-me.c |
1442 | @@ -87,6 +87,9 @@ static const struct pci_device_id mei_me_pci_tbl[] = { |
1443 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H, mei_me_pch8_cfg)}, |
1444 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H_2, mei_me_pch8_cfg)}, |
1445 | |
1446 | + {MEI_PCI_DEVICE(MEI_DEV_ID_KBP, mei_me_pch8_cfg)}, |
1447 | + {MEI_PCI_DEVICE(MEI_DEV_ID_KBP_2, mei_me_pch8_cfg)}, |
1448 | + |
1449 | /* required last entry */ |
1450 | {0, } |
1451 | }; |
1452 | diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c |
1453 | index 64950035613b..f2b733275a0a 100644 |
1454 | --- a/drivers/mmc/card/block.c |
1455 | +++ b/drivers/mmc/card/block.c |
1456 | @@ -1755,7 +1755,7 @@ static void mmc_blk_packed_hdr_wrq_prep(struct mmc_queue_req *mqrq, |
1457 | struct mmc_blk_data *md = mq->data; |
1458 | struct mmc_packed *packed = mqrq->packed; |
1459 | bool do_rel_wr, do_data_tag; |
1460 | - u32 *packed_cmd_hdr; |
1461 | + __le32 *packed_cmd_hdr; |
1462 | u8 hdr_blocks; |
1463 | u8 i = 1; |
1464 | |
1465 | @@ -2279,7 +2279,8 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, |
1466 | set_capacity(md->disk, size); |
1467 | |
1468 | if (mmc_host_cmd23(card->host)) { |
1469 | - if (mmc_card_mmc(card) || |
1470 | + if ((mmc_card_mmc(card) && |
1471 | + card->csd.mmca_vsn >= CSD_SPEC_VER_3) || |
1472 | (mmc_card_sd(card) && |
1473 | card->scr.cmds & SD_SCR_CMD23_SUPPORT)) |
1474 | md->flags |= MMC_BLK_CMD23; |
1475 | diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h |
1476 | index 36cddab57d77..cf30b3712cb2 100644 |
1477 | --- a/drivers/mmc/card/queue.h |
1478 | +++ b/drivers/mmc/card/queue.h |
1479 | @@ -25,7 +25,7 @@ enum mmc_packed_type { |
1480 | |
1481 | struct mmc_packed { |
1482 | struct list_head list; |
1483 | - u32 cmd_hdr[1024]; |
1484 | + __le32 cmd_hdr[1024]; |
1485 | unsigned int blocks; |
1486 | u8 nr_entries; |
1487 | u8 retries; |
1488 | diff --git a/drivers/mmc/host/rtsx_usb_sdmmc.c b/drivers/mmc/host/rtsx_usb_sdmmc.c |
1489 | index 6c71fc9f76c7..da9f71b8deb0 100644 |
1490 | --- a/drivers/mmc/host/rtsx_usb_sdmmc.c |
1491 | +++ b/drivers/mmc/host/rtsx_usb_sdmmc.c |
1492 | @@ -1138,11 +1138,6 @@ static void sdmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) |
1493 | dev_dbg(sdmmc_dev(host), "%s\n", __func__); |
1494 | mutex_lock(&ucr->dev_mutex); |
1495 | |
1496 | - if (rtsx_usb_card_exclusive_check(ucr, RTSX_USB_SD_CARD)) { |
1497 | - mutex_unlock(&ucr->dev_mutex); |
1498 | - return; |
1499 | - } |
1500 | - |
1501 | sd_set_power_mode(host, ios->power_mode); |
1502 | sd_set_bus_width(host, ios->bus_width); |
1503 | sd_set_timing(host, ios->timing, &host->ddr_mode); |
1504 | @@ -1314,6 +1309,7 @@ static void rtsx_usb_update_led(struct work_struct *work) |
1505 | container_of(work, struct rtsx_usb_sdmmc, led_work); |
1506 | struct rtsx_ucr *ucr = host->ucr; |
1507 | |
1508 | + pm_runtime_get_sync(sdmmc_dev(host)); |
1509 | mutex_lock(&ucr->dev_mutex); |
1510 | |
1511 | if (host->led.brightness == LED_OFF) |
1512 | @@ -1322,6 +1318,7 @@ static void rtsx_usb_update_led(struct work_struct *work) |
1513 | rtsx_usb_turn_on_led(ucr); |
1514 | |
1515 | mutex_unlock(&ucr->dev_mutex); |
1516 | + pm_runtime_put(sdmmc_dev(host)); |
1517 | } |
1518 | #endif |
1519 | |
1520 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c |
1521 | index 552a34dc4f82..64a428984afe 100644 |
1522 | --- a/drivers/mmc/host/sdhci.c |
1523 | +++ b/drivers/mmc/host/sdhci.c |
1524 | @@ -675,7 +675,7 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) |
1525 | * host->clock is in Hz. target_timeout is in us. |
1526 | * Hence, us = 1000000 * cycles / Hz. Round up. |
1527 | */ |
1528 | - val = 1000000 * data->timeout_clks; |
1529 | + val = 1000000ULL * data->timeout_clks; |
1530 | if (do_div(val, host->clock)) |
1531 | target_timeout++; |
1532 | target_timeout += val; |
1533 | diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c |
1534 | index 56065632a5b8..75286588b823 100644 |
1535 | --- a/drivers/mtd/ubi/wl.c |
1536 | +++ b/drivers/mtd/ubi/wl.c |
1537 | @@ -643,7 +643,7 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, |
1538 | int shutdown) |
1539 | { |
1540 | int err, scrubbing = 0, torture = 0, protect = 0, erroneous = 0; |
1541 | - int vol_id = -1, lnum = -1; |
1542 | + int erase = 0, keep = 0, vol_id = -1, lnum = -1; |
1543 | #ifdef CONFIG_MTD_UBI_FASTMAP |
1544 | int anchor = wrk->anchor; |
1545 | #endif |
1546 | @@ -777,6 +777,16 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, |
1547 | e1->pnum); |
1548 | scrubbing = 1; |
1549 | goto out_not_moved; |
1550 | + } else if (ubi->fast_attach && err == UBI_IO_BAD_HDR_EBADMSG) { |
1551 | + /* |
1552 | + * While a full scan would detect interrupted erasures |
1553 | + * at attach time we can face them here when attached from |
1554 | + * Fastmap. |
1555 | + */ |
1556 | + dbg_wl("PEB %d has ECC errors, maybe from an interrupted erasure", |
1557 | + e1->pnum); |
1558 | + erase = 1; |
1559 | + goto out_not_moved; |
1560 | } |
1561 | |
1562 | ubi_err(ubi, "error %d while reading VID header from PEB %d", |
1563 | @@ -810,6 +820,7 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, |
1564 | * Target PEB had bit-flips or write error - torture it. |
1565 | */ |
1566 | torture = 1; |
1567 | + keep = 1; |
1568 | goto out_not_moved; |
1569 | } |
1570 | |
1571 | @@ -895,7 +906,7 @@ out_not_moved: |
1572 | ubi->erroneous_peb_count += 1; |
1573 | } else if (scrubbing) |
1574 | wl_tree_add(e1, &ubi->scrub); |
1575 | - else |
1576 | + else if (keep) |
1577 | wl_tree_add(e1, &ubi->used); |
1578 | ubi_assert(!ubi->move_to_put); |
1579 | ubi->move_from = ubi->move_to = NULL; |
1580 | @@ -907,6 +918,12 @@ out_not_moved: |
1581 | if (err) |
1582 | goto out_ro; |
1583 | |
1584 | + if (erase) { |
1585 | + err = do_sync_erase(ubi, e1, vol_id, lnum, 1); |
1586 | + if (err) |
1587 | + goto out_ro; |
1588 | + } |
1589 | + |
1590 | mutex_unlock(&ubi->move_mutex); |
1591 | return 0; |
1592 | |
1593 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
1594 | index 2e611dc5f162..1c8123816745 100644 |
1595 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
1596 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c |
1597 | @@ -14819,6 +14819,10 @@ static int bnx2x_get_fc_npiv(struct net_device *dev, |
1598 | } |
1599 | |
1600 | offset = SHMEM2_RD(bp, fc_npiv_nvram_tbl_addr[BP_PORT(bp)]); |
1601 | + if (!offset) { |
1602 | + DP(BNX2X_MSG_MCP, "No FC-NPIV in NVRAM\n"); |
1603 | + goto out; |
1604 | + } |
1605 | DP(BNX2X_MSG_MCP, "Offset of FC-NPIV in NVRAM: %08x\n", offset); |
1606 | |
1607 | /* Read the table contents from nvram */ |
1608 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1609 | index 67e9633ea9c7..232191417b93 100644 |
1610 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1611 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c |
1612 | @@ -2282,7 +2282,7 @@ static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac) |
1613 | struct mlx4_en_dev *mdev = en_priv->mdev; |
1614 | u64 mac_u64 = mlx4_mac_to_u64(mac); |
1615 | |
1616 | - if (!is_valid_ether_addr(mac)) |
1617 | + if (is_multicast_ether_addr(mac)) |
1618 | return -EINVAL; |
1619 | |
1620 | return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64); |
1621 | diff --git a/drivers/net/wireless/realtek/rtlwifi/regd.c b/drivers/net/wireless/realtek/rtlwifi/regd.c |
1622 | index 5be34118e0af..f67e7e5b13e1 100644 |
1623 | --- a/drivers/net/wireless/realtek/rtlwifi/regd.c |
1624 | +++ b/drivers/net/wireless/realtek/rtlwifi/regd.c |
1625 | @@ -345,9 +345,9 @@ static const struct ieee80211_regdomain *_rtl_regdomain_select( |
1626 | return &rtl_regdom_no_midband; |
1627 | case COUNTRY_CODE_IC: |
1628 | return &rtl_regdom_11; |
1629 | - case COUNTRY_CODE_ETSI: |
1630 | case COUNTRY_CODE_TELEC_NETGEAR: |
1631 | return &rtl_regdom_60_64; |
1632 | + case COUNTRY_CODE_ETSI: |
1633 | case COUNTRY_CODE_SPAIN: |
1634 | case COUNTRY_CODE_FRANCE: |
1635 | case COUNTRY_CODE_ISRAEL: |
1636 | @@ -406,6 +406,8 @@ static u8 channel_plan_to_country_code(u8 channelplan) |
1637 | return COUNTRY_CODE_WORLD_WIDE_13; |
1638 | case 0x22: |
1639 | return COUNTRY_CODE_IC; |
1640 | + case 0x25: |
1641 | + return COUNTRY_CODE_ETSI; |
1642 | case 0x32: |
1643 | return COUNTRY_CODE_TELEC_NETGEAR; |
1644 | case 0x41: |
1645 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
1646 | index 42774bc39786..254192b5dad1 100644 |
1647 | --- a/drivers/pci/quirks.c |
1648 | +++ b/drivers/pci/quirks.c |
1649 | @@ -3136,6 +3136,7 @@ static void quirk_no_bus_reset(struct pci_dev *dev) |
1650 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset); |
1651 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset); |
1652 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); |
1653 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset); |
1654 | |
1655 | static void quirk_no_pm_reset(struct pci_dev *dev) |
1656 | { |
1657 | diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c |
1658 | index fb991ec76423..696116ebdf50 100644 |
1659 | --- a/drivers/regulator/tps65910-regulator.c |
1660 | +++ b/drivers/regulator/tps65910-regulator.c |
1661 | @@ -1111,6 +1111,12 @@ static int tps65910_probe(struct platform_device *pdev) |
1662 | pmic->num_regulators = ARRAY_SIZE(tps65910_regs); |
1663 | pmic->ext_sleep_control = tps65910_ext_sleep_control; |
1664 | info = tps65910_regs; |
1665 | + /* Work around silicon erratum SWCZ010: output programmed |
1666 | + * voltage level can go higher than expected or crash |
1667 | + * Workaround: use no synchronization of DCDC clocks |
1668 | + */ |
1669 | + tps65910_reg_clear_bits(pmic->mfd, TPS65910_DCDCCTRL, |
1670 | + DCDCCTRL_DCDCCKSYNC_MASK); |
1671 | break; |
1672 | case TPS65911: |
1673 | pmic->get_ctrl_reg = &tps65911_get_ctrl_register; |
1674 | diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c |
1675 | index 5d7fbe4e907e..581001989937 100644 |
1676 | --- a/drivers/s390/scsi/zfcp_dbf.c |
1677 | +++ b/drivers/s390/scsi/zfcp_dbf.c |
1678 | @@ -3,7 +3,7 @@ |
1679 | * |
1680 | * Debug traces for zfcp. |
1681 | * |
1682 | - * Copyright IBM Corp. 2002, 2013 |
1683 | + * Copyright IBM Corp. 2002, 2016 |
1684 | */ |
1685 | |
1686 | #define KMSG_COMPONENT "zfcp" |
1687 | @@ -65,7 +65,7 @@ void zfcp_dbf_pl_write(struct zfcp_dbf *dbf, void *data, u16 length, char *area, |
1688 | * @tag: tag indicating which kind of unsolicited status has been received |
1689 | * @req: request for which a response was received |
1690 | */ |
1691 | -void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req) |
1692 | +void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req) |
1693 | { |
1694 | struct zfcp_dbf *dbf = req->adapter->dbf; |
1695 | struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix; |
1696 | @@ -85,6 +85,8 @@ void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req) |
1697 | rec->u.res.req_issued = req->issued; |
1698 | rec->u.res.prot_status = q_pref->prot_status; |
1699 | rec->u.res.fsf_status = q_head->fsf_status; |
1700 | + rec->u.res.port_handle = q_head->port_handle; |
1701 | + rec->u.res.lun_handle = q_head->lun_handle; |
1702 | |
1703 | memcpy(rec->u.res.prot_status_qual, &q_pref->prot_status_qual, |
1704 | FSF_PROT_STATUS_QUAL_SIZE); |
1705 | @@ -97,7 +99,7 @@ void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req) |
1706 | rec->pl_len, "fsf_res", req->req_id); |
1707 | } |
1708 | |
1709 | - debug_event(dbf->hba, 1, rec, sizeof(*rec)); |
1710 | + debug_event(dbf->hba, level, rec, sizeof(*rec)); |
1711 | spin_unlock_irqrestore(&dbf->hba_lock, flags); |
1712 | } |
1713 | |
1714 | @@ -241,7 +243,8 @@ static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec, |
1715 | if (sdev) { |
1716 | rec->lun_status = atomic_read(&sdev_to_zfcp(sdev)->status); |
1717 | rec->lun = zfcp_scsi_dev_lun(sdev); |
1718 | - } |
1719 | + } else |
1720 | + rec->lun = ZFCP_DBF_INVALID_LUN; |
1721 | } |
1722 | |
1723 | /** |
1724 | @@ -320,13 +323,48 @@ void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp) |
1725 | spin_unlock_irqrestore(&dbf->rec_lock, flags); |
1726 | } |
1727 | |
1728 | +/** |
1729 | + * zfcp_dbf_rec_run_wka - trace wka port event with info like running recovery |
1730 | + * @tag: identifier for event |
1731 | + * @wka_port: well known address port |
1732 | + * @req_id: request ID to correlate with potential HBA trace record |
1733 | + */ |
1734 | +void zfcp_dbf_rec_run_wka(char *tag, struct zfcp_fc_wka_port *wka_port, |
1735 | + u64 req_id) |
1736 | +{ |
1737 | + struct zfcp_dbf *dbf = wka_port->adapter->dbf; |
1738 | + struct zfcp_dbf_rec *rec = &dbf->rec_buf; |
1739 | + unsigned long flags; |
1740 | + |
1741 | + spin_lock_irqsave(&dbf->rec_lock, flags); |
1742 | + memset(rec, 0, sizeof(*rec)); |
1743 | + |
1744 | + rec->id = ZFCP_DBF_REC_RUN; |
1745 | + memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
1746 | + rec->port_status = wka_port->status; |
1747 | + rec->d_id = wka_port->d_id; |
1748 | + rec->lun = ZFCP_DBF_INVALID_LUN; |
1749 | + |
1750 | + rec->u.run.fsf_req_id = req_id; |
1751 | + rec->u.run.rec_status = ~0; |
1752 | + rec->u.run.rec_step = ~0; |
1753 | + rec->u.run.rec_action = ~0; |
1754 | + rec->u.run.rec_count = ~0; |
1755 | + |
1756 | + debug_event(dbf->rec, 1, rec, sizeof(*rec)); |
1757 | + spin_unlock_irqrestore(&dbf->rec_lock, flags); |
1758 | +} |
1759 | + |
1760 | static inline |
1761 | -void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf, void *data, u8 id, u16 len, |
1762 | - u64 req_id, u32 d_id) |
1763 | +void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf, |
1764 | + char *paytag, struct scatterlist *sg, u8 id, u16 len, |
1765 | + u64 req_id, u32 d_id, u16 cap_len) |
1766 | { |
1767 | struct zfcp_dbf_san *rec = &dbf->san_buf; |
1768 | u16 rec_len; |
1769 | unsigned long flags; |
1770 | + struct zfcp_dbf_pay *payload = &dbf->pay_buf; |
1771 | + u16 pay_sum = 0; |
1772 | |
1773 | spin_lock_irqsave(&dbf->san_lock, flags); |
1774 | memset(rec, 0, sizeof(*rec)); |
1775 | @@ -334,10 +372,41 @@ void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf, void *data, u8 id, u16 len, |
1776 | rec->id = id; |
1777 | rec->fsf_req_id = req_id; |
1778 | rec->d_id = d_id; |
1779 | - rec_len = min(len, (u16)ZFCP_DBF_SAN_MAX_PAYLOAD); |
1780 | - memcpy(rec->payload, data, rec_len); |
1781 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
1782 | + rec->pl_len = len; /* full length even if we cap pay below */ |
1783 | + if (!sg) |
1784 | + goto out; |
1785 | + rec_len = min_t(unsigned int, sg->length, ZFCP_DBF_SAN_MAX_PAYLOAD); |
1786 | + memcpy(rec->payload, sg_virt(sg), rec_len); /* part of 1st sg entry */ |
1787 | + if (len <= rec_len) |
1788 | + goto out; /* skip pay record if full content in rec->payload */ |
1789 | + |
1790 | + /* if (len > rec_len): |
1791 | + * dump data up to cap_len ignoring small duplicate in rec->payload |
1792 | + */ |
1793 | + spin_lock(&dbf->pay_lock); |
1794 | + memset(payload, 0, sizeof(*payload)); |
1795 | + memcpy(payload->area, paytag, ZFCP_DBF_TAG_LEN); |
1796 | + payload->fsf_req_id = req_id; |
1797 | + payload->counter = 0; |
1798 | + for (; sg && pay_sum < cap_len; sg = sg_next(sg)) { |
1799 | + u16 pay_len, offset = 0; |
1800 | + |
1801 | + while (offset < sg->length && pay_sum < cap_len) { |
1802 | + pay_len = min((u16)ZFCP_DBF_PAY_MAX_REC, |
1803 | + (u16)(sg->length - offset)); |
1804 | + /* cap_len <= pay_sum < cap_len+ZFCP_DBF_PAY_MAX_REC */ |
1805 | + memcpy(payload->data, sg_virt(sg) + offset, pay_len); |
1806 | + debug_event(dbf->pay, 1, payload, |
1807 | + zfcp_dbf_plen(pay_len)); |
1808 | + payload->counter++; |
1809 | + offset += pay_len; |
1810 | + pay_sum += pay_len; |
1811 | + } |
1812 | + } |
1813 | + spin_unlock(&dbf->pay_lock); |
1814 | |
1815 | +out: |
1816 | debug_event(dbf->san, 1, rec, sizeof(*rec)); |
1817 | spin_unlock_irqrestore(&dbf->san_lock, flags); |
1818 | } |
1819 | @@ -354,9 +423,62 @@ void zfcp_dbf_san_req(char *tag, struct zfcp_fsf_req *fsf, u32 d_id) |
1820 | struct zfcp_fsf_ct_els *ct_els = fsf->data; |
1821 | u16 length; |
1822 | |
1823 | - length = (u16)(ct_els->req->length + FC_CT_HDR_LEN); |
1824 | - zfcp_dbf_san(tag, dbf, sg_virt(ct_els->req), ZFCP_DBF_SAN_REQ, length, |
1825 | - fsf->req_id, d_id); |
1826 | + length = (u16)zfcp_qdio_real_bytes(ct_els->req); |
1827 | + zfcp_dbf_san(tag, dbf, "san_req", ct_els->req, ZFCP_DBF_SAN_REQ, |
1828 | + length, fsf->req_id, d_id, length); |
1829 | +} |
1830 | + |
1831 | +static u16 zfcp_dbf_san_res_cap_len_if_gpn_ft(char *tag, |
1832 | + struct zfcp_fsf_req *fsf, |
1833 | + u16 len) |
1834 | +{ |
1835 | + struct zfcp_fsf_ct_els *ct_els = fsf->data; |
1836 | + struct fc_ct_hdr *reqh = sg_virt(ct_els->req); |
1837 | + struct fc_ns_gid_ft *reqn = (struct fc_ns_gid_ft *)(reqh + 1); |
1838 | + struct scatterlist *resp_entry = ct_els->resp; |
1839 | + struct fc_gpn_ft_resp *acc; |
1840 | + int max_entries, x, last = 0; |
1841 | + |
1842 | + if (!(memcmp(tag, "fsscth2", 7) == 0 |
1843 | + && ct_els->d_id == FC_FID_DIR_SERV |
1844 | + && reqh->ct_rev == FC_CT_REV |
1845 | + && reqh->ct_in_id[0] == 0 |
1846 | + && reqh->ct_in_id[1] == 0 |
1847 | + && reqh->ct_in_id[2] == 0 |
1848 | + && reqh->ct_fs_type == FC_FST_DIR |
1849 | + && reqh->ct_fs_subtype == FC_NS_SUBTYPE |
1850 | + && reqh->ct_options == 0 |
1851 | + && reqh->_ct_resvd1 == 0 |
1852 | + && reqh->ct_cmd == FC_NS_GPN_FT |
1853 | + /* reqh->ct_mr_size can vary so do not match but read below */ |
1854 | + && reqh->_ct_resvd2 == 0 |
1855 | + && reqh->ct_reason == 0 |
1856 | + && reqh->ct_explan == 0 |
1857 | + && reqh->ct_vendor == 0 |
1858 | + && reqn->fn_resvd == 0 |
1859 | + && reqn->fn_domain_id_scope == 0 |
1860 | + && reqn->fn_area_id_scope == 0 |
1861 | + && reqn->fn_fc4_type == FC_TYPE_FCP)) |
1862 | + return len; /* not GPN_FT response so do not cap */ |
1863 | + |
1864 | + acc = sg_virt(resp_entry); |
1865 | + max_entries = (reqh->ct_mr_size * 4 / sizeof(struct fc_gpn_ft_resp)) |
1866 | + + 1 /* zfcp_fc_scan_ports: bytes correct, entries off-by-one |
1867 | + * to account for header as 1st pseudo "entry" */; |
1868 | + |
1869 | + /* the basic CT_IU preamble is the same size as one entry in the GPN_FT |
1870 | + * response, allowing us to skip special handling for it - just skip it |
1871 | + */ |
1872 | + for (x = 1; x < max_entries && !last; x++) { |
1873 | + if (x % (ZFCP_FC_GPN_FT_ENT_PAGE + 1)) |
1874 | + acc++; |
1875 | + else |
1876 | + acc = sg_virt(++resp_entry); |
1877 | + |
1878 | + last = acc->fp_flags & FC_NS_FID_LAST; |
1879 | + } |
1880 | + len = min(len, (u16)(x * sizeof(struct fc_gpn_ft_resp))); |
1881 | + return len; /* cap after last entry */ |
1882 | } |
1883 | |
1884 | /** |
1885 | @@ -370,9 +492,10 @@ void zfcp_dbf_san_res(char *tag, struct zfcp_fsf_req *fsf) |
1886 | struct zfcp_fsf_ct_els *ct_els = fsf->data; |
1887 | u16 length; |
1888 | |
1889 | - length = (u16)(ct_els->resp->length + FC_CT_HDR_LEN); |
1890 | - zfcp_dbf_san(tag, dbf, sg_virt(ct_els->resp), ZFCP_DBF_SAN_RES, length, |
1891 | - fsf->req_id, 0); |
1892 | + length = (u16)zfcp_qdio_real_bytes(ct_els->resp); |
1893 | + zfcp_dbf_san(tag, dbf, "san_res", ct_els->resp, ZFCP_DBF_SAN_RES, |
1894 | + length, fsf->req_id, ct_els->d_id, |
1895 | + zfcp_dbf_san_res_cap_len_if_gpn_ft(tag, fsf, length)); |
1896 | } |
1897 | |
1898 | /** |
1899 | @@ -386,11 +509,13 @@ void zfcp_dbf_san_in_els(char *tag, struct zfcp_fsf_req *fsf) |
1900 | struct fsf_status_read_buffer *srb = |
1901 | (struct fsf_status_read_buffer *) fsf->data; |
1902 | u16 length; |
1903 | + struct scatterlist sg; |
1904 | |
1905 | length = (u16)(srb->length - |
1906 | offsetof(struct fsf_status_read_buffer, payload)); |
1907 | - zfcp_dbf_san(tag, dbf, srb->payload.data, ZFCP_DBF_SAN_ELS, length, |
1908 | - fsf->req_id, ntoh24(srb->d_id)); |
1909 | + sg_init_one(&sg, srb->payload.data, length); |
1910 | + zfcp_dbf_san(tag, dbf, "san_els", &sg, ZFCP_DBF_SAN_ELS, length, |
1911 | + fsf->req_id, ntoh24(srb->d_id), length); |
1912 | } |
1913 | |
1914 | /** |
1915 | @@ -399,7 +524,8 @@ void zfcp_dbf_san_in_els(char *tag, struct zfcp_fsf_req *fsf) |
1916 | * @sc: pointer to struct scsi_cmnd |
1917 | * @fsf: pointer to struct zfcp_fsf_req |
1918 | */ |
1919 | -void zfcp_dbf_scsi(char *tag, struct scsi_cmnd *sc, struct zfcp_fsf_req *fsf) |
1920 | +void zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *sc, |
1921 | + struct zfcp_fsf_req *fsf) |
1922 | { |
1923 | struct zfcp_adapter *adapter = |
1924 | (struct zfcp_adapter *) sc->device->host->hostdata[0]; |
1925 | @@ -442,7 +568,7 @@ void zfcp_dbf_scsi(char *tag, struct scsi_cmnd *sc, struct zfcp_fsf_req *fsf) |
1926 | } |
1927 | } |
1928 | |
1929 | - debug_event(dbf->scsi, 1, rec, sizeof(*rec)); |
1930 | + debug_event(dbf->scsi, level, rec, sizeof(*rec)); |
1931 | spin_unlock_irqrestore(&dbf->scsi_lock, flags); |
1932 | } |
1933 | |
1934 | diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h |
1935 | index 0be3d48681ae..36d07584271d 100644 |
1936 | --- a/drivers/s390/scsi/zfcp_dbf.h |
1937 | +++ b/drivers/s390/scsi/zfcp_dbf.h |
1938 | @@ -2,7 +2,7 @@ |
1939 | * zfcp device driver |
1940 | * debug feature declarations |
1941 | * |
1942 | - * Copyright IBM Corp. 2008, 2010 |
1943 | + * Copyright IBM Corp. 2008, 2015 |
1944 | */ |
1945 | |
1946 | #ifndef ZFCP_DBF_H |
1947 | @@ -17,6 +17,11 @@ |
1948 | |
1949 | #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull |
1950 | |
1951 | +enum zfcp_dbf_pseudo_erp_act_type { |
1952 | + ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD = 0xff, |
1953 | + ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL = 0xfe, |
1954 | +}; |
1955 | + |
1956 | /** |
1957 | * struct zfcp_dbf_rec_trigger - trace record for triggered recovery action |
1958 | * @ready: number of ready recovery actions |
1959 | @@ -110,6 +115,7 @@ struct zfcp_dbf_san { |
1960 | u32 d_id; |
1961 | #define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32) |
1962 | char payload[ZFCP_DBF_SAN_MAX_PAYLOAD]; |
1963 | + u16 pl_len; |
1964 | } __packed; |
1965 | |
1966 | /** |
1967 | @@ -126,6 +132,8 @@ struct zfcp_dbf_hba_res { |
1968 | u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE]; |
1969 | u32 fsf_status; |
1970 | u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE]; |
1971 | + u32 port_handle; |
1972 | + u32 lun_handle; |
1973 | } __packed; |
1974 | |
1975 | /** |
1976 | @@ -279,7 +287,7 @@ static inline |
1977 | void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req) |
1978 | { |
1979 | if (debug_level_enabled(req->adapter->dbf->hba, level)) |
1980 | - zfcp_dbf_hba_fsf_res(tag, req); |
1981 | + zfcp_dbf_hba_fsf_res(tag, level, req); |
1982 | } |
1983 | |
1984 | /** |
1985 | @@ -318,7 +326,7 @@ void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd, |
1986 | scmd->device->host->hostdata[0]; |
1987 | |
1988 | if (debug_level_enabled(adapter->dbf->scsi, level)) |
1989 | - zfcp_dbf_scsi(tag, scmd, req); |
1990 | + zfcp_dbf_scsi(tag, level, scmd, req); |
1991 | } |
1992 | |
1993 | /** |
1994 | diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c |
1995 | index 3fb410977014..a59d678125bd 100644 |
1996 | --- a/drivers/s390/scsi/zfcp_erp.c |
1997 | +++ b/drivers/s390/scsi/zfcp_erp.c |
1998 | @@ -3,7 +3,7 @@ |
1999 | * |
2000 | * Error Recovery Procedures (ERP). |
2001 | * |
2002 | - * Copyright IBM Corp. 2002, 2010 |
2003 | + * Copyright IBM Corp. 2002, 2015 |
2004 | */ |
2005 | |
2006 | #define KMSG_COMPONENT "zfcp" |
2007 | @@ -1217,8 +1217,14 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result) |
2008 | break; |
2009 | |
2010 | case ZFCP_ERP_ACTION_REOPEN_PORT: |
2011 | - if (result == ZFCP_ERP_SUCCEEDED) |
2012 | - zfcp_scsi_schedule_rport_register(port); |
2013 | + /* This switch case might also happen after a forced reopen |
2014 | + * was successfully done and thus overwritten with a new |
2015 | + * non-forced reopen at `ersfs_2'. In this case, we must not |
2016 | + * do the clean-up of the non-forced version. |
2017 | + */ |
2018 | + if (act->step != ZFCP_ERP_STEP_UNINITIALIZED) |
2019 | + if (result == ZFCP_ERP_SUCCEEDED) |
2020 | + zfcp_scsi_schedule_rport_register(port); |
2021 | /* fall through */ |
2022 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: |
2023 | put_device(&port->dev); |
2024 | diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h |
2025 | index 5b500652572b..c8fed9fa1cca 100644 |
2026 | --- a/drivers/s390/scsi/zfcp_ext.h |
2027 | +++ b/drivers/s390/scsi/zfcp_ext.h |
2028 | @@ -3,7 +3,7 @@ |
2029 | * |
2030 | * External function declarations. |
2031 | * |
2032 | - * Copyright IBM Corp. 2002, 2010 |
2033 | + * Copyright IBM Corp. 2002, 2015 |
2034 | */ |
2035 | |
2036 | #ifndef ZFCP_EXT_H |
2037 | @@ -35,8 +35,9 @@ extern void zfcp_dbf_adapter_unregister(struct zfcp_adapter *); |
2038 | extern void zfcp_dbf_rec_trig(char *, struct zfcp_adapter *, |
2039 | struct zfcp_port *, struct scsi_device *, u8, u8); |
2040 | extern void zfcp_dbf_rec_run(char *, struct zfcp_erp_action *); |
2041 | +extern void zfcp_dbf_rec_run_wka(char *, struct zfcp_fc_wka_port *, u64); |
2042 | extern void zfcp_dbf_hba_fsf_uss(char *, struct zfcp_fsf_req *); |
2043 | -extern void zfcp_dbf_hba_fsf_res(char *, struct zfcp_fsf_req *); |
2044 | +extern void zfcp_dbf_hba_fsf_res(char *, int, struct zfcp_fsf_req *); |
2045 | extern void zfcp_dbf_hba_bit_err(char *, struct zfcp_fsf_req *); |
2046 | extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *); |
2047 | extern void zfcp_dbf_hba_def_err(struct zfcp_adapter *, u64, u16, void **); |
2048 | @@ -44,7 +45,8 @@ extern void zfcp_dbf_hba_basic(char *, struct zfcp_adapter *); |
2049 | extern void zfcp_dbf_san_req(char *, struct zfcp_fsf_req *, u32); |
2050 | extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *); |
2051 | extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *); |
2052 | -extern void zfcp_dbf_scsi(char *, struct scsi_cmnd *, struct zfcp_fsf_req *); |
2053 | +extern void zfcp_dbf_scsi(char *, int, struct scsi_cmnd *, |
2054 | + struct zfcp_fsf_req *); |
2055 | |
2056 | /* zfcp_erp.c */ |
2057 | extern void zfcp_erp_set_adapter_status(struct zfcp_adapter *, u32); |
2058 | diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c |
2059 | index 522a633c866a..75f820ca17b7 100644 |
2060 | --- a/drivers/s390/scsi/zfcp_fsf.c |
2061 | +++ b/drivers/s390/scsi/zfcp_fsf.c |
2062 | @@ -3,7 +3,7 @@ |
2063 | * |
2064 | * Implementation of FSF commands. |
2065 | * |
2066 | - * Copyright IBM Corp. 2002, 2013 |
2067 | + * Copyright IBM Corp. 2002, 2015 |
2068 | */ |
2069 | |
2070 | #define KMSG_COMPONENT "zfcp" |
2071 | @@ -508,7 +508,10 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) |
2072 | fc_host_port_type(shost) = FC_PORTTYPE_PTP; |
2073 | break; |
2074 | case FSF_TOPO_FABRIC: |
2075 | - fc_host_port_type(shost) = FC_PORTTYPE_NPORT; |
2076 | + if (bottom->connection_features & FSF_FEATURE_NPIV_MODE) |
2077 | + fc_host_port_type(shost) = FC_PORTTYPE_NPIV; |
2078 | + else |
2079 | + fc_host_port_type(shost) = FC_PORTTYPE_NPORT; |
2080 | break; |
2081 | case FSF_TOPO_AL: |
2082 | fc_host_port_type(shost) = FC_PORTTYPE_NLPORT; |
2083 | @@ -613,7 +616,6 @@ static void zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *req) |
2084 | |
2085 | if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) { |
2086 | fc_host_permanent_port_name(shost) = bottom->wwpn; |
2087 | - fc_host_port_type(shost) = FC_PORTTYPE_NPIV; |
2088 | } else |
2089 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); |
2090 | fc_host_maxframe_size(shost) = bottom->maximum_frame_size; |
2091 | @@ -982,8 +984,12 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, |
2092 | if (zfcp_adapter_multi_buffer_active(adapter)) { |
2093 | if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_req)) |
2094 | return -EIO; |
2095 | + qtcb->bottom.support.req_buf_length = |
2096 | + zfcp_qdio_real_bytes(sg_req); |
2097 | if (zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sg_resp)) |
2098 | return -EIO; |
2099 | + qtcb->bottom.support.resp_buf_length = |
2100 | + zfcp_qdio_real_bytes(sg_resp); |
2101 | |
2102 | zfcp_qdio_set_data_div(qdio, &req->qdio_req, |
2103 | zfcp_qdio_sbale_count(sg_req)); |
2104 | @@ -1073,6 +1079,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, |
2105 | |
2106 | req->handler = zfcp_fsf_send_ct_handler; |
2107 | req->qtcb->header.port_handle = wka_port->handle; |
2108 | + ct->d_id = wka_port->d_id; |
2109 | req->data = ct; |
2110 | |
2111 | zfcp_dbf_san_req("fssct_1", req, wka_port->d_id); |
2112 | @@ -1169,6 +1176,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, |
2113 | |
2114 | hton24(req->qtcb->bottom.support.d_id, d_id); |
2115 | req->handler = zfcp_fsf_send_els_handler; |
2116 | + els->d_id = d_id; |
2117 | req->data = els; |
2118 | |
2119 | zfcp_dbf_san_req("fssels1", req, d_id); |
2120 | @@ -1575,7 +1583,7 @@ out: |
2121 | int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
2122 | { |
2123 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
2124 | - struct zfcp_fsf_req *req; |
2125 | + struct zfcp_fsf_req *req = NULL; |
2126 | int retval = -EIO; |
2127 | |
2128 | spin_lock_irq(&qdio->req_q_lock); |
2129 | @@ -1604,6 +1612,8 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
2130 | zfcp_fsf_req_free(req); |
2131 | out: |
2132 | spin_unlock_irq(&qdio->req_q_lock); |
2133 | + if (req && !IS_ERR(req)) |
2134 | + zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id); |
2135 | return retval; |
2136 | } |
2137 | |
2138 | @@ -1628,7 +1638,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req) |
2139 | int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
2140 | { |
2141 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
2142 | - struct zfcp_fsf_req *req; |
2143 | + struct zfcp_fsf_req *req = NULL; |
2144 | int retval = -EIO; |
2145 | |
2146 | spin_lock_irq(&qdio->req_q_lock); |
2147 | @@ -1657,6 +1667,8 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
2148 | zfcp_fsf_req_free(req); |
2149 | out: |
2150 | spin_unlock_irq(&qdio->req_q_lock); |
2151 | + if (req && !IS_ERR(req)) |
2152 | + zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id); |
2153 | return retval; |
2154 | } |
2155 | |
2156 | diff --git a/drivers/s390/scsi/zfcp_fsf.h b/drivers/s390/scsi/zfcp_fsf.h |
2157 | index 57ae3ae1046d..be1c04b334c5 100644 |
2158 | --- a/drivers/s390/scsi/zfcp_fsf.h |
2159 | +++ b/drivers/s390/scsi/zfcp_fsf.h |
2160 | @@ -3,7 +3,7 @@ |
2161 | * |
2162 | * Interface to the FSF support functions. |
2163 | * |
2164 | - * Copyright IBM Corp. 2002, 2010 |
2165 | + * Copyright IBM Corp. 2002, 2015 |
2166 | */ |
2167 | |
2168 | #ifndef FSF_H |
2169 | @@ -436,6 +436,7 @@ struct zfcp_blk_drv_data { |
2170 | * @handler_data: data passed to handler function |
2171 | * @port: Optional pointer to port for zfcp internal ELS (only test link ADISC) |
2172 | * @status: used to pass error status to calling function |
2173 | + * @d_id: Destination ID of either open WKA port for CT or of D_ID for ELS |
2174 | */ |
2175 | struct zfcp_fsf_ct_els { |
2176 | struct scatterlist *req; |
2177 | @@ -444,6 +445,7 @@ struct zfcp_fsf_ct_els { |
2178 | void *handler_data; |
2179 | struct zfcp_port *port; |
2180 | int status; |
2181 | + u32 d_id; |
2182 | }; |
2183 | |
2184 | #endif /* FSF_H */ |
2185 | diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c |
2186 | index b3c6ff49103b..9069f98a1817 100644 |
2187 | --- a/drivers/s390/scsi/zfcp_scsi.c |
2188 | +++ b/drivers/s390/scsi/zfcp_scsi.c |
2189 | @@ -3,7 +3,7 @@ |
2190 | * |
2191 | * Interface to Linux SCSI midlayer. |
2192 | * |
2193 | - * Copyright IBM Corp. 2002, 2013 |
2194 | + * Copyright IBM Corp. 2002, 2015 |
2195 | */ |
2196 | |
2197 | #define KMSG_COMPONENT "zfcp" |
2198 | @@ -556,6 +556,9 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port) |
2199 | ids.port_id = port->d_id; |
2200 | ids.roles = FC_RPORT_ROLE_FCP_TARGET; |
2201 | |
2202 | + zfcp_dbf_rec_trig("scpaddy", port->adapter, port, NULL, |
2203 | + ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD, |
2204 | + ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD); |
2205 | rport = fc_remote_port_add(port->adapter->scsi_host, 0, &ids); |
2206 | if (!rport) { |
2207 | dev_err(&port->adapter->ccw_device->dev, |
2208 | @@ -577,6 +580,9 @@ static void zfcp_scsi_rport_block(struct zfcp_port *port) |
2209 | struct fc_rport *rport = port->rport; |
2210 | |
2211 | if (rport) { |
2212 | + zfcp_dbf_rec_trig("scpdely", port->adapter, port, NULL, |
2213 | + ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL, |
2214 | + ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL); |
2215 | fc_remote_port_delete(rport); |
2216 | port->rport = NULL; |
2217 | } |
2218 | diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c |
2219 | index a3860367b568..e9ce74afd13f 100644 |
2220 | --- a/drivers/scsi/hpsa.c |
2221 | +++ b/drivers/scsi/hpsa.c |
2222 | @@ -3930,6 +3930,70 @@ static int hpsa_set_local_logical_count(struct ctlr_info *h, |
2223 | return rc; |
2224 | } |
2225 | |
2226 | +static bool hpsa_is_disk_spare(struct ctlr_info *h, u8 *lunaddrbytes) |
2227 | +{ |
2228 | + struct bmic_identify_physical_device *id_phys; |
2229 | + bool is_spare = false; |
2230 | + int rc; |
2231 | + |
2232 | + id_phys = kzalloc(sizeof(*id_phys), GFP_KERNEL); |
2233 | + if (!id_phys) |
2234 | + return false; |
2235 | + |
2236 | + rc = hpsa_bmic_id_physical_device(h, |
2237 | + lunaddrbytes, |
2238 | + GET_BMIC_DRIVE_NUMBER(lunaddrbytes), |
2239 | + id_phys, sizeof(*id_phys)); |
2240 | + if (rc == 0) |
2241 | + is_spare = (id_phys->more_flags >> 6) & 0x01; |
2242 | + |
2243 | + kfree(id_phys); |
2244 | + return is_spare; |
2245 | +} |
2246 | + |
2247 | +#define RPL_DEV_FLAG_NON_DISK 0x1 |
2248 | +#define RPL_DEV_FLAG_UNCONFIG_DISK_REPORTING_SUPPORTED 0x2 |
2249 | +#define RPL_DEV_FLAG_UNCONFIG_DISK 0x4 |
2250 | + |
2251 | +#define BMIC_DEVICE_TYPE_ENCLOSURE 6 |
2252 | + |
2253 | +static bool hpsa_skip_device(struct ctlr_info *h, u8 *lunaddrbytes, |
2254 | + struct ext_report_lun_entry *rle) |
2255 | +{ |
2256 | + u8 device_flags; |
2257 | + u8 device_type; |
2258 | + |
2259 | + if (!MASKED_DEVICE(lunaddrbytes)) |
2260 | + return false; |
2261 | + |
2262 | + device_flags = rle->device_flags; |
2263 | + device_type = rle->device_type; |
2264 | + |
2265 | + if (device_flags & RPL_DEV_FLAG_NON_DISK) { |
2266 | + if (device_type == BMIC_DEVICE_TYPE_ENCLOSURE) |
2267 | + return false; |
2268 | + return true; |
2269 | + } |
2270 | + |
2271 | + if (!(device_flags & RPL_DEV_FLAG_UNCONFIG_DISK_REPORTING_SUPPORTED)) |
2272 | + return false; |
2273 | + |
2274 | + if (device_flags & RPL_DEV_FLAG_UNCONFIG_DISK) |
2275 | + return false; |
2276 | + |
2277 | + /* |
2278 | + * Spares may be spun down, we do not want to |
2279 | + * do an Inquiry to a RAID set spare drive as |
2280 | + * that would have them spun up, that is a |
2281 | + * performance hit because I/O to the RAID device |
2282 | + * stops while the spin up occurs which can take |
2283 | + * over 50 seconds. |
2284 | + */ |
2285 | + if (hpsa_is_disk_spare(h, lunaddrbytes)) |
2286 | + return true; |
2287 | + |
2288 | + return false; |
2289 | +} |
2290 | |
2291 | static void hpsa_update_scsi_devices(struct ctlr_info *h) |
2292 | { |
2293 | @@ -4023,6 +4087,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) |
2294 | u8 *lunaddrbytes, is_OBDR = 0; |
2295 | int rc = 0; |
2296 | int phys_dev_index = i - (raid_ctlr_position == 0); |
2297 | + bool skip_device = false; |
2298 | |
2299 | physical_device = i < nphysicals + (raid_ctlr_position == 0); |
2300 | |
2301 | @@ -4030,10 +4095,15 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) |
2302 | lunaddrbytes = figure_lunaddrbytes(h, raid_ctlr_position, |
2303 | i, nphysicals, nlogicals, physdev_list, logdev_list); |
2304 | |
2305 | - /* skip masked non-disk devices */ |
2306 | - if (MASKED_DEVICE(lunaddrbytes) && physical_device && |
2307 | - (physdev_list->LUN[phys_dev_index].device_flags & 0x01)) |
2308 | - continue; |
2309 | + /* |
2310 | + * Skip over some devices such as a spare. |
2311 | + */ |
2312 | + if (!tmpdevice->external && physical_device) { |
2313 | + skip_device = hpsa_skip_device(h, lunaddrbytes, |
2314 | + &physdev_list->LUN[phys_dev_index]); |
2315 | + if (skip_device) |
2316 | + continue; |
2317 | + } |
2318 | |
2319 | /* Get device type, vendor, model, device id */ |
2320 | rc = hpsa_update_device_info(h, lunaddrbytes, tmpdevice, |
2321 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c |
2322 | index f0cfaacbfabd..692445bcca6f 100644 |
2323 | --- a/drivers/scsi/scsi_scan.c |
2324 | +++ b/drivers/scsi/scsi_scan.c |
2325 | @@ -1459,12 +1459,12 @@ retry: |
2326 | out_err: |
2327 | kfree(lun_data); |
2328 | out: |
2329 | - scsi_device_put(sdev); |
2330 | if (scsi_device_created(sdev)) |
2331 | /* |
2332 | * the sdev we used didn't appear in the report luns scan |
2333 | */ |
2334 | __scsi_remove_device(sdev); |
2335 | + scsi_device_put(sdev); |
2336 | return ret; |
2337 | } |
2338 | |
2339 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
2340 | index 0d7c6e86f149..6ee50742f6a5 100644 |
2341 | --- a/drivers/scsi/sd.c |
2342 | +++ b/drivers/scsi/sd.c |
2343 | @@ -2879,10 +2879,10 @@ static int sd_revalidate_disk(struct gendisk *disk) |
2344 | if (sdkp->opt_xfer_blocks && |
2345 | sdkp->opt_xfer_blocks <= dev_max && |
2346 | sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS && |
2347 | - sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_CACHE_SIZE) |
2348 | - rw_max = q->limits.io_opt = |
2349 | - sdkp->opt_xfer_blocks * sdp->sector_size; |
2350 | - else |
2351 | + logical_to_bytes(sdp, sdkp->opt_xfer_blocks) >= PAGE_CACHE_SIZE) { |
2352 | + q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); |
2353 | + rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); |
2354 | + } else |
2355 | rw_max = BLK_DEF_MAX_SECTORS; |
2356 | |
2357 | /* Combine with controller limits */ |
2358 | diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h |
2359 | index 654630bb7d0e..765a6f1ac1b7 100644 |
2360 | --- a/drivers/scsi/sd.h |
2361 | +++ b/drivers/scsi/sd.h |
2362 | @@ -151,6 +151,11 @@ static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blo |
2363 | return blocks << (ilog2(sdev->sector_size) - 9); |
2364 | } |
2365 | |
2366 | +static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks) |
2367 | +{ |
2368 | + return blocks * sdev->sector_size; |
2369 | +} |
2370 | + |
2371 | /* |
2372 | * A DIF-capable target device can be formatted with different |
2373 | * protection schemes. Currently 0 through 3 are defined: |
2374 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
2375 | index 7bc3778a1ac9..2a67af4e2e13 100644 |
2376 | --- a/drivers/target/target_core_transport.c |
2377 | +++ b/drivers/target/target_core_transport.c |
2378 | @@ -1680,6 +1680,7 @@ void transport_generic_request_failure(struct se_cmd *cmd, |
2379 | case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED: |
2380 | case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: |
2381 | case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: |
2382 | + case TCM_COPY_TARGET_DEVICE_NOT_REACHABLE: |
2383 | break; |
2384 | case TCM_OUT_OF_RESOURCES: |
2385 | sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
2386 | @@ -2509,8 +2510,10 @@ int target_get_sess_cmd(struct se_cmd *se_cmd, bool ack_kref) |
2387 | * fabric acknowledgement that requires two target_put_sess_cmd() |
2388 | * invocations before se_cmd descriptor release. |
2389 | */ |
2390 | - if (ack_kref) |
2391 | + if (ack_kref) { |
2392 | kref_get(&se_cmd->cmd_kref); |
2393 | + se_cmd->se_cmd_flags |= SCF_ACK_KREF; |
2394 | + } |
2395 | |
2396 | spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); |
2397 | if (se_sess->sess_tearing_down) { |
2398 | @@ -2833,6 +2836,12 @@ static const struct sense_info sense_info_table[] = { |
2399 | .ascq = 0x03, /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ |
2400 | .add_sector_info = true, |
2401 | }, |
2402 | + [TCM_COPY_TARGET_DEVICE_NOT_REACHABLE] = { |
2403 | + .key = COPY_ABORTED, |
2404 | + .asc = 0x0d, |
2405 | + .ascq = 0x02, /* COPY TARGET DEVICE NOT REACHABLE */ |
2406 | + |
2407 | + }, |
2408 | [TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE] = { |
2409 | /* |
2410 | * Returning ILLEGAL REQUEST would cause immediate IO errors on |
2411 | diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c |
2412 | index 47fe94ee10b8..153a6f255b6d 100644 |
2413 | --- a/drivers/target/target_core_xcopy.c |
2414 | +++ b/drivers/target/target_core_xcopy.c |
2415 | @@ -104,7 +104,7 @@ static int target_xcopy_locate_se_dev_e4(struct se_cmd *se_cmd, struct xcopy_op |
2416 | } |
2417 | mutex_unlock(&g_device_mutex); |
2418 | |
2419 | - pr_err("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); |
2420 | + pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); |
2421 | return -EINVAL; |
2422 | } |
2423 | |
2424 | @@ -185,7 +185,7 @@ static int target_xcopy_parse_tiddesc_e4(struct se_cmd *se_cmd, struct xcopy_op |
2425 | |
2426 | static int target_xcopy_parse_target_descriptors(struct se_cmd *se_cmd, |
2427 | struct xcopy_op *xop, unsigned char *p, |
2428 | - unsigned short tdll) |
2429 | + unsigned short tdll, sense_reason_t *sense_ret) |
2430 | { |
2431 | struct se_device *local_dev = se_cmd->se_dev; |
2432 | unsigned char *desc = p; |
2433 | @@ -193,6 +193,8 @@ static int target_xcopy_parse_target_descriptors(struct se_cmd *se_cmd, |
2434 | unsigned short start = 0; |
2435 | bool src = true; |
2436 | |
2437 | + *sense_ret = TCM_INVALID_PARAMETER_LIST; |
2438 | + |
2439 | if (offset != 0) { |
2440 | pr_err("XCOPY target descriptor list length is not" |
2441 | " multiple of %d\n", XCOPY_TARGET_DESC_LEN); |
2442 | @@ -243,9 +245,16 @@ static int target_xcopy_parse_target_descriptors(struct se_cmd *se_cmd, |
2443 | rc = target_xcopy_locate_se_dev_e4(se_cmd, xop, true); |
2444 | else |
2445 | rc = target_xcopy_locate_se_dev_e4(se_cmd, xop, false); |
2446 | - |
2447 | - if (rc < 0) |
2448 | + /* |
2449 | + * If a matching IEEE NAA 0x83 descriptor for the requested device |
2450 | + * is not located on this node, return COPY_ABORTED with ASQ/ASQC |
2451 | + * 0x0d/0x02 - COPY_TARGET_DEVICE_NOT_REACHABLE to request the |
2452 | + * initiator to fall back to normal copy method. |
2453 | + */ |
2454 | + if (rc < 0) { |
2455 | + *sense_ret = TCM_COPY_TARGET_DEVICE_NOT_REACHABLE; |
2456 | goto out; |
2457 | + } |
2458 | |
2459 | pr_debug("XCOPY TGT desc: Source dev: %p NAA IEEE WWN: 0x%16phN\n", |
2460 | xop->src_dev, &xop->src_tid_wwn[0]); |
2461 | @@ -653,6 +662,7 @@ static int target_xcopy_read_source( |
2462 | rc = target_xcopy_setup_pt_cmd(xpt_cmd, xop, src_dev, &cdb[0], |
2463 | remote_port, true); |
2464 | if (rc < 0) { |
2465 | + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; |
2466 | transport_generic_free_cmd(se_cmd, 0); |
2467 | return rc; |
2468 | } |
2469 | @@ -664,6 +674,7 @@ static int target_xcopy_read_source( |
2470 | |
2471 | rc = target_xcopy_issue_pt_cmd(xpt_cmd); |
2472 | if (rc < 0) { |
2473 | + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; |
2474 | transport_generic_free_cmd(se_cmd, 0); |
2475 | return rc; |
2476 | } |
2477 | @@ -714,6 +725,7 @@ static int target_xcopy_write_destination( |
2478 | remote_port, false); |
2479 | if (rc < 0) { |
2480 | struct se_cmd *src_cmd = &xop->src_pt_cmd->se_cmd; |
2481 | + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; |
2482 | /* |
2483 | * If the failure happened before the t_mem_list hand-off in |
2484 | * target_xcopy_setup_pt_cmd(), Reset memory + clear flag so that |
2485 | @@ -729,6 +741,7 @@ static int target_xcopy_write_destination( |
2486 | |
2487 | rc = target_xcopy_issue_pt_cmd(xpt_cmd); |
2488 | if (rc < 0) { |
2489 | + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; |
2490 | se_cmd->se_cmd_flags &= ~SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC; |
2491 | transport_generic_free_cmd(se_cmd, 0); |
2492 | return rc; |
2493 | @@ -815,9 +828,14 @@ static void target_xcopy_do_work(struct work_struct *work) |
2494 | out: |
2495 | xcopy_pt_undepend_remotedev(xop); |
2496 | kfree(xop); |
2497 | - |
2498 | - pr_warn("target_xcopy_do_work: Setting X-COPY CHECK_CONDITION -> sending response\n"); |
2499 | - ec_cmd->scsi_status = SAM_STAT_CHECK_CONDITION; |
2500 | + /* |
2501 | + * Don't override an error scsi status if it has already been set |
2502 | + */ |
2503 | + if (ec_cmd->scsi_status == SAM_STAT_GOOD) { |
2504 | + pr_warn_ratelimited("target_xcopy_do_work: rc: %d, Setting X-COPY" |
2505 | + " CHECK_CONDITION -> sending response\n", rc); |
2506 | + ec_cmd->scsi_status = SAM_STAT_CHECK_CONDITION; |
2507 | + } |
2508 | target_complete_cmd(ec_cmd, SAM_STAT_CHECK_CONDITION); |
2509 | } |
2510 | |
2511 | @@ -875,7 +893,7 @@ sense_reason_t target_do_xcopy(struct se_cmd *se_cmd) |
2512 | " tdll: %hu sdll: %u inline_dl: %u\n", list_id, list_id_usage, |
2513 | tdll, sdll, inline_dl); |
2514 | |
2515 | - rc = target_xcopy_parse_target_descriptors(se_cmd, xop, &p[16], tdll); |
2516 | + rc = target_xcopy_parse_target_descriptors(se_cmd, xop, &p[16], tdll, &ret); |
2517 | if (rc <= 0) |
2518 | goto out; |
2519 | |
2520 | diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c |
2521 | index 95d293b7445a..dc2fcda54d53 100644 |
2522 | --- a/drivers/video/fbdev/efifb.c |
2523 | +++ b/drivers/video/fbdev/efifb.c |
2524 | @@ -52,9 +52,9 @@ static int efifb_setcolreg(unsigned regno, unsigned red, unsigned green, |
2525 | return 1; |
2526 | |
2527 | if (regno < 16) { |
2528 | - red >>= 8; |
2529 | - green >>= 8; |
2530 | - blue >>= 8; |
2531 | + red >>= 16 - info->var.red.length; |
2532 | + green >>= 16 - info->var.green.length; |
2533 | + blue >>= 16 - info->var.blue.length; |
2534 | ((u32 *)(info->pseudo_palette))[regno] = |
2535 | (red << info->var.red.offset) | |
2536 | (green << info->var.green.offset) | |
2537 | diff --git a/fs/ceph/file.c b/fs/ceph/file.c |
2538 | index 3c68e6aee2f0..c8222bfe1e56 100644 |
2539 | --- a/fs/ceph/file.c |
2540 | +++ b/fs/ceph/file.c |
2541 | @@ -929,7 +929,8 @@ again: |
2542 | statret = __ceph_do_getattr(inode, page, |
2543 | CEPH_STAT_CAP_INLINE_DATA, !!page); |
2544 | if (statret < 0) { |
2545 | - __free_page(page); |
2546 | + if (page) |
2547 | + __free_page(page); |
2548 | if (statret == -ENODATA) { |
2549 | BUG_ON(retry_op != READ_INLINE); |
2550 | goto again; |
2551 | diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c |
2552 | index 50b268483302..0a3544fb50f9 100644 |
2553 | --- a/fs/cifs/cifs_debug.c |
2554 | +++ b/fs/cifs/cifs_debug.c |
2555 | @@ -152,6 +152,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) |
2556 | list_for_each(tmp1, &cifs_tcp_ses_list) { |
2557 | server = list_entry(tmp1, struct TCP_Server_Info, |
2558 | tcp_ses_list); |
2559 | + seq_printf(m, "\nNumber of credits: %d", server->credits); |
2560 | i++; |
2561 | list_for_each(tmp2, &server->smb_ses_list) { |
2562 | ses = list_entry(tmp2, struct cifs_ses, |
2563 | @@ -255,7 +256,6 @@ static const struct file_operations cifs_debug_data_proc_fops = { |
2564 | static ssize_t cifs_stats_proc_write(struct file *file, |
2565 | const char __user *buffer, size_t count, loff_t *ppos) |
2566 | { |
2567 | - char c; |
2568 | bool bv; |
2569 | int rc; |
2570 | struct list_head *tmp1, *tmp2, *tmp3; |
2571 | @@ -263,11 +263,8 @@ static ssize_t cifs_stats_proc_write(struct file *file, |
2572 | struct cifs_ses *ses; |
2573 | struct cifs_tcon *tcon; |
2574 | |
2575 | - rc = get_user(c, buffer); |
2576 | - if (rc) |
2577 | - return rc; |
2578 | - |
2579 | - if (strtobool(&c, &bv) == 0) { |
2580 | + rc = kstrtobool_from_user(buffer, count, &bv); |
2581 | + if (rc == 0) { |
2582 | #ifdef CONFIG_CIFS_STATS2 |
2583 | atomic_set(&totBufAllocCount, 0); |
2584 | atomic_set(&totSmBufAllocCount, 0); |
2585 | @@ -290,6 +287,8 @@ static ssize_t cifs_stats_proc_write(struct file *file, |
2586 | } |
2587 | } |
2588 | spin_unlock(&cifs_tcp_ses_lock); |
2589 | + } else { |
2590 | + return rc; |
2591 | } |
2592 | |
2593 | return count; |
2594 | @@ -433,17 +432,17 @@ static int cifsFYI_proc_open(struct inode *inode, struct file *file) |
2595 | static ssize_t cifsFYI_proc_write(struct file *file, const char __user *buffer, |
2596 | size_t count, loff_t *ppos) |
2597 | { |
2598 | - char c; |
2599 | + char c[2] = { '\0' }; |
2600 | bool bv; |
2601 | int rc; |
2602 | |
2603 | - rc = get_user(c, buffer); |
2604 | + rc = get_user(c[0], buffer); |
2605 | if (rc) |
2606 | return rc; |
2607 | - if (strtobool(&c, &bv) == 0) |
2608 | + if (strtobool(c, &bv) == 0) |
2609 | cifsFYI = bv; |
2610 | - else if ((c > '1') && (c <= '9')) |
2611 | - cifsFYI = (int) (c - '0'); /* see cifs_debug.h for meanings */ |
2612 | + else if ((c[0] > '1') && (c[0] <= '9')) |
2613 | + cifsFYI = (int) (c[0] - '0'); /* see cifs_debug.h for meanings */ |
2614 | |
2615 | return count; |
2616 | } |
2617 | @@ -471,20 +470,12 @@ static int cifs_linux_ext_proc_open(struct inode *inode, struct file *file) |
2618 | static ssize_t cifs_linux_ext_proc_write(struct file *file, |
2619 | const char __user *buffer, size_t count, loff_t *ppos) |
2620 | { |
2621 | - char c; |
2622 | - bool bv; |
2623 | int rc; |
2624 | |
2625 | - rc = get_user(c, buffer); |
2626 | + rc = kstrtobool_from_user(buffer, count, &linuxExtEnabled); |
2627 | if (rc) |
2628 | return rc; |
2629 | |
2630 | - rc = strtobool(&c, &bv); |
2631 | - if (rc) |
2632 | - return rc; |
2633 | - |
2634 | - linuxExtEnabled = bv; |
2635 | - |
2636 | return count; |
2637 | } |
2638 | |
2639 | @@ -511,20 +502,12 @@ static int cifs_lookup_cache_proc_open(struct inode *inode, struct file *file) |
2640 | static ssize_t cifs_lookup_cache_proc_write(struct file *file, |
2641 | const char __user *buffer, size_t count, loff_t *ppos) |
2642 | { |
2643 | - char c; |
2644 | - bool bv; |
2645 | int rc; |
2646 | |
2647 | - rc = get_user(c, buffer); |
2648 | + rc = kstrtobool_from_user(buffer, count, &lookupCacheEnabled); |
2649 | if (rc) |
2650 | return rc; |
2651 | |
2652 | - rc = strtobool(&c, &bv); |
2653 | - if (rc) |
2654 | - return rc; |
2655 | - |
2656 | - lookupCacheEnabled = bv; |
2657 | - |
2658 | return count; |
2659 | } |
2660 | |
2661 | @@ -551,20 +534,12 @@ static int traceSMB_proc_open(struct inode *inode, struct file *file) |
2662 | static ssize_t traceSMB_proc_write(struct file *file, const char __user *buffer, |
2663 | size_t count, loff_t *ppos) |
2664 | { |
2665 | - char c; |
2666 | - bool bv; |
2667 | int rc; |
2668 | |
2669 | - rc = get_user(c, buffer); |
2670 | + rc = kstrtobool_from_user(buffer, count, &traceSMB); |
2671 | if (rc) |
2672 | return rc; |
2673 | |
2674 | - rc = strtobool(&c, &bv); |
2675 | - if (rc) |
2676 | - return rc; |
2677 | - |
2678 | - traceSMB = bv; |
2679 | - |
2680 | return count; |
2681 | } |
2682 | |
2683 | @@ -622,7 +597,6 @@ static ssize_t cifs_security_flags_proc_write(struct file *file, |
2684 | int rc; |
2685 | unsigned int flags; |
2686 | char flags_string[12]; |
2687 | - char c; |
2688 | bool bv; |
2689 | |
2690 | if ((count < 1) || (count > 11)) |
2691 | @@ -635,11 +609,10 @@ static ssize_t cifs_security_flags_proc_write(struct file *file, |
2692 | |
2693 | if (count < 3) { |
2694 | /* single char or single char followed by null */ |
2695 | - c = flags_string[0]; |
2696 | - if (strtobool(&c, &bv) == 0) { |
2697 | + if (strtobool(flags_string, &bv) == 0) { |
2698 | global_secflags = bv ? CIFSSEC_MAX : CIFSSEC_DEF; |
2699 | return count; |
2700 | - } else if (!isdigit(c)) { |
2701 | + } else if (!isdigit(flags_string[0])) { |
2702 | cifs_dbg(VFS, "Invalid SecurityFlags: %s\n", |
2703 | flags_string); |
2704 | return -EINVAL; |
2705 | diff --git a/fs/cifs/cifs_debug.h b/fs/cifs/cifs_debug.h |
2706 | index 66cf0f9fff89..c611ca2339d7 100644 |
2707 | --- a/fs/cifs/cifs_debug.h |
2708 | +++ b/fs/cifs/cifs_debug.h |
2709 | @@ -25,7 +25,7 @@ |
2710 | void cifs_dump_mem(char *label, void *data, int length); |
2711 | void cifs_dump_detail(void *); |
2712 | void cifs_dump_mids(struct TCP_Server_Info *); |
2713 | -extern int traceSMB; /* flag which enables the function below */ |
2714 | +extern bool traceSMB; /* flag which enables the function below */ |
2715 | void dump_smb(void *, int); |
2716 | #define CIFS_INFO 0x01 |
2717 | #define CIFS_RC 0x02 |
2718 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c |
2719 | index 450578097fb7..4f4fc9ff3636 100644 |
2720 | --- a/fs/cifs/cifsfs.c |
2721 | +++ b/fs/cifs/cifsfs.c |
2722 | @@ -54,10 +54,10 @@ |
2723 | #endif |
2724 | |
2725 | int cifsFYI = 0; |
2726 | -int traceSMB = 0; |
2727 | +bool traceSMB; |
2728 | bool enable_oplocks = true; |
2729 | -unsigned int linuxExtEnabled = 1; |
2730 | -unsigned int lookupCacheEnabled = 1; |
2731 | +bool linuxExtEnabled = true; |
2732 | +bool lookupCacheEnabled = true; |
2733 | unsigned int global_secflags = CIFSSEC_DEF; |
2734 | /* unsigned int ntlmv2_support = 0; */ |
2735 | unsigned int sign_CIFS_PDUs = 1; |
2736 | @@ -268,7 +268,7 @@ cifs_alloc_inode(struct super_block *sb) |
2737 | cifs_inode->createtime = 0; |
2738 | cifs_inode->epoch = 0; |
2739 | #ifdef CONFIG_CIFS_SMB2 |
2740 | - get_random_bytes(cifs_inode->lease_key, SMB2_LEASE_KEY_SIZE); |
2741 | + generate_random_uuid(cifs_inode->lease_key); |
2742 | #endif |
2743 | /* |
2744 | * Can not set i_flags here - they get immediately overwritten to zero |
2745 | @@ -1210,7 +1210,6 @@ init_cifs(void) |
2746 | GlobalTotalActiveXid = 0; |
2747 | GlobalMaxActiveXid = 0; |
2748 | spin_lock_init(&cifs_tcp_ses_lock); |
2749 | - spin_lock_init(&cifs_file_list_lock); |
2750 | spin_lock_init(&GlobalMid_Lock); |
2751 | |
2752 | if (cifs_max_pending < 2) { |
2753 | diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
2754 | index 2b510c537a0d..c669a1471395 100644 |
2755 | --- a/fs/cifs/cifsglob.h |
2756 | +++ b/fs/cifs/cifsglob.h |
2757 | @@ -827,6 +827,7 @@ struct cifs_tcon { |
2758 | struct list_head tcon_list; |
2759 | int tc_count; |
2760 | struct list_head openFileList; |
2761 | + spinlock_t open_file_lock; /* protects list above */ |
2762 | struct cifs_ses *ses; /* pointer to session associated with */ |
2763 | char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */ |
2764 | char *nativeFileSystem; |
2765 | @@ -883,7 +884,7 @@ struct cifs_tcon { |
2766 | #endif /* CONFIG_CIFS_STATS2 */ |
2767 | __u64 bytes_read; |
2768 | __u64 bytes_written; |
2769 | - spinlock_t stat_lock; |
2770 | + spinlock_t stat_lock; /* protects the two fields above */ |
2771 | #endif /* CONFIG_CIFS_STATS */ |
2772 | FILE_SYSTEM_DEVICE_INFO fsDevInfo; |
2773 | FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */ |
2774 | @@ -1034,8 +1035,10 @@ struct cifs_fid_locks { |
2775 | }; |
2776 | |
2777 | struct cifsFileInfo { |
2778 | + /* following two lists are protected by tcon->open_file_lock */ |
2779 | struct list_head tlist; /* pointer to next fid owned by tcon */ |
2780 | struct list_head flist; /* next fid (file instance) for this inode */ |
2781 | + /* lock list below protected by cifsi->lock_sem */ |
2782 | struct cifs_fid_locks *llist; /* brlocks held by this fid */ |
2783 | kuid_t uid; /* allows finding which FileInfo structure */ |
2784 | __u32 pid; /* process id who opened file */ |
2785 | @@ -1043,11 +1046,12 @@ struct cifsFileInfo { |
2786 | /* BB add lock scope info here if needed */ ; |
2787 | /* lock scope id (0 if none) */ |
2788 | struct dentry *dentry; |
2789 | - unsigned int f_flags; |
2790 | struct tcon_link *tlink; |
2791 | + unsigned int f_flags; |
2792 | bool invalidHandle:1; /* file closed via session abend */ |
2793 | bool oplock_break_cancelled:1; |
2794 | - int count; /* refcount protected by cifs_file_list_lock */ |
2795 | + int count; |
2796 | + spinlock_t file_info_lock; /* protects four flag/count fields above */ |
2797 | struct mutex fh_mutex; /* prevents reopen race after dead ses*/ |
2798 | struct cifs_search_info srch_inf; |
2799 | struct work_struct oplock_break; /* work for oplock breaks */ |
2800 | @@ -1114,7 +1118,7 @@ struct cifs_writedata { |
2801 | |
2802 | /* |
2803 | * Take a reference on the file private data. Must be called with |
2804 | - * cifs_file_list_lock held. |
2805 | + * cfile->file_info_lock held. |
2806 | */ |
2807 | static inline void |
2808 | cifsFileInfo_get_locked(struct cifsFileInfo *cifs_file) |
2809 | @@ -1508,8 +1512,10 @@ require use of the stronger protocol */ |
2810 | * GlobalMid_Lock protects: |
2811 | * list operations on pending_mid_q and oplockQ |
2812 | * updates to XID counters, multiplex id and SMB sequence numbers |
2813 | - * cifs_file_list_lock protects: |
2814 | - * list operations on tcp and SMB session lists and tCon lists |
2815 | + * tcp_ses_lock protects: |
2816 | + * list operations on tcp and SMB session lists |
2817 | + * tcon->open_file_lock protects the list of open files hanging off the tcon |
2818 | + * cfile->file_info_lock protects counters and fields in cifs file struct |
2819 | * f_owner.lock protects certain per file struct operations |
2820 | * mapping->page_lock protects certain per page operations |
2821 | * |
2822 | @@ -1541,18 +1547,12 @@ GLOBAL_EXTERN struct list_head cifs_tcp_ses_list; |
2823 | * tcp session, and the list of tcon's per smb session. It also protects |
2824 | * the reference counters for the server, smb session, and tcon. Finally, |
2825 | * changes to the tcon->tidStatus should be done while holding this lock. |
2826 | + * generally the locks should be taken in order tcp_ses_lock before |
2827 | + * tcon->open_file_lock and that before file->file_info_lock since the |
2828 | + * structure order is cifs_socket-->cifs_ses-->cifs_tcon-->cifs_file |
2829 | */ |
2830 | GLOBAL_EXTERN spinlock_t cifs_tcp_ses_lock; |
2831 | |
2832 | -/* |
2833 | - * This lock protects the cifs_file->llist and cifs_file->flist |
2834 | - * list operations, and updates to some flags (cifs_file->invalidHandle) |
2835 | - * It will be moved to either use the tcon->stat_lock or equivalent later. |
2836 | - * If cifs_tcp_ses_lock and the lock below are both needed to be held, then |
2837 | - * the cifs_tcp_ses_lock must be grabbed first and released last. |
2838 | - */ |
2839 | -GLOBAL_EXTERN spinlock_t cifs_file_list_lock; |
2840 | - |
2841 | #ifdef CONFIG_CIFS_DNOTIFY_EXPERIMENTAL /* unused temporarily */ |
2842 | /* Outstanding dir notify requests */ |
2843 | GLOBAL_EXTERN struct list_head GlobalDnotifyReqList; |
2844 | @@ -1588,11 +1588,11 @@ GLOBAL_EXTERN atomic_t midCount; |
2845 | |
2846 | /* Misc globals */ |
2847 | GLOBAL_EXTERN bool enable_oplocks; /* enable or disable oplocks */ |
2848 | -GLOBAL_EXTERN unsigned int lookupCacheEnabled; |
2849 | +GLOBAL_EXTERN bool lookupCacheEnabled; |
2850 | GLOBAL_EXTERN unsigned int global_secflags; /* if on, session setup sent |
2851 | with more secure ntlmssp2 challenge/resp */ |
2852 | GLOBAL_EXTERN unsigned int sign_CIFS_PDUs; /* enable smb packet signing */ |
2853 | -GLOBAL_EXTERN unsigned int linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/ |
2854 | +GLOBAL_EXTERN bool linuxExtEnabled;/*enable Linux/Unix CIFS extensions*/ |
2855 | GLOBAL_EXTERN unsigned int CIFSMaxBufSize; /* max size not including hdr */ |
2856 | GLOBAL_EXTERN unsigned int cifs_min_rcv; /* min size of big ntwrk buf pool */ |
2857 | GLOBAL_EXTERN unsigned int cifs_min_small; /* min size of small buf pool */ |
2858 | diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c |
2859 | index 76fcb50295a3..b1104ed8f54c 100644 |
2860 | --- a/fs/cifs/cifssmb.c |
2861 | +++ b/fs/cifs/cifssmb.c |
2862 | @@ -98,13 +98,13 @@ cifs_mark_open_files_invalid(struct cifs_tcon *tcon) |
2863 | struct list_head *tmp1; |
2864 | |
2865 | /* list all files open on tree connection and mark them invalid */ |
2866 | - spin_lock(&cifs_file_list_lock); |
2867 | + spin_lock(&tcon->open_file_lock); |
2868 | list_for_each_safe(tmp, tmp1, &tcon->openFileList) { |
2869 | open_file = list_entry(tmp, struct cifsFileInfo, tlist); |
2870 | open_file->invalidHandle = true; |
2871 | open_file->oplock_break_cancelled = true; |
2872 | } |
2873 | - spin_unlock(&cifs_file_list_lock); |
2874 | + spin_unlock(&tcon->open_file_lock); |
2875 | /* |
2876 | * BB Add call to invalidate_inodes(sb) for all superblocks mounted |
2877 | * to this tcon. |
2878 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
2879 | index 61c3a5ab8637..812a8cb07c63 100644 |
2880 | --- a/fs/cifs/connect.c |
2881 | +++ b/fs/cifs/connect.c |
2882 | @@ -2200,7 +2200,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) |
2883 | memcpy(&tcp_ses->dstaddr, &volume_info->dstaddr, |
2884 | sizeof(tcp_ses->dstaddr)); |
2885 | #ifdef CONFIG_CIFS_SMB2 |
2886 | - get_random_bytes(tcp_ses->client_guid, SMB2_CLIENT_GUID_SIZE); |
2887 | + generate_random_uuid(tcp_ses->client_guid); |
2888 | #endif |
2889 | /* |
2890 | * at this point we are the only ones with the pointer |
2891 | @@ -3693,14 +3693,16 @@ remote_path_check: |
2892 | goto mount_fail_check; |
2893 | } |
2894 | |
2895 | - rc = cifs_are_all_path_components_accessible(server, |
2896 | + if (rc != -EREMOTE) { |
2897 | + rc = cifs_are_all_path_components_accessible(server, |
2898 | xid, tcon, cifs_sb, |
2899 | full_path); |
2900 | - if (rc != 0) { |
2901 | - cifs_dbg(VFS, "cannot query dirs between root and final path, " |
2902 | - "enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); |
2903 | - cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; |
2904 | - rc = 0; |
2905 | + if (rc != 0) { |
2906 | + cifs_dbg(VFS, "cannot query dirs between root and final path, " |
2907 | + "enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); |
2908 | + cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH; |
2909 | + rc = 0; |
2910 | + } |
2911 | } |
2912 | kfree(full_path); |
2913 | } |
2914 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
2915 | index 0068e82217c3..72f270d4bd17 100644 |
2916 | --- a/fs/cifs/file.c |
2917 | +++ b/fs/cifs/file.c |
2918 | @@ -305,6 +305,7 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, |
2919 | cfile->tlink = cifs_get_tlink(tlink); |
2920 | INIT_WORK(&cfile->oplock_break, cifs_oplock_break); |
2921 | mutex_init(&cfile->fh_mutex); |
2922 | + spin_lock_init(&cfile->file_info_lock); |
2923 | |
2924 | cifs_sb_active(inode->i_sb); |
2925 | |
2926 | @@ -317,7 +318,7 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, |
2927 | oplock = 0; |
2928 | } |
2929 | |
2930 | - spin_lock(&cifs_file_list_lock); |
2931 | + spin_lock(&tcon->open_file_lock); |
2932 | if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock) |
2933 | oplock = fid->pending_open->oplock; |
2934 | list_del(&fid->pending_open->olist); |
2935 | @@ -326,12 +327,13 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, |
2936 | server->ops->set_fid(cfile, fid, oplock); |
2937 | |
2938 | list_add(&cfile->tlist, &tcon->openFileList); |
2939 | + |
2940 | /* if readable file instance put first in list*/ |
2941 | if (file->f_mode & FMODE_READ) |
2942 | list_add(&cfile->flist, &cinode->openFileList); |
2943 | else |
2944 | list_add_tail(&cfile->flist, &cinode->openFileList); |
2945 | - spin_unlock(&cifs_file_list_lock); |
2946 | + spin_unlock(&tcon->open_file_lock); |
2947 | |
2948 | if (fid->purge_cache) |
2949 | cifs_zap_mapping(inode); |
2950 | @@ -343,16 +345,16 @@ cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, |
2951 | struct cifsFileInfo * |
2952 | cifsFileInfo_get(struct cifsFileInfo *cifs_file) |
2953 | { |
2954 | - spin_lock(&cifs_file_list_lock); |
2955 | + spin_lock(&cifs_file->file_info_lock); |
2956 | cifsFileInfo_get_locked(cifs_file); |
2957 | - spin_unlock(&cifs_file_list_lock); |
2958 | + spin_unlock(&cifs_file->file_info_lock); |
2959 | return cifs_file; |
2960 | } |
2961 | |
2962 | /* |
2963 | * Release a reference on the file private data. This may involve closing |
2964 | * the filehandle out on the server. Must be called without holding |
2965 | - * cifs_file_list_lock. |
2966 | + * tcon->open_file_lock and cifs_file->file_info_lock. |
2967 | */ |
2968 | void cifsFileInfo_put(struct cifsFileInfo *cifs_file) |
2969 | { |
2970 | @@ -367,11 +369,15 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) |
2971 | struct cifs_pending_open open; |
2972 | bool oplock_break_cancelled; |
2973 | |
2974 | - spin_lock(&cifs_file_list_lock); |
2975 | + spin_lock(&tcon->open_file_lock); |
2976 | + |
2977 | + spin_lock(&cifs_file->file_info_lock); |
2978 | if (--cifs_file->count > 0) { |
2979 | - spin_unlock(&cifs_file_list_lock); |
2980 | + spin_unlock(&cifs_file->file_info_lock); |
2981 | + spin_unlock(&tcon->open_file_lock); |
2982 | return; |
2983 | } |
2984 | + spin_unlock(&cifs_file->file_info_lock); |
2985 | |
2986 | if (server->ops->get_lease_key) |
2987 | server->ops->get_lease_key(inode, &fid); |
2988 | @@ -395,7 +401,8 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) |
2989 | set_bit(CIFS_INO_INVALID_MAPPING, &cifsi->flags); |
2990 | cifs_set_oplock_level(cifsi, 0); |
2991 | } |
2992 | - spin_unlock(&cifs_file_list_lock); |
2993 | + |
2994 | + spin_unlock(&tcon->open_file_lock); |
2995 | |
2996 | oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break); |
2997 | |
2998 | @@ -772,10 +779,10 @@ int cifs_closedir(struct inode *inode, struct file *file) |
2999 | server = tcon->ses->server; |
3000 | |
3001 | cifs_dbg(FYI, "Freeing private data in close dir\n"); |
3002 | - spin_lock(&cifs_file_list_lock); |
3003 | + spin_lock(&cfile->file_info_lock); |
3004 | if (server->ops->dir_needs_close(cfile)) { |
3005 | cfile->invalidHandle = true; |
3006 | - spin_unlock(&cifs_file_list_lock); |
3007 | + spin_unlock(&cfile->file_info_lock); |
3008 | if (server->ops->close_dir) |
3009 | rc = server->ops->close_dir(xid, tcon, &cfile->fid); |
3010 | else |
3011 | @@ -784,7 +791,7 @@ int cifs_closedir(struct inode *inode, struct file *file) |
3012 | /* not much we can do if it fails anyway, ignore rc */ |
3013 | rc = 0; |
3014 | } else |
3015 | - spin_unlock(&cifs_file_list_lock); |
3016 | + spin_unlock(&cfile->file_info_lock); |
3017 | |
3018 | buf = cfile->srch_inf.ntwrk_buf_start; |
3019 | if (buf) { |
3020 | @@ -1720,12 +1727,13 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, |
3021 | { |
3022 | struct cifsFileInfo *open_file = NULL; |
3023 | struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb); |
3024 | + struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb); |
3025 | |
3026 | /* only filter by fsuid on multiuser mounts */ |
3027 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)) |
3028 | fsuid_only = false; |
3029 | |
3030 | - spin_lock(&cifs_file_list_lock); |
3031 | + spin_lock(&tcon->open_file_lock); |
3032 | /* we could simply get the first_list_entry since write-only entries |
3033 | are always at the end of the list but since the first entry might |
3034 | have a close pending, we go through the whole list */ |
3035 | @@ -1736,8 +1744,8 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, |
3036 | if (!open_file->invalidHandle) { |
3037 | /* found a good file */ |
3038 | /* lock it so it will not be closed on us */ |
3039 | - cifsFileInfo_get_locked(open_file); |
3040 | - spin_unlock(&cifs_file_list_lock); |
3041 | + cifsFileInfo_get(open_file); |
3042 | + spin_unlock(&tcon->open_file_lock); |
3043 | return open_file; |
3044 | } /* else might as well continue, and look for |
3045 | another, or simply have the caller reopen it |
3046 | @@ -1745,7 +1753,7 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, |
3047 | } else /* write only file */ |
3048 | break; /* write only files are last so must be done */ |
3049 | } |
3050 | - spin_unlock(&cifs_file_list_lock); |
3051 | + spin_unlock(&tcon->open_file_lock); |
3052 | return NULL; |
3053 | } |
3054 | |
3055 | @@ -1754,6 +1762,7 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, |
3056 | { |
3057 | struct cifsFileInfo *open_file, *inv_file = NULL; |
3058 | struct cifs_sb_info *cifs_sb; |
3059 | + struct cifs_tcon *tcon; |
3060 | bool any_available = false; |
3061 | int rc; |
3062 | unsigned int refind = 0; |
3063 | @@ -1769,15 +1778,16 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, |
3064 | } |
3065 | |
3066 | cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb); |
3067 | + tcon = cifs_sb_master_tcon(cifs_sb); |
3068 | |
3069 | /* only filter by fsuid on multiuser mounts */ |
3070 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)) |
3071 | fsuid_only = false; |
3072 | |
3073 | - spin_lock(&cifs_file_list_lock); |
3074 | + spin_lock(&tcon->open_file_lock); |
3075 | refind_writable: |
3076 | if (refind > MAX_REOPEN_ATT) { |
3077 | - spin_unlock(&cifs_file_list_lock); |
3078 | + spin_unlock(&tcon->open_file_lock); |
3079 | return NULL; |
3080 | } |
3081 | list_for_each_entry(open_file, &cifs_inode->openFileList, flist) { |
3082 | @@ -1788,8 +1798,8 @@ refind_writable: |
3083 | if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) { |
3084 | if (!open_file->invalidHandle) { |
3085 | /* found a good writable file */ |
3086 | - cifsFileInfo_get_locked(open_file); |
3087 | - spin_unlock(&cifs_file_list_lock); |
3088 | + cifsFileInfo_get(open_file); |
3089 | + spin_unlock(&tcon->open_file_lock); |
3090 | return open_file; |
3091 | } else { |
3092 | if (!inv_file) |
3093 | @@ -1805,24 +1815,24 @@ refind_writable: |
3094 | |
3095 | if (inv_file) { |
3096 | any_available = false; |
3097 | - cifsFileInfo_get_locked(inv_file); |
3098 | + cifsFileInfo_get(inv_file); |
3099 | } |
3100 | |
3101 | - spin_unlock(&cifs_file_list_lock); |
3102 | + spin_unlock(&tcon->open_file_lock); |
3103 | |
3104 | if (inv_file) { |
3105 | rc = cifs_reopen_file(inv_file, false); |
3106 | if (!rc) |
3107 | return inv_file; |
3108 | else { |
3109 | - spin_lock(&cifs_file_list_lock); |
3110 | + spin_lock(&tcon->open_file_lock); |
3111 | list_move_tail(&inv_file->flist, |
3112 | &cifs_inode->openFileList); |
3113 | - spin_unlock(&cifs_file_list_lock); |
3114 | + spin_unlock(&tcon->open_file_lock); |
3115 | cifsFileInfo_put(inv_file); |
3116 | - spin_lock(&cifs_file_list_lock); |
3117 | ++refind; |
3118 | inv_file = NULL; |
3119 | + spin_lock(&tcon->open_file_lock); |
3120 | goto refind_writable; |
3121 | } |
3122 | } |
3123 | @@ -3632,15 +3642,17 @@ static int cifs_readpage(struct file *file, struct page *page) |
3124 | static int is_inode_writable(struct cifsInodeInfo *cifs_inode) |
3125 | { |
3126 | struct cifsFileInfo *open_file; |
3127 | + struct cifs_tcon *tcon = |
3128 | + cifs_sb_master_tcon(CIFS_SB(cifs_inode->vfs_inode.i_sb)); |
3129 | |
3130 | - spin_lock(&cifs_file_list_lock); |
3131 | + spin_lock(&tcon->open_file_lock); |
3132 | list_for_each_entry(open_file, &cifs_inode->openFileList, flist) { |
3133 | if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) { |
3134 | - spin_unlock(&cifs_file_list_lock); |
3135 | + spin_unlock(&tcon->open_file_lock); |
3136 | return 1; |
3137 | } |
3138 | } |
3139 | - spin_unlock(&cifs_file_list_lock); |
3140 | + spin_unlock(&tcon->open_file_lock); |
3141 | return 0; |
3142 | } |
3143 | |
3144 | diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c |
3145 | index 8442b8b8e0be..2396ab099849 100644 |
3146 | --- a/fs/cifs/misc.c |
3147 | +++ b/fs/cifs/misc.c |
3148 | @@ -120,6 +120,7 @@ tconInfoAlloc(void) |
3149 | ++ret_buf->tc_count; |
3150 | INIT_LIST_HEAD(&ret_buf->openFileList); |
3151 | INIT_LIST_HEAD(&ret_buf->tcon_list); |
3152 | + spin_lock_init(&ret_buf->open_file_lock); |
3153 | #ifdef CONFIG_CIFS_STATS |
3154 | spin_lock_init(&ret_buf->stat_lock); |
3155 | #endif |
3156 | @@ -465,7 +466,7 @@ is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv) |
3157 | continue; |
3158 | |
3159 | cifs_stats_inc(&tcon->stats.cifs_stats.num_oplock_brks); |
3160 | - spin_lock(&cifs_file_list_lock); |
3161 | + spin_lock(&tcon->open_file_lock); |
3162 | list_for_each(tmp2, &tcon->openFileList) { |
3163 | netfile = list_entry(tmp2, struct cifsFileInfo, |
3164 | tlist); |
3165 | @@ -495,11 +496,11 @@ is_valid_oplock_break(char *buffer, struct TCP_Server_Info *srv) |
3166 | &netfile->oplock_break); |
3167 | netfile->oplock_break_cancelled = false; |
3168 | |
3169 | - spin_unlock(&cifs_file_list_lock); |
3170 | + spin_unlock(&tcon->open_file_lock); |
3171 | spin_unlock(&cifs_tcp_ses_lock); |
3172 | return true; |
3173 | } |
3174 | - spin_unlock(&cifs_file_list_lock); |
3175 | + spin_unlock(&tcon->open_file_lock); |
3176 | spin_unlock(&cifs_tcp_ses_lock); |
3177 | cifs_dbg(FYI, "No matching file for oplock break\n"); |
3178 | return true; |
3179 | @@ -613,9 +614,9 @@ backup_cred(struct cifs_sb_info *cifs_sb) |
3180 | void |
3181 | cifs_del_pending_open(struct cifs_pending_open *open) |
3182 | { |
3183 | - spin_lock(&cifs_file_list_lock); |
3184 | + spin_lock(&tlink_tcon(open->tlink)->open_file_lock); |
3185 | list_del(&open->olist); |
3186 | - spin_unlock(&cifs_file_list_lock); |
3187 | + spin_unlock(&tlink_tcon(open->tlink)->open_file_lock); |
3188 | } |
3189 | |
3190 | void |
3191 | @@ -635,7 +636,7 @@ void |
3192 | cifs_add_pending_open(struct cifs_fid *fid, struct tcon_link *tlink, |
3193 | struct cifs_pending_open *open) |
3194 | { |
3195 | - spin_lock(&cifs_file_list_lock); |
3196 | + spin_lock(&tlink_tcon(tlink)->open_file_lock); |
3197 | cifs_add_pending_open_locked(fid, tlink, open); |
3198 | - spin_unlock(&cifs_file_list_lock); |
3199 | + spin_unlock(&tlink_tcon(open->tlink)->open_file_lock); |
3200 | } |
3201 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
3202 | index b30a4a6d98a0..833e5844a2db 100644 |
3203 | --- a/fs/cifs/readdir.c |
3204 | +++ b/fs/cifs/readdir.c |
3205 | @@ -594,14 +594,14 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos, |
3206 | is_dir_changed(file)) || (index_to_find < first_entry_in_buffer)) { |
3207 | /* close and restart search */ |
3208 | cifs_dbg(FYI, "search backing up - close and restart search\n"); |
3209 | - spin_lock(&cifs_file_list_lock); |
3210 | + spin_lock(&cfile->file_info_lock); |
3211 | if (server->ops->dir_needs_close(cfile)) { |
3212 | cfile->invalidHandle = true; |
3213 | - spin_unlock(&cifs_file_list_lock); |
3214 | + spin_unlock(&cfile->file_info_lock); |
3215 | if (server->ops->close_dir) |
3216 | server->ops->close_dir(xid, tcon, &cfile->fid); |
3217 | } else |
3218 | - spin_unlock(&cifs_file_list_lock); |
3219 | + spin_unlock(&cfile->file_info_lock); |
3220 | if (cfile->srch_inf.ntwrk_buf_start) { |
3221 | cifs_dbg(FYI, "freeing SMB ff cache buf on search rewind\n"); |
3222 | if (cfile->srch_inf.smallBuf) |
3223 | diff --git a/fs/cifs/smb2glob.h b/fs/cifs/smb2glob.h |
3224 | index 0ffa18094335..238759c146ba 100644 |
3225 | --- a/fs/cifs/smb2glob.h |
3226 | +++ b/fs/cifs/smb2glob.h |
3227 | @@ -61,4 +61,14 @@ |
3228 | /* Maximum buffer size value we can send with 1 credit */ |
3229 | #define SMB2_MAX_BUFFER_SIZE 65536 |
3230 | |
3231 | +/* |
3232 | + * Maximum number of credits to keep available. |
3233 | + * This value is chosen somewhat arbitrarily. The Windows client |
3234 | + * defaults to 128 credits, the Windows server allows clients up to |
3235 | + * 512 credits, and the NetApp server does not limit clients at all. |
3236 | + * Choose a high enough value such that the client shouldn't limit |
3237 | + * performance. |
3238 | + */ |
3239 | +#define SMB2_MAX_CREDITS_AVAILABLE 32000 |
3240 | + |
3241 | #endif /* _SMB2_GLOB_H */ |
3242 | diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c |
3243 | index 4f0231e685a9..1238cd3552f9 100644 |
3244 | --- a/fs/cifs/smb2inode.c |
3245 | +++ b/fs/cifs/smb2inode.c |
3246 | @@ -266,9 +266,15 @@ smb2_set_file_info(struct inode *inode, const char *full_path, |
3247 | struct tcon_link *tlink; |
3248 | int rc; |
3249 | |
3250 | + if ((buf->CreationTime == 0) && (buf->LastAccessTime == 0) && |
3251 | + (buf->LastWriteTime == 0) && (buf->ChangeTime) && |
3252 | + (buf->Attributes == 0)) |
3253 | + return 0; /* would be a no op, no sense sending this */ |
3254 | + |
3255 | tlink = cifs_sb_tlink(cifs_sb); |
3256 | if (IS_ERR(tlink)) |
3257 | return PTR_ERR(tlink); |
3258 | + |
3259 | rc = smb2_open_op_close(xid, tlink_tcon(tlink), cifs_sb, full_path, |
3260 | FILE_WRITE_ATTRIBUTES, FILE_OPEN, 0, buf, |
3261 | SMB2_OP_SET_INFO); |
3262 | diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c |
3263 | index 1c5907019045..e5bc85e49be7 100644 |
3264 | --- a/fs/cifs/smb2misc.c |
3265 | +++ b/fs/cifs/smb2misc.c |
3266 | @@ -525,19 +525,19 @@ smb2_is_valid_lease_break(char *buffer) |
3267 | list_for_each(tmp1, &server->smb_ses_list) { |
3268 | ses = list_entry(tmp1, struct cifs_ses, smb_ses_list); |
3269 | |
3270 | - spin_lock(&cifs_file_list_lock); |
3271 | list_for_each(tmp2, &ses->tcon_list) { |
3272 | tcon = list_entry(tmp2, struct cifs_tcon, |
3273 | tcon_list); |
3274 | + spin_lock(&tcon->open_file_lock); |
3275 | cifs_stats_inc( |
3276 | &tcon->stats.cifs_stats.num_oplock_brks); |
3277 | if (smb2_tcon_has_lease(tcon, rsp, lw)) { |
3278 | - spin_unlock(&cifs_file_list_lock); |
3279 | + spin_unlock(&tcon->open_file_lock); |
3280 | spin_unlock(&cifs_tcp_ses_lock); |
3281 | return true; |
3282 | } |
3283 | + spin_unlock(&tcon->open_file_lock); |
3284 | } |
3285 | - spin_unlock(&cifs_file_list_lock); |
3286 | } |
3287 | } |
3288 | spin_unlock(&cifs_tcp_ses_lock); |
3289 | @@ -579,7 +579,7 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) |
3290 | tcon = list_entry(tmp1, struct cifs_tcon, tcon_list); |
3291 | |
3292 | cifs_stats_inc(&tcon->stats.cifs_stats.num_oplock_brks); |
3293 | - spin_lock(&cifs_file_list_lock); |
3294 | + spin_lock(&tcon->open_file_lock); |
3295 | list_for_each(tmp2, &tcon->openFileList) { |
3296 | cfile = list_entry(tmp2, struct cifsFileInfo, |
3297 | tlist); |
3298 | @@ -591,7 +591,7 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) |
3299 | |
3300 | cifs_dbg(FYI, "file id match, oplock break\n"); |
3301 | cinode = CIFS_I(d_inode(cfile->dentry)); |
3302 | - |
3303 | + spin_lock(&cfile->file_info_lock); |
3304 | if (!CIFS_CACHE_WRITE(cinode) && |
3305 | rsp->OplockLevel == SMB2_OPLOCK_LEVEL_NONE) |
3306 | cfile->oplock_break_cancelled = true; |
3307 | @@ -613,14 +613,14 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) |
3308 | clear_bit( |
3309 | CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2, |
3310 | &cinode->flags); |
3311 | - |
3312 | + spin_unlock(&cfile->file_info_lock); |
3313 | queue_work(cifsiod_wq, &cfile->oplock_break); |
3314 | |
3315 | - spin_unlock(&cifs_file_list_lock); |
3316 | + spin_unlock(&tcon->open_file_lock); |
3317 | spin_unlock(&cifs_tcp_ses_lock); |
3318 | return true; |
3319 | } |
3320 | - spin_unlock(&cifs_file_list_lock); |
3321 | + spin_unlock(&tcon->open_file_lock); |
3322 | spin_unlock(&cifs_tcp_ses_lock); |
3323 | cifs_dbg(FYI, "No matching file for oplock break\n"); |
3324 | return true; |
3325 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
3326 | index dd8543caa56e..be34b4860675 100644 |
3327 | --- a/fs/cifs/smb2ops.c |
3328 | +++ b/fs/cifs/smb2ops.c |
3329 | @@ -282,7 +282,7 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon) |
3330 | cifs_dbg(FYI, "Link Speed %lld\n", |
3331 | le64_to_cpu(out_buf->LinkSpeed)); |
3332 | } |
3333 | - |
3334 | + kfree(out_buf); |
3335 | return rc; |
3336 | } |
3337 | #endif /* STATS2 */ |
3338 | @@ -536,6 +536,7 @@ smb2_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock) |
3339 | server->ops->set_oplock_level(cinode, oplock, fid->epoch, |
3340 | &fid->purge_cache); |
3341 | cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode); |
3342 | + memcpy(cfile->fid.create_guid, fid->create_guid, 16); |
3343 | } |
3344 | |
3345 | static void |
3346 | @@ -694,6 +695,7 @@ smb2_clone_range(const unsigned int xid, |
3347 | |
3348 | cchunk_out: |
3349 | kfree(pcchunk); |
3350 | + kfree(retbuf); |
3351 | return rc; |
3352 | } |
3353 | |
3354 | @@ -818,7 +820,6 @@ smb2_duplicate_extents(const unsigned int xid, |
3355 | { |
3356 | int rc; |
3357 | unsigned int ret_data_len; |
3358 | - char *retbuf = NULL; |
3359 | struct duplicate_extents_to_file dup_ext_buf; |
3360 | struct cifs_tcon *tcon = tlink_tcon(trgtfile->tlink); |
3361 | |
3362 | @@ -844,7 +845,7 @@ smb2_duplicate_extents(const unsigned int xid, |
3363 | FSCTL_DUPLICATE_EXTENTS_TO_FILE, |
3364 | true /* is_fsctl */, (char *)&dup_ext_buf, |
3365 | sizeof(struct duplicate_extents_to_file), |
3366 | - (char **)&retbuf, |
3367 | + NULL, |
3368 | &ret_data_len); |
3369 | |
3370 | if (ret_data_len > 0) |
3371 | @@ -867,7 +868,6 @@ smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon, |
3372 | struct cifsFileInfo *cfile) |
3373 | { |
3374 | struct fsctl_set_integrity_information_req integr_info; |
3375 | - char *retbuf = NULL; |
3376 | unsigned int ret_data_len; |
3377 | |
3378 | integr_info.ChecksumAlgorithm = cpu_to_le16(CHECKSUM_TYPE_UNCHANGED); |
3379 | @@ -879,7 +879,7 @@ smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon, |
3380 | FSCTL_SET_INTEGRITY_INFORMATION, |
3381 | true /* is_fsctl */, (char *)&integr_info, |
3382 | sizeof(struct fsctl_set_integrity_information_req), |
3383 | - (char **)&retbuf, |
3384 | + NULL, |
3385 | &ret_data_len); |
3386 | |
3387 | } |
3388 | @@ -1036,7 +1036,7 @@ smb2_set_lease_key(struct inode *inode, struct cifs_fid *fid) |
3389 | static void |
3390 | smb2_new_lease_key(struct cifs_fid *fid) |
3391 | { |
3392 | - get_random_bytes(fid->lease_key, SMB2_LEASE_KEY_SIZE); |
3393 | + generate_random_uuid(fid->lease_key); |
3394 | } |
3395 | |
3396 | #define SMB2_SYMLINK_STRUCT_SIZE \ |
3397 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
3398 | index 0b6dc1942bdc..0dbbdf5e4aee 100644 |
3399 | --- a/fs/cifs/smb2pdu.c |
3400 | +++ b/fs/cifs/smb2pdu.c |
3401 | @@ -103,7 +103,21 @@ smb2_hdr_assemble(struct smb2_hdr *hdr, __le16 smb2_cmd /* command */ , |
3402 | hdr->ProtocolId[3] = 'B'; |
3403 | hdr->StructureSize = cpu_to_le16(64); |
3404 | hdr->Command = smb2_cmd; |
3405 | - hdr->CreditRequest = cpu_to_le16(2); /* BB make this dynamic */ |
3406 | + if (tcon && tcon->ses && tcon->ses->server) { |
3407 | + struct TCP_Server_Info *server = tcon->ses->server; |
3408 | + |
3409 | + spin_lock(&server->req_lock); |
3410 | + /* Request up to 2 credits but don't go over the limit. */ |
3411 | + if (server->credits >= SMB2_MAX_CREDITS_AVAILABLE) |
3412 | + hdr->CreditRequest = cpu_to_le16(0); |
3413 | + else |
3414 | + hdr->CreditRequest = cpu_to_le16( |
3415 | + min_t(int, SMB2_MAX_CREDITS_AVAILABLE - |
3416 | + server->credits, 2)); |
3417 | + spin_unlock(&server->req_lock); |
3418 | + } else { |
3419 | + hdr->CreditRequest = cpu_to_le16(2); |
3420 | + } |
3421 | hdr->ProcessId = cpu_to_le32((__u16)current->tgid); |
3422 | |
3423 | if (!tcon) |
3424 | @@ -593,6 +607,7 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses, |
3425 | char *security_blob = NULL; |
3426 | unsigned char *ntlmssp_blob = NULL; |
3427 | bool use_spnego = false; /* else use raw ntlmssp */ |
3428 | + u64 previous_session = ses->Suid; |
3429 | |
3430 | cifs_dbg(FYI, "Session Setup\n"); |
3431 | |
3432 | @@ -630,6 +645,10 @@ ssetup_ntlmssp_authenticate: |
3433 | return rc; |
3434 | |
3435 | req->hdr.SessionId = 0; /* First session, not a reauthenticate */ |
3436 | + |
3437 | + /* if reconnect, we need to send previous sess id, otherwise it is 0 */ |
3438 | + req->PreviousSessionId = previous_session; |
3439 | + |
3440 | req->Flags = 0; /* MBZ */ |
3441 | /* to enable echos and oplocks */ |
3442 | req->hdr.CreditRequest = cpu_to_le16(3); |
3443 | @@ -1167,7 +1186,7 @@ create_durable_v2_buf(struct cifs_fid *pfid) |
3444 | |
3445 | buf->dcontext.Timeout = 0; /* Should this be configurable by workload */ |
3446 | buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); |
3447 | - get_random_bytes(buf->dcontext.CreateGuid, 16); |
3448 | + generate_random_uuid(buf->dcontext.CreateGuid); |
3449 | memcpy(pfid->create_guid, buf->dcontext.CreateGuid, 16); |
3450 | |
3451 | /* SMB2_CREATE_DURABLE_HANDLE_REQUEST is "DH2Q" */ |
3452 | @@ -2059,6 +2078,7 @@ smb2_async_readv(struct cifs_readdata *rdata) |
3453 | if (rdata->credits) { |
3454 | buf->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes, |
3455 | SMB2_MAX_BUFFER_SIZE)); |
3456 | + buf->CreditRequest = buf->CreditCharge; |
3457 | spin_lock(&server->req_lock); |
3458 | server->credits += rdata->credits - |
3459 | le16_to_cpu(buf->CreditCharge); |
3460 | @@ -2245,6 +2265,7 @@ smb2_async_writev(struct cifs_writedata *wdata, |
3461 | if (wdata->credits) { |
3462 | req->hdr.CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes, |
3463 | SMB2_MAX_BUFFER_SIZE)); |
3464 | + req->hdr.CreditRequest = req->hdr.CreditCharge; |
3465 | spin_lock(&server->req_lock); |
3466 | server->credits += wdata->credits - |
3467 | le16_to_cpu(req->hdr.CreditCharge); |
3468 | diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h |
3469 | index 4af52780ec35..b8f553b32dda 100644 |
3470 | --- a/fs/cifs/smb2pdu.h |
3471 | +++ b/fs/cifs/smb2pdu.h |
3472 | @@ -276,7 +276,7 @@ struct smb2_sess_setup_req { |
3473 | __le32 Channel; |
3474 | __le16 SecurityBufferOffset; |
3475 | __le16 SecurityBufferLength; |
3476 | - __le64 PreviousSessionId; |
3477 | + __u64 PreviousSessionId; |
3478 | __u8 Buffer[1]; /* variable length GSS security buffer */ |
3479 | } __packed; |
3480 | |
3481 | diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c |
3482 | index 1420a3c614af..5d09ea585840 100644 |
3483 | --- a/fs/ext4/sysfs.c |
3484 | +++ b/fs/ext4/sysfs.c |
3485 | @@ -223,14 +223,18 @@ static struct attribute *ext4_attrs[] = { |
3486 | EXT4_ATTR_FEATURE(lazy_itable_init); |
3487 | EXT4_ATTR_FEATURE(batched_discard); |
3488 | EXT4_ATTR_FEATURE(meta_bg_resize); |
3489 | +#ifdef CONFIG_EXT4_FS_ENCRYPTION |
3490 | EXT4_ATTR_FEATURE(encryption); |
3491 | +#endif |
3492 | EXT4_ATTR_FEATURE(metadata_csum_seed); |
3493 | |
3494 | static struct attribute *ext4_feat_attrs[] = { |
3495 | ATTR_LIST(lazy_itable_init), |
3496 | ATTR_LIST(batched_discard), |
3497 | ATTR_LIST(meta_bg_resize), |
3498 | +#ifdef CONFIG_EXT4_FS_ENCRYPTION |
3499 | ATTR_LIST(encryption), |
3500 | +#endif |
3501 | ATTR_LIST(metadata_csum_seed), |
3502 | NULL, |
3503 | }; |
3504 | diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c |
3505 | index d67a16f2a45d..350f67fb5b9c 100644 |
3506 | --- a/fs/isofs/inode.c |
3507 | +++ b/fs/isofs/inode.c |
3508 | @@ -690,6 +690,11 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) |
3509 | pri_bh = NULL; |
3510 | |
3511 | root_found: |
3512 | + /* We don't support read-write mounts */ |
3513 | + if (!(s->s_flags & MS_RDONLY)) { |
3514 | + error = -EACCES; |
3515 | + goto out_freebh; |
3516 | + } |
3517 | |
3518 | if (joliet_level && (pri == NULL || !opt.rock)) { |
3519 | /* This is the case of Joliet with the norock mount flag. |
3520 | @@ -1503,9 +1508,6 @@ struct inode *__isofs_iget(struct super_block *sb, |
3521 | static struct dentry *isofs_mount(struct file_system_type *fs_type, |
3522 | int flags, const char *dev_name, void *data) |
3523 | { |
3524 | - /* We don't support read-write mounts */ |
3525 | - if (!(flags & MS_RDONLY)) |
3526 | - return ERR_PTR(-EACCES); |
3527 | return mount_bdev(fs_type, flags, dev_name, data, isofs_fill_super); |
3528 | } |
3529 | |
3530 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c |
3531 | index ca181e81c765..fa1b8e0dcacf 100644 |
3532 | --- a/fs/jbd2/transaction.c |
3533 | +++ b/fs/jbd2/transaction.c |
3534 | @@ -1156,6 +1156,7 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh) |
3535 | JBUFFER_TRACE(jh, "file as BJ_Reserved"); |
3536 | spin_lock(&journal->j_list_lock); |
3537 | __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved); |
3538 | + spin_unlock(&journal->j_list_lock); |
3539 | } else if (jh->b_transaction == journal->j_committing_transaction) { |
3540 | /* first access by this transaction */ |
3541 | jh->b_modified = 0; |
3542 | @@ -1163,8 +1164,8 @@ int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh) |
3543 | JBUFFER_TRACE(jh, "set next transaction"); |
3544 | spin_lock(&journal->j_list_lock); |
3545 | jh->b_next_transaction = transaction; |
3546 | + spin_unlock(&journal->j_list_lock); |
3547 | } |
3548 | - spin_unlock(&journal->j_list_lock); |
3549 | jbd_unlock_bh_state(bh); |
3550 | |
3551 | /* |
3552 | diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c |
3553 | index 5166adcfc0fb..7af5eeabc80e 100644 |
3554 | --- a/fs/nfs/delegation.c |
3555 | +++ b/fs/nfs/delegation.c |
3556 | @@ -41,6 +41,17 @@ void nfs_mark_delegation_referenced(struct nfs_delegation *delegation) |
3557 | set_bit(NFS_DELEGATION_REFERENCED, &delegation->flags); |
3558 | } |
3559 | |
3560 | +static bool |
3561 | +nfs4_is_valid_delegation(const struct nfs_delegation *delegation, |
3562 | + fmode_t flags) |
3563 | +{ |
3564 | + if (delegation != NULL && (delegation->type & flags) == flags && |
3565 | + !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) && |
3566 | + !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) |
3567 | + return true; |
3568 | + return false; |
3569 | +} |
3570 | + |
3571 | static int |
3572 | nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark) |
3573 | { |
3574 | @@ -50,8 +61,7 @@ nfs4_do_check_delegation(struct inode *inode, fmode_t flags, bool mark) |
3575 | flags &= FMODE_READ|FMODE_WRITE; |
3576 | rcu_read_lock(); |
3577 | delegation = rcu_dereference(NFS_I(inode)->delegation); |
3578 | - if (delegation != NULL && (delegation->type & flags) == flags && |
3579 | - !test_bit(NFS_DELEGATION_RETURNING, &delegation->flags)) { |
3580 | + if (nfs4_is_valid_delegation(delegation, flags)) { |
3581 | if (mark) |
3582 | nfs_mark_delegation_referenced(delegation); |
3583 | ret = 1; |
3584 | @@ -892,7 +902,7 @@ bool nfs4_copy_delegation_stateid(nfs4_stateid *dst, struct inode *inode, |
3585 | flags &= FMODE_READ|FMODE_WRITE; |
3586 | rcu_read_lock(); |
3587 | delegation = rcu_dereference(nfsi->delegation); |
3588 | - ret = (delegation != NULL && (delegation->type & flags) == flags); |
3589 | + ret = nfs4_is_valid_delegation(delegation, flags); |
3590 | if (ret) { |
3591 | nfs4_stateid_copy(dst, &delegation->stateid); |
3592 | nfs_mark_delegation_referenced(delegation); |
3593 | diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c |
3594 | index 6b1ce9825430..7f1a0fb8c493 100644 |
3595 | --- a/fs/nfs/nfs42proc.c |
3596 | +++ b/fs/nfs/nfs42proc.c |
3597 | @@ -269,6 +269,7 @@ int nfs42_proc_layoutstats_generic(struct nfs_server *server, |
3598 | task = rpc_run_task(&task_setup); |
3599 | if (IS_ERR(task)) |
3600 | return PTR_ERR(task); |
3601 | + rpc_put_task(task); |
3602 | return 0; |
3603 | } |
3604 | |
3605 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c |
3606 | index d854693a15b0..82dc3035ea45 100644 |
3607 | --- a/fs/nfs/nfs4state.c |
3608 | +++ b/fs/nfs/nfs4state.c |
3609 | @@ -1493,6 +1493,9 @@ restart: |
3610 | __func__, status); |
3611 | case -ENOENT: |
3612 | case -ENOMEM: |
3613 | + case -EACCES: |
3614 | + case -EROFS: |
3615 | + case -EIO: |
3616 | case -ESTALE: |
3617 | /* Open state on this file cannot be recovered */ |
3618 | nfs4_state_mark_recovery_failed(state, status); |
3619 | diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c |
3620 | index 9e52609cd683..ea0dd9ee138d 100644 |
3621 | --- a/fs/overlayfs/copy_up.c |
3622 | +++ b/fs/overlayfs/copy_up.c |
3623 | @@ -25,6 +25,7 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new) |
3624 | ssize_t list_size, size, value_size = 0; |
3625 | char *buf, *name, *value = NULL; |
3626 | int uninitialized_var(error); |
3627 | + size_t slen; |
3628 | |
3629 | if (!old->d_inode->i_op->getxattr || |
3630 | !new->d_inode->i_op->getxattr) |
3631 | @@ -47,7 +48,16 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new) |
3632 | goto out; |
3633 | } |
3634 | |
3635 | - for (name = buf; name < (buf + list_size); name += strlen(name) + 1) { |
3636 | + for (name = buf; list_size; name += slen) { |
3637 | + slen = strnlen(name, list_size) + 1; |
3638 | + |
3639 | + /* underlying fs providing us with an broken xattr list? */ |
3640 | + if (WARN_ON(slen > list_size)) { |
3641 | + error = -EIO; |
3642 | + break; |
3643 | + } |
3644 | + list_size -= slen; |
3645 | + |
3646 | if (ovl_is_private_xattr(name)) |
3647 | continue; |
3648 | retry: |
3649 | diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c |
3650 | index ba5ef733951f..327177df03a5 100644 |
3651 | --- a/fs/overlayfs/dir.c |
3652 | +++ b/fs/overlayfs/dir.c |
3653 | @@ -12,6 +12,7 @@ |
3654 | #include <linux/xattr.h> |
3655 | #include <linux/security.h> |
3656 | #include <linux/cred.h> |
3657 | +#include <linux/atomic.h> |
3658 | #include "overlayfs.h" |
3659 | |
3660 | void ovl_cleanup(struct inode *wdir, struct dentry *wdentry) |
3661 | @@ -35,8 +36,10 @@ struct dentry *ovl_lookup_temp(struct dentry *workdir, struct dentry *dentry) |
3662 | { |
3663 | struct dentry *temp; |
3664 | char name[20]; |
3665 | + static atomic_t temp_id = ATOMIC_INIT(0); |
3666 | |
3667 | - snprintf(name, sizeof(name), "#%lx", (unsigned long) dentry); |
3668 | + /* counter is allowed to wrap, since temp dentries are ephemeral */ |
3669 | + snprintf(name, sizeof(name), "#%x", atomic_inc_return(&temp_id)); |
3670 | |
3671 | temp = lookup_one_len(name, workdir, strlen(name)); |
3672 | if (!IS_ERR(temp) && temp->d_inode) { |
3673 | diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c |
3674 | index 319c3a60cfa5..905caba36529 100644 |
3675 | --- a/fs/pstore/ram.c |
3676 | +++ b/fs/pstore/ram.c |
3677 | @@ -375,13 +375,14 @@ static void ramoops_free_przs(struct ramoops_context *cxt) |
3678 | { |
3679 | int i; |
3680 | |
3681 | - cxt->max_dump_cnt = 0; |
3682 | if (!cxt->przs) |
3683 | return; |
3684 | |
3685 | - for (i = 0; !IS_ERR_OR_NULL(cxt->przs[i]); i++) |
3686 | + for (i = 0; i < cxt->max_dump_cnt; i++) |
3687 | persistent_ram_free(cxt->przs[i]); |
3688 | + |
3689 | kfree(cxt->przs); |
3690 | + cxt->max_dump_cnt = 0; |
3691 | } |
3692 | |
3693 | static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, |
3694 | @@ -406,7 +407,7 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, |
3695 | GFP_KERNEL); |
3696 | if (!cxt->przs) { |
3697 | dev_err(dev, "failed to initialize a prz array for dumps\n"); |
3698 | - goto fail_prz; |
3699 | + goto fail_mem; |
3700 | } |
3701 | |
3702 | for (i = 0; i < cxt->max_dump_cnt; i++) { |
3703 | @@ -417,6 +418,11 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, |
3704 | err = PTR_ERR(cxt->przs[i]); |
3705 | dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n", |
3706 | cxt->record_size, (unsigned long long)*paddr, err); |
3707 | + |
3708 | + while (i > 0) { |
3709 | + i--; |
3710 | + persistent_ram_free(cxt->przs[i]); |
3711 | + } |
3712 | goto fail_prz; |
3713 | } |
3714 | *paddr += cxt->record_size; |
3715 | @@ -424,7 +430,9 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, |
3716 | |
3717 | return 0; |
3718 | fail_prz: |
3719 | - ramoops_free_przs(cxt); |
3720 | + kfree(cxt->przs); |
3721 | +fail_mem: |
3722 | + cxt->max_dump_cnt = 0; |
3723 | return err; |
3724 | } |
3725 | |
3726 | @@ -583,7 +591,6 @@ static int ramoops_remove(struct platform_device *pdev) |
3727 | struct ramoops_context *cxt = &oops_cxt; |
3728 | |
3729 | pstore_unregister(&cxt->pstore); |
3730 | - cxt->max_dump_cnt = 0; |
3731 | |
3732 | kfree(cxt->pstore.buf); |
3733 | cxt->pstore.bufsize = 0; |
3734 | diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c |
3735 | index 76c3f80efdfa..364d2dffe5a6 100644 |
3736 | --- a/fs/pstore/ram_core.c |
3737 | +++ b/fs/pstore/ram_core.c |
3738 | @@ -47,43 +47,10 @@ static inline size_t buffer_start(struct persistent_ram_zone *prz) |
3739 | return atomic_read(&prz->buffer->start); |
3740 | } |
3741 | |
3742 | -/* increase and wrap the start pointer, returning the old value */ |
3743 | -static size_t buffer_start_add_atomic(struct persistent_ram_zone *prz, size_t a) |
3744 | -{ |
3745 | - int old; |
3746 | - int new; |
3747 | - |
3748 | - do { |
3749 | - old = atomic_read(&prz->buffer->start); |
3750 | - new = old + a; |
3751 | - while (unlikely(new >= prz->buffer_size)) |
3752 | - new -= prz->buffer_size; |
3753 | - } while (atomic_cmpxchg(&prz->buffer->start, old, new) != old); |
3754 | - |
3755 | - return old; |
3756 | -} |
3757 | - |
3758 | -/* increase the size counter until it hits the max size */ |
3759 | -static void buffer_size_add_atomic(struct persistent_ram_zone *prz, size_t a) |
3760 | -{ |
3761 | - size_t old; |
3762 | - size_t new; |
3763 | - |
3764 | - if (atomic_read(&prz->buffer->size) == prz->buffer_size) |
3765 | - return; |
3766 | - |
3767 | - do { |
3768 | - old = atomic_read(&prz->buffer->size); |
3769 | - new = old + a; |
3770 | - if (new > prz->buffer_size) |
3771 | - new = prz->buffer_size; |
3772 | - } while (atomic_cmpxchg(&prz->buffer->size, old, new) != old); |
3773 | -} |
3774 | - |
3775 | static DEFINE_RAW_SPINLOCK(buffer_lock); |
3776 | |
3777 | /* increase and wrap the start pointer, returning the old value */ |
3778 | -static size_t buffer_start_add_locked(struct persistent_ram_zone *prz, size_t a) |
3779 | +static size_t buffer_start_add(struct persistent_ram_zone *prz, size_t a) |
3780 | { |
3781 | int old; |
3782 | int new; |
3783 | @@ -103,7 +70,7 @@ static size_t buffer_start_add_locked(struct persistent_ram_zone *prz, size_t a) |
3784 | } |
3785 | |
3786 | /* increase the size counter until it hits the max size */ |
3787 | -static void buffer_size_add_locked(struct persistent_ram_zone *prz, size_t a) |
3788 | +static void buffer_size_add(struct persistent_ram_zone *prz, size_t a) |
3789 | { |
3790 | size_t old; |
3791 | size_t new; |
3792 | @@ -124,9 +91,6 @@ exit: |
3793 | raw_spin_unlock_irqrestore(&buffer_lock, flags); |
3794 | } |
3795 | |
3796 | -static size_t (*buffer_start_add)(struct persistent_ram_zone *, size_t) = buffer_start_add_atomic; |
3797 | -static void (*buffer_size_add)(struct persistent_ram_zone *, size_t) = buffer_size_add_atomic; |
3798 | - |
3799 | static void notrace persistent_ram_encode_rs8(struct persistent_ram_zone *prz, |
3800 | uint8_t *data, size_t len, uint8_t *ecc) |
3801 | { |
3802 | @@ -299,7 +263,7 @@ static void notrace persistent_ram_update(struct persistent_ram_zone *prz, |
3803 | const void *s, unsigned int start, unsigned int count) |
3804 | { |
3805 | struct persistent_ram_buffer *buffer = prz->buffer; |
3806 | - memcpy(buffer->data + start, s, count); |
3807 | + memcpy_toio(buffer->data + start, s, count); |
3808 | persistent_ram_update_ecc(prz, start, count); |
3809 | } |
3810 | |
3811 | @@ -322,8 +286,8 @@ void persistent_ram_save_old(struct persistent_ram_zone *prz) |
3812 | } |
3813 | |
3814 | prz->old_log_size = size; |
3815 | - memcpy(prz->old_log, &buffer->data[start], size - start); |
3816 | - memcpy(prz->old_log + size - start, &buffer->data[0], start); |
3817 | + memcpy_fromio(prz->old_log, &buffer->data[start], size - start); |
3818 | + memcpy_fromio(prz->old_log + size - start, &buffer->data[0], start); |
3819 | } |
3820 | |
3821 | int notrace persistent_ram_write(struct persistent_ram_zone *prz, |
3822 | @@ -426,9 +390,6 @@ static void *persistent_ram_iomap(phys_addr_t start, size_t size, |
3823 | return NULL; |
3824 | } |
3825 | |
3826 | - buffer_start_add = buffer_start_add_locked; |
3827 | - buffer_size_add = buffer_size_add_locked; |
3828 | - |
3829 | if (memtype) |
3830 | va = ioremap(start, size); |
3831 | else |
3832 | diff --git a/fs/super.c b/fs/super.c |
3833 | index f5f4b328f860..d4d2591b77c8 100644 |
3834 | --- a/fs/super.c |
3835 | +++ b/fs/super.c |
3836 | @@ -1326,8 +1326,8 @@ int freeze_super(struct super_block *sb) |
3837 | } |
3838 | } |
3839 | /* |
3840 | - * This is just for debugging purposes so that fs can warn if it |
3841 | - * sees write activity when frozen is set to SB_FREEZE_COMPLETE. |
3842 | + * For debugging purposes so that fs can warn if it sees write activity |
3843 | + * when frozen is set to SB_FREEZE_COMPLETE, and for thaw_super(). |
3844 | */ |
3845 | sb->s_writers.frozen = SB_FREEZE_COMPLETE; |
3846 | up_write(&sb->s_umount); |
3847 | @@ -1346,7 +1346,7 @@ int thaw_super(struct super_block *sb) |
3848 | int error; |
3849 | |
3850 | down_write(&sb->s_umount); |
3851 | - if (sb->s_writers.frozen == SB_UNFROZEN) { |
3852 | + if (sb->s_writers.frozen != SB_FREEZE_COMPLETE) { |
3853 | up_write(&sb->s_umount); |
3854 | return -EINVAL; |
3855 | } |
3856 | diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c |
3857 | index e8b01b721e99..b5bf23b34241 100644 |
3858 | --- a/fs/ubifs/xattr.c |
3859 | +++ b/fs/ubifs/xattr.c |
3860 | @@ -173,6 +173,7 @@ out_cancel: |
3861 | host_ui->xattr_cnt -= 1; |
3862 | host_ui->xattr_size -= CALC_DENT_SIZE(nm->len); |
3863 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); |
3864 | + host_ui->xattr_names -= nm->len; |
3865 | mutex_unlock(&host_ui->ui_mutex); |
3866 | out_free: |
3867 | make_bad_inode(inode); |
3868 | @@ -533,6 +534,7 @@ out_cancel: |
3869 | host_ui->xattr_cnt += 1; |
3870 | host_ui->xattr_size += CALC_DENT_SIZE(nm->len); |
3871 | host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len); |
3872 | + host_ui->xattr_names += nm->len; |
3873 | mutex_unlock(&host_ui->ui_mutex); |
3874 | ubifs_release_budget(c, &req); |
3875 | make_bad_inode(inode); |
3876 | diff --git a/include/linux/devfreq-event.h b/include/linux/devfreq-event.h |
3877 | index 0a83a1e648b0..4db00b02ca3f 100644 |
3878 | --- a/include/linux/devfreq-event.h |
3879 | +++ b/include/linux/devfreq-event.h |
3880 | @@ -148,11 +148,6 @@ static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev) |
3881 | return -EINVAL; |
3882 | } |
3883 | |
3884 | -static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev) |
3885 | -{ |
3886 | - return ERR_PTR(-EINVAL); |
3887 | -} |
3888 | - |
3889 | static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle( |
3890 | struct device *dev, int index) |
3891 | { |
3892 | diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h |
3893 | index e98425058f20..54048f336a1f 100644 |
3894 | --- a/include/linux/irqchip/arm-gic-v3.h |
3895 | +++ b/include/linux/irqchip/arm-gic-v3.h |
3896 | @@ -218,7 +218,7 @@ |
3897 | #define GITS_BASER_TYPE_SHIFT (56) |
3898 | #define GITS_BASER_TYPE(r) (((r) >> GITS_BASER_TYPE_SHIFT) & 7) |
3899 | #define GITS_BASER_ENTRY_SIZE_SHIFT (48) |
3900 | -#define GITS_BASER_ENTRY_SIZE(r) ((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0xff) + 1) |
3901 | +#define GITS_BASER_ENTRY_SIZE(r) ((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1) |
3902 | #define GITS_BASER_NonShareable (0UL << 10) |
3903 | #define GITS_BASER_InnerShareable (1UL << 10) |
3904 | #define GITS_BASER_OuterShareable (2UL << 10) |
3905 | diff --git a/include/linux/kernel.h b/include/linux/kernel.h |
3906 | index e571e592e53a..50220cab738c 100644 |
3907 | --- a/include/linux/kernel.h |
3908 | +++ b/include/linux/kernel.h |
3909 | @@ -356,6 +356,7 @@ int __must_check kstrtou16(const char *s, unsigned int base, u16 *res); |
3910 | int __must_check kstrtos16(const char *s, unsigned int base, s16 *res); |
3911 | int __must_check kstrtou8(const char *s, unsigned int base, u8 *res); |
3912 | int __must_check kstrtos8(const char *s, unsigned int base, s8 *res); |
3913 | +int __must_check kstrtobool(const char *s, bool *res); |
3914 | |
3915 | int __must_check kstrtoull_from_user(const char __user *s, size_t count, unsigned int base, unsigned long long *res); |
3916 | int __must_check kstrtoll_from_user(const char __user *s, size_t count, unsigned int base, long long *res); |
3917 | @@ -367,6 +368,7 @@ int __must_check kstrtou16_from_user(const char __user *s, size_t count, unsigne |
3918 | int __must_check kstrtos16_from_user(const char __user *s, size_t count, unsigned int base, s16 *res); |
3919 | int __must_check kstrtou8_from_user(const char __user *s, size_t count, unsigned int base, u8 *res); |
3920 | int __must_check kstrtos8_from_user(const char __user *s, size_t count, unsigned int base, s8 *res); |
3921 | +int __must_check kstrtobool_from_user(const char __user *s, size_t count, bool *res); |
3922 | |
3923 | static inline int __must_check kstrtou64_from_user(const char __user *s, size_t count, unsigned int base, u64 *res) |
3924 | { |
3925 | diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h |
3926 | index f09648d14694..782d4e814e21 100644 |
3927 | --- a/include/linux/lightnvm.h |
3928 | +++ b/include/linux/lightnvm.h |
3929 | @@ -1,6 +1,8 @@ |
3930 | #ifndef NVM_H |
3931 | #define NVM_H |
3932 | |
3933 | +#include <linux/types.h> |
3934 | + |
3935 | enum { |
3936 | NVM_IO_OK = 0, |
3937 | NVM_IO_REQUEUE = 1, |
3938 | @@ -11,10 +13,71 @@ enum { |
3939 | NVM_IOTYPE_GC = 1, |
3940 | }; |
3941 | |
3942 | +#define NVM_BLK_BITS (16) |
3943 | +#define NVM_PG_BITS (16) |
3944 | +#define NVM_SEC_BITS (8) |
3945 | +#define NVM_PL_BITS (8) |
3946 | +#define NVM_LUN_BITS (8) |
3947 | +#define NVM_CH_BITS (8) |
3948 | + |
3949 | +struct ppa_addr { |
3950 | + /* Generic structure for all addresses */ |
3951 | + union { |
3952 | + struct { |
3953 | + u64 blk : NVM_BLK_BITS; |
3954 | + u64 pg : NVM_PG_BITS; |
3955 | + u64 sec : NVM_SEC_BITS; |
3956 | + u64 pl : NVM_PL_BITS; |
3957 | + u64 lun : NVM_LUN_BITS; |
3958 | + u64 ch : NVM_CH_BITS; |
3959 | + } g; |
3960 | + |
3961 | + u64 ppa; |
3962 | + }; |
3963 | +}; |
3964 | + |
3965 | +struct nvm_rq; |
3966 | +struct nvm_id; |
3967 | +struct nvm_dev; |
3968 | + |
3969 | +typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); |
3970 | +typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); |
3971 | +typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *); |
3972 | +typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32, |
3973 | + nvm_l2p_update_fn *, void *); |
3974 | +typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int, |
3975 | + nvm_bb_update_fn *, void *); |
3976 | +typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct nvm_rq *, int); |
3977 | +typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *); |
3978 | +typedef int (nvm_erase_blk_fn)(struct nvm_dev *, struct nvm_rq *); |
3979 | +typedef void *(nvm_create_dma_pool_fn)(struct nvm_dev *, char *); |
3980 | +typedef void (nvm_destroy_dma_pool_fn)(void *); |
3981 | +typedef void *(nvm_dev_dma_alloc_fn)(struct nvm_dev *, void *, gfp_t, |
3982 | + dma_addr_t *); |
3983 | +typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); |
3984 | + |
3985 | +struct nvm_dev_ops { |
3986 | + nvm_id_fn *identity; |
3987 | + nvm_get_l2p_tbl_fn *get_l2p_tbl; |
3988 | + nvm_op_bb_tbl_fn *get_bb_tbl; |
3989 | + nvm_op_set_bb_fn *set_bb_tbl; |
3990 | + |
3991 | + nvm_submit_io_fn *submit_io; |
3992 | + nvm_erase_blk_fn *erase_block; |
3993 | + |
3994 | + nvm_create_dma_pool_fn *create_dma_pool; |
3995 | + nvm_destroy_dma_pool_fn *destroy_dma_pool; |
3996 | + nvm_dev_dma_alloc_fn *dev_dma_alloc; |
3997 | + nvm_dev_dma_free_fn *dev_dma_free; |
3998 | + |
3999 | + unsigned int max_phys_sect; |
4000 | +}; |
4001 | + |
4002 | + |
4003 | + |
4004 | #ifdef CONFIG_NVM |
4005 | |
4006 | #include <linux/blkdev.h> |
4007 | -#include <linux/types.h> |
4008 | #include <linux/file.h> |
4009 | #include <linux/dmapool.h> |
4010 | |
4011 | @@ -126,29 +189,6 @@ struct nvm_tgt_instance { |
4012 | #define NVM_VERSION_MINOR 0 |
4013 | #define NVM_VERSION_PATCH 0 |
4014 | |
4015 | -#define NVM_BLK_BITS (16) |
4016 | -#define NVM_PG_BITS (16) |
4017 | -#define NVM_SEC_BITS (8) |
4018 | -#define NVM_PL_BITS (8) |
4019 | -#define NVM_LUN_BITS (8) |
4020 | -#define NVM_CH_BITS (8) |
4021 | - |
4022 | -struct ppa_addr { |
4023 | - /* Generic structure for all addresses */ |
4024 | - union { |
4025 | - struct { |
4026 | - u64 blk : NVM_BLK_BITS; |
4027 | - u64 pg : NVM_PG_BITS; |
4028 | - u64 sec : NVM_SEC_BITS; |
4029 | - u64 pl : NVM_PL_BITS; |
4030 | - u64 lun : NVM_LUN_BITS; |
4031 | - u64 ch : NVM_CH_BITS; |
4032 | - } g; |
4033 | - |
4034 | - u64 ppa; |
4035 | - }; |
4036 | -}; |
4037 | - |
4038 | struct nvm_rq { |
4039 | struct nvm_tgt_instance *ins; |
4040 | struct nvm_dev *dev; |
4041 | @@ -182,39 +222,6 @@ static inline void *nvm_rq_to_pdu(struct nvm_rq *rqdata) |
4042 | |
4043 | struct nvm_block; |
4044 | |
4045 | -typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); |
4046 | -typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); |
4047 | -typedef int (nvm_id_fn)(struct nvm_dev *, struct nvm_id *); |
4048 | -typedef int (nvm_get_l2p_tbl_fn)(struct nvm_dev *, u64, u32, |
4049 | - nvm_l2p_update_fn *, void *); |
4050 | -typedef int (nvm_op_bb_tbl_fn)(struct nvm_dev *, struct ppa_addr, int, |
4051 | - nvm_bb_update_fn *, void *); |
4052 | -typedef int (nvm_op_set_bb_fn)(struct nvm_dev *, struct nvm_rq *, int); |
4053 | -typedef int (nvm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *); |
4054 | -typedef int (nvm_erase_blk_fn)(struct nvm_dev *, struct nvm_rq *); |
4055 | -typedef void *(nvm_create_dma_pool_fn)(struct nvm_dev *, char *); |
4056 | -typedef void (nvm_destroy_dma_pool_fn)(void *); |
4057 | -typedef void *(nvm_dev_dma_alloc_fn)(struct nvm_dev *, void *, gfp_t, |
4058 | - dma_addr_t *); |
4059 | -typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); |
4060 | - |
4061 | -struct nvm_dev_ops { |
4062 | - nvm_id_fn *identity; |
4063 | - nvm_get_l2p_tbl_fn *get_l2p_tbl; |
4064 | - nvm_op_bb_tbl_fn *get_bb_tbl; |
4065 | - nvm_op_set_bb_fn *set_bb_tbl; |
4066 | - |
4067 | - nvm_submit_io_fn *submit_io; |
4068 | - nvm_erase_blk_fn *erase_block; |
4069 | - |
4070 | - nvm_create_dma_pool_fn *create_dma_pool; |
4071 | - nvm_destroy_dma_pool_fn *destroy_dma_pool; |
4072 | - nvm_dev_dma_alloc_fn *dev_dma_alloc; |
4073 | - nvm_dev_dma_free_fn *dev_dma_free; |
4074 | - |
4075 | - unsigned int max_phys_sect; |
4076 | -}; |
4077 | - |
4078 | struct nvm_lun { |
4079 | int id; |
4080 | |
4081 | diff --git a/include/linux/sem.h b/include/linux/sem.h |
4082 | index 976ce3a19f1b..d0efd6e6c20a 100644 |
4083 | --- a/include/linux/sem.h |
4084 | +++ b/include/linux/sem.h |
4085 | @@ -21,6 +21,7 @@ struct sem_array { |
4086 | struct list_head list_id; /* undo requests on this array */ |
4087 | int sem_nsems; /* no. of semaphores in array */ |
4088 | int complex_count; /* pending complex operations */ |
4089 | + bool complex_mode; /* no parallel simple ops */ |
4090 | }; |
4091 | |
4092 | #ifdef CONFIG_SYSVIPC |
4093 | diff --git a/include/linux/string.h b/include/linux/string.h |
4094 | index 9ef7795e65e4..aa30789b0f65 100644 |
4095 | --- a/include/linux/string.h |
4096 | +++ b/include/linux/string.h |
4097 | @@ -127,7 +127,11 @@ extern char **argv_split(gfp_t gfp, const char *str, int *argcp); |
4098 | extern void argv_free(char **argv); |
4099 | |
4100 | extern bool sysfs_streq(const char *s1, const char *s2); |
4101 | -extern int strtobool(const char *s, bool *res); |
4102 | +extern int kstrtobool(const char *s, bool *res); |
4103 | +static inline int strtobool(const char *s, bool *res) |
4104 | +{ |
4105 | + return kstrtobool(s, res); |
4106 | +} |
4107 | |
4108 | #ifdef CONFIG_BINARY_PRINTF |
4109 | int vbin_printf(u32 *bin_buf, size_t size, const char *fmt, va_list args); |
4110 | diff --git a/include/linux/swap.h b/include/linux/swap.h |
4111 | index 7ba7dccaf0e7..d8ca2eaa3a8b 100644 |
4112 | --- a/include/linux/swap.h |
4113 | +++ b/include/linux/swap.h |
4114 | @@ -266,6 +266,7 @@ static inline void workingset_node_pages_inc(struct radix_tree_node *node) |
4115 | |
4116 | static inline void workingset_node_pages_dec(struct radix_tree_node *node) |
4117 | { |
4118 | + VM_WARN_ON_ONCE(!workingset_node_pages(node)); |
4119 | node->count--; |
4120 | } |
4121 | |
4122 | @@ -281,6 +282,7 @@ static inline void workingset_node_shadows_inc(struct radix_tree_node *node) |
4123 | |
4124 | static inline void workingset_node_shadows_dec(struct radix_tree_node *node) |
4125 | { |
4126 | + VM_WARN_ON_ONCE(!workingset_node_shadows(node)); |
4127 | node->count -= 1U << RADIX_TREE_COUNT_SHIFT; |
4128 | } |
4129 | |
4130 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h |
4131 | index 59081c73b296..6afc6f388edf 100644 |
4132 | --- a/include/target/target_core_base.h |
4133 | +++ b/include/target/target_core_base.h |
4134 | @@ -180,6 +180,7 @@ enum tcm_sense_reason_table { |
4135 | TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED = R(0x15), |
4136 | TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED = R(0x16), |
4137 | TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED = R(0x17), |
4138 | + TCM_COPY_TARGET_DEVICE_NOT_REACHABLE = R(0x18), |
4139 | #undef R |
4140 | }; |
4141 | |
4142 | diff --git a/ipc/sem.c b/ipc/sem.c |
4143 | index 20d07008ad5e..9862c3d1c26d 100644 |
4144 | --- a/ipc/sem.c |
4145 | +++ b/ipc/sem.c |
4146 | @@ -155,14 +155,21 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it); |
4147 | |
4148 | /* |
4149 | * Locking: |
4150 | + * a) global sem_lock() for read/write |
4151 | * sem_undo.id_next, |
4152 | * sem_array.complex_count, |
4153 | - * sem_array.pending{_alter,_cont}, |
4154 | - * sem_array.sem_undo: global sem_lock() for read/write |
4155 | - * sem_undo.proc_next: only "current" is allowed to read/write that field. |
4156 | + * sem_array.complex_mode |
4157 | + * sem_array.pending{_alter,_const}, |
4158 | + * sem_array.sem_undo |
4159 | * |
4160 | + * b) global or semaphore sem_lock() for read/write: |
4161 | * sem_array.sem_base[i].pending_{const,alter}: |
4162 | - * global or semaphore sem_lock() for read/write |
4163 | + * sem_array.complex_mode (for read) |
4164 | + * |
4165 | + * c) special: |
4166 | + * sem_undo_list.list_proc: |
4167 | + * * undo_list->lock for write |
4168 | + * * rcu for read |
4169 | */ |
4170 | |
4171 | #define sc_semmsl sem_ctls[0] |
4172 | @@ -263,24 +270,25 @@ static void sem_rcu_free(struct rcu_head *head) |
4173 | #define ipc_smp_acquire__after_spin_is_unlocked() smp_rmb() |
4174 | |
4175 | /* |
4176 | - * Wait until all currently ongoing simple ops have completed. |
4177 | + * Enter the mode suitable for non-simple operations: |
4178 | * Caller must own sem_perm.lock. |
4179 | - * New simple ops cannot start, because simple ops first check |
4180 | - * that sem_perm.lock is free. |
4181 | - * that a) sem_perm.lock is free and b) complex_count is 0. |
4182 | */ |
4183 | -static void sem_wait_array(struct sem_array *sma) |
4184 | +static void complexmode_enter(struct sem_array *sma) |
4185 | { |
4186 | int i; |
4187 | struct sem *sem; |
4188 | |
4189 | - if (sma->complex_count) { |
4190 | - /* The thread that increased sma->complex_count waited on |
4191 | - * all sem->lock locks. Thus we don't need to wait again. |
4192 | - */ |
4193 | + if (sma->complex_mode) { |
4194 | + /* We are already in complex_mode. Nothing to do */ |
4195 | return; |
4196 | } |
4197 | |
4198 | + /* We need a full barrier after seting complex_mode: |
4199 | + * The write to complex_mode must be visible |
4200 | + * before we read the first sem->lock spinlock state. |
4201 | + */ |
4202 | + smp_store_mb(sma->complex_mode, true); |
4203 | + |
4204 | for (i = 0; i < sma->sem_nsems; i++) { |
4205 | sem = sma->sem_base + i; |
4206 | spin_unlock_wait(&sem->lock); |
4207 | @@ -289,6 +297,28 @@ static void sem_wait_array(struct sem_array *sma) |
4208 | } |
4209 | |
4210 | /* |
4211 | + * Try to leave the mode that disallows simple operations: |
4212 | + * Caller must own sem_perm.lock. |
4213 | + */ |
4214 | +static void complexmode_tryleave(struct sem_array *sma) |
4215 | +{ |
4216 | + if (sma->complex_count) { |
4217 | + /* Complex ops are sleeping. |
4218 | + * We must stay in complex mode |
4219 | + */ |
4220 | + return; |
4221 | + } |
4222 | + /* |
4223 | + * Immediately after setting complex_mode to false, |
4224 | + * a simple op can start. Thus: all memory writes |
4225 | + * performed by the current operation must be visible |
4226 | + * before we set complex_mode to false. |
4227 | + */ |
4228 | + smp_store_release(&sma->complex_mode, false); |
4229 | +} |
4230 | + |
4231 | +#define SEM_GLOBAL_LOCK (-1) |
4232 | +/* |
4233 | * If the request contains only one semaphore operation, and there are |
4234 | * no complex transactions pending, lock only the semaphore involved. |
4235 | * Otherwise, lock the entire semaphore array, since we either have |
4236 | @@ -304,56 +334,42 @@ static inline int sem_lock(struct sem_array *sma, struct sembuf *sops, |
4237 | /* Complex operation - acquire a full lock */ |
4238 | ipc_lock_object(&sma->sem_perm); |
4239 | |
4240 | - /* And wait until all simple ops that are processed |
4241 | - * right now have dropped their locks. |
4242 | - */ |
4243 | - sem_wait_array(sma); |
4244 | - return -1; |
4245 | + /* Prevent parallel simple ops */ |
4246 | + complexmode_enter(sma); |
4247 | + return SEM_GLOBAL_LOCK; |
4248 | } |
4249 | |
4250 | /* |
4251 | * Only one semaphore affected - try to optimize locking. |
4252 | - * The rules are: |
4253 | - * - optimized locking is possible if no complex operation |
4254 | - * is either enqueued or processed right now. |
4255 | - * - The test for enqueued complex ops is simple: |
4256 | - * sma->complex_count != 0 |
4257 | - * - Testing for complex ops that are processed right now is |
4258 | - * a bit more difficult. Complex ops acquire the full lock |
4259 | - * and first wait that the running simple ops have completed. |
4260 | - * (see above) |
4261 | - * Thus: If we own a simple lock and the global lock is free |
4262 | - * and complex_count is now 0, then it will stay 0 and |
4263 | - * thus just locking sem->lock is sufficient. |
4264 | + * Optimized locking is possible if no complex operation |
4265 | + * is either enqueued or processed right now. |
4266 | + * |
4267 | + * Both facts are tracked by complex_mode. |
4268 | */ |
4269 | sem = sma->sem_base + sops->sem_num; |
4270 | |
4271 | - if (sma->complex_count == 0) { |
4272 | + /* |
4273 | + * Initial check for complex_mode. Just an optimization, |
4274 | + * no locking, no memory barrier. |
4275 | + */ |
4276 | + if (!sma->complex_mode) { |
4277 | /* |
4278 | * It appears that no complex operation is around. |
4279 | * Acquire the per-semaphore lock. |
4280 | */ |
4281 | spin_lock(&sem->lock); |
4282 | |
4283 | - /* Then check that the global lock is free */ |
4284 | - if (!spin_is_locked(&sma->sem_perm.lock)) { |
4285 | - /* |
4286 | - * We need a memory barrier with acquire semantics, |
4287 | - * otherwise we can race with another thread that does: |
4288 | - * complex_count++; |
4289 | - * spin_unlock(sem_perm.lock); |
4290 | - */ |
4291 | - ipc_smp_acquire__after_spin_is_unlocked(); |
4292 | + /* |
4293 | + * See 51d7d5205d33 |
4294 | + * ("powerpc: Add smp_mb() to arch_spin_is_locked()"): |
4295 | + * A full barrier is required: the write of sem->lock |
4296 | + * must be visible before the read is executed |
4297 | + */ |
4298 | + smp_mb(); |
4299 | |
4300 | - /* |
4301 | - * Now repeat the test of complex_count: |
4302 | - * It can't change anymore until we drop sem->lock. |
4303 | - * Thus: if is now 0, then it will stay 0. |
4304 | - */ |
4305 | - if (sma->complex_count == 0) { |
4306 | - /* fast path successful! */ |
4307 | - return sops->sem_num; |
4308 | - } |
4309 | + if (!smp_load_acquire(&sma->complex_mode)) { |
4310 | + /* fast path successful! */ |
4311 | + return sops->sem_num; |
4312 | } |
4313 | spin_unlock(&sem->lock); |
4314 | } |
4315 | @@ -373,15 +389,16 @@ static inline int sem_lock(struct sem_array *sma, struct sembuf *sops, |
4316 | /* Not a false alarm, thus complete the sequence for a |
4317 | * full lock. |
4318 | */ |
4319 | - sem_wait_array(sma); |
4320 | - return -1; |
4321 | + complexmode_enter(sma); |
4322 | + return SEM_GLOBAL_LOCK; |
4323 | } |
4324 | } |
4325 | |
4326 | static inline void sem_unlock(struct sem_array *sma, int locknum) |
4327 | { |
4328 | - if (locknum == -1) { |
4329 | + if (locknum == SEM_GLOBAL_LOCK) { |
4330 | unmerge_queues(sma); |
4331 | + complexmode_tryleave(sma); |
4332 | ipc_unlock_object(&sma->sem_perm); |
4333 | } else { |
4334 | struct sem *sem = sma->sem_base + locknum; |
4335 | @@ -533,6 +550,7 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params) |
4336 | } |
4337 | |
4338 | sma->complex_count = 0; |
4339 | + sma->complex_mode = true; /* dropped by sem_unlock below */ |
4340 | INIT_LIST_HEAD(&sma->pending_alter); |
4341 | INIT_LIST_HEAD(&sma->pending_const); |
4342 | INIT_LIST_HEAD(&sma->list_id); |
4343 | @@ -2186,10 +2204,10 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it) |
4344 | /* |
4345 | * The proc interface isn't aware of sem_lock(), it calls |
4346 | * ipc_lock_object() directly (in sysvipc_find_ipc). |
4347 | - * In order to stay compatible with sem_lock(), we must wait until |
4348 | - * all simple semop() calls have left their critical regions. |
4349 | + * In order to stay compatible with sem_lock(), we must |
4350 | + * enter / leave complex_mode. |
4351 | */ |
4352 | - sem_wait_array(sma); |
4353 | + complexmode_enter(sma); |
4354 | |
4355 | sem_otime = get_semotime(sma); |
4356 | |
4357 | @@ -2206,6 +2224,8 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it) |
4358 | sem_otime, |
4359 | sma->sem_ctime); |
4360 | |
4361 | + complexmode_tryleave(sma); |
4362 | + |
4363 | return 0; |
4364 | } |
4365 | #endif |
4366 | diff --git a/lib/kstrtox.c b/lib/kstrtox.c |
4367 | index 94be244e8441..d8a5cf66c316 100644 |
4368 | --- a/lib/kstrtox.c |
4369 | +++ b/lib/kstrtox.c |
4370 | @@ -321,6 +321,70 @@ int kstrtos8(const char *s, unsigned int base, s8 *res) |
4371 | } |
4372 | EXPORT_SYMBOL(kstrtos8); |
4373 | |
4374 | +/** |
4375 | + * kstrtobool - convert common user inputs into boolean values |
4376 | + * @s: input string |
4377 | + * @res: result |
4378 | + * |
4379 | + * This routine returns 0 iff the first character is one of 'Yy1Nn0', or |
4380 | + * [oO][NnFf] for "on" and "off". Otherwise it will return -EINVAL. Value |
4381 | + * pointed to by res is updated upon finding a match. |
4382 | + */ |
4383 | +int kstrtobool(const char *s, bool *res) |
4384 | +{ |
4385 | + if (!s) |
4386 | + return -EINVAL; |
4387 | + |
4388 | + switch (s[0]) { |
4389 | + case 'y': |
4390 | + case 'Y': |
4391 | + case '1': |
4392 | + *res = true; |
4393 | + return 0; |
4394 | + case 'n': |
4395 | + case 'N': |
4396 | + case '0': |
4397 | + *res = false; |
4398 | + return 0; |
4399 | + case 'o': |
4400 | + case 'O': |
4401 | + switch (s[1]) { |
4402 | + case 'n': |
4403 | + case 'N': |
4404 | + *res = true; |
4405 | + return 0; |
4406 | + case 'f': |
4407 | + case 'F': |
4408 | + *res = false; |
4409 | + return 0; |
4410 | + default: |
4411 | + break; |
4412 | + } |
4413 | + default: |
4414 | + break; |
4415 | + } |
4416 | + |
4417 | + return -EINVAL; |
4418 | +} |
4419 | +EXPORT_SYMBOL(kstrtobool); |
4420 | + |
4421 | +/* |
4422 | + * Since "base" would be a nonsense argument, this open-codes the |
4423 | + * _from_user helper instead of using the helper macro below. |
4424 | + */ |
4425 | +int kstrtobool_from_user(const char __user *s, size_t count, bool *res) |
4426 | +{ |
4427 | + /* Longest string needed to differentiate, newline, terminator */ |
4428 | + char buf[4]; |
4429 | + |
4430 | + count = min(count, sizeof(buf) - 1); |
4431 | + if (copy_from_user(buf, s, count)) |
4432 | + return -EFAULT; |
4433 | + buf[count] = '\0'; |
4434 | + return kstrtobool(buf, res); |
4435 | +} |
4436 | +EXPORT_SYMBOL(kstrtobool_from_user); |
4437 | + |
4438 | #define kstrto_from_user(f, g, type) \ |
4439 | int f(const char __user *s, size_t count, unsigned int base, type *res) \ |
4440 | { \ |
4441 | diff --git a/lib/string.c b/lib/string.c |
4442 | index 0323c0d5629a..1a90db9bc6e1 100644 |
4443 | --- a/lib/string.c |
4444 | +++ b/lib/string.c |
4445 | @@ -630,35 +630,6 @@ bool sysfs_streq(const char *s1, const char *s2) |
4446 | } |
4447 | EXPORT_SYMBOL(sysfs_streq); |
4448 | |
4449 | -/** |
4450 | - * strtobool - convert common user inputs into boolean values |
4451 | - * @s: input string |
4452 | - * @res: result |
4453 | - * |
4454 | - * This routine returns 0 iff the first character is one of 'Yy1Nn0'. |
4455 | - * Otherwise it will return -EINVAL. Value pointed to by res is |
4456 | - * updated upon finding a match. |
4457 | - */ |
4458 | -int strtobool(const char *s, bool *res) |
4459 | -{ |
4460 | - switch (s[0]) { |
4461 | - case 'y': |
4462 | - case 'Y': |
4463 | - case '1': |
4464 | - *res = true; |
4465 | - break; |
4466 | - case 'n': |
4467 | - case 'N': |
4468 | - case '0': |
4469 | - *res = false; |
4470 | - break; |
4471 | - default: |
4472 | - return -EINVAL; |
4473 | - } |
4474 | - return 0; |
4475 | -} |
4476 | -EXPORT_SYMBOL(strtobool); |
4477 | - |
4478 | #ifndef __HAVE_ARCH_MEMSET |
4479 | /** |
4480 | * memset - Fill a region of memory with the given value |
4481 | diff --git a/mm/filemap.c b/mm/filemap.c |
4482 | index 1bb007624b53..c588d1222b2a 100644 |
4483 | --- a/mm/filemap.c |
4484 | +++ b/mm/filemap.c |
4485 | @@ -109,6 +109,48 @@ |
4486 | * ->tasklist_lock (memory_failure, collect_procs_ao) |
4487 | */ |
4488 | |
4489 | +static int page_cache_tree_insert(struct address_space *mapping, |
4490 | + struct page *page, void **shadowp) |
4491 | +{ |
4492 | + struct radix_tree_node *node; |
4493 | + void **slot; |
4494 | + int error; |
4495 | + |
4496 | + error = __radix_tree_create(&mapping->page_tree, page->index, |
4497 | + &node, &slot); |
4498 | + if (error) |
4499 | + return error; |
4500 | + if (*slot) { |
4501 | + void *p; |
4502 | + |
4503 | + p = radix_tree_deref_slot_protected(slot, &mapping->tree_lock); |
4504 | + if (!radix_tree_exceptional_entry(p)) |
4505 | + return -EEXIST; |
4506 | + if (shadowp) |
4507 | + *shadowp = p; |
4508 | + mapping->nrshadows--; |
4509 | + if (node) |
4510 | + workingset_node_shadows_dec(node); |
4511 | + } |
4512 | + radix_tree_replace_slot(slot, page); |
4513 | + mapping->nrpages++; |
4514 | + if (node) { |
4515 | + workingset_node_pages_inc(node); |
4516 | + /* |
4517 | + * Don't track node that contains actual pages. |
4518 | + * |
4519 | + * Avoid acquiring the list_lru lock if already |
4520 | + * untracked. The list_empty() test is safe as |
4521 | + * node->private_list is protected by |
4522 | + * mapping->tree_lock. |
4523 | + */ |
4524 | + if (!list_empty(&node->private_list)) |
4525 | + list_lru_del(&workingset_shadow_nodes, |
4526 | + &node->private_list); |
4527 | + } |
4528 | + return 0; |
4529 | +} |
4530 | + |
4531 | static void page_cache_tree_delete(struct address_space *mapping, |
4532 | struct page *page, void *shadow) |
4533 | { |
4534 | @@ -122,6 +164,14 @@ static void page_cache_tree_delete(struct address_space *mapping, |
4535 | |
4536 | __radix_tree_lookup(&mapping->page_tree, page->index, &node, &slot); |
4537 | |
4538 | + if (!node) { |
4539 | + /* |
4540 | + * We need a node to properly account shadow |
4541 | + * entries. Don't plant any without. XXX |
4542 | + */ |
4543 | + shadow = NULL; |
4544 | + } |
4545 | + |
4546 | if (shadow) { |
4547 | mapping->nrshadows++; |
4548 | /* |
4549 | @@ -538,9 +588,8 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) |
4550 | memcg = mem_cgroup_begin_page_stat(old); |
4551 | spin_lock_irqsave(&mapping->tree_lock, flags); |
4552 | __delete_from_page_cache(old, NULL, memcg); |
4553 | - error = radix_tree_insert(&mapping->page_tree, offset, new); |
4554 | + error = page_cache_tree_insert(mapping, new, NULL); |
4555 | BUG_ON(error); |
4556 | - mapping->nrpages++; |
4557 | |
4558 | /* |
4559 | * hugetlb pages do not participate in page cache accounting. |
4560 | @@ -562,48 +611,6 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) |
4561 | } |
4562 | EXPORT_SYMBOL_GPL(replace_page_cache_page); |
4563 | |
4564 | -static int page_cache_tree_insert(struct address_space *mapping, |
4565 | - struct page *page, void **shadowp) |
4566 | -{ |
4567 | - struct radix_tree_node *node; |
4568 | - void **slot; |
4569 | - int error; |
4570 | - |
4571 | - error = __radix_tree_create(&mapping->page_tree, page->index, |
4572 | - &node, &slot); |
4573 | - if (error) |
4574 | - return error; |
4575 | - if (*slot) { |
4576 | - void *p; |
4577 | - |
4578 | - p = radix_tree_deref_slot_protected(slot, &mapping->tree_lock); |
4579 | - if (!radix_tree_exceptional_entry(p)) |
4580 | - return -EEXIST; |
4581 | - if (shadowp) |
4582 | - *shadowp = p; |
4583 | - mapping->nrshadows--; |
4584 | - if (node) |
4585 | - workingset_node_shadows_dec(node); |
4586 | - } |
4587 | - radix_tree_replace_slot(slot, page); |
4588 | - mapping->nrpages++; |
4589 | - if (node) { |
4590 | - workingset_node_pages_inc(node); |
4591 | - /* |
4592 | - * Don't track node that contains actual pages. |
4593 | - * |
4594 | - * Avoid acquiring the list_lru lock if already |
4595 | - * untracked. The list_empty() test is safe as |
4596 | - * node->private_list is protected by |
4597 | - * mapping->tree_lock. |
4598 | - */ |
4599 | - if (!list_empty(&node->private_list)) |
4600 | - list_lru_del(&workingset_shadow_nodes, |
4601 | - &node->private_list); |
4602 | - } |
4603 | - return 0; |
4604 | -} |
4605 | - |
4606 | static int __add_to_page_cache_locked(struct page *page, |
4607 | struct address_space *mapping, |
4608 | pgoff_t offset, gfp_t gfp_mask, |
4609 | diff --git a/mm/workingset.c b/mm/workingset.c |
4610 | index aa017133744b..df66f426fdcf 100644 |
4611 | --- a/mm/workingset.c |
4612 | +++ b/mm/workingset.c |
4613 | @@ -341,21 +341,19 @@ static enum lru_status shadow_lru_isolate(struct list_head *item, |
4614 | * no pages, so we expect to be able to remove them all and |
4615 | * delete and free the empty node afterwards. |
4616 | */ |
4617 | - |
4618 | - BUG_ON(!node->count); |
4619 | - BUG_ON(node->count & RADIX_TREE_COUNT_MASK); |
4620 | + BUG_ON(!workingset_node_shadows(node)); |
4621 | + BUG_ON(workingset_node_pages(node)); |
4622 | |
4623 | for (i = 0; i < RADIX_TREE_MAP_SIZE; i++) { |
4624 | if (node->slots[i]) { |
4625 | BUG_ON(!radix_tree_exceptional_entry(node->slots[i])); |
4626 | node->slots[i] = NULL; |
4627 | - BUG_ON(node->count < (1U << RADIX_TREE_COUNT_SHIFT)); |
4628 | - node->count -= 1U << RADIX_TREE_COUNT_SHIFT; |
4629 | + workingset_node_shadows_dec(node); |
4630 | BUG_ON(!mapping->nrshadows); |
4631 | mapping->nrshadows--; |
4632 | } |
4633 | } |
4634 | - BUG_ON(node->count); |
4635 | + BUG_ON(workingset_node_shadows(node)); |
4636 | inc_zone_state(page_zone(virt_to_page(node)), WORKINGSET_NODERECLAIM); |
4637 | if (!__radix_tree_delete_node(&mapping->page_tree, node)) |
4638 | BUG(); |
4639 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
4640 | index 1ba417207465..27b6f55fa43a 100644 |
4641 | --- a/net/sunrpc/xprtsock.c |
4642 | +++ b/net/sunrpc/xprtsock.c |
4643 | @@ -474,7 +474,16 @@ static int xs_nospace(struct rpc_task *task) |
4644 | spin_unlock_bh(&xprt->transport_lock); |
4645 | |
4646 | /* Race breaker in case memory is freed before above code is called */ |
4647 | - sk->sk_write_space(sk); |
4648 | + if (ret == -EAGAIN) { |
4649 | + struct socket_wq *wq; |
4650 | + |
4651 | + rcu_read_lock(); |
4652 | + wq = rcu_dereference(sk->sk_wq); |
4653 | + set_bit(SOCKWQ_ASYNC_NOSPACE, &wq->flags); |
4654 | + rcu_read_unlock(); |
4655 | + |
4656 | + sk->sk_write_space(sk); |
4657 | + } |
4658 | return ret; |
4659 | } |
4660 | |
4661 | diff --git a/sound/pci/hda/dell_wmi_helper.c b/sound/pci/hda/dell_wmi_helper.c |
4662 | index 9c22f95838ef..19d41da79f93 100644 |
4663 | --- a/sound/pci/hda/dell_wmi_helper.c |
4664 | +++ b/sound/pci/hda/dell_wmi_helper.c |
4665 | @@ -49,7 +49,7 @@ static void alc_fixup_dell_wmi(struct hda_codec *codec, |
4666 | removefunc = true; |
4667 | if (dell_led_set_func(DELL_LED_MICMUTE, false) >= 0) { |
4668 | dell_led_value = 0; |
4669 | - if (spec->gen.num_adc_nids > 1) |
4670 | + if (spec->gen.num_adc_nids > 1 && !spec->gen.dyn_adc_switch) |
4671 | codec_dbg(codec, "Skipping micmute LED control due to several ADCs"); |
4672 | else { |
4673 | dell_old_cap_hook = spec->gen.cap_sync_hook; |
4674 | diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c |
4675 | index 0a4ad5feb82e..12826ac0381f 100644 |
4676 | --- a/sound/pci/hda/thinkpad_helper.c |
4677 | +++ b/sound/pci/hda/thinkpad_helper.c |
4678 | @@ -75,7 +75,7 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec, |
4679 | removefunc = false; |
4680 | } |
4681 | if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) { |
4682 | - if (spec->num_adc_nids > 1) |
4683 | + if (spec->num_adc_nids > 1 && !spec->dyn_adc_switch) |
4684 | codec_dbg(codec, |
4685 | "Skipping micmute LED control due to several ADCs"); |
4686 | else { |
4687 | diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
4688 | index 9409d014b46c..71df7acf8643 100644 |
4689 | --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
4690 | +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
4691 | @@ -89,6 +89,7 @@ struct intel_pt_decoder { |
4692 | bool pge; |
4693 | bool have_tma; |
4694 | bool have_cyc; |
4695 | + bool fixup_last_mtc; |
4696 | uint64_t pos; |
4697 | uint64_t last_ip; |
4698 | uint64_t ip; |
4699 | @@ -584,10 +585,31 @@ struct intel_pt_calc_cyc_to_tsc_info { |
4700 | uint64_t tsc_timestamp; |
4701 | uint64_t timestamp; |
4702 | bool have_tma; |
4703 | + bool fixup_last_mtc; |
4704 | bool from_mtc; |
4705 | double cbr_cyc_to_tsc; |
4706 | }; |
4707 | |
4708 | +/* |
4709 | + * MTC provides a 8-bit slice of CTC but the TMA packet only provides the lower |
4710 | + * 16 bits of CTC. If mtc_shift > 8 then some of the MTC bits are not in the CTC |
4711 | + * provided by the TMA packet. Fix-up the last_mtc calculated from the TMA |
4712 | + * packet by copying the missing bits from the current MTC assuming the least |
4713 | + * difference between the two, and that the current MTC comes after last_mtc. |
4714 | + */ |
4715 | +static void intel_pt_fixup_last_mtc(uint32_t mtc, int mtc_shift, |
4716 | + uint32_t *last_mtc) |
4717 | +{ |
4718 | + uint32_t first_missing_bit = 1U << (16 - mtc_shift); |
4719 | + uint32_t mask = ~(first_missing_bit - 1); |
4720 | + |
4721 | + *last_mtc |= mtc & mask; |
4722 | + if (*last_mtc >= mtc) { |
4723 | + *last_mtc -= first_missing_bit; |
4724 | + *last_mtc &= 0xff; |
4725 | + } |
4726 | +} |
4727 | + |
4728 | static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info) |
4729 | { |
4730 | struct intel_pt_decoder *decoder = pkt_info->decoder; |
4731 | @@ -617,6 +639,11 @@ static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info) |
4732 | return 0; |
4733 | |
4734 | mtc = pkt_info->packet.payload; |
4735 | + if (decoder->mtc_shift > 8 && data->fixup_last_mtc) { |
4736 | + data->fixup_last_mtc = false; |
4737 | + intel_pt_fixup_last_mtc(mtc, decoder->mtc_shift, |
4738 | + &data->last_mtc); |
4739 | + } |
4740 | if (mtc > data->last_mtc) |
4741 | mtc_delta = mtc - data->last_mtc; |
4742 | else |
4743 | @@ -685,6 +712,7 @@ static int intel_pt_calc_cyc_cb(struct intel_pt_pkt_info *pkt_info) |
4744 | |
4745 | data->ctc_delta = 0; |
4746 | data->have_tma = true; |
4747 | + data->fixup_last_mtc = true; |
4748 | |
4749 | return 0; |
4750 | |
4751 | @@ -751,6 +779,7 @@ static void intel_pt_calc_cyc_to_tsc(struct intel_pt_decoder *decoder, |
4752 | .tsc_timestamp = decoder->tsc_timestamp, |
4753 | .timestamp = decoder->timestamp, |
4754 | .have_tma = decoder->have_tma, |
4755 | + .fixup_last_mtc = decoder->fixup_last_mtc, |
4756 | .from_mtc = from_mtc, |
4757 | .cbr_cyc_to_tsc = 0, |
4758 | }; |
4759 | @@ -1241,6 +1270,7 @@ static void intel_pt_calc_tma(struct intel_pt_decoder *decoder) |
4760 | } |
4761 | decoder->ctc_delta = 0; |
4762 | decoder->have_tma = true; |
4763 | + decoder->fixup_last_mtc = true; |
4764 | intel_pt_log("CTC timestamp " x64_fmt " last MTC %#x CTC rem %#x\n", |
4765 | decoder->ctc_timestamp, decoder->last_mtc, ctc_rem); |
4766 | } |
4767 | @@ -1255,6 +1285,12 @@ static void intel_pt_calc_mtc_timestamp(struct intel_pt_decoder *decoder) |
4768 | |
4769 | mtc = decoder->packet.payload; |
4770 | |
4771 | + if (decoder->mtc_shift > 8 && decoder->fixup_last_mtc) { |
4772 | + decoder->fixup_last_mtc = false; |
4773 | + intel_pt_fixup_last_mtc(mtc, decoder->mtc_shift, |
4774 | + &decoder->last_mtc); |
4775 | + } |
4776 | + |
4777 | if (mtc > decoder->last_mtc) |
4778 | mtc_delta = mtc - decoder->last_mtc; |
4779 | else |
4780 | @@ -1323,6 +1359,8 @@ static void intel_pt_calc_cyc_timestamp(struct intel_pt_decoder *decoder) |
4781 | timestamp, decoder->timestamp); |
4782 | else |
4783 | decoder->timestamp = timestamp; |
4784 | + |
4785 | + decoder->timestamp_insn_cnt = 0; |
4786 | } |
4787 | |
4788 | /* Walk PSB+ packets when already in sync. */ |
4789 | diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c |
4790 | index 9227c2f076c3..89927b5beebf 100644 |
4791 | --- a/tools/perf/util/intel-pt.c |
4792 | +++ b/tools/perf/util/intel-pt.c |
4793 | @@ -238,7 +238,7 @@ static int intel_pt_get_trace(struct intel_pt_buffer *b, void *data) |
4794 | } |
4795 | |
4796 | queue = &ptq->pt->queues.queue_array[ptq->queue_nr]; |
4797 | - |
4798 | +next: |
4799 | buffer = auxtrace_buffer__next(queue, buffer); |
4800 | if (!buffer) { |
4801 | if (old_buffer) |
4802 | @@ -261,9 +261,6 @@ static int intel_pt_get_trace(struct intel_pt_buffer *b, void *data) |
4803 | intel_pt_do_fix_overlap(ptq->pt, old_buffer, buffer)) |
4804 | return -ENOMEM; |
4805 | |
4806 | - if (old_buffer) |
4807 | - auxtrace_buffer__drop_data(old_buffer); |
4808 | - |
4809 | if (buffer->use_data) { |
4810 | b->len = buffer->use_size; |
4811 | b->buf = buffer->use_data; |
4812 | @@ -273,6 +270,16 @@ static int intel_pt_get_trace(struct intel_pt_buffer *b, void *data) |
4813 | } |
4814 | b->ref_timestamp = buffer->reference; |
4815 | |
4816 | + /* |
4817 | + * If in snapshot mode and the buffer has no usable data, get next |
4818 | + * buffer and again check overlap against old_buffer. |
4819 | + */ |
4820 | + if (ptq->pt->snapshot_mode && !b->len) |
4821 | + goto next; |
4822 | + |
4823 | + if (old_buffer) |
4824 | + auxtrace_buffer__drop_data(old_buffer); |
4825 | + |
4826 | if (!old_buffer || ptq->pt->sampling_mode || (ptq->pt->snapshot_mode && |
4827 | !buffer->consecutive)) { |
4828 | b->consecutive = false; |