Annotation of /trunk/kernel-alx/patches-4.9/0170-4.9.71-all-fixes.patch
Parent Directory | Revision Log
Revision 3055 -
(hide annotations)
(download)
Wed Dec 20 11:50:17 2017 UTC (6 years, 6 months ago) by niro
File size: 181157 byte(s)
Wed Dec 20 11:50:17 2017 UTC (6 years, 6 months ago) by niro
File size: 181157 byte(s)
-linux-4.9.71
1 | niro | 3055 | diff --git a/Makefile b/Makefile |
2 | index 7ad3271a1a1d..5f2736bb4877 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 70 | ||
9 | +SUBLEVEL = 71 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile | ||
14 | index 3635b8662724..92110c2c6c59 100644 | ||
15 | --- a/arch/arm64/Makefile | ||
16 | +++ b/arch/arm64/Makefile | ||
17 | @@ -14,8 +14,12 @@ LDFLAGS_vmlinux :=-p --no-undefined -X | ||
18 | CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET) | ||
19 | GZFLAGS :=-9 | ||
20 | |||
21 | -ifneq ($(CONFIG_RELOCATABLE),) | ||
22 | -LDFLAGS_vmlinux += -pie -shared -Bsymbolic | ||
23 | +ifeq ($(CONFIG_RELOCATABLE), y) | ||
24 | +# Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour | ||
25 | +# for relative relocs, since this leads to better Image compression | ||
26 | +# with the relocation offsets always being zero. | ||
27 | +LDFLAGS_vmlinux += -pie -shared -Bsymbolic \ | ||
28 | + $(call ld-option, --no-apply-dynamic-relocs) | ||
29 | endif | ||
30 | |||
31 | ifeq ($(CONFIG_ARM64_ERRATUM_843419),y) | ||
32 | diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig | ||
33 | index 3c1bd640042a..88c4b77ec8d2 100644 | ||
34 | --- a/arch/blackfin/Kconfig | ||
35 | +++ b/arch/blackfin/Kconfig | ||
36 | @@ -319,11 +319,14 @@ config BF53x | ||
37 | |||
38 | config GPIO_ADI | ||
39 | def_bool y | ||
40 | + depends on !PINCTRL | ||
41 | depends on (BF51x || BF52x || BF53x || BF538 || BF539 || BF561) | ||
42 | |||
43 | -config PINCTRL | ||
44 | +config PINCTRL_BLACKFIN_ADI2 | ||
45 | def_bool y | ||
46 | - depends on BF54x || BF60x | ||
47 | + depends on (BF54x || BF60x) | ||
48 | + select PINCTRL | ||
49 | + select PINCTRL_ADI2 | ||
50 | |||
51 | config MEM_MT48LC64M4A2FB_7E | ||
52 | bool | ||
53 | diff --git a/arch/blackfin/Kconfig.debug b/arch/blackfin/Kconfig.debug | ||
54 | index f3337ee03621..a93cf06a4d6f 100644 | ||
55 | --- a/arch/blackfin/Kconfig.debug | ||
56 | +++ b/arch/blackfin/Kconfig.debug | ||
57 | @@ -17,6 +17,7 @@ config DEBUG_VERBOSE | ||
58 | |||
59 | config DEBUG_MMRS | ||
60 | tristate "Generate Blackfin MMR tree" | ||
61 | + depends on !PINCTRL | ||
62 | select DEBUG_FS | ||
63 | help | ||
64 | Create a tree of Blackfin MMRs via the debugfs tree. If | ||
65 | diff --git a/arch/openrisc/include/asm/uaccess.h b/arch/openrisc/include/asm/uaccess.h | ||
66 | index 140faa16685a..1311e6b13991 100644 | ||
67 | --- a/arch/openrisc/include/asm/uaccess.h | ||
68 | +++ b/arch/openrisc/include/asm/uaccess.h | ||
69 | @@ -211,7 +211,7 @@ do { \ | ||
70 | case 1: __get_user_asm(x, ptr, retval, "l.lbz"); break; \ | ||
71 | case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \ | ||
72 | case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \ | ||
73 | - case 8: __get_user_asm2(x, ptr, retval); \ | ||
74 | + case 8: __get_user_asm2(x, ptr, retval); break; \ | ||
75 | default: (x) = __get_user_bad(); \ | ||
76 | } \ | ||
77 | } while (0) | ||
78 | diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c | ||
79 | index 7b2ca16b1eb4..991c6a517ddc 100644 | ||
80 | --- a/arch/powerpc/perf/hv-24x7.c | ||
81 | +++ b/arch/powerpc/perf/hv-24x7.c | ||
82 | @@ -516,7 +516,7 @@ static int memord(const void *d1, size_t s1, const void *d2, size_t s2) | ||
83 | { | ||
84 | if (s1 < s2) | ||
85 | return 1; | ||
86 | - if (s2 > s1) | ||
87 | + if (s1 > s2) | ||
88 | return -1; | ||
89 | |||
90 | return memcmp(d1, d2, s1); | ||
91 | diff --git a/arch/powerpc/platforms/powernv/opal-async.c b/arch/powerpc/platforms/powernv/opal-async.c | ||
92 | index 83bebeec0fea..0f7b16e29347 100644 | ||
93 | --- a/arch/powerpc/platforms/powernv/opal-async.c | ||
94 | +++ b/arch/powerpc/platforms/powernv/opal-async.c | ||
95 | @@ -39,18 +39,18 @@ int __opal_async_get_token(void) | ||
96 | int token; | ||
97 | |||
98 | spin_lock_irqsave(&opal_async_comp_lock, flags); | ||
99 | - token = find_first_bit(opal_async_complete_map, opal_max_async_tokens); | ||
100 | + token = find_first_zero_bit(opal_async_token_map, opal_max_async_tokens); | ||
101 | if (token >= opal_max_async_tokens) { | ||
102 | token = -EBUSY; | ||
103 | goto out; | ||
104 | } | ||
105 | |||
106 | - if (__test_and_set_bit(token, opal_async_token_map)) { | ||
107 | + if (!__test_and_clear_bit(token, opal_async_complete_map)) { | ||
108 | token = -EBUSY; | ||
109 | goto out; | ||
110 | } | ||
111 | |||
112 | - __clear_bit(token, opal_async_complete_map); | ||
113 | + __set_bit(token, opal_async_token_map); | ||
114 | |||
115 | out: | ||
116 | spin_unlock_irqrestore(&opal_async_comp_lock, flags); | ||
117 | diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c | ||
118 | index efe8b6bb168b..b33faa0015cc 100644 | ||
119 | --- a/arch/powerpc/platforms/powernv/setup.c | ||
120 | +++ b/arch/powerpc/platforms/powernv/setup.c | ||
121 | @@ -289,7 +289,7 @@ static unsigned long pnv_get_proc_freq(unsigned int cpu) | ||
122 | { | ||
123 | unsigned long ret_freq; | ||
124 | |||
125 | - ret_freq = cpufreq_quick_get(cpu) * 1000ul; | ||
126 | + ret_freq = cpufreq_get(cpu) * 1000ul; | ||
127 | |||
128 | /* | ||
129 | * If the backend cpufreq driver does not exist, | ||
130 | diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c | ||
131 | index f267ee0afc08..716353b247de 100644 | ||
132 | --- a/arch/powerpc/sysdev/ipic.c | ||
133 | +++ b/arch/powerpc/sysdev/ipic.c | ||
134 | @@ -845,12 +845,12 @@ void ipic_disable_mcp(enum ipic_mcp_irq mcp_irq) | ||
135 | |||
136 | u32 ipic_get_mcp_status(void) | ||
137 | { | ||
138 | - return ipic_read(primary_ipic->regs, IPIC_SERMR); | ||
139 | + return ipic_read(primary_ipic->regs, IPIC_SERSR); | ||
140 | } | ||
141 | |||
142 | void ipic_clear_mcp_status(u32 mask) | ||
143 | { | ||
144 | - ipic_write(primary_ipic->regs, IPIC_SERMR, mask); | ||
145 | + ipic_write(primary_ipic->regs, IPIC_SERSR, mask); | ||
146 | } | ||
147 | |||
148 | /* Return an interrupt vector or 0 if no interrupt is pending. */ | ||
149 | diff --git a/arch/x86/crypto/salsa20_glue.c b/arch/x86/crypto/salsa20_glue.c | ||
150 | index 399a29d067d6..cb91a64a99e7 100644 | ||
151 | --- a/arch/x86/crypto/salsa20_glue.c | ||
152 | +++ b/arch/x86/crypto/salsa20_glue.c | ||
153 | @@ -59,13 +59,6 @@ static int encrypt(struct blkcipher_desc *desc, | ||
154 | |||
155 | salsa20_ivsetup(ctx, walk.iv); | ||
156 | |||
157 | - if (likely(walk.nbytes == nbytes)) | ||
158 | - { | ||
159 | - salsa20_encrypt_bytes(ctx, walk.src.virt.addr, | ||
160 | - walk.dst.virt.addr, nbytes); | ||
161 | - return blkcipher_walk_done(desc, &walk, 0); | ||
162 | - } | ||
163 | - | ||
164 | while (walk.nbytes >= 64) { | ||
165 | salsa20_encrypt_bytes(ctx, walk.src.virt.addr, | ||
166 | walk.dst.virt.addr, | ||
167 | diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c | ||
168 | index b89bef95f63b..11cc600f4df0 100644 | ||
169 | --- a/arch/x86/kernel/acpi/boot.c | ||
170 | +++ b/arch/x86/kernel/acpi/boot.c | ||
171 | @@ -720,7 +720,7 @@ static void __init acpi_set_irq_model_ioapic(void) | ||
172 | #ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
173 | #include <acpi/processor.h> | ||
174 | |||
175 | -int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) | ||
176 | +static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) | ||
177 | { | ||
178 | #ifdef CONFIG_ACPI_NUMA | ||
179 | int nid; | ||
180 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
181 | index 9aa62ab13ae8..a929ca03b7ed 100644 | ||
182 | --- a/arch/x86/kvm/vmx.c | ||
183 | +++ b/arch/x86/kvm/vmx.c | ||
184 | @@ -9543,10 +9543,8 @@ static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu, | ||
185 | return false; | ||
186 | |||
187 | page = nested_get_page(vcpu, vmcs12->msr_bitmap); | ||
188 | - if (!page) { | ||
189 | - WARN_ON(1); | ||
190 | + if (!page) | ||
191 | return false; | ||
192 | - } | ||
193 | msr_bitmap_l1 = (unsigned long *)kmap(page); | ||
194 | if (!msr_bitmap_l1) { | ||
195 | nested_release_page_clean(page); | ||
196 | diff --git a/block/badblocks.c b/block/badblocks.c | ||
197 | index 6ebcef282314..2fe6c117ac96 100644 | ||
198 | --- a/block/badblocks.c | ||
199 | +++ b/block/badblocks.c | ||
200 | @@ -178,7 +178,7 @@ int badblocks_set(struct badblocks *bb, sector_t s, int sectors, | ||
201 | |||
202 | if (bb->shift < 0) | ||
203 | /* badblocks are disabled */ | ||
204 | - return 0; | ||
205 | + return 1; | ||
206 | |||
207 | if (bb->shift) { | ||
208 | /* round the start down, and the end up */ | ||
209 | diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c | ||
210 | index dcf5ce3ba4bf..4bc701b32ce2 100644 | ||
211 | --- a/block/blk-mq-tag.c | ||
212 | +++ b/block/blk-mq-tag.c | ||
213 | @@ -311,6 +311,9 @@ int blk_mq_reinit_tagset(struct blk_mq_tag_set *set) | ||
214 | for (i = 0; i < set->nr_hw_queues; i++) { | ||
215 | struct blk_mq_tags *tags = set->tags[i]; | ||
216 | |||
217 | + if (!tags) | ||
218 | + continue; | ||
219 | + | ||
220 | for (j = 0; j < tags->nr_tags; j++) { | ||
221 | if (!tags->rqs[j]) | ||
222 | continue; | ||
223 | diff --git a/crypto/hmac.c b/crypto/hmac.c | ||
224 | index 72e38c098bb3..ba07fb6221ae 100644 | ||
225 | --- a/crypto/hmac.c | ||
226 | +++ b/crypto/hmac.c | ||
227 | @@ -194,11 +194,15 @@ static int hmac_create(struct crypto_template *tmpl, struct rtattr **tb) | ||
228 | salg = shash_attr_alg(tb[1], 0, 0); | ||
229 | if (IS_ERR(salg)) | ||
230 | return PTR_ERR(salg); | ||
231 | + alg = &salg->base; | ||
232 | |||
233 | + /* The underlying hash algorithm must be unkeyed */ | ||
234 | err = -EINVAL; | ||
235 | + if (crypto_shash_alg_has_setkey(salg)) | ||
236 | + goto out_put_alg; | ||
237 | + | ||
238 | ds = salg->digestsize; | ||
239 | ss = salg->statesize; | ||
240 | - alg = &salg->base; | ||
241 | if (ds > alg->cra_blocksize || | ||
242 | ss < alg->cra_blocksize) | ||
243 | goto out_put_alg; | ||
244 | diff --git a/crypto/rsa_helper.c b/crypto/rsa_helper.c | ||
245 | index 0b66dc824606..cad395d70d78 100644 | ||
246 | --- a/crypto/rsa_helper.c | ||
247 | +++ b/crypto/rsa_helper.c | ||
248 | @@ -30,7 +30,7 @@ int rsa_get_n(void *context, size_t hdrlen, unsigned char tag, | ||
249 | return -EINVAL; | ||
250 | |||
251 | if (fips_enabled) { | ||
252 | - while (!*ptr && n_sz) { | ||
253 | + while (n_sz && !*ptr) { | ||
254 | ptr++; | ||
255 | n_sz--; | ||
256 | } | ||
257 | diff --git a/crypto/salsa20_generic.c b/crypto/salsa20_generic.c | ||
258 | index f550b5d94630..d7da0eea5622 100644 | ||
259 | --- a/crypto/salsa20_generic.c | ||
260 | +++ b/crypto/salsa20_generic.c | ||
261 | @@ -188,13 +188,6 @@ static int encrypt(struct blkcipher_desc *desc, | ||
262 | |||
263 | salsa20_ivsetup(ctx, walk.iv); | ||
264 | |||
265 | - if (likely(walk.nbytes == nbytes)) | ||
266 | - { | ||
267 | - salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, | ||
268 | - walk.src.virt.addr, nbytes); | ||
269 | - return blkcipher_walk_done(desc, &walk, 0); | ||
270 | - } | ||
271 | - | ||
272 | while (walk.nbytes >= 64) { | ||
273 | salsa20_encrypt_bytes(ctx, walk.dst.virt.addr, | ||
274 | walk.src.virt.addr, | ||
275 | diff --git a/crypto/shash.c b/crypto/shash.c | ||
276 | index 4d8a671d1614..9bd5044d467b 100644 | ||
277 | --- a/crypto/shash.c | ||
278 | +++ b/crypto/shash.c | ||
279 | @@ -24,11 +24,12 @@ | ||
280 | |||
281 | static const struct crypto_type crypto_shash_type; | ||
282 | |||
283 | -static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, | ||
284 | - unsigned int keylen) | ||
285 | +int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, | ||
286 | + unsigned int keylen) | ||
287 | { | ||
288 | return -ENOSYS; | ||
289 | } | ||
290 | +EXPORT_SYMBOL_GPL(shash_no_setkey); | ||
291 | |||
292 | static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key, | ||
293 | unsigned int keylen) | ||
294 | diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c | ||
295 | index ae22f05d5936..e3af318af2db 100644 | ||
296 | --- a/crypto/tcrypt.c | ||
297 | +++ b/crypto/tcrypt.c | ||
298 | @@ -342,7 +342,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, | ||
299 | } | ||
300 | |||
301 | sg_init_aead(sg, xbuf, | ||
302 | - *b_size + (enc ? authsize : 0)); | ||
303 | + *b_size + (enc ? 0 : authsize)); | ||
304 | |||
305 | sg_init_aead(sgout, xoutbuf, | ||
306 | *b_size + (enc ? authsize : 0)); | ||
307 | @@ -350,7 +350,9 @@ static void test_aead_speed(const char *algo, int enc, unsigned int secs, | ||
308 | sg_set_buf(&sg[0], assoc, aad_size); | ||
309 | sg_set_buf(&sgout[0], assoc, aad_size); | ||
310 | |||
311 | - aead_request_set_crypt(req, sg, sgout, *b_size, iv); | ||
312 | + aead_request_set_crypt(req, sg, sgout, | ||
313 | + *b_size + (enc ? 0 : authsize), | ||
314 | + iv); | ||
315 | aead_request_set_ad(req, aad_size); | ||
316 | |||
317 | if (secs) | ||
318 | diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c | ||
319 | index 3de3b6b8f0f1..f43a586236ea 100644 | ||
320 | --- a/drivers/acpi/acpi_processor.c | ||
321 | +++ b/drivers/acpi/acpi_processor.c | ||
322 | @@ -182,11 +182,6 @@ int __weak arch_register_cpu(int cpu) | ||
323 | |||
324 | void __weak arch_unregister_cpu(int cpu) {} | ||
325 | |||
326 | -int __weak acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) | ||
327 | -{ | ||
328 | - return -ENODEV; | ||
329 | -} | ||
330 | - | ||
331 | static int acpi_processor_hotadd_init(struct acpi_processor *pr) | ||
332 | { | ||
333 | unsigned long long sta; | ||
334 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c | ||
335 | index 56190d00fd87..0a3ca20f99af 100644 | ||
336 | --- a/drivers/acpi/bus.c | ||
337 | +++ b/drivers/acpi/bus.c | ||
338 | @@ -1197,7 +1197,6 @@ static int __init acpi_init(void) | ||
339 | acpi_wakeup_device_init(); | ||
340 | acpi_debugger_init(); | ||
341 | acpi_setup_sb_notify_handler(); | ||
342 | - acpi_set_processor_mapping(); | ||
343 | return 0; | ||
344 | } | ||
345 | |||
346 | diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c | ||
347 | index 5c78ee1860b0..fd59ae871db3 100644 | ||
348 | --- a/drivers/acpi/processor_core.c | ||
349 | +++ b/drivers/acpi/processor_core.c | ||
350 | @@ -280,79 +280,6 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) | ||
351 | } | ||
352 | EXPORT_SYMBOL_GPL(acpi_get_cpuid); | ||
353 | |||
354 | -#ifdef CONFIG_ACPI_HOTPLUG_CPU | ||
355 | -static bool __init | ||
356 | -map_processor(acpi_handle handle, phys_cpuid_t *phys_id, int *cpuid) | ||
357 | -{ | ||
358 | - int type, id; | ||
359 | - u32 acpi_id; | ||
360 | - acpi_status status; | ||
361 | - acpi_object_type acpi_type; | ||
362 | - unsigned long long tmp; | ||
363 | - union acpi_object object = { 0 }; | ||
364 | - struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; | ||
365 | - | ||
366 | - status = acpi_get_type(handle, &acpi_type); | ||
367 | - if (ACPI_FAILURE(status)) | ||
368 | - return false; | ||
369 | - | ||
370 | - switch (acpi_type) { | ||
371 | - case ACPI_TYPE_PROCESSOR: | ||
372 | - status = acpi_evaluate_object(handle, NULL, NULL, &buffer); | ||
373 | - if (ACPI_FAILURE(status)) | ||
374 | - return false; | ||
375 | - acpi_id = object.processor.proc_id; | ||
376 | - | ||
377 | - /* validate the acpi_id */ | ||
378 | - if(acpi_processor_validate_proc_id(acpi_id)) | ||
379 | - return false; | ||
380 | - break; | ||
381 | - case ACPI_TYPE_DEVICE: | ||
382 | - status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp); | ||
383 | - if (ACPI_FAILURE(status)) | ||
384 | - return false; | ||
385 | - acpi_id = tmp; | ||
386 | - break; | ||
387 | - default: | ||
388 | - return false; | ||
389 | - } | ||
390 | - | ||
391 | - type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0; | ||
392 | - | ||
393 | - *phys_id = __acpi_get_phys_id(handle, type, acpi_id, false); | ||
394 | - id = acpi_map_cpuid(*phys_id, acpi_id); | ||
395 | - | ||
396 | - if (id < 0) | ||
397 | - return false; | ||
398 | - *cpuid = id; | ||
399 | - return true; | ||
400 | -} | ||
401 | - | ||
402 | -static acpi_status __init | ||
403 | -set_processor_node_mapping(acpi_handle handle, u32 lvl, void *context, | ||
404 | - void **rv) | ||
405 | -{ | ||
406 | - phys_cpuid_t phys_id; | ||
407 | - int cpu_id; | ||
408 | - | ||
409 | - if (!map_processor(handle, &phys_id, &cpu_id)) | ||
410 | - return AE_ERROR; | ||
411 | - | ||
412 | - acpi_map_cpu2node(handle, cpu_id, phys_id); | ||
413 | - return AE_OK; | ||
414 | -} | ||
415 | - | ||
416 | -void __init acpi_set_processor_mapping(void) | ||
417 | -{ | ||
418 | - /* Set persistent cpu <-> node mapping for all processors. */ | ||
419 | - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, | ||
420 | - ACPI_UINT32_MAX, set_processor_node_mapping, | ||
421 | - NULL, NULL, NULL); | ||
422 | -} | ||
423 | -#else | ||
424 | -void __init acpi_set_processor_mapping(void) {} | ||
425 | -#endif /* CONFIG_ACPI_HOTPLUG_CPU */ | ||
426 | - | ||
427 | #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC | ||
428 | static int get_ioapic_id(struct acpi_subtable_header *entry, u32 gsi_base, | ||
429 | u64 *phys_addr, int *ioapic_id) | ||
430 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
431 | index 693028659ccc..3ae950c82922 100644 | ||
432 | --- a/drivers/bluetooth/btusb.c | ||
433 | +++ b/drivers/bluetooth/btusb.c | ||
434 | @@ -1059,6 +1059,10 @@ static int btusb_open(struct hci_dev *hdev) | ||
435 | } | ||
436 | |||
437 | data->intf->needs_remote_wakeup = 1; | ||
438 | + /* device specific wakeup source enabled and required for USB | ||
439 | + * remote wakeup while host is suspended | ||
440 | + */ | ||
441 | + device_wakeup_enable(&data->udev->dev); | ||
442 | |||
443 | if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags)) | ||
444 | goto done; | ||
445 | @@ -1122,6 +1126,7 @@ static int btusb_close(struct hci_dev *hdev) | ||
446 | goto failed; | ||
447 | |||
448 | data->intf->needs_remote_wakeup = 0; | ||
449 | + device_wakeup_disable(&data->udev->dev); | ||
450 | usb_autopm_put_interface(data->intf); | ||
451 | |||
452 | failed: | ||
453 | diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c | ||
454 | index f0249899fc96..45d7ecc66b22 100644 | ||
455 | --- a/drivers/bus/arm-ccn.c | ||
456 | +++ b/drivers/bus/arm-ccn.c | ||
457 | @@ -1280,6 +1280,7 @@ static int arm_ccn_pmu_init(struct arm_ccn *ccn) | ||
458 | |||
459 | /* Perf driver registration */ | ||
460 | ccn->dt.pmu = (struct pmu) { | ||
461 | + .module = THIS_MODULE, | ||
462 | .attr_groups = arm_ccn_pmu_attr_groups, | ||
463 | .task_ctx_nr = perf_invalid_context, | ||
464 | .event_init = arm_ccn_pmu_event_init, | ||
465 | diff --git a/drivers/clk/hisilicon/clk-hi6220.c b/drivers/clk/hisilicon/clk-hi6220.c | ||
466 | index c0e8e1f196aa..2bfaf22e6ffc 100644 | ||
467 | --- a/drivers/clk/hisilicon/clk-hi6220.c | ||
468 | +++ b/drivers/clk/hisilicon/clk-hi6220.c | ||
469 | @@ -144,7 +144,7 @@ static struct hisi_gate_clock hi6220_separated_gate_clks_sys[] __initdata = { | ||
470 | { HI6220_BBPPLL_SEL, "bbppll_sel", "pll0_bbp_gate", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 9, 0, }, | ||
471 | { HI6220_MEDIA_PLL_SRC, "media_pll_src", "pll_media_gate", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 10, 0, }, | ||
472 | { HI6220_MMC2_SEL, "mmc2_sel", "mmc2_mux1", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 11, 0, }, | ||
473 | - { HI6220_CS_ATB_SYSPLL, "cs_atb_syspll", "syspll", CLK_SET_RATE_PARENT|CLK_IGNORE_UNUSED, 0x270, 12, 0, }, | ||
474 | + { HI6220_CS_ATB_SYSPLL, "cs_atb_syspll", "syspll", CLK_SET_RATE_PARENT|CLK_IS_CRITICAL, 0x270, 12, 0, }, | ||
475 | }; | ||
476 | |||
477 | static struct hisi_mux_clock hi6220_mux_clks_sys[] __initdata = { | ||
478 | diff --git a/drivers/clk/imx/clk-imx6q.c b/drivers/clk/imx/clk-imx6q.c | ||
479 | index ce8ea10407e4..93a19667003d 100644 | ||
480 | --- a/drivers/clk/imx/clk-imx6q.c | ||
481 | +++ b/drivers/clk/imx/clk-imx6q.c | ||
482 | @@ -487,7 +487,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | ||
483 | clk[IMX6QDL_CLK_GPU2D_CORE] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24); | ||
484 | clk[IMX6QDL_CLK_GPU3D_CORE] = imx_clk_gate2("gpu3d_core", "gpu3d_core_podf", base + 0x6c, 26); | ||
485 | clk[IMX6QDL_CLK_HDMI_IAHB] = imx_clk_gate2("hdmi_iahb", "ahb", base + 0x70, 0); | ||
486 | - clk[IMX6QDL_CLK_HDMI_ISFR] = imx_clk_gate2("hdmi_isfr", "video_27m", base + 0x70, 4); | ||
487 | + clk[IMX6QDL_CLK_HDMI_ISFR] = imx_clk_gate2("hdmi_isfr", "mipi_core_cfg", base + 0x70, 4); | ||
488 | clk[IMX6QDL_CLK_I2C1] = imx_clk_gate2("i2c1", "ipg_per", base + 0x70, 6); | ||
489 | clk[IMX6QDL_CLK_I2C2] = imx_clk_gate2("i2c2", "ipg_per", base + 0x70, 8); | ||
490 | clk[IMX6QDL_CLK_I2C3] = imx_clk_gate2("i2c3", "ipg_per", base + 0x70, 10); | ||
491 | diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h | ||
492 | index 9f24fcfa304f..e425e50173c5 100644 | ||
493 | --- a/drivers/clk/mediatek/clk-mtk.h | ||
494 | +++ b/drivers/clk/mediatek/clk-mtk.h | ||
495 | @@ -185,6 +185,7 @@ struct mtk_pll_data { | ||
496 | uint32_t pcw_reg; | ||
497 | int pcw_shift; | ||
498 | const struct mtk_pll_div_table *div_table; | ||
499 | + const char *parent_name; | ||
500 | }; | ||
501 | |||
502 | void mtk_clk_register_plls(struct device_node *node, | ||
503 | diff --git a/drivers/clk/mediatek/clk-pll.c b/drivers/clk/mediatek/clk-pll.c | ||
504 | index 0c2deac17ce9..1502384a3093 100644 | ||
505 | --- a/drivers/clk/mediatek/clk-pll.c | ||
506 | +++ b/drivers/clk/mediatek/clk-pll.c | ||
507 | @@ -302,7 +302,10 @@ static struct clk *mtk_clk_register_pll(const struct mtk_pll_data *data, | ||
508 | |||
509 | init.name = data->name; | ||
510 | init.ops = &mtk_pll_ops; | ||
511 | - init.parent_names = &parent_name; | ||
512 | + if (data->parent_name) | ||
513 | + init.parent_names = &data->parent_name; | ||
514 | + else | ||
515 | + init.parent_names = &parent_name; | ||
516 | init.num_parents = 1; | ||
517 | |||
518 | clk = clk_register(NULL, &pll->hw); | ||
519 | diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c | ||
520 | index 8e2db5ead8da..af520d81525f 100644 | ||
521 | --- a/drivers/clk/tegra/clk-tegra30.c | ||
522 | +++ b/drivers/clk/tegra/clk-tegra30.c | ||
523 | @@ -963,7 +963,7 @@ static void __init tegra30_super_clk_init(void) | ||
524 | * U71 divider of cclk_lp. | ||
525 | */ | ||
526 | clk = tegra_clk_register_divider("pll_p_out3_cclklp", "pll_p_out3", | ||
527 | - clk_base + SUPER_CCLKG_DIVIDER, 0, | ||
528 | + clk_base + SUPER_CCLKLP_DIVIDER, 0, | ||
529 | TEGRA_DIVIDER_INT, 16, 8, 1, NULL); | ||
530 | clk_register_clkdev(clk, "pll_p_out3_cclklp", NULL); | ||
531 | |||
532 | diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c | ||
533 | index 6b535262ac5d..3db94e81bc14 100644 | ||
534 | --- a/drivers/dma/dmaengine.c | ||
535 | +++ b/drivers/dma/dmaengine.c | ||
536 | @@ -1107,12 +1107,14 @@ static struct dmaengine_unmap_pool *__get_unmap_pool(int nr) | ||
537 | switch (order) { | ||
538 | case 0 ... 1: | ||
539 | return &unmap_pool[0]; | ||
540 | +#if IS_ENABLED(CONFIG_DMA_ENGINE_RAID) | ||
541 | case 2 ... 4: | ||
542 | return &unmap_pool[1]; | ||
543 | case 5 ... 7: | ||
544 | return &unmap_pool[2]; | ||
545 | case 8: | ||
546 | return &unmap_pool[3]; | ||
547 | +#endif | ||
548 | default: | ||
549 | BUG(); | ||
550 | return NULL; | ||
551 | diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c | ||
552 | index fbb75514dfb4..e0bd578a253a 100644 | ||
553 | --- a/drivers/dma/dmatest.c | ||
554 | +++ b/drivers/dma/dmatest.c | ||
555 | @@ -158,6 +158,12 @@ MODULE_PARM_DESC(run, "Run the test (default: false)"); | ||
556 | #define PATTERN_OVERWRITE 0x20 | ||
557 | #define PATTERN_COUNT_MASK 0x1f | ||
558 | |||
559 | +/* poor man's completion - we want to use wait_event_freezable() on it */ | ||
560 | +struct dmatest_done { | ||
561 | + bool done; | ||
562 | + wait_queue_head_t *wait; | ||
563 | +}; | ||
564 | + | ||
565 | struct dmatest_thread { | ||
566 | struct list_head node; | ||
567 | struct dmatest_info *info; | ||
568 | @@ -166,6 +172,8 @@ struct dmatest_thread { | ||
569 | u8 **srcs; | ||
570 | u8 **dsts; | ||
571 | enum dma_transaction_type type; | ||
572 | + wait_queue_head_t done_wait; | ||
573 | + struct dmatest_done test_done; | ||
574 | bool done; | ||
575 | }; | ||
576 | |||
577 | @@ -326,18 +334,25 @@ static unsigned int dmatest_verify(u8 **bufs, unsigned int start, | ||
578 | return error_count; | ||
579 | } | ||
580 | |||
581 | -/* poor man's completion - we want to use wait_event_freezable() on it */ | ||
582 | -struct dmatest_done { | ||
583 | - bool done; | ||
584 | - wait_queue_head_t *wait; | ||
585 | -}; | ||
586 | |||
587 | static void dmatest_callback(void *arg) | ||
588 | { | ||
589 | struct dmatest_done *done = arg; | ||
590 | - | ||
591 | - done->done = true; | ||
592 | - wake_up_all(done->wait); | ||
593 | + struct dmatest_thread *thread = | ||
594 | + container_of(arg, struct dmatest_thread, done_wait); | ||
595 | + if (!thread->done) { | ||
596 | + done->done = true; | ||
597 | + wake_up_all(done->wait); | ||
598 | + } else { | ||
599 | + /* | ||
600 | + * If thread->done, it means that this callback occurred | ||
601 | + * after the parent thread has cleaned up. This can | ||
602 | + * happen in the case that driver doesn't implement | ||
603 | + * the terminate_all() functionality and a dma operation | ||
604 | + * did not occur within the timeout period | ||
605 | + */ | ||
606 | + WARN(1, "dmatest: Kernel memory may be corrupted!!\n"); | ||
607 | + } | ||
608 | } | ||
609 | |||
610 | static unsigned int min_odd(unsigned int x, unsigned int y) | ||
611 | @@ -408,9 +423,8 @@ static unsigned long long dmatest_KBs(s64 runtime, unsigned long long len) | ||
612 | */ | ||
613 | static int dmatest_func(void *data) | ||
614 | { | ||
615 | - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_wait); | ||
616 | struct dmatest_thread *thread = data; | ||
617 | - struct dmatest_done done = { .wait = &done_wait }; | ||
618 | + struct dmatest_done *done = &thread->test_done; | ||
619 | struct dmatest_info *info; | ||
620 | struct dmatest_params *params; | ||
621 | struct dma_chan *chan; | ||
622 | @@ -637,9 +651,9 @@ static int dmatest_func(void *data) | ||
623 | continue; | ||
624 | } | ||
625 | |||
626 | - done.done = false; | ||
627 | + done->done = false; | ||
628 | tx->callback = dmatest_callback; | ||
629 | - tx->callback_param = &done; | ||
630 | + tx->callback_param = done; | ||
631 | cookie = tx->tx_submit(tx); | ||
632 | |||
633 | if (dma_submit_error(cookie)) { | ||
634 | @@ -652,21 +666,12 @@ static int dmatest_func(void *data) | ||
635 | } | ||
636 | dma_async_issue_pending(chan); | ||
637 | |||
638 | - wait_event_freezable_timeout(done_wait, done.done, | ||
639 | + wait_event_freezable_timeout(thread->done_wait, done->done, | ||
640 | msecs_to_jiffies(params->timeout)); | ||
641 | |||
642 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); | ||
643 | |||
644 | - if (!done.done) { | ||
645 | - /* | ||
646 | - * We're leaving the timed out dma operation with | ||
647 | - * dangling pointer to done_wait. To make this | ||
648 | - * correct, we'll need to allocate wait_done for | ||
649 | - * each test iteration and perform "who's gonna | ||
650 | - * free it this time?" dancing. For now, just | ||
651 | - * leave it dangling. | ||
652 | - */ | ||
653 | - WARN(1, "dmatest: Kernel stack may be corrupted!!\n"); | ||
654 | + if (!done->done) { | ||
655 | dmaengine_unmap_put(um); | ||
656 | result("test timed out", total_tests, src_off, dst_off, | ||
657 | len, 0); | ||
658 | @@ -747,7 +752,7 @@ static int dmatest_func(void *data) | ||
659 | dmatest_KBs(runtime, total_len), ret); | ||
660 | |||
661 | /* terminate all transfers on specified channels */ | ||
662 | - if (ret) | ||
663 | + if (ret || failed_tests) | ||
664 | dmaengine_terminate_all(chan); | ||
665 | |||
666 | thread->done = true; | ||
667 | @@ -807,6 +812,8 @@ static int dmatest_add_threads(struct dmatest_info *info, | ||
668 | thread->info = info; | ||
669 | thread->chan = dtc->chan; | ||
670 | thread->type = type; | ||
671 | + thread->test_done.wait = &thread->done_wait; | ||
672 | + init_waitqueue_head(&thread->done_wait); | ||
673 | smp_wmb(); | ||
674 | thread->task = kthread_create(dmatest_func, thread, "%s-%s%u", | ||
675 | dma_chan_name(chan), op, i); | ||
676 | diff --git a/drivers/dma/ti-dma-crossbar.c b/drivers/dma/ti-dma-crossbar.c | ||
677 | index 88a00d06def6..43e88d85129e 100644 | ||
678 | --- a/drivers/dma/ti-dma-crossbar.c | ||
679 | +++ b/drivers/dma/ti-dma-crossbar.c | ||
680 | @@ -49,12 +49,12 @@ struct ti_am335x_xbar_data { | ||
681 | |||
682 | struct ti_am335x_xbar_map { | ||
683 | u16 dma_line; | ||
684 | - u16 mux_val; | ||
685 | + u8 mux_val; | ||
686 | }; | ||
687 | |||
688 | -static inline void ti_am335x_xbar_write(void __iomem *iomem, int event, u16 val) | ||
689 | +static inline void ti_am335x_xbar_write(void __iomem *iomem, int event, u8 val) | ||
690 | { | ||
691 | - writeb_relaxed(val & 0x1f, iomem + event); | ||
692 | + writeb_relaxed(val, iomem + event); | ||
693 | } | ||
694 | |||
695 | static void ti_am335x_xbar_free(struct device *dev, void *route_data) | ||
696 | @@ -105,7 +105,7 @@ static void *ti_am335x_xbar_route_allocate(struct of_phandle_args *dma_spec, | ||
697 | } | ||
698 | |||
699 | map->dma_line = (u16)dma_spec->args[0]; | ||
700 | - map->mux_val = (u16)dma_spec->args[2]; | ||
701 | + map->mux_val = (u8)dma_spec->args[2]; | ||
702 | |||
703 | dma_spec->args[2] = 0; | ||
704 | dma_spec->args_count = 2; | ||
705 | diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c | ||
706 | index 2f48f848865f..2f47c5b5f4cb 100644 | ||
707 | --- a/drivers/firmware/efi/efi.c | ||
708 | +++ b/drivers/firmware/efi/efi.c | ||
709 | @@ -384,7 +384,6 @@ int __init efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md) | ||
710 | return 0; | ||
711 | } | ||
712 | } | ||
713 | - pr_err_once("requested map not found.\n"); | ||
714 | return -ENOENT; | ||
715 | } | ||
716 | |||
717 | diff --git a/drivers/firmware/efi/esrt.c b/drivers/firmware/efi/esrt.c | ||
718 | index 307ec1c11276..311c9d0e8cbb 100644 | ||
719 | --- a/drivers/firmware/efi/esrt.c | ||
720 | +++ b/drivers/firmware/efi/esrt.c | ||
721 | @@ -251,7 +251,7 @@ void __init efi_esrt_init(void) | ||
722 | |||
723 | rc = efi_mem_desc_lookup(efi.esrt, &md); | ||
724 | if (rc < 0) { | ||
725 | - pr_err("ESRT header is not in the memory map.\n"); | ||
726 | + pr_warn("ESRT header is not in the memory map.\n"); | ||
727 | return; | ||
728 | } | ||
729 | |||
730 | diff --git a/drivers/gpu/drm/amd/acp/Makefile b/drivers/gpu/drm/amd/acp/Makefile | ||
731 | index 8363cb57915b..8a08e81ee90d 100644 | ||
732 | --- a/drivers/gpu/drm/amd/acp/Makefile | ||
733 | +++ b/drivers/gpu/drm/amd/acp/Makefile | ||
734 | @@ -3,6 +3,4 @@ | ||
735 | # of AMDSOC/AMDGPU drm driver. | ||
736 | # It provides the HW control for ACP related functionalities. | ||
737 | |||
738 | -subdir-ccflags-y += -I$(AMDACPPATH)/ -I$(AMDACPPATH)/include | ||
739 | - | ||
740 | AMD_ACP_FILES := $(AMDACPPATH)/acp_hw.o | ||
741 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | ||
742 | index bfb4b91869e7..f26d1fd53bef 100644 | ||
743 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | ||
744 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | ||
745 | @@ -240,6 +240,8 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) | ||
746 | for (; i >= 0; i--) | ||
747 | drm_free_large(p->chunks[i].kdata); | ||
748 | kfree(p->chunks); | ||
749 | + p->chunks = NULL; | ||
750 | + p->nchunks = 0; | ||
751 | put_ctx: | ||
752 | amdgpu_ctx_put(p->ctx); | ||
753 | free_chunk: | ||
754 | diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | ||
755 | index af267c35d813..ee5883f59be5 100644 | ||
756 | --- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | ||
757 | +++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | ||
758 | @@ -147,9 +147,6 @@ static int omap_gem_dmabuf_mmap(struct dma_buf *buffer, | ||
759 | struct drm_gem_object *obj = buffer->priv; | ||
760 | int ret = 0; | ||
761 | |||
762 | - if (WARN_ON(!obj->filp)) | ||
763 | - return -EINVAL; | ||
764 | - | ||
765 | ret = drm_gem_mmap_obj(obj, omap_gem_mmap_size(obj), vma); | ||
766 | if (ret < 0) | ||
767 | return ret; | ||
768 | diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c | ||
769 | index 13ba73fd9b68..8bd9e6c371d1 100644 | ||
770 | --- a/drivers/gpu/drm/radeon/si_dpm.c | ||
771 | +++ b/drivers/gpu/drm/radeon/si_dpm.c | ||
772 | @@ -3029,6 +3029,16 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | ||
773 | max_sclk = 75000; | ||
774 | max_mclk = 80000; | ||
775 | } | ||
776 | + } else if (rdev->family == CHIP_OLAND) { | ||
777 | + if ((rdev->pdev->revision == 0xC7) || | ||
778 | + (rdev->pdev->revision == 0x80) || | ||
779 | + (rdev->pdev->revision == 0x81) || | ||
780 | + (rdev->pdev->revision == 0x83) || | ||
781 | + (rdev->pdev->revision == 0x87) || | ||
782 | + (rdev->pdev->device == 0x6604) || | ||
783 | + (rdev->pdev->device == 0x6605)) { | ||
784 | + max_sclk = 75000; | ||
785 | + } | ||
786 | } | ||
787 | /* Apply dpm quirks */ | ||
788 | while (p && p->chip_device != 0) { | ||
789 | diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c | ||
790 | index e06c1344c913..7af77818efc3 100644 | ||
791 | --- a/drivers/hid/hid-cp2112.c | ||
792 | +++ b/drivers/hid/hid-cp2112.c | ||
793 | @@ -188,6 +188,8 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
794 | HID_REQ_GET_REPORT); | ||
795 | if (ret != CP2112_GPIO_CONFIG_LENGTH) { | ||
796 | hid_err(hdev, "error requesting GPIO config: %d\n", ret); | ||
797 | + if (ret >= 0) | ||
798 | + ret = -EIO; | ||
799 | goto exit; | ||
800 | } | ||
801 | |||
802 | @@ -197,8 +199,10 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
803 | ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, | ||
804 | CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT, | ||
805 | HID_REQ_SET_REPORT); | ||
806 | - if (ret < 0) { | ||
807 | + if (ret != CP2112_GPIO_CONFIG_LENGTH) { | ||
808 | hid_err(hdev, "error setting GPIO config: %d\n", ret); | ||
809 | + if (ret >= 0) | ||
810 | + ret = -EIO; | ||
811 | goto exit; | ||
812 | } | ||
813 | |||
814 | @@ -206,7 +210,7 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset) | ||
815 | |||
816 | exit: | ||
817 | mutex_unlock(&dev->lock); | ||
818 | - return ret < 0 ? ret : -EIO; | ||
819 | + return ret; | ||
820 | } | ||
821 | |||
822 | static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
823 | diff --git a/drivers/hv/hv_fcopy.c b/drivers/hv/hv_fcopy.c | ||
824 | index 75126e4e3f05..44420073edda 100644 | ||
825 | --- a/drivers/hv/hv_fcopy.c | ||
826 | +++ b/drivers/hv/hv_fcopy.c | ||
827 | @@ -61,7 +61,6 @@ static DECLARE_WORK(fcopy_send_work, fcopy_send_data); | ||
828 | static const char fcopy_devname[] = "vmbus/hv_fcopy"; | ||
829 | static u8 *recv_buffer; | ||
830 | static struct hvutil_transport *hvt; | ||
831 | -static struct completion release_event; | ||
832 | /* | ||
833 | * This state maintains the version number registered by the daemon. | ||
834 | */ | ||
835 | @@ -322,7 +321,6 @@ static void fcopy_on_reset(void) | ||
836 | |||
837 | if (cancel_delayed_work_sync(&fcopy_timeout_work)) | ||
838 | fcopy_respond_to_host(HV_E_FAIL); | ||
839 | - complete(&release_event); | ||
840 | } | ||
841 | |||
842 | int hv_fcopy_init(struct hv_util_service *srv) | ||
843 | @@ -330,7 +328,6 @@ int hv_fcopy_init(struct hv_util_service *srv) | ||
844 | recv_buffer = srv->recv_buffer; | ||
845 | fcopy_transaction.recv_channel = srv->channel; | ||
846 | |||
847 | - init_completion(&release_event); | ||
848 | /* | ||
849 | * When this driver loads, the user level daemon that | ||
850 | * processes the host requests may not yet be running. | ||
851 | @@ -352,5 +349,4 @@ void hv_fcopy_deinit(void) | ||
852 | fcopy_transaction.state = HVUTIL_DEVICE_DYING; | ||
853 | cancel_delayed_work_sync(&fcopy_timeout_work); | ||
854 | hvutil_transport_destroy(hvt); | ||
855 | - wait_for_completion(&release_event); | ||
856 | } | ||
857 | diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c | ||
858 | index 3abfc5983c97..5e1fdc8d32ab 100644 | ||
859 | --- a/drivers/hv/hv_kvp.c | ||
860 | +++ b/drivers/hv/hv_kvp.c | ||
861 | @@ -88,7 +88,6 @@ static DECLARE_WORK(kvp_sendkey_work, kvp_send_key); | ||
862 | static const char kvp_devname[] = "vmbus/hv_kvp"; | ||
863 | static u8 *recv_buffer; | ||
864 | static struct hvutil_transport *hvt; | ||
865 | -static struct completion release_event; | ||
866 | /* | ||
867 | * Register the kernel component with the user-level daemon. | ||
868 | * As part of this registration, pass the LIC version number. | ||
869 | @@ -717,7 +716,6 @@ static void kvp_on_reset(void) | ||
870 | if (cancel_delayed_work_sync(&kvp_timeout_work)) | ||
871 | kvp_respond_to_host(NULL, HV_E_FAIL); | ||
872 | kvp_transaction.state = HVUTIL_DEVICE_INIT; | ||
873 | - complete(&release_event); | ||
874 | } | ||
875 | |||
876 | int | ||
877 | @@ -726,7 +724,6 @@ hv_kvp_init(struct hv_util_service *srv) | ||
878 | recv_buffer = srv->recv_buffer; | ||
879 | kvp_transaction.recv_channel = srv->channel; | ||
880 | |||
881 | - init_completion(&release_event); | ||
882 | /* | ||
883 | * When this driver loads, the user level daemon that | ||
884 | * processes the host requests may not yet be running. | ||
885 | @@ -750,5 +747,4 @@ void hv_kvp_deinit(void) | ||
886 | cancel_delayed_work_sync(&kvp_timeout_work); | ||
887 | cancel_work_sync(&kvp_sendkey_work); | ||
888 | hvutil_transport_destroy(hvt); | ||
889 | - wait_for_completion(&release_event); | ||
890 | } | ||
891 | diff --git a/drivers/hv/hv_snapshot.c b/drivers/hv/hv_snapshot.c | ||
892 | index a76e3db0d01f..a6707133c297 100644 | ||
893 | --- a/drivers/hv/hv_snapshot.c | ||
894 | +++ b/drivers/hv/hv_snapshot.c | ||
895 | @@ -66,7 +66,6 @@ static int dm_reg_value; | ||
896 | static const char vss_devname[] = "vmbus/hv_vss"; | ||
897 | static __u8 *recv_buffer; | ||
898 | static struct hvutil_transport *hvt; | ||
899 | -static struct completion release_event; | ||
900 | |||
901 | static void vss_timeout_func(struct work_struct *dummy); | ||
902 | static void vss_handle_request(struct work_struct *dummy); | ||
903 | @@ -331,13 +330,11 @@ static void vss_on_reset(void) | ||
904 | if (cancel_delayed_work_sync(&vss_timeout_work)) | ||
905 | vss_respond_to_host(HV_E_FAIL); | ||
906 | vss_transaction.state = HVUTIL_DEVICE_INIT; | ||
907 | - complete(&release_event); | ||
908 | } | ||
909 | |||
910 | int | ||
911 | hv_vss_init(struct hv_util_service *srv) | ||
912 | { | ||
913 | - init_completion(&release_event); | ||
914 | if (vmbus_proto_version < VERSION_WIN8_1) { | ||
915 | pr_warn("Integration service 'Backup (volume snapshot)'" | ||
916 | " not supported on this host version.\n"); | ||
917 | @@ -368,5 +365,4 @@ void hv_vss_deinit(void) | ||
918 | cancel_delayed_work_sync(&vss_timeout_work); | ||
919 | cancel_work_sync(&vss_handle_request_work); | ||
920 | hvutil_transport_destroy(hvt); | ||
921 | - wait_for_completion(&release_event); | ||
922 | } | ||
923 | diff --git a/drivers/hv/hv_utils_transport.c b/drivers/hv/hv_utils_transport.c | ||
924 | index c235a9515267..4402a71e23f7 100644 | ||
925 | --- a/drivers/hv/hv_utils_transport.c | ||
926 | +++ b/drivers/hv/hv_utils_transport.c | ||
927 | @@ -182,10 +182,11 @@ static int hvt_op_release(struct inode *inode, struct file *file) | ||
928 | * connects back. | ||
929 | */ | ||
930 | hvt_reset(hvt); | ||
931 | - mutex_unlock(&hvt->lock); | ||
932 | |||
933 | if (mode_old == HVUTIL_TRANSPORT_DESTROY) | ||
934 | - hvt_transport_free(hvt); | ||
935 | + complete(&hvt->release); | ||
936 | + | ||
937 | + mutex_unlock(&hvt->lock); | ||
938 | |||
939 | return 0; | ||
940 | } | ||
941 | @@ -304,6 +305,7 @@ struct hvutil_transport *hvutil_transport_init(const char *name, | ||
942 | |||
943 | init_waitqueue_head(&hvt->outmsg_q); | ||
944 | mutex_init(&hvt->lock); | ||
945 | + init_completion(&hvt->release); | ||
946 | |||
947 | spin_lock(&hvt_list_lock); | ||
948 | list_add(&hvt->list, &hvt_list); | ||
949 | @@ -351,6 +353,8 @@ void hvutil_transport_destroy(struct hvutil_transport *hvt) | ||
950 | if (hvt->cn_id.idx > 0 && hvt->cn_id.val > 0) | ||
951 | cn_del_callback(&hvt->cn_id); | ||
952 | |||
953 | - if (mode_old != HVUTIL_TRANSPORT_CHARDEV) | ||
954 | - hvt_transport_free(hvt); | ||
955 | + if (mode_old == HVUTIL_TRANSPORT_CHARDEV) | ||
956 | + wait_for_completion(&hvt->release); | ||
957 | + | ||
958 | + hvt_transport_free(hvt); | ||
959 | } | ||
960 | diff --git a/drivers/hv/hv_utils_transport.h b/drivers/hv/hv_utils_transport.h | ||
961 | index d98f5225c3e6..79afb626e166 100644 | ||
962 | --- a/drivers/hv/hv_utils_transport.h | ||
963 | +++ b/drivers/hv/hv_utils_transport.h | ||
964 | @@ -41,6 +41,7 @@ struct hvutil_transport { | ||
965 | int outmsg_len; /* its length */ | ||
966 | wait_queue_head_t outmsg_q; /* poll/read wait queue */ | ||
967 | struct mutex lock; /* protects struct members */ | ||
968 | + struct completion release; /* synchronize with fd release */ | ||
969 | }; | ||
970 | |||
971 | struct hvutil_transport *hvutil_transport_init(const char *name, | ||
972 | diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c | ||
973 | index 63b5db4e4070..e0f3244505d3 100644 | ||
974 | --- a/drivers/hwtracing/intel_th/pci.c | ||
975 | +++ b/drivers/hwtracing/intel_th/pci.c | ||
976 | @@ -95,6 +95,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { | ||
977 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x9da6), | ||
978 | .driver_data = (kernel_ulong_t)0, | ||
979 | }, | ||
980 | + { | ||
981 | + /* Gemini Lake */ | ||
982 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x318e), | ||
983 | + .driver_data = (kernel_ulong_t)0, | ||
984 | + }, | ||
985 | { 0 }, | ||
986 | }; | ||
987 | |||
988 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c | ||
989 | index 809a02800102..a09d6eed3b88 100644 | ||
990 | --- a/drivers/infiniband/core/cma.c | ||
991 | +++ b/drivers/infiniband/core/cma.c | ||
992 | @@ -1482,7 +1482,7 @@ static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id, | ||
993 | return id_priv; | ||
994 | } | ||
995 | |||
996 | -static inline int cma_user_data_offset(struct rdma_id_private *id_priv) | ||
997 | +static inline u8 cma_user_data_offset(struct rdma_id_private *id_priv) | ||
998 | { | ||
999 | return cma_family(id_priv) == AF_IB ? 0 : sizeof(struct cma_hdr); | ||
1000 | } | ||
1001 | @@ -1877,7 +1877,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | ||
1002 | struct rdma_id_private *listen_id, *conn_id = NULL; | ||
1003 | struct rdma_cm_event event; | ||
1004 | struct net_device *net_dev; | ||
1005 | - int offset, ret; | ||
1006 | + u8 offset; | ||
1007 | + int ret; | ||
1008 | |||
1009 | listen_id = cma_id_from_event(cm_id, ib_event, &net_dev); | ||
1010 | if (IS_ERR(listen_id)) | ||
1011 | @@ -3309,7 +3310,8 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv, | ||
1012 | struct ib_cm_sidr_req_param req; | ||
1013 | struct ib_cm_id *id; | ||
1014 | void *private_data; | ||
1015 | - int offset, ret; | ||
1016 | + u8 offset; | ||
1017 | + int ret; | ||
1018 | |||
1019 | memset(&req, 0, sizeof req); | ||
1020 | offset = cma_user_data_offset(id_priv); | ||
1021 | @@ -3366,7 +3368,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv, | ||
1022 | struct rdma_route *route; | ||
1023 | void *private_data; | ||
1024 | struct ib_cm_id *id; | ||
1025 | - int offset, ret; | ||
1026 | + u8 offset; | ||
1027 | + int ret; | ||
1028 | |||
1029 | memset(&req, 0, sizeof req); | ||
1030 | offset = cma_user_data_offset(id_priv); | ||
1031 | diff --git a/drivers/infiniband/hw/cxgb4/t4.h b/drivers/infiniband/hw/cxgb4/t4.h | ||
1032 | index 862381aa83c8..b55adf53c758 100644 | ||
1033 | --- a/drivers/infiniband/hw/cxgb4/t4.h | ||
1034 | +++ b/drivers/infiniband/hw/cxgb4/t4.h | ||
1035 | @@ -171,7 +171,7 @@ struct t4_cqe { | ||
1036 | __be32 msn; | ||
1037 | } rcqe; | ||
1038 | struct { | ||
1039 | - u32 stag; | ||
1040 | + __be32 stag; | ||
1041 | u16 nada2; | ||
1042 | u16 cidx; | ||
1043 | } scqe; | ||
1044 | diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c | ||
1045 | index 24d0820873cf..4682909b021b 100644 | ||
1046 | --- a/drivers/infiniband/hw/hfi1/chip.c | ||
1047 | +++ b/drivers/infiniband/hw/hfi1/chip.c | ||
1048 | @@ -9769,7 +9769,7 @@ int hfi1_get_ib_cfg(struct hfi1_pportdata *ppd, int which) | ||
1049 | goto unimplemented; | ||
1050 | |||
1051 | case HFI1_IB_CFG_OP_VLS: | ||
1052 | - val = ppd->vls_operational; | ||
1053 | + val = ppd->actual_vls_operational; | ||
1054 | break; | ||
1055 | case HFI1_IB_CFG_VL_HIGH_CAP: /* VL arb high priority table size */ | ||
1056 | val = VL_ARB_HIGH_PRIO_TABLE_SIZE; | ||
1057 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | ||
1058 | index 830fecb6934c..335bd2c9e16e 100644 | ||
1059 | --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c | ||
1060 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | ||
1061 | @@ -1177,10 +1177,15 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, | ||
1062 | ipoib_ib_dev_down(dev); | ||
1063 | |||
1064 | if (level == IPOIB_FLUSH_HEAVY) { | ||
1065 | + rtnl_lock(); | ||
1066 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | ||
1067 | ipoib_ib_dev_stop(dev); | ||
1068 | - if (ipoib_ib_dev_open(dev) != 0) | ||
1069 | + | ||
1070 | + result = ipoib_ib_dev_open(dev); | ||
1071 | + rtnl_unlock(); | ||
1072 | + if (result) | ||
1073 | return; | ||
1074 | + | ||
1075 | if (netif_queue_stopped(dev)) | ||
1076 | netif_start_queue(dev); | ||
1077 | } | ||
1078 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h | ||
1079 | index dbf09836ff30..d1051e3ce819 100644 | ||
1080 | --- a/drivers/input/serio/i8042-x86ia64io.h | ||
1081 | +++ b/drivers/input/serio/i8042-x86ia64io.h | ||
1082 | @@ -520,6 +520,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | ||
1083 | DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), | ||
1084 | }, | ||
1085 | }, | ||
1086 | + { | ||
1087 | + /* TUXEDO BU1406 */ | ||
1088 | + .matches = { | ||
1089 | + DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), | ||
1090 | + DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"), | ||
1091 | + }, | ||
1092 | + }, | ||
1093 | { } | ||
1094 | }; | ||
1095 | |||
1096 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
1097 | index 1a0b110f12c0..0c910a863581 100644 | ||
1098 | --- a/drivers/iommu/amd_iommu.c | ||
1099 | +++ b/drivers/iommu/amd_iommu.c | ||
1100 | @@ -3211,7 +3211,7 @@ static void amd_iommu_apply_dm_region(struct device *dev, | ||
1101 | unsigned long start, end; | ||
1102 | |||
1103 | start = IOVA_PFN(region->start); | ||
1104 | - end = IOVA_PFN(region->start + region->length); | ||
1105 | + end = IOVA_PFN(region->start + region->length - 1); | ||
1106 | |||
1107 | WARN_ON_ONCE(reserve_iova(&dma_dom->iovad, start, end) == NULL); | ||
1108 | } | ||
1109 | diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c | ||
1110 | index f50e51c1a9c8..d68a552cfe8d 100644 | ||
1111 | --- a/drivers/iommu/io-pgtable-arm-v7s.c | ||
1112 | +++ b/drivers/iommu/io-pgtable-arm-v7s.c | ||
1113 | @@ -418,8 +418,12 @@ static int __arm_v7s_map(struct arm_v7s_io_pgtable *data, unsigned long iova, | ||
1114 | pte |= ARM_V7S_ATTR_NS_TABLE; | ||
1115 | |||
1116 | __arm_v7s_set_pte(ptep, pte, 1, cfg); | ||
1117 | - } else { | ||
1118 | + } else if (ARM_V7S_PTE_IS_TABLE(pte, lvl)) { | ||
1119 | cptep = iopte_deref(pte, lvl); | ||
1120 | + } else { | ||
1121 | + /* We require an unmap first */ | ||
1122 | + WARN_ON(!selftest_running); | ||
1123 | + return -EEXIST; | ||
1124 | } | ||
1125 | |||
1126 | /* Rinse, repeat */ | ||
1127 | diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c | ||
1128 | index b8aeb0768483..68c6050d1efb 100644 | ||
1129 | --- a/drivers/iommu/mtk_iommu_v1.c | ||
1130 | +++ b/drivers/iommu/mtk_iommu_v1.c | ||
1131 | @@ -703,7 +703,7 @@ static struct platform_driver mtk_iommu_driver = { | ||
1132 | .probe = mtk_iommu_probe, | ||
1133 | .remove = mtk_iommu_remove, | ||
1134 | .driver = { | ||
1135 | - .name = "mtk-iommu", | ||
1136 | + .name = "mtk-iommu-v1", | ||
1137 | .of_match_table = mtk_iommu_of_ids, | ||
1138 | .pm = &mtk_iommu_pm_ops, | ||
1139 | } | ||
1140 | diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig | ||
1141 | index bc0af3307bbf..910cb5e23371 100644 | ||
1142 | --- a/drivers/irqchip/Kconfig | ||
1143 | +++ b/drivers/irqchip/Kconfig | ||
1144 | @@ -258,6 +258,7 @@ config IRQ_MXS | ||
1145 | |||
1146 | config MVEBU_ODMI | ||
1147 | bool | ||
1148 | + select GENERIC_MSI_IRQ_DOMAIN | ||
1149 | |||
1150 | config MVEBU_PIC | ||
1151 | bool | ||
1152 | diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c | ||
1153 | index ab8a1b36af21..edb8d1a1a69f 100644 | ||
1154 | --- a/drivers/md/bcache/request.c | ||
1155 | +++ b/drivers/md/bcache/request.c | ||
1156 | @@ -468,6 +468,7 @@ struct search { | ||
1157 | unsigned recoverable:1; | ||
1158 | unsigned write:1; | ||
1159 | unsigned read_dirty_data:1; | ||
1160 | + unsigned cache_missed:1; | ||
1161 | |||
1162 | unsigned long start_time; | ||
1163 | |||
1164 | @@ -653,6 +654,7 @@ static inline struct search *search_alloc(struct bio *bio, | ||
1165 | |||
1166 | s->orig_bio = bio; | ||
1167 | s->cache_miss = NULL; | ||
1168 | + s->cache_missed = 0; | ||
1169 | s->d = d; | ||
1170 | s->recoverable = 1; | ||
1171 | s->write = op_is_write(bio_op(bio)); | ||
1172 | @@ -771,7 +773,7 @@ static void cached_dev_read_done_bh(struct closure *cl) | ||
1173 | struct cached_dev *dc = container_of(s->d, struct cached_dev, disk); | ||
1174 | |||
1175 | bch_mark_cache_accounting(s->iop.c, s->d, | ||
1176 | - !s->cache_miss, s->iop.bypass); | ||
1177 | + !s->cache_missed, s->iop.bypass); | ||
1178 | trace_bcache_read(s->orig_bio, !s->cache_miss, s->iop.bypass); | ||
1179 | |||
1180 | if (s->iop.error) | ||
1181 | @@ -790,6 +792,8 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s, | ||
1182 | struct cached_dev *dc = container_of(s->d, struct cached_dev, disk); | ||
1183 | struct bio *miss, *cache_bio; | ||
1184 | |||
1185 | + s->cache_missed = 1; | ||
1186 | + | ||
1187 | if (s->cache_miss || s->iop.bypass) { | ||
1188 | miss = bio_next_split(bio, sectors, GFP_NOIO, s->d->bio_split); | ||
1189 | ret = miss == bio ? MAP_DONE : MAP_CONTINUE; | ||
1190 | diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c | ||
1191 | index f4557f558b24..28ce342348a9 100644 | ||
1192 | --- a/drivers/md/bcache/super.c | ||
1193 | +++ b/drivers/md/bcache/super.c | ||
1194 | @@ -2091,6 +2091,7 @@ static void bcache_exit(void) | ||
1195 | if (bcache_major) | ||
1196 | unregister_blkdev(bcache_major, "bcache"); | ||
1197 | unregister_reboot_notifier(&reboot); | ||
1198 | + mutex_destroy(&bch_register_lock); | ||
1199 | } | ||
1200 | |||
1201 | static int __init bcache_init(void) | ||
1202 | @@ -2109,14 +2110,15 @@ static int __init bcache_init(void) | ||
1203 | bcache_major = register_blkdev(0, "bcache"); | ||
1204 | if (bcache_major < 0) { | ||
1205 | unregister_reboot_notifier(&reboot); | ||
1206 | + mutex_destroy(&bch_register_lock); | ||
1207 | return bcache_major; | ||
1208 | } | ||
1209 | |||
1210 | if (!(bcache_wq = alloc_workqueue("bcache", WQ_MEM_RECLAIM, 0)) || | ||
1211 | !(bcache_kobj = kobject_create_and_add("bcache", fs_kobj)) || | ||
1212 | - sysfs_create_files(bcache_kobj, files) || | ||
1213 | bch_request_init() || | ||
1214 | - bch_debug_init(bcache_kobj)) | ||
1215 | + bch_debug_init(bcache_kobj) || | ||
1216 | + sysfs_create_files(bcache_kobj, files)) | ||
1217 | goto err; | ||
1218 | |||
1219 | return 0; | ||
1220 | diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c | ||
1221 | index 2b13117fb918..ba7edcdd09ce 100644 | ||
1222 | --- a/drivers/md/md-cluster.c | ||
1223 | +++ b/drivers/md/md-cluster.c | ||
1224 | @@ -974,6 +974,7 @@ static int leave(struct mddev *mddev) | ||
1225 | lockres_free(cinfo->bitmap_lockres); | ||
1226 | unlock_all_bitmaps(mddev); | ||
1227 | dlm_release_lockspace(cinfo->lockspace, 2); | ||
1228 | + kfree(cinfo); | ||
1229 | return 0; | ||
1230 | } | ||
1231 | |||
1232 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
1233 | index 7aea0221530c..475a7a1bcfe0 100644 | ||
1234 | --- a/drivers/md/raid5.c | ||
1235 | +++ b/drivers/md/raid5.c | ||
1236 | @@ -1689,8 +1689,11 @@ static void ops_complete_reconstruct(void *stripe_head_ref) | ||
1237 | struct r5dev *dev = &sh->dev[i]; | ||
1238 | |||
1239 | if (dev->written || i == pd_idx || i == qd_idx) { | ||
1240 | - if (!discard && !test_bit(R5_SkipCopy, &dev->flags)) | ||
1241 | + if (!discard && !test_bit(R5_SkipCopy, &dev->flags)) { | ||
1242 | set_bit(R5_UPTODATE, &dev->flags); | ||
1243 | + if (test_bit(STRIPE_EXPAND_READY, &sh->state)) | ||
1244 | + set_bit(R5_Expanded, &dev->flags); | ||
1245 | + } | ||
1246 | if (fua) | ||
1247 | set_bit(R5_WantFUA, &dev->flags); | ||
1248 | if (sync) | ||
1249 | diff --git a/drivers/mfd/fsl-imx25-tsadc.c b/drivers/mfd/fsl-imx25-tsadc.c | ||
1250 | index 77b2675cf8f5..92e176009ffe 100644 | ||
1251 | --- a/drivers/mfd/fsl-imx25-tsadc.c | ||
1252 | +++ b/drivers/mfd/fsl-imx25-tsadc.c | ||
1253 | @@ -183,6 +183,19 @@ static int mx25_tsadc_probe(struct platform_device *pdev) | ||
1254 | return 0; | ||
1255 | } | ||
1256 | |||
1257 | +static int mx25_tsadc_remove(struct platform_device *pdev) | ||
1258 | +{ | ||
1259 | + struct mx25_tsadc *tsadc = platform_get_drvdata(pdev); | ||
1260 | + int irq = platform_get_irq(pdev, 0); | ||
1261 | + | ||
1262 | + if (irq) { | ||
1263 | + irq_set_chained_handler_and_data(irq, NULL, NULL); | ||
1264 | + irq_domain_remove(tsadc->domain); | ||
1265 | + } | ||
1266 | + | ||
1267 | + return 0; | ||
1268 | +} | ||
1269 | + | ||
1270 | static const struct of_device_id mx25_tsadc_ids[] = { | ||
1271 | { .compatible = "fsl,imx25-tsadc" }, | ||
1272 | { /* Sentinel */ } | ||
1273 | @@ -194,6 +207,7 @@ static struct platform_driver mx25_tsadc_driver = { | ||
1274 | .of_match_table = of_match_ptr(mx25_tsadc_ids), | ||
1275 | }, | ||
1276 | .probe = mx25_tsadc_probe, | ||
1277 | + .remove = mx25_tsadc_remove, | ||
1278 | }; | ||
1279 | module_platform_driver(mx25_tsadc_driver); | ||
1280 | |||
1281 | diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c | ||
1282 | index 19c10dc56513..d8a485f1798b 100644 | ||
1283 | --- a/drivers/misc/eeprom/at24.c | ||
1284 | +++ b/drivers/misc/eeprom/at24.c | ||
1285 | @@ -783,7 +783,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | ||
1286 | at24->nvmem_config.reg_read = at24_read; | ||
1287 | at24->nvmem_config.reg_write = at24_write; | ||
1288 | at24->nvmem_config.priv = at24; | ||
1289 | - at24->nvmem_config.stride = 4; | ||
1290 | + at24->nvmem_config.stride = 1; | ||
1291 | at24->nvmem_config.word_size = 1; | ||
1292 | at24->nvmem_config.size = chip.byte_len; | ||
1293 | |||
1294 | diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c | ||
1295 | index 84e9afcb5c09..6f9535e5e584 100644 | ||
1296 | --- a/drivers/mmc/host/mtk-sd.c | ||
1297 | +++ b/drivers/mmc/host/mtk-sd.c | ||
1298 | @@ -579,7 +579,7 @@ static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) | ||
1299 | } | ||
1300 | } | ||
1301 | sdr_set_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD | MSDC_CFG_CKDIV, | ||
1302 | - (mode << 8) | (div % 0xff)); | ||
1303 | + (mode << 8) | div); | ||
1304 | sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN); | ||
1305 | while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB)) | ||
1306 | cpu_relax(); | ||
1307 | @@ -1562,7 +1562,7 @@ static int msdc_drv_probe(struct platform_device *pdev) | ||
1308 | host->src_clk_freq = clk_get_rate(host->src_clk); | ||
1309 | /* Set host parameters to mmc */ | ||
1310 | mmc->ops = &mt_msdc_ops; | ||
1311 | - mmc->f_min = host->src_clk_freq / (4 * 255); | ||
1312 | + mmc->f_min = DIV_ROUND_UP(host->src_clk_freq, 4 * 255); | ||
1313 | |||
1314 | mmc->caps |= MMC_CAP_ERASE | MMC_CAP_CMD23; | ||
1315 | /* MMC core transfer sizes tunable parameters */ | ||
1316 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1317 | index 5d2cf56aed0e..0b894d76aa41 100644 | ||
1318 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1319 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1320 | @@ -5132,8 +5132,9 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp) | ||
1321 | bp->lpi_tmr_hi = le32_to_cpu(resp->valid_tx_lpi_timer_high) & | ||
1322 | PORT_PHY_QCAPS_RESP_TX_LPI_TIMER_HIGH_MASK; | ||
1323 | } | ||
1324 | - link_info->support_auto_speeds = | ||
1325 | - le16_to_cpu(resp->supported_speeds_auto_mode); | ||
1326 | + if (resp->supported_speeds_auto_mode) | ||
1327 | + link_info->support_auto_speeds = | ||
1328 | + le16_to_cpu(resp->supported_speeds_auto_mode); | ||
1329 | |||
1330 | hwrm_phy_qcaps_exit: | ||
1331 | mutex_unlock(&bp->hwrm_cmd_lock); | ||
1332 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1333 | index 0975af2903ef..3480b3078775 100644 | ||
1334 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1335 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1336 | @@ -1,7 +1,7 @@ | ||
1337 | /* | ||
1338 | * Broadcom GENET (Gigabit Ethernet) controller driver | ||
1339 | * | ||
1340 | - * Copyright (c) 2014 Broadcom Corporation | ||
1341 | + * Copyright (c) 2014-2017 Broadcom | ||
1342 | * | ||
1343 | * This program is free software; you can redistribute it and/or modify | ||
1344 | * it under the terms of the GNU General Public License version 2 as | ||
1345 | @@ -778,8 +778,9 @@ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] = { | ||
1346 | STAT_GENET_RUNT("rx_runt_bytes", mib.rx_runt_bytes), | ||
1347 | /* Misc UniMAC counters */ | ||
1348 | STAT_GENET_MISC("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, | ||
1349 | - UMAC_RBUF_OVFL_CNT), | ||
1350 | - STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, UMAC_RBUF_ERR_CNT), | ||
1351 | + UMAC_RBUF_OVFL_CNT_V1), | ||
1352 | + STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, | ||
1353 | + UMAC_RBUF_ERR_CNT_V1), | ||
1354 | STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT), | ||
1355 | STAT_GENET_SOFT_MIB("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), | ||
1356 | STAT_GENET_SOFT_MIB("rx_dma_failed", mib.rx_dma_failed), | ||
1357 | @@ -821,6 +822,45 @@ static void bcmgenet_get_strings(struct net_device *dev, u32 stringset, | ||
1358 | } | ||
1359 | } | ||
1360 | |||
1361 | +static u32 bcmgenet_update_stat_misc(struct bcmgenet_priv *priv, u16 offset) | ||
1362 | +{ | ||
1363 | + u16 new_offset; | ||
1364 | + u32 val; | ||
1365 | + | ||
1366 | + switch (offset) { | ||
1367 | + case UMAC_RBUF_OVFL_CNT_V1: | ||
1368 | + if (GENET_IS_V2(priv)) | ||
1369 | + new_offset = RBUF_OVFL_CNT_V2; | ||
1370 | + else | ||
1371 | + new_offset = RBUF_OVFL_CNT_V3PLUS; | ||
1372 | + | ||
1373 | + val = bcmgenet_rbuf_readl(priv, new_offset); | ||
1374 | + /* clear if overflowed */ | ||
1375 | + if (val == ~0) | ||
1376 | + bcmgenet_rbuf_writel(priv, 0, new_offset); | ||
1377 | + break; | ||
1378 | + case UMAC_RBUF_ERR_CNT_V1: | ||
1379 | + if (GENET_IS_V2(priv)) | ||
1380 | + new_offset = RBUF_ERR_CNT_V2; | ||
1381 | + else | ||
1382 | + new_offset = RBUF_ERR_CNT_V3PLUS; | ||
1383 | + | ||
1384 | + val = bcmgenet_rbuf_readl(priv, new_offset); | ||
1385 | + /* clear if overflowed */ | ||
1386 | + if (val == ~0) | ||
1387 | + bcmgenet_rbuf_writel(priv, 0, new_offset); | ||
1388 | + break; | ||
1389 | + default: | ||
1390 | + val = bcmgenet_umac_readl(priv, offset); | ||
1391 | + /* clear if overflowed */ | ||
1392 | + if (val == ~0) | ||
1393 | + bcmgenet_umac_writel(priv, 0, offset); | ||
1394 | + break; | ||
1395 | + } | ||
1396 | + | ||
1397 | + return val; | ||
1398 | +} | ||
1399 | + | ||
1400 | static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv) | ||
1401 | { | ||
1402 | int i, j = 0; | ||
1403 | @@ -836,19 +876,28 @@ static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv) | ||
1404 | case BCMGENET_STAT_NETDEV: | ||
1405 | case BCMGENET_STAT_SOFT: | ||
1406 | continue; | ||
1407 | - case BCMGENET_STAT_MIB_RX: | ||
1408 | - case BCMGENET_STAT_MIB_TX: | ||
1409 | case BCMGENET_STAT_RUNT: | ||
1410 | - if (s->type != BCMGENET_STAT_MIB_RX) | ||
1411 | - offset = BCMGENET_STAT_OFFSET; | ||
1412 | + offset += BCMGENET_STAT_OFFSET; | ||
1413 | + /* fall through */ | ||
1414 | + case BCMGENET_STAT_MIB_TX: | ||
1415 | + offset += BCMGENET_STAT_OFFSET; | ||
1416 | + /* fall through */ | ||
1417 | + case BCMGENET_STAT_MIB_RX: | ||
1418 | val = bcmgenet_umac_readl(priv, | ||
1419 | UMAC_MIB_START + j + offset); | ||
1420 | + offset = 0; /* Reset Offset */ | ||
1421 | break; | ||
1422 | case BCMGENET_STAT_MISC: | ||
1423 | - val = bcmgenet_umac_readl(priv, s->reg_offset); | ||
1424 | - /* clear if overflowed */ | ||
1425 | - if (val == ~0) | ||
1426 | - bcmgenet_umac_writel(priv, 0, s->reg_offset); | ||
1427 | + if (GENET_IS_V1(priv)) { | ||
1428 | + val = bcmgenet_umac_readl(priv, s->reg_offset); | ||
1429 | + /* clear if overflowed */ | ||
1430 | + if (val == ~0) | ||
1431 | + bcmgenet_umac_writel(priv, 0, | ||
1432 | + s->reg_offset); | ||
1433 | + } else { | ||
1434 | + val = bcmgenet_update_stat_misc(priv, | ||
1435 | + s->reg_offset); | ||
1436 | + } | ||
1437 | break; | ||
1438 | } | ||
1439 | |||
1440 | @@ -2464,24 +2513,28 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) | ||
1441 | /* Interrupt bottom half */ | ||
1442 | static void bcmgenet_irq_task(struct work_struct *work) | ||
1443 | { | ||
1444 | + unsigned long flags; | ||
1445 | + unsigned int status; | ||
1446 | struct bcmgenet_priv *priv = container_of( | ||
1447 | work, struct bcmgenet_priv, bcmgenet_irq_work); | ||
1448 | |||
1449 | netif_dbg(priv, intr, priv->dev, "%s\n", __func__); | ||
1450 | |||
1451 | - if (priv->irq0_stat & UMAC_IRQ_MPD_R) { | ||
1452 | - priv->irq0_stat &= ~UMAC_IRQ_MPD_R; | ||
1453 | + spin_lock_irqsave(&priv->lock, flags); | ||
1454 | + status = priv->irq0_stat; | ||
1455 | + priv->irq0_stat = 0; | ||
1456 | + spin_unlock_irqrestore(&priv->lock, flags); | ||
1457 | + | ||
1458 | + if (status & UMAC_IRQ_MPD_R) { | ||
1459 | netif_dbg(priv, wol, priv->dev, | ||
1460 | "magic packet detected, waking up\n"); | ||
1461 | bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC); | ||
1462 | } | ||
1463 | |||
1464 | /* Link UP/DOWN event */ | ||
1465 | - if (priv->irq0_stat & UMAC_IRQ_LINK_EVENT) { | ||
1466 | + if (status & UMAC_IRQ_LINK_EVENT) | ||
1467 | phy_mac_interrupt(priv->phydev, | ||
1468 | - !!(priv->irq0_stat & UMAC_IRQ_LINK_UP)); | ||
1469 | - priv->irq0_stat &= ~UMAC_IRQ_LINK_EVENT; | ||
1470 | - } | ||
1471 | + !!(status & UMAC_IRQ_LINK_UP)); | ||
1472 | } | ||
1473 | |||
1474 | /* bcmgenet_isr1: handle Rx and Tx priority queues */ | ||
1475 | @@ -2490,22 +2543,21 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) | ||
1476 | struct bcmgenet_priv *priv = dev_id; | ||
1477 | struct bcmgenet_rx_ring *rx_ring; | ||
1478 | struct bcmgenet_tx_ring *tx_ring; | ||
1479 | - unsigned int index; | ||
1480 | + unsigned int index, status; | ||
1481 | |||
1482 | - /* Save irq status for bottom-half processing. */ | ||
1483 | - priv->irq1_stat = | ||
1484 | - bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) & | ||
1485 | + /* Read irq status */ | ||
1486 | + status = bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) & | ||
1487 | ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS); | ||
1488 | |||
1489 | /* clear interrupts */ | ||
1490 | - bcmgenet_intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR); | ||
1491 | + bcmgenet_intrl2_1_writel(priv, status, INTRL2_CPU_CLEAR); | ||
1492 | |||
1493 | netif_dbg(priv, intr, priv->dev, | ||
1494 | - "%s: IRQ=0x%x\n", __func__, priv->irq1_stat); | ||
1495 | + "%s: IRQ=0x%x\n", __func__, status); | ||
1496 | |||
1497 | /* Check Rx priority queue interrupts */ | ||
1498 | for (index = 0; index < priv->hw_params->rx_queues; index++) { | ||
1499 | - if (!(priv->irq1_stat & BIT(UMAC_IRQ1_RX_INTR_SHIFT + index))) | ||
1500 | + if (!(status & BIT(UMAC_IRQ1_RX_INTR_SHIFT + index))) | ||
1501 | continue; | ||
1502 | |||
1503 | rx_ring = &priv->rx_rings[index]; | ||
1504 | @@ -2518,7 +2570,7 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) | ||
1505 | |||
1506 | /* Check Tx priority queue interrupts */ | ||
1507 | for (index = 0; index < priv->hw_params->tx_queues; index++) { | ||
1508 | - if (!(priv->irq1_stat & BIT(index))) | ||
1509 | + if (!(status & BIT(index))) | ||
1510 | continue; | ||
1511 | |||
1512 | tx_ring = &priv->tx_rings[index]; | ||
1513 | @@ -2538,19 +2590,20 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) | ||
1514 | struct bcmgenet_priv *priv = dev_id; | ||
1515 | struct bcmgenet_rx_ring *rx_ring; | ||
1516 | struct bcmgenet_tx_ring *tx_ring; | ||
1517 | + unsigned int status; | ||
1518 | + unsigned long flags; | ||
1519 | |||
1520 | - /* Save irq status for bottom-half processing. */ | ||
1521 | - priv->irq0_stat = | ||
1522 | - bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT) & | ||
1523 | + /* Read irq status */ | ||
1524 | + status = bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT) & | ||
1525 | ~bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_MASK_STATUS); | ||
1526 | |||
1527 | /* clear interrupts */ | ||
1528 | - bcmgenet_intrl2_0_writel(priv, priv->irq0_stat, INTRL2_CPU_CLEAR); | ||
1529 | + bcmgenet_intrl2_0_writel(priv, status, INTRL2_CPU_CLEAR); | ||
1530 | |||
1531 | netif_dbg(priv, intr, priv->dev, | ||
1532 | - "IRQ=0x%x\n", priv->irq0_stat); | ||
1533 | + "IRQ=0x%x\n", status); | ||
1534 | |||
1535 | - if (priv->irq0_stat & UMAC_IRQ_RXDMA_DONE) { | ||
1536 | + if (status & UMAC_IRQ_RXDMA_DONE) { | ||
1537 | rx_ring = &priv->rx_rings[DESC_INDEX]; | ||
1538 | |||
1539 | if (likely(napi_schedule_prep(&rx_ring->napi))) { | ||
1540 | @@ -2559,7 +2612,7 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) | ||
1541 | } | ||
1542 | } | ||
1543 | |||
1544 | - if (priv->irq0_stat & UMAC_IRQ_TXDMA_DONE) { | ||
1545 | + if (status & UMAC_IRQ_TXDMA_DONE) { | ||
1546 | tx_ring = &priv->tx_rings[DESC_INDEX]; | ||
1547 | |||
1548 | if (likely(napi_schedule_prep(&tx_ring->napi))) { | ||
1549 | @@ -2568,22 +2621,23 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) | ||
1550 | } | ||
1551 | } | ||
1552 | |||
1553 | - if (priv->irq0_stat & (UMAC_IRQ_PHY_DET_R | | ||
1554 | - UMAC_IRQ_PHY_DET_F | | ||
1555 | - UMAC_IRQ_LINK_EVENT | | ||
1556 | - UMAC_IRQ_HFB_SM | | ||
1557 | - UMAC_IRQ_HFB_MM | | ||
1558 | - UMAC_IRQ_MPD_R)) { | ||
1559 | - /* all other interested interrupts handled in bottom half */ | ||
1560 | - schedule_work(&priv->bcmgenet_irq_work); | ||
1561 | - } | ||
1562 | - | ||
1563 | if ((priv->hw_params->flags & GENET_HAS_MDIO_INTR) && | ||
1564 | - priv->irq0_stat & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { | ||
1565 | - priv->irq0_stat &= ~(UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR); | ||
1566 | + status & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { | ||
1567 | wake_up(&priv->wq); | ||
1568 | } | ||
1569 | |||
1570 | + /* all other interested interrupts handled in bottom half */ | ||
1571 | + status &= (UMAC_IRQ_LINK_EVENT | | ||
1572 | + UMAC_IRQ_MPD_R); | ||
1573 | + if (status) { | ||
1574 | + /* Save irq status for bottom-half processing. */ | ||
1575 | + spin_lock_irqsave(&priv->lock, flags); | ||
1576 | + priv->irq0_stat |= status; | ||
1577 | + spin_unlock_irqrestore(&priv->lock, flags); | ||
1578 | + | ||
1579 | + schedule_work(&priv->bcmgenet_irq_work); | ||
1580 | + } | ||
1581 | + | ||
1582 | return IRQ_HANDLED; | ||
1583 | } | ||
1584 | |||
1585 | @@ -2808,6 +2862,8 @@ static int bcmgenet_open(struct net_device *dev) | ||
1586 | err_fini_dma: | ||
1587 | bcmgenet_fini_dma(priv); | ||
1588 | err_clk_disable: | ||
1589 | + if (priv->internal_phy) | ||
1590 | + bcmgenet_power_down(priv, GENET_POWER_PASSIVE); | ||
1591 | clk_disable_unprepare(priv->clk); | ||
1592 | return ret; | ||
1593 | } | ||
1594 | @@ -3184,6 +3240,12 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) | ||
1595 | */ | ||
1596 | gphy_rev = reg & 0xffff; | ||
1597 | |||
1598 | + /* This is reserved so should require special treatment */ | ||
1599 | + if (gphy_rev == 0 || gphy_rev == 0x01ff) { | ||
1600 | + pr_warn("Invalid GPHY revision detected: 0x%04x\n", gphy_rev); | ||
1601 | + return; | ||
1602 | + } | ||
1603 | + | ||
1604 | /* This is the good old scheme, just GPHY major, no minor nor patch */ | ||
1605 | if ((gphy_rev & 0xf0) != 0) | ||
1606 | priv->gphy_rev = gphy_rev << 8; | ||
1607 | @@ -3192,12 +3254,6 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) | ||
1608 | else if ((gphy_rev & 0xff00) != 0) | ||
1609 | priv->gphy_rev = gphy_rev; | ||
1610 | |||
1611 | - /* This is reserved so should require special treatment */ | ||
1612 | - else if (gphy_rev == 0 || gphy_rev == 0x01ff) { | ||
1613 | - pr_warn("Invalid GPHY revision detected: 0x%04x\n", gphy_rev); | ||
1614 | - return; | ||
1615 | - } | ||
1616 | - | ||
1617 | #ifdef CONFIG_PHYS_ADDR_T_64BIT | ||
1618 | if (!(params->flags & GENET_HAS_40BITS)) | ||
1619 | pr_warn("GENET does not support 40-bits PA\n"); | ||
1620 | @@ -3240,6 +3296,7 @@ static int bcmgenet_probe(struct platform_device *pdev) | ||
1621 | const void *macaddr; | ||
1622 | struct resource *r; | ||
1623 | int err = -EIO; | ||
1624 | + const char *phy_mode_str; | ||
1625 | |||
1626 | /* Up to GENET_MAX_MQ_CNT + 1 TX queues and RX queues */ | ||
1627 | dev = alloc_etherdev_mqs(sizeof(*priv), GENET_MAX_MQ_CNT + 1, | ||
1628 | @@ -3283,6 +3340,8 @@ static int bcmgenet_probe(struct platform_device *pdev) | ||
1629 | goto err; | ||
1630 | } | ||
1631 | |||
1632 | + spin_lock_init(&priv->lock); | ||
1633 | + | ||
1634 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
1635 | dev_set_drvdata(&pdev->dev, dev); | ||
1636 | ether_addr_copy(dev->dev_addr, macaddr); | ||
1637 | @@ -3345,6 +3404,13 @@ static int bcmgenet_probe(struct platform_device *pdev) | ||
1638 | priv->clk_eee = NULL; | ||
1639 | } | ||
1640 | |||
1641 | + /* If this is an internal GPHY, power it on now, before UniMAC is | ||
1642 | + * brought out of reset as absolutely no UniMAC activity is allowed | ||
1643 | + */ | ||
1644 | + if (dn && !of_property_read_string(dn, "phy-mode", &phy_mode_str) && | ||
1645 | + !strcasecmp(phy_mode_str, "internal")) | ||
1646 | + bcmgenet_power_up(priv, GENET_POWER_PASSIVE); | ||
1647 | + | ||
1648 | err = reset_umac(priv); | ||
1649 | if (err) | ||
1650 | goto err_clk_disable; | ||
1651 | @@ -3511,6 +3577,8 @@ static int bcmgenet_resume(struct device *d) | ||
1652 | return 0; | ||
1653 | |||
1654 | out_clk_disable: | ||
1655 | + if (priv->internal_phy) | ||
1656 | + bcmgenet_power_down(priv, GENET_POWER_PASSIVE); | ||
1657 | clk_disable_unprepare(priv->clk); | ||
1658 | return ret; | ||
1659 | } | ||
1660 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h | ||
1661 | index 1e2dc34d331a..db7f289d65ae 100644 | ||
1662 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h | ||
1663 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h | ||
1664 | @@ -1,5 +1,5 @@ | ||
1665 | /* | ||
1666 | - * Copyright (c) 2014 Broadcom Corporation | ||
1667 | + * Copyright (c) 2014-2017 Broadcom | ||
1668 | * | ||
1669 | * This program is free software; you can redistribute it and/or modify | ||
1670 | * it under the terms of the GNU General Public License version 2 as | ||
1671 | @@ -214,7 +214,9 @@ struct bcmgenet_mib_counters { | ||
1672 | #define MDIO_REG_SHIFT 16 | ||
1673 | #define MDIO_REG_MASK 0x1F | ||
1674 | |||
1675 | -#define UMAC_RBUF_OVFL_CNT 0x61C | ||
1676 | +#define UMAC_RBUF_OVFL_CNT_V1 0x61C | ||
1677 | +#define RBUF_OVFL_CNT_V2 0x80 | ||
1678 | +#define RBUF_OVFL_CNT_V3PLUS 0x94 | ||
1679 | |||
1680 | #define UMAC_MPD_CTRL 0x620 | ||
1681 | #define MPD_EN (1 << 0) | ||
1682 | @@ -224,7 +226,9 @@ struct bcmgenet_mib_counters { | ||
1683 | |||
1684 | #define UMAC_MPD_PW_MS 0x624 | ||
1685 | #define UMAC_MPD_PW_LS 0x628 | ||
1686 | -#define UMAC_RBUF_ERR_CNT 0x634 | ||
1687 | +#define UMAC_RBUF_ERR_CNT_V1 0x634 | ||
1688 | +#define RBUF_ERR_CNT_V2 0x84 | ||
1689 | +#define RBUF_ERR_CNT_V3PLUS 0x98 | ||
1690 | #define UMAC_MDF_ERR_CNT 0x638 | ||
1691 | #define UMAC_MDF_CTRL 0x650 | ||
1692 | #define UMAC_MDF_ADDR 0x654 | ||
1693 | @@ -619,11 +623,13 @@ struct bcmgenet_priv { | ||
1694 | struct work_struct bcmgenet_irq_work; | ||
1695 | int irq0; | ||
1696 | int irq1; | ||
1697 | - unsigned int irq0_stat; | ||
1698 | - unsigned int irq1_stat; | ||
1699 | int wol_irq; | ||
1700 | bool wol_irq_disabled; | ||
1701 | |||
1702 | + /* shared status */ | ||
1703 | + spinlock_t lock; | ||
1704 | + unsigned int irq0_stat; | ||
1705 | + | ||
1706 | /* HW descriptors/checksum variables */ | ||
1707 | bool desc_64b_en; | ||
1708 | bool desc_rxchk_en; | ||
1709 | diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
1710 | index e36bebcab3f2..dae9dcfa8f36 100644 | ||
1711 | --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
1712 | +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
1713 | @@ -2304,6 +2304,17 @@ static int sync_toggles(struct mlx4_dev *dev) | ||
1714 | rd_toggle = swab32(readl(&priv->mfunc.comm->slave_read)); | ||
1715 | if (wr_toggle == 0xffffffff || rd_toggle == 0xffffffff) { | ||
1716 | /* PCI might be offline */ | ||
1717 | + | ||
1718 | + /* If device removal has been requested, | ||
1719 | + * do not continue retrying. | ||
1720 | + */ | ||
1721 | + if (dev->persist->interface_state & | ||
1722 | + MLX4_INTERFACE_STATE_NOWAIT) { | ||
1723 | + mlx4_warn(dev, | ||
1724 | + "communication channel is offline\n"); | ||
1725 | + return -EIO; | ||
1726 | + } | ||
1727 | + | ||
1728 | msleep(100); | ||
1729 | wr_toggle = swab32(readl(&priv->mfunc.comm-> | ||
1730 | slave_write)); | ||
1731 | diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c | ||
1732 | index 727122de7df0..5411ca48978a 100644 | ||
1733 | --- a/drivers/net/ethernet/mellanox/mlx4/main.c | ||
1734 | +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | ||
1735 | @@ -1940,6 +1940,14 @@ static int mlx4_comm_check_offline(struct mlx4_dev *dev) | ||
1736 | (u32)(1 << COMM_CHAN_OFFLINE_OFFSET)); | ||
1737 | if (!offline_bit) | ||
1738 | return 0; | ||
1739 | + | ||
1740 | + /* If device removal has been requested, | ||
1741 | + * do not continue retrying. | ||
1742 | + */ | ||
1743 | + if (dev->persist->interface_state & | ||
1744 | + MLX4_INTERFACE_STATE_NOWAIT) | ||
1745 | + break; | ||
1746 | + | ||
1747 | /* There are cases as part of AER/Reset flow that PF needs | ||
1748 | * around 100 msec to load. We therefore sleep for 100 msec | ||
1749 | * to allow other tasks to make use of that CPU during this | ||
1750 | @@ -3954,6 +3962,9 @@ static void mlx4_remove_one(struct pci_dev *pdev) | ||
1751 | struct devlink *devlink = priv_to_devlink(priv); | ||
1752 | int active_vfs = 0; | ||
1753 | |||
1754 | + if (mlx4_is_slave(dev)) | ||
1755 | + persist->interface_state |= MLX4_INTERFACE_STATE_NOWAIT; | ||
1756 | + | ||
1757 | mutex_lock(&persist->interface_state_mutex); | ||
1758 | persist->interface_state |= MLX4_INTERFACE_STATE_DELETION; | ||
1759 | mutex_unlock(&persist->interface_state_mutex); | ||
1760 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | ||
1761 | index 4de3c28b0547..331a6ca4856d 100644 | ||
1762 | --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | ||
1763 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | ||
1764 | @@ -1015,7 +1015,7 @@ static struct mlx5_flow_group *create_autogroup(struct mlx5_flow_table *ft, | ||
1765 | u32 *match_criteria) | ||
1766 | { | ||
1767 | int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in); | ||
1768 | - struct list_head *prev = ft->node.children.prev; | ||
1769 | + struct list_head *prev = &ft->node.children; | ||
1770 | unsigned int candidate_index = 0; | ||
1771 | struct mlx5_flow_group *fg; | ||
1772 | void *match_criteria_addr; | ||
1773 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
1774 | index b3309f2ed7dc..981cd1d84a5b 100644 | ||
1775 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
1776 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | ||
1777 | @@ -1283,6 +1283,7 @@ static int init_one(struct pci_dev *pdev, | ||
1778 | if (err) | ||
1779 | goto clean_load; | ||
1780 | |||
1781 | + pci_save_state(pdev); | ||
1782 | return 0; | ||
1783 | |||
1784 | clean_load: | ||
1785 | @@ -1331,9 +1332,8 @@ static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev, | ||
1786 | |||
1787 | mlx5_enter_error_state(dev); | ||
1788 | mlx5_unload_one(dev, priv, false); | ||
1789 | - /* In case of kernel call save the pci state and drain the health wq */ | ||
1790 | + /* In case of kernel call drain the health wq */ | ||
1791 | if (state) { | ||
1792 | - pci_save_state(pdev); | ||
1793 | mlx5_drain_health_wq(dev); | ||
1794 | mlx5_pci_disable_device(dev); | ||
1795 | } | ||
1796 | @@ -1385,6 +1385,7 @@ static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev) | ||
1797 | |||
1798 | pci_set_master(pdev); | ||
1799 | pci_restore_state(pdev); | ||
1800 | + pci_save_state(pdev); | ||
1801 | |||
1802 | if (wait_vital(pdev)) { | ||
1803 | dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__); | ||
1804 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h | ||
1805 | index 6460c7256f2b..a01e6c0d0cd1 100644 | ||
1806 | --- a/drivers/net/ethernet/mellanox/mlxsw/reg.h | ||
1807 | +++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h | ||
1808 | @@ -788,7 +788,7 @@ static inline void mlxsw_reg_spvid_pack(char *payload, u8 local_port, u16 pvid) | ||
1809 | #define MLXSW_REG_SPVM_ID 0x200F | ||
1810 | #define MLXSW_REG_SPVM_BASE_LEN 0x04 /* base length, without records */ | ||
1811 | #define MLXSW_REG_SPVM_REC_LEN 0x04 /* record length */ | ||
1812 | -#define MLXSW_REG_SPVM_REC_MAX_COUNT 256 | ||
1813 | +#define MLXSW_REG_SPVM_REC_MAX_COUNT 255 | ||
1814 | #define MLXSW_REG_SPVM_LEN (MLXSW_REG_SPVM_BASE_LEN + \ | ||
1815 | MLXSW_REG_SPVM_REC_LEN * MLXSW_REG_SPVM_REC_MAX_COUNT) | ||
1816 | |||
1817 | @@ -1757,7 +1757,7 @@ static inline void mlxsw_reg_sfmr_pack(char *payload, | ||
1818 | #define MLXSW_REG_SPVMLR_ID 0x2020 | ||
1819 | #define MLXSW_REG_SPVMLR_BASE_LEN 0x04 /* base length, without records */ | ||
1820 | #define MLXSW_REG_SPVMLR_REC_LEN 0x04 /* record length */ | ||
1821 | -#define MLXSW_REG_SPVMLR_REC_MAX_COUNT 256 | ||
1822 | +#define MLXSW_REG_SPVMLR_REC_MAX_COUNT 255 | ||
1823 | #define MLXSW_REG_SPVMLR_LEN (MLXSW_REG_SPVMLR_BASE_LEN + \ | ||
1824 | MLXSW_REG_SPVMLR_REC_LEN * \ | ||
1825 | MLXSW_REG_SPVMLR_REC_MAX_COUNT) | ||
1826 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c | ||
1827 | index 0c42c240b5cf..ed014bdbbabd 100644 | ||
1828 | --- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c | ||
1829 | +++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c | ||
1830 | @@ -373,8 +373,9 @@ static void qed_cxt_set_proto_cid_count(struct qed_hwfn *p_hwfn, | ||
1831 | u32 page_sz = p_mgr->clients[ILT_CLI_CDUC].p_size.val; | ||
1832 | u32 cxt_size = CONN_CXT_SIZE(p_hwfn); | ||
1833 | u32 elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size; | ||
1834 | + u32 align = elems_per_page * DQ_RANGE_ALIGN; | ||
1835 | |||
1836 | - p_conn->cid_count = roundup(p_conn->cid_count, elems_per_page); | ||
1837 | + p_conn->cid_count = roundup(p_conn->cid_count, align); | ||
1838 | } | ||
1839 | } | ||
1840 | |||
1841 | diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c | ||
1842 | index 62ae55bd81b8..a3360cbdb30b 100644 | ||
1843 | --- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c | ||
1844 | +++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c | ||
1845 | @@ -187,6 +187,8 @@ static void qed_ll2b_complete_rx_packet(struct qed_hwfn *p_hwfn, | ||
1846 | /* If need to reuse or there's no replacement buffer, repost this */ | ||
1847 | if (rc) | ||
1848 | goto out_post; | ||
1849 | + dma_unmap_single(&cdev->pdev->dev, buffer->phys_addr, | ||
1850 | + cdev->ll2->rx_size, DMA_FROM_DEVICE); | ||
1851 | |||
1852 | skb = build_skb(buffer->data, 0); | ||
1853 | if (!skb) { | ||
1854 | @@ -441,7 +443,7 @@ qed_ll2_rxq_completion_gsi(struct qed_hwfn *p_hwfn, | ||
1855 | static int qed_ll2_rxq_completion_reg(struct qed_hwfn *p_hwfn, | ||
1856 | struct qed_ll2_info *p_ll2_conn, | ||
1857 | union core_rx_cqe_union *p_cqe, | ||
1858 | - unsigned long lock_flags, | ||
1859 | + unsigned long *p_lock_flags, | ||
1860 | bool b_last_cqe) | ||
1861 | { | ||
1862 | struct qed_ll2_rx_queue *p_rx = &p_ll2_conn->rx_queue; | ||
1863 | @@ -462,10 +464,10 @@ static int qed_ll2_rxq_completion_reg(struct qed_hwfn *p_hwfn, | ||
1864 | "Mismatch between active_descq and the LL2 Rx chain\n"); | ||
1865 | list_add_tail(&p_pkt->list_entry, &p_rx->free_descq); | ||
1866 | |||
1867 | - spin_unlock_irqrestore(&p_rx->lock, lock_flags); | ||
1868 | + spin_unlock_irqrestore(&p_rx->lock, *p_lock_flags); | ||
1869 | qed_ll2b_complete_rx_packet(p_hwfn, p_ll2_conn->my_id, | ||
1870 | p_pkt, &p_cqe->rx_cqe_fp, b_last_cqe); | ||
1871 | - spin_lock_irqsave(&p_rx->lock, lock_flags); | ||
1872 | + spin_lock_irqsave(&p_rx->lock, *p_lock_flags); | ||
1873 | |||
1874 | return 0; | ||
1875 | } | ||
1876 | @@ -505,7 +507,8 @@ static int qed_ll2_rxq_completion(struct qed_hwfn *p_hwfn, void *cookie) | ||
1877 | break; | ||
1878 | case CORE_RX_CQE_TYPE_REGULAR: | ||
1879 | rc = qed_ll2_rxq_completion_reg(p_hwfn, p_ll2_conn, | ||
1880 | - cqe, flags, b_last_cqe); | ||
1881 | + cqe, &flags, | ||
1882 | + b_last_cqe); | ||
1883 | break; | ||
1884 | default: | ||
1885 | rc = -EIO; | ||
1886 | diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c | ||
1887 | index 1d85109cb8ed..3d5d5d54c103 100644 | ||
1888 | --- a/drivers/net/ethernet/sfc/ef10.c | ||
1889 | +++ b/drivers/net/ethernet/sfc/ef10.c | ||
1890 | @@ -4967,7 +4967,7 @@ static int efx_ef10_set_mac_address(struct efx_nic *efx) | ||
1891 | * MCFW do not support VFs. | ||
1892 | */ | ||
1893 | rc = efx_ef10_vport_set_mac_address(efx); | ||
1894 | - } else { | ||
1895 | + } else if (rc) { | ||
1896 | efx_mcdi_display_error(efx, MC_CMD_VADAPTOR_SET_MAC, | ||
1897 | sizeof(inbuf), NULL, 0, rc); | ||
1898 | } | ||
1899 | diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c | ||
1900 | index e46b1ebbbff4..7ea8ead4fd1c 100644 | ||
1901 | --- a/drivers/net/fjes/fjes_main.c | ||
1902 | +++ b/drivers/net/fjes/fjes_main.c | ||
1903 | @@ -1277,7 +1277,7 @@ static void fjes_netdev_setup(struct net_device *netdev) | ||
1904 | fjes_set_ethtool_ops(netdev); | ||
1905 | netdev->mtu = fjes_support_mtu[3]; | ||
1906 | netdev->flags |= IFF_BROADCAST; | ||
1907 | - netdev->features |= NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_FILTER; | ||
1908 | + netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER; | ||
1909 | } | ||
1910 | |||
1911 | static void fjes_irq_watch_task(struct work_struct *work) | ||
1912 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c | ||
1913 | index dc8ccac0a01d..6d55049cd3dc 100644 | ||
1914 | --- a/drivers/net/macvlan.c | ||
1915 | +++ b/drivers/net/macvlan.c | ||
1916 | @@ -452,7 +452,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) | ||
1917 | struct macvlan_dev, list); | ||
1918 | else | ||
1919 | vlan = macvlan_hash_lookup(port, eth->h_dest); | ||
1920 | - if (vlan == NULL) | ||
1921 | + if (!vlan || vlan->mode == MACVLAN_MODE_SOURCE) | ||
1922 | return RX_HANDLER_PASS; | ||
1923 | |||
1924 | dev = vlan->dev; | ||
1925 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c | ||
1926 | index 440d5f42810f..b883af93929c 100644 | ||
1927 | --- a/drivers/net/ppp/ppp_generic.c | ||
1928 | +++ b/drivers/net/ppp/ppp_generic.c | ||
1929 | @@ -958,6 +958,7 @@ static __net_exit void ppp_exit_net(struct net *net) | ||
1930 | unregister_netdevice_many(&list); | ||
1931 | rtnl_unlock(); | ||
1932 | |||
1933 | + mutex_destroy(&pn->all_ppp_mutex); | ||
1934 | idr_destroy(&pn->units_idr); | ||
1935 | } | ||
1936 | |||
1937 | diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c | ||
1938 | index e7f5910a6519..f8eb66ef2944 100644 | ||
1939 | --- a/drivers/net/wimax/i2400m/usb.c | ||
1940 | +++ b/drivers/net/wimax/i2400m/usb.c | ||
1941 | @@ -467,6 +467,9 @@ int i2400mu_probe(struct usb_interface *iface, | ||
1942 | struct i2400mu *i2400mu; | ||
1943 | struct usb_device *usb_dev = interface_to_usbdev(iface); | ||
1944 | |||
1945 | + if (iface->cur_altsetting->desc.bNumEndpoints < 4) | ||
1946 | + return -ENODEV; | ||
1947 | + | ||
1948 | if (usb_dev->speed != USB_SPEED_HIGH) | ||
1949 | dev_err(dev, "device not connected as high speed\n"); | ||
1950 | |||
1951 | diff --git a/drivers/net/wireless/ath/ath9k/tx99.c b/drivers/net/wireless/ath/ath9k/tx99.c | ||
1952 | index 1fa7f844b5da..8e9480cc33e1 100644 | ||
1953 | --- a/drivers/net/wireless/ath/ath9k/tx99.c | ||
1954 | +++ b/drivers/net/wireless/ath/ath9k/tx99.c | ||
1955 | @@ -179,6 +179,9 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf, | ||
1956 | ssize_t len; | ||
1957 | int r; | ||
1958 | |||
1959 | + if (count < 1) | ||
1960 | + return -EINVAL; | ||
1961 | + | ||
1962 | if (sc->cur_chan->nvifs > 1) | ||
1963 | return -EOPNOTSUPP; | ||
1964 | |||
1965 | @@ -186,6 +189,8 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf, | ||
1966 | if (copy_from_user(buf, user_buf, len)) | ||
1967 | return -EFAULT; | ||
1968 | |||
1969 | + buf[len] = '\0'; | ||
1970 | + | ||
1971 | if (strtobool(buf, &start)) | ||
1972 | return -EINVAL; | ||
1973 | |||
1974 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
1975 | index 9789f3c5a785..f1231c0ea336 100644 | ||
1976 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
1977 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | ||
1978 | @@ -2320,7 +2320,7 @@ iwl_mvm_mac_release_buffered_frames(struct ieee80211_hw *hw, | ||
1979 | { | ||
1980 | struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); | ||
1981 | |||
1982 | - /* Called when we need to transmit (a) frame(s) from agg queue */ | ||
1983 | + /* Called when we need to transmit (a) frame(s) from agg or dqa queue */ | ||
1984 | |||
1985 | iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames, | ||
1986 | tids, more_data, true); | ||
1987 | @@ -2340,7 +2340,8 @@ static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw, | ||
1988 | for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) { | ||
1989 | struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; | ||
1990 | |||
1991 | - if (tid_data->state != IWL_AGG_ON && | ||
1992 | + if (!iwl_mvm_is_dqa_supported(mvm) && | ||
1993 | + tid_data->state != IWL_AGG_ON && | ||
1994 | tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA) | ||
1995 | continue; | ||
1996 | |||
1997 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | ||
1998 | index e64aeb4a2204..bdd1deed55a4 100644 | ||
1999 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | ||
2000 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | ||
2001 | @@ -3032,7 +3032,7 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, | ||
2002 | struct ieee80211_sta *sta, | ||
2003 | enum ieee80211_frame_release_type reason, | ||
2004 | u16 cnt, u16 tids, bool more_data, | ||
2005 | - bool agg) | ||
2006 | + bool single_sta_queue) | ||
2007 | { | ||
2008 | struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); | ||
2009 | struct iwl_mvm_add_sta_cmd cmd = { | ||
2010 | @@ -3052,14 +3052,14 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, | ||
2011 | for_each_set_bit(tid, &_tids, IWL_MAX_TID_COUNT) | ||
2012 | cmd.awake_acs |= BIT(tid_to_ucode_ac[tid]); | ||
2013 | |||
2014 | - /* If we're releasing frames from aggregation queues then check if the | ||
2015 | - * all queues combined that we're releasing frames from have | ||
2016 | + /* If we're releasing frames from aggregation or dqa queues then check | ||
2017 | + * if all the queues that we're releasing frames from, combined, have: | ||
2018 | * - more frames than the service period, in which case more_data | ||
2019 | * needs to be set | ||
2020 | * - fewer than 'cnt' frames, in which case we need to adjust the | ||
2021 | * firmware command (but do that unconditionally) | ||
2022 | */ | ||
2023 | - if (agg) { | ||
2024 | + if (single_sta_queue) { | ||
2025 | int remaining = cnt; | ||
2026 | int sleep_tx_count; | ||
2027 | |||
2028 | @@ -3069,7 +3069,8 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, | ||
2029 | u16 n_queued; | ||
2030 | |||
2031 | tid_data = &mvmsta->tid_data[tid]; | ||
2032 | - if (WARN(tid_data->state != IWL_AGG_ON && | ||
2033 | + if (WARN(!iwl_mvm_is_dqa_supported(mvm) && | ||
2034 | + tid_data->state != IWL_AGG_ON && | ||
2035 | tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA, | ||
2036 | "TID %d state is %d\n", | ||
2037 | tid, tid_data->state)) { | ||
2038 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h | ||
2039 | index e068d5355865..f65950e91ed5 100644 | ||
2040 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h | ||
2041 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h | ||
2042 | @@ -545,7 +545,7 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm, | ||
2043 | struct ieee80211_sta *sta, | ||
2044 | enum ieee80211_frame_release_type reason, | ||
2045 | u16 cnt, u16 tids, bool more_data, | ||
2046 | - bool agg); | ||
2047 | + bool single_sta_queue); | ||
2048 | int iwl_mvm_drain_sta(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, | ||
2049 | bool drain); | ||
2050 | void iwl_mvm_sta_modify_disable_tx(struct iwl_mvm *mvm, | ||
2051 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c | ||
2052 | index 092ae0024f22..7465d4db136f 100644 | ||
2053 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c | ||
2054 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c | ||
2055 | @@ -7,7 +7,7 @@ | ||
2056 | * | ||
2057 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. | ||
2058 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH | ||
2059 | - * Copyright(c) 2016 Intel Deutschland GmbH | ||
2060 | + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH | ||
2061 | * | ||
2062 | * This program is free software; you can redistribute it and/or modify | ||
2063 | * it under the terms of version 2 of the GNU General Public License as | ||
2064 | @@ -34,6 +34,7 @@ | ||
2065 | * | ||
2066 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. | ||
2067 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH | ||
2068 | + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH | ||
2069 | * All rights reserved. | ||
2070 | * | ||
2071 | * Redistribution and use in source and binary forms, with or without | ||
2072 | @@ -621,8 +622,10 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) | ||
2073 | * values. | ||
2074 | * Note that we don't need to make sure it isn't agg'd, since we're | ||
2075 | * TXing non-sta | ||
2076 | + * For DQA mode - we shouldn't increase it though | ||
2077 | */ | ||
2078 | - atomic_inc(&mvm->pending_frames[sta_id]); | ||
2079 | + if (!iwl_mvm_is_dqa_supported(mvm)) | ||
2080 | + atomic_inc(&mvm->pending_frames[sta_id]); | ||
2081 | |||
2082 | return 0; | ||
2083 | } | ||
2084 | @@ -1009,11 +1012,8 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb, | ||
2085 | |||
2086 | spin_unlock(&mvmsta->lock); | ||
2087 | |||
2088 | - /* Increase pending frames count if this isn't AMPDU */ | ||
2089 | - if ((iwl_mvm_is_dqa_supported(mvm) && | ||
2090 | - mvmsta->tid_data[tx_cmd->tid_tspec].state != IWL_AGG_ON && | ||
2091 | - mvmsta->tid_data[tx_cmd->tid_tspec].state != IWL_AGG_STARTING) || | ||
2092 | - (!iwl_mvm_is_dqa_supported(mvm) && !is_ampdu)) | ||
2093 | + /* Increase pending frames count if this isn't AMPDU or DQA queue */ | ||
2094 | + if (!iwl_mvm_is_dqa_supported(mvm) && !is_ampdu) | ||
2095 | atomic_inc(&mvm->pending_frames[mvmsta->sta_id]); | ||
2096 | |||
2097 | return 0; | ||
2098 | @@ -1083,12 +1083,13 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm, | ||
2099 | lockdep_assert_held(&mvmsta->lock); | ||
2100 | |||
2101 | if ((tid_data->state == IWL_AGG_ON || | ||
2102 | - tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA) && | ||
2103 | + tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA || | ||
2104 | + iwl_mvm_is_dqa_supported(mvm)) && | ||
2105 | iwl_mvm_tid_queued(tid_data) == 0) { | ||
2106 | /* | ||
2107 | - * Now that this aggregation queue is empty tell mac80211 so it | ||
2108 | - * knows we no longer have frames buffered for the station on | ||
2109 | - * this TID (for the TIM bitmap calculation.) | ||
2110 | + * Now that this aggregation or DQA queue is empty tell | ||
2111 | + * mac80211 so it knows we no longer have frames buffered for | ||
2112 | + * the station on this TID (for the TIM bitmap calculation.) | ||
2113 | */ | ||
2114 | ieee80211_sta_set_buffered(sta, tid, false); | ||
2115 | } | ||
2116 | @@ -1261,7 +1262,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, | ||
2117 | u8 skb_freed = 0; | ||
2118 | u16 next_reclaimed, seq_ctl; | ||
2119 | bool is_ndp = false; | ||
2120 | - bool txq_agg = false; /* Is this TXQ aggregated */ | ||
2121 | |||
2122 | __skb_queue_head_init(&skbs); | ||
2123 | |||
2124 | @@ -1287,6 +1287,10 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, | ||
2125 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
2126 | break; | ||
2127 | case TX_STATUS_FAIL_DEST_PS: | ||
2128 | + /* In DQA, the FW should have stopped the queue and not | ||
2129 | + * return this status | ||
2130 | + */ | ||
2131 | + WARN_ON(iwl_mvm_is_dqa_supported(mvm)); | ||
2132 | info->flags |= IEEE80211_TX_STAT_TX_FILTERED; | ||
2133 | break; | ||
2134 | default: | ||
2135 | @@ -1391,15 +1395,6 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, | ||
2136 | bool send_eosp_ndp = false; | ||
2137 | |||
2138 | spin_lock_bh(&mvmsta->lock); | ||
2139 | - if (iwl_mvm_is_dqa_supported(mvm)) { | ||
2140 | - enum iwl_mvm_agg_state state; | ||
2141 | - | ||
2142 | - state = mvmsta->tid_data[tid].state; | ||
2143 | - txq_agg = (state == IWL_AGG_ON || | ||
2144 | - state == IWL_EMPTYING_HW_QUEUE_DELBA); | ||
2145 | - } else { | ||
2146 | - txq_agg = txq_id >= mvm->first_agg_queue; | ||
2147 | - } | ||
2148 | |||
2149 | if (!is_ndp) { | ||
2150 | tid_data->next_reclaimed = next_reclaimed; | ||
2151 | @@ -1456,11 +1451,11 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, | ||
2152 | * If the txq is not an AMPDU queue, there is no chance we freed | ||
2153 | * several skbs. Check that out... | ||
2154 | */ | ||
2155 | - if (txq_agg) | ||
2156 | + if (iwl_mvm_is_dqa_supported(mvm) || txq_id >= mvm->first_agg_queue) | ||
2157 | goto out; | ||
2158 | |||
2159 | /* We can't free more than one frame at once on a shared queue */ | ||
2160 | - WARN_ON(!iwl_mvm_is_dqa_supported(mvm) && (skb_freed > 1)); | ||
2161 | + WARN_ON(skb_freed > 1); | ||
2162 | |||
2163 | /* If we have still frames for this STA nothing to do here */ | ||
2164 | if (!atomic_sub_and_test(skb_freed, &mvm->pending_frames[sta_id])) | ||
2165 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c | ||
2166 | index fbeca065f18c..719ee5fb2626 100644 | ||
2167 | --- a/drivers/nvme/host/core.c | ||
2168 | +++ b/drivers/nvme/host/core.c | ||
2169 | @@ -1619,7 +1619,8 @@ static struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid) | ||
2170 | mutex_lock(&ctrl->namespaces_mutex); | ||
2171 | list_for_each_entry(ns, &ctrl->namespaces, list) { | ||
2172 | if (ns->ns_id == nsid) { | ||
2173 | - kref_get(&ns->kref); | ||
2174 | + if (!kref_get_unless_zero(&ns->kref)) | ||
2175 | + continue; | ||
2176 | ret = ns; | ||
2177 | break; | ||
2178 | } | ||
2179 | diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c | ||
2180 | index fbd6d487103f..c89d68a76f3d 100644 | ||
2181 | --- a/drivers/nvme/target/core.c | ||
2182 | +++ b/drivers/nvme/target/core.c | ||
2183 | @@ -422,6 +422,13 @@ void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq, | ||
2184 | ctrl->sqs[qid] = sq; | ||
2185 | } | ||
2186 | |||
2187 | +static void nvmet_confirm_sq(struct percpu_ref *ref) | ||
2188 | +{ | ||
2189 | + struct nvmet_sq *sq = container_of(ref, struct nvmet_sq, ref); | ||
2190 | + | ||
2191 | + complete(&sq->confirm_done); | ||
2192 | +} | ||
2193 | + | ||
2194 | void nvmet_sq_destroy(struct nvmet_sq *sq) | ||
2195 | { | ||
2196 | /* | ||
2197 | @@ -430,7 +437,8 @@ void nvmet_sq_destroy(struct nvmet_sq *sq) | ||
2198 | */ | ||
2199 | if (sq->ctrl && sq->ctrl->sqs && sq->ctrl->sqs[0] == sq) | ||
2200 | nvmet_async_events_free(sq->ctrl); | ||
2201 | - percpu_ref_kill(&sq->ref); | ||
2202 | + percpu_ref_kill_and_confirm(&sq->ref, nvmet_confirm_sq); | ||
2203 | + wait_for_completion(&sq->confirm_done); | ||
2204 | wait_for_completion(&sq->free_done); | ||
2205 | percpu_ref_exit(&sq->ref); | ||
2206 | |||
2207 | @@ -458,6 +466,7 @@ int nvmet_sq_init(struct nvmet_sq *sq) | ||
2208 | return ret; | ||
2209 | } | ||
2210 | init_completion(&sq->free_done); | ||
2211 | + init_completion(&sq->confirm_done); | ||
2212 | |||
2213 | return 0; | ||
2214 | } | ||
2215 | diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c | ||
2216 | index d5df77d686b2..c8e612c1c72f 100644 | ||
2217 | --- a/drivers/nvme/target/loop.c | ||
2218 | +++ b/drivers/nvme/target/loop.c | ||
2219 | @@ -288,9 +288,9 @@ static struct blk_mq_ops nvme_loop_admin_mq_ops = { | ||
2220 | |||
2221 | static void nvme_loop_destroy_admin_queue(struct nvme_loop_ctrl *ctrl) | ||
2222 | { | ||
2223 | + nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); | ||
2224 | blk_cleanup_queue(ctrl->ctrl.admin_q); | ||
2225 | blk_mq_free_tag_set(&ctrl->admin_tag_set); | ||
2226 | - nvmet_sq_destroy(&ctrl->queues[0].nvme_sq); | ||
2227 | } | ||
2228 | |||
2229 | static void nvme_loop_free_ctrl(struct nvme_ctrl *nctrl) | ||
2230 | diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h | ||
2231 | index 7655a351320f..26b87dc843d2 100644 | ||
2232 | --- a/drivers/nvme/target/nvmet.h | ||
2233 | +++ b/drivers/nvme/target/nvmet.h | ||
2234 | @@ -73,6 +73,7 @@ struct nvmet_sq { | ||
2235 | u16 qid; | ||
2236 | u16 size; | ||
2237 | struct completion free_done; | ||
2238 | + struct completion confirm_done; | ||
2239 | }; | ||
2240 | |||
2241 | /** | ||
2242 | diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c | ||
2243 | index ca8ddc3fb19e..53bd32550867 100644 | ||
2244 | --- a/drivers/nvme/target/rdma.c | ||
2245 | +++ b/drivers/nvme/target/rdma.c | ||
2246 | @@ -703,11 +703,6 @@ static void nvmet_rdma_handle_command(struct nvmet_rdma_queue *queue, | ||
2247 | { | ||
2248 | u16 status; | ||
2249 | |||
2250 | - cmd->queue = queue; | ||
2251 | - cmd->n_rdma = 0; | ||
2252 | - cmd->req.port = queue->port; | ||
2253 | - | ||
2254 | - | ||
2255 | ib_dma_sync_single_for_cpu(queue->dev->device, | ||
2256 | cmd->cmd->sge[0].addr, cmd->cmd->sge[0].length, | ||
2257 | DMA_FROM_DEVICE); | ||
2258 | @@ -760,9 +755,12 @@ static void nvmet_rdma_recv_done(struct ib_cq *cq, struct ib_wc *wc) | ||
2259 | |||
2260 | cmd->queue = queue; | ||
2261 | rsp = nvmet_rdma_get_rsp(queue); | ||
2262 | + rsp->queue = queue; | ||
2263 | rsp->cmd = cmd; | ||
2264 | rsp->flags = 0; | ||
2265 | rsp->req.cmd = cmd->nvme_cmd; | ||
2266 | + rsp->req.port = queue->port; | ||
2267 | + rsp->n_rdma = 0; | ||
2268 | |||
2269 | if (unlikely(queue->state != NVMET_RDMA_Q_LIVE)) { | ||
2270 | unsigned long flags; | ||
2271 | diff --git a/drivers/pci/pcie/pme.c b/drivers/pci/pcie/pme.c | ||
2272 | index 4b703492376a..00f61225386c 100644 | ||
2273 | --- a/drivers/pci/pcie/pme.c | ||
2274 | +++ b/drivers/pci/pcie/pme.c | ||
2275 | @@ -232,6 +232,9 @@ static void pcie_pme_work_fn(struct work_struct *work) | ||
2276 | break; | ||
2277 | |||
2278 | pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta); | ||
2279 | + if (rtsta == (u32) ~0) | ||
2280 | + break; | ||
2281 | + | ||
2282 | if (rtsta & PCI_EXP_RTSTA_PME) { | ||
2283 | /* | ||
2284 | * Clear PME status of the port. If there are other | ||
2285 | @@ -279,7 +282,7 @@ static irqreturn_t pcie_pme_irq(int irq, void *context) | ||
2286 | spin_lock_irqsave(&data->lock, flags); | ||
2287 | pcie_capability_read_dword(port, PCI_EXP_RTSTA, &rtsta); | ||
2288 | |||
2289 | - if (!(rtsta & PCI_EXP_RTSTA_PME)) { | ||
2290 | + if (rtsta == (u32) ~0 || !(rtsta & PCI_EXP_RTSTA_PME)) { | ||
2291 | spin_unlock_irqrestore(&data->lock, flags); | ||
2292 | return IRQ_NONE; | ||
2293 | } | ||
2294 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c | ||
2295 | index 60bada90cd75..a98be6db7e93 100644 | ||
2296 | --- a/drivers/pci/probe.c | ||
2297 | +++ b/drivers/pci/probe.c | ||
2298 | @@ -932,7 +932,8 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass) | ||
2299 | child = pci_add_new_bus(bus, dev, max+1); | ||
2300 | if (!child) | ||
2301 | goto out; | ||
2302 | - pci_bus_insert_busn_res(child, max+1, 0xff); | ||
2303 | + pci_bus_insert_busn_res(child, max+1, | ||
2304 | + bus->busn_res.end); | ||
2305 | } | ||
2306 | max++; | ||
2307 | buses = (buses & 0xff000000) | ||
2308 | @@ -2136,6 +2137,10 @@ unsigned int pci_scan_child_bus(struct pci_bus *bus) | ||
2309 | if (bus->self && bus->self->is_hotplug_bridge && pci_hotplug_bus_size) { | ||
2310 | if (max - bus->busn_res.start < pci_hotplug_bus_size - 1) | ||
2311 | max = bus->busn_res.start + pci_hotplug_bus_size - 1; | ||
2312 | + | ||
2313 | + /* Do not allocate more buses than we have room left */ | ||
2314 | + if (max > bus->busn_res.end) | ||
2315 | + max = bus->busn_res.end; | ||
2316 | } | ||
2317 | |||
2318 | /* | ||
2319 | diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c | ||
2320 | index f9357e09e9b3..b6b9b5b74e30 100644 | ||
2321 | --- a/drivers/pci/remove.c | ||
2322 | +++ b/drivers/pci/remove.c | ||
2323 | @@ -19,9 +19,9 @@ static void pci_stop_dev(struct pci_dev *dev) | ||
2324 | pci_pme_active(dev, false); | ||
2325 | |||
2326 | if (dev->is_added) { | ||
2327 | + device_release_driver(&dev->dev); | ||
2328 | pci_proc_detach_device(dev); | ||
2329 | pci_remove_sysfs_dev_files(dev); | ||
2330 | - device_release_driver(&dev->dev); | ||
2331 | dev->is_added = 0; | ||
2332 | } | ||
2333 | |||
2334 | diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig | ||
2335 | index 671610c989b6..b0c0fa0444dd 100644 | ||
2336 | --- a/drivers/pinctrl/Kconfig | ||
2337 | +++ b/drivers/pinctrl/Kconfig | ||
2338 | @@ -26,7 +26,8 @@ config DEBUG_PINCTRL | ||
2339 | |||
2340 | config PINCTRL_ADI2 | ||
2341 | bool "ADI pin controller driver" | ||
2342 | - depends on BLACKFIN | ||
2343 | + depends on (BF54x || BF60x) | ||
2344 | + depends on !GPIO_ADI | ||
2345 | select PINMUX | ||
2346 | select IRQ_DOMAIN | ||
2347 | help | ||
2348 | diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c | ||
2349 | index 09356684c32f..abd9d83f6009 100644 | ||
2350 | --- a/drivers/platform/x86/hp_accel.c | ||
2351 | +++ b/drivers/platform/x86/hp_accel.c | ||
2352 | @@ -240,6 +240,7 @@ static const struct dmi_system_id lis3lv02d_dmi_ids[] = { | ||
2353 | AXIS_DMI_MATCH("HDX18", "HP HDX 18", x_inverted), | ||
2354 | AXIS_DMI_MATCH("HPB432x", "HP ProBook 432", xy_rotated_left), | ||
2355 | AXIS_DMI_MATCH("HPB440G3", "HP ProBook 440 G3", x_inverted_usd), | ||
2356 | + AXIS_DMI_MATCH("HPB440G4", "HP ProBook 440 G4", x_inverted), | ||
2357 | AXIS_DMI_MATCH("HPB442x", "HP ProBook 442", xy_rotated_left), | ||
2358 | AXIS_DMI_MATCH("HPB452x", "HP ProBook 452", y_inverted), | ||
2359 | AXIS_DMI_MATCH("HPB522x", "HP ProBook 522", xy_swap), | ||
2360 | diff --git a/drivers/platform/x86/intel_punit_ipc.c b/drivers/platform/x86/intel_punit_ipc.c | ||
2361 | index a47a41fc10ad..b5b890127479 100644 | ||
2362 | --- a/drivers/platform/x86/intel_punit_ipc.c | ||
2363 | +++ b/drivers/platform/x86/intel_punit_ipc.c | ||
2364 | @@ -252,28 +252,28 @@ static int intel_punit_get_bars(struct platform_device *pdev) | ||
2365 | * - GTDRIVER_IPC BASE_IFACE | ||
2366 | */ | ||
2367 | res = platform_get_resource(pdev, IORESOURCE_MEM, 2); | ||
2368 | - if (res) { | ||
2369 | + if (res && resource_size(res) > 1) { | ||
2370 | addr = devm_ioremap_resource(&pdev->dev, res); | ||
2371 | if (!IS_ERR(addr)) | ||
2372 | punit_ipcdev->base[ISPDRIVER_IPC][BASE_DATA] = addr; | ||
2373 | } | ||
2374 | |||
2375 | res = platform_get_resource(pdev, IORESOURCE_MEM, 3); | ||
2376 | - if (res) { | ||
2377 | + if (res && resource_size(res) > 1) { | ||
2378 | addr = devm_ioremap_resource(&pdev->dev, res); | ||
2379 | if (!IS_ERR(addr)) | ||
2380 | punit_ipcdev->base[ISPDRIVER_IPC][BASE_IFACE] = addr; | ||
2381 | } | ||
2382 | |||
2383 | res = platform_get_resource(pdev, IORESOURCE_MEM, 4); | ||
2384 | - if (res) { | ||
2385 | + if (res && resource_size(res) > 1) { | ||
2386 | addr = devm_ioremap_resource(&pdev->dev, res); | ||
2387 | if (!IS_ERR(addr)) | ||
2388 | punit_ipcdev->base[GTDRIVER_IPC][BASE_DATA] = addr; | ||
2389 | } | ||
2390 | |||
2391 | res = platform_get_resource(pdev, IORESOURCE_MEM, 5); | ||
2392 | - if (res) { | ||
2393 | + if (res && resource_size(res) > 1) { | ||
2394 | addr = devm_ioremap_resource(&pdev->dev, res); | ||
2395 | if (!IS_ERR(addr)) | ||
2396 | punit_ipcdev->base[GTDRIVER_IPC][BASE_IFACE] = addr; | ||
2397 | diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c | ||
2398 | index 1227ceab61ee..a4b8b603c807 100644 | ||
2399 | --- a/drivers/rtc/rtc-pcf8563.c | ||
2400 | +++ b/drivers/rtc/rtc-pcf8563.c | ||
2401 | @@ -422,7 +422,7 @@ static unsigned long pcf8563_clkout_recalc_rate(struct clk_hw *hw, | ||
2402 | return 0; | ||
2403 | |||
2404 | buf &= PCF8563_REG_CLKO_F_MASK; | ||
2405 | - return clkout_rates[ret]; | ||
2406 | + return clkout_rates[buf]; | ||
2407 | } | ||
2408 | |||
2409 | static long pcf8563_clkout_round_rate(struct clk_hw *hw, unsigned long rate, | ||
2410 | diff --git a/drivers/scsi/bfa/bfad_debugfs.c b/drivers/scsi/bfa/bfad_debugfs.c | ||
2411 | index 8dcd8c70c7ee..05f523971348 100644 | ||
2412 | --- a/drivers/scsi/bfa/bfad_debugfs.c | ||
2413 | +++ b/drivers/scsi/bfa/bfad_debugfs.c | ||
2414 | @@ -255,7 +255,8 @@ bfad_debugfs_write_regrd(struct file *file, const char __user *buf, | ||
2415 | struct bfad_s *bfad = port->bfad; | ||
2416 | struct bfa_s *bfa = &bfad->bfa; | ||
2417 | struct bfa_ioc_s *ioc = &bfa->ioc; | ||
2418 | - int addr, len, rc, i; | ||
2419 | + int addr, rc, i; | ||
2420 | + u32 len; | ||
2421 | u32 *regbuf; | ||
2422 | void __iomem *rb, *reg_addr; | ||
2423 | unsigned long flags; | ||
2424 | @@ -266,7 +267,7 @@ bfad_debugfs_write_regrd(struct file *file, const char __user *buf, | ||
2425 | return PTR_ERR(kern_buf); | ||
2426 | |||
2427 | rc = sscanf(kern_buf, "%x:%x", &addr, &len); | ||
2428 | - if (rc < 2) { | ||
2429 | + if (rc < 2 || len > (UINT_MAX >> 2)) { | ||
2430 | printk(KERN_INFO | ||
2431 | "bfad[%d]: %s failed to read user buf\n", | ||
2432 | bfad->inst_no, __func__); | ||
2433 | diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c | ||
2434 | index a1d6ab76a514..99623701fc3d 100644 | ||
2435 | --- a/drivers/scsi/hpsa.c | ||
2436 | +++ b/drivers/scsi/hpsa.c | ||
2437 | @@ -2951,7 +2951,7 @@ static int hpsa_send_reset(struct ctlr_info *h, unsigned char *scsi3addr, | ||
2438 | /* fill_cmd can't fail here, no data buffer to map. */ | ||
2439 | (void) fill_cmd(c, reset_type, h, NULL, 0, 0, | ||
2440 | scsi3addr, TYPE_MSG); | ||
2441 | - rc = hpsa_scsi_do_simple_cmd(h, c, reply_queue, DEFAULT_TIMEOUT); | ||
2442 | + rc = hpsa_scsi_do_simple_cmd(h, c, reply_queue, NO_TIMEOUT); | ||
2443 | if (rc) { | ||
2444 | dev_warn(&h->pdev->dev, "Failed to send reset command\n"); | ||
2445 | goto out; | ||
2446 | @@ -3686,7 +3686,7 @@ static int hpsa_get_volume_status(struct ctlr_info *h, | ||
2447 | * # (integer code indicating one of several NOT READY states | ||
2448 | * describing why a volume is to be kept offline) | ||
2449 | */ | ||
2450 | -static int hpsa_volume_offline(struct ctlr_info *h, | ||
2451 | +static unsigned char hpsa_volume_offline(struct ctlr_info *h, | ||
2452 | unsigned char scsi3addr[]) | ||
2453 | { | ||
2454 | struct CommandList *c; | ||
2455 | @@ -3707,7 +3707,7 @@ static int hpsa_volume_offline(struct ctlr_info *h, | ||
2456 | DEFAULT_TIMEOUT); | ||
2457 | if (rc) { | ||
2458 | cmd_free(h, c); | ||
2459 | - return 0; | ||
2460 | + return HPSA_VPD_LV_STATUS_UNSUPPORTED; | ||
2461 | } | ||
2462 | sense = c->err_info->SenseInfo; | ||
2463 | if (c->err_info->SenseLen > sizeof(c->err_info->SenseInfo)) | ||
2464 | @@ -3718,19 +3718,13 @@ static int hpsa_volume_offline(struct ctlr_info *h, | ||
2465 | cmd_status = c->err_info->CommandStatus; | ||
2466 | scsi_status = c->err_info->ScsiStatus; | ||
2467 | cmd_free(h, c); | ||
2468 | - /* Is the volume 'not ready'? */ | ||
2469 | - if (cmd_status != CMD_TARGET_STATUS || | ||
2470 | - scsi_status != SAM_STAT_CHECK_CONDITION || | ||
2471 | - sense_key != NOT_READY || | ||
2472 | - asc != ASC_LUN_NOT_READY) { | ||
2473 | - return 0; | ||
2474 | - } | ||
2475 | |||
2476 | /* Determine the reason for not ready state */ | ||
2477 | ldstat = hpsa_get_volume_status(h, scsi3addr); | ||
2478 | |||
2479 | /* Keep volume offline in certain cases: */ | ||
2480 | switch (ldstat) { | ||
2481 | + case HPSA_LV_FAILED: | ||
2482 | case HPSA_LV_UNDERGOING_ERASE: | ||
2483 | case HPSA_LV_NOT_AVAILABLE: | ||
2484 | case HPSA_LV_UNDERGOING_RPI: | ||
2485 | @@ -3752,7 +3746,7 @@ static int hpsa_volume_offline(struct ctlr_info *h, | ||
2486 | default: | ||
2487 | break; | ||
2488 | } | ||
2489 | - return 0; | ||
2490 | + return HPSA_LV_OK; | ||
2491 | } | ||
2492 | |||
2493 | /* | ||
2494 | @@ -3825,10 +3819,10 @@ static int hpsa_update_device_info(struct ctlr_info *h, | ||
2495 | /* Do an inquiry to the device to see what it is. */ | ||
2496 | if (hpsa_scsi_do_inquiry(h, scsi3addr, 0, inq_buff, | ||
2497 | (unsigned char) OBDR_TAPE_INQ_SIZE) != 0) { | ||
2498 | - /* Inquiry failed (msg printed already) */ | ||
2499 | dev_err(&h->pdev->dev, | ||
2500 | - "hpsa_update_device_info: inquiry failed\n"); | ||
2501 | - rc = -EIO; | ||
2502 | + "%s: inquiry failed, device will be skipped.\n", | ||
2503 | + __func__); | ||
2504 | + rc = HPSA_INQUIRY_FAILED; | ||
2505 | goto bail_out; | ||
2506 | } | ||
2507 | |||
2508 | @@ -3857,15 +3851,19 @@ static int hpsa_update_device_info(struct ctlr_info *h, | ||
2509 | if ((this_device->devtype == TYPE_DISK || | ||
2510 | this_device->devtype == TYPE_ZBC) && | ||
2511 | is_logical_dev_addr_mode(scsi3addr)) { | ||
2512 | - int volume_offline; | ||
2513 | + unsigned char volume_offline; | ||
2514 | |||
2515 | hpsa_get_raid_level(h, scsi3addr, &this_device->raid_level); | ||
2516 | if (h->fw_support & MISC_FW_RAID_OFFLOAD_BASIC) | ||
2517 | hpsa_get_ioaccel_status(h, scsi3addr, this_device); | ||
2518 | volume_offline = hpsa_volume_offline(h, scsi3addr); | ||
2519 | - if (volume_offline < 0 || volume_offline > 0xff) | ||
2520 | - volume_offline = HPSA_VPD_LV_STATUS_UNSUPPORTED; | ||
2521 | - this_device->volume_offline = volume_offline & 0xff; | ||
2522 | + if (volume_offline == HPSA_LV_FAILED) { | ||
2523 | + rc = HPSA_LV_FAILED; | ||
2524 | + dev_err(&h->pdev->dev, | ||
2525 | + "%s: LV failed, device will be skipped.\n", | ||
2526 | + __func__); | ||
2527 | + goto bail_out; | ||
2528 | + } | ||
2529 | } else { | ||
2530 | this_device->raid_level = RAID_UNKNOWN; | ||
2531 | this_device->offload_config = 0; | ||
2532 | @@ -4353,8 +4351,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h) | ||
2533 | goto out; | ||
2534 | } | ||
2535 | if (rc) { | ||
2536 | - dev_warn(&h->pdev->dev, | ||
2537 | - "Inquiry failed, skipping device.\n"); | ||
2538 | + h->drv_req_rescan = 1; | ||
2539 | continue; | ||
2540 | } | ||
2541 | |||
2542 | @@ -5532,7 +5529,7 @@ static void hpsa_scan_complete(struct ctlr_info *h) | ||
2543 | |||
2544 | spin_lock_irqsave(&h->scan_lock, flags); | ||
2545 | h->scan_finished = 1; | ||
2546 | - wake_up_all(&h->scan_wait_queue); | ||
2547 | + wake_up(&h->scan_wait_queue); | ||
2548 | spin_unlock_irqrestore(&h->scan_lock, flags); | ||
2549 | } | ||
2550 | |||
2551 | @@ -5550,11 +5547,23 @@ static void hpsa_scan_start(struct Scsi_Host *sh) | ||
2552 | if (unlikely(lockup_detected(h))) | ||
2553 | return hpsa_scan_complete(h); | ||
2554 | |||
2555 | + /* | ||
2556 | + * If a scan is already waiting to run, no need to add another | ||
2557 | + */ | ||
2558 | + spin_lock_irqsave(&h->scan_lock, flags); | ||
2559 | + if (h->scan_waiting) { | ||
2560 | + spin_unlock_irqrestore(&h->scan_lock, flags); | ||
2561 | + return; | ||
2562 | + } | ||
2563 | + | ||
2564 | + spin_unlock_irqrestore(&h->scan_lock, flags); | ||
2565 | + | ||
2566 | /* wait until any scan already in progress is finished. */ | ||
2567 | while (1) { | ||
2568 | spin_lock_irqsave(&h->scan_lock, flags); | ||
2569 | if (h->scan_finished) | ||
2570 | break; | ||
2571 | + h->scan_waiting = 1; | ||
2572 | spin_unlock_irqrestore(&h->scan_lock, flags); | ||
2573 | wait_event(h->scan_wait_queue, h->scan_finished); | ||
2574 | /* Note: We don't need to worry about a race between this | ||
2575 | @@ -5564,6 +5573,7 @@ static void hpsa_scan_start(struct Scsi_Host *sh) | ||
2576 | */ | ||
2577 | } | ||
2578 | h->scan_finished = 0; /* mark scan as in progress */ | ||
2579 | + h->scan_waiting = 0; | ||
2580 | spin_unlock_irqrestore(&h->scan_lock, flags); | ||
2581 | |||
2582 | if (unlikely(lockup_detected(h))) | ||
2583 | @@ -8802,6 +8812,7 @@ static int hpsa_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
2584 | init_waitqueue_head(&h->event_sync_wait_queue); | ||
2585 | mutex_init(&h->reset_mutex); | ||
2586 | h->scan_finished = 1; /* no scan currently in progress */ | ||
2587 | + h->scan_waiting = 0; | ||
2588 | |||
2589 | pci_set_drvdata(pdev, h); | ||
2590 | h->ndevices = 0; | ||
2591 | @@ -9094,6 +9105,8 @@ static void hpsa_remove_one(struct pci_dev *pdev) | ||
2592 | destroy_workqueue(h->rescan_ctlr_wq); | ||
2593 | destroy_workqueue(h->resubmit_wq); | ||
2594 | |||
2595 | + hpsa_delete_sas_host(h); | ||
2596 | + | ||
2597 | /* | ||
2598 | * Call before disabling interrupts. | ||
2599 | * scsi_remove_host can trigger I/O operations especially | ||
2600 | @@ -9128,8 +9141,6 @@ static void hpsa_remove_one(struct pci_dev *pdev) | ||
2601 | h->lockup_detected = NULL; /* init_one 2 */ | ||
2602 | /* (void) pci_disable_pcie_error_reporting(pdev); */ /* init_one 1 */ | ||
2603 | |||
2604 | - hpsa_delete_sas_host(h); | ||
2605 | - | ||
2606 | kfree(h); /* init_one 1 */ | ||
2607 | } | ||
2608 | |||
2609 | @@ -9621,9 +9632,9 @@ static void hpsa_free_sas_phy(struct hpsa_sas_phy *hpsa_sas_phy) | ||
2610 | struct sas_phy *phy = hpsa_sas_phy->phy; | ||
2611 | |||
2612 | sas_port_delete_phy(hpsa_sas_phy->parent_port->port, phy); | ||
2613 | - sas_phy_free(phy); | ||
2614 | if (hpsa_sas_phy->added_to_port) | ||
2615 | list_del(&hpsa_sas_phy->phy_list_entry); | ||
2616 | + sas_phy_delete(phy); | ||
2617 | kfree(hpsa_sas_phy); | ||
2618 | } | ||
2619 | |||
2620 | diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h | ||
2621 | index 9ea162de80dc..e16f2945f6ac 100644 | ||
2622 | --- a/drivers/scsi/hpsa.h | ||
2623 | +++ b/drivers/scsi/hpsa.h | ||
2624 | @@ -203,6 +203,7 @@ struct ctlr_info { | ||
2625 | dma_addr_t errinfo_pool_dhandle; | ||
2626 | unsigned long *cmd_pool_bits; | ||
2627 | int scan_finished; | ||
2628 | + u8 scan_waiting : 1; | ||
2629 | spinlock_t scan_lock; | ||
2630 | wait_queue_head_t scan_wait_queue; | ||
2631 | |||
2632 | diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h | ||
2633 | index a584cdf07058..5961705eef76 100644 | ||
2634 | --- a/drivers/scsi/hpsa_cmd.h | ||
2635 | +++ b/drivers/scsi/hpsa_cmd.h | ||
2636 | @@ -156,6 +156,7 @@ | ||
2637 | #define CFGTBL_BusType_Fibre2G 0x00000200l | ||
2638 | |||
2639 | /* VPD Inquiry types */ | ||
2640 | +#define HPSA_INQUIRY_FAILED 0x02 | ||
2641 | #define HPSA_VPD_SUPPORTED_PAGES 0x00 | ||
2642 | #define HPSA_VPD_LV_DEVICE_ID 0x83 | ||
2643 | #define HPSA_VPD_LV_DEVICE_GEOMETRY 0xC1 | ||
2644 | @@ -166,6 +167,7 @@ | ||
2645 | /* Logical volume states */ | ||
2646 | #define HPSA_VPD_LV_STATUS_UNSUPPORTED 0xff | ||
2647 | #define HPSA_LV_OK 0x0 | ||
2648 | +#define HPSA_LV_FAILED 0x01 | ||
2649 | #define HPSA_LV_NOT_AVAILABLE 0x0b | ||
2650 | #define HPSA_LV_UNDERGOING_ERASE 0x0F | ||
2651 | #define HPSA_LV_UNDERGOING_RPI 0x12 | ||
2652 | diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c | ||
2653 | index cf04a364fd8b..2b0e61557317 100644 | ||
2654 | --- a/drivers/scsi/scsi_debug.c | ||
2655 | +++ b/drivers/scsi/scsi_debug.c | ||
2656 | @@ -2996,11 +2996,11 @@ static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num, | ||
2657 | if (-1 == ret) { | ||
2658 | write_unlock_irqrestore(&atomic_rw, iflags); | ||
2659 | return DID_ERROR << 16; | ||
2660 | - } else if (sdebug_verbose && (ret < (num * sdebug_sector_size))) | ||
2661 | + } else if (sdebug_verbose && !ndob && (ret < sdebug_sector_size)) | ||
2662 | sdev_printk(KERN_INFO, scp->device, | ||
2663 | - "%s: %s: cdb indicated=%u, IO sent=%d bytes\n", | ||
2664 | + "%s: %s: lb size=%u, IO sent=%d bytes\n", | ||
2665 | my_name, "write same", | ||
2666 | - num * sdebug_sector_size, ret); | ||
2667 | + sdebug_sector_size, ret); | ||
2668 | |||
2669 | /* Copy first sector to remaining blocks */ | ||
2670 | for (i = 1 ; i < num ; i++) | ||
2671 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c | ||
2672 | index 246456925335..26e6b05d05fc 100644 | ||
2673 | --- a/drivers/scsi/scsi_devinfo.c | ||
2674 | +++ b/drivers/scsi/scsi_devinfo.c | ||
2675 | @@ -160,7 +160,7 @@ static struct { | ||
2676 | {"DGC", "RAID", NULL, BLIST_SPARSELUN}, /* Dell PV 650F, storage on LUN 0 */ | ||
2677 | {"DGC", "DISK", NULL, BLIST_SPARSELUN}, /* Dell PV 650F, no storage on LUN 0 */ | ||
2678 | {"EMC", "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, | ||
2679 | - {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN}, | ||
2680 | + {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_REPORTLUN2}, | ||
2681 | {"EMULEX", "MD21/S2 ESDI", NULL, BLIST_SINGLELUN}, | ||
2682 | {"easyRAID", "16P", NULL, BLIST_NOREPORTLUN}, | ||
2683 | {"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN}, | ||
2684 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
2685 | index 09fa1fd0c4ce..ace56c5e61e1 100644 | ||
2686 | --- a/drivers/scsi/sd.c | ||
2687 | +++ b/drivers/scsi/sd.c | ||
2688 | @@ -234,11 +234,15 @@ manage_start_stop_store(struct device *dev, struct device_attribute *attr, | ||
2689 | { | ||
2690 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
2691 | struct scsi_device *sdp = sdkp->device; | ||
2692 | + bool v; | ||
2693 | |||
2694 | if (!capable(CAP_SYS_ADMIN)) | ||
2695 | return -EACCES; | ||
2696 | |||
2697 | - sdp->manage_start_stop = simple_strtoul(buf, NULL, 10); | ||
2698 | + if (kstrtobool(buf, &v)) | ||
2699 | + return -EINVAL; | ||
2700 | + | ||
2701 | + sdp->manage_start_stop = v; | ||
2702 | |||
2703 | return count; | ||
2704 | } | ||
2705 | @@ -256,6 +260,7 @@ static ssize_t | ||
2706 | allow_restart_store(struct device *dev, struct device_attribute *attr, | ||
2707 | const char *buf, size_t count) | ||
2708 | { | ||
2709 | + bool v; | ||
2710 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
2711 | struct scsi_device *sdp = sdkp->device; | ||
2712 | |||
2713 | @@ -265,7 +270,10 @@ allow_restart_store(struct device *dev, struct device_attribute *attr, | ||
2714 | if (sdp->type != TYPE_DISK) | ||
2715 | return -EINVAL; | ||
2716 | |||
2717 | - sdp->allow_restart = simple_strtoul(buf, NULL, 10); | ||
2718 | + if (kstrtobool(buf, &v)) | ||
2719 | + return -EINVAL; | ||
2720 | + | ||
2721 | + sdp->allow_restart = v; | ||
2722 | |||
2723 | return count; | ||
2724 | } | ||
2725 | diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c | ||
2726 | index a5f10936fb9c..e929f5142862 100644 | ||
2727 | --- a/drivers/soc/mediatek/mtk-pmic-wrap.c | ||
2728 | +++ b/drivers/soc/mediatek/mtk-pmic-wrap.c | ||
2729 | @@ -522,7 +522,7 @@ struct pmic_wrapper_type { | ||
2730 | u32 int_en_all; | ||
2731 | u32 spi_w; | ||
2732 | u32 wdt_src; | ||
2733 | - int has_bridge:1; | ||
2734 | + unsigned int has_bridge:1; | ||
2735 | int (*init_reg_clock)(struct pmic_wrapper *wrp); | ||
2736 | int (*init_soc_specific)(struct pmic_wrapper *wrp); | ||
2737 | }; | ||
2738 | diff --git a/drivers/staging/rtl8188eu/core/rtw_cmd.c b/drivers/staging/rtl8188eu/core/rtw_cmd.c | ||
2739 | index f1f4788dbd86..6051a7ba0797 100644 | ||
2740 | --- a/drivers/staging/rtl8188eu/core/rtw_cmd.c | ||
2741 | +++ b/drivers/staging/rtl8188eu/core/rtw_cmd.c | ||
2742 | @@ -342,7 +342,7 @@ u8 rtw_createbss_cmd(struct adapter *padapter) | ||
2743 | else | ||
2744 | RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, (" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); | ||
2745 | |||
2746 | - pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); | ||
2747 | + pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); | ||
2748 | if (!pcmd) { | ||
2749 | res = _FAIL; | ||
2750 | goto exit; | ||
2751 | @@ -522,7 +522,7 @@ u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms, bool enqueu | ||
2752 | |||
2753 | if (enqueue) { | ||
2754 | /* need enqueue, prepare cmd_obj and enqueue */ | ||
2755 | - cmdobj = kzalloc(sizeof(*cmdobj), GFP_KERNEL); | ||
2756 | + cmdobj = kzalloc(sizeof(*cmdobj), GFP_ATOMIC); | ||
2757 | if (!cmdobj) { | ||
2758 | res = _FAIL; | ||
2759 | kfree(param); | ||
2760 | diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c | ||
2761 | index f109eeac358d..ab96629b7889 100644 | ||
2762 | --- a/drivers/staging/vt6655/device_main.c | ||
2763 | +++ b/drivers/staging/vt6655/device_main.c | ||
2764 | @@ -1698,10 +1698,11 @@ static int vt6655_suspend(struct pci_dev *pcid, pm_message_t state) | ||
2765 | MACbShutdown(priv); | ||
2766 | |||
2767 | pci_disable_device(pcid); | ||
2768 | - pci_set_power_state(pcid, pci_choose_state(pcid, state)); | ||
2769 | |||
2770 | spin_unlock_irqrestore(&priv->lock, flags); | ||
2771 | |||
2772 | + pci_set_power_state(pcid, pci_choose_state(pcid, state)); | ||
2773 | + | ||
2774 | return 0; | ||
2775 | } | ||
2776 | |||
2777 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
2778 | index 0d578297d9f9..72e926d9868f 100644 | ||
2779 | --- a/drivers/target/iscsi/iscsi_target.c | ||
2780 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
2781 | @@ -841,6 +841,7 @@ static int iscsit_add_reject_from_cmd( | ||
2782 | unsigned char *buf) | ||
2783 | { | ||
2784 | struct iscsi_conn *conn; | ||
2785 | + const bool do_put = cmd->se_cmd.se_tfo != NULL; | ||
2786 | |||
2787 | if (!cmd->conn) { | ||
2788 | pr_err("cmd->conn is NULL for ITT: 0x%08x\n", | ||
2789 | @@ -871,7 +872,7 @@ static int iscsit_add_reject_from_cmd( | ||
2790 | * Perform the kref_put now if se_cmd has already been setup by | ||
2791 | * scsit_setup_scsi_cmd() | ||
2792 | */ | ||
2793 | - if (cmd->se_cmd.se_tfo != NULL) { | ||
2794 | + if (do_put) { | ||
2795 | pr_debug("iscsi reject: calling target_put_sess_cmd >>>>>>\n"); | ||
2796 | target_put_sess_cmd(&cmd->se_cmd); | ||
2797 | } | ||
2798 | diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c | ||
2799 | index 9cbbc9cf63fb..8a4bc15bc3f5 100644 | ||
2800 | --- a/drivers/target/iscsi/iscsi_target_configfs.c | ||
2801 | +++ b/drivers/target/iscsi/iscsi_target_configfs.c | ||
2802 | @@ -1144,7 +1144,7 @@ static struct se_portal_group *lio_target_tiqn_addtpg( | ||
2803 | |||
2804 | ret = core_tpg_register(wwn, &tpg->tpg_se_tpg, SCSI_PROTOCOL_ISCSI); | ||
2805 | if (ret < 0) | ||
2806 | - return NULL; | ||
2807 | + goto free_out; | ||
2808 | |||
2809 | ret = iscsit_tpg_add_portal_group(tiqn, tpg); | ||
2810 | if (ret != 0) | ||
2811 | @@ -1156,6 +1156,7 @@ static struct se_portal_group *lio_target_tiqn_addtpg( | ||
2812 | return &tpg->tpg_se_tpg; | ||
2813 | out: | ||
2814 | core_tpg_deregister(&tpg->tpg_se_tpg); | ||
2815 | +free_out: | ||
2816 | kfree(tpg); | ||
2817 | return NULL; | ||
2818 | } | ||
2819 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c | ||
2820 | index 4c82bbe19003..ee5b29aed54b 100644 | ||
2821 | --- a/drivers/target/target_core_alua.c | ||
2822 | +++ b/drivers/target/target_core_alua.c | ||
2823 | @@ -1010,7 +1010,7 @@ static void core_alua_queue_state_change_ua(struct t10_alua_tg_pt_gp *tg_pt_gp) | ||
2824 | static void core_alua_do_transition_tg_pt_work(struct work_struct *work) | ||
2825 | { | ||
2826 | struct t10_alua_tg_pt_gp *tg_pt_gp = container_of(work, | ||
2827 | - struct t10_alua_tg_pt_gp, tg_pt_gp_transition_work.work); | ||
2828 | + struct t10_alua_tg_pt_gp, tg_pt_gp_transition_work); | ||
2829 | struct se_device *dev = tg_pt_gp->tg_pt_gp_dev; | ||
2830 | bool explicit = (tg_pt_gp->tg_pt_gp_alua_access_status == | ||
2831 | ALUA_STATUS_ALTERED_BY_EXPLICIT_STPG); | ||
2832 | @@ -1073,17 +1073,8 @@ static int core_alua_do_transition_tg_pt( | ||
2833 | /* | ||
2834 | * Flush any pending transitions | ||
2835 | */ | ||
2836 | - if (!explicit && tg_pt_gp->tg_pt_gp_implicit_trans_secs && | ||
2837 | - atomic_read(&tg_pt_gp->tg_pt_gp_alua_access_state) == | ||
2838 | - ALUA_ACCESS_STATE_TRANSITION) { | ||
2839 | - /* Just in case */ | ||
2840 | - tg_pt_gp->tg_pt_gp_alua_pending_state = new_state; | ||
2841 | - tg_pt_gp->tg_pt_gp_transition_complete = &wait; | ||
2842 | - flush_delayed_work(&tg_pt_gp->tg_pt_gp_transition_work); | ||
2843 | - wait_for_completion(&wait); | ||
2844 | - tg_pt_gp->tg_pt_gp_transition_complete = NULL; | ||
2845 | - return 0; | ||
2846 | - } | ||
2847 | + if (!explicit) | ||
2848 | + flush_work(&tg_pt_gp->tg_pt_gp_transition_work); | ||
2849 | |||
2850 | /* | ||
2851 | * Save the old primary ALUA access state, and set the current state | ||
2852 | @@ -1114,17 +1105,9 @@ static int core_alua_do_transition_tg_pt( | ||
2853 | atomic_inc(&tg_pt_gp->tg_pt_gp_ref_cnt); | ||
2854 | spin_unlock(&dev->t10_alua.tg_pt_gps_lock); | ||
2855 | |||
2856 | - if (!explicit && tg_pt_gp->tg_pt_gp_implicit_trans_secs) { | ||
2857 | - unsigned long transition_tmo; | ||
2858 | - | ||
2859 | - transition_tmo = tg_pt_gp->tg_pt_gp_implicit_trans_secs * HZ; | ||
2860 | - queue_delayed_work(tg_pt_gp->tg_pt_gp_dev->tmr_wq, | ||
2861 | - &tg_pt_gp->tg_pt_gp_transition_work, | ||
2862 | - transition_tmo); | ||
2863 | - } else { | ||
2864 | + schedule_work(&tg_pt_gp->tg_pt_gp_transition_work); | ||
2865 | + if (explicit) { | ||
2866 | tg_pt_gp->tg_pt_gp_transition_complete = &wait; | ||
2867 | - queue_delayed_work(tg_pt_gp->tg_pt_gp_dev->tmr_wq, | ||
2868 | - &tg_pt_gp->tg_pt_gp_transition_work, 0); | ||
2869 | wait_for_completion(&wait); | ||
2870 | tg_pt_gp->tg_pt_gp_transition_complete = NULL; | ||
2871 | } | ||
2872 | @@ -1692,8 +1675,8 @@ struct t10_alua_tg_pt_gp *core_alua_allocate_tg_pt_gp(struct se_device *dev, | ||
2873 | mutex_init(&tg_pt_gp->tg_pt_gp_md_mutex); | ||
2874 | spin_lock_init(&tg_pt_gp->tg_pt_gp_lock); | ||
2875 | atomic_set(&tg_pt_gp->tg_pt_gp_ref_cnt, 0); | ||
2876 | - INIT_DELAYED_WORK(&tg_pt_gp->tg_pt_gp_transition_work, | ||
2877 | - core_alua_do_transition_tg_pt_work); | ||
2878 | + INIT_WORK(&tg_pt_gp->tg_pt_gp_transition_work, | ||
2879 | + core_alua_do_transition_tg_pt_work); | ||
2880 | tg_pt_gp->tg_pt_gp_dev = dev; | ||
2881 | atomic_set(&tg_pt_gp->tg_pt_gp_alua_access_state, | ||
2882 | ALUA_ACCESS_STATE_ACTIVE_OPTIMIZED); | ||
2883 | @@ -1801,7 +1784,7 @@ void core_alua_free_tg_pt_gp( | ||
2884 | dev->t10_alua.alua_tg_pt_gps_counter--; | ||
2885 | spin_unlock(&dev->t10_alua.tg_pt_gps_lock); | ||
2886 | |||
2887 | - flush_delayed_work(&tg_pt_gp->tg_pt_gp_transition_work); | ||
2888 | + flush_work(&tg_pt_gp->tg_pt_gp_transition_work); | ||
2889 | |||
2890 | /* | ||
2891 | * Allow a struct t10_alua_tg_pt_gp_member * referenced by | ||
2892 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c | ||
2893 | index 29f807b29e74..97928b42ad62 100644 | ||
2894 | --- a/drivers/target/target_core_file.c | ||
2895 | +++ b/drivers/target/target_core_file.c | ||
2896 | @@ -466,6 +466,10 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) | ||
2897 | struct inode *inode = file->f_mapping->host; | ||
2898 | int ret; | ||
2899 | |||
2900 | + if (!nolb) { | ||
2901 | + return 0; | ||
2902 | + } | ||
2903 | + | ||
2904 | if (cmd->se_dev->dev_attrib.pi_prot_type) { | ||
2905 | ret = fd_do_prot_unmap(cmd, lba, nolb); | ||
2906 | if (ret) | ||
2907 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c | ||
2908 | index 47463c99c318..df20921c233c 100644 | ||
2909 | --- a/drivers/target/target_core_pr.c | ||
2910 | +++ b/drivers/target/target_core_pr.c | ||
2911 | @@ -56,8 +56,10 @@ void core_pr_dump_initiator_port( | ||
2912 | char *buf, | ||
2913 | u32 size) | ||
2914 | { | ||
2915 | - if (!pr_reg->isid_present_at_reg) | ||
2916 | + if (!pr_reg->isid_present_at_reg) { | ||
2917 | buf[0] = '\0'; | ||
2918 | + return; | ||
2919 | + } | ||
2920 | |||
2921 | snprintf(buf, size, ",i,0x%s", pr_reg->pr_reg_isid); | ||
2922 | } | ||
2923 | diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c | ||
2924 | index bcef2e7c4ec9..1eea63caa451 100644 | ||
2925 | --- a/drivers/thermal/step_wise.c | ||
2926 | +++ b/drivers/thermal/step_wise.c | ||
2927 | @@ -31,8 +31,7 @@ | ||
2928 | * If the temperature is higher than a trip point, | ||
2929 | * a. if the trend is THERMAL_TREND_RAISING, use higher cooling | ||
2930 | * state for this trip point | ||
2931 | - * b. if the trend is THERMAL_TREND_DROPPING, use lower cooling | ||
2932 | - * state for this trip point | ||
2933 | + * b. if the trend is THERMAL_TREND_DROPPING, do nothing | ||
2934 | * c. if the trend is THERMAL_TREND_RAISE_FULL, use upper limit | ||
2935 | * for this trip point | ||
2936 | * d. if the trend is THERMAL_TREND_DROP_FULL, use lower limit | ||
2937 | @@ -94,9 +93,11 @@ static unsigned long get_target_state(struct thermal_instance *instance, | ||
2938 | if (!throttle) | ||
2939 | next_target = THERMAL_NO_TARGET; | ||
2940 | } else { | ||
2941 | - next_target = cur_state - 1; | ||
2942 | - if (next_target > instance->upper) | ||
2943 | - next_target = instance->upper; | ||
2944 | + if (!throttle) { | ||
2945 | + next_target = cur_state - 1; | ||
2946 | + if (next_target > instance->upper) | ||
2947 | + next_target = instance->upper; | ||
2948 | + } | ||
2949 | } | ||
2950 | break; | ||
2951 | case THERMAL_TREND_DROP_FULL: | ||
2952 | diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c | ||
2953 | index 68947f6de5ad..b0500a0a87b8 100644 | ||
2954 | --- a/drivers/tty/tty_ldisc.c | ||
2955 | +++ b/drivers/tty/tty_ldisc.c | ||
2956 | @@ -271,10 +271,13 @@ const struct file_operations tty_ldiscs_proc_fops = { | ||
2957 | |||
2958 | struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty) | ||
2959 | { | ||
2960 | + struct tty_ldisc *ld; | ||
2961 | + | ||
2962 | ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT); | ||
2963 | - if (!tty->ldisc) | ||
2964 | + ld = tty->ldisc; | ||
2965 | + if (!ld) | ||
2966 | ldsem_up_read(&tty->ldisc_sem); | ||
2967 | - return tty->ldisc; | ||
2968 | + return ld; | ||
2969 | } | ||
2970 | EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait); | ||
2971 | |||
2972 | @@ -488,41 +491,6 @@ static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld) | ||
2973 | tty_ldisc_debug(tty, "%p: closed\n", ld); | ||
2974 | } | ||
2975 | |||
2976 | -/** | ||
2977 | - * tty_ldisc_restore - helper for tty ldisc change | ||
2978 | - * @tty: tty to recover | ||
2979 | - * @old: previous ldisc | ||
2980 | - * | ||
2981 | - * Restore the previous line discipline or N_TTY when a line discipline | ||
2982 | - * change fails due to an open error | ||
2983 | - */ | ||
2984 | - | ||
2985 | -static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) | ||
2986 | -{ | ||
2987 | - struct tty_ldisc *new_ldisc; | ||
2988 | - int r; | ||
2989 | - | ||
2990 | - /* There is an outstanding reference here so this is safe */ | ||
2991 | - old = tty_ldisc_get(tty, old->ops->num); | ||
2992 | - WARN_ON(IS_ERR(old)); | ||
2993 | - tty->ldisc = old; | ||
2994 | - tty_set_termios_ldisc(tty, old->ops->num); | ||
2995 | - if (tty_ldisc_open(tty, old) < 0) { | ||
2996 | - tty_ldisc_put(old); | ||
2997 | - /* This driver is always present */ | ||
2998 | - new_ldisc = tty_ldisc_get(tty, N_TTY); | ||
2999 | - if (IS_ERR(new_ldisc)) | ||
3000 | - panic("n_tty: get"); | ||
3001 | - tty->ldisc = new_ldisc; | ||
3002 | - tty_set_termios_ldisc(tty, N_TTY); | ||
3003 | - r = tty_ldisc_open(tty, new_ldisc); | ||
3004 | - if (r < 0) | ||
3005 | - panic("Couldn't open N_TTY ldisc for " | ||
3006 | - "%s --- error %d.", | ||
3007 | - tty_name(tty), r); | ||
3008 | - } | ||
3009 | -} | ||
3010 | - | ||
3011 | /** | ||
3012 | * tty_set_ldisc - set line discipline | ||
3013 | * @tty: the terminal to set | ||
3014 | @@ -536,12 +504,7 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) | ||
3015 | |||
3016 | int tty_set_ldisc(struct tty_struct *tty, int disc) | ||
3017 | { | ||
3018 | - int retval; | ||
3019 | - struct tty_ldisc *old_ldisc, *new_ldisc; | ||
3020 | - | ||
3021 | - new_ldisc = tty_ldisc_get(tty, disc); | ||
3022 | - if (IS_ERR(new_ldisc)) | ||
3023 | - return PTR_ERR(new_ldisc); | ||
3024 | + int retval, old_disc; | ||
3025 | |||
3026 | tty_lock(tty); | ||
3027 | retval = tty_ldisc_lock(tty, 5 * HZ); | ||
3028 | @@ -554,7 +517,8 @@ int tty_set_ldisc(struct tty_struct *tty, int disc) | ||
3029 | } | ||
3030 | |||
3031 | /* Check the no-op case */ | ||
3032 | - if (tty->ldisc->ops->num == disc) | ||
3033 | + old_disc = tty->ldisc->ops->num; | ||
3034 | + if (old_disc == disc) | ||
3035 | goto out; | ||
3036 | |||
3037 | if (test_bit(TTY_HUPPED, &tty->flags)) { | ||
3038 | @@ -563,34 +527,25 @@ int tty_set_ldisc(struct tty_struct *tty, int disc) | ||
3039 | goto out; | ||
3040 | } | ||
3041 | |||
3042 | - old_ldisc = tty->ldisc; | ||
3043 | - | ||
3044 | - /* Shutdown the old discipline. */ | ||
3045 | - tty_ldisc_close(tty, old_ldisc); | ||
3046 | - | ||
3047 | - /* Now set up the new line discipline. */ | ||
3048 | - tty->ldisc = new_ldisc; | ||
3049 | - tty_set_termios_ldisc(tty, disc); | ||
3050 | - | ||
3051 | - retval = tty_ldisc_open(tty, new_ldisc); | ||
3052 | + retval = tty_ldisc_reinit(tty, disc); | ||
3053 | if (retval < 0) { | ||
3054 | /* Back to the old one or N_TTY if we can't */ | ||
3055 | - tty_ldisc_put(new_ldisc); | ||
3056 | - tty_ldisc_restore(tty, old_ldisc); | ||
3057 | + if (tty_ldisc_reinit(tty, old_disc) < 0) { | ||
3058 | + pr_err("tty: TIOCSETD failed, reinitializing N_TTY\n"); | ||
3059 | + if (tty_ldisc_reinit(tty, N_TTY) < 0) { | ||
3060 | + /* At this point we have tty->ldisc == NULL. */ | ||
3061 | + pr_err("tty: reinitializing N_TTY failed\n"); | ||
3062 | + } | ||
3063 | + } | ||
3064 | } | ||
3065 | |||
3066 | - if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) { | ||
3067 | + if (tty->ldisc && tty->ldisc->ops->num != old_disc && | ||
3068 | + tty->ops->set_ldisc) { | ||
3069 | down_read(&tty->termios_rwsem); | ||
3070 | tty->ops->set_ldisc(tty); | ||
3071 | up_read(&tty->termios_rwsem); | ||
3072 | } | ||
3073 | |||
3074 | - /* At this point we hold a reference to the new ldisc and a | ||
3075 | - reference to the old ldisc, or we hold two references to | ||
3076 | - the old ldisc (if it was restored as part of error cleanup | ||
3077 | - above). In either case, releasing a single reference from | ||
3078 | - the old ldisc is correct. */ | ||
3079 | - new_ldisc = old_ldisc; | ||
3080 | out: | ||
3081 | tty_ldisc_unlock(tty); | ||
3082 | |||
3083 | @@ -598,7 +553,6 @@ int tty_set_ldisc(struct tty_struct *tty, int disc) | ||
3084 | already running */ | ||
3085 | tty_buffer_restart_work(tty->port); | ||
3086 | err: | ||
3087 | - tty_ldisc_put(new_ldisc); /* drop the extra reference */ | ||
3088 | tty_unlock(tty); | ||
3089 | return retval; | ||
3090 | } | ||
3091 | @@ -659,10 +613,8 @@ int tty_ldisc_reinit(struct tty_struct *tty, int disc) | ||
3092 | int retval; | ||
3093 | |||
3094 | ld = tty_ldisc_get(tty, disc); | ||
3095 | - if (IS_ERR(ld)) { | ||
3096 | - BUG_ON(disc == N_TTY); | ||
3097 | + if (IS_ERR(ld)) | ||
3098 | return PTR_ERR(ld); | ||
3099 | - } | ||
3100 | |||
3101 | if (tty->ldisc) { | ||
3102 | tty_ldisc_close(tty, tty->ldisc); | ||
3103 | @@ -674,10 +626,8 @@ int tty_ldisc_reinit(struct tty_struct *tty, int disc) | ||
3104 | tty_set_termios_ldisc(tty, disc); | ||
3105 | retval = tty_ldisc_open(tty, tty->ldisc); | ||
3106 | if (retval) { | ||
3107 | - if (!WARN_ON(disc == N_TTY)) { | ||
3108 | - tty_ldisc_put(tty->ldisc); | ||
3109 | - tty->ldisc = NULL; | ||
3110 | - } | ||
3111 | + tty_ldisc_put(tty->ldisc); | ||
3112 | + tty->ldisc = NULL; | ||
3113 | } | ||
3114 | return retval; | ||
3115 | } | ||
3116 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c | ||
3117 | index 5ebe04d3598b..ba9b29bc441f 100644 | ||
3118 | --- a/drivers/usb/core/config.c | ||
3119 | +++ b/drivers/usb/core/config.c | ||
3120 | @@ -550,6 +550,9 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, | ||
3121 | unsigned iad_num = 0; | ||
3122 | |||
3123 | memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE); | ||
3124 | + nintf = nintf_orig = config->desc.bNumInterfaces; | ||
3125 | + config->desc.bNumInterfaces = 0; // Adjusted later | ||
3126 | + | ||
3127 | if (config->desc.bDescriptorType != USB_DT_CONFIG || | ||
3128 | config->desc.bLength < USB_DT_CONFIG_SIZE || | ||
3129 | config->desc.bLength > size) { | ||
3130 | @@ -563,7 +566,6 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, | ||
3131 | buffer += config->desc.bLength; | ||
3132 | size -= config->desc.bLength; | ||
3133 | |||
3134 | - nintf = nintf_orig = config->desc.bNumInterfaces; | ||
3135 | if (nintf > USB_MAXINTERFACES) { | ||
3136 | dev_warn(ddev, "config %d has too many interfaces: %d, " | ||
3137 | "using maximum allowed: %d\n", | ||
3138 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
3139 | index a3ecd8bd5324..82eea55a7b5c 100644 | ||
3140 | --- a/drivers/usb/host/xhci-mem.c | ||
3141 | +++ b/drivers/usb/host/xhci-mem.c | ||
3142 | @@ -1032,10 +1032,9 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, | ||
3143 | return 0; | ||
3144 | } | ||
3145 | |||
3146 | - xhci->devs[slot_id] = kzalloc(sizeof(*xhci->devs[slot_id]), flags); | ||
3147 | - if (!xhci->devs[slot_id]) | ||
3148 | + dev = kzalloc(sizeof(*dev), flags); | ||
3149 | + if (!dev) | ||
3150 | return 0; | ||
3151 | - dev = xhci->devs[slot_id]; | ||
3152 | |||
3153 | /* Allocate the (output) device context that will be used in the HC. */ | ||
3154 | dev->out_ctx = xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_DEVICE, flags); | ||
3155 | @@ -1083,9 +1082,17 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, | ||
3156 | &xhci->dcbaa->dev_context_ptrs[slot_id], | ||
3157 | le64_to_cpu(xhci->dcbaa->dev_context_ptrs[slot_id])); | ||
3158 | |||
3159 | + xhci->devs[slot_id] = dev; | ||
3160 | + | ||
3161 | return 1; | ||
3162 | fail: | ||
3163 | - xhci_free_virt_device(xhci, slot_id); | ||
3164 | + | ||
3165 | + if (dev->in_ctx) | ||
3166 | + xhci_free_container_ctx(xhci, dev->in_ctx); | ||
3167 | + if (dev->out_ctx) | ||
3168 | + xhci_free_container_ctx(xhci, dev->out_ctx); | ||
3169 | + kfree(dev); | ||
3170 | + | ||
3171 | return 0; | ||
3172 | } | ||
3173 | |||
3174 | diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c | ||
3175 | index f2365a47fa4a..ce9e457e60c3 100644 | ||
3176 | --- a/drivers/usb/host/xhci-mtk.c | ||
3177 | +++ b/drivers/usb/host/xhci-mtk.c | ||
3178 | @@ -632,13 +632,13 @@ static int xhci_mtk_probe(struct platform_device *pdev) | ||
3179 | goto power_off_phys; | ||
3180 | } | ||
3181 | |||
3182 | - if (HCC_MAX_PSA(xhci->hcc_params) >= 4) | ||
3183 | - xhci->shared_hcd->can_do_streams = 1; | ||
3184 | - | ||
3185 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); | ||
3186 | if (ret) | ||
3187 | goto put_usb3_hcd; | ||
3188 | |||
3189 | + if (HCC_MAX_PSA(xhci->hcc_params) >= 4) | ||
3190 | + xhci->shared_hcd->can_do_streams = 1; | ||
3191 | + | ||
3192 | ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); | ||
3193 | if (ret) | ||
3194 | goto dealloc_usb2_hcd; | ||
3195 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
3196 | index 63735b5310bb..89a14d5f6ad8 100644 | ||
3197 | --- a/drivers/usb/host/xhci-ring.c | ||
3198 | +++ b/drivers/usb/host/xhci-ring.c | ||
3199 | @@ -3132,7 +3132,7 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred, | ||
3200 | { | ||
3201 | u32 maxp, total_packet_count; | ||
3202 | |||
3203 | - /* MTK xHCI is mostly 0.97 but contains some features from 1.0 */ | ||
3204 | + /* MTK xHCI 0.96 contains some features from 1.0 */ | ||
3205 | if (xhci->hci_version < 0x100 && !(xhci->quirks & XHCI_MTK_HOST)) | ||
3206 | return ((td_total_len - transferred) >> 10); | ||
3207 | |||
3208 | @@ -3141,8 +3141,8 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred, | ||
3209 | trb_buff_len == td_total_len) | ||
3210 | return 0; | ||
3211 | |||
3212 | - /* for MTK xHCI, TD size doesn't include this TRB */ | ||
3213 | - if (xhci->quirks & XHCI_MTK_HOST) | ||
3214 | + /* for MTK xHCI 0.96, TD size include this TRB, but not in 1.x */ | ||
3215 | + if ((xhci->quirks & XHCI_MTK_HOST) && (xhci->hci_version < 0x100)) | ||
3216 | trb_buff_len = 0; | ||
3217 | |||
3218 | maxp = GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc)); | ||
3219 | diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c | ||
3220 | index bacee0fd4dd3..ea5bad49394b 100644 | ||
3221 | --- a/drivers/usb/musb/da8xx.c | ||
3222 | +++ b/drivers/usb/musb/da8xx.c | ||
3223 | @@ -302,7 +302,15 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) | ||
3224 | musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE; | ||
3225 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); | ||
3226 | del_timer(&otg_workaround); | ||
3227 | - } else { | ||
3228 | + } else if (!(musb->int_usb & MUSB_INTR_BABBLE)){ | ||
3229 | + /* | ||
3230 | + * When babble condition happens, drvvbus interrupt | ||
3231 | + * is also generated. Ignore this drvvbus interrupt | ||
3232 | + * and let babble interrupt handler recovers the | ||
3233 | + * controller; otherwise, the host-mode flag is lost | ||
3234 | + * due to the MUSB_DEV_MODE() call below and babble | ||
3235 | + * recovery logic will not called. | ||
3236 | + */ | ||
3237 | musb->is_active = 0; | ||
3238 | MUSB_DEV_MODE(musb); | ||
3239 | otg->default_a = 0; | ||
3240 | diff --git a/drivers/usb/phy/phy-isp1301.c b/drivers/usb/phy/phy-isp1301.c | ||
3241 | index db68156568e6..b3b33cf7ddf6 100644 | ||
3242 | --- a/drivers/usb/phy/phy-isp1301.c | ||
3243 | +++ b/drivers/usb/phy/phy-isp1301.c | ||
3244 | @@ -33,6 +33,12 @@ static const struct i2c_device_id isp1301_id[] = { | ||
3245 | }; | ||
3246 | MODULE_DEVICE_TABLE(i2c, isp1301_id); | ||
3247 | |||
3248 | +static const struct of_device_id isp1301_of_match[] = { | ||
3249 | + {.compatible = "nxp,isp1301" }, | ||
3250 | + { }, | ||
3251 | +}; | ||
3252 | +MODULE_DEVICE_TABLE(of, isp1301_of_match); | ||
3253 | + | ||
3254 | static struct i2c_client *isp1301_i2c_client; | ||
3255 | |||
3256 | static int __isp1301_write(struct isp1301 *isp, u8 reg, u8 value, u8 clear) | ||
3257 | @@ -130,6 +136,7 @@ static int isp1301_remove(struct i2c_client *client) | ||
3258 | static struct i2c_driver isp1301_driver = { | ||
3259 | .driver = { | ||
3260 | .name = DRV_NAME, | ||
3261 | + .of_match_table = of_match_ptr(isp1301_of_match), | ||
3262 | }, | ||
3263 | .probe = isp1301_probe, | ||
3264 | .remove = isp1301_remove, | ||
3265 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h | ||
3266 | index 2572fd5cd2bb..b605115eb47a 100644 | ||
3267 | --- a/drivers/usb/storage/unusual_devs.h | ||
3268 | +++ b/drivers/usb/storage/unusual_devs.h | ||
3269 | @@ -2113,6 +2113,13 @@ UNUSUAL_DEV( 0x152d, 0x0567, 0x0114, 0x0116, | ||
3270 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
3271 | US_FL_BROKEN_FUA ), | ||
3272 | |||
3273 | +/* Reported by David Kozub <zub@linux.fjfi.cvut.cz> */ | ||
3274 | +UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, | ||
3275 | + "JMicron", | ||
3276 | + "JMS567", | ||
3277 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
3278 | + US_FL_BROKEN_FUA), | ||
3279 | + | ||
3280 | /* | ||
3281 | * Reported by Alexandre Oliva <oliva@lsd.ic.unicamp.br> | ||
3282 | * JMicron responds to USN and several other SCSI ioctls with a | ||
3283 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h | ||
3284 | index cde115359793..9f356f7cf7d5 100644 | ||
3285 | --- a/drivers/usb/storage/unusual_uas.h | ||
3286 | +++ b/drivers/usb/storage/unusual_uas.h | ||
3287 | @@ -142,6 +142,13 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, | ||
3288 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
3289 | US_FL_BROKEN_FUA | US_FL_NO_REPORT_OPCODES), | ||
3290 | |||
3291 | +/* Reported-by: David Kozub <zub@linux.fjfi.cvut.cz> */ | ||
3292 | +UNUSUAL_DEV(0x152d, 0x0578, 0x0000, 0x9999, | ||
3293 | + "JMicron", | ||
3294 | + "JMS567", | ||
3295 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
3296 | + US_FL_BROKEN_FUA), | ||
3297 | + | ||
3298 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
3299 | UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, | ||
3300 | "VIA", | ||
3301 | diff --git a/drivers/usb/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c | ||
3302 | index 191b176ffedf..283a9be77a22 100644 | ||
3303 | --- a/drivers/usb/usbip/stub_rx.c | ||
3304 | +++ b/drivers/usb/usbip/stub_rx.c | ||
3305 | @@ -336,23 +336,34 @@ static struct stub_priv *stub_priv_alloc(struct stub_device *sdev, | ||
3306 | return priv; | ||
3307 | } | ||
3308 | |||
3309 | -static int get_pipe(struct stub_device *sdev, int epnum, int dir) | ||
3310 | +static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu) | ||
3311 | { | ||
3312 | struct usb_device *udev = sdev->udev; | ||
3313 | struct usb_host_endpoint *ep; | ||
3314 | struct usb_endpoint_descriptor *epd = NULL; | ||
3315 | + int epnum = pdu->base.ep; | ||
3316 | + int dir = pdu->base.direction; | ||
3317 | + | ||
3318 | + if (epnum < 0 || epnum > 15) | ||
3319 | + goto err_ret; | ||
3320 | |||
3321 | if (dir == USBIP_DIR_IN) | ||
3322 | ep = udev->ep_in[epnum & 0x7f]; | ||
3323 | else | ||
3324 | ep = udev->ep_out[epnum & 0x7f]; | ||
3325 | - if (!ep) { | ||
3326 | - dev_err(&sdev->udev->dev, "no such endpoint?, %d\n", | ||
3327 | - epnum); | ||
3328 | - BUG(); | ||
3329 | - } | ||
3330 | + if (!ep) | ||
3331 | + goto err_ret; | ||
3332 | |||
3333 | epd = &ep->desc; | ||
3334 | + | ||
3335 | + /* validate transfer_buffer_length */ | ||
3336 | + if (pdu->u.cmd_submit.transfer_buffer_length > INT_MAX) { | ||
3337 | + dev_err(&sdev->udev->dev, | ||
3338 | + "CMD_SUBMIT: -EMSGSIZE transfer_buffer_length %d\n", | ||
3339 | + pdu->u.cmd_submit.transfer_buffer_length); | ||
3340 | + return -1; | ||
3341 | + } | ||
3342 | + | ||
3343 | if (usb_endpoint_xfer_control(epd)) { | ||
3344 | if (dir == USBIP_DIR_OUT) | ||
3345 | return usb_sndctrlpipe(udev, epnum); | ||
3346 | @@ -375,15 +386,31 @@ static int get_pipe(struct stub_device *sdev, int epnum, int dir) | ||
3347 | } | ||
3348 | |||
3349 | if (usb_endpoint_xfer_isoc(epd)) { | ||
3350 | + /* validate packet size and number of packets */ | ||
3351 | + unsigned int maxp, packets, bytes; | ||
3352 | + | ||
3353 | + maxp = usb_endpoint_maxp(epd); | ||
3354 | + maxp *= usb_endpoint_maxp_mult(epd); | ||
3355 | + bytes = pdu->u.cmd_submit.transfer_buffer_length; | ||
3356 | + packets = DIV_ROUND_UP(bytes, maxp); | ||
3357 | + | ||
3358 | + if (pdu->u.cmd_submit.number_of_packets < 0 || | ||
3359 | + pdu->u.cmd_submit.number_of_packets > packets) { | ||
3360 | + dev_err(&sdev->udev->dev, | ||
3361 | + "CMD_SUBMIT: isoc invalid num packets %d\n", | ||
3362 | + pdu->u.cmd_submit.number_of_packets); | ||
3363 | + return -1; | ||
3364 | + } | ||
3365 | if (dir == USBIP_DIR_OUT) | ||
3366 | return usb_sndisocpipe(udev, epnum); | ||
3367 | else | ||
3368 | return usb_rcvisocpipe(udev, epnum); | ||
3369 | } | ||
3370 | |||
3371 | +err_ret: | ||
3372 | /* NOT REACHED */ | ||
3373 | - dev_err(&sdev->udev->dev, "get pipe, epnum %d\n", epnum); | ||
3374 | - return 0; | ||
3375 | + dev_err(&sdev->udev->dev, "CMD_SUBMIT: invalid epnum %d\n", epnum); | ||
3376 | + return -1; | ||
3377 | } | ||
3378 | |||
3379 | static void masking_bogus_flags(struct urb *urb) | ||
3380 | @@ -447,7 +474,10 @@ static void stub_recv_cmd_submit(struct stub_device *sdev, | ||
3381 | struct stub_priv *priv; | ||
3382 | struct usbip_device *ud = &sdev->ud; | ||
3383 | struct usb_device *udev = sdev->udev; | ||
3384 | - int pipe = get_pipe(sdev, pdu->base.ep, pdu->base.direction); | ||
3385 | + int pipe = get_pipe(sdev, pdu); | ||
3386 | + | ||
3387 | + if (pipe == -1) | ||
3388 | + return; | ||
3389 | |||
3390 | priv = stub_priv_alloc(sdev, pdu); | ||
3391 | if (!priv) | ||
3392 | @@ -466,7 +496,8 @@ static void stub_recv_cmd_submit(struct stub_device *sdev, | ||
3393 | } | ||
3394 | |||
3395 | /* allocate urb transfer buffer, if needed */ | ||
3396 | - if (pdu->u.cmd_submit.transfer_buffer_length > 0) { | ||
3397 | + if (pdu->u.cmd_submit.transfer_buffer_length > 0 && | ||
3398 | + pdu->u.cmd_submit.transfer_buffer_length <= INT_MAX) { | ||
3399 | priv->urb->transfer_buffer = | ||
3400 | kzalloc(pdu->u.cmd_submit.transfer_buffer_length, | ||
3401 | GFP_KERNEL); | ||
3402 | diff --git a/drivers/usb/usbip/stub_tx.c b/drivers/usb/usbip/stub_tx.c | ||
3403 | index be50cef645d8..87ff94be4235 100644 | ||
3404 | --- a/drivers/usb/usbip/stub_tx.c | ||
3405 | +++ b/drivers/usb/usbip/stub_tx.c | ||
3406 | @@ -181,6 +181,13 @@ static int stub_send_ret_submit(struct stub_device *sdev) | ||
3407 | memset(&pdu_header, 0, sizeof(pdu_header)); | ||
3408 | memset(&msg, 0, sizeof(msg)); | ||
3409 | |||
3410 | + if (urb->actual_length > 0 && !urb->transfer_buffer) { | ||
3411 | + dev_err(&sdev->udev->dev, | ||
3412 | + "urb: actual_length %d transfer_buffer null\n", | ||
3413 | + urb->actual_length); | ||
3414 | + return -1; | ||
3415 | + } | ||
3416 | + | ||
3417 | if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) | ||
3418 | iovnum = 2 + urb->number_of_packets; | ||
3419 | else | ||
3420 | diff --git a/drivers/video/fbdev/au1200fb.c b/drivers/video/fbdev/au1200fb.c | ||
3421 | index 6c2b2ca4a909..44c2be15a08b 100644 | ||
3422 | --- a/drivers/video/fbdev/au1200fb.c | ||
3423 | +++ b/drivers/video/fbdev/au1200fb.c | ||
3424 | @@ -1681,8 +1681,10 @@ static int au1200fb_drv_probe(struct platform_device *dev) | ||
3425 | |||
3426 | fbi = framebuffer_alloc(sizeof(struct au1200fb_device), | ||
3427 | &dev->dev); | ||
3428 | - if (!fbi) | ||
3429 | + if (!fbi) { | ||
3430 | + ret = -ENOMEM; | ||
3431 | goto failed; | ||
3432 | + } | ||
3433 | |||
3434 | _au1200fb_infos[plane] = fbi; | ||
3435 | fbdev = fbi->par; | ||
3436 | @@ -1700,7 +1702,8 @@ static int au1200fb_drv_probe(struct platform_device *dev) | ||
3437 | if (!fbdev->fb_mem) { | ||
3438 | print_err("fail to allocate frambuffer (size: %dK))", | ||
3439 | fbdev->fb_len / 1024); | ||
3440 | - return -ENOMEM; | ||
3441 | + ret = -ENOMEM; | ||
3442 | + goto failed; | ||
3443 | } | ||
3444 | |||
3445 | /* | ||
3446 | diff --git a/drivers/video/fbdev/controlfb.h b/drivers/video/fbdev/controlfb.h | ||
3447 | index 6026c60fc100..261522fabdac 100644 | ||
3448 | --- a/drivers/video/fbdev/controlfb.h | ||
3449 | +++ b/drivers/video/fbdev/controlfb.h | ||
3450 | @@ -141,5 +141,7 @@ static struct max_cmodes control_mac_modes[] = { | ||
3451 | {{ 1, 2}}, /* 1152x870, 75Hz */ | ||
3452 | {{ 0, 1}}, /* 1280x960, 75Hz */ | ||
3453 | {{ 0, 1}}, /* 1280x1024, 75Hz */ | ||
3454 | + {{ 1, 2}}, /* 1152x768, 60Hz */ | ||
3455 | + {{ 0, 1}}, /* 1600x1024, 60Hz */ | ||
3456 | }; | ||
3457 | |||
3458 | diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c | ||
3459 | index e9c2f7ba3c8e..53326badfb61 100644 | ||
3460 | --- a/drivers/video/fbdev/udlfb.c | ||
3461 | +++ b/drivers/video/fbdev/udlfb.c | ||
3462 | @@ -769,11 +769,11 @@ static int dlfb_get_edid(struct dlfb_data *dev, char *edid, int len) | ||
3463 | |||
3464 | for (i = 0; i < len; i++) { | ||
3465 | ret = usb_control_msg(dev->udev, | ||
3466 | - usb_rcvctrlpipe(dev->udev, 0), (0x02), | ||
3467 | - (0x80 | (0x02 << 5)), i << 8, 0xA1, rbuf, 2, | ||
3468 | - HZ); | ||
3469 | - if (ret < 1) { | ||
3470 | - pr_err("Read EDID byte %d failed err %x\n", i, ret); | ||
3471 | + usb_rcvctrlpipe(dev->udev, 0), 0x02, | ||
3472 | + (0x80 | (0x02 << 5)), i << 8, 0xA1, | ||
3473 | + rbuf, 2, USB_CTRL_GET_TIMEOUT); | ||
3474 | + if (ret < 2) { | ||
3475 | + pr_err("Read EDID byte %d failed: %d\n", i, ret); | ||
3476 | i--; | ||
3477 | break; | ||
3478 | } | ||
3479 | diff --git a/fs/afs/callback.c b/fs/afs/callback.c | ||
3480 | index 1e9d2f84e5b5..1592dc613200 100644 | ||
3481 | --- a/fs/afs/callback.c | ||
3482 | +++ b/fs/afs/callback.c | ||
3483 | @@ -362,7 +362,7 @@ static void afs_callback_updater(struct work_struct *work) | ||
3484 | { | ||
3485 | struct afs_server *server; | ||
3486 | struct afs_vnode *vnode, *xvnode; | ||
3487 | - time_t now; | ||
3488 | + time64_t now; | ||
3489 | long timeout; | ||
3490 | int ret; | ||
3491 | |||
3492 | @@ -370,7 +370,7 @@ static void afs_callback_updater(struct work_struct *work) | ||
3493 | |||
3494 | _enter(""); | ||
3495 | |||
3496 | - now = get_seconds(); | ||
3497 | + now = ktime_get_real_seconds(); | ||
3498 | |||
3499 | /* find the first vnode to update */ | ||
3500 | spin_lock(&server->cb_lock); | ||
3501 | @@ -424,7 +424,8 @@ static void afs_callback_updater(struct work_struct *work) | ||
3502 | |||
3503 | /* and then reschedule */ | ||
3504 | _debug("reschedule"); | ||
3505 | - vnode->update_at = get_seconds() + afs_vnode_update_timeout; | ||
3506 | + vnode->update_at = ktime_get_real_seconds() + | ||
3507 | + afs_vnode_update_timeout; | ||
3508 | |||
3509 | spin_lock(&server->cb_lock); | ||
3510 | |||
3511 | diff --git a/fs/afs/cmservice.c b/fs/afs/cmservice.c | ||
3512 | index 8d2c5180e015..168f2a4d1180 100644 | ||
3513 | --- a/fs/afs/cmservice.c | ||
3514 | +++ b/fs/afs/cmservice.c | ||
3515 | @@ -168,7 +168,6 @@ static int afs_deliver_cb_callback(struct afs_call *call) | ||
3516 | struct afs_callback *cb; | ||
3517 | struct afs_server *server; | ||
3518 | __be32 *bp; | ||
3519 | - u32 tmp; | ||
3520 | int ret, loop; | ||
3521 | |||
3522 | _enter("{%u}", call->unmarshall); | ||
3523 | @@ -230,9 +229,9 @@ static int afs_deliver_cb_callback(struct afs_call *call) | ||
3524 | if (ret < 0) | ||
3525 | return ret; | ||
3526 | |||
3527 | - tmp = ntohl(call->tmp); | ||
3528 | - _debug("CB count: %u", tmp); | ||
3529 | - if (tmp != call->count && tmp != 0) | ||
3530 | + call->count2 = ntohl(call->tmp); | ||
3531 | + _debug("CB count: %u", call->count2); | ||
3532 | + if (call->count2 != call->count && call->count2 != 0) | ||
3533 | return -EBADMSG; | ||
3534 | call->offset = 0; | ||
3535 | call->unmarshall++; | ||
3536 | @@ -240,14 +239,14 @@ static int afs_deliver_cb_callback(struct afs_call *call) | ||
3537 | case 4: | ||
3538 | _debug("extract CB array"); | ||
3539 | ret = afs_extract_data(call, call->buffer, | ||
3540 | - call->count * 3 * 4, false); | ||
3541 | + call->count2 * 3 * 4, false); | ||
3542 | if (ret < 0) | ||
3543 | return ret; | ||
3544 | |||
3545 | _debug("unmarshall CB array"); | ||
3546 | cb = call->request; | ||
3547 | bp = call->buffer; | ||
3548 | - for (loop = call->count; loop > 0; loop--, cb++) { | ||
3549 | + for (loop = call->count2; loop > 0; loop--, cb++) { | ||
3550 | cb->version = ntohl(*bp++); | ||
3551 | cb->expiry = ntohl(*bp++); | ||
3552 | cb->type = ntohl(*bp++); | ||
3553 | diff --git a/fs/afs/file.c b/fs/afs/file.c | ||
3554 | index 6344aee4ac4b..72372970725b 100644 | ||
3555 | --- a/fs/afs/file.c | ||
3556 | +++ b/fs/afs/file.c | ||
3557 | @@ -29,6 +29,7 @@ static int afs_readpages(struct file *filp, struct address_space *mapping, | ||
3558 | |||
3559 | const struct file_operations afs_file_operations = { | ||
3560 | .open = afs_open, | ||
3561 | + .flush = afs_flush, | ||
3562 | .release = afs_release, | ||
3563 | .llseek = generic_file_llseek, | ||
3564 | .read_iter = generic_file_read_iter, | ||
3565 | diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c | ||
3566 | index 31c616ab9b40..88e440607ed7 100644 | ||
3567 | --- a/fs/afs/fsclient.c | ||
3568 | +++ b/fs/afs/fsclient.c | ||
3569 | @@ -105,7 +105,7 @@ static void xdr_decode_AFSFetchStatus(const __be32 **_bp, | ||
3570 | vnode->vfs_inode.i_mode = mode; | ||
3571 | } | ||
3572 | |||
3573 | - vnode->vfs_inode.i_ctime.tv_sec = status->mtime_server; | ||
3574 | + vnode->vfs_inode.i_ctime.tv_sec = status->mtime_client; | ||
3575 | vnode->vfs_inode.i_mtime = vnode->vfs_inode.i_ctime; | ||
3576 | vnode->vfs_inode.i_atime = vnode->vfs_inode.i_ctime; | ||
3577 | vnode->vfs_inode.i_version = data_version; | ||
3578 | @@ -139,7 +139,7 @@ static void xdr_decode_AFSCallBack(const __be32 **_bp, struct afs_vnode *vnode) | ||
3579 | vnode->cb_version = ntohl(*bp++); | ||
3580 | vnode->cb_expiry = ntohl(*bp++); | ||
3581 | vnode->cb_type = ntohl(*bp++); | ||
3582 | - vnode->cb_expires = vnode->cb_expiry + get_seconds(); | ||
3583 | + vnode->cb_expires = vnode->cb_expiry + ktime_get_real_seconds(); | ||
3584 | *_bp = bp; | ||
3585 | } | ||
3586 | |||
3587 | @@ -676,8 +676,8 @@ int afs_fs_create(struct afs_server *server, | ||
3588 | memset(bp, 0, padsz); | ||
3589 | bp = (void *) bp + padsz; | ||
3590 | } | ||
3591 | - *bp++ = htonl(AFS_SET_MODE); | ||
3592 | - *bp++ = 0; /* mtime */ | ||
3593 | + *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); | ||
3594 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ | ||
3595 | *bp++ = 0; /* owner */ | ||
3596 | *bp++ = 0; /* group */ | ||
3597 | *bp++ = htonl(mode & S_IALLUGO); /* unix mode */ | ||
3598 | @@ -945,8 +945,8 @@ int afs_fs_symlink(struct afs_server *server, | ||
3599 | memset(bp, 0, c_padsz); | ||
3600 | bp = (void *) bp + c_padsz; | ||
3601 | } | ||
3602 | - *bp++ = htonl(AFS_SET_MODE); | ||
3603 | - *bp++ = 0; /* mtime */ | ||
3604 | + *bp++ = htonl(AFS_SET_MODE | AFS_SET_MTIME); | ||
3605 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ | ||
3606 | *bp++ = 0; /* owner */ | ||
3607 | *bp++ = 0; /* group */ | ||
3608 | *bp++ = htonl(S_IRWXUGO); /* unix mode */ | ||
3609 | @@ -1145,8 +1145,8 @@ static int afs_fs_store_data64(struct afs_server *server, | ||
3610 | *bp++ = htonl(vnode->fid.vnode); | ||
3611 | *bp++ = htonl(vnode->fid.unique); | ||
3612 | |||
3613 | - *bp++ = 0; /* mask */ | ||
3614 | - *bp++ = 0; /* mtime */ | ||
3615 | + *bp++ = htonl(AFS_SET_MTIME); /* mask */ | ||
3616 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ | ||
3617 | *bp++ = 0; /* owner */ | ||
3618 | *bp++ = 0; /* group */ | ||
3619 | *bp++ = 0; /* unix mode */ | ||
3620 | @@ -1178,7 +1178,7 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb, | ||
3621 | _enter(",%x,{%x:%u},,", | ||
3622 | key_serial(wb->key), vnode->fid.vid, vnode->fid.vnode); | ||
3623 | |||
3624 | - size = to - offset; | ||
3625 | + size = (loff_t)to - (loff_t)offset; | ||
3626 | if (first != last) | ||
3627 | size += (loff_t)(last - first) << PAGE_SHIFT; | ||
3628 | pos = (loff_t)first << PAGE_SHIFT; | ||
3629 | @@ -1222,8 +1222,8 @@ int afs_fs_store_data(struct afs_server *server, struct afs_writeback *wb, | ||
3630 | *bp++ = htonl(vnode->fid.vnode); | ||
3631 | *bp++ = htonl(vnode->fid.unique); | ||
3632 | |||
3633 | - *bp++ = 0; /* mask */ | ||
3634 | - *bp++ = 0; /* mtime */ | ||
3635 | + *bp++ = htonl(AFS_SET_MTIME); /* mask */ | ||
3636 | + *bp++ = htonl(vnode->vfs_inode.i_mtime.tv_sec); /* mtime */ | ||
3637 | *bp++ = 0; /* owner */ | ||
3638 | *bp++ = 0; /* group */ | ||
3639 | *bp++ = 0; /* unix mode */ | ||
3640 | diff --git a/fs/afs/inode.c b/fs/afs/inode.c | ||
3641 | index 86cc7264c21c..42582e41948f 100644 | ||
3642 | --- a/fs/afs/inode.c | ||
3643 | +++ b/fs/afs/inode.c | ||
3644 | @@ -70,9 +70,9 @@ static int afs_inode_map_status(struct afs_vnode *vnode, struct key *key) | ||
3645 | |||
3646 | set_nlink(inode, vnode->status.nlink); | ||
3647 | inode->i_uid = vnode->status.owner; | ||
3648 | - inode->i_gid = GLOBAL_ROOT_GID; | ||
3649 | + inode->i_gid = vnode->status.group; | ||
3650 | inode->i_size = vnode->status.size; | ||
3651 | - inode->i_ctime.tv_sec = vnode->status.mtime_server; | ||
3652 | + inode->i_ctime.tv_sec = vnode->status.mtime_client; | ||
3653 | inode->i_ctime.tv_nsec = 0; | ||
3654 | inode->i_atime = inode->i_mtime = inode->i_ctime; | ||
3655 | inode->i_blocks = 0; | ||
3656 | @@ -245,12 +245,13 @@ struct inode *afs_iget(struct super_block *sb, struct key *key, | ||
3657 | vnode->cb_version = 0; | ||
3658 | vnode->cb_expiry = 0; | ||
3659 | vnode->cb_type = 0; | ||
3660 | - vnode->cb_expires = get_seconds(); | ||
3661 | + vnode->cb_expires = ktime_get_real_seconds(); | ||
3662 | } else { | ||
3663 | vnode->cb_version = cb->version; | ||
3664 | vnode->cb_expiry = cb->expiry; | ||
3665 | vnode->cb_type = cb->type; | ||
3666 | - vnode->cb_expires = vnode->cb_expiry + get_seconds(); | ||
3667 | + vnode->cb_expires = vnode->cb_expiry + | ||
3668 | + ktime_get_real_seconds(); | ||
3669 | } | ||
3670 | } | ||
3671 | |||
3672 | @@ -323,7 +324,7 @@ int afs_validate(struct afs_vnode *vnode, struct key *key) | ||
3673 | !test_bit(AFS_VNODE_CB_BROKEN, &vnode->flags) && | ||
3674 | !test_bit(AFS_VNODE_MODIFIED, &vnode->flags) && | ||
3675 | !test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) { | ||
3676 | - if (vnode->cb_expires < get_seconds() + 10) { | ||
3677 | + if (vnode->cb_expires < ktime_get_real_seconds() + 10) { | ||
3678 | _debug("callback expired"); | ||
3679 | set_bit(AFS_VNODE_CB_BROKEN, &vnode->flags); | ||
3680 | } else { | ||
3681 | diff --git a/fs/afs/internal.h b/fs/afs/internal.h | ||
3682 | index 535a38d2c1d0..dd98dcda6a3f 100644 | ||
3683 | --- a/fs/afs/internal.h | ||
3684 | +++ b/fs/afs/internal.h | ||
3685 | @@ -11,6 +11,7 @@ | ||
3686 | |||
3687 | #include <linux/compiler.h> | ||
3688 | #include <linux/kernel.h> | ||
3689 | +#include <linux/ktime.h> | ||
3690 | #include <linux/fs.h> | ||
3691 | #include <linux/pagemap.h> | ||
3692 | #include <linux/rxrpc.h> | ||
3693 | @@ -105,7 +106,10 @@ struct afs_call { | ||
3694 | unsigned request_size; /* size of request data */ | ||
3695 | unsigned reply_max; /* maximum size of reply */ | ||
3696 | unsigned first_offset; /* offset into mapping[first] */ | ||
3697 | - unsigned last_to; /* amount of mapping[last] */ | ||
3698 | + union { | ||
3699 | + unsigned last_to; /* amount of mapping[last] */ | ||
3700 | + unsigned count2; /* count used in unmarshalling */ | ||
3701 | + }; | ||
3702 | unsigned char unmarshall; /* unmarshalling phase */ | ||
3703 | bool incoming; /* T if incoming call */ | ||
3704 | bool send_pages; /* T if data from mapping should be sent */ | ||
3705 | @@ -242,7 +246,7 @@ struct afs_cache_vhash { | ||
3706 | */ | ||
3707 | struct afs_vlocation { | ||
3708 | atomic_t usage; | ||
3709 | - time_t time_of_death; /* time at which put reduced usage to 0 */ | ||
3710 | + time64_t time_of_death; /* time at which put reduced usage to 0 */ | ||
3711 | struct list_head link; /* link in cell volume location list */ | ||
3712 | struct list_head grave; /* link in master graveyard list */ | ||
3713 | struct list_head update; /* link in master update list */ | ||
3714 | @@ -253,7 +257,7 @@ struct afs_vlocation { | ||
3715 | struct afs_cache_vlocation vldb; /* volume information DB record */ | ||
3716 | struct afs_volume *vols[3]; /* volume access record pointer (index by type) */ | ||
3717 | wait_queue_head_t waitq; /* status change waitqueue */ | ||
3718 | - time_t update_at; /* time at which record should be updated */ | ||
3719 | + time64_t update_at; /* time at which record should be updated */ | ||
3720 | spinlock_t lock; /* access lock */ | ||
3721 | afs_vlocation_state_t state; /* volume location state */ | ||
3722 | unsigned short upd_rej_cnt; /* ENOMEDIUM count during update */ | ||
3723 | @@ -266,7 +270,7 @@ struct afs_vlocation { | ||
3724 | */ | ||
3725 | struct afs_server { | ||
3726 | atomic_t usage; | ||
3727 | - time_t time_of_death; /* time at which put reduced usage to 0 */ | ||
3728 | + time64_t time_of_death; /* time at which put reduced usage to 0 */ | ||
3729 | struct in_addr addr; /* server address */ | ||
3730 | struct afs_cell *cell; /* cell in which server resides */ | ||
3731 | struct list_head link; /* link in cell's server list */ | ||
3732 | @@ -369,8 +373,8 @@ struct afs_vnode { | ||
3733 | struct rb_node server_rb; /* link in server->fs_vnodes */ | ||
3734 | struct rb_node cb_promise; /* link in server->cb_promises */ | ||
3735 | struct work_struct cb_broken_work; /* work to be done on callback break */ | ||
3736 | - time_t cb_expires; /* time at which callback expires */ | ||
3737 | - time_t cb_expires_at; /* time used to order cb_promise */ | ||
3738 | + time64_t cb_expires; /* time at which callback expires */ | ||
3739 | + time64_t cb_expires_at; /* time used to order cb_promise */ | ||
3740 | unsigned cb_version; /* callback version */ | ||
3741 | unsigned cb_expiry; /* callback expiry time */ | ||
3742 | afs_callback_type_t cb_type; /* type of callback */ | ||
3743 | @@ -749,6 +753,7 @@ extern int afs_writepages(struct address_space *, struct writeback_control *); | ||
3744 | extern void afs_pages_written_back(struct afs_vnode *, struct afs_call *); | ||
3745 | extern ssize_t afs_file_write(struct kiocb *, struct iov_iter *); | ||
3746 | extern int afs_writeback_all(struct afs_vnode *); | ||
3747 | +extern int afs_flush(struct file *, fl_owner_t); | ||
3748 | extern int afs_fsync(struct file *, loff_t, loff_t, int); | ||
3749 | |||
3750 | |||
3751 | diff --git a/fs/afs/misc.c b/fs/afs/misc.c | ||
3752 | index 91ea1aa0d8b3..100b207efc9e 100644 | ||
3753 | --- a/fs/afs/misc.c | ||
3754 | +++ b/fs/afs/misc.c | ||
3755 | @@ -84,6 +84,8 @@ int afs_abort_to_error(u32 abort_code) | ||
3756 | case RXKADDATALEN: return -EKEYREJECTED; | ||
3757 | case RXKADILLEGALLEVEL: return -EKEYREJECTED; | ||
3758 | |||
3759 | + case RXGEN_OPCODE: return -ENOTSUPP; | ||
3760 | + | ||
3761 | default: return -EREMOTEIO; | ||
3762 | } | ||
3763 | } | ||
3764 | diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c | ||
3765 | index 25f05a8d21b1..523b1d3ca2c6 100644 | ||
3766 | --- a/fs/afs/rxrpc.c | ||
3767 | +++ b/fs/afs/rxrpc.c | ||
3768 | @@ -321,6 +321,8 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, | ||
3769 | struct rxrpc_call *rxcall; | ||
3770 | struct msghdr msg; | ||
3771 | struct kvec iov[1]; | ||
3772 | + size_t offset; | ||
3773 | + u32 abort_code; | ||
3774 | int ret; | ||
3775 | |||
3776 | _enter("%x,{%d},", addr->s_addr, ntohs(call->port)); | ||
3777 | @@ -368,9 +370,11 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, | ||
3778 | msg.msg_controllen = 0; | ||
3779 | msg.msg_flags = (call->send_pages ? MSG_MORE : 0); | ||
3780 | |||
3781 | - /* have to change the state *before* sending the last packet as RxRPC | ||
3782 | - * might give us the reply before it returns from sending the | ||
3783 | - * request */ | ||
3784 | + /* We have to change the state *before* sending the last packet as | ||
3785 | + * rxrpc might give us the reply before it returns from sending the | ||
3786 | + * request. Further, if the send fails, we may already have been given | ||
3787 | + * a notification and may have collected it. | ||
3788 | + */ | ||
3789 | if (!call->send_pages) | ||
3790 | call->state = AFS_CALL_AWAIT_REPLY; | ||
3791 | ret = rxrpc_kernel_send_data(afs_socket, rxcall, | ||
3792 | @@ -389,7 +393,17 @@ int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, | ||
3793 | return wait_mode->wait(call); | ||
3794 | |||
3795 | error_do_abort: | ||
3796 | - rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT, -ret, "KSD"); | ||
3797 | + call->state = AFS_CALL_COMPLETE; | ||
3798 | + if (ret != -ECONNABORTED) { | ||
3799 | + rxrpc_kernel_abort_call(afs_socket, rxcall, RX_USER_ABORT, | ||
3800 | + -ret, "KSD"); | ||
3801 | + } else { | ||
3802 | + abort_code = 0; | ||
3803 | + offset = 0; | ||
3804 | + rxrpc_kernel_recv_data(afs_socket, rxcall, NULL, 0, &offset, | ||
3805 | + false, &abort_code); | ||
3806 | + ret = call->type->abort_to_error(abort_code); | ||
3807 | + } | ||
3808 | error_kill_call: | ||
3809 | afs_end_call(call); | ||
3810 | _leave(" = %d", ret); | ||
3811 | @@ -434,16 +448,18 @@ static void afs_deliver_to_call(struct afs_call *call) | ||
3812 | case -EINPROGRESS: | ||
3813 | case -EAGAIN: | ||
3814 | goto out; | ||
3815 | + case -ECONNABORTED: | ||
3816 | + goto call_complete; | ||
3817 | case -ENOTCONN: | ||
3818 | abort_code = RX_CALL_DEAD; | ||
3819 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, | ||
3820 | abort_code, -ret, "KNC"); | ||
3821 | - goto do_abort; | ||
3822 | + goto save_error; | ||
3823 | case -ENOTSUPP: | ||
3824 | - abort_code = RX_INVALID_OPERATION; | ||
3825 | + abort_code = RXGEN_OPCODE; | ||
3826 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, | ||
3827 | abort_code, -ret, "KIV"); | ||
3828 | - goto do_abort; | ||
3829 | + goto save_error; | ||
3830 | case -ENODATA: | ||
3831 | case -EBADMSG: | ||
3832 | case -EMSGSIZE: | ||
3833 | @@ -453,7 +469,7 @@ static void afs_deliver_to_call(struct afs_call *call) | ||
3834 | abort_code = RXGEN_SS_UNMARSHAL; | ||
3835 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, | ||
3836 | abort_code, EBADMSG, "KUM"); | ||
3837 | - goto do_abort; | ||
3838 | + goto save_error; | ||
3839 | } | ||
3840 | } | ||
3841 | |||
3842 | @@ -464,8 +480,9 @@ static void afs_deliver_to_call(struct afs_call *call) | ||
3843 | _leave(""); | ||
3844 | return; | ||
3845 | |||
3846 | -do_abort: | ||
3847 | +save_error: | ||
3848 | call->error = ret; | ||
3849 | +call_complete: | ||
3850 | call->state = AFS_CALL_COMPLETE; | ||
3851 | goto done; | ||
3852 | } | ||
3853 | @@ -475,7 +492,6 @@ static void afs_deliver_to_call(struct afs_call *call) | ||
3854 | */ | ||
3855 | static int afs_wait_for_call_to_complete(struct afs_call *call) | ||
3856 | { | ||
3857 | - const char *abort_why; | ||
3858 | int ret; | ||
3859 | |||
3860 | DECLARE_WAITQUEUE(myself, current); | ||
3861 | @@ -494,13 +510,8 @@ static int afs_wait_for_call_to_complete(struct afs_call *call) | ||
3862 | continue; | ||
3863 | } | ||
3864 | |||
3865 | - abort_why = "KWC"; | ||
3866 | - ret = call->error; | ||
3867 | - if (call->state == AFS_CALL_COMPLETE) | ||
3868 | - break; | ||
3869 | - abort_why = "KWI"; | ||
3870 | - ret = -EINTR; | ||
3871 | - if (signal_pending(current)) | ||
3872 | + if (call->state == AFS_CALL_COMPLETE || | ||
3873 | + signal_pending(current)) | ||
3874 | break; | ||
3875 | schedule(); | ||
3876 | } | ||
3877 | @@ -508,13 +519,14 @@ static int afs_wait_for_call_to_complete(struct afs_call *call) | ||
3878 | remove_wait_queue(&call->waitq, &myself); | ||
3879 | __set_current_state(TASK_RUNNING); | ||
3880 | |||
3881 | - /* kill the call */ | ||
3882 | + /* Kill off the call if it's still live. */ | ||
3883 | if (call->state < AFS_CALL_COMPLETE) { | ||
3884 | - _debug("call incomplete"); | ||
3885 | + _debug("call interrupted"); | ||
3886 | rxrpc_kernel_abort_call(afs_socket, call->rxcall, | ||
3887 | - RX_CALL_DEAD, -ret, abort_why); | ||
3888 | + RX_USER_ABORT, -EINTR, "KWI"); | ||
3889 | } | ||
3890 | |||
3891 | + ret = call->error; | ||
3892 | _debug("call complete"); | ||
3893 | afs_end_call(call); | ||
3894 | _leave(" = %d", ret); | ||
3895 | diff --git a/fs/afs/security.c b/fs/afs/security.c | ||
3896 | index 8d010422dc89..bfa9d3428383 100644 | ||
3897 | --- a/fs/afs/security.c | ||
3898 | +++ b/fs/afs/security.c | ||
3899 | @@ -340,17 +340,22 @@ int afs_permission(struct inode *inode, int mask) | ||
3900 | } else { | ||
3901 | if (!(access & AFS_ACE_LOOKUP)) | ||
3902 | goto permission_denied; | ||
3903 | + if ((mask & MAY_EXEC) && !(inode->i_mode & S_IXUSR)) | ||
3904 | + goto permission_denied; | ||
3905 | if (mask & (MAY_EXEC | MAY_READ)) { | ||
3906 | if (!(access & AFS_ACE_READ)) | ||
3907 | goto permission_denied; | ||
3908 | + if (!(inode->i_mode & S_IRUSR)) | ||
3909 | + goto permission_denied; | ||
3910 | } else if (mask & MAY_WRITE) { | ||
3911 | if (!(access & AFS_ACE_WRITE)) | ||
3912 | goto permission_denied; | ||
3913 | + if (!(inode->i_mode & S_IWUSR)) | ||
3914 | + goto permission_denied; | ||
3915 | } | ||
3916 | } | ||
3917 | |||
3918 | key_put(key); | ||
3919 | - ret = generic_permission(inode, mask); | ||
3920 | _leave(" = %d", ret); | ||
3921 | return ret; | ||
3922 | |||
3923 | diff --git a/fs/afs/server.c b/fs/afs/server.c | ||
3924 | index d4066ab7dd55..c001b1f2455f 100644 | ||
3925 | --- a/fs/afs/server.c | ||
3926 | +++ b/fs/afs/server.c | ||
3927 | @@ -242,7 +242,7 @@ void afs_put_server(struct afs_server *server) | ||
3928 | spin_lock(&afs_server_graveyard_lock); | ||
3929 | if (atomic_read(&server->usage) == 0) { | ||
3930 | list_move_tail(&server->grave, &afs_server_graveyard); | ||
3931 | - server->time_of_death = get_seconds(); | ||
3932 | + server->time_of_death = ktime_get_real_seconds(); | ||
3933 | queue_delayed_work(afs_wq, &afs_server_reaper, | ||
3934 | afs_server_timeout * HZ); | ||
3935 | } | ||
3936 | @@ -277,9 +277,9 @@ static void afs_reap_server(struct work_struct *work) | ||
3937 | LIST_HEAD(corpses); | ||
3938 | struct afs_server *server; | ||
3939 | unsigned long delay, expiry; | ||
3940 | - time_t now; | ||
3941 | + time64_t now; | ||
3942 | |||
3943 | - now = get_seconds(); | ||
3944 | + now = ktime_get_real_seconds(); | ||
3945 | spin_lock(&afs_server_graveyard_lock); | ||
3946 | |||
3947 | while (!list_empty(&afs_server_graveyard)) { | ||
3948 | diff --git a/fs/afs/vlocation.c b/fs/afs/vlocation.c | ||
3949 | index 45a86396fd2d..92bd5553b8c9 100644 | ||
3950 | --- a/fs/afs/vlocation.c | ||
3951 | +++ b/fs/afs/vlocation.c | ||
3952 | @@ -340,7 +340,8 @@ static void afs_vlocation_queue_for_updates(struct afs_vlocation *vl) | ||
3953 | struct afs_vlocation *xvl; | ||
3954 | |||
3955 | /* wait at least 10 minutes before updating... */ | ||
3956 | - vl->update_at = get_seconds() + afs_vlocation_update_timeout; | ||
3957 | + vl->update_at = ktime_get_real_seconds() + | ||
3958 | + afs_vlocation_update_timeout; | ||
3959 | |||
3960 | spin_lock(&afs_vlocation_updates_lock); | ||
3961 | |||
3962 | @@ -506,7 +507,7 @@ void afs_put_vlocation(struct afs_vlocation *vl) | ||
3963 | if (atomic_read(&vl->usage) == 0) { | ||
3964 | _debug("buried"); | ||
3965 | list_move_tail(&vl->grave, &afs_vlocation_graveyard); | ||
3966 | - vl->time_of_death = get_seconds(); | ||
3967 | + vl->time_of_death = ktime_get_real_seconds(); | ||
3968 | queue_delayed_work(afs_wq, &afs_vlocation_reap, | ||
3969 | afs_vlocation_timeout * HZ); | ||
3970 | |||
3971 | @@ -543,11 +544,11 @@ static void afs_vlocation_reaper(struct work_struct *work) | ||
3972 | LIST_HEAD(corpses); | ||
3973 | struct afs_vlocation *vl; | ||
3974 | unsigned long delay, expiry; | ||
3975 | - time_t now; | ||
3976 | + time64_t now; | ||
3977 | |||
3978 | _enter(""); | ||
3979 | |||
3980 | - now = get_seconds(); | ||
3981 | + now = ktime_get_real_seconds(); | ||
3982 | spin_lock(&afs_vlocation_graveyard_lock); | ||
3983 | |||
3984 | while (!list_empty(&afs_vlocation_graveyard)) { | ||
3985 | @@ -622,13 +623,13 @@ static void afs_vlocation_updater(struct work_struct *work) | ||
3986 | { | ||
3987 | struct afs_cache_vlocation vldb; | ||
3988 | struct afs_vlocation *vl, *xvl; | ||
3989 | - time_t now; | ||
3990 | + time64_t now; | ||
3991 | long timeout; | ||
3992 | int ret; | ||
3993 | |||
3994 | _enter(""); | ||
3995 | |||
3996 | - now = get_seconds(); | ||
3997 | + now = ktime_get_real_seconds(); | ||
3998 | |||
3999 | /* find a record to update */ | ||
4000 | spin_lock(&afs_vlocation_updates_lock); | ||
4001 | @@ -684,7 +685,8 @@ static void afs_vlocation_updater(struct work_struct *work) | ||
4002 | |||
4003 | /* and then reschedule */ | ||
4004 | _debug("reschedule"); | ||
4005 | - vl->update_at = get_seconds() + afs_vlocation_update_timeout; | ||
4006 | + vl->update_at = ktime_get_real_seconds() + | ||
4007 | + afs_vlocation_update_timeout; | ||
4008 | |||
4009 | spin_lock(&afs_vlocation_updates_lock); | ||
4010 | |||
4011 | diff --git a/fs/afs/write.c b/fs/afs/write.c | ||
4012 | index f865c3f05bea..3fba2b573c86 100644 | ||
4013 | --- a/fs/afs/write.c | ||
4014 | +++ b/fs/afs/write.c | ||
4015 | @@ -148,12 +148,12 @@ int afs_write_begin(struct file *file, struct address_space *mapping, | ||
4016 | kfree(candidate); | ||
4017 | return -ENOMEM; | ||
4018 | } | ||
4019 | - *pagep = page; | ||
4020 | - /* page won't leak in error case: it eventually gets cleaned off LRU */ | ||
4021 | |||
4022 | if (!PageUptodate(page) && len != PAGE_SIZE) { | ||
4023 | ret = afs_fill_page(vnode, key, index << PAGE_SHIFT, page); | ||
4024 | if (ret < 0) { | ||
4025 | + unlock_page(page); | ||
4026 | + put_page(page); | ||
4027 | kfree(candidate); | ||
4028 | _leave(" = %d [prep]", ret); | ||
4029 | return ret; | ||
4030 | @@ -161,6 +161,9 @@ int afs_write_begin(struct file *file, struct address_space *mapping, | ||
4031 | SetPageUptodate(page); | ||
4032 | } | ||
4033 | |||
4034 | + /* page won't leak in error case: it eventually gets cleaned off LRU */ | ||
4035 | + *pagep = page; | ||
4036 | + | ||
4037 | try_again: | ||
4038 | spin_lock(&vnode->writeback_lock); | ||
4039 | |||
4040 | @@ -296,10 +299,14 @@ static void afs_kill_pages(struct afs_vnode *vnode, bool error, | ||
4041 | ASSERTCMP(pv.nr, ==, count); | ||
4042 | |||
4043 | for (loop = 0; loop < count; loop++) { | ||
4044 | - ClearPageUptodate(pv.pages[loop]); | ||
4045 | + struct page *page = pv.pages[loop]; | ||
4046 | + ClearPageUptodate(page); | ||
4047 | if (error) | ||
4048 | - SetPageError(pv.pages[loop]); | ||
4049 | - end_page_writeback(pv.pages[loop]); | ||
4050 | + SetPageError(page); | ||
4051 | + if (PageWriteback(page)) | ||
4052 | + end_page_writeback(page); | ||
4053 | + if (page->index >= first) | ||
4054 | + first = page->index + 1; | ||
4055 | } | ||
4056 | |||
4057 | __pagevec_release(&pv); | ||
4058 | @@ -502,6 +509,7 @@ static int afs_writepages_region(struct address_space *mapping, | ||
4059 | |||
4060 | if (PageWriteback(page) || !PageDirty(page)) { | ||
4061 | unlock_page(page); | ||
4062 | + put_page(page); | ||
4063 | continue; | ||
4064 | } | ||
4065 | |||
4066 | @@ -734,6 +742,20 @@ int afs_fsync(struct file *file, loff_t start, loff_t end, int datasync) | ||
4067 | return ret; | ||
4068 | } | ||
4069 | |||
4070 | +/* | ||
4071 | + * Flush out all outstanding writes on a file opened for writing when it is | ||
4072 | + * closed. | ||
4073 | + */ | ||
4074 | +int afs_flush(struct file *file, fl_owner_t id) | ||
4075 | +{ | ||
4076 | + _enter(""); | ||
4077 | + | ||
4078 | + if ((file->f_mode & FMODE_WRITE) == 0) | ||
4079 | + return 0; | ||
4080 | + | ||
4081 | + return vfs_fsync(file, 0); | ||
4082 | +} | ||
4083 | + | ||
4084 | /* | ||
4085 | * notification that a previously read-only page is about to become writable | ||
4086 | * - if it returns an error, the caller will deliver a bus error signal | ||
4087 | diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c | ||
4088 | index 4c71dba90120..0ea31a53fd5b 100644 | ||
4089 | --- a/fs/autofs4/waitq.c | ||
4090 | +++ b/fs/autofs4/waitq.c | ||
4091 | @@ -176,7 +176,6 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, | ||
4092 | |||
4093 | mutex_unlock(&sbi->wq_mutex); | ||
4094 | |||
4095 | - if (autofs4_write(sbi, pipe, &pkt, pktsz)) | ||
4096 | switch (ret = autofs4_write(sbi, pipe, &pkt, pktsz)) { | ||
4097 | case 0: | ||
4098 | break; | ||
4099 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
4100 | index f089d7d8afe7..894d56361ea9 100644 | ||
4101 | --- a/fs/btrfs/inode.c | ||
4102 | +++ b/fs/btrfs/inode.c | ||
4103 | @@ -6812,6 +6812,20 @@ static noinline int uncompress_inline(struct btrfs_path *path, | ||
4104 | max_size = min_t(unsigned long, PAGE_SIZE, max_size); | ||
4105 | ret = btrfs_decompress(compress_type, tmp, page, | ||
4106 | extent_offset, inline_size, max_size); | ||
4107 | + | ||
4108 | + /* | ||
4109 | + * decompression code contains a memset to fill in any space between the end | ||
4110 | + * of the uncompressed data and the end of max_size in case the decompressed | ||
4111 | + * data ends up shorter than ram_bytes. That doesn't cover the hole between | ||
4112 | + * the end of an inline extent and the beginning of the next block, so we | ||
4113 | + * cover that region here. | ||
4114 | + */ | ||
4115 | + | ||
4116 | + if (max_size + pg_offset < PAGE_SIZE) { | ||
4117 | + char *map = kmap(page); | ||
4118 | + memset(map + pg_offset + max_size, 0, PAGE_SIZE - max_size - pg_offset); | ||
4119 | + kunmap(page); | ||
4120 | + } | ||
4121 | kfree(tmp); | ||
4122 | return ret; | ||
4123 | } | ||
4124 | diff --git a/fs/btrfs/tests/free-space-tree-tests.c b/fs/btrfs/tests/free-space-tree-tests.c | ||
4125 | index 6e144048a72e..a724d9a79bd2 100644 | ||
4126 | --- a/fs/btrfs/tests/free-space-tree-tests.c | ||
4127 | +++ b/fs/btrfs/tests/free-space-tree-tests.c | ||
4128 | @@ -501,7 +501,8 @@ static int run_test(test_func_t test_func, int bitmaps, u32 sectorsize, | ||
4129 | path = btrfs_alloc_path(); | ||
4130 | if (!path) { | ||
4131 | test_msg("Couldn't allocate path\n"); | ||
4132 | - return -ENOMEM; | ||
4133 | + ret = -ENOMEM; | ||
4134 | + goto out; | ||
4135 | } | ||
4136 | |||
4137 | ret = add_block_group_free_space(&trans, root->fs_info, cache); | ||
4138 | diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c | ||
4139 | index c0f52c443c34..3d2639c30018 100644 | ||
4140 | --- a/fs/ceph/mds_client.c | ||
4141 | +++ b/fs/ceph/mds_client.c | ||
4142 | @@ -1396,6 +1396,29 @@ static int __close_session(struct ceph_mds_client *mdsc, | ||
4143 | return request_close_session(mdsc, session); | ||
4144 | } | ||
4145 | |||
4146 | +static bool drop_negative_children(struct dentry *dentry) | ||
4147 | +{ | ||
4148 | + struct dentry *child; | ||
4149 | + bool all_negative = true; | ||
4150 | + | ||
4151 | + if (!d_is_dir(dentry)) | ||
4152 | + goto out; | ||
4153 | + | ||
4154 | + spin_lock(&dentry->d_lock); | ||
4155 | + list_for_each_entry(child, &dentry->d_subdirs, d_child) { | ||
4156 | + if (d_really_is_positive(child)) { | ||
4157 | + all_negative = false; | ||
4158 | + break; | ||
4159 | + } | ||
4160 | + } | ||
4161 | + spin_unlock(&dentry->d_lock); | ||
4162 | + | ||
4163 | + if (all_negative) | ||
4164 | + shrink_dcache_parent(dentry); | ||
4165 | +out: | ||
4166 | + return all_negative; | ||
4167 | +} | ||
4168 | + | ||
4169 | /* | ||
4170 | * Trim old(er) caps. | ||
4171 | * | ||
4172 | @@ -1441,16 +1464,27 @@ static int trim_caps_cb(struct inode *inode, struct ceph_cap *cap, void *arg) | ||
4173 | if ((used | wanted) & ~oissued & mine) | ||
4174 | goto out; /* we need these caps */ | ||
4175 | |||
4176 | - session->s_trim_caps--; | ||
4177 | if (oissued) { | ||
4178 | /* we aren't the only cap.. just remove us */ | ||
4179 | __ceph_remove_cap(cap, true); | ||
4180 | + session->s_trim_caps--; | ||
4181 | } else { | ||
4182 | + struct dentry *dentry; | ||
4183 | /* try dropping referring dentries */ | ||
4184 | spin_unlock(&ci->i_ceph_lock); | ||
4185 | - d_prune_aliases(inode); | ||
4186 | - dout("trim_caps_cb %p cap %p pruned, count now %d\n", | ||
4187 | - inode, cap, atomic_read(&inode->i_count)); | ||
4188 | + dentry = d_find_any_alias(inode); | ||
4189 | + if (dentry && drop_negative_children(dentry)) { | ||
4190 | + int count; | ||
4191 | + dput(dentry); | ||
4192 | + d_prune_aliases(inode); | ||
4193 | + count = atomic_read(&inode->i_count); | ||
4194 | + if (count == 1) | ||
4195 | + session->s_trim_caps--; | ||
4196 | + dout("trim_caps_cb %p cap %p pruned, count now %d\n", | ||
4197 | + inode, cap, count); | ||
4198 | + } else { | ||
4199 | + dput(dentry); | ||
4200 | + } | ||
4201 | return 0; | ||
4202 | } | ||
4203 | |||
4204 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
4205 | index a77cbc5b657b..1a0c57100f28 100644 | ||
4206 | --- a/fs/ext4/extents.c | ||
4207 | +++ b/fs/ext4/extents.c | ||
4208 | @@ -4731,6 +4731,7 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset, | ||
4209 | EXT4_INODE_EOFBLOCKS); | ||
4210 | } | ||
4211 | ext4_mark_inode_dirty(handle, inode); | ||
4212 | + ext4_update_inode_fsync_trans(handle, inode, 1); | ||
4213 | ret2 = ext4_journal_stop(handle); | ||
4214 | if (ret2) | ||
4215 | break; | ||
4216 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
4217 | index 4438b93f6fd6..b1766a67d2eb 100644 | ||
4218 | --- a/fs/ext4/namei.c | ||
4219 | +++ b/fs/ext4/namei.c | ||
4220 | @@ -1417,6 +1417,10 @@ static struct buffer_head * ext4_find_entry (struct inode *dir, | ||
4221 | "falling back\n")); | ||
4222 | } | ||
4223 | nblocks = dir->i_size >> EXT4_BLOCK_SIZE_BITS(sb); | ||
4224 | + if (!nblocks) { | ||
4225 | + ret = NULL; | ||
4226 | + goto cleanup_and_exit; | ||
4227 | + } | ||
4228 | start = EXT4_I(dir)->i_dir_start_lookup; | ||
4229 | if (start >= nblocks) | ||
4230 | start = 0; | ||
4231 | diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c | ||
4232 | index 05713a5da083..0703a1179847 100644 | ||
4233 | --- a/fs/fs-writeback.c | ||
4234 | +++ b/fs/fs-writeback.c | ||
4235 | @@ -173,19 +173,33 @@ static void wb_wakeup(struct bdi_writeback *wb) | ||
4236 | spin_unlock_bh(&wb->work_lock); | ||
4237 | } | ||
4238 | |||
4239 | +static void finish_writeback_work(struct bdi_writeback *wb, | ||
4240 | + struct wb_writeback_work *work) | ||
4241 | +{ | ||
4242 | + struct wb_completion *done = work->done; | ||
4243 | + | ||
4244 | + if (work->auto_free) | ||
4245 | + kfree(work); | ||
4246 | + if (done && atomic_dec_and_test(&done->cnt)) | ||
4247 | + wake_up_all(&wb->bdi->wb_waitq); | ||
4248 | +} | ||
4249 | + | ||
4250 | static void wb_queue_work(struct bdi_writeback *wb, | ||
4251 | struct wb_writeback_work *work) | ||
4252 | { | ||
4253 | trace_writeback_queue(wb, work); | ||
4254 | |||
4255 | - spin_lock_bh(&wb->work_lock); | ||
4256 | - if (!test_bit(WB_registered, &wb->state)) | ||
4257 | - goto out_unlock; | ||
4258 | if (work->done) | ||
4259 | atomic_inc(&work->done->cnt); | ||
4260 | - list_add_tail(&work->list, &wb->work_list); | ||
4261 | - mod_delayed_work(bdi_wq, &wb->dwork, 0); | ||
4262 | -out_unlock: | ||
4263 | + | ||
4264 | + spin_lock_bh(&wb->work_lock); | ||
4265 | + | ||
4266 | + if (test_bit(WB_registered, &wb->state)) { | ||
4267 | + list_add_tail(&work->list, &wb->work_list); | ||
4268 | + mod_delayed_work(bdi_wq, &wb->dwork, 0); | ||
4269 | + } else | ||
4270 | + finish_writeback_work(wb, work); | ||
4271 | + | ||
4272 | spin_unlock_bh(&wb->work_lock); | ||
4273 | } | ||
4274 | |||
4275 | @@ -1875,16 +1889,9 @@ static long wb_do_writeback(struct bdi_writeback *wb) | ||
4276 | |||
4277 | set_bit(WB_writeback_running, &wb->state); | ||
4278 | while ((work = get_next_work_item(wb)) != NULL) { | ||
4279 | - struct wb_completion *done = work->done; | ||
4280 | - | ||
4281 | trace_writeback_exec(wb, work); | ||
4282 | - | ||
4283 | wrote += wb_writeback(wb, work); | ||
4284 | - | ||
4285 | - if (work->auto_free) | ||
4286 | - kfree(work); | ||
4287 | - if (done && atomic_dec_and_test(&done->cnt)) | ||
4288 | - wake_up_all(&wb->bdi->wb_waitq); | ||
4289 | + finish_writeback_work(wb, work); | ||
4290 | } | ||
4291 | |||
4292 | /* | ||
4293 | diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c | ||
4294 | index e23ff70b3435..39c382f16272 100644 | ||
4295 | --- a/fs/gfs2/file.c | ||
4296 | +++ b/fs/gfs2/file.c | ||
4297 | @@ -256,7 +256,7 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask) | ||
4298 | goto out; | ||
4299 | } | ||
4300 | if ((flags ^ new_flags) & GFS2_DIF_JDATA) { | ||
4301 | - if (flags & GFS2_DIF_JDATA) | ||
4302 | + if (new_flags & GFS2_DIF_JDATA) | ||
4303 | gfs2_log_flush(sdp, ip->i_gl, NORMAL_FLUSH); | ||
4304 | error = filemap_fdatawrite(inode->i_mapping); | ||
4305 | if (error) | ||
4306 | @@ -264,6 +264,8 @@ static int do_gfs2_set_flags(struct file *filp, u32 reqflags, u32 mask) | ||
4307 | error = filemap_fdatawait(inode->i_mapping); | ||
4308 | if (error) | ||
4309 | goto out; | ||
4310 | + if (new_flags & GFS2_DIF_JDATA) | ||
4311 | + gfs2_ordered_del_inode(ip); | ||
4312 | } | ||
4313 | error = gfs2_trans_begin(sdp, RES_DINODE, 0); | ||
4314 | if (error) | ||
4315 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c | ||
4316 | index 074ac7131459..f6b0848cc831 100644 | ||
4317 | --- a/fs/nfs/nfs4client.c | ||
4318 | +++ b/fs/nfs/nfs4client.c | ||
4319 | @@ -1004,9 +1004,9 @@ static void nfs4_session_set_rwsize(struct nfs_server *server) | ||
4320 | server_resp_sz = sess->fc_attrs.max_resp_sz - nfs41_maxread_overhead; | ||
4321 | server_rqst_sz = sess->fc_attrs.max_rqst_sz - nfs41_maxwrite_overhead; | ||
4322 | |||
4323 | - if (server->rsize > server_resp_sz) | ||
4324 | + if (!server->rsize || server->rsize > server_resp_sz) | ||
4325 | server->rsize = server_resp_sz; | ||
4326 | - if (server->wsize > server_rqst_sz) | ||
4327 | + if (!server->wsize || server->wsize > server_rqst_sz) | ||
4328 | server->wsize = server_rqst_sz; | ||
4329 | #endif /* CONFIG_NFS_V4_1 */ | ||
4330 | } | ||
4331 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c | ||
4332 | index e4772a8340f8..9905735463a4 100644 | ||
4333 | --- a/fs/nfs/write.c | ||
4334 | +++ b/fs/nfs/write.c | ||
4335 | @@ -1859,6 +1859,8 @@ int nfs_commit_inode(struct inode *inode, int how) | ||
4336 | if (res) | ||
4337 | error = nfs_generic_commit_list(inode, &head, how, &cinfo); | ||
4338 | nfs_commit_end(cinfo.mds); | ||
4339 | + if (res == 0) | ||
4340 | + return res; | ||
4341 | if (error < 0) | ||
4342 | goto out_error; | ||
4343 | if (!may_wait) | ||
4344 | diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c | ||
4345 | index 1645b977c9c6..5c4800626f13 100644 | ||
4346 | --- a/fs/nfsd/nfssvc.c | ||
4347 | +++ b/fs/nfsd/nfssvc.c | ||
4348 | @@ -155,7 +155,8 @@ int nfsd_vers(int vers, enum vers_op change) | ||
4349 | |||
4350 | int nfsd_minorversion(u32 minorversion, enum vers_op change) | ||
4351 | { | ||
4352 | - if (minorversion > NFSD_SUPPORTED_MINOR_VERSION) | ||
4353 | + if (minorversion > NFSD_SUPPORTED_MINOR_VERSION && | ||
4354 | + change != NFSD_AVAIL) | ||
4355 | return -1; | ||
4356 | switch(change) { | ||
4357 | case NFSD_SET: | ||
4358 | @@ -399,23 +400,20 @@ static void nfsd_last_thread(struct svc_serv *serv, struct net *net) | ||
4359 | |||
4360 | void nfsd_reset_versions(void) | ||
4361 | { | ||
4362 | - int found_one = 0; | ||
4363 | int i; | ||
4364 | |||
4365 | - for (i = NFSD_MINVERS; i < NFSD_NRVERS; i++) { | ||
4366 | - if (nfsd_program.pg_vers[i]) | ||
4367 | - found_one = 1; | ||
4368 | - } | ||
4369 | - | ||
4370 | - if (!found_one) { | ||
4371 | - for (i = NFSD_MINVERS; i < NFSD_NRVERS; i++) | ||
4372 | - nfsd_program.pg_vers[i] = nfsd_version[i]; | ||
4373 | -#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) | ||
4374 | - for (i = NFSD_ACL_MINVERS; i < NFSD_ACL_NRVERS; i++) | ||
4375 | - nfsd_acl_program.pg_vers[i] = | ||
4376 | - nfsd_acl_version[i]; | ||
4377 | -#endif | ||
4378 | - } | ||
4379 | + for (i = 0; i < NFSD_NRVERS; i++) | ||
4380 | + if (nfsd_vers(i, NFSD_TEST)) | ||
4381 | + return; | ||
4382 | + | ||
4383 | + for (i = 0; i < NFSD_NRVERS; i++) | ||
4384 | + if (i != 4) | ||
4385 | + nfsd_vers(i, NFSD_SET); | ||
4386 | + else { | ||
4387 | + int minor = 0; | ||
4388 | + while (nfsd_minorversion(minor, NFSD_SET) >= 0) | ||
4389 | + minor++; | ||
4390 | + } | ||
4391 | } | ||
4392 | |||
4393 | /* | ||
4394 | diff --git a/fs/proc/proc_tty.c b/fs/proc/proc_tty.c | ||
4395 | index 15f327bed8c6..7340c36978a3 100644 | ||
4396 | --- a/fs/proc/proc_tty.c | ||
4397 | +++ b/fs/proc/proc_tty.c | ||
4398 | @@ -14,6 +14,7 @@ | ||
4399 | #include <linux/tty.h> | ||
4400 | #include <linux/seq_file.h> | ||
4401 | #include <linux/bitops.h> | ||
4402 | +#include "internal.h" | ||
4403 | |||
4404 | /* | ||
4405 | * The /proc/tty directory inodes... | ||
4406 | @@ -164,7 +165,7 @@ void proc_tty_unregister_driver(struct tty_driver *driver) | ||
4407 | if (!ent) | ||
4408 | return; | ||
4409 | |||
4410 | - remove_proc_entry(driver->driver_name, proc_tty_driver); | ||
4411 | + remove_proc_entry(ent->name, proc_tty_driver); | ||
4412 | |||
4413 | driver->proc_entry = NULL; | ||
4414 | } | ||
4415 | diff --git a/fs/udf/super.c b/fs/udf/super.c | ||
4416 | index 4942549e7dc8..4b1f6d5372c3 100644 | ||
4417 | --- a/fs/udf/super.c | ||
4418 | +++ b/fs/udf/super.c | ||
4419 | @@ -710,7 +710,7 @@ static loff_t udf_check_vsd(struct super_block *sb) | ||
4420 | else | ||
4421 | sectorsize = sb->s_blocksize; | ||
4422 | |||
4423 | - sector += (sbi->s_session << sb->s_blocksize_bits); | ||
4424 | + sector += (((loff_t)sbi->s_session) << sb->s_blocksize_bits); | ||
4425 | |||
4426 | udf_debug("Starting at sector %u (%ld byte sectors)\n", | ||
4427 | (unsigned int)(sector >> sb->s_blocksize_bits), | ||
4428 | diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c | ||
4429 | index b86054cc41db..784d667475ae 100644 | ||
4430 | --- a/fs/userfaultfd.c | ||
4431 | +++ b/fs/userfaultfd.c | ||
4432 | @@ -419,7 +419,7 @@ int handle_userfault(struct fault_env *fe, unsigned long reason) | ||
4433 | * in such case. | ||
4434 | */ | ||
4435 | down_read(&mm->mmap_sem); | ||
4436 | - ret = 0; | ||
4437 | + ret = VM_FAULT_NOPAGE; | ||
4438 | } | ||
4439 | } | ||
4440 | |||
4441 | diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c | ||
4442 | index 7eb99701054f..8ad65d43b65d 100644 | ||
4443 | --- a/fs/xfs/libxfs/xfs_bmap.c | ||
4444 | +++ b/fs/xfs/libxfs/xfs_bmap.c | ||
4445 | @@ -2713,7 +2713,7 @@ xfs_bmap_add_extent_unwritten_real( | ||
4446 | &i))) | ||
4447 | goto done; | ||
4448 | XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); | ||
4449 | - cur->bc_rec.b.br_state = XFS_EXT_NORM; | ||
4450 | + cur->bc_rec.b.br_state = new->br_state; | ||
4451 | if ((error = xfs_btree_insert(cur, &i))) | ||
4452 | goto done; | ||
4453 | XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); | ||
4454 | diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c | ||
4455 | index 5b81f7f41b80..33c389934238 100644 | ||
4456 | --- a/fs/xfs/xfs_iops.c | ||
4457 | +++ b/fs/xfs/xfs_iops.c | ||
4458 | @@ -870,22 +870,6 @@ xfs_setattr_size( | ||
4459 | if (error) | ||
4460 | return error; | ||
4461 | |||
4462 | - /* | ||
4463 | - * We are going to log the inode size change in this transaction so | ||
4464 | - * any previous writes that are beyond the on disk EOF and the new | ||
4465 | - * EOF that have not been written out need to be written here. If we | ||
4466 | - * do not write the data out, we expose ourselves to the null files | ||
4467 | - * problem. Note that this includes any block zeroing we did above; | ||
4468 | - * otherwise those blocks may not be zeroed after a crash. | ||
4469 | - */ | ||
4470 | - if (did_zeroing || | ||
4471 | - (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { | ||
4472 | - error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, | ||
4473 | - ip->i_d.di_size, newsize); | ||
4474 | - if (error) | ||
4475 | - return error; | ||
4476 | - } | ||
4477 | - | ||
4478 | /* | ||
4479 | * We've already locked out new page faults, so now we can safely remove | ||
4480 | * pages from the page cache knowing they won't get refaulted until we | ||
4481 | @@ -902,9 +886,29 @@ xfs_setattr_size( | ||
4482 | * user visible changes). There's not much we can do about this, except | ||
4483 | * to hope that the caller sees ENOMEM and retries the truncate | ||
4484 | * operation. | ||
4485 | + * | ||
4486 | + * And we update in-core i_size and truncate page cache beyond newsize | ||
4487 | + * before writeback the [di_size, newsize] range, so we're guaranteed | ||
4488 | + * not to write stale data past the new EOF on truncate down. | ||
4489 | */ | ||
4490 | truncate_setsize(inode, newsize); | ||
4491 | |||
4492 | + /* | ||
4493 | + * We are going to log the inode size change in this transaction so | ||
4494 | + * any previous writes that are beyond the on disk EOF and the new | ||
4495 | + * EOF that have not been written out need to be written here. If we | ||
4496 | + * do not write the data out, we expose ourselves to the null files | ||
4497 | + * problem. Note that this includes any block zeroing we did above; | ||
4498 | + * otherwise those blocks may not be zeroed after a crash. | ||
4499 | + */ | ||
4500 | + if (did_zeroing || | ||
4501 | + (newsize > ip->i_d.di_size && oldsize != ip->i_d.di_size)) { | ||
4502 | + error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, | ||
4503 | + ip->i_d.di_size, newsize - 1); | ||
4504 | + if (error) | ||
4505 | + return error; | ||
4506 | + } | ||
4507 | + | ||
4508 | error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); | ||
4509 | if (error) | ||
4510 | return error; | ||
4511 | diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c | ||
4512 | index 05909269f973..1e26f4504eed 100644 | ||
4513 | --- a/fs/xfs/xfs_log_recover.c | ||
4514 | +++ b/fs/xfs/xfs_log_recover.c | ||
4515 | @@ -753,7 +753,7 @@ xlog_find_head( | ||
4516 | * in the in-core log. The following number can be made tighter if | ||
4517 | * we actually look at the block size of the filesystem. | ||
4518 | */ | ||
4519 | - num_scan_bblks = XLOG_TOTAL_REC_SHIFT(log); | ||
4520 | + num_scan_bblks = min_t(int, log_bbnum, XLOG_TOTAL_REC_SHIFT(log)); | ||
4521 | if (head_blk >= num_scan_bblks) { | ||
4522 | /* | ||
4523 | * We are guaranteed that the entire check can be performed | ||
4524 | diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h | ||
4525 | index f6d9af3efa45..cac57358f7af 100644 | ||
4526 | --- a/include/crypto/internal/hash.h | ||
4527 | +++ b/include/crypto/internal/hash.h | ||
4528 | @@ -80,6 +80,14 @@ int ahash_register_instance(struct crypto_template *tmpl, | ||
4529 | struct ahash_instance *inst); | ||
4530 | void ahash_free_instance(struct crypto_instance *inst); | ||
4531 | |||
4532 | +int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, | ||
4533 | + unsigned int keylen); | ||
4534 | + | ||
4535 | +static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg) | ||
4536 | +{ | ||
4537 | + return alg->setkey != shash_no_setkey; | ||
4538 | +} | ||
4539 | + | ||
4540 | int crypto_init_ahash_spawn(struct crypto_ahash_spawn *spawn, | ||
4541 | struct hash_alg_common *alg, | ||
4542 | struct crypto_instance *inst); | ||
4543 | diff --git a/include/linux/acpi.h b/include/linux/acpi.h | ||
4544 | index 61a3d90f32b3..ca2b4c4aec42 100644 | ||
4545 | --- a/include/linux/acpi.h | ||
4546 | +++ b/include/linux/acpi.h | ||
4547 | @@ -276,11 +276,8 @@ bool acpi_processor_validate_proc_id(int proc_id); | ||
4548 | /* Arch dependent functions for cpu hotplug support */ | ||
4549 | int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, int *pcpu); | ||
4550 | int acpi_unmap_cpu(int cpu); | ||
4551 | -int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid); | ||
4552 | #endif /* CONFIG_ACPI_HOTPLUG_CPU */ | ||
4553 | |||
4554 | -void acpi_set_processor_mapping(void); | ||
4555 | - | ||
4556 | #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC | ||
4557 | int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr); | ||
4558 | #endif | ||
4559 | diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h | ||
4560 | index 80faf44b8887..dd1b009106a5 100644 | ||
4561 | --- a/include/linux/mlx4/device.h | ||
4562 | +++ b/include/linux/mlx4/device.h | ||
4563 | @@ -476,6 +476,7 @@ enum { | ||
4564 | enum { | ||
4565 | MLX4_INTERFACE_STATE_UP = 1 << 0, | ||
4566 | MLX4_INTERFACE_STATE_DELETION = 1 << 1, | ||
4567 | + MLX4_INTERFACE_STATE_NOWAIT = 1 << 2, | ||
4568 | }; | ||
4569 | |||
4570 | #define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \ | ||
4571 | diff --git a/include/linux/mman.h b/include/linux/mman.h | ||
4572 | index 634c4c51fe3a..c540001ca861 100644 | ||
4573 | --- a/include/linux/mman.h | ||
4574 | +++ b/include/linux/mman.h | ||
4575 | @@ -63,8 +63,9 @@ static inline bool arch_validate_prot(unsigned long prot) | ||
4576 | * ("bit1" and "bit2" must be single bits) | ||
4577 | */ | ||
4578 | #define _calc_vm_trans(x, bit1, bit2) \ | ||
4579 | + ((!(bit1) || !(bit2)) ? 0 : \ | ||
4580 | ((bit1) <= (bit2) ? ((x) & (bit1)) * ((bit2) / (bit1)) \ | ||
4581 | - : ((x) & (bit1)) / ((bit1) / (bit2))) | ||
4582 | + : ((x) & (bit1)) / ((bit1) / (bit2)))) | ||
4583 | |||
4584 | /* | ||
4585 | * Combine the mmap "prot" argument into "vm_flags" used internally. | ||
4586 | diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h | ||
4587 | index 1beab5532035..818a38f99221 100644 | ||
4588 | --- a/include/rdma/ib_addr.h | ||
4589 | +++ b/include/rdma/ib_addr.h | ||
4590 | @@ -243,10 +243,11 @@ static inline void rdma_addr_set_dgid(struct rdma_dev_addr *dev_addr, union ib_g | ||
4591 | static inline enum ib_mtu iboe_get_mtu(int mtu) | ||
4592 | { | ||
4593 | /* | ||
4594 | - * reduce IB headers from effective IBoE MTU. 28 stands for | ||
4595 | - * atomic header which is the biggest possible header after BTH | ||
4596 | + * Reduce IB headers from effective IBoE MTU. | ||
4597 | */ | ||
4598 | - mtu = mtu - IB_GRH_BYTES - IB_BTH_BYTES - 28; | ||
4599 | + mtu = mtu - (IB_GRH_BYTES + IB_UDP_BYTES + IB_BTH_BYTES + | ||
4600 | + IB_EXT_XRC_BYTES + IB_EXT_ATOMICETH_BYTES + | ||
4601 | + IB_ICRC_BYTES); | ||
4602 | |||
4603 | if (mtu >= ib_mtu_enum_to_int(IB_MTU_4096)) | ||
4604 | return IB_MTU_4096; | ||
4605 | diff --git a/include/rdma/ib_pack.h b/include/rdma/ib_pack.h | ||
4606 | index b13419ce99ff..e02b78a38eba 100644 | ||
4607 | --- a/include/rdma/ib_pack.h | ||
4608 | +++ b/include/rdma/ib_pack.h | ||
4609 | @@ -37,14 +37,17 @@ | ||
4610 | #include <uapi/linux/if_ether.h> | ||
4611 | |||
4612 | enum { | ||
4613 | - IB_LRH_BYTES = 8, | ||
4614 | - IB_ETH_BYTES = 14, | ||
4615 | - IB_VLAN_BYTES = 4, | ||
4616 | - IB_GRH_BYTES = 40, | ||
4617 | - IB_IP4_BYTES = 20, | ||
4618 | - IB_UDP_BYTES = 8, | ||
4619 | - IB_BTH_BYTES = 12, | ||
4620 | - IB_DETH_BYTES = 8 | ||
4621 | + IB_LRH_BYTES = 8, | ||
4622 | + IB_ETH_BYTES = 14, | ||
4623 | + IB_VLAN_BYTES = 4, | ||
4624 | + IB_GRH_BYTES = 40, | ||
4625 | + IB_IP4_BYTES = 20, | ||
4626 | + IB_UDP_BYTES = 8, | ||
4627 | + IB_BTH_BYTES = 12, | ||
4628 | + IB_DETH_BYTES = 8, | ||
4629 | + IB_EXT_ATOMICETH_BYTES = 28, | ||
4630 | + IB_EXT_XRC_BYTES = 4, | ||
4631 | + IB_ICRC_BYTES = 4 | ||
4632 | }; | ||
4633 | |||
4634 | struct ib_field { | ||
4635 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h | ||
4636 | index a87e8940fe57..eb3b23b6ec54 100644 | ||
4637 | --- a/include/target/target_core_base.h | ||
4638 | +++ b/include/target/target_core_base.h | ||
4639 | @@ -297,7 +297,7 @@ struct t10_alua_tg_pt_gp { | ||
4640 | struct list_head tg_pt_gp_lun_list; | ||
4641 | struct se_lun *tg_pt_gp_alua_lun; | ||
4642 | struct se_node_acl *tg_pt_gp_alua_nacl; | ||
4643 | - struct delayed_work tg_pt_gp_transition_work; | ||
4644 | + struct work_struct tg_pt_gp_transition_work; | ||
4645 | struct completion *tg_pt_gp_transition_complete; | ||
4646 | }; | ||
4647 | |||
4648 | diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h | ||
4649 | index ab1dadba9923..33c603dd7cd3 100644 | ||
4650 | --- a/include/uapi/linux/usb/ch9.h | ||
4651 | +++ b/include/uapi/linux/usb/ch9.h | ||
4652 | @@ -423,6 +423,11 @@ struct usb_endpoint_descriptor { | ||
4653 | #define USB_ENDPOINT_XFER_INT 3 | ||
4654 | #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 | ||
4655 | |||
4656 | +#define USB_EP_MAXP_MULT_SHIFT 11 | ||
4657 | +#define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT) | ||
4658 | +#define USB_EP_MAXP_MULT(m) \ | ||
4659 | + (((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT) | ||
4660 | + | ||
4661 | /* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */ | ||
4662 | #define USB_ENDPOINT_INTRTYPE 0x30 | ||
4663 | #define USB_ENDPOINT_INTR_PERIODIC (0 << 4) | ||
4664 | @@ -630,6 +635,20 @@ static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) | ||
4665 | return __le16_to_cpu(epd->wMaxPacketSize); | ||
4666 | } | ||
4667 | |||
4668 | +/** | ||
4669 | + * usb_endpoint_maxp_mult - get endpoint's transactional opportunities | ||
4670 | + * @epd: endpoint to be checked | ||
4671 | + * | ||
4672 | + * Return @epd's wMaxPacketSize[12:11] + 1 | ||
4673 | + */ | ||
4674 | +static inline int | ||
4675 | +usb_endpoint_maxp_mult(const struct usb_endpoint_descriptor *epd) | ||
4676 | +{ | ||
4677 | + int maxp = __le16_to_cpu(epd->wMaxPacketSize); | ||
4678 | + | ||
4679 | + return USB_EP_MAXP_MULT(maxp) + 1; | ||
4680 | +} | ||
4681 | + | ||
4682 | static inline int usb_endpoint_interrupt_type( | ||
4683 | const struct usb_endpoint_descriptor *epd) | ||
4684 | { | ||
4685 | diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c | ||
4686 | index c95c5122b105..df5c32a0c6ed 100644 | ||
4687 | --- a/kernel/sched/deadline.c | ||
4688 | +++ b/kernel/sched/deadline.c | ||
4689 | @@ -445,13 +445,13 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se, | ||
4690 | * | ||
4691 | * This function returns true if: | ||
4692 | * | ||
4693 | - * runtime / (deadline - t) > dl_runtime / dl_period , | ||
4694 | + * runtime / (deadline - t) > dl_runtime / dl_deadline , | ||
4695 | * | ||
4696 | * IOW we can't recycle current parameters. | ||
4697 | * | ||
4698 | - * Notice that the bandwidth check is done against the period. For | ||
4699 | + * Notice that the bandwidth check is done against the deadline. For | ||
4700 | * task with deadline equal to period this is the same of using | ||
4701 | - * dl_deadline instead of dl_period in the equation above. | ||
4702 | + * dl_period instead of dl_deadline in the equation above. | ||
4703 | */ | ||
4704 | static bool dl_entity_overflow(struct sched_dl_entity *dl_se, | ||
4705 | struct sched_dl_entity *pi_se, u64 t) | ||
4706 | @@ -476,7 +476,7 @@ static bool dl_entity_overflow(struct sched_dl_entity *dl_se, | ||
4707 | * of anything below microseconds resolution is actually fiction | ||
4708 | * (but still we want to give the user that illusion >;). | ||
4709 | */ | ||
4710 | - left = (pi_se->dl_period >> DL_SCALE) * (dl_se->runtime >> DL_SCALE); | ||
4711 | + left = (pi_se->dl_deadline >> DL_SCALE) * (dl_se->runtime >> DL_SCALE); | ||
4712 | right = ((dl_se->deadline - t) >> DL_SCALE) * | ||
4713 | (pi_se->dl_runtime >> DL_SCALE); | ||
4714 | |||
4715 | @@ -505,10 +505,15 @@ static void update_dl_entity(struct sched_dl_entity *dl_se, | ||
4716 | } | ||
4717 | } | ||
4718 | |||
4719 | +static inline u64 dl_next_period(struct sched_dl_entity *dl_se) | ||
4720 | +{ | ||
4721 | + return dl_se->deadline - dl_se->dl_deadline + dl_se->dl_period; | ||
4722 | +} | ||
4723 | + | ||
4724 | /* | ||
4725 | * If the entity depleted all its runtime, and if we want it to sleep | ||
4726 | * while waiting for some new execution time to become available, we | ||
4727 | - * set the bandwidth enforcement timer to the replenishment instant | ||
4728 | + * set the bandwidth replenishment timer to the replenishment instant | ||
4729 | * and try to activate it. | ||
4730 | * | ||
4731 | * Notice that it is important for the caller to know if the timer | ||
4732 | @@ -530,7 +535,7 @@ static int start_dl_timer(struct task_struct *p) | ||
4733 | * that it is actually coming from rq->clock and not from | ||
4734 | * hrtimer's time base reading. | ||
4735 | */ | ||
4736 | - act = ns_to_ktime(dl_se->deadline); | ||
4737 | + act = ns_to_ktime(dl_next_period(dl_se)); | ||
4738 | now = hrtimer_cb_get_time(timer); | ||
4739 | delta = ktime_to_ns(now) - rq_clock(rq); | ||
4740 | act = ktime_add_ns(act, delta); | ||
4741 | @@ -638,6 +643,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer) | ||
4742 | lockdep_unpin_lock(&rq->lock, rf.cookie); | ||
4743 | rq = dl_task_offline_migration(rq, p); | ||
4744 | rf.cookie = lockdep_pin_lock(&rq->lock); | ||
4745 | + update_rq_clock(rq); | ||
4746 | |||
4747 | /* | ||
4748 | * Now that the task has been migrated to the new RQ and we | ||
4749 | @@ -689,6 +695,37 @@ void init_dl_task_timer(struct sched_dl_entity *dl_se) | ||
4750 | timer->function = dl_task_timer; | ||
4751 | } | ||
4752 | |||
4753 | +/* | ||
4754 | + * During the activation, CBS checks if it can reuse the current task's | ||
4755 | + * runtime and period. If the deadline of the task is in the past, CBS | ||
4756 | + * cannot use the runtime, and so it replenishes the task. This rule | ||
4757 | + * works fine for implicit deadline tasks (deadline == period), and the | ||
4758 | + * CBS was designed for implicit deadline tasks. However, a task with | ||
4759 | + * constrained deadline (deadine < period) might be awakened after the | ||
4760 | + * deadline, but before the next period. In this case, replenishing the | ||
4761 | + * task would allow it to run for runtime / deadline. As in this case | ||
4762 | + * deadline < period, CBS enables a task to run for more than the | ||
4763 | + * runtime / period. In a very loaded system, this can cause a domino | ||
4764 | + * effect, making other tasks miss their deadlines. | ||
4765 | + * | ||
4766 | + * To avoid this problem, in the activation of a constrained deadline | ||
4767 | + * task after the deadline but before the next period, throttle the | ||
4768 | + * task and set the replenishing timer to the begin of the next period, | ||
4769 | + * unless it is boosted. | ||
4770 | + */ | ||
4771 | +static inline void dl_check_constrained_dl(struct sched_dl_entity *dl_se) | ||
4772 | +{ | ||
4773 | + struct task_struct *p = dl_task_of(dl_se); | ||
4774 | + struct rq *rq = rq_of_dl_rq(dl_rq_of_se(dl_se)); | ||
4775 | + | ||
4776 | + if (dl_time_before(dl_se->deadline, rq_clock(rq)) && | ||
4777 | + dl_time_before(rq_clock(rq), dl_next_period(dl_se))) { | ||
4778 | + if (unlikely(dl_se->dl_boosted || !start_dl_timer(p))) | ||
4779 | + return; | ||
4780 | + dl_se->dl_throttled = 1; | ||
4781 | + } | ||
4782 | +} | ||
4783 | + | ||
4784 | static | ||
4785 | int dl_runtime_exceeded(struct sched_dl_entity *dl_se) | ||
4786 | { | ||
4787 | @@ -922,6 +959,11 @@ static void dequeue_dl_entity(struct sched_dl_entity *dl_se) | ||
4788 | __dequeue_dl_entity(dl_se); | ||
4789 | } | ||
4790 | |||
4791 | +static inline bool dl_is_constrained(struct sched_dl_entity *dl_se) | ||
4792 | +{ | ||
4793 | + return dl_se->dl_deadline < dl_se->dl_period; | ||
4794 | +} | ||
4795 | + | ||
4796 | static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags) | ||
4797 | { | ||
4798 | struct task_struct *pi_task = rt_mutex_get_top_task(p); | ||
4799 | @@ -947,6 +989,15 @@ static void enqueue_task_dl(struct rq *rq, struct task_struct *p, int flags) | ||
4800 | return; | ||
4801 | } | ||
4802 | |||
4803 | + /* | ||
4804 | + * Check if a constrained deadline task was activated | ||
4805 | + * after the deadline but before the next period. | ||
4806 | + * If that is the case, the task will be throttled and | ||
4807 | + * the replenishment timer will be set to the next period. | ||
4808 | + */ | ||
4809 | + if (!p->dl.dl_throttled && dl_is_constrained(&p->dl)) | ||
4810 | + dl_check_constrained_dl(&p->dl); | ||
4811 | + | ||
4812 | /* | ||
4813 | * If p is throttled, we do nothing. In fact, if it exhausted | ||
4814 | * its budget it needs a replenishment and, since it now is on | ||
4815 | diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c | ||
4816 | index 9c131168d933..7a360d6f6798 100644 | ||
4817 | --- a/kernel/sched/rt.c | ||
4818 | +++ b/kernel/sched/rt.c | ||
4819 | @@ -2022,8 +2022,9 @@ static void pull_rt_task(struct rq *this_rq) | ||
4820 | bool resched = false; | ||
4821 | struct task_struct *p; | ||
4822 | struct rq *src_rq; | ||
4823 | + int rt_overload_count = rt_overloaded(this_rq); | ||
4824 | |||
4825 | - if (likely(!rt_overloaded(this_rq))) | ||
4826 | + if (likely(!rt_overload_count)) | ||
4827 | return; | ||
4828 | |||
4829 | /* | ||
4830 | @@ -2032,6 +2033,11 @@ static void pull_rt_task(struct rq *this_rq) | ||
4831 | */ | ||
4832 | smp_rmb(); | ||
4833 | |||
4834 | + /* If we are the only overloaded CPU do nothing */ | ||
4835 | + if (rt_overload_count == 1 && | ||
4836 | + cpumask_test_cpu(this_rq->cpu, this_rq->rd->rto_mask)) | ||
4837 | + return; | ||
4838 | + | ||
4839 | #ifdef HAVE_RT_PUSH_IPI | ||
4840 | if (sched_feat(RT_PUSH_IPI)) { | ||
4841 | tell_cpu_to_push(this_rq); | ||
4842 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
4843 | index c1e50cc0d7b0..4214cd960b8e 100644 | ||
4844 | --- a/kernel/trace/trace.c | ||
4845 | +++ b/kernel/trace/trace.c | ||
4846 | @@ -3727,37 +3727,30 @@ static const struct file_operations show_traces_fops = { | ||
4847 | .llseek = seq_lseek, | ||
4848 | }; | ||
4849 | |||
4850 | -/* | ||
4851 | - * The tracer itself will not take this lock, but still we want | ||
4852 | - * to provide a consistent cpumask to user-space: | ||
4853 | - */ | ||
4854 | -static DEFINE_MUTEX(tracing_cpumask_update_lock); | ||
4855 | - | ||
4856 | -/* | ||
4857 | - * Temporary storage for the character representation of the | ||
4858 | - * CPU bitmask (and one more byte for the newline): | ||
4859 | - */ | ||
4860 | -static char mask_str[NR_CPUS + 1]; | ||
4861 | - | ||
4862 | static ssize_t | ||
4863 | tracing_cpumask_read(struct file *filp, char __user *ubuf, | ||
4864 | size_t count, loff_t *ppos) | ||
4865 | { | ||
4866 | struct trace_array *tr = file_inode(filp)->i_private; | ||
4867 | + char *mask_str; | ||
4868 | int len; | ||
4869 | |||
4870 | - mutex_lock(&tracing_cpumask_update_lock); | ||
4871 | + len = snprintf(NULL, 0, "%*pb\n", | ||
4872 | + cpumask_pr_args(tr->tracing_cpumask)) + 1; | ||
4873 | + mask_str = kmalloc(len, GFP_KERNEL); | ||
4874 | + if (!mask_str) | ||
4875 | + return -ENOMEM; | ||
4876 | |||
4877 | - len = snprintf(mask_str, count, "%*pb\n", | ||
4878 | + len = snprintf(mask_str, len, "%*pb\n", | ||
4879 | cpumask_pr_args(tr->tracing_cpumask)); | ||
4880 | if (len >= count) { | ||
4881 | count = -EINVAL; | ||
4882 | goto out_err; | ||
4883 | } | ||
4884 | - count = simple_read_from_buffer(ubuf, count, ppos, mask_str, NR_CPUS+1); | ||
4885 | + count = simple_read_from_buffer(ubuf, count, ppos, mask_str, len); | ||
4886 | |||
4887 | out_err: | ||
4888 | - mutex_unlock(&tracing_cpumask_update_lock); | ||
4889 | + kfree(mask_str); | ||
4890 | |||
4891 | return count; | ||
4892 | } | ||
4893 | @@ -3777,8 +3770,6 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf, | ||
4894 | if (err) | ||
4895 | goto err_unlock; | ||
4896 | |||
4897 | - mutex_lock(&tracing_cpumask_update_lock); | ||
4898 | - | ||
4899 | local_irq_disable(); | ||
4900 | arch_spin_lock(&tr->max_lock); | ||
4901 | for_each_tracing_cpu(cpu) { | ||
4902 | @@ -3801,8 +3792,6 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf, | ||
4903 | local_irq_enable(); | ||
4904 | |||
4905 | cpumask_copy(tr->tracing_cpumask, tracing_cpumask_new); | ||
4906 | - | ||
4907 | - mutex_unlock(&tracing_cpumask_update_lock); | ||
4908 | free_cpumask_var(tracing_cpumask_new); | ||
4909 | |||
4910 | return count; | ||
4911 | diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c | ||
4912 | index aa1df1a10dd7..82ce5713f744 100644 | ||
4913 | --- a/net/bridge/br_netfilter_hooks.c | ||
4914 | +++ b/net/bridge/br_netfilter_hooks.c | ||
4915 | @@ -706,18 +706,20 @@ static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) | ||
4916 | |||
4917 | static int br_nf_dev_queue_xmit(struct net *net, struct sock *sk, struct sk_buff *skb) | ||
4918 | { | ||
4919 | - struct nf_bridge_info *nf_bridge; | ||
4920 | - unsigned int mtu_reserved; | ||
4921 | + struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); | ||
4922 | + unsigned int mtu, mtu_reserved; | ||
4923 | |||
4924 | mtu_reserved = nf_bridge_mtu_reduction(skb); | ||
4925 | + mtu = skb->dev->mtu; | ||
4926 | + | ||
4927 | + if (nf_bridge->frag_max_size && nf_bridge->frag_max_size < mtu) | ||
4928 | + mtu = nf_bridge->frag_max_size; | ||
4929 | |||
4930 | - if (skb_is_gso(skb) || skb->len + mtu_reserved <= skb->dev->mtu) { | ||
4931 | + if (skb_is_gso(skb) || skb->len + mtu_reserved <= mtu) { | ||
4932 | nf_bridge_info_free(skb); | ||
4933 | return br_dev_queue_push_xmit(net, sk, skb); | ||
4934 | } | ||
4935 | |||
4936 | - nf_bridge = nf_bridge_info_get(skb); | ||
4937 | - | ||
4938 | /* This is wrong! We should preserve the original fragment | ||
4939 | * boundaries by preserving frag_list rather than refragmenting. | ||
4940 | */ | ||
4941 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
4942 | index c37891828e4e..09007a71c8dd 100644 | ||
4943 | --- a/net/core/dev.c | ||
4944 | +++ b/net/core/dev.c | ||
4945 | @@ -1304,6 +1304,7 @@ void netdev_notify_peers(struct net_device *dev) | ||
4946 | { | ||
4947 | rtnl_lock(); | ||
4948 | call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, dev); | ||
4949 | + call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev); | ||
4950 | rtnl_unlock(); | ||
4951 | } | ||
4952 | EXPORT_SYMBOL(netdev_notify_peers); | ||
4953 | diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c | ||
4954 | index 48734ee6293f..31f17f0bbd1c 100644 | ||
4955 | --- a/net/ipv4/icmp.c | ||
4956 | +++ b/net/ipv4/icmp.c | ||
4957 | @@ -766,7 +766,7 @@ static bool icmp_tag_validation(int proto) | ||
4958 | } | ||
4959 | |||
4960 | /* | ||
4961 | - * Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEED, ICMP_QUENCH, and | ||
4962 | + * Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEEDED, ICMP_QUENCH, and | ||
4963 | * ICMP_PARAMETERPROB. | ||
4964 | */ | ||
4965 | |||
4966 | @@ -794,7 +794,8 @@ static bool icmp_unreach(struct sk_buff *skb) | ||
4967 | if (iph->ihl < 5) /* Mangled header, drop. */ | ||
4968 | goto out_err; | ||
4969 | |||
4970 | - if (icmph->type == ICMP_DEST_UNREACH) { | ||
4971 | + switch (icmph->type) { | ||
4972 | + case ICMP_DEST_UNREACH: | ||
4973 | switch (icmph->code & 15) { | ||
4974 | case ICMP_NET_UNREACH: | ||
4975 | case ICMP_HOST_UNREACH: | ||
4976 | @@ -830,8 +831,16 @@ static bool icmp_unreach(struct sk_buff *skb) | ||
4977 | } | ||
4978 | if (icmph->code > NR_ICMP_UNREACH) | ||
4979 | goto out; | ||
4980 | - } else if (icmph->type == ICMP_PARAMETERPROB) | ||
4981 | + break; | ||
4982 | + case ICMP_PARAMETERPROB: | ||
4983 | info = ntohl(icmph->un.gateway) >> 24; | ||
4984 | + break; | ||
4985 | + case ICMP_TIME_EXCEEDED: | ||
4986 | + __ICMP_INC_STATS(net, ICMP_MIB_INTIMEEXCDS); | ||
4987 | + if (icmph->code == ICMP_EXC_FRAGTIME) | ||
4988 | + goto out; | ||
4989 | + break; | ||
4990 | + } | ||
4991 | |||
4992 | /* | ||
4993 | * Throw it at our lower layers | ||
4994 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c | ||
4995 | index b06acd0f400d..cfc4dd8997e5 100644 | ||
4996 | --- a/net/l2tp/l2tp_core.c | ||
4997 | +++ b/net/l2tp/l2tp_core.c | ||
4998 | @@ -1944,7 +1944,7 @@ static __net_exit void l2tp_exit_net(struct net *net) | ||
4999 | |||
5000 | rcu_read_lock_bh(); | ||
5001 | list_for_each_entry_rcu(tunnel, &pn->l2tp_tunnel_list, list) { | ||
5002 | - (void)l2tp_tunnel_delete(tunnel); | ||
5003 | + l2tp_tunnel_delete(tunnel); | ||
5004 | } | ||
5005 | rcu_read_unlock_bh(); | ||
5006 | |||
5007 | diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c | ||
5008 | index 1ccd310d01a5..ee03bc866d1b 100644 | ||
5009 | --- a/net/l2tp/l2tp_netlink.c | ||
5010 | +++ b/net/l2tp/l2tp_netlink.c | ||
5011 | @@ -287,7 +287,7 @@ static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info | ||
5012 | l2tp_tunnel_notify(&l2tp_nl_family, info, | ||
5013 | tunnel, L2TP_CMD_TUNNEL_DELETE); | ||
5014 | |||
5015 | - (void) l2tp_tunnel_delete(tunnel); | ||
5016 | + l2tp_tunnel_delete(tunnel); | ||
5017 | |||
5018 | out: | ||
5019 | return ret; | ||
5020 | diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c | ||
5021 | index 5c67a696e046..b4b3fe078868 100644 | ||
5022 | --- a/net/mac80211/mesh.c | ||
5023 | +++ b/net/mac80211/mesh.c | ||
5024 | @@ -279,8 +279,6 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, | ||
5025 | /* Mesh PS mode. See IEEE802.11-2012 8.4.2.100.8 */ | ||
5026 | *pos |= ifmsh->ps_peers_deep_sleep ? | ||
5027 | IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL : 0x00; | ||
5028 | - *pos++ = 0x00; | ||
5029 | - | ||
5030 | return 0; | ||
5031 | } | ||
5032 | |||
5033 | diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c | ||
5034 | index 1309e2c34764..c5a5a6959c1b 100644 | ||
5035 | --- a/net/mpls/af_mpls.c | ||
5036 | +++ b/net/mpls/af_mpls.c | ||
5037 | @@ -937,6 +937,8 @@ static void mpls_ifdown(struct net_device *dev, int event) | ||
5038 | { | ||
5039 | struct mpls_route __rcu **platform_label; | ||
5040 | struct net *net = dev_net(dev); | ||
5041 | + unsigned int nh_flags = RTNH_F_DEAD | RTNH_F_LINKDOWN; | ||
5042 | + unsigned int alive; | ||
5043 | unsigned index; | ||
5044 | |||
5045 | platform_label = rtnl_dereference(net->mpls.platform_label); | ||
5046 | @@ -946,9 +948,11 @@ static void mpls_ifdown(struct net_device *dev, int event) | ||
5047 | if (!rt) | ||
5048 | continue; | ||
5049 | |||
5050 | + alive = 0; | ||
5051 | change_nexthops(rt) { | ||
5052 | if (rtnl_dereference(nh->nh_dev) != dev) | ||
5053 | - continue; | ||
5054 | + goto next; | ||
5055 | + | ||
5056 | switch (event) { | ||
5057 | case NETDEV_DOWN: | ||
5058 | case NETDEV_UNREGISTER: | ||
5059 | @@ -956,13 +960,16 @@ static void mpls_ifdown(struct net_device *dev, int event) | ||
5060 | /* fall through */ | ||
5061 | case NETDEV_CHANGE: | ||
5062 | nh->nh_flags |= RTNH_F_LINKDOWN; | ||
5063 | - if (event != NETDEV_UNREGISTER) | ||
5064 | - ACCESS_ONCE(rt->rt_nhn_alive) = rt->rt_nhn_alive - 1; | ||
5065 | break; | ||
5066 | } | ||
5067 | if (event == NETDEV_UNREGISTER) | ||
5068 | RCU_INIT_POINTER(nh->nh_dev, NULL); | ||
5069 | +next: | ||
5070 | + if (!(nh->nh_flags & nh_flags)) | ||
5071 | + alive++; | ||
5072 | } endfor_nexthops(rt); | ||
5073 | + | ||
5074 | + WRITE_ONCE(rt->rt_nhn_alive, alive); | ||
5075 | } | ||
5076 | } | ||
5077 | |||
5078 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c | ||
5079 | index a6e44ef2ec9a..2155c2498aed 100644 | ||
5080 | --- a/net/netfilter/ipvs/ip_vs_ctl.c | ||
5081 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c | ||
5082 | @@ -2040,12 +2040,16 @@ static int ip_vs_info_seq_show(struct seq_file *seq, void *v) | ||
5083 | seq_puts(seq, | ||
5084 | " -> RemoteAddress:Port Forward Weight ActiveConn InActConn\n"); | ||
5085 | } else { | ||
5086 | + struct net *net = seq_file_net(seq); | ||
5087 | + struct netns_ipvs *ipvs = net_ipvs(net); | ||
5088 | const struct ip_vs_service *svc = v; | ||
5089 | const struct ip_vs_iter *iter = seq->private; | ||
5090 | const struct ip_vs_dest *dest; | ||
5091 | struct ip_vs_scheduler *sched = rcu_dereference(svc->scheduler); | ||
5092 | char *sched_name = sched ? sched->name : "none"; | ||
5093 | |||
5094 | + if (svc->ipvs != ipvs) | ||
5095 | + return 0; | ||
5096 | if (iter->table == ip_vs_svc_table) { | ||
5097 | #ifdef CONFIG_IP_VS_IPV6 | ||
5098 | if (svc->af == AF_INET6) | ||
5099 | diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c | ||
5100 | index 3f9d8d7ec632..b099b64366f3 100644 | ||
5101 | --- a/net/rxrpc/conn_event.c | ||
5102 | +++ b/net/rxrpc/conn_event.c | ||
5103 | @@ -275,6 +275,10 @@ static int rxrpc_process_event(struct rxrpc_connection *conn, | ||
5104 | rxrpc_conn_retransmit_call(conn, skb); | ||
5105 | return 0; | ||
5106 | |||
5107 | + case RXRPC_PACKET_TYPE_BUSY: | ||
5108 | + /* Just ignore BUSY packets for now. */ | ||
5109 | + return 0; | ||
5110 | + | ||
5111 | case RXRPC_PACKET_TYPE_ABORT: | ||
5112 | if (skb_copy_bits(skb, sizeof(struct rxrpc_wire_header), | ||
5113 | &wtmp, sizeof(wtmp)) < 0) | ||
5114 | diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c | ||
5115 | index 44fb8d893c7d..1060d14d4e6a 100644 | ||
5116 | --- a/net/rxrpc/input.c | ||
5117 | +++ b/net/rxrpc/input.c | ||
5118 | @@ -649,6 +649,7 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, | ||
5119 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | ||
5120 | struct rxrpc_peer *peer; | ||
5121 | unsigned int mtu; | ||
5122 | + bool wake = false; | ||
5123 | u32 rwind = ntohl(ackinfo->rwind); | ||
5124 | |||
5125 | _proto("Rx ACK %%%u Info { rx=%u max=%u rwin=%u jm=%u }", | ||
5126 | @@ -656,9 +657,14 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, | ||
5127 | ntohl(ackinfo->rxMTU), ntohl(ackinfo->maxMTU), | ||
5128 | rwind, ntohl(ackinfo->jumbo_max)); | ||
5129 | |||
5130 | - if (rwind > RXRPC_RXTX_BUFF_SIZE - 1) | ||
5131 | - rwind = RXRPC_RXTX_BUFF_SIZE - 1; | ||
5132 | - call->tx_winsize = rwind; | ||
5133 | + if (call->tx_winsize != rwind) { | ||
5134 | + if (rwind > RXRPC_RXTX_BUFF_SIZE - 1) | ||
5135 | + rwind = RXRPC_RXTX_BUFF_SIZE - 1; | ||
5136 | + if (rwind > call->tx_winsize) | ||
5137 | + wake = true; | ||
5138 | + call->tx_winsize = rwind; | ||
5139 | + } | ||
5140 | + | ||
5141 | if (call->cong_ssthresh > rwind) | ||
5142 | call->cong_ssthresh = rwind; | ||
5143 | |||
5144 | @@ -672,6 +678,9 @@ static void rxrpc_input_ackinfo(struct rxrpc_call *call, struct sk_buff *skb, | ||
5145 | spin_unlock_bh(&peer->lock); | ||
5146 | _net("Net MTU %u (maxdata %u)", peer->mtu, peer->maxdata); | ||
5147 | } | ||
5148 | + | ||
5149 | + if (wake) | ||
5150 | + wake_up(&call->waitq); | ||
5151 | } | ||
5152 | |||
5153 | /* | ||
5154 | diff --git a/net/socket.c b/net/socket.c | ||
5155 | index 6bbccf05854f..05f13b24572c 100644 | ||
5156 | --- a/net/socket.c | ||
5157 | +++ b/net/socket.c | ||
5158 | @@ -1702,6 +1702,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size, | ||
5159 | /* We assume all kernel code knows the size of sockaddr_storage */ | ||
5160 | msg.msg_namelen = 0; | ||
5161 | msg.msg_iocb = NULL; | ||
5162 | + msg.msg_flags = 0; | ||
5163 | if (sock->file->f_flags & O_NONBLOCK) | ||
5164 | flags |= MSG_DONTWAIT; | ||
5165 | err = sock_recvmsg(sock, &msg, flags); | ||
5166 | diff --git a/sound/soc/intel/skylake/skl-sst-utils.c b/sound/soc/intel/skylake/skl-sst-utils.c | ||
5167 | index ea162fbf68e5..d5adc04bb724 100644 | ||
5168 | --- a/sound/soc/intel/skylake/skl-sst-utils.c | ||
5169 | +++ b/sound/soc/intel/skylake/skl-sst-utils.c | ||
5170 | @@ -295,6 +295,7 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, | ||
5171 | struct uuid_module *module; | ||
5172 | struct firmware stripped_fw; | ||
5173 | unsigned int safe_file; | ||
5174 | + int ret = 0; | ||
5175 | |||
5176 | /* Get the FW pointer to derive ADSP header */ | ||
5177 | stripped_fw.data = fw->data; | ||
5178 | @@ -343,8 +344,10 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, | ||
5179 | |||
5180 | for (i = 0; i < num_entry; i++, mod_entry++) { | ||
5181 | module = kzalloc(sizeof(*module), GFP_KERNEL); | ||
5182 | - if (!module) | ||
5183 | - return -ENOMEM; | ||
5184 | + if (!module) { | ||
5185 | + ret = -ENOMEM; | ||
5186 | + goto free_uuid_list; | ||
5187 | + } | ||
5188 | |||
5189 | uuid_bin = (uuid_le *)mod_entry->uuid.id; | ||
5190 | memcpy(&module->uuid, uuid_bin, sizeof(module->uuid)); | ||
5191 | @@ -355,8 +358,8 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, | ||
5192 | size = sizeof(int) * mod_entry->instance_max_count; | ||
5193 | module->instance_id = devm_kzalloc(ctx->dev, size, GFP_KERNEL); | ||
5194 | if (!module->instance_id) { | ||
5195 | - kfree(module); | ||
5196 | - return -ENOMEM; | ||
5197 | + ret = -ENOMEM; | ||
5198 | + goto free_uuid_list; | ||
5199 | } | ||
5200 | |||
5201 | list_add_tail(&module->list, &skl->uuid_list); | ||
5202 | @@ -367,6 +370,10 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, | ||
5203 | } | ||
5204 | |||
5205 | return 0; | ||
5206 | + | ||
5207 | +free_uuid_list: | ||
5208 | + skl_freeup_uuid_list(skl); | ||
5209 | + return ret; | ||
5210 | } | ||
5211 | |||
5212 | void skl_freeup_uuid_list(struct skl_sst *ctx) | ||
5213 | diff --git a/sound/soc/sh/rcar/cmd.c b/sound/soc/sh/rcar/cmd.c | ||
5214 | index abb5eaac854a..7d92a24b7cfa 100644 | ||
5215 | --- a/sound/soc/sh/rcar/cmd.c | ||
5216 | +++ b/sound/soc/sh/rcar/cmd.c | ||
5217 | @@ -31,23 +31,24 @@ static int rsnd_cmd_init(struct rsnd_mod *mod, | ||
5218 | struct rsnd_mod *mix = rsnd_io_to_mod_mix(io); | ||
5219 | struct device *dev = rsnd_priv_to_dev(priv); | ||
5220 | u32 data; | ||
5221 | + u32 path[] = { | ||
5222 | + [1] = 1 << 0, | ||
5223 | + [5] = 1 << 8, | ||
5224 | + [6] = 1 << 12, | ||
5225 | + [9] = 1 << 15, | ||
5226 | + }; | ||
5227 | |||
5228 | if (!mix && !dvc) | ||
5229 | return 0; | ||
5230 | |||
5231 | + if (ARRAY_SIZE(path) < rsnd_mod_id(mod) + 1) | ||
5232 | + return -ENXIO; | ||
5233 | + | ||
5234 | if (mix) { | ||
5235 | struct rsnd_dai *rdai; | ||
5236 | struct rsnd_mod *src; | ||
5237 | struct rsnd_dai_stream *tio; | ||
5238 | int i; | ||
5239 | - u32 path[] = { | ||
5240 | - [0] = 0, | ||
5241 | - [1] = 1 << 0, | ||
5242 | - [2] = 0, | ||
5243 | - [3] = 0, | ||
5244 | - [4] = 0, | ||
5245 | - [5] = 1 << 8 | ||
5246 | - }; | ||
5247 | |||
5248 | /* | ||
5249 | * it is assuming that integrater is well understanding about | ||
5250 | @@ -70,16 +71,19 @@ static int rsnd_cmd_init(struct rsnd_mod *mod, | ||
5251 | } else { | ||
5252 | struct rsnd_mod *src = rsnd_io_to_mod_src(io); | ||
5253 | |||
5254 | - u32 path[] = { | ||
5255 | - [0] = 0x30000, | ||
5256 | - [1] = 0x30001, | ||
5257 | - [2] = 0x40000, | ||
5258 | - [3] = 0x10000, | ||
5259 | - [4] = 0x20000, | ||
5260 | - [5] = 0x40100 | ||
5261 | + u8 cmd_case[] = { | ||
5262 | + [0] = 0x3, | ||
5263 | + [1] = 0x3, | ||
5264 | + [2] = 0x4, | ||
5265 | + [3] = 0x1, | ||
5266 | + [4] = 0x2, | ||
5267 | + [5] = 0x4, | ||
5268 | + [6] = 0x1, | ||
5269 | + [9] = 0x2, | ||
5270 | }; | ||
5271 | |||
5272 | - data = path[rsnd_mod_id(src)]; | ||
5273 | + data = path[rsnd_mod_id(src)] | | ||
5274 | + cmd_case[rsnd_mod_id(src)] << 16; | ||
5275 | } | ||
5276 | |||
5277 | dev_dbg(dev, "ctu/mix path = 0x%08x", data); | ||
5278 | diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c | ||
5279 | index 6bc93cbb3049..edeb74a13c0f 100644 | ||
5280 | --- a/sound/soc/sh/rcar/dma.c | ||
5281 | +++ b/sound/soc/sh/rcar/dma.c | ||
5282 | @@ -361,6 +361,20 @@ static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg) | ||
5283 | return ioread32(rsnd_dmapp_addr(dmac, dma, reg)); | ||
5284 | } | ||
5285 | |||
5286 | +static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg) | ||
5287 | +{ | ||
5288 | + struct rsnd_mod *mod = rsnd_mod_get(dma); | ||
5289 | + struct rsnd_priv *priv = rsnd_mod_to_priv(mod); | ||
5290 | + struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); | ||
5291 | + volatile void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg); | ||
5292 | + u32 val = ioread32(addr); | ||
5293 | + | ||
5294 | + val &= ~mask; | ||
5295 | + val |= (data & mask); | ||
5296 | + | ||
5297 | + iowrite32(val, addr); | ||
5298 | +} | ||
5299 | + | ||
5300 | static int rsnd_dmapp_stop(struct rsnd_mod *mod, | ||
5301 | struct rsnd_dai_stream *io, | ||
5302 | struct rsnd_priv *priv) | ||
5303 | @@ -368,10 +382,10 @@ static int rsnd_dmapp_stop(struct rsnd_mod *mod, | ||
5304 | struct rsnd_dma *dma = rsnd_mod_to_dma(mod); | ||
5305 | int i; | ||
5306 | |||
5307 | - rsnd_dmapp_write(dma, 0, PDMACHCR); | ||
5308 | + rsnd_dmapp_bset(dma, 0, PDMACHCR_DE, PDMACHCR); | ||
5309 | |||
5310 | for (i = 0; i < 1024; i++) { | ||
5311 | - if (0 == rsnd_dmapp_read(dma, PDMACHCR)) | ||
5312 | + if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE)) | ||
5313 | return 0; | ||
5314 | udelay(1); | ||
5315 | } | ||
5316 | diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c | ||
5317 | index 6cb6db005fc4..560cf4b51a99 100644 | ||
5318 | --- a/sound/soc/sh/rcar/ssi.c | ||
5319 | +++ b/sound/soc/sh/rcar/ssi.c | ||
5320 | @@ -172,10 +172,15 @@ static u32 rsnd_ssi_run_mods(struct rsnd_dai_stream *io) | ||
5321 | { | ||
5322 | struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io); | ||
5323 | struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io); | ||
5324 | + u32 mods; | ||
5325 | |||
5326 | - return rsnd_ssi_multi_slaves_runtime(io) | | ||
5327 | - 1 << rsnd_mod_id(ssi_mod) | | ||
5328 | - 1 << rsnd_mod_id(ssi_parent_mod); | ||
5329 | + mods = rsnd_ssi_multi_slaves_runtime(io) | | ||
5330 | + 1 << rsnd_mod_id(ssi_mod); | ||
5331 | + | ||
5332 | + if (ssi_parent_mod) | ||
5333 | + mods |= 1 << rsnd_mod_id(ssi_parent_mod); | ||
5334 | + | ||
5335 | + return mods; | ||
5336 | } | ||
5337 | |||
5338 | u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io) | ||
5339 | diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c | ||
5340 | index f7b35e178582..f199d5b11d76 100644 | ||
5341 | --- a/tools/perf/util/symbol.c | ||
5342 | +++ b/tools/perf/util/symbol.c | ||
5343 | @@ -202,7 +202,7 @@ void symbols__fixup_end(struct rb_root *symbols) | ||
5344 | |||
5345 | /* Last entry */ | ||
5346 | if (curr->end == curr->start) | ||
5347 | - curr->end = roundup(curr->start, 4096); | ||
5348 | + curr->end = roundup(curr->start, 4096) + 4096; | ||
5349 | } | ||
5350 | |||
5351 | void __map_groups__fixup_end(struct map_groups *mg, enum map_type type) | ||
5352 | diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile | ||
5353 | index bbab7f4664ac..d116a19477a7 100644 | ||
5354 | --- a/tools/testing/selftests/vm/Makefile | ||
5355 | +++ b/tools/testing/selftests/vm/Makefile | ||
5356 | @@ -1,5 +1,9 @@ | ||
5357 | # Makefile for vm selftests | ||
5358 | |||
5359 | +ifndef OUTPUT | ||
5360 | + OUTPUT := $(shell pwd) | ||
5361 | +endif | ||
5362 | + | ||
5363 | CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS) | ||
5364 | BINARIES = compaction_test | ||
5365 | BINARIES += hugepage-mmap |