Contents of /trunk/kernel-magellan/patches-4.17/0102-4.17.3-all-fixes.patch
Parent Directory | Revision Log
Revision 3142 -
(show annotations)
(download)
Tue Jun 26 13:38:06 2018 UTC (6 years, 3 months ago) by niro
File size: 78454 byte(s)
Tue Jun 26 13:38:06 2018 UTC (6 years, 3 months ago) by niro
File size: 78454 byte(s)
-linux-4.17.3
1 | diff --git a/Makefile b/Makefile |
2 | index f43cd522b175..31dc3a08295a 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,7 +1,7 @@ |
6 | # SPDX-License-Identifier: GPL-2.0 |
7 | VERSION = 4 |
8 | PATCHLEVEL = 17 |
9 | -SUBLEVEL = 2 |
10 | +SUBLEVEL = 3 |
11 | EXTRAVERSION = |
12 | NAME = Merciless Moray |
13 | |
14 | diff --git a/arch/um/drivers/vector_transports.c b/arch/um/drivers/vector_transports.c |
15 | index 9065047f844b..77e4ebc206ae 100644 |
16 | --- a/arch/um/drivers/vector_transports.c |
17 | +++ b/arch/um/drivers/vector_transports.c |
18 | @@ -120,7 +120,8 @@ static int raw_form_header(uint8_t *header, |
19 | skb, |
20 | vheader, |
21 | virtio_legacy_is_little_endian(), |
22 | - false |
23 | + false, |
24 | + 0 |
25 | ); |
26 | |
27 | return 0; |
28 | diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h |
29 | index 08acd954f00e..74a9e06b6cfd 100644 |
30 | --- a/arch/x86/include/asm/apic.h |
31 | +++ b/arch/x86/include/asm/apic.h |
32 | @@ -436,6 +436,8 @@ static inline void apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v)) {} |
33 | |
34 | #endif /* CONFIG_X86_LOCAL_APIC */ |
35 | |
36 | +extern void apic_ack_irq(struct irq_data *data); |
37 | + |
38 | static inline void ack_APIC_irq(void) |
39 | { |
40 | /* |
41 | diff --git a/arch/x86/include/asm/trace/irq_vectors.h b/arch/x86/include/asm/trace/irq_vectors.h |
42 | index 22647a642e98..0af81b590a0c 100644 |
43 | --- a/arch/x86/include/asm/trace/irq_vectors.h |
44 | +++ b/arch/x86/include/asm/trace/irq_vectors.h |
45 | @@ -236,7 +236,7 @@ TRACE_EVENT(vector_alloc, |
46 | TP_PROTO(unsigned int irq, unsigned int vector, bool reserved, |
47 | int ret), |
48 | |
49 | - TP_ARGS(irq, vector, ret, reserved), |
50 | + TP_ARGS(irq, vector, reserved, ret), |
51 | |
52 | TP_STRUCT__entry( |
53 | __field( unsigned int, irq ) |
54 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c |
55 | index 7553819c74c3..3982f79d2377 100644 |
56 | --- a/arch/x86/kernel/apic/io_apic.c |
57 | +++ b/arch/x86/kernel/apic/io_apic.c |
58 | @@ -1851,7 +1851,7 @@ static void ioapic_ir_ack_level(struct irq_data *irq_data) |
59 | * intr-remapping table entry. Hence for the io-apic |
60 | * EOI we use the pin number. |
61 | */ |
62 | - ack_APIC_irq(); |
63 | + apic_ack_irq(irq_data); |
64 | eoi_ioapic_pin(data->entry.vector, data); |
65 | } |
66 | |
67 | diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c |
68 | index bb6f7a2148d7..b708f597eee3 100644 |
69 | --- a/arch/x86/kernel/apic/vector.c |
70 | +++ b/arch/x86/kernel/apic/vector.c |
71 | @@ -235,6 +235,15 @@ static int allocate_vector(struct irq_data *irqd, const struct cpumask *dest) |
72 | if (vector && cpu_online(cpu) && cpumask_test_cpu(cpu, dest)) |
73 | return 0; |
74 | |
75 | + /* |
76 | + * Careful here. @apicd might either have move_in_progress set or |
77 | + * be enqueued for cleanup. Assigning a new vector would either |
78 | + * leave a stale vector on some CPU around or in case of a pending |
79 | + * cleanup corrupt the hlist. |
80 | + */ |
81 | + if (apicd->move_in_progress || !hlist_unhashed(&apicd->clist)) |
82 | + return -EBUSY; |
83 | + |
84 | vector = irq_matrix_alloc(vector_matrix, dest, resvd, &cpu); |
85 | if (vector > 0) |
86 | apic_update_vector(irqd, vector, cpu); |
87 | @@ -800,13 +809,18 @@ static int apic_retrigger_irq(struct irq_data *irqd) |
88 | return 1; |
89 | } |
90 | |
91 | -void apic_ack_edge(struct irq_data *irqd) |
92 | +void apic_ack_irq(struct irq_data *irqd) |
93 | { |
94 | - irq_complete_move(irqd_cfg(irqd)); |
95 | irq_move_irq(irqd); |
96 | ack_APIC_irq(); |
97 | } |
98 | |
99 | +void apic_ack_edge(struct irq_data *irqd) |
100 | +{ |
101 | + irq_complete_move(irqd_cfg(irqd)); |
102 | + apic_ack_irq(irqd); |
103 | +} |
104 | + |
105 | static struct irq_chip lapic_controller = { |
106 | .name = "APIC", |
107 | .irq_ack = apic_ack_edge, |
108 | diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c |
109 | index 589b948e6e01..316a8875bd90 100644 |
110 | --- a/arch/x86/kernel/cpu/intel_rdt.c |
111 | +++ b/arch/x86/kernel/cpu/intel_rdt.c |
112 | @@ -821,6 +821,8 @@ static __init void rdt_quirks(void) |
113 | case INTEL_FAM6_SKYLAKE_X: |
114 | if (boot_cpu_data.x86_stepping <= 4) |
115 | set_rdt_options("!cmt,!mbmtotal,!mbmlocal,!l3cat"); |
116 | + else |
117 | + set_rdt_options("!l3cat"); |
118 | } |
119 | } |
120 | |
121 | diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c |
122 | index 475cb4f5f14f..c805a06e14c3 100644 |
123 | --- a/arch/x86/kernel/cpu/mcheck/mce-inject.c |
124 | +++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c |
125 | @@ -48,7 +48,7 @@ static struct dentry *dfs_inj; |
126 | |
127 | static u8 n_banks; |
128 | |
129 | -#define MAX_FLAG_OPT_SIZE 3 |
130 | +#define MAX_FLAG_OPT_SIZE 4 |
131 | #define NBCFG 0x44 |
132 | |
133 | enum injection_type { |
134 | diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c |
135 | index e4cb9f4cde8a..fc13cbbb2dce 100644 |
136 | --- a/arch/x86/platform/uv/uv_irq.c |
137 | +++ b/arch/x86/platform/uv/uv_irq.c |
138 | @@ -47,11 +47,6 @@ static void uv_program_mmr(struct irq_cfg *cfg, struct uv_irq_2_mmr_pnode *info) |
139 | |
140 | static void uv_noop(struct irq_data *data) { } |
141 | |
142 | -static void uv_ack_apic(struct irq_data *data) |
143 | -{ |
144 | - ack_APIC_irq(); |
145 | -} |
146 | - |
147 | static int |
148 | uv_set_irq_affinity(struct irq_data *data, const struct cpumask *mask, |
149 | bool force) |
150 | @@ -73,7 +68,7 @@ static struct irq_chip uv_irq_chip = { |
151 | .name = "UV-CORE", |
152 | .irq_mask = uv_noop, |
153 | .irq_unmask = uv_noop, |
154 | - .irq_eoi = uv_ack_apic, |
155 | + .irq_eoi = apic_ack_irq, |
156 | .irq_set_affinity = uv_set_irq_affinity, |
157 | }; |
158 | |
159 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
160 | index 9ce9cac16c3f..90ffd8151c57 100644 |
161 | --- a/block/blk-mq.c |
162 | +++ b/block/blk-mq.c |
163 | @@ -2473,7 +2473,6 @@ static void blk_mq_del_queue_tag_set(struct request_queue *q) |
164 | |
165 | mutex_lock(&set->tag_list_lock); |
166 | list_del_rcu(&q->tag_set_list); |
167 | - INIT_LIST_HEAD(&q->tag_set_list); |
168 | if (list_is_singular(&set->tag_list)) { |
169 | /* just transitioned to unshared */ |
170 | set->flags &= ~BLK_MQ_F_TAG_SHARED; |
171 | @@ -2481,8 +2480,8 @@ static void blk_mq_del_queue_tag_set(struct request_queue *q) |
172 | blk_mq_update_tag_set_depth(set, false); |
173 | } |
174 | mutex_unlock(&set->tag_list_lock); |
175 | - |
176 | synchronize_rcu(); |
177 | + INIT_LIST_HEAD(&q->tag_set_list); |
178 | } |
179 | |
180 | static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set, |
181 | diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c |
182 | index 68422afc365f..bc5f05906bd1 100644 |
183 | --- a/drivers/acpi/acpica/psloop.c |
184 | +++ b/drivers/acpi/acpica/psloop.c |
185 | @@ -515,6 +515,22 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state) |
186 | if (ACPI_FAILURE(status)) { |
187 | return_ACPI_STATUS(status); |
188 | } |
189 | + if (walk_state->opcode == AML_SCOPE_OP) { |
190 | + /* |
191 | + * If the scope op fails to parse, skip the body of the |
192 | + * scope op because the parse failure indicates that the |
193 | + * device may not exist. |
194 | + */ |
195 | + walk_state->parser_state.aml = |
196 | + walk_state->aml + 1; |
197 | + walk_state->parser_state.aml = |
198 | + acpi_ps_get_next_package_end |
199 | + (&walk_state->parser_state); |
200 | + walk_state->aml = |
201 | + walk_state->parser_state.aml; |
202 | + ACPI_ERROR((AE_INFO, |
203 | + "Skipping Scope block")); |
204 | + } |
205 | |
206 | continue; |
207 | } |
208 | @@ -557,7 +573,40 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state) |
209 | if (ACPI_FAILURE(status)) { |
210 | return_ACPI_STATUS(status); |
211 | } |
212 | - |
213 | + if ((walk_state->control_state) && |
214 | + ((walk_state->control_state->control. |
215 | + opcode == AML_IF_OP) |
216 | + || (walk_state->control_state->control. |
217 | + opcode == AML_WHILE_OP))) { |
218 | + /* |
219 | + * If the if/while op fails to parse, we will skip parsing |
220 | + * the body of the op. |
221 | + */ |
222 | + parser_state->aml = |
223 | + walk_state->control_state->control. |
224 | + aml_predicate_start + 1; |
225 | + parser_state->aml = |
226 | + acpi_ps_get_next_package_end |
227 | + (parser_state); |
228 | + walk_state->aml = parser_state->aml; |
229 | + |
230 | + ACPI_ERROR((AE_INFO, |
231 | + "Skipping While/If block")); |
232 | + if (*walk_state->aml == AML_ELSE_OP) { |
233 | + ACPI_ERROR((AE_INFO, |
234 | + "Skipping Else block")); |
235 | + walk_state->parser_state.aml = |
236 | + walk_state->aml + 1; |
237 | + walk_state->parser_state.aml = |
238 | + acpi_ps_get_next_package_end |
239 | + (parser_state); |
240 | + walk_state->aml = |
241 | + parser_state->aml; |
242 | + } |
243 | + ACPI_FREE(acpi_ut_pop_generic_state |
244 | + (&walk_state->control_state)); |
245 | + } |
246 | + op = NULL; |
247 | continue; |
248 | } |
249 | } |
250 | diff --git a/drivers/acpi/acpica/psobject.c b/drivers/acpi/acpica/psobject.c |
251 | index 7d9d0151ee54..3138e7a00da8 100644 |
252 | --- a/drivers/acpi/acpica/psobject.c |
253 | +++ b/drivers/acpi/acpica/psobject.c |
254 | @@ -12,6 +12,7 @@ |
255 | #include "acparser.h" |
256 | #include "amlcode.h" |
257 | #include "acconvert.h" |
258 | +#include "acnamesp.h" |
259 | |
260 | #define _COMPONENT ACPI_PARSER |
261 | ACPI_MODULE_NAME("psobject") |
262 | @@ -549,6 +550,21 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state, |
263 | |
264 | do { |
265 | if (*op) { |
266 | + /* |
267 | + * These Opcodes need to be removed from the namespace because they |
268 | + * get created even if these opcodes cannot be created due to |
269 | + * errors. |
270 | + */ |
271 | + if (((*op)->common.aml_opcode == AML_REGION_OP) |
272 | + || ((*op)->common.aml_opcode == |
273 | + AML_DATA_REGION_OP)) { |
274 | + acpi_ns_delete_children((*op)->common. |
275 | + node); |
276 | + acpi_ns_remove_node((*op)->common.node); |
277 | + (*op)->common.node = NULL; |
278 | + acpi_ps_delete_parse_tree(*op); |
279 | + } |
280 | + |
281 | status2 = |
282 | acpi_ps_complete_this_op(walk_state, *op); |
283 | if (ACPI_FAILURE(status2)) { |
284 | @@ -574,6 +590,20 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state, |
285 | #endif |
286 | walk_state->prev_op = NULL; |
287 | walk_state->prev_arg_types = walk_state->arg_types; |
288 | + |
289 | + if (walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL) { |
290 | + /* |
291 | + * There was something that went wrong while executing code at the |
292 | + * module-level. We need to skip parsing whatever caused the |
293 | + * error and keep going. One runtime error during the table load |
294 | + * should not cause the entire table to not be loaded. This is |
295 | + * because there could be correct AML beyond the parts that caused |
296 | + * the runtime error. |
297 | + */ |
298 | + ACPI_ERROR((AE_INFO, |
299 | + "Ignore error and continue table load")); |
300 | + return_ACPI_STATUS(AE_OK); |
301 | + } |
302 | return_ACPI_STATUS(status); |
303 | } |
304 | |
305 | diff --git a/drivers/acpi/acpica/uterror.c b/drivers/acpi/acpica/uterror.c |
306 | index 12d4a0f6b8d2..5a64ddaed8a3 100644 |
307 | --- a/drivers/acpi/acpica/uterror.c |
308 | +++ b/drivers/acpi/acpica/uterror.c |
309 | @@ -182,20 +182,20 @@ acpi_ut_prefixed_namespace_error(const char *module_name, |
310 | switch (lookup_status) { |
311 | case AE_ALREADY_EXISTS: |
312 | |
313 | - acpi_os_printf(ACPI_MSG_BIOS_ERROR); |
314 | + acpi_os_printf("\n" ACPI_MSG_BIOS_ERROR); |
315 | message = "Failure creating"; |
316 | break; |
317 | |
318 | case AE_NOT_FOUND: |
319 | |
320 | - acpi_os_printf(ACPI_MSG_BIOS_ERROR); |
321 | - message = "Failure looking up"; |
322 | + acpi_os_printf("\n" ACPI_MSG_BIOS_ERROR); |
323 | + message = "Could not resolve"; |
324 | break; |
325 | |
326 | default: |
327 | |
328 | - acpi_os_printf(ACPI_MSG_ERROR); |
329 | - message = "Failure looking up"; |
330 | + acpi_os_printf("\n" ACPI_MSG_ERROR); |
331 | + message = "Failure resolving"; |
332 | break; |
333 | } |
334 | |
335 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
336 | index 346b163f6e89..9bfd2f7e4542 100644 |
337 | --- a/drivers/ata/libata-core.c |
338 | +++ b/drivers/ata/libata-core.c |
339 | @@ -4557,9 +4557,6 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
340 | { "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM, }, |
341 | { "SAMSUNG SSD PM830 mSATA *", "CXM13D1Q", ATA_HORKAGE_NOLPM, }, |
342 | |
343 | - /* Sandisk devices which are known to not handle LPM well */ |
344 | - { "SanDisk SD7UB3Q*G1001", NULL, ATA_HORKAGE_NOLPM, }, |
345 | - |
346 | /* devices that don't properly handle queued TRIM commands */ |
347 | { "Micron_M500IT_*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | |
348 | ATA_HORKAGE_ZERO_AFTER_TRIM, }, |
349 | diff --git a/drivers/ata/libata-zpodd.c b/drivers/ata/libata-zpodd.c |
350 | index de4ddd0e8550..b3ed8f9953a8 100644 |
351 | --- a/drivers/ata/libata-zpodd.c |
352 | +++ b/drivers/ata/libata-zpodd.c |
353 | @@ -35,7 +35,7 @@ struct zpodd { |
354 | static int eject_tray(struct ata_device *dev) |
355 | { |
356 | struct ata_taskfile tf; |
357 | - static const char cdb[] = { GPCMD_START_STOP_UNIT, |
358 | + static const char cdb[ATAPI_CDB_LEN] = { GPCMD_START_STOP_UNIT, |
359 | 0, 0, 0, |
360 | 0x02, /* LoEj */ |
361 | 0, 0, 0, 0, 0, 0, 0, |
362 | diff --git a/drivers/base/core.c b/drivers/base/core.c |
363 | index b610816eb887..d680fd030316 100644 |
364 | --- a/drivers/base/core.c |
365 | +++ b/drivers/base/core.c |
366 | @@ -1467,7 +1467,7 @@ class_dir_create_and_add(struct class *class, struct kobject *parent_kobj) |
367 | |
368 | dir = kzalloc(sizeof(*dir), GFP_KERNEL); |
369 | if (!dir) |
370 | - return NULL; |
371 | + return ERR_PTR(-ENOMEM); |
372 | |
373 | dir->class = class; |
374 | kobject_init(&dir->kobj, &class_dir_ktype); |
375 | @@ -1477,7 +1477,7 @@ class_dir_create_and_add(struct class *class, struct kobject *parent_kobj) |
376 | retval = kobject_add(&dir->kobj, parent_kobj, "%s", class->name); |
377 | if (retval < 0) { |
378 | kobject_put(&dir->kobj); |
379 | - return NULL; |
380 | + return ERR_PTR(retval); |
381 | } |
382 | return &dir->kobj; |
383 | } |
384 | @@ -1784,6 +1784,10 @@ int device_add(struct device *dev) |
385 | |
386 | parent = get_device(dev->parent); |
387 | kobj = get_device_parent(dev, parent); |
388 | + if (IS_ERR(kobj)) { |
389 | + error = PTR_ERR(kobj); |
390 | + goto parent_error; |
391 | + } |
392 | if (kobj) |
393 | dev->kobj.parent = kobj; |
394 | |
395 | @@ -1882,6 +1886,7 @@ int device_add(struct device *dev) |
396 | kobject_del(&dev->kobj); |
397 | Error: |
398 | cleanup_glue_dir(dev, glue_dir); |
399 | +parent_error: |
400 | put_device(parent); |
401 | name_error: |
402 | kfree(dev->p); |
403 | @@ -2701,6 +2706,11 @@ int device_move(struct device *dev, struct device *new_parent, |
404 | device_pm_lock(); |
405 | new_parent = get_device(new_parent); |
406 | new_parent_kobj = get_device_parent(dev, new_parent); |
407 | + if (IS_ERR(new_parent_kobj)) { |
408 | + error = PTR_ERR(new_parent_kobj); |
409 | + put_device(new_parent); |
410 | + goto out; |
411 | + } |
412 | |
413 | pr_debug("device: '%s': %s: moving to '%s'\n", dev_name(dev), |
414 | __func__, new_parent ? dev_name(new_parent) : "<NULL>"); |
415 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c |
416 | index afbc202ca6fd..64278f472efe 100644 |
417 | --- a/drivers/block/nbd.c |
418 | +++ b/drivers/block/nbd.c |
419 | @@ -173,9 +173,12 @@ static const struct device_attribute pid_attr = { |
420 | static void nbd_dev_remove(struct nbd_device *nbd) |
421 | { |
422 | struct gendisk *disk = nbd->disk; |
423 | + struct request_queue *q; |
424 | + |
425 | if (disk) { |
426 | + q = disk->queue; |
427 | del_gendisk(disk); |
428 | - blk_cleanup_queue(disk->queue); |
429 | + blk_cleanup_queue(q); |
430 | blk_mq_free_tag_set(&nbd->tag_set); |
431 | disk->private_data = NULL; |
432 | put_disk(disk); |
433 | @@ -231,9 +234,18 @@ static void nbd_size_clear(struct nbd_device *nbd) |
434 | static void nbd_size_update(struct nbd_device *nbd) |
435 | { |
436 | struct nbd_config *config = nbd->config; |
437 | + struct block_device *bdev = bdget_disk(nbd->disk, 0); |
438 | + |
439 | blk_queue_logical_block_size(nbd->disk->queue, config->blksize); |
440 | blk_queue_physical_block_size(nbd->disk->queue, config->blksize); |
441 | set_capacity(nbd->disk, config->bytesize >> 9); |
442 | + if (bdev) { |
443 | + if (bdev->bd_disk) |
444 | + bd_set_size(bdev, config->bytesize); |
445 | + else |
446 | + bdev->bd_invalidated = 1; |
447 | + bdput(bdev); |
448 | + } |
449 | kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); |
450 | } |
451 | |
452 | @@ -243,6 +255,8 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize, |
453 | struct nbd_config *config = nbd->config; |
454 | config->blksize = blocksize; |
455 | config->bytesize = blocksize * nr_blocks; |
456 | + if (nbd->task_recv != NULL) |
457 | + nbd_size_update(nbd); |
458 | } |
459 | |
460 | static void nbd_complete_rq(struct request *req) |
461 | @@ -1109,7 +1123,6 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *b |
462 | if (ret) |
463 | return ret; |
464 | |
465 | - bd_set_size(bdev, config->bytesize); |
466 | if (max_part) |
467 | bdev->bd_invalidated = 1; |
468 | mutex_unlock(&nbd->config_lock); |
469 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c |
470 | index 075d18f6ba7a..54d4c0f999ec 100644 |
471 | --- a/drivers/cpufreq/cpufreq.c |
472 | +++ b/drivers/cpufreq/cpufreq.c |
473 | @@ -696,6 +696,8 @@ static ssize_t store_##file_name \ |
474 | struct cpufreq_policy new_policy; \ |
475 | \ |
476 | memcpy(&new_policy, policy, sizeof(*policy)); \ |
477 | + new_policy.min = policy->user_policy.min; \ |
478 | + new_policy.max = policy->user_policy.max; \ |
479 | \ |
480 | ret = sscanf(buf, "%u", &new_policy.object); \ |
481 | if (ret != 1) \ |
482 | diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c |
483 | index ca38229b045a..43e14bb512c8 100644 |
484 | --- a/drivers/cpufreq/cpufreq_governor.c |
485 | +++ b/drivers/cpufreq/cpufreq_governor.c |
486 | @@ -165,7 +165,7 @@ unsigned int dbs_update(struct cpufreq_policy *policy) |
487 | * calls, so the previous load value can be used then. |
488 | */ |
489 | load = j_cdbs->prev_load; |
490 | - } else if (unlikely(time_elapsed > 2 * sampling_rate && |
491 | + } else if (unlikely((int)idle_time > 2 * sampling_rate && |
492 | j_cdbs->prev_load)) { |
493 | /* |
494 | * If the CPU had gone completely idle and a task has |
495 | @@ -185,10 +185,8 @@ unsigned int dbs_update(struct cpufreq_policy *policy) |
496 | * clear prev_load to guarantee that the load will be |
497 | * computed again next time. |
498 | * |
499 | - * Detecting this situation is easy: the governor's |
500 | - * utilization update handler would not have run during |
501 | - * CPU-idle periods. Hence, an unusually large |
502 | - * 'time_elapsed' (as compared to the sampling rate) |
503 | + * Detecting this situation is easy: an unusually large |
504 | + * 'idle_time' (as compared to the sampling rate) |
505 | * indicates this scenario. |
506 | */ |
507 | load = j_cdbs->prev_load; |
508 | @@ -217,8 +215,8 @@ unsigned int dbs_update(struct cpufreq_policy *policy) |
509 | j_cdbs->prev_load = load; |
510 | } |
511 | |
512 | - if (time_elapsed > 2 * sampling_rate) { |
513 | - unsigned int periods = time_elapsed / sampling_rate; |
514 | + if (unlikely((int)idle_time > 2 * sampling_rate)) { |
515 | + unsigned int periods = idle_time / sampling_rate; |
516 | |
517 | if (periods < idle_periods) |
518 | idle_periods = periods; |
519 | diff --git a/drivers/cpufreq/ti-cpufreq.c b/drivers/cpufreq/ti-cpufreq.c |
520 | index 6ba709b6f095..896caba5dfe5 100644 |
521 | --- a/drivers/cpufreq/ti-cpufreq.c |
522 | +++ b/drivers/cpufreq/ti-cpufreq.c |
523 | @@ -226,7 +226,7 @@ static int ti_cpufreq_probe(struct platform_device *pdev) |
524 | opp_data->cpu_dev = get_cpu_device(0); |
525 | if (!opp_data->cpu_dev) { |
526 | pr_err("%s: Failed to get device for CPU0\n", __func__); |
527 | - ret = ENODEV; |
528 | + ret = -ENODEV; |
529 | goto free_opp_data; |
530 | } |
531 | |
532 | diff --git a/drivers/hid/intel-ish-hid/ipc/pci-ish.c b/drivers/hid/intel-ish-hid/ipc/pci-ish.c |
533 | index 582e449be9fe..a2c53ea3b5ed 100644 |
534 | --- a/drivers/hid/intel-ish-hid/ipc/pci-ish.c |
535 | +++ b/drivers/hid/intel-ish-hid/ipc/pci-ish.c |
536 | @@ -205,8 +205,7 @@ static void ish_remove(struct pci_dev *pdev) |
537 | kfree(ishtp_dev); |
538 | } |
539 | |
540 | -#ifdef CONFIG_PM |
541 | -static struct device *ish_resume_device; |
542 | +static struct device __maybe_unused *ish_resume_device; |
543 | |
544 | /* 50ms to get resume response */ |
545 | #define WAIT_FOR_RESUME_ACK_MS 50 |
546 | @@ -220,7 +219,7 @@ static struct device *ish_resume_device; |
547 | * in that case a simple resume message is enough, others we need |
548 | * a reset sequence. |
549 | */ |
550 | -static void ish_resume_handler(struct work_struct *work) |
551 | +static void __maybe_unused ish_resume_handler(struct work_struct *work) |
552 | { |
553 | struct pci_dev *pdev = to_pci_dev(ish_resume_device); |
554 | struct ishtp_device *dev = pci_get_drvdata(pdev); |
555 | @@ -262,7 +261,7 @@ static void ish_resume_handler(struct work_struct *work) |
556 | * |
557 | * Return: 0 to the pm core |
558 | */ |
559 | -static int ish_suspend(struct device *device) |
560 | +static int __maybe_unused ish_suspend(struct device *device) |
561 | { |
562 | struct pci_dev *pdev = to_pci_dev(device); |
563 | struct ishtp_device *dev = pci_get_drvdata(pdev); |
564 | @@ -288,7 +287,7 @@ static int ish_suspend(struct device *device) |
565 | return 0; |
566 | } |
567 | |
568 | -static DECLARE_WORK(resume_work, ish_resume_handler); |
569 | +static __maybe_unused DECLARE_WORK(resume_work, ish_resume_handler); |
570 | /** |
571 | * ish_resume() - ISH resume callback |
572 | * @device: device pointer |
573 | @@ -297,7 +296,7 @@ static DECLARE_WORK(resume_work, ish_resume_handler); |
574 | * |
575 | * Return: 0 to the pm core |
576 | */ |
577 | -static int ish_resume(struct device *device) |
578 | +static int __maybe_unused ish_resume(struct device *device) |
579 | { |
580 | struct pci_dev *pdev = to_pci_dev(device); |
581 | struct ishtp_device *dev = pci_get_drvdata(pdev); |
582 | @@ -311,21 +310,14 @@ static int ish_resume(struct device *device) |
583 | return 0; |
584 | } |
585 | |
586 | -static const struct dev_pm_ops ish_pm_ops = { |
587 | - .suspend = ish_suspend, |
588 | - .resume = ish_resume, |
589 | -}; |
590 | -#define ISHTP_ISH_PM_OPS (&ish_pm_ops) |
591 | -#else |
592 | -#define ISHTP_ISH_PM_OPS NULL |
593 | -#endif /* CONFIG_PM */ |
594 | +static SIMPLE_DEV_PM_OPS(ish_pm_ops, ish_suspend, ish_resume); |
595 | |
596 | static struct pci_driver ish_driver = { |
597 | .name = KBUILD_MODNAME, |
598 | .id_table = ish_pci_tbl, |
599 | .probe = ish_probe, |
600 | .remove = ish_remove, |
601 | - .driver.pm = ISHTP_ISH_PM_OPS, |
602 | + .driver.pm = &ish_pm_ops, |
603 | }; |
604 | |
605 | module_pci_driver(ish_driver); |
606 | diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c |
607 | index ee7a37eb159a..545986cfb978 100644 |
608 | --- a/drivers/hid/wacom_sys.c |
609 | +++ b/drivers/hid/wacom_sys.c |
610 | @@ -395,6 +395,14 @@ static void wacom_usage_mapping(struct hid_device *hdev, |
611 | } |
612 | } |
613 | |
614 | + /* 2nd-generation Intuos Pro Large has incorrect Y maximum */ |
615 | + if (hdev->vendor == USB_VENDOR_ID_WACOM && |
616 | + hdev->product == 0x0358 && |
617 | + WACOM_PEN_FIELD(field) && |
618 | + wacom_equivalent_usage(usage->hid) == HID_GD_Y) { |
619 | + field->logical_maximum = 43200; |
620 | + } |
621 | + |
622 | switch (usage->hid) { |
623 | case HID_GD_X: |
624 | features->x_max = field->logical_maximum; |
625 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
626 | index 8fb8c737fffe..b0b30a568db7 100644 |
627 | --- a/drivers/iommu/amd_iommu.c |
628 | +++ b/drivers/iommu/amd_iommu.c |
629 | @@ -4379,7 +4379,7 @@ static void ir_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg) |
630 | |
631 | static struct irq_chip amd_ir_chip = { |
632 | .name = "AMD-IR", |
633 | - .irq_ack = ir_ack_apic_edge, |
634 | + .irq_ack = apic_ack_irq, |
635 | .irq_set_affinity = amd_ir_set_affinity, |
636 | .irq_set_vcpu_affinity = amd_ir_set_vcpu_affinity, |
637 | .irq_compose_msi_msg = ir_compose_msi_msg, |
638 | diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c |
639 | index 3062a154a9fb..967450bd421a 100644 |
640 | --- a/drivers/iommu/intel_irq_remapping.c |
641 | +++ b/drivers/iommu/intel_irq_remapping.c |
642 | @@ -1223,7 +1223,7 @@ static int intel_ir_set_vcpu_affinity(struct irq_data *data, void *info) |
643 | |
644 | static struct irq_chip intel_ir_chip = { |
645 | .name = "INTEL-IR", |
646 | - .irq_ack = ir_ack_apic_edge, |
647 | + .irq_ack = apic_ack_irq, |
648 | .irq_set_affinity = intel_ir_set_affinity, |
649 | .irq_compose_msi_msg = intel_ir_compose_msi_msg, |
650 | .irq_set_vcpu_affinity = intel_ir_set_vcpu_affinity, |
651 | diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c |
652 | index 496deee3ae3a..7d0f3074d41d 100644 |
653 | --- a/drivers/iommu/irq_remapping.c |
654 | +++ b/drivers/iommu/irq_remapping.c |
655 | @@ -156,11 +156,6 @@ void panic_if_irq_remap(const char *msg) |
656 | panic(msg); |
657 | } |
658 | |
659 | -void ir_ack_apic_edge(struct irq_data *data) |
660 | -{ |
661 | - ack_APIC_irq(); |
662 | -} |
663 | - |
664 | /** |
665 | * irq_remapping_get_ir_irq_domain - Get the irqdomain associated with the IOMMU |
666 | * device serving request @info |
667 | diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h |
668 | index 039c7af7b190..0afef6e43be4 100644 |
669 | --- a/drivers/iommu/irq_remapping.h |
670 | +++ b/drivers/iommu/irq_remapping.h |
671 | @@ -65,8 +65,6 @@ struct irq_remap_ops { |
672 | extern struct irq_remap_ops intel_irq_remap_ops; |
673 | extern struct irq_remap_ops amd_iommu_irq_ops; |
674 | |
675 | -extern void ir_ack_apic_edge(struct irq_data *data); |
676 | - |
677 | #else /* CONFIG_IRQ_REMAP */ |
678 | |
679 | #define irq_remapping_enabled 0 |
680 | diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c |
681 | index b67be33bd62f..cea7b2d2e60a 100644 |
682 | --- a/drivers/media/rc/rc-main.c |
683 | +++ b/drivers/media/rc/rc-main.c |
684 | @@ -1860,6 +1860,8 @@ int rc_register_device(struct rc_dev *dev) |
685 | dev->device_name ?: "Unspecified device", path ?: "N/A"); |
686 | kfree(path); |
687 | |
688 | + dev->registered = true; |
689 | + |
690 | if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { |
691 | rc = rc_setup_rx_device(dev); |
692 | if (rc) |
693 | @@ -1879,8 +1881,6 @@ int rc_register_device(struct rc_dev *dev) |
694 | goto out_lirc; |
695 | } |
696 | |
697 | - dev->registered = true; |
698 | - |
699 | dev_dbg(&dev->dev, "Registered rc%u (driver: %s)\n", dev->minor, |
700 | dev->driver_name ? dev->driver_name : "unknown"); |
701 | |
702 | diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c |
703 | index 102594ec3e97..a36b4fb949fa 100644 |
704 | --- a/drivers/media/usb/uvc/uvc_ctrl.c |
705 | +++ b/drivers/media/usb/uvc/uvc_ctrl.c |
706 | @@ -1607,14 +1607,12 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev, |
707 | ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum, |
708 | info->selector, data, 1); |
709 | if (!ret) |
710 | - info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
711 | - | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF |
712 | - | (data[0] & UVC_CONTROL_CAP_GET ? |
713 | - UVC_CTRL_FLAG_GET_CUR : 0) |
714 | - | (data[0] & UVC_CONTROL_CAP_SET ? |
715 | - UVC_CTRL_FLAG_SET_CUR : 0) |
716 | - | (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ? |
717 | - UVC_CTRL_FLAG_AUTO_UPDATE : 0); |
718 | + info->flags |= (data[0] & UVC_CONTROL_CAP_GET ? |
719 | + UVC_CTRL_FLAG_GET_CUR : 0) |
720 | + | (data[0] & UVC_CONTROL_CAP_SET ? |
721 | + UVC_CTRL_FLAG_SET_CUR : 0) |
722 | + | (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ? |
723 | + UVC_CTRL_FLAG_AUTO_UPDATE : 0); |
724 | |
725 | kfree(data); |
726 | return ret; |
727 | @@ -1689,6 +1687,9 @@ static int uvc_ctrl_fill_xu_info(struct uvc_device *dev, |
728 | |
729 | info->size = le16_to_cpup((__le16 *)data); |
730 | |
731 | + info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX |
732 | + | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF; |
733 | + |
734 | ret = uvc_ctrl_get_flags(dev, ctrl, info); |
735 | if (ret < 0) { |
736 | uvc_trace(UVC_TRACE_CONTROL, |
737 | diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c |
738 | index 58c705f24f96..b594bae1adbd 100644 |
739 | --- a/drivers/net/bonding/bond_options.c |
740 | +++ b/drivers/net/bonding/bond_options.c |
741 | @@ -1142,6 +1142,7 @@ static int bond_option_primary_set(struct bonding *bond, |
742 | slave->dev->name); |
743 | rcu_assign_pointer(bond->primary_slave, slave); |
744 | strcpy(bond->params.primary, slave->dev->name); |
745 | + bond->force_primary = true; |
746 | bond_select_active_slave(bond); |
747 | goto out; |
748 | } |
749 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c |
750 | index a50e08bb4748..750007513f9d 100644 |
751 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c |
752 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c |
753 | @@ -267,14 +267,13 @@ static int aq_pci_probe(struct pci_dev *pdev, |
754 | numvecs = min(numvecs, num_online_cpus()); |
755 | /*enable interrupts */ |
756 | #if !AQ_CFG_FORCE_LEGACY_INT |
757 | - numvecs = pci_alloc_irq_vectors(self->pdev, 1, numvecs, |
758 | - PCI_IRQ_MSIX | PCI_IRQ_MSI | |
759 | - PCI_IRQ_LEGACY); |
760 | + err = pci_alloc_irq_vectors(self->pdev, 1, numvecs, |
761 | + PCI_IRQ_MSIX | PCI_IRQ_MSI | |
762 | + PCI_IRQ_LEGACY); |
763 | |
764 | - if (numvecs < 0) { |
765 | - err = numvecs; |
766 | + if (err < 0) |
767 | goto err_hwinit; |
768 | - } |
769 | + numvecs = err; |
770 | #endif |
771 | self->irqvecs = numvecs; |
772 | |
773 | diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c |
774 | index da07ccdf84bf..eb8dccd24abf 100644 |
775 | --- a/drivers/net/hyperv/netvsc_drv.c |
776 | +++ b/drivers/net/hyperv/netvsc_drv.c |
777 | @@ -126,8 +126,10 @@ static int netvsc_open(struct net_device *net) |
778 | } |
779 | |
780 | rdev = nvdev->extension; |
781 | - if (!rdev->link_state) |
782 | + if (!rdev->link_state) { |
783 | netif_carrier_on(net); |
784 | + netif_tx_wake_all_queues(net); |
785 | + } |
786 | |
787 | if (vf_netdev) { |
788 | /* Setting synthetic device up transparently sets |
789 | diff --git a/drivers/net/phy/dp83848.c b/drivers/net/phy/dp83848.c |
790 | index cd09c3af2117..6e8e42361fd5 100644 |
791 | --- a/drivers/net/phy/dp83848.c |
792 | +++ b/drivers/net/phy/dp83848.c |
793 | @@ -74,6 +74,25 @@ static int dp83848_config_intr(struct phy_device *phydev) |
794 | return phy_write(phydev, DP83848_MICR, control); |
795 | } |
796 | |
797 | +static int dp83848_config_init(struct phy_device *phydev) |
798 | +{ |
799 | + int err; |
800 | + int val; |
801 | + |
802 | + err = genphy_config_init(phydev); |
803 | + if (err < 0) |
804 | + return err; |
805 | + |
806 | + /* DP83620 always reports Auto Negotiation Ability on BMSR. Instead, |
807 | + * we check initial value of BMCR Auto negotiation enable bit |
808 | + */ |
809 | + val = phy_read(phydev, MII_BMCR); |
810 | + if (!(val & BMCR_ANENABLE)) |
811 | + phydev->autoneg = AUTONEG_DISABLE; |
812 | + |
813 | + return 0; |
814 | +} |
815 | + |
816 | static struct mdio_device_id __maybe_unused dp83848_tbl[] = { |
817 | { TI_DP83848C_PHY_ID, 0xfffffff0 }, |
818 | { NS_DP83848C_PHY_ID, 0xfffffff0 }, |
819 | @@ -83,7 +102,7 @@ static struct mdio_device_id __maybe_unused dp83848_tbl[] = { |
820 | }; |
821 | MODULE_DEVICE_TABLE(mdio, dp83848_tbl); |
822 | |
823 | -#define DP83848_PHY_DRIVER(_id, _name) \ |
824 | +#define DP83848_PHY_DRIVER(_id, _name, _config_init) \ |
825 | { \ |
826 | .phy_id = _id, \ |
827 | .phy_id_mask = 0xfffffff0, \ |
828 | @@ -92,7 +111,7 @@ MODULE_DEVICE_TABLE(mdio, dp83848_tbl); |
829 | .flags = PHY_HAS_INTERRUPT, \ |
830 | \ |
831 | .soft_reset = genphy_soft_reset, \ |
832 | - .config_init = genphy_config_init, \ |
833 | + .config_init = _config_init, \ |
834 | .suspend = genphy_suspend, \ |
835 | .resume = genphy_resume, \ |
836 | \ |
837 | @@ -102,10 +121,14 @@ MODULE_DEVICE_TABLE(mdio, dp83848_tbl); |
838 | } |
839 | |
840 | static struct phy_driver dp83848_driver[] = { |
841 | - DP83848_PHY_DRIVER(TI_DP83848C_PHY_ID, "TI DP83848C 10/100 Mbps PHY"), |
842 | - DP83848_PHY_DRIVER(NS_DP83848C_PHY_ID, "NS DP83848C 10/100 Mbps PHY"), |
843 | - DP83848_PHY_DRIVER(TI_DP83620_PHY_ID, "TI DP83620 10/100 Mbps PHY"), |
844 | - DP83848_PHY_DRIVER(TLK10X_PHY_ID, "TI TLK10X 10/100 Mbps PHY"), |
845 | + DP83848_PHY_DRIVER(TI_DP83848C_PHY_ID, "TI DP83848C 10/100 Mbps PHY", |
846 | + genphy_config_init), |
847 | + DP83848_PHY_DRIVER(NS_DP83848C_PHY_ID, "NS DP83848C 10/100 Mbps PHY", |
848 | + genphy_config_init), |
849 | + DP83848_PHY_DRIVER(TI_DP83620_PHY_ID, "TI DP83620 10/100 Mbps PHY", |
850 | + dp83848_config_init), |
851 | + DP83848_PHY_DRIVER(TLK10X_PHY_ID, "TI TLK10X 10/100 Mbps PHY", |
852 | + genphy_config_init), |
853 | }; |
854 | module_phy_driver(dp83848_driver); |
855 | |
856 | diff --git a/drivers/net/tap.c b/drivers/net/tap.c |
857 | index 9b6cb780affe..f0f7cd977667 100644 |
858 | --- a/drivers/net/tap.c |
859 | +++ b/drivers/net/tap.c |
860 | @@ -774,13 +774,16 @@ static ssize_t tap_put_user(struct tap_queue *q, |
861 | int total; |
862 | |
863 | if (q->flags & IFF_VNET_HDR) { |
864 | + int vlan_hlen = skb_vlan_tag_present(skb) ? VLAN_HLEN : 0; |
865 | struct virtio_net_hdr vnet_hdr; |
866 | + |
867 | vnet_hdr_len = READ_ONCE(q->vnet_hdr_sz); |
868 | if (iov_iter_count(iter) < vnet_hdr_len) |
869 | return -EINVAL; |
870 | |
871 | if (virtio_net_hdr_from_skb(skb, &vnet_hdr, |
872 | - tap_is_little_endian(q), true)) |
873 | + tap_is_little_endian(q), true, |
874 | + vlan_hlen)) |
875 | BUG(); |
876 | |
877 | if (copy_to_iter(&vnet_hdr, sizeof(vnet_hdr), iter) != |
878 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c |
879 | index 23e9eb66197f..409eb8b74740 100644 |
880 | --- a/drivers/net/tun.c |
881 | +++ b/drivers/net/tun.c |
882 | @@ -2078,7 +2078,8 @@ static ssize_t tun_put_user(struct tun_struct *tun, |
883 | return -EINVAL; |
884 | |
885 | if (virtio_net_hdr_from_skb(skb, &gso, |
886 | - tun_is_little_endian(tun), true)) { |
887 | + tun_is_little_endian(tun), true, |
888 | + vlan_hlen)) { |
889 | struct skb_shared_info *sinfo = skb_shinfo(skb); |
890 | pr_err("unexpected GSO type: " |
891 | "0x%x, gso_size %d, hdr_len %d\n", |
892 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c |
893 | index 90d07ed224d5..b0e8b9613054 100644 |
894 | --- a/drivers/net/usb/cdc_ncm.c |
895 | +++ b/drivers/net/usb/cdc_ncm.c |
896 | @@ -1124,7 +1124,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) |
897 | * accordingly. Otherwise, we should check here. |
898 | */ |
899 | if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) |
900 | - delayed_ndp_size = ctx->max_ndp_size; |
901 | + delayed_ndp_size = ALIGN(ctx->max_ndp_size, ctx->tx_ndp_modulus); |
902 | else |
903 | delayed_ndp_size = 0; |
904 | |
905 | @@ -1285,7 +1285,7 @@ cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) |
906 | /* If requested, put NDP at end of frame. */ |
907 | if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) { |
908 | nth16 = (struct usb_cdc_ncm_nth16 *)skb_out->data; |
909 | - cdc_ncm_align_tail(skb_out, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size); |
910 | + cdc_ncm_align_tail(skb_out, ctx->tx_ndp_modulus, 0, ctx->tx_curr_size - ctx->max_ndp_size); |
911 | nth16->wNdpIndex = cpu_to_le16(skb_out->len); |
912 | skb_put_data(skb_out, ctx->delayed_ndp16, ctx->max_ndp_size); |
913 | |
914 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c |
915 | index 032e1ac10a30..8c7207535179 100644 |
916 | --- a/drivers/net/virtio_net.c |
917 | +++ b/drivers/net/virtio_net.c |
918 | @@ -1358,7 +1358,8 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) |
919 | hdr = skb_vnet_hdr(skb); |
920 | |
921 | if (virtio_net_hdr_from_skb(skb, &hdr->hdr, |
922 | - virtio_is_little_endian(vi->vdev), false)) |
923 | + virtio_is_little_endian(vi->vdev), false, |
924 | + 0)) |
925 | BUG(); |
926 | |
927 | if (vi->mergeable_rx_bufs) |
928 | diff --git a/drivers/net/wireless/intel/iwlwifi/fw/paging.c b/drivers/net/wireless/intel/iwlwifi/fw/paging.c |
929 | index 1fec8e3a6b35..6afcfd1f0eec 100644 |
930 | --- a/drivers/net/wireless/intel/iwlwifi/fw/paging.c |
931 | +++ b/drivers/net/wireless/intel/iwlwifi/fw/paging.c |
932 | @@ -8,6 +8,7 @@ |
933 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
934 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
935 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
936 | + * Copyright(c) 2018 Intel Corporation |
937 | * |
938 | * This program is free software; you can redistribute it and/or modify |
939 | * it under the terms of version 2 of the GNU General Public License as |
940 | @@ -30,6 +31,7 @@ |
941 | * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. |
942 | * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH |
943 | * Copyright(c) 2016 - 2017 Intel Deutschland GmbH |
944 | + * Copyright(c) 2018 Intel Corporation |
945 | * All rights reserved. |
946 | * |
947 | * Redistribution and use in source and binary forms, with or without |
948 | @@ -163,7 +165,7 @@ static int iwl_alloc_fw_paging_mem(struct iwl_fw_runtime *fwrt, |
949 | static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt, |
950 | const struct fw_img *image) |
951 | { |
952 | - int sec_idx, idx; |
953 | + int sec_idx, idx, ret; |
954 | u32 offset = 0; |
955 | |
956 | /* |
957 | @@ -190,17 +192,23 @@ static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt, |
958 | */ |
959 | if (sec_idx >= image->num_sec - 1) { |
960 | IWL_ERR(fwrt, "Paging: Missing CSS and/or paging sections\n"); |
961 | - iwl_free_fw_paging(fwrt); |
962 | - return -EINVAL; |
963 | + ret = -EINVAL; |
964 | + goto err; |
965 | } |
966 | |
967 | /* copy the CSS block to the dram */ |
968 | IWL_DEBUG_FW(fwrt, "Paging: load paging CSS to FW, sec = %d\n", |
969 | sec_idx); |
970 | |
971 | + if (image->sec[sec_idx].len > fwrt->fw_paging_db[0].fw_paging_size) { |
972 | + IWL_ERR(fwrt, "CSS block is larger than paging size\n"); |
973 | + ret = -EINVAL; |
974 | + goto err; |
975 | + } |
976 | + |
977 | memcpy(page_address(fwrt->fw_paging_db[0].fw_paging_block), |
978 | image->sec[sec_idx].data, |
979 | - fwrt->fw_paging_db[0].fw_paging_size); |
980 | + image->sec[sec_idx].len); |
981 | dma_sync_single_for_device(fwrt->trans->dev, |
982 | fwrt->fw_paging_db[0].fw_paging_phys, |
983 | fwrt->fw_paging_db[0].fw_paging_size, |
984 | @@ -221,6 +229,14 @@ static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt, |
985 | for (idx = 1; idx < fwrt->num_of_paging_blk; idx++) { |
986 | struct iwl_fw_paging *block = &fwrt->fw_paging_db[idx]; |
987 | |
988 | + if (block->fw_paging_size > image->sec[sec_idx].len - offset) { |
989 | + IWL_ERR(fwrt, |
990 | + "Paging: paging size is larger than remaining data in block %d\n", |
991 | + idx); |
992 | + ret = -EINVAL; |
993 | + goto err; |
994 | + } |
995 | + |
996 | memcpy(page_address(block->fw_paging_block), |
997 | image->sec[sec_idx].data + offset, |
998 | block->fw_paging_size); |
999 | @@ -231,19 +247,32 @@ static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt, |
1000 | |
1001 | IWL_DEBUG_FW(fwrt, |
1002 | "Paging: copied %d paging bytes to block %d\n", |
1003 | - fwrt->fw_paging_db[idx].fw_paging_size, |
1004 | - idx); |
1005 | + block->fw_paging_size, idx); |
1006 | |
1007 | - offset += fwrt->fw_paging_db[idx].fw_paging_size; |
1008 | + offset += block->fw_paging_size; |
1009 | + |
1010 | + if (offset > image->sec[sec_idx].len) { |
1011 | + IWL_ERR(fwrt, |
1012 | + "Paging: offset goes over section size\n"); |
1013 | + ret = -EINVAL; |
1014 | + goto err; |
1015 | + } |
1016 | } |
1017 | |
1018 | /* copy the last paging block */ |
1019 | if (fwrt->num_of_pages_in_last_blk > 0) { |
1020 | struct iwl_fw_paging *block = &fwrt->fw_paging_db[idx]; |
1021 | |
1022 | + if (image->sec[sec_idx].len - offset > block->fw_paging_size) { |
1023 | + IWL_ERR(fwrt, |
1024 | + "Paging: last block is larger than paging size\n"); |
1025 | + ret = -EINVAL; |
1026 | + goto err; |
1027 | + } |
1028 | + |
1029 | memcpy(page_address(block->fw_paging_block), |
1030 | image->sec[sec_idx].data + offset, |
1031 | - FW_PAGING_SIZE * fwrt->num_of_pages_in_last_blk); |
1032 | + image->sec[sec_idx].len - offset); |
1033 | dma_sync_single_for_device(fwrt->trans->dev, |
1034 | block->fw_paging_phys, |
1035 | block->fw_paging_size, |
1036 | @@ -255,6 +284,10 @@ static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt, |
1037 | } |
1038 | |
1039 | return 0; |
1040 | + |
1041 | +err: |
1042 | + iwl_free_fw_paging(fwrt); |
1043 | + return ret; |
1044 | } |
1045 | |
1046 | static int iwl_save_fw_paging(struct iwl_fw_runtime *fwrt, |
1047 | diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c |
1048 | index 17a0190bd88f..5dbb0f0c02ef 100644 |
1049 | --- a/drivers/nvme/host/pci.c |
1050 | +++ b/drivers/nvme/host/pci.c |
1051 | @@ -2679,8 +2679,15 @@ static pci_ers_result_t nvme_slot_reset(struct pci_dev *pdev) |
1052 | |
1053 | dev_info(dev->ctrl.device, "restart after slot reset\n"); |
1054 | pci_restore_state(pdev); |
1055 | - nvme_reset_ctrl(&dev->ctrl); |
1056 | - return PCI_ERS_RESULT_RECOVERED; |
1057 | + nvme_reset_ctrl_sync(&dev->ctrl); |
1058 | + |
1059 | + switch (dev->ctrl.state) { |
1060 | + case NVME_CTRL_LIVE: |
1061 | + case NVME_CTRL_ADMIN_ONLY: |
1062 | + return PCI_ERS_RESULT_RECOVERED; |
1063 | + default: |
1064 | + return PCI_ERS_RESULT_DISCONNECT; |
1065 | + } |
1066 | } |
1067 | |
1068 | static void nvme_error_resume(struct pci_dev *pdev) |
1069 | diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c |
1070 | index f0be5f35ab28..9beefa6ed1ce 100644 |
1071 | --- a/drivers/vhost/vhost.c |
1072 | +++ b/drivers/vhost/vhost.c |
1073 | @@ -2345,6 +2345,9 @@ struct vhost_msg_node *vhost_new_msg(struct vhost_virtqueue *vq, int type) |
1074 | struct vhost_msg_node *node = kmalloc(sizeof *node, GFP_KERNEL); |
1075 | if (!node) |
1076 | return NULL; |
1077 | + |
1078 | + /* Make sure all padding within the structure is initialized. */ |
1079 | + memset(&node->msg, 0, sizeof node->msg); |
1080 | node->vq = vq; |
1081 | node->msg.type = type; |
1082 | return node; |
1083 | diff --git a/drivers/w1/masters/mxc_w1.c b/drivers/w1/masters/mxc_w1.c |
1084 | index 74f2e6e6202a..8851d441e5fd 100644 |
1085 | --- a/drivers/w1/masters/mxc_w1.c |
1086 | +++ b/drivers/w1/masters/mxc_w1.c |
1087 | @@ -112,6 +112,10 @@ static int mxc_w1_probe(struct platform_device *pdev) |
1088 | if (IS_ERR(mdev->clk)) |
1089 | return PTR_ERR(mdev->clk); |
1090 | |
1091 | + err = clk_prepare_enable(mdev->clk); |
1092 | + if (err) |
1093 | + return err; |
1094 | + |
1095 | clkrate = clk_get_rate(mdev->clk); |
1096 | if (clkrate < 10000000) |
1097 | dev_warn(&pdev->dev, |
1098 | @@ -125,12 +129,10 @@ static int mxc_w1_probe(struct platform_device *pdev) |
1099 | |
1100 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1101 | mdev->regs = devm_ioremap_resource(&pdev->dev, res); |
1102 | - if (IS_ERR(mdev->regs)) |
1103 | - return PTR_ERR(mdev->regs); |
1104 | - |
1105 | - err = clk_prepare_enable(mdev->clk); |
1106 | - if (err) |
1107 | - return err; |
1108 | + if (IS_ERR(mdev->regs)) { |
1109 | + err = PTR_ERR(mdev->regs); |
1110 | + goto out_disable_clk; |
1111 | + } |
1112 | |
1113 | /* Software reset 1-Wire module */ |
1114 | writeb(MXC_W1_RESET_RST, mdev->regs + MXC_W1_RESET); |
1115 | @@ -146,8 +148,12 @@ static int mxc_w1_probe(struct platform_device *pdev) |
1116 | |
1117 | err = w1_add_master_device(&mdev->bus_master); |
1118 | if (err) |
1119 | - clk_disable_unprepare(mdev->clk); |
1120 | + goto out_disable_clk; |
1121 | |
1122 | + return 0; |
1123 | + |
1124 | +out_disable_clk: |
1125 | + clk_disable_unprepare(mdev->clk); |
1126 | return err; |
1127 | } |
1128 | |
1129 | diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c |
1130 | index a41b48f82a70..4de191563261 100644 |
1131 | --- a/fs/binfmt_misc.c |
1132 | +++ b/fs/binfmt_misc.c |
1133 | @@ -387,8 +387,13 @@ static Node *create_entry(const char __user *buffer, size_t count) |
1134 | s = strchr(p, del); |
1135 | if (!s) |
1136 | goto einval; |
1137 | - *s++ = '\0'; |
1138 | - e->offset = simple_strtoul(p, &p, 10); |
1139 | + *s = '\0'; |
1140 | + if (p != s) { |
1141 | + int r = kstrtoint(p, 10, &e->offset); |
1142 | + if (r != 0 || e->offset < 0) |
1143 | + goto einval; |
1144 | + } |
1145 | + p = s; |
1146 | if (*p++) |
1147 | goto einval; |
1148 | pr_debug("register: offset: %#x\n", e->offset); |
1149 | @@ -428,7 +433,8 @@ static Node *create_entry(const char __user *buffer, size_t count) |
1150 | if (e->mask && |
1151 | string_unescape_inplace(e->mask, UNESCAPE_HEX) != e->size) |
1152 | goto einval; |
1153 | - if (e->size + e->offset > BINPRM_BUF_SIZE) |
1154 | + if (e->size > BINPRM_BUF_SIZE || |
1155 | + BINPRM_BUF_SIZE - e->size < e->offset) |
1156 | goto einval; |
1157 | pr_debug("register: magic/mask length: %i\n", e->size); |
1158 | if (USE_DEBUG) { |
1159 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
1160 | index 0b86cf10cf2a..775a0f2d0b45 100644 |
1161 | --- a/fs/btrfs/inode.c |
1162 | +++ b/fs/btrfs/inode.c |
1163 | @@ -1018,8 +1018,10 @@ static noinline int cow_file_range(struct inode *inode, |
1164 | ram_size, /* ram_bytes */ |
1165 | BTRFS_COMPRESS_NONE, /* compress_type */ |
1166 | BTRFS_ORDERED_REGULAR /* type */); |
1167 | - if (IS_ERR(em)) |
1168 | + if (IS_ERR(em)) { |
1169 | + ret = PTR_ERR(em); |
1170 | goto out_reserve; |
1171 | + } |
1172 | free_extent_map(em); |
1173 | |
1174 | ret = btrfs_add_ordered_extent(inode, start, ins.objectid, |
1175 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
1176 | index 632e26d6f7ce..28fed3e8960b 100644 |
1177 | --- a/fs/btrfs/ioctl.c |
1178 | +++ b/fs/btrfs/ioctl.c |
1179 | @@ -2654,8 +2654,10 @@ static long btrfs_ioctl_rm_dev_v2(struct file *file, void __user *arg) |
1180 | } |
1181 | |
1182 | /* Check for compatibility reject unknown flags */ |
1183 | - if (vol_args->flags & ~BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED) |
1184 | - return -EOPNOTSUPP; |
1185 | + if (vol_args->flags & ~BTRFS_VOL_ARG_V2_FLAGS_SUPPORTED) { |
1186 | + ret = -EOPNOTSUPP; |
1187 | + goto out; |
1188 | + } |
1189 | |
1190 | if (test_and_set_bit(BTRFS_FS_EXCL_OP, &fs_info->flags)) { |
1191 | ret = BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS; |
1192 | @@ -3826,11 +3828,6 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src, |
1193 | src->i_sb != inode->i_sb) |
1194 | return -EXDEV; |
1195 | |
1196 | - /* don't make the dst file partly checksummed */ |
1197 | - if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) != |
1198 | - (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) |
1199 | - return -EINVAL; |
1200 | - |
1201 | if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode)) |
1202 | return -EISDIR; |
1203 | |
1204 | @@ -3840,6 +3837,13 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src, |
1205 | inode_lock(src); |
1206 | } |
1207 | |
1208 | + /* don't make the dst file partly checksummed */ |
1209 | + if ((BTRFS_I(src)->flags & BTRFS_INODE_NODATASUM) != |
1210 | + (BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { |
1211 | + ret = -EINVAL; |
1212 | + goto out_unlock; |
1213 | + } |
1214 | + |
1215 | /* determine range to clone */ |
1216 | ret = -EINVAL; |
1217 | if (off + len > src->i_size || off + len < off) |
1218 | diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c |
1219 | index 52b39a0924e9..ad8a69ba7f13 100644 |
1220 | --- a/fs/btrfs/scrub.c |
1221 | +++ b/fs/btrfs/scrub.c |
1222 | @@ -2799,7 +2799,7 @@ static int scrub_extent(struct scrub_ctx *sctx, struct map_lookup *map, |
1223 | have_csum = scrub_find_csum(sctx, logical, csum); |
1224 | if (have_csum == 0) |
1225 | ++sctx->stat.no_csum; |
1226 | - if (sctx->is_dev_replace && !have_csum) { |
1227 | + if (0 && sctx->is_dev_replace && !have_csum) { |
1228 | ret = copy_nocow_pages(sctx, logical, l, |
1229 | mirror_num, |
1230 | physical_for_dev_replace); |
1231 | diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c |
1232 | index 0628092b0b1b..f82152a0cb38 100644 |
1233 | --- a/fs/btrfs/super.c |
1234 | +++ b/fs/btrfs/super.c |
1235 | @@ -323,6 +323,7 @@ enum { |
1236 | Opt_ssd, Opt_nossd, |
1237 | Opt_ssd_spread, Opt_nossd_spread, |
1238 | Opt_subvol, |
1239 | + Opt_subvol_empty, |
1240 | Opt_subvolid, |
1241 | Opt_thread_pool, |
1242 | Opt_treelog, Opt_notreelog, |
1243 | @@ -388,6 +389,7 @@ static const match_table_t tokens = { |
1244 | {Opt_ssd_spread, "ssd_spread"}, |
1245 | {Opt_nossd_spread, "nossd_spread"}, |
1246 | {Opt_subvol, "subvol=%s"}, |
1247 | + {Opt_subvol_empty, "subvol="}, |
1248 | {Opt_subvolid, "subvolid=%s"}, |
1249 | {Opt_thread_pool, "thread_pool=%u"}, |
1250 | {Opt_treelog, "treelog"}, |
1251 | @@ -461,6 +463,7 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options, |
1252 | btrfs_set_opt(info->mount_opt, DEGRADED); |
1253 | break; |
1254 | case Opt_subvol: |
1255 | + case Opt_subvol_empty: |
1256 | case Opt_subvolid: |
1257 | case Opt_subvolrootid: |
1258 | case Opt_device: |
1259 | diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h |
1260 | index 4f3884835267..dd95a6fa24bf 100644 |
1261 | --- a/fs/cifs/cifsacl.h |
1262 | +++ b/fs/cifs/cifsacl.h |
1263 | @@ -98,4 +98,18 @@ struct cifs_ace { |
1264 | struct cifs_sid sid; /* ie UUID of user or group who gets these perms */ |
1265 | } __attribute__((packed)); |
1266 | |
1267 | +/* |
1268 | + * Minimum security identifier can be one for system defined Users |
1269 | + * and Groups such as NULL SID and World or Built-in accounts such |
1270 | + * as Administrator and Guest and consists of |
1271 | + * Revision + Num (Sub)Auths + Authority + Domain (one Subauthority) |
1272 | + */ |
1273 | +#define MIN_SID_LEN (1 + 1 + 6 + 4) /* in bytes */ |
1274 | + |
1275 | +/* |
1276 | + * Minimum security descriptor can be one without any SACL and DACL and can |
1277 | + * consist of revision, type, and two sids of minimum size for owner and group |
1278 | + */ |
1279 | +#define MIN_SEC_DESC_LEN (sizeof(struct cifs_ntsd) + (2 * MIN_SID_LEN)) |
1280 | + |
1281 | #endif /* _CIFSACL_H */ |
1282 | diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c |
1283 | index 9c6d95ffca97..4ee32488ff74 100644 |
1284 | --- a/fs/cifs/smb2ops.c |
1285 | +++ b/fs/cifs/smb2ops.c |
1286 | @@ -1277,10 +1277,11 @@ smb2_is_session_expired(char *buf) |
1287 | { |
1288 | struct smb2_sync_hdr *shdr = get_sync_hdr(buf); |
1289 | |
1290 | - if (shdr->Status != STATUS_NETWORK_SESSION_EXPIRED) |
1291 | + if (shdr->Status != STATUS_NETWORK_SESSION_EXPIRED && |
1292 | + shdr->Status != STATUS_USER_SESSION_DELETED) |
1293 | return false; |
1294 | |
1295 | - cifs_dbg(FYI, "Session expired\n"); |
1296 | + cifs_dbg(FYI, "Session expired or deleted\n"); |
1297 | return true; |
1298 | } |
1299 | |
1300 | @@ -1593,8 +1594,11 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb, |
1301 | oparms.create_options = 0; |
1302 | |
1303 | utf16_path = cifs_convert_path_to_utf16(path, cifs_sb); |
1304 | - if (!utf16_path) |
1305 | - return ERR_PTR(-ENOMEM); |
1306 | + if (!utf16_path) { |
1307 | + rc = -ENOMEM; |
1308 | + free_xid(xid); |
1309 | + return ERR_PTR(rc); |
1310 | + } |
1311 | |
1312 | oparms.tcon = tcon; |
1313 | oparms.desired_access = READ_CONTROL; |
1314 | @@ -1652,8 +1656,11 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen, |
1315 | access_flags = WRITE_DAC; |
1316 | |
1317 | utf16_path = cifs_convert_path_to_utf16(path, cifs_sb); |
1318 | - if (!utf16_path) |
1319 | - return -ENOMEM; |
1320 | + if (!utf16_path) { |
1321 | + rc = -ENOMEM; |
1322 | + free_xid(xid); |
1323 | + return rc; |
1324 | + } |
1325 | |
1326 | oparms.tcon = tcon; |
1327 | oparms.desired_access = access_flags; |
1328 | @@ -1713,15 +1720,21 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, |
1329 | |
1330 | /* if file not oplocked can't be sure whether asking to extend size */ |
1331 | if (!CIFS_CACHE_READ(cifsi)) |
1332 | - if (keep_size == false) |
1333 | - return -EOPNOTSUPP; |
1334 | + if (keep_size == false) { |
1335 | + rc = -EOPNOTSUPP; |
1336 | + free_xid(xid); |
1337 | + return rc; |
1338 | + } |
1339 | |
1340 | /* |
1341 | * Must check if file sparse since fallocate -z (zero range) assumes |
1342 | * non-sparse allocation |
1343 | */ |
1344 | - if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE)) |
1345 | - return -EOPNOTSUPP; |
1346 | + if (!(cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE)) { |
1347 | + rc = -EOPNOTSUPP; |
1348 | + free_xid(xid); |
1349 | + return rc; |
1350 | + } |
1351 | |
1352 | /* |
1353 | * need to make sure we are not asked to extend the file since the SMB3 |
1354 | @@ -1730,8 +1743,11 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon, |
1355 | * which for a non sparse file would zero the newly extended range |
1356 | */ |
1357 | if (keep_size == false) |
1358 | - if (i_size_read(inode) < offset + len) |
1359 | - return -EOPNOTSUPP; |
1360 | + if (i_size_read(inode) < offset + len) { |
1361 | + rc = -EOPNOTSUPP; |
1362 | + free_xid(xid); |
1363 | + return rc; |
1364 | + } |
1365 | |
1366 | cifs_dbg(FYI, "offset %lld len %lld", offset, len); |
1367 | |
1368 | @@ -1764,8 +1780,11 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon, |
1369 | |
1370 | /* Need to make file sparse, if not already, before freeing range. */ |
1371 | /* Consider adding equivalent for compressed since it could also work */ |
1372 | - if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse)) |
1373 | - return -EOPNOTSUPP; |
1374 | + if (!smb2_set_sparse(xid, tcon, cfile, inode, set_sparse)) { |
1375 | + rc = -EOPNOTSUPP; |
1376 | + free_xid(xid); |
1377 | + return rc; |
1378 | + } |
1379 | |
1380 | cifs_dbg(FYI, "offset %lld len %lld", offset, len); |
1381 | |
1382 | @@ -1796,8 +1815,10 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, |
1383 | |
1384 | /* if file not oplocked can't be sure whether asking to extend size */ |
1385 | if (!CIFS_CACHE_READ(cifsi)) |
1386 | - if (keep_size == false) |
1387 | - return -EOPNOTSUPP; |
1388 | + if (keep_size == false) { |
1389 | + free_xid(xid); |
1390 | + return rc; |
1391 | + } |
1392 | |
1393 | /* |
1394 | * Files are non-sparse by default so falloc may be a no-op |
1395 | @@ -1806,14 +1827,16 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, |
1396 | */ |
1397 | if ((cifsi->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) == 0) { |
1398 | if (keep_size == true) |
1399 | - return 0; |
1400 | + rc = 0; |
1401 | /* check if extending file */ |
1402 | else if (i_size_read(inode) >= off + len) |
1403 | /* not extending file and already not sparse */ |
1404 | - return 0; |
1405 | + rc = 0; |
1406 | /* BB: in future add else clause to extend file */ |
1407 | else |
1408 | - return -EOPNOTSUPP; |
1409 | + rc = -EOPNOTSUPP; |
1410 | + free_xid(xid); |
1411 | + return rc; |
1412 | } |
1413 | |
1414 | if ((keep_size == true) || (i_size_read(inode) >= off + len)) { |
1415 | @@ -1825,8 +1848,11 @@ static long smb3_simple_falloc(struct file *file, struct cifs_tcon *tcon, |
1416 | * ie potentially making a few extra pages at the beginning |
1417 | * or end of the file non-sparse via set_sparse is harmless. |
1418 | */ |
1419 | - if ((off > 8192) || (off + len + 8192 < i_size_read(inode))) |
1420 | - return -EOPNOTSUPP; |
1421 | + if ((off > 8192) || (off + len + 8192 < i_size_read(inode))) { |
1422 | + rc = -EOPNOTSUPP; |
1423 | + free_xid(xid); |
1424 | + return rc; |
1425 | + } |
1426 | |
1427 | rc = smb2_set_sparse(xid, tcon, cfile, inode, false); |
1428 | } |
1429 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
1430 | index 0f48741a0130..32d7fd830aae 100644 |
1431 | --- a/fs/cifs/smb2pdu.c |
1432 | +++ b/fs/cifs/smb2pdu.c |
1433 | @@ -1276,6 +1276,7 @@ SMB2_sess_setup(const unsigned int xid, struct cifs_ses *ses, |
1434 | sess_data->ses = ses; |
1435 | sess_data->buf0_type = CIFS_NO_BUFFER; |
1436 | sess_data->nls_cp = (struct nls_table *) nls_cp; |
1437 | + sess_data->previous_session = ses->Suid; |
1438 | |
1439 | #ifdef CONFIG_CIFS_SMB311 |
1440 | /* |
1441 | @@ -2377,8 +2378,7 @@ SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon, |
1442 | |
1443 | return query_info(xid, tcon, persistent_fid, volatile_fid, |
1444 | 0, SMB2_O_INFO_SECURITY, additional_info, |
1445 | - SMB2_MAX_BUFFER_SIZE, |
1446 | - sizeof(struct smb2_file_all_info), data, plen); |
1447 | + SMB2_MAX_BUFFER_SIZE, MIN_SEC_DESC_LEN, data, plen); |
1448 | } |
1449 | |
1450 | int |
1451 | diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c |
1452 | index c32802c956d5..bf7fa1507e81 100644 |
1453 | --- a/fs/ext4/indirect.c |
1454 | +++ b/fs/ext4/indirect.c |
1455 | @@ -561,10 +561,16 @@ int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, |
1456 | unsigned epb = inode->i_sb->s_blocksize / sizeof(u32); |
1457 | int i; |
1458 | |
1459 | - /* Count number blocks in a subtree under 'partial' */ |
1460 | - count = 1; |
1461 | - for (i = 0; partial + i != chain + depth - 1; i++) |
1462 | - count *= epb; |
1463 | + /* |
1464 | + * Count number blocks in a subtree under 'partial'. At each |
1465 | + * level we count number of complete empty subtrees beyond |
1466 | + * current offset and then descend into the subtree only |
1467 | + * partially beyond current offset. |
1468 | + */ |
1469 | + count = 0; |
1470 | + for (i = partial - chain + 1; i < depth; i++) |
1471 | + count = count * epb + (epb - offsets[i] - 1); |
1472 | + count++; |
1473 | /* Fill in size of a hole we found */ |
1474 | map->m_pblk = 0; |
1475 | map->m_len = min_t(unsigned int, map->m_len, count); |
1476 | diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c |
1477 | index 70cf4c7b268a..44b4fcdc3755 100644 |
1478 | --- a/fs/ext4/inline.c |
1479 | +++ b/fs/ext4/inline.c |
1480 | @@ -144,6 +144,12 @@ int ext4_find_inline_data_nolock(struct inode *inode) |
1481 | goto out; |
1482 | |
1483 | if (!is.s.not_found) { |
1484 | + if (is.s.here->e_value_inum) { |
1485 | + EXT4_ERROR_INODE(inode, "inline data xattr refers " |
1486 | + "to an external xattr inode"); |
1487 | + error = -EFSCORRUPTED; |
1488 | + goto out; |
1489 | + } |
1490 | EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - |
1491 | (void *)ext4_raw_inode(&is.iloc)); |
1492 | EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + |
1493 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
1494 | index 1e50c5efae67..c73cb9346aee 100644 |
1495 | --- a/fs/ext4/inode.c |
1496 | +++ b/fs/ext4/inode.c |
1497 | @@ -4298,28 +4298,28 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) |
1498 | EXT4_BLOCK_SIZE_BITS(sb); |
1499 | stop_block = (offset + length) >> EXT4_BLOCK_SIZE_BITS(sb); |
1500 | |
1501 | - /* If there are no blocks to remove, return now */ |
1502 | - if (first_block >= stop_block) |
1503 | - goto out_stop; |
1504 | + /* If there are blocks to remove, do it */ |
1505 | + if (stop_block > first_block) { |
1506 | |
1507 | - down_write(&EXT4_I(inode)->i_data_sem); |
1508 | - ext4_discard_preallocations(inode); |
1509 | + down_write(&EXT4_I(inode)->i_data_sem); |
1510 | + ext4_discard_preallocations(inode); |
1511 | |
1512 | - ret = ext4_es_remove_extent(inode, first_block, |
1513 | - stop_block - first_block); |
1514 | - if (ret) { |
1515 | - up_write(&EXT4_I(inode)->i_data_sem); |
1516 | - goto out_stop; |
1517 | - } |
1518 | + ret = ext4_es_remove_extent(inode, first_block, |
1519 | + stop_block - first_block); |
1520 | + if (ret) { |
1521 | + up_write(&EXT4_I(inode)->i_data_sem); |
1522 | + goto out_stop; |
1523 | + } |
1524 | |
1525 | - if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) |
1526 | - ret = ext4_ext_remove_space(inode, first_block, |
1527 | - stop_block - 1); |
1528 | - else |
1529 | - ret = ext4_ind_remove_space(handle, inode, first_block, |
1530 | - stop_block); |
1531 | + if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) |
1532 | + ret = ext4_ext_remove_space(inode, first_block, |
1533 | + stop_block - 1); |
1534 | + else |
1535 | + ret = ext4_ind_remove_space(handle, inode, first_block, |
1536 | + stop_block); |
1537 | |
1538 | - up_write(&EXT4_I(inode)->i_data_sem); |
1539 | + up_write(&EXT4_I(inode)->i_data_sem); |
1540 | + } |
1541 | if (IS_SYNC(inode)) |
1542 | ext4_handle_sync(handle); |
1543 | |
1544 | @@ -4701,19 +4701,21 @@ static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode, |
1545 | } |
1546 | } |
1547 | |
1548 | -static inline void ext4_iget_extra_inode(struct inode *inode, |
1549 | +static inline int ext4_iget_extra_inode(struct inode *inode, |
1550 | struct ext4_inode *raw_inode, |
1551 | struct ext4_inode_info *ei) |
1552 | { |
1553 | __le32 *magic = (void *)raw_inode + |
1554 | EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize; |
1555 | + |
1556 | if (EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize + sizeof(__le32) <= |
1557 | EXT4_INODE_SIZE(inode->i_sb) && |
1558 | *magic == cpu_to_le32(EXT4_XATTR_MAGIC)) { |
1559 | ext4_set_inode_state(inode, EXT4_STATE_XATTR); |
1560 | - ext4_find_inline_data_nolock(inode); |
1561 | + return ext4_find_inline_data_nolock(inode); |
1562 | } else |
1563 | EXT4_I(inode)->i_inline_off = 0; |
1564 | + return 0; |
1565 | } |
1566 | |
1567 | int ext4_get_projid(struct inode *inode, kprojid_t *projid) |
1568 | @@ -4893,7 +4895,9 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) |
1569 | ei->i_extra_isize = sizeof(struct ext4_inode) - |
1570 | EXT4_GOOD_OLD_INODE_SIZE; |
1571 | } else { |
1572 | - ext4_iget_extra_inode(inode, raw_inode, ei); |
1573 | + ret = ext4_iget_extra_inode(inode, raw_inode, ei); |
1574 | + if (ret) |
1575 | + goto bad_inode; |
1576 | } |
1577 | } |
1578 | |
1579 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c |
1580 | index b6bec270a8e4..d792b7689d92 100644 |
1581 | --- a/fs/ext4/resize.c |
1582 | +++ b/fs/ext4/resize.c |
1583 | @@ -1933,7 +1933,7 @@ int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count) |
1584 | return 0; |
1585 | |
1586 | n_group = ext4_get_group_number(sb, n_blocks_count - 1); |
1587 | - if (n_group > (0xFFFFFFFFUL / EXT4_INODES_PER_GROUP(sb))) { |
1588 | + if (n_group >= (0xFFFFFFFFUL / EXT4_INODES_PER_GROUP(sb))) { |
1589 | ext4_warning(sb, "resize would cause inodes_count overflow"); |
1590 | return -EINVAL; |
1591 | } |
1592 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c |
1593 | index 499cb4b1fbd2..fc4ced59c565 100644 |
1594 | --- a/fs/ext4/xattr.c |
1595 | +++ b/fs/ext4/xattr.c |
1596 | @@ -1688,7 +1688,7 @@ static int ext4_xattr_set_entry(struct ext4_xattr_info *i, |
1597 | |
1598 | /* No failures allowed past this point. */ |
1599 | |
1600 | - if (!s->not_found && here->e_value_offs) { |
1601 | + if (!s->not_found && here->e_value_size && here->e_value_offs) { |
1602 | /* Remove the old value. */ |
1603 | void *first_val = s->base + min_offs; |
1604 | size_t offs = le16_to_cpu(here->e_value_offs); |
1605 | diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c |
1606 | index 79c61da8b1bc..c65a51d87cac 100644 |
1607 | --- a/fs/orangefs/inode.c |
1608 | +++ b/fs/orangefs/inode.c |
1609 | @@ -269,6 +269,13 @@ int orangefs_getattr(const struct path *path, struct kstat *stat, |
1610 | else |
1611 | stat->result_mask = STATX_BASIC_STATS & |
1612 | ~STATX_SIZE; |
1613 | + |
1614 | + stat->attributes_mask = STATX_ATTR_IMMUTABLE | |
1615 | + STATX_ATTR_APPEND; |
1616 | + if (inode->i_flags & S_IMMUTABLE) |
1617 | + stat->attributes |= STATX_ATTR_IMMUTABLE; |
1618 | + if (inode->i_flags & S_APPEND) |
1619 | + stat->attributes |= STATX_ATTR_APPEND; |
1620 | } |
1621 | return ret; |
1622 | } |
1623 | diff --git a/fs/orangefs/namei.c b/fs/orangefs/namei.c |
1624 | index 1b5707c44c3f..e026bee02a66 100644 |
1625 | --- a/fs/orangefs/namei.c |
1626 | +++ b/fs/orangefs/namei.c |
1627 | @@ -326,6 +326,13 @@ static int orangefs_symlink(struct inode *dir, |
1628 | ret = PTR_ERR(inode); |
1629 | goto out; |
1630 | } |
1631 | + /* |
1632 | + * This is necessary because orangefs_inode_getattr will not |
1633 | + * re-read symlink size as it is impossible for it to change. |
1634 | + * Invalidating the cache does not help. orangefs_new_inode |
1635 | + * does not set the correct size (it does not know symname). |
1636 | + */ |
1637 | + inode->i_size = strlen(symname); |
1638 | |
1639 | gossip_debug(GOSSIP_NAME_DEBUG, |
1640 | "Assigned symlink inode new number of %pU\n", |
1641 | diff --git a/include/linux/irq.h b/include/linux/irq.h |
1642 | index 65916a305f3d..4e66378f290b 100644 |
1643 | --- a/include/linux/irq.h |
1644 | +++ b/include/linux/irq.h |
1645 | @@ -551,7 +551,12 @@ extern int irq_affinity_online_cpu(unsigned int cpu); |
1646 | #endif |
1647 | |
1648 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
1649 | -void irq_move_irq(struct irq_data *data); |
1650 | +void __irq_move_irq(struct irq_data *data); |
1651 | +static inline void irq_move_irq(struct irq_data *data) |
1652 | +{ |
1653 | + if (unlikely(irqd_is_setaffinity_pending(data))) |
1654 | + __irq_move_irq(data); |
1655 | +} |
1656 | void irq_move_masked_irq(struct irq_data *data); |
1657 | void irq_force_complete_move(struct irq_desc *desc); |
1658 | #else |
1659 | diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h |
1660 | index f144216febc6..9397628a1967 100644 |
1661 | --- a/include/linux/virtio_net.h |
1662 | +++ b/include/linux/virtio_net.h |
1663 | @@ -58,7 +58,8 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, |
1664 | static inline int virtio_net_hdr_from_skb(const struct sk_buff *skb, |
1665 | struct virtio_net_hdr *hdr, |
1666 | bool little_endian, |
1667 | - bool has_data_valid) |
1668 | + bool has_data_valid, |
1669 | + int vlan_hlen) |
1670 | { |
1671 | memset(hdr, 0, sizeof(*hdr)); /* no info leak */ |
1672 | |
1673 | @@ -83,12 +84,8 @@ static inline int virtio_net_hdr_from_skb(const struct sk_buff *skb, |
1674 | |
1675 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
1676 | hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM; |
1677 | - if (skb_vlan_tag_present(skb)) |
1678 | - hdr->csum_start = __cpu_to_virtio16(little_endian, |
1679 | - skb_checksum_start_offset(skb) + VLAN_HLEN); |
1680 | - else |
1681 | - hdr->csum_start = __cpu_to_virtio16(little_endian, |
1682 | - skb_checksum_start_offset(skb)); |
1683 | + hdr->csum_start = __cpu_to_virtio16(little_endian, |
1684 | + skb_checksum_start_offset(skb) + vlan_hlen); |
1685 | hdr->csum_offset = __cpu_to_virtio16(little_endian, |
1686 | skb->csum_offset); |
1687 | } else if (has_data_valid && |
1688 | diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h |
1689 | index c4f5caaf3778..f6a3543e5247 100644 |
1690 | --- a/include/net/transp_v6.h |
1691 | +++ b/include/net/transp_v6.h |
1692 | @@ -45,8 +45,15 @@ int ip6_datagram_send_ctl(struct net *net, struct sock *sk, struct msghdr *msg, |
1693 | struct flowi6 *fl6, struct ipcm6_cookie *ipc6, |
1694 | struct sockcm_cookie *sockc); |
1695 | |
1696 | -void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, |
1697 | - __u16 srcp, __u16 destp, int bucket); |
1698 | +void __ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, |
1699 | + __u16 srcp, __u16 destp, int rqueue, int bucket); |
1700 | +static inline void |
1701 | +ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, __u16 srcp, |
1702 | + __u16 destp, int bucket) |
1703 | +{ |
1704 | + __ip6_dgram_sock_seq_show(seq, sp, srcp, destp, sk_rmem_alloc_get(sp), |
1705 | + bucket); |
1706 | +} |
1707 | |
1708 | #define LOOPBACK4_IPV6 cpu_to_be32(0x7f000006) |
1709 | |
1710 | diff --git a/include/net/udp.h b/include/net/udp.h |
1711 | index 0676b272f6ac..1db85dcb06f6 100644 |
1712 | --- a/include/net/udp.h |
1713 | +++ b/include/net/udp.h |
1714 | @@ -244,6 +244,11 @@ static inline __be16 udp_flow_src_port(struct net *net, struct sk_buff *skb, |
1715 | return htons((((u64) hash * (max - min)) >> 32) + min); |
1716 | } |
1717 | |
1718 | +static inline int udp_rqueue_get(struct sock *sk) |
1719 | +{ |
1720 | + return sk_rmem_alloc_get(sk) - READ_ONCE(udp_sk(sk)->forward_deficit); |
1721 | +} |
1722 | + |
1723 | /* net/ipv4/udp.c */ |
1724 | void udp_destruct_sock(struct sock *sk); |
1725 | void skb_consume_udp(struct sock *sk, struct sk_buff *skb, int len); |
1726 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
1727 | index e3336d904f64..facfecfc543c 100644 |
1728 | --- a/kernel/irq/manage.c |
1729 | +++ b/kernel/irq/manage.c |
1730 | @@ -204,6 +204,39 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, |
1731 | return ret; |
1732 | } |
1733 | |
1734 | +#ifdef CONFIG_GENERIC_PENDING_IRQ |
1735 | +static inline int irq_set_affinity_pending(struct irq_data *data, |
1736 | + const struct cpumask *dest) |
1737 | +{ |
1738 | + struct irq_desc *desc = irq_data_to_desc(data); |
1739 | + |
1740 | + irqd_set_move_pending(data); |
1741 | + irq_copy_pending(desc, dest); |
1742 | + return 0; |
1743 | +} |
1744 | +#else |
1745 | +static inline int irq_set_affinity_pending(struct irq_data *data, |
1746 | + const struct cpumask *dest) |
1747 | +{ |
1748 | + return -EBUSY; |
1749 | +} |
1750 | +#endif |
1751 | + |
1752 | +static int irq_try_set_affinity(struct irq_data *data, |
1753 | + const struct cpumask *dest, bool force) |
1754 | +{ |
1755 | + int ret = irq_do_set_affinity(data, dest, force); |
1756 | + |
1757 | + /* |
1758 | + * In case that the underlying vector management is busy and the |
1759 | + * architecture supports the generic pending mechanism then utilize |
1760 | + * this to avoid returning an error to user space. |
1761 | + */ |
1762 | + if (ret == -EBUSY && !force) |
1763 | + ret = irq_set_affinity_pending(data, dest); |
1764 | + return ret; |
1765 | +} |
1766 | + |
1767 | int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, |
1768 | bool force) |
1769 | { |
1770 | @@ -214,8 +247,8 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, |
1771 | if (!chip || !chip->irq_set_affinity) |
1772 | return -EINVAL; |
1773 | |
1774 | - if (irq_can_move_pcntxt(data)) { |
1775 | - ret = irq_do_set_affinity(data, mask, force); |
1776 | + if (irq_can_move_pcntxt(data) && !irqd_is_setaffinity_pending(data)) { |
1777 | + ret = irq_try_set_affinity(data, mask, force); |
1778 | } else { |
1779 | irqd_set_move_pending(data); |
1780 | irq_copy_pending(desc, mask); |
1781 | diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c |
1782 | index 86ae0eb80b53..def48589ea48 100644 |
1783 | --- a/kernel/irq/migration.c |
1784 | +++ b/kernel/irq/migration.c |
1785 | @@ -38,17 +38,18 @@ bool irq_fixup_move_pending(struct irq_desc *desc, bool force_clear) |
1786 | void irq_move_masked_irq(struct irq_data *idata) |
1787 | { |
1788 | struct irq_desc *desc = irq_data_to_desc(idata); |
1789 | - struct irq_chip *chip = desc->irq_data.chip; |
1790 | + struct irq_data *data = &desc->irq_data; |
1791 | + struct irq_chip *chip = data->chip; |
1792 | |
1793 | - if (likely(!irqd_is_setaffinity_pending(&desc->irq_data))) |
1794 | + if (likely(!irqd_is_setaffinity_pending(data))) |
1795 | return; |
1796 | |
1797 | - irqd_clr_move_pending(&desc->irq_data); |
1798 | + irqd_clr_move_pending(data); |
1799 | |
1800 | /* |
1801 | * Paranoia: cpu-local interrupts shouldn't be calling in here anyway. |
1802 | */ |
1803 | - if (irqd_is_per_cpu(&desc->irq_data)) { |
1804 | + if (irqd_is_per_cpu(data)) { |
1805 | WARN_ON(1); |
1806 | return; |
1807 | } |
1808 | @@ -73,13 +74,24 @@ void irq_move_masked_irq(struct irq_data *idata) |
1809 | * For correct operation this depends on the caller |
1810 | * masking the irqs. |
1811 | */ |
1812 | - if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) |
1813 | - irq_do_set_affinity(&desc->irq_data, desc->pending_mask, false); |
1814 | - |
1815 | + if (cpumask_any_and(desc->pending_mask, cpu_online_mask) < nr_cpu_ids) { |
1816 | + int ret; |
1817 | + |
1818 | + ret = irq_do_set_affinity(data, desc->pending_mask, false); |
1819 | + /* |
1820 | + * If the there is a cleanup pending in the underlying |
1821 | + * vector management, reschedule the move for the next |
1822 | + * interrupt. Leave desc->pending_mask intact. |
1823 | + */ |
1824 | + if (ret == -EBUSY) { |
1825 | + irqd_set_move_pending(data); |
1826 | + return; |
1827 | + } |
1828 | + } |
1829 | cpumask_clear(desc->pending_mask); |
1830 | } |
1831 | |
1832 | -void irq_move_irq(struct irq_data *idata) |
1833 | +void __irq_move_irq(struct irq_data *idata) |
1834 | { |
1835 | bool masked; |
1836 | |
1837 | @@ -90,9 +102,6 @@ void irq_move_irq(struct irq_data *idata) |
1838 | */ |
1839 | idata = irq_desc_get_irq_data(irq_data_to_desc(idata)); |
1840 | |
1841 | - if (likely(!irqd_is_setaffinity_pending(idata))) |
1842 | - return; |
1843 | - |
1844 | if (unlikely(irqd_irq_disabled(idata))) |
1845 | return; |
1846 | |
1847 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c |
1848 | index 7441bd93b732..8fe3ebd6ac00 100644 |
1849 | --- a/mm/backing-dev.c |
1850 | +++ b/mm/backing-dev.c |
1851 | @@ -412,6 +412,7 @@ static void wb_exit(struct bdi_writeback *wb) |
1852 | * protected. |
1853 | */ |
1854 | static DEFINE_SPINLOCK(cgwb_lock); |
1855 | +static struct workqueue_struct *cgwb_release_wq; |
1856 | |
1857 | /** |
1858 | * wb_congested_get_create - get or create a wb_congested |
1859 | @@ -522,7 +523,7 @@ static void cgwb_release(struct percpu_ref *refcnt) |
1860 | { |
1861 | struct bdi_writeback *wb = container_of(refcnt, struct bdi_writeback, |
1862 | refcnt); |
1863 | - schedule_work(&wb->release_work); |
1864 | + queue_work(cgwb_release_wq, &wb->release_work); |
1865 | } |
1866 | |
1867 | static void cgwb_kill(struct bdi_writeback *wb) |
1868 | @@ -784,6 +785,21 @@ static void cgwb_bdi_register(struct backing_dev_info *bdi) |
1869 | spin_unlock_irq(&cgwb_lock); |
1870 | } |
1871 | |
1872 | +static int __init cgwb_init(void) |
1873 | +{ |
1874 | + /* |
1875 | + * There can be many concurrent release work items overwhelming |
1876 | + * system_wq. Put them in a separate wq and limit concurrency. |
1877 | + * There's no point in executing many of these in parallel. |
1878 | + */ |
1879 | + cgwb_release_wq = alloc_workqueue("cgwb_release", 0, 1); |
1880 | + if (!cgwb_release_wq) |
1881 | + return -ENOMEM; |
1882 | + |
1883 | + return 0; |
1884 | +} |
1885 | +subsys_initcall(cgwb_init); |
1886 | + |
1887 | #else /* CONFIG_CGROUP_WRITEBACK */ |
1888 | |
1889 | static int cgwb_bdi_init(struct backing_dev_info *bdi) |
1890 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
1891 | index 22320ea27489..d2d0eb9536a3 100644 |
1892 | --- a/mm/page_alloc.c |
1893 | +++ b/mm/page_alloc.c |
1894 | @@ -4162,7 +4162,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
1895 | * orientated. |
1896 | */ |
1897 | if (!(alloc_flags & ALLOC_CPUSET) || reserve_flags) { |
1898 | - ac->zonelist = node_zonelist(numa_node_id(), gfp_mask); |
1899 | ac->preferred_zoneref = first_zones_zonelist(ac->zonelist, |
1900 | ac->high_zoneidx, ac->nodemask); |
1901 | } |
1902 | diff --git a/net/dsa/tag_trailer.c b/net/dsa/tag_trailer.c |
1903 | index 7d20e1f3de28..56197f0d9608 100644 |
1904 | --- a/net/dsa/tag_trailer.c |
1905 | +++ b/net/dsa/tag_trailer.c |
1906 | @@ -75,7 +75,8 @@ static struct sk_buff *trailer_rcv(struct sk_buff *skb, struct net_device *dev, |
1907 | if (!skb->dev) |
1908 | return NULL; |
1909 | |
1910 | - pskb_trim_rcsum(skb, skb->len - 4); |
1911 | + if (pskb_trim_rcsum(skb, skb->len - 4)) |
1912 | + return NULL; |
1913 | |
1914 | return skb; |
1915 | } |
1916 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c |
1917 | index f70586b50838..ef8cd0f7db89 100644 |
1918 | --- a/net/ipv4/tcp_ipv4.c |
1919 | +++ b/net/ipv4/tcp_ipv4.c |
1920 | @@ -1689,6 +1689,10 @@ int tcp_v4_rcv(struct sk_buff *skb) |
1921 | reqsk_put(req); |
1922 | goto discard_it; |
1923 | } |
1924 | + if (tcp_checksum_complete(skb)) { |
1925 | + reqsk_put(req); |
1926 | + goto csum_error; |
1927 | + } |
1928 | if (unlikely(sk->sk_state != TCP_LISTEN)) { |
1929 | inet_csk_reqsk_queue_drop_and_put(sk, req); |
1930 | goto lookup; |
1931 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
1932 | index b61a770884fa..5f7bc5c6366a 100644 |
1933 | --- a/net/ipv4/udp.c |
1934 | +++ b/net/ipv4/udp.c |
1935 | @@ -2718,7 +2718,7 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f, |
1936 | " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d", |
1937 | bucket, src, srcp, dest, destp, sp->sk_state, |
1938 | sk_wmem_alloc_get(sp), |
1939 | - sk_rmem_alloc_get(sp), |
1940 | + udp_rqueue_get(sp), |
1941 | 0, 0L, 0, |
1942 | from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)), |
1943 | 0, sock_i_ino(sp), |
1944 | diff --git a/net/ipv4/udp_diag.c b/net/ipv4/udp_diag.c |
1945 | index d0390d844ac8..d9ad986c7b2c 100644 |
1946 | --- a/net/ipv4/udp_diag.c |
1947 | +++ b/net/ipv4/udp_diag.c |
1948 | @@ -163,7 +163,7 @@ static int udp_diag_dump_one(struct sk_buff *in_skb, const struct nlmsghdr *nlh, |
1949 | static void udp_diag_get_info(struct sock *sk, struct inet_diag_msg *r, |
1950 | void *info) |
1951 | { |
1952 | - r->idiag_rqueue = sk_rmem_alloc_get(sk); |
1953 | + r->idiag_rqueue = udp_rqueue_get(sk); |
1954 | r->idiag_wqueue = sk_wmem_alloc_get(sk); |
1955 | } |
1956 | |
1957 | diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c |
1958 | index a02ad100f0d7..2ee08b6a86a4 100644 |
1959 | --- a/net/ipv6/datagram.c |
1960 | +++ b/net/ipv6/datagram.c |
1961 | @@ -1019,8 +1019,8 @@ int ip6_datagram_send_ctl(struct net *net, struct sock *sk, |
1962 | } |
1963 | EXPORT_SYMBOL_GPL(ip6_datagram_send_ctl); |
1964 | |
1965 | -void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, |
1966 | - __u16 srcp, __u16 destp, int bucket) |
1967 | +void __ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, |
1968 | + __u16 srcp, __u16 destp, int rqueue, int bucket) |
1969 | { |
1970 | const struct in6_addr *dest, *src; |
1971 | |
1972 | @@ -1036,7 +1036,7 @@ void ip6_dgram_sock_seq_show(struct seq_file *seq, struct sock *sp, |
1973 | dest->s6_addr32[2], dest->s6_addr32[3], destp, |
1974 | sp->sk_state, |
1975 | sk_wmem_alloc_get(sp), |
1976 | - sk_rmem_alloc_get(sp), |
1977 | + rqueue, |
1978 | 0, 0L, 0, |
1979 | from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)), |
1980 | 0, |
1981 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
1982 | index 4530a82aaa2e..b94345e657f7 100644 |
1983 | --- a/net/ipv6/route.c |
1984 | +++ b/net/ipv6/route.c |
1985 | @@ -2149,9 +2149,6 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk, |
1986 | const struct in6_addr *daddr, *saddr; |
1987 | struct rt6_info *rt6 = (struct rt6_info *)dst; |
1988 | |
1989 | - if (rt6->rt6i_flags & RTF_LOCAL) |
1990 | - return; |
1991 | - |
1992 | if (dst_metric_locked(dst, RTAX_MTU)) |
1993 | return; |
1994 | |
1995 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
1996 | index 6d664d83cd16..5d4eb9d2c3a7 100644 |
1997 | --- a/net/ipv6/tcp_ipv6.c |
1998 | +++ b/net/ipv6/tcp_ipv6.c |
1999 | @@ -1475,6 +1475,10 @@ static int tcp_v6_rcv(struct sk_buff *skb) |
2000 | reqsk_put(req); |
2001 | goto discard_it; |
2002 | } |
2003 | + if (tcp_checksum_complete(skb)) { |
2004 | + reqsk_put(req); |
2005 | + goto csum_error; |
2006 | + } |
2007 | if (unlikely(sk->sk_state != TCP_LISTEN)) { |
2008 | inet_csk_reqsk_queue_drop_and_put(sk, req); |
2009 | goto lookup; |
2010 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
2011 | index ea0730028e5d..977bd5a07cab 100644 |
2012 | --- a/net/ipv6/udp.c |
2013 | +++ b/net/ipv6/udp.c |
2014 | @@ -1475,7 +1475,8 @@ int udp6_seq_show(struct seq_file *seq, void *v) |
2015 | struct inet_sock *inet = inet_sk(v); |
2016 | __u16 srcp = ntohs(inet->inet_sport); |
2017 | __u16 destp = ntohs(inet->inet_dport); |
2018 | - ip6_dgram_sock_seq_show(seq, v, srcp, destp, bucket); |
2019 | + __ip6_dgram_sock_seq_show(seq, v, srcp, destp, |
2020 | + udp_rqueue_get(v), bucket); |
2021 | } |
2022 | return 0; |
2023 | } |
2024 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
2025 | index 60c2a252bdf5..38d132d007ba 100644 |
2026 | --- a/net/packet/af_packet.c |
2027 | +++ b/net/packet/af_packet.c |
2028 | @@ -2037,7 +2037,7 @@ static int packet_rcv_vnet(struct msghdr *msg, const struct sk_buff *skb, |
2029 | return -EINVAL; |
2030 | *len -= sizeof(vnet_hdr); |
2031 | |
2032 | - if (virtio_net_hdr_from_skb(skb, &vnet_hdr, vio_le(), true)) |
2033 | + if (virtio_net_hdr_from_skb(skb, &vnet_hdr, vio_le(), true, 0)) |
2034 | return -EINVAL; |
2035 | |
2036 | return memcpy_to_msg(msg, (void *)&vnet_hdr, sizeof(vnet_hdr)); |
2037 | @@ -2304,7 +2304,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, |
2038 | if (do_vnet) { |
2039 | if (virtio_net_hdr_from_skb(skb, h.raw + macoff - |
2040 | sizeof(struct virtio_net_hdr), |
2041 | - vio_le(), true)) { |
2042 | + vio_le(), true, 0)) { |
2043 | spin_lock(&sk->sk_receive_queue.lock); |
2044 | goto drop_n_account; |
2045 | } |
2046 | diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c |
2047 | index 9618b4a83cee..98c4afe7c15b 100644 |
2048 | --- a/net/sched/act_simple.c |
2049 | +++ b/net/sched/act_simple.c |
2050 | @@ -53,22 +53,22 @@ static void tcf_simp_release(struct tc_action *a) |
2051 | kfree(d->tcfd_defdata); |
2052 | } |
2053 | |
2054 | -static int alloc_defdata(struct tcf_defact *d, char *defdata) |
2055 | +static int alloc_defdata(struct tcf_defact *d, const struct nlattr *defdata) |
2056 | { |
2057 | d->tcfd_defdata = kzalloc(SIMP_MAX_DATA, GFP_KERNEL); |
2058 | if (unlikely(!d->tcfd_defdata)) |
2059 | return -ENOMEM; |
2060 | - strlcpy(d->tcfd_defdata, defdata, SIMP_MAX_DATA); |
2061 | + nla_strlcpy(d->tcfd_defdata, defdata, SIMP_MAX_DATA); |
2062 | return 0; |
2063 | } |
2064 | |
2065 | -static void reset_policy(struct tcf_defact *d, char *defdata, |
2066 | +static void reset_policy(struct tcf_defact *d, const struct nlattr *defdata, |
2067 | struct tc_defact *p) |
2068 | { |
2069 | spin_lock_bh(&d->tcf_lock); |
2070 | d->tcf_action = p->action; |
2071 | memset(d->tcfd_defdata, 0, SIMP_MAX_DATA); |
2072 | - strlcpy(d->tcfd_defdata, defdata, SIMP_MAX_DATA); |
2073 | + nla_strlcpy(d->tcfd_defdata, defdata, SIMP_MAX_DATA); |
2074 | spin_unlock_bh(&d->tcf_lock); |
2075 | } |
2076 | |
2077 | @@ -87,7 +87,6 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, |
2078 | struct tcf_defact *d; |
2079 | bool exists = false; |
2080 | int ret = 0, err; |
2081 | - char *defdata; |
2082 | |
2083 | if (nla == NULL) |
2084 | return -EINVAL; |
2085 | @@ -110,8 +109,6 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, |
2086 | return -EINVAL; |
2087 | } |
2088 | |
2089 | - defdata = nla_data(tb[TCA_DEF_DATA]); |
2090 | - |
2091 | if (!exists) { |
2092 | ret = tcf_idr_create(tn, parm->index, est, a, |
2093 | &act_simp_ops, bind, false); |
2094 | @@ -119,7 +116,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, |
2095 | return ret; |
2096 | |
2097 | d = to_defact(*a); |
2098 | - ret = alloc_defdata(d, defdata); |
2099 | + ret = alloc_defdata(d, tb[TCA_DEF_DATA]); |
2100 | if (ret < 0) { |
2101 | tcf_idr_release(*a, bind); |
2102 | return ret; |
2103 | @@ -133,7 +130,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, |
2104 | if (!ovr) |
2105 | return -EEXIST; |
2106 | |
2107 | - reset_policy(d, defdata, parm); |
2108 | + reset_policy(d, tb[TCA_DEF_DATA], parm); |
2109 | } |
2110 | |
2111 | if (ret == ACT_P_CREATED) |
2112 | diff --git a/net/socket.c b/net/socket.c |
2113 | index f10f1d947c78..d1b02f161429 100644 |
2114 | --- a/net/socket.c |
2115 | +++ b/net/socket.c |
2116 | @@ -537,7 +537,10 @@ static int sockfs_setattr(struct dentry *dentry, struct iattr *iattr) |
2117 | if (!err && (iattr->ia_valid & ATTR_UID)) { |
2118 | struct socket *sock = SOCKET_I(d_inode(dentry)); |
2119 | |
2120 | - sock->sk->sk_uid = iattr->ia_uid; |
2121 | + if (sock->sk) |
2122 | + sock->sk->sk_uid = iattr->ia_uid; |
2123 | + else |
2124 | + err = -ENOENT; |
2125 | } |
2126 | |
2127 | return err; |
2128 | @@ -586,12 +589,16 @@ EXPORT_SYMBOL(sock_alloc); |
2129 | * an inode not a file. |
2130 | */ |
2131 | |
2132 | -void sock_release(struct socket *sock) |
2133 | +static void __sock_release(struct socket *sock, struct inode *inode) |
2134 | { |
2135 | if (sock->ops) { |
2136 | struct module *owner = sock->ops->owner; |
2137 | |
2138 | + if (inode) |
2139 | + inode_lock(inode); |
2140 | sock->ops->release(sock); |
2141 | + if (inode) |
2142 | + inode_unlock(inode); |
2143 | sock->ops = NULL; |
2144 | module_put(owner); |
2145 | } |
2146 | @@ -605,6 +612,11 @@ void sock_release(struct socket *sock) |
2147 | } |
2148 | sock->file = NULL; |
2149 | } |
2150 | + |
2151 | +void sock_release(struct socket *sock) |
2152 | +{ |
2153 | + __sock_release(sock, NULL); |
2154 | +} |
2155 | EXPORT_SYMBOL(sock_release); |
2156 | |
2157 | void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags) |
2158 | @@ -1146,7 +1158,7 @@ static int sock_mmap(struct file *file, struct vm_area_struct *vma) |
2159 | |
2160 | static int sock_close(struct inode *inode, struct file *filp) |
2161 | { |
2162 | - sock_release(SOCKET_I(inode)); |
2163 | + __sock_release(SOCKET_I(inode), inode); |
2164 | return 0; |
2165 | } |
2166 | |
2167 | diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c |
2168 | index e1c93ce74e0f..5fe29121b9a8 100644 |
2169 | --- a/net/tls/tls_sw.c |
2170 | +++ b/net/tls/tls_sw.c |
2171 | @@ -191,18 +191,12 @@ static void tls_free_both_sg(struct sock *sk) |
2172 | } |
2173 | |
2174 | static int tls_do_encryption(struct tls_context *tls_ctx, |
2175 | - struct tls_sw_context *ctx, size_t data_len, |
2176 | - gfp_t flags) |
2177 | + struct tls_sw_context *ctx, |
2178 | + struct aead_request *aead_req, |
2179 | + size_t data_len) |
2180 | { |
2181 | - unsigned int req_size = sizeof(struct aead_request) + |
2182 | - crypto_aead_reqsize(ctx->aead_send); |
2183 | - struct aead_request *aead_req; |
2184 | int rc; |
2185 | |
2186 | - aead_req = kzalloc(req_size, flags); |
2187 | - if (!aead_req) |
2188 | - return -ENOMEM; |
2189 | - |
2190 | ctx->sg_encrypted_data[0].offset += tls_ctx->tx.prepend_size; |
2191 | ctx->sg_encrypted_data[0].length -= tls_ctx->tx.prepend_size; |
2192 | |
2193 | @@ -219,7 +213,6 @@ static int tls_do_encryption(struct tls_context *tls_ctx, |
2194 | ctx->sg_encrypted_data[0].offset -= tls_ctx->tx.prepend_size; |
2195 | ctx->sg_encrypted_data[0].length += tls_ctx->tx.prepend_size; |
2196 | |
2197 | - kfree(aead_req); |
2198 | return rc; |
2199 | } |
2200 | |
2201 | @@ -228,8 +221,14 @@ static int tls_push_record(struct sock *sk, int flags, |
2202 | { |
2203 | struct tls_context *tls_ctx = tls_get_ctx(sk); |
2204 | struct tls_sw_context *ctx = tls_sw_ctx(tls_ctx); |
2205 | + struct aead_request *req; |
2206 | int rc; |
2207 | |
2208 | + req = kzalloc(sizeof(struct aead_request) + |
2209 | + crypto_aead_reqsize(ctx->aead_send), sk->sk_allocation); |
2210 | + if (!req) |
2211 | + return -ENOMEM; |
2212 | + |
2213 | sg_mark_end(ctx->sg_plaintext_data + ctx->sg_plaintext_num_elem - 1); |
2214 | sg_mark_end(ctx->sg_encrypted_data + ctx->sg_encrypted_num_elem - 1); |
2215 | |
2216 | @@ -245,15 +244,14 @@ static int tls_push_record(struct sock *sk, int flags, |
2217 | tls_ctx->pending_open_record_frags = 0; |
2218 | set_bit(TLS_PENDING_CLOSED_RECORD, &tls_ctx->flags); |
2219 | |
2220 | - rc = tls_do_encryption(tls_ctx, ctx, ctx->sg_plaintext_size, |
2221 | - sk->sk_allocation); |
2222 | + rc = tls_do_encryption(tls_ctx, ctx, req, ctx->sg_plaintext_size); |
2223 | if (rc < 0) { |
2224 | /* If we are called from write_space and |
2225 | * we fail, we need to set this SOCK_NOSPACE |
2226 | * to trigger another write_space in the future. |
2227 | */ |
2228 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); |
2229 | - return rc; |
2230 | + goto out_req; |
2231 | } |
2232 | |
2233 | free_sg(sk, ctx->sg_plaintext_data, &ctx->sg_plaintext_num_elem, |
2234 | @@ -268,6 +266,8 @@ static int tls_push_record(struct sock *sk, int flags, |
2235 | tls_err_abort(sk, EBADMSG); |
2236 | |
2237 | tls_advance_record_sn(sk, &tls_ctx->tx); |
2238 | +out_req: |
2239 | + kfree(req); |
2240 | return rc; |
2241 | } |
2242 | |
2243 | @@ -755,7 +755,7 @@ int tls_sw_recvmsg(struct sock *sk, |
2244 | struct sk_buff *skb; |
2245 | ssize_t copied = 0; |
2246 | bool cmsg = false; |
2247 | - int err = 0; |
2248 | + int target, err = 0; |
2249 | long timeo; |
2250 | |
2251 | flags |= nonblock; |
2252 | @@ -765,6 +765,7 @@ int tls_sw_recvmsg(struct sock *sk, |
2253 | |
2254 | lock_sock(sk); |
2255 | |
2256 | + target = sock_rcvlowat(sk, flags & MSG_WAITALL, len); |
2257 | timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); |
2258 | do { |
2259 | bool zc = false; |
2260 | @@ -857,6 +858,9 @@ int tls_sw_recvmsg(struct sock *sk, |
2261 | goto recv_end; |
2262 | } |
2263 | } |
2264 | + /* If we have a new message from strparser, continue now. */ |
2265 | + if (copied >= target && !ctx->recv_pkt) |
2266 | + break; |
2267 | } while (len); |
2268 | |
2269 | recv_end: |
2270 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c |
2271 | index d1eb14842340..a12e594d4e3b 100644 |
2272 | --- a/sound/pci/hda/hda_controller.c |
2273 | +++ b/sound/pci/hda/hda_controller.c |
2274 | @@ -748,8 +748,10 @@ int snd_hda_attach_pcm_stream(struct hda_bus *_bus, struct hda_codec *codec, |
2275 | return err; |
2276 | strlcpy(pcm->name, cpcm->name, sizeof(pcm->name)); |
2277 | apcm = kzalloc(sizeof(*apcm), GFP_KERNEL); |
2278 | - if (apcm == NULL) |
2279 | + if (apcm == NULL) { |
2280 | + snd_device_free(chip->card, pcm); |
2281 | return -ENOMEM; |
2282 | + } |
2283 | apcm->chip = chip; |
2284 | apcm->pcm = pcm; |
2285 | apcm->codec = codec; |
2286 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
2287 | index 5b4dbcec6de8..ba9a7e552183 100644 |
2288 | --- a/sound/pci/hda/patch_conexant.c |
2289 | +++ b/sound/pci/hda/patch_conexant.c |
2290 | @@ -959,12 +959,15 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { |
2291 | SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK), |
2292 | SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK), |
2293 | SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK), |
2294 | + SND_PCI_QUIRK(0x103c, 0x83b3, "HP EliteBook 830 G5", CXT_FIXUP_HP_DOCK), |
2295 | + SND_PCI_QUIRK(0x103c, 0x83d3, "HP ProBook 640 G4", CXT_FIXUP_HP_DOCK), |
2296 | SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE), |
2297 | SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC), |
2298 | SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO), |
2299 | SND_PCI_QUIRK(0x103c, 0x822e, "HP ProBook 440 G4", CXT_FIXUP_MUTE_LED_GPIO), |
2300 | SND_PCI_QUIRK(0x103c, 0x8299, "HP 800 G3 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE), |
2301 | SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE), |
2302 | + SND_PCI_QUIRK(0x103c, 0x8455, "HP Z2 G4", CXT_FIXUP_HP_MIC_NO_PRESENCE), |
2303 | SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN), |
2304 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT_FIXUP_OLPC_XO), |
2305 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410), |
2306 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2307 | index 01a6643fc7d4..06c2c80a045b 100644 |
2308 | --- a/sound/pci/hda/patch_realtek.c |
2309 | +++ b/sound/pci/hda/patch_realtek.c |
2310 | @@ -6580,7 +6580,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
2311 | SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
2312 | SND_PCI_QUIRK(0x17aa, 0x3138, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
2313 | SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), |
2314 | - SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
2315 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), |
2316 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), |
2317 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), |
2318 | @@ -6752,6 +6751,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
2319 | {0x1b, 0x01111010}, |
2320 | {0x1e, 0x01451130}, |
2321 | {0x21, 0x02211020}), |
2322 | + SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, |
2323 | + {0x12, 0x90a60140}, |
2324 | + {0x14, 0x90170110}, |
2325 | + {0x19, 0x02a11030}, |
2326 | + {0x21, 0x02211020}), |
2327 | SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
2328 | {0x12, 0x90a60140}, |
2329 | {0x14, 0x90170110}, |
2330 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h |
2331 | index 754e632a27bd..02b7ad1946db 100644 |
2332 | --- a/sound/usb/quirks-table.h |
2333 | +++ b/sound/usb/quirks-table.h |
2334 | @@ -3277,6 +3277,10 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), |
2335 | } |
2336 | }, |
2337 | |
2338 | +/* disabled due to regression for other devices; |
2339 | + * see https://bugzilla.kernel.org/show_bug.cgi?id=199905 |
2340 | + */ |
2341 | +#if 0 |
2342 | { |
2343 | /* |
2344 | * Nura's first gen headphones use Cambridge Silicon Radio's vendor |
2345 | @@ -3324,6 +3328,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), |
2346 | } |
2347 | } |
2348 | }, |
2349 | +#endif /* disabled */ |
2350 | |
2351 | { |
2352 | /* |