1 |
commit: cf18885d021c12b4fccd6e06066a5b3d7e3adeef |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Wed Feb 23 12:38:41 2022 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Feb 23 12:38:41 2022 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=cf18885d |
7 |
|
8 |
Linux patch 4.19.231 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1230_linux-4.19.231.patch | 2055 +++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 2059 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 30a2e032..67a0a028 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -959,6 +959,10 @@ Patch: 1229_linux-4.19.230.patch |
21 |
From: https://www.kernel.org |
22 |
Desc: Linux 4.19.230 |
23 |
|
24 |
+Patch: 1230_linux-4.19.231.patch |
25 |
+From: https://www.kernel.org |
26 |
+Desc: Linux 4.19.231 |
27 |
+ |
28 |
Patch: 1500_XATTR_USER_PREFIX.patch |
29 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
30 |
Desc: Support for namespace user.pax.* on tmpfs. |
31 |
|
32 |
diff --git a/1230_linux-4.19.231.patch b/1230_linux-4.19.231.patch |
33 |
new file mode 100644 |
34 |
index 00000000..4f497003 |
35 |
--- /dev/null |
36 |
+++ b/1230_linux-4.19.231.patch |
37 |
@@ -0,0 +1,2055 @@ |
38 |
+diff --git a/Documentation/ABI/stable/sysfs-bus-vmbus b/Documentation/ABI/stable/sysfs-bus-vmbus |
39 |
+index 3fed8fdb873d7..c4ffdfc324b41 100644 |
40 |
+--- a/Documentation/ABI/stable/sysfs-bus-vmbus |
41 |
++++ b/Documentation/ABI/stable/sysfs-bus-vmbus |
42 |
+@@ -81,7 +81,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/latency |
43 |
+ Date: September. 2017 |
44 |
+ KernelVersion: 4.14 |
45 |
+ Contact: Stephen Hemminger <sthemmin@×××××××××.com> |
46 |
+-Description: Channel signaling latency |
47 |
++Description: Channel signaling latency. This file is available only for |
48 |
++ performance critical channels (storage, network, etc.) that use |
49 |
++ the monitor page mechanism. |
50 |
+ Users: Debugging tools |
51 |
+ |
52 |
+ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/out_mask |
53 |
+@@ -95,7 +97,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/pending |
54 |
+ Date: September. 2017 |
55 |
+ KernelVersion: 4.14 |
56 |
+ Contact: Stephen Hemminger <sthemmin@×××××××××.com> |
57 |
+-Description: Channel interrupt pending state |
58 |
++Description: Channel interrupt pending state. This file is available only for |
59 |
++ performance critical channels (storage, network, etc.) that use |
60 |
++ the monitor page mechanism. |
61 |
+ Users: Debugging tools |
62 |
+ |
63 |
+ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/read_avail |
64 |
+@@ -137,7 +141,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/monitor_id |
65 |
+ Date: January. 2018 |
66 |
+ KernelVersion: 4.16 |
67 |
+ Contact: Stephen Hemminger <sthemmin@×××××××××.com> |
68 |
+-Description: Monitor bit associated with channel |
69 |
++Description: Monitor bit associated with channel. This file is available only |
70 |
++ for performance critical channels (storage, network, etc.) that |
71 |
++ use the monitor page mechanism. |
72 |
+ Users: Debugging tools and userspace drivers |
73 |
+ |
74 |
+ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/ring |
75 |
+diff --git a/Makefile b/Makefile |
76 |
+index 1a19d5d8840ff..165660cd857e1 100644 |
77 |
+--- a/Makefile |
78 |
++++ b/Makefile |
79 |
+@@ -1,7 +1,7 @@ |
80 |
+ # SPDX-License-Identifier: GPL-2.0 |
81 |
+ VERSION = 4 |
82 |
+ PATCHLEVEL = 19 |
83 |
+-SUBLEVEL = 230 |
84 |
++SUBLEVEL = 231 |
85 |
+ EXTRAVERSION = |
86 |
+ NAME = "People's Front" |
87 |
+ |
88 |
+diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c |
89 |
+index a8269f0a87ced..47c55351df033 100644 |
90 |
+--- a/arch/arm/mach-omap2/omap_hwmod.c |
91 |
++++ b/arch/arm/mach-omap2/omap_hwmod.c |
92 |
+@@ -754,8 +754,10 @@ static int __init _init_clkctrl_providers(void) |
93 |
+ |
94 |
+ for_each_matching_node(np, ti_clkctrl_match_table) { |
95 |
+ ret = _setup_clkctrl_provider(np); |
96 |
+- if (ret) |
97 |
++ if (ret) { |
98 |
++ of_node_put(np); |
99 |
+ break; |
100 |
++ } |
101 |
+ } |
102 |
+ |
103 |
+ return ret; |
104 |
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi |
105 |
+index b8dc4dbb391b6..4252119bfd901 100644 |
106 |
+--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi |
107 |
++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi |
108 |
+@@ -41,6 +41,12 @@ |
109 |
+ no-map; |
110 |
+ }; |
111 |
+ |
112 |
++ /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ |
113 |
++ secmon_reserved_bl32: secmon@5300000 { |
114 |
++ reg = <0x0 0x05300000 0x0 0x2000000>; |
115 |
++ no-map; |
116 |
++ }; |
117 |
++ |
118 |
+ linux,cma { |
119 |
+ compatible = "shared-dma-pool"; |
120 |
+ reusable; |
121 |
+diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c |
122 |
+index d81568f783e5c..e87ae0dabce12 100644 |
123 |
+--- a/arch/powerpc/lib/sstep.c |
124 |
++++ b/arch/powerpc/lib/sstep.c |
125 |
+@@ -2681,12 +2681,14 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) |
126 |
+ case BARRIER_EIEIO: |
127 |
+ eieio(); |
128 |
+ break; |
129 |
++#ifdef CONFIG_PPC64 |
130 |
+ case BARRIER_LWSYNC: |
131 |
+ asm volatile("lwsync" : : : "memory"); |
132 |
+ break; |
133 |
+ case BARRIER_PTESYNC: |
134 |
+ asm volatile("ptesync" : : : "memory"); |
135 |
+ break; |
136 |
++#endif |
137 |
+ } |
138 |
+ break; |
139 |
+ |
140 |
+diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c |
141 |
+index acc8d217f6565..ad3d39c00d7fc 100644 |
142 |
+--- a/arch/x86/kvm/pmu.c |
143 |
++++ b/arch/x86/kvm/pmu.c |
144 |
+@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) |
145 |
+ } |
146 |
+ |
147 |
+ if (type == PERF_TYPE_RAW) |
148 |
+- config = eventsel & X86_RAW_EVENT_MASK; |
149 |
++ config = eventsel & AMD64_RAW_EVENT_MASK; |
150 |
+ |
151 |
+ pmc_reprogram_counter(pmc, type, config, |
152 |
+ !(eventsel & ARCH_PERFMON_EVENTSEL_USR), |
153 |
+diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c |
154 |
+index c2529dfda3e53..11686e7684016 100644 |
155 |
+--- a/block/bfq-iosched.c |
156 |
++++ b/block/bfq-iosched.c |
157 |
+@@ -5417,6 +5417,8 @@ static void bfq_exit_queue(struct elevator_queue *e) |
158 |
+ spin_unlock_irq(&bfqd->lock); |
159 |
+ #endif |
160 |
+ |
161 |
++ wbt_enable_default(bfqd->queue); |
162 |
++ |
163 |
+ kfree(bfqd); |
164 |
+ } |
165 |
+ |
166 |
+diff --git a/block/elevator.c b/block/elevator.c |
167 |
+index 5b51bc5fad9fe..72ce7a4a2632e 100644 |
168 |
+--- a/block/elevator.c |
169 |
++++ b/block/elevator.c |
170 |
+@@ -877,8 +877,6 @@ void elv_unregister_queue(struct request_queue *q) |
171 |
+ kobject_del(&e->kobj); |
172 |
+ |
173 |
+ e->registered = 0; |
174 |
+- /* Re-enable throttling in case elevator disabled it */ |
175 |
+- wbt_enable_default(q); |
176 |
+ } |
177 |
+ } |
178 |
+ |
179 |
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
180 |
+index 46eacba2613b8..33d3728f36222 100644 |
181 |
+--- a/drivers/ata/libata-core.c |
182 |
++++ b/drivers/ata/libata-core.c |
183 |
+@@ -4613,6 +4613,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
184 |
+ |
185 |
+ /* devices that don't properly handle TRIM commands */ |
186 |
+ { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, |
187 |
++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, |
188 |
+ |
189 |
+ /* |
190 |
+ * As defined, the DRAT (Deterministic Read After Trim) and RZAT |
191 |
+diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c |
192 |
+index 80ff95f75199f..29c51762336d7 100644 |
193 |
+--- a/drivers/dma/sh/rcar-dmac.c |
194 |
++++ b/drivers/dma/sh/rcar-dmac.c |
195 |
+@@ -1817,7 +1817,9 @@ static int rcar_dmac_probe(struct platform_device *pdev) |
196 |
+ platform_set_drvdata(pdev, dmac); |
197 |
+ dmac->dev->dma_parms = &dmac->parms; |
198 |
+ dma_set_max_seg_size(dmac->dev, RCAR_DMATCR_MASK); |
199 |
+- dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40)); |
200 |
++ ret = dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40)); |
201 |
++ if (ret) |
202 |
++ return ret; |
203 |
+ |
204 |
+ ret = rcar_dmac_parse_of(&pdev->dev, dmac); |
205 |
+ if (ret < 0) |
206 |
+diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c |
207 |
+index fd440b35d76ed..61d72bd967543 100644 |
208 |
+--- a/drivers/edac/edac_mc.c |
209 |
++++ b/drivers/edac/edac_mc.c |
210 |
+@@ -265,7 +265,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems) |
211 |
+ else |
212 |
+ return (char *)ptr; |
213 |
+ |
214 |
+- r = (unsigned long)p % align; |
215 |
++ r = (unsigned long)ptr % align; |
216 |
+ |
217 |
+ if (r == 0) |
218 |
+ return (char *)ptr; |
219 |
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
220 |
+index e67ed383e11b1..79aef5c063fae 100644 |
221 |
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c |
222 |
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
223 |
+@@ -193,7 +193,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, |
224 |
+ * so don't register a backlight device |
225 |
+ */ |
226 |
+ if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && |
227 |
+- (rdev->pdev->device == 0x6741)) |
228 |
++ (rdev->pdev->device == 0x6741) && |
229 |
++ !dmi_match(DMI_PRODUCT_NAME, "iMac12,1")) |
230 |
+ return; |
231 |
+ |
232 |
+ if (!radeon_encoder->enc_priv) |
233 |
+diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c |
234 |
+index cdd4392c589d3..a3f6933f94e30 100644 |
235 |
+--- a/drivers/hv/channel_mgmt.c |
236 |
++++ b/drivers/hv/channel_mgmt.c |
237 |
+@@ -350,6 +350,7 @@ static struct vmbus_channel *alloc_channel(void) |
238 |
+ static void free_channel(struct vmbus_channel *channel) |
239 |
+ { |
240 |
+ tasklet_kill(&channel->callback_event); |
241 |
++ vmbus_remove_channel_attr_group(channel); |
242 |
+ |
243 |
+ kobject_put(&channel->kobj); |
244 |
+ } |
245 |
+diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h |
246 |
+index 7e7c8debbd285..c4ad518890243 100644 |
247 |
+--- a/drivers/hv/hyperv_vmbus.h |
248 |
++++ b/drivers/hv/hyperv_vmbus.h |
249 |
+@@ -392,6 +392,8 @@ void vmbus_device_unregister(struct hv_device *device_obj); |
250 |
+ int vmbus_add_channel_kobj(struct hv_device *device_obj, |
251 |
+ struct vmbus_channel *channel); |
252 |
+ |
253 |
++void vmbus_remove_channel_attr_group(struct vmbus_channel *channel); |
254 |
++ |
255 |
+ struct vmbus_channel *relid2channel(u32 relid); |
256 |
+ |
257 |
+ void vmbus_free_channels(void); |
258 |
+diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c |
259 |
+index 0699c60188895..51fe219c91fc3 100644 |
260 |
+--- a/drivers/hv/vmbus_drv.c |
261 |
++++ b/drivers/hv/vmbus_drv.c |
262 |
+@@ -609,7 +609,36 @@ static struct attribute *vmbus_dev_attrs[] = { |
263 |
+ &dev_attr_device.attr, |
264 |
+ NULL, |
265 |
+ }; |
266 |
+-ATTRIBUTE_GROUPS(vmbus_dev); |
267 |
++ |
268 |
++/* |
269 |
++ * Device-level attribute_group callback function. Returns the permission for |
270 |
++ * each attribute, and returns 0 if an attribute is not visible. |
271 |
++ */ |
272 |
++static umode_t vmbus_dev_attr_is_visible(struct kobject *kobj, |
273 |
++ struct attribute *attr, int idx) |
274 |
++{ |
275 |
++ struct device *dev = kobj_to_dev(kobj); |
276 |
++ const struct hv_device *hv_dev = device_to_hv_device(dev); |
277 |
++ |
278 |
++ /* Hide the monitor attributes if the monitor mechanism is not used. */ |
279 |
++ if (!hv_dev->channel->offermsg.monitor_allocated && |
280 |
++ (attr == &dev_attr_monitor_id.attr || |
281 |
++ attr == &dev_attr_server_monitor_pending.attr || |
282 |
++ attr == &dev_attr_client_monitor_pending.attr || |
283 |
++ attr == &dev_attr_server_monitor_latency.attr || |
284 |
++ attr == &dev_attr_client_monitor_latency.attr || |
285 |
++ attr == &dev_attr_server_monitor_conn_id.attr || |
286 |
++ attr == &dev_attr_client_monitor_conn_id.attr)) |
287 |
++ return 0; |
288 |
++ |
289 |
++ return attr->mode; |
290 |
++} |
291 |
++ |
292 |
++static const struct attribute_group vmbus_dev_group = { |
293 |
++ .attrs = vmbus_dev_attrs, |
294 |
++ .is_visible = vmbus_dev_attr_is_visible |
295 |
++}; |
296 |
++__ATTRIBUTE_GROUPS(vmbus_dev); |
297 |
+ |
298 |
+ /* |
299 |
+ * vmbus_uevent - add uevent for our device |
300 |
+@@ -1484,10 +1513,34 @@ static struct attribute *vmbus_chan_attrs[] = { |
301 |
+ NULL |
302 |
+ }; |
303 |
+ |
304 |
++/* |
305 |
++ * Channel-level attribute_group callback function. Returns the permission for |
306 |
++ * each attribute, and returns 0 if an attribute is not visible. |
307 |
++ */ |
308 |
++static umode_t vmbus_chan_attr_is_visible(struct kobject *kobj, |
309 |
++ struct attribute *attr, int idx) |
310 |
++{ |
311 |
++ const struct vmbus_channel *channel = |
312 |
++ container_of(kobj, struct vmbus_channel, kobj); |
313 |
++ |
314 |
++ /* Hide the monitor attributes if the monitor mechanism is not used. */ |
315 |
++ if (!channel->offermsg.monitor_allocated && |
316 |
++ (attr == &chan_attr_pending.attr || |
317 |
++ attr == &chan_attr_latency.attr || |
318 |
++ attr == &chan_attr_monitor_id.attr)) |
319 |
++ return 0; |
320 |
++ |
321 |
++ return attr->mode; |
322 |
++} |
323 |
++ |
324 |
++static struct attribute_group vmbus_chan_group = { |
325 |
++ .attrs = vmbus_chan_attrs, |
326 |
++ .is_visible = vmbus_chan_attr_is_visible |
327 |
++}; |
328 |
++ |
329 |
+ static struct kobj_type vmbus_chan_ktype = { |
330 |
+ .sysfs_ops = &vmbus_chan_sysfs_ops, |
331 |
+ .release = vmbus_chan_release, |
332 |
+- .default_attrs = vmbus_chan_attrs, |
333 |
+ }; |
334 |
+ |
335 |
+ /* |
336 |
+@@ -1495,6 +1548,7 @@ static struct kobj_type vmbus_chan_ktype = { |
337 |
+ */ |
338 |
+ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) |
339 |
+ { |
340 |
++ const struct device *device = &dev->device; |
341 |
+ struct kobject *kobj = &channel->kobj; |
342 |
+ u32 relid = channel->offermsg.child_relid; |
343 |
+ int ret; |
344 |
+@@ -1502,14 +1556,36 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) |
345 |
+ kobj->kset = dev->channels_kset; |
346 |
+ ret = kobject_init_and_add(kobj, &vmbus_chan_ktype, NULL, |
347 |
+ "%u", relid); |
348 |
+- if (ret) |
349 |
++ if (ret) { |
350 |
++ kobject_put(kobj); |
351 |
++ return ret; |
352 |
++ } |
353 |
++ |
354 |
++ ret = sysfs_create_group(kobj, &vmbus_chan_group); |
355 |
++ |
356 |
++ if (ret) { |
357 |
++ /* |
358 |
++ * The calling functions' error handling paths will cleanup the |
359 |
++ * empty channel directory. |
360 |
++ */ |
361 |
++ kobject_put(kobj); |
362 |
++ dev_err(device, "Unable to set up channel sysfs files\n"); |
363 |
+ return ret; |
364 |
++ } |
365 |
+ |
366 |
+ kobject_uevent(kobj, KOBJ_ADD); |
367 |
+ |
368 |
+ return 0; |
369 |
+ } |
370 |
+ |
371 |
++/* |
372 |
++ * vmbus_remove_channel_attr_group - remove the channel's attribute group |
373 |
++ */ |
374 |
++void vmbus_remove_channel_attr_group(struct vmbus_channel *channel) |
375 |
++{ |
376 |
++ sysfs_remove_group(&channel->kobj, &vmbus_chan_group); |
377 |
++} |
378 |
++ |
379 |
+ /* |
380 |
+ * vmbus_device_create - Creates and registers a new child device |
381 |
+ * on the vmbus. |
382 |
+diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c |
383 |
+index 2086a96307bf9..1e8890601ca3b 100644 |
384 |
+--- a/drivers/i2c/busses/i2c-brcmstb.c |
385 |
++++ b/drivers/i2c/busses/i2c-brcmstb.c |
386 |
+@@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev) |
387 |
+ |
388 |
+ /* set the data in/out register size for compatible SoCs */ |
389 |
+ if (of_device_is_compatible(dev->device->of_node, |
390 |
+- "brcmstb,brcmper-i2c")) |
391 |
++ "brcm,brcmper-i2c")) |
392 |
+ dev->data_regsz = sizeof(u8); |
393 |
+ else |
394 |
+ dev->data_regsz = sizeof(u32); |
395 |
+diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c |
396 |
+index 532e9d68c7042..767cdd3f773bb 100644 |
397 |
+--- a/drivers/irqchip/irq-sifive-plic.c |
398 |
++++ b/drivers/irqchip/irq-sifive-plic.c |
399 |
+@@ -258,3 +258,4 @@ out_iounmap: |
400 |
+ |
401 |
+ IRQCHIP_DECLARE(sifive_plic, "sifive,plic-1.0.0", plic_init); |
402 |
+ IRQCHIP_DECLARE(riscv_plic0, "riscv,plic0", plic_init); /* for legacy systems */ |
403 |
++IRQCHIP_DECLARE(thead_c900_plic, "thead,c900-plic", plic_init); /* for firmware driver */ |
404 |
+diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c |
405 |
+index d1cc0fdbc51c8..630f3bcba56dd 100644 |
406 |
+--- a/drivers/mmc/core/block.c |
407 |
++++ b/drivers/mmc/core/block.c |
408 |
+@@ -1678,31 +1678,31 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req) |
409 |
+ struct mmc_card *card = mq->card; |
410 |
+ struct mmc_host *host = card->host; |
411 |
+ blk_status_t error = BLK_STS_OK; |
412 |
+- int retries = 0; |
413 |
+ |
414 |
+ do { |
415 |
+ u32 status; |
416 |
+ int err; |
417 |
++ int retries = 0; |
418 |
+ |
419 |
+- mmc_blk_rw_rq_prep(mqrq, card, 1, mq); |
420 |
++ while (retries++ <= MMC_READ_SINGLE_RETRIES) { |
421 |
++ mmc_blk_rw_rq_prep(mqrq, card, 1, mq); |
422 |
+ |
423 |
+- mmc_wait_for_req(host, mrq); |
424 |
++ mmc_wait_for_req(host, mrq); |
425 |
+ |
426 |
+- err = mmc_send_status(card, &status); |
427 |
+- if (err) |
428 |
+- goto error_exit; |
429 |
+- |
430 |
+- if (!mmc_host_is_spi(host) && |
431 |
+- !mmc_blk_in_tran_state(status)) { |
432 |
+- err = mmc_blk_fix_state(card, req); |
433 |
++ err = mmc_send_status(card, &status); |
434 |
+ if (err) |
435 |
+ goto error_exit; |
436 |
+- } |
437 |
+ |
438 |
+- if (mrq->cmd->error && retries++ < MMC_READ_SINGLE_RETRIES) |
439 |
+- continue; |
440 |
++ if (!mmc_host_is_spi(host) && |
441 |
++ !mmc_blk_in_tran_state(status)) { |
442 |
++ err = mmc_blk_fix_state(card, req); |
443 |
++ if (err) |
444 |
++ goto error_exit; |
445 |
++ } |
446 |
+ |
447 |
+- retries = 0; |
448 |
++ if (!mrq->cmd->error) |
449 |
++ break; |
450 |
++ } |
451 |
+ |
452 |
+ if (mrq->cmd->error || |
453 |
+ mrq->data->error || |
454 |
+diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c b/drivers/mtd/nand/raw/brcmnand/brcmnand.c |
455 |
+index 774ffa9e23f38..27bafb8fc35af 100644 |
456 |
+--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c |
457 |
++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c |
458 |
+@@ -589,6 +589,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl, |
459 |
+ __raw_writel(val, ctrl->nand_fc + word * 4); |
460 |
+ } |
461 |
+ |
462 |
++static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl) |
463 |
++{ |
464 |
++ |
465 |
++ /* Clear error addresses */ |
466 |
++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); |
467 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); |
468 |
++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); |
469 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); |
470 |
++} |
471 |
++ |
472 |
++static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl) |
473 |
++{ |
474 |
++ u64 err_addr; |
475 |
++ |
476 |
++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR); |
477 |
++ err_addr |= ((u64)(brcmnand_read_reg(ctrl, |
478 |
++ BRCMNAND_UNCORR_EXT_ADDR) |
479 |
++ & 0xffff) << 32); |
480 |
++ |
481 |
++ return err_addr; |
482 |
++} |
483 |
++ |
484 |
++static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl) |
485 |
++{ |
486 |
++ u64 err_addr; |
487 |
++ |
488 |
++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR); |
489 |
++ err_addr |= ((u64)(brcmnand_read_reg(ctrl, |
490 |
++ BRCMNAND_CORR_EXT_ADDR) |
491 |
++ & 0xffff) << 32); |
492 |
++ |
493 |
++ return err_addr; |
494 |
++} |
495 |
++ |
496 |
++static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr) |
497 |
++{ |
498 |
++ struct nand_chip *chip = mtd_to_nand(mtd); |
499 |
++ struct brcmnand_host *host = nand_get_controller_data(chip); |
500 |
++ struct brcmnand_controller *ctrl = host->ctrl; |
501 |
++ |
502 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
503 |
++ (host->cs << 16) | ((addr >> 32) & 0xffff)); |
504 |
++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
505 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, |
506 |
++ lower_32_bits(addr)); |
507 |
++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
508 |
++} |
509 |
++ |
510 |
+ static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs, |
511 |
+ enum brcmnand_cs_reg reg) |
512 |
+ { |
513 |
+@@ -1217,9 +1265,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) |
514 |
+ { |
515 |
+ struct brcmnand_controller *ctrl = host->ctrl; |
516 |
+ int ret; |
517 |
++ u64 cmd_addr; |
518 |
++ |
519 |
++ cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
520 |
++ |
521 |
++ dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr); |
522 |
+ |
523 |
+- dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd, |
524 |
+- brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS)); |
525 |
+ BUG_ON(ctrl->cmd_pending != 0); |
526 |
+ ctrl->cmd_pending = cmd; |
527 |
+ |
528 |
+@@ -1380,12 +1431,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command, |
529 |
+ if (!native_cmd) |
530 |
+ return; |
531 |
+ |
532 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
533 |
+- (host->cs << 16) | ((addr >> 32) & 0xffff)); |
534 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
535 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr)); |
536 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
537 |
+- |
538 |
++ brcmnand_set_cmd_addr(mtd, addr); |
539 |
+ brcmnand_send_cmd(host, native_cmd); |
540 |
+ brcmnand_waitfunc(mtd, chip); |
541 |
+ |
542 |
+@@ -1605,20 +1651,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, |
543 |
+ struct brcmnand_controller *ctrl = host->ctrl; |
544 |
+ int i, j, ret = 0; |
545 |
+ |
546 |
+- /* Clear error addresses */ |
547 |
+- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); |
548 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); |
549 |
+- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); |
550 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); |
551 |
+- |
552 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
553 |
+- (host->cs << 16) | ((addr >> 32) & 0xffff)); |
554 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
555 |
++ brcmnand_clear_ecc_addr(ctrl); |
556 |
+ |
557 |
+ for (i = 0; i < trans; i++, addr += FC_BYTES) { |
558 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, |
559 |
+- lower_32_bits(addr)); |
560 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
561 |
++ brcmnand_set_cmd_addr(mtd, addr); |
562 |
+ /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */ |
563 |
+ brcmnand_send_cmd(host, CMD_PAGE_READ); |
564 |
+ brcmnand_waitfunc(mtd, chip); |
565 |
+@@ -1637,22 +1673,16 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, |
566 |
+ mtd->oobsize / trans, |
567 |
+ host->hwcfg.sector_size_1k); |
568 |
+ |
569 |
+- if (!ret) { |
570 |
+- *err_addr = brcmnand_read_reg(ctrl, |
571 |
+- BRCMNAND_UNCORR_ADDR) | |
572 |
+- ((u64)(brcmnand_read_reg(ctrl, |
573 |
+- BRCMNAND_UNCORR_EXT_ADDR) |
574 |
+- & 0xffff) << 32); |
575 |
++ if (ret != -EBADMSG) { |
576 |
++ *err_addr = brcmnand_get_uncorrecc_addr(ctrl); |
577 |
++ |
578 |
+ if (*err_addr) |
579 |
+ ret = -EBADMSG; |
580 |
+ } |
581 |
+ |
582 |
+ if (!ret) { |
583 |
+- *err_addr = brcmnand_read_reg(ctrl, |
584 |
+- BRCMNAND_CORR_ADDR) | |
585 |
+- ((u64)(brcmnand_read_reg(ctrl, |
586 |
+- BRCMNAND_CORR_EXT_ADDR) |
587 |
+- & 0xffff) << 32); |
588 |
++ *err_addr = brcmnand_get_correcc_addr(ctrl); |
589 |
++ |
590 |
+ if (*err_addr) |
591 |
+ ret = -EUCLEAN; |
592 |
+ } |
593 |
+@@ -1722,7 +1752,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, |
594 |
+ dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); |
595 |
+ |
596 |
+ try_dmaread: |
597 |
+- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); |
598 |
++ brcmnand_clear_ecc_addr(ctrl); |
599 |
+ |
600 |
+ if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { |
601 |
+ err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES, |
602 |
+@@ -1866,15 +1896,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, |
603 |
+ goto out; |
604 |
+ } |
605 |
+ |
606 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
607 |
+- (host->cs << 16) | ((addr >> 32) & 0xffff)); |
608 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
609 |
+- |
610 |
+ for (i = 0; i < trans; i++, addr += FC_BYTES) { |
611 |
+ /* full address MUST be set before populating FC */ |
612 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, |
613 |
+- lower_32_bits(addr)); |
614 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
615 |
++ brcmnand_set_cmd_addr(mtd, addr); |
616 |
+ |
617 |
+ if (buf) { |
618 |
+ brcmnand_soc_data_bus_prepare(ctrl->soc, false); |
619 |
+diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c |
620 |
+index 148c7a16f3188..c64b408f080a9 100644 |
621 |
+--- a/drivers/mtd/nand/raw/qcom_nandc.c |
622 |
++++ b/drivers/mtd/nand/raw/qcom_nandc.c |
623 |
+@@ -10,7 +10,6 @@ |
624 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
625 |
+ * GNU General Public License for more details. |
626 |
+ */ |
627 |
+- |
628 |
+ #include <linux/clk.h> |
629 |
+ #include <linux/slab.h> |
630 |
+ #include <linux/bitops.h> |
631 |
+@@ -2959,10 +2958,6 @@ static int qcom_nandc_probe(struct platform_device *pdev) |
632 |
+ if (!nandc->base_dma) |
633 |
+ return -ENXIO; |
634 |
+ |
635 |
+- ret = qcom_nandc_alloc(nandc); |
636 |
+- if (ret) |
637 |
+- goto err_nandc_alloc; |
638 |
+- |
639 |
+ ret = clk_prepare_enable(nandc->core_clk); |
640 |
+ if (ret) |
641 |
+ goto err_core_clk; |
642 |
+@@ -2971,6 +2966,10 @@ static int qcom_nandc_probe(struct platform_device *pdev) |
643 |
+ if (ret) |
644 |
+ goto err_aon_clk; |
645 |
+ |
646 |
++ ret = qcom_nandc_alloc(nandc); |
647 |
++ if (ret) |
648 |
++ goto err_nandc_alloc; |
649 |
++ |
650 |
+ ret = qcom_nandc_setup(nandc); |
651 |
+ if (ret) |
652 |
+ goto err_setup; |
653 |
+@@ -2982,15 +2981,14 @@ static int qcom_nandc_probe(struct platform_device *pdev) |
654 |
+ return 0; |
655 |
+ |
656 |
+ err_setup: |
657 |
++ qcom_nandc_unalloc(nandc); |
658 |
++err_nandc_alloc: |
659 |
+ clk_disable_unprepare(nandc->aon_clk); |
660 |
+ err_aon_clk: |
661 |
+ clk_disable_unprepare(nandc->core_clk); |
662 |
+ err_core_clk: |
663 |
+- qcom_nandc_unalloc(nandc); |
664 |
+-err_nandc_alloc: |
665 |
+ dma_unmap_resource(dev, res->start, resource_size(res), |
666 |
+ DMA_BIDIRECTIONAL, 0); |
667 |
+- |
668 |
+ return ret; |
669 |
+ } |
670 |
+ |
671 |
+diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c |
672 |
+index 035923876c617..e3f814e83d9c8 100644 |
673 |
+--- a/drivers/net/bonding/bond_3ad.c |
674 |
++++ b/drivers/net/bonding/bond_3ad.c |
675 |
+@@ -249,7 +249,7 @@ static inline int __check_agg_selection_timer(struct port *port) |
676 |
+ if (bond == NULL) |
677 |
+ return 0; |
678 |
+ |
679 |
+- return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0; |
680 |
++ return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0; |
681 |
+ } |
682 |
+ |
683 |
+ /** |
684 |
+@@ -1965,7 +1965,7 @@ static void ad_marker_response_received(struct bond_marker *marker, |
685 |
+ */ |
686 |
+ void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout) |
687 |
+ { |
688 |
+- BOND_AD_INFO(bond).agg_select_timer = timeout; |
689 |
++ atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout); |
690 |
+ } |
691 |
+ |
692 |
+ /** |
693 |
+@@ -2249,6 +2249,28 @@ void bond_3ad_update_ad_actor_settings(struct bonding *bond) |
694 |
+ spin_unlock_bh(&bond->mode_lock); |
695 |
+ } |
696 |
+ |
697 |
++/** |
698 |
++ * bond_agg_timer_advance - advance agg_select_timer |
699 |
++ * @bond: bonding structure |
700 |
++ * |
701 |
++ * Return true when agg_select_timer reaches 0. |
702 |
++ */ |
703 |
++static bool bond_agg_timer_advance(struct bonding *bond) |
704 |
++{ |
705 |
++ int val, nval; |
706 |
++ |
707 |
++ while (1) { |
708 |
++ val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer); |
709 |
++ if (!val) |
710 |
++ return false; |
711 |
++ nval = val - 1; |
712 |
++ if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer, |
713 |
++ val, nval) == val) |
714 |
++ break; |
715 |
++ } |
716 |
++ return nval == 0; |
717 |
++} |
718 |
++ |
719 |
+ /** |
720 |
+ * bond_3ad_state_machine_handler - handle state machines timeout |
721 |
+ * @bond: bonding struct to work on |
722 |
+@@ -2284,9 +2306,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work) |
723 |
+ if (!bond_has_slaves(bond)) |
724 |
+ goto re_arm; |
725 |
+ |
726 |
+- /* check if agg_select_timer timer after initialize is timed out */ |
727 |
+- if (BOND_AD_INFO(bond).agg_select_timer && |
728 |
+- !(--BOND_AD_INFO(bond).agg_select_timer)) { |
729 |
++ if (bond_agg_timer_advance(bond)) { |
730 |
+ slave = bond_first_slave_rcu(bond); |
731 |
+ port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; |
732 |
+ |
733 |
+diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c |
734 |
+index b89c474e6b6bf..70ce37cd94af5 100644 |
735 |
+--- a/drivers/net/dsa/lan9303-core.c |
736 |
++++ b/drivers/net/dsa/lan9303-core.c |
737 |
+@@ -1307,7 +1307,7 @@ static int lan9303_probe_reset_gpio(struct lan9303 *chip, |
738 |
+ struct device_node *np) |
739 |
+ { |
740 |
+ chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset", |
741 |
+- GPIOD_OUT_LOW); |
742 |
++ GPIOD_OUT_HIGH); |
743 |
+ if (IS_ERR(chip->reset_gpio)) |
744 |
+ return PTR_ERR(chip->reset_gpio); |
745 |
+ |
746 |
+diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
747 |
+index d110aa616a957..f162ac7d74e59 100644 |
748 |
+--- a/drivers/net/ethernet/cadence/macb_main.c |
749 |
++++ b/drivers/net/ethernet/cadence/macb_main.c |
750 |
+@@ -4073,7 +4073,7 @@ static int macb_probe(struct platform_device *pdev) |
751 |
+ |
752 |
+ #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
753 |
+ if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { |
754 |
+- dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); |
755 |
++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); |
756 |
+ bp->hw_dma_cap |= HW_DMA_CAP_64B; |
757 |
+ } |
758 |
+ #endif |
759 |
+diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c |
760 |
+index 3d9e915798668..1bc09b6c308f8 100644 |
761 |
+--- a/drivers/net/ieee802154/at86rf230.c |
762 |
++++ b/drivers/net/ieee802154/at86rf230.c |
763 |
+@@ -108,6 +108,7 @@ struct at86rf230_local { |
764 |
+ unsigned long cal_timeout; |
765 |
+ bool is_tx; |
766 |
+ bool is_tx_from_off; |
767 |
++ bool was_tx; |
768 |
+ u8 tx_retry; |
769 |
+ struct sk_buff *tx_skb; |
770 |
+ struct at86rf230_state_change tx; |
771 |
+@@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context) |
772 |
+ if (ctx->free) |
773 |
+ kfree(ctx); |
774 |
+ |
775 |
+- ieee802154_wake_queue(lp->hw); |
776 |
++ if (lp->was_tx) { |
777 |
++ lp->was_tx = 0; |
778 |
++ dev_kfree_skb_any(lp->tx_skb); |
779 |
++ ieee802154_wake_queue(lp->hw); |
780 |
++ } |
781 |
+ } |
782 |
+ |
783 |
+ static void |
784 |
+@@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context) |
785 |
+ struct at86rf230_state_change *ctx = context; |
786 |
+ struct at86rf230_local *lp = ctx->lp; |
787 |
+ |
788 |
+- lp->is_tx = 0; |
789 |
++ if (lp->is_tx) { |
790 |
++ lp->was_tx = 1; |
791 |
++ lp->is_tx = 0; |
792 |
++ } |
793 |
++ |
794 |
+ at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, |
795 |
+ at86rf230_async_error_recover_complete); |
796 |
+ } |
797 |
+diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c |
798 |
+index 3169c174006ab..7c5db4f73cce6 100644 |
799 |
+--- a/drivers/net/ieee802154/ca8210.c |
800 |
++++ b/drivers/net/ieee802154/ca8210.c |
801 |
+@@ -2975,8 +2975,8 @@ static void ca8210_hw_setup(struct ieee802154_hw *ca8210_hw) |
802 |
+ ca8210_hw->phy->cca.opt = NL802154_CCA_OPT_ENERGY_CARRIER_AND; |
803 |
+ ca8210_hw->phy->cca_ed_level = -9800; |
804 |
+ ca8210_hw->phy->symbol_duration = 16; |
805 |
+- ca8210_hw->phy->lifs_period = 40; |
806 |
+- ca8210_hw->phy->sifs_period = 12; |
807 |
++ ca8210_hw->phy->lifs_period = 40 * ca8210_hw->phy->symbol_duration; |
808 |
++ ca8210_hw->phy->sifs_period = 12 * ca8210_hw->phy->symbol_duration; |
809 |
+ ca8210_hw->flags = |
810 |
+ IEEE802154_HW_AFILT | |
811 |
+ IEEE802154_HW_OMIT_CKSUM | |
812 |
+diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c |
813 |
+index b2434b4798468..684eec0aa0d63 100644 |
814 |
+--- a/drivers/net/usb/ax88179_178a.c |
815 |
++++ b/drivers/net/usb/ax88179_178a.c |
816 |
+@@ -1373,59 +1373,69 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
817 |
+ u16 hdr_off; |
818 |
+ u32 *pkt_hdr; |
819 |
+ |
820 |
+- /* This check is no longer done by usbnet */ |
821 |
+- if (skb->len < dev->net->hard_header_len) |
822 |
++ /* At the end of the SKB, there's a header telling us how many packets |
823 |
++ * are bundled into this buffer and where we can find an array of |
824 |
++ * per-packet metadata (which contains elements encoded into u16). |
825 |
++ */ |
826 |
++ if (skb->len < 4) |
827 |
+ return 0; |
828 |
+- |
829 |
+ skb_trim(skb, skb->len - 4); |
830 |
+ memcpy(&rx_hdr, skb_tail_pointer(skb), 4); |
831 |
+ le32_to_cpus(&rx_hdr); |
832 |
+- |
833 |
+ pkt_cnt = (u16)rx_hdr; |
834 |
+ hdr_off = (u16)(rx_hdr >> 16); |
835 |
++ |
836 |
++ if (pkt_cnt == 0) |
837 |
++ return 0; |
838 |
++ |
839 |
++ /* Make sure that the bounds of the metadata array are inside the SKB |
840 |
++ * (and in front of the counter at the end). |
841 |
++ */ |
842 |
++ if (pkt_cnt * 2 + hdr_off > skb->len) |
843 |
++ return 0; |
844 |
+ pkt_hdr = (u32 *)(skb->data + hdr_off); |
845 |
+ |
846 |
+- while (pkt_cnt--) { |
847 |
++ /* Packets must not overlap the metadata array */ |
848 |
++ skb_trim(skb, hdr_off); |
849 |
++ |
850 |
++ for (; ; pkt_cnt--, pkt_hdr++) { |
851 |
+ u16 pkt_len; |
852 |
+ |
853 |
+ le32_to_cpus(pkt_hdr); |
854 |
+ pkt_len = (*pkt_hdr >> 16) & 0x1fff; |
855 |
+ |
856 |
+- /* Check CRC or runt packet */ |
857 |
+- if ((*pkt_hdr & AX_RXHDR_CRC_ERR) || |
858 |
+- (*pkt_hdr & AX_RXHDR_DROP_ERR)) { |
859 |
+- skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
860 |
+- pkt_hdr++; |
861 |
+- continue; |
862 |
+- } |
863 |
+- |
864 |
+- if (pkt_cnt == 0) { |
865 |
+- skb->len = pkt_len; |
866 |
+- /* Skip IP alignment pseudo header */ |
867 |
+- skb_pull(skb, 2); |
868 |
+- skb_set_tail_pointer(skb, skb->len); |
869 |
+- skb->truesize = pkt_len + sizeof(struct sk_buff); |
870 |
+- ax88179_rx_checksum(skb, pkt_hdr); |
871 |
+- return 1; |
872 |
+- } |
873 |
++ if (pkt_len > skb->len) |
874 |
++ return 0; |
875 |
+ |
876 |
+- ax_skb = skb_clone(skb, GFP_ATOMIC); |
877 |
+- if (ax_skb) { |
878 |
++ /* Check CRC or runt packet */ |
879 |
++ if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) && |
880 |
++ pkt_len >= 2 + ETH_HLEN) { |
881 |
++ bool last = (pkt_cnt == 0); |
882 |
++ |
883 |
++ if (last) { |
884 |
++ ax_skb = skb; |
885 |
++ } else { |
886 |
++ ax_skb = skb_clone(skb, GFP_ATOMIC); |
887 |
++ if (!ax_skb) |
888 |
++ return 0; |
889 |
++ } |
890 |
+ ax_skb->len = pkt_len; |
891 |
+ /* Skip IP alignment pseudo header */ |
892 |
+ skb_pull(ax_skb, 2); |
893 |
+ skb_set_tail_pointer(ax_skb, ax_skb->len); |
894 |
+ ax_skb->truesize = pkt_len + sizeof(struct sk_buff); |
895 |
+ ax88179_rx_checksum(ax_skb, pkt_hdr); |
896 |
++ |
897 |
++ if (last) |
898 |
++ return 1; |
899 |
++ |
900 |
+ usbnet_skb_return(dev, ax_skb); |
901 |
+- } else { |
902 |
+- return 0; |
903 |
+ } |
904 |
+ |
905 |
+- skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
906 |
+- pkt_hdr++; |
907 |
++ /* Trim this packet away from the SKB */ |
908 |
++ if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8)) |
909 |
++ return 0; |
910 |
+ } |
911 |
+- return 1; |
912 |
+ } |
913 |
+ |
914 |
+ static struct sk_buff * |
915 |
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
916 |
+index 54b37a30df18b..c2e872f926f1c 100644 |
917 |
+--- a/drivers/net/usb/qmi_wwan.c |
918 |
++++ b/drivers/net/usb/qmi_wwan.c |
919 |
+@@ -1358,6 +1358,8 @@ static const struct usb_device_id products[] = { |
920 |
+ {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
921 |
+ {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
922 |
+ {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ |
923 |
++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ |
924 |
++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ |
925 |
+ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
926 |
+ {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ |
927 |
+ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ |
928 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c |
929 |
+index c44108823f796..a43333512edc9 100644 |
930 |
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c |
931 |
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c |
932 |
+@@ -1549,6 +1549,8 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) |
933 |
+ out_unbind: |
934 |
+ complete(&drv->request_firmware_complete); |
935 |
+ device_release_driver(drv->trans->dev); |
936 |
++ /* drv has just been freed by the release */ |
937 |
++ failure = false; |
938 |
+ free: |
939 |
+ if (failure) |
940 |
+ iwl_dealloc_ucode(drv); |
941 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c |
942 |
+index 31e72e1ff1e26..80ae33bba6a86 100644 |
943 |
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c |
944 |
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c |
945 |
+@@ -310,8 +310,7 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans, |
946 |
+ /* This may fail if AMT took ownership of the device */ |
947 |
+ if (iwl_pcie_prepare_card_hw(trans)) { |
948 |
+ IWL_WARN(trans, "Exit HW not ready\n"); |
949 |
+- ret = -EIO; |
950 |
+- goto out; |
951 |
++ return -EIO; |
952 |
+ } |
953 |
+ |
954 |
+ iwl_enable_rfkill_int(trans); |
955 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
956 |
+index fcda33482887b..2d2afc1758304 100644 |
957 |
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
958 |
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
959 |
+@@ -1363,8 +1363,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, |
960 |
+ /* This may fail if AMT took ownership of the device */ |
961 |
+ if (iwl_pcie_prepare_card_hw(trans)) { |
962 |
+ IWL_WARN(trans, "Exit HW not ready\n"); |
963 |
+- ret = -EIO; |
964 |
+- goto out; |
965 |
++ return -EIO; |
966 |
+ } |
967 |
+ |
968 |
+ iwl_enable_rfkill_int(trans); |
969 |
+diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
970 |
+index e64310f2296f8..a0a805a5ab6b2 100644 |
971 |
+--- a/drivers/nvme/host/core.c |
972 |
++++ b/drivers/nvme/host/core.c |
973 |
+@@ -3463,7 +3463,14 @@ static void nvme_async_event_work(struct work_struct *work) |
974 |
+ container_of(work, struct nvme_ctrl, async_event_work); |
975 |
+ |
976 |
+ nvme_aen_uevent(ctrl); |
977 |
+- ctrl->ops->submit_async_event(ctrl); |
978 |
++ |
979 |
++ /* |
980 |
++ * The transport drivers must guarantee AER submission here is safe by |
981 |
++ * flushing ctrl async_event_work after changing the controller state |
982 |
++ * from LIVE and before freeing the admin queue. |
983 |
++ */ |
984 |
++ if (ctrl->state == NVME_CTRL_LIVE) |
985 |
++ ctrl->ops->submit_async_event(ctrl); |
986 |
+ } |
987 |
+ |
988 |
+ static bool nvme_ctrl_pp_status(struct nvme_ctrl *ctrl) |
989 |
+diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c |
990 |
+index 1f41cf80f827c..55f4999525037 100644 |
991 |
+--- a/drivers/nvme/host/rdma.c |
992 |
++++ b/drivers/nvme/host/rdma.c |
993 |
+@@ -1050,6 +1050,7 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work) |
994 |
+ struct nvme_rdma_ctrl, err_work); |
995 |
+ |
996 |
+ nvme_stop_keep_alive(&ctrl->ctrl); |
997 |
++ flush_work(&ctrl->ctrl.async_event_work); |
998 |
+ nvme_rdma_teardown_io_queues(ctrl, false); |
999 |
+ nvme_start_queues(&ctrl->ctrl); |
1000 |
+ nvme_rdma_teardown_admin_queue(ctrl, false); |
1001 |
+diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c |
1002 |
+index b7b2e811d5471..6efab7a06c5fc 100644 |
1003 |
+--- a/drivers/parisc/ccio-dma.c |
1004 |
++++ b/drivers/parisc/ccio-dma.c |
1005 |
+@@ -1010,7 +1010,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
1006 |
+ ioc->usg_calls++; |
1007 |
+ #endif |
1008 |
+ |
1009 |
+- while(sg_dma_len(sglist) && nents--) { |
1010 |
++ while (nents && sg_dma_len(sglist)) { |
1011 |
+ |
1012 |
+ #ifdef CCIO_COLLECT_STATS |
1013 |
+ ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT; |
1014 |
+@@ -1018,6 +1018,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
1015 |
+ ccio_unmap_page(dev, sg_dma_address(sglist), |
1016 |
+ sg_dma_len(sglist), direction, 0); |
1017 |
+ ++sglist; |
1018 |
++ nents--; |
1019 |
+ } |
1020 |
+ |
1021 |
+ DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
1022 |
+diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c |
1023 |
+index 0f19cc75cc0cf..f675dfe045118 100644 |
1024 |
+--- a/drivers/parisc/sba_iommu.c |
1025 |
++++ b/drivers/parisc/sba_iommu.c |
1026 |
+@@ -1063,7 +1063,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
1027 |
+ spin_unlock_irqrestore(&ioc->res_lock, flags); |
1028 |
+ #endif |
1029 |
+ |
1030 |
+- while (sg_dma_len(sglist) && nents--) { |
1031 |
++ while (nents && sg_dma_len(sglist)) { |
1032 |
+ |
1033 |
+ sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist), |
1034 |
+ direction, 0); |
1035 |
+@@ -1072,6 +1072,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
1036 |
+ ioc->usingle_calls--; /* kluge since call is unmap_sg() */ |
1037 |
+ #endif |
1038 |
+ ++sglist; |
1039 |
++ nents--; |
1040 |
+ } |
1041 |
+ |
1042 |
+ DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
1043 |
+diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c |
1044 |
+index 0809ae2aa9b14..51cc985216ff3 100644 |
1045 |
+--- a/drivers/tty/serial/8250/8250_gsc.c |
1046 |
++++ b/drivers/tty/serial/8250/8250_gsc.c |
1047 |
+@@ -26,7 +26,7 @@ static int __init serial_init_chip(struct parisc_device *dev) |
1048 |
+ unsigned long address; |
1049 |
+ int err; |
1050 |
+ |
1051 |
+-#ifdef CONFIG_64BIT |
1052 |
++#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC) |
1053 |
+ if (!dev->irq && (dev->id.sversion == 0xad)) |
1054 |
+ dev->irq = iosapic_serial_irq(dev); |
1055 |
+ #endif |
1056 |
+diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
1057 |
+index 1967d5fa681ad..eb2f8e84ffc9e 100644 |
1058 |
+--- a/fs/btrfs/send.c |
1059 |
++++ b/fs/btrfs/send.c |
1060 |
+@@ -4956,6 +4956,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len) |
1061 |
+ lock_page(page); |
1062 |
+ if (!PageUptodate(page)) { |
1063 |
+ unlock_page(page); |
1064 |
++ btrfs_err(fs_info, |
1065 |
++ "send: IO error at offset %llu for inode %llu root %llu", |
1066 |
++ page_offset(page), sctx->cur_ino, |
1067 |
++ sctx->send_root->root_key.objectid); |
1068 |
+ put_page(page); |
1069 |
+ ret = -EIO; |
1070 |
+ break; |
1071 |
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
1072 |
+index 2a45e0d3e593c..6c492fca60c41 100644 |
1073 |
+--- a/fs/ext4/extents.c |
1074 |
++++ b/fs/ext4/extents.c |
1075 |
+@@ -390,9 +390,12 @@ static int ext4_valid_extent_idx(struct inode *inode, |
1076 |
+ |
1077 |
+ static int ext4_valid_extent_entries(struct inode *inode, |
1078 |
+ struct ext4_extent_header *eh, |
1079 |
+- int depth) |
1080 |
++ ext4_fsblk_t *pblk, int depth) |
1081 |
+ { |
1082 |
+ unsigned short entries; |
1083 |
++ ext4_lblk_t lblock = 0; |
1084 |
++ ext4_lblk_t prev = 0; |
1085 |
++ |
1086 |
+ if (eh->eh_entries == 0) |
1087 |
+ return 1; |
1088 |
+ |
1089 |
+@@ -403,32 +406,36 @@ static int ext4_valid_extent_entries(struct inode *inode, |
1090 |
+ struct ext4_extent *ext = EXT_FIRST_EXTENT(eh); |
1091 |
+ struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; |
1092 |
+ ext4_fsblk_t pblock = 0; |
1093 |
+- ext4_lblk_t lblock = 0; |
1094 |
+- ext4_lblk_t prev = 0; |
1095 |
+- int len = 0; |
1096 |
+ while (entries) { |
1097 |
+ if (!ext4_valid_extent(inode, ext)) |
1098 |
+ return 0; |
1099 |
+ |
1100 |
+ /* Check for overlapping extents */ |
1101 |
+ lblock = le32_to_cpu(ext->ee_block); |
1102 |
+- len = ext4_ext_get_actual_len(ext); |
1103 |
+ if ((lblock <= prev) && prev) { |
1104 |
+ pblock = ext4_ext_pblock(ext); |
1105 |
+ es->s_last_error_block = cpu_to_le64(pblock); |
1106 |
+ return 0; |
1107 |
+ } |
1108 |
++ prev = lblock + ext4_ext_get_actual_len(ext) - 1; |
1109 |
+ ext++; |
1110 |
+ entries--; |
1111 |
+- prev = lblock + len - 1; |
1112 |
+ } |
1113 |
+ } else { |
1114 |
+ struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh); |
1115 |
+ while (entries) { |
1116 |
+ if (!ext4_valid_extent_idx(inode, ext_idx)) |
1117 |
+ return 0; |
1118 |
++ |
1119 |
++ /* Check for overlapping index extents */ |
1120 |
++ lblock = le32_to_cpu(ext_idx->ei_block); |
1121 |
++ if ((lblock <= prev) && prev) { |
1122 |
++ *pblk = ext4_idx_pblock(ext_idx); |
1123 |
++ return 0; |
1124 |
++ } |
1125 |
+ ext_idx++; |
1126 |
+ entries--; |
1127 |
++ prev = lblock; |
1128 |
+ } |
1129 |
+ } |
1130 |
+ return 1; |
1131 |
+@@ -462,7 +469,7 @@ static int __ext4_ext_check(const char *function, unsigned int line, |
1132 |
+ error_msg = "invalid eh_entries"; |
1133 |
+ goto corrupted; |
1134 |
+ } |
1135 |
+- if (!ext4_valid_extent_entries(inode, eh, depth)) { |
1136 |
++ if (!ext4_valid_extent_entries(inode, eh, &pblk, depth)) { |
1137 |
+ error_msg = "invalid extent entries"; |
1138 |
+ goto corrupted; |
1139 |
+ } |
1140 |
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
1141 |
+index a968b8b4b982f..10bc04af28824 100644 |
1142 |
+--- a/fs/nfs/dir.c |
1143 |
++++ b/fs/nfs/dir.c |
1144 |
+@@ -1629,14 +1629,14 @@ no_open: |
1145 |
+ if (!res) { |
1146 |
+ inode = d_inode(dentry); |
1147 |
+ if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
1148 |
+- !S_ISDIR(inode->i_mode)) |
1149 |
++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) |
1150 |
+ res = ERR_PTR(-ENOTDIR); |
1151 |
+ else if (inode && S_ISREG(inode->i_mode)) |
1152 |
+ res = ERR_PTR(-EOPENSTALE); |
1153 |
+ } else if (!IS_ERR(res)) { |
1154 |
+ inode = d_inode(res); |
1155 |
+ if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
1156 |
+- !S_ISDIR(inode->i_mode)) { |
1157 |
++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) { |
1158 |
+ dput(res); |
1159 |
+ res = ERR_PTR(-ENOTDIR); |
1160 |
+ } else if (inode && S_ISREG(inode->i_mode)) { |
1161 |
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
1162 |
+index 2cdd8883b7c5d..592b95ab378bd 100644 |
1163 |
+--- a/fs/nfs/inode.c |
1164 |
++++ b/fs/nfs/inode.c |
1165 |
+@@ -787,12 +787,9 @@ int nfs_getattr(const struct path *path, struct kstat *stat, |
1166 |
+ goto out_no_update; |
1167 |
+ |
1168 |
+ /* Flush out writes to the server in order to update c/mtime. */ |
1169 |
+- if ((request_mask & (STATX_CTIME|STATX_MTIME)) && |
1170 |
+- S_ISREG(inode->i_mode)) { |
1171 |
+- err = filemap_write_and_wait(inode->i_mapping); |
1172 |
+- if (err) |
1173 |
+- goto out; |
1174 |
+- } |
1175 |
++ if ((request_mask & (STATX_CTIME | STATX_MTIME)) && |
1176 |
++ S_ISREG(inode->i_mode)) |
1177 |
++ filemap_write_and_wait(inode->i_mapping); |
1178 |
+ |
1179 |
+ /* |
1180 |
+ * We may force a getattr if the user cares about atime. |
1181 |
+diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
1182 |
+index 1d1d393f4208d..ddb379abd919d 100644 |
1183 |
+--- a/fs/quota/dquot.c |
1184 |
++++ b/fs/quota/dquot.c |
1185 |
+@@ -687,9 +687,14 @@ int dquot_quota_sync(struct super_block *sb, int type) |
1186 |
+ /* This is not very clever (and fast) but currently I don't know about |
1187 |
+ * any other simple way of getting quota data to disk and we must get |
1188 |
+ * them there for userspace to be visible... */ |
1189 |
+- if (sb->s_op->sync_fs) |
1190 |
+- sb->s_op->sync_fs(sb, 1); |
1191 |
+- sync_blockdev(sb->s_bdev); |
1192 |
++ if (sb->s_op->sync_fs) { |
1193 |
++ ret = sb->s_op->sync_fs(sb, 1); |
1194 |
++ if (ret) |
1195 |
++ return ret; |
1196 |
++ } |
1197 |
++ ret = sync_blockdev(sb->s_bdev); |
1198 |
++ if (ret) |
1199 |
++ return ret; |
1200 |
+ |
1201 |
+ /* |
1202 |
+ * Now when everything is written we can discard the pagecache so |
1203 |
+diff --git a/fs/super.c b/fs/super.c |
1204 |
+index 9fb4553c46e63..8dc26e23f1a35 100644 |
1205 |
+--- a/fs/super.c |
1206 |
++++ b/fs/super.c |
1207 |
+@@ -1404,11 +1404,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb) |
1208 |
+ percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); |
1209 |
+ } |
1210 |
+ |
1211 |
+-static void sb_freeze_unlock(struct super_block *sb) |
1212 |
++static void sb_freeze_unlock(struct super_block *sb, int level) |
1213 |
+ { |
1214 |
+- int level; |
1215 |
+- |
1216 |
+- for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--) |
1217 |
++ for (level--; level >= 0; level--) |
1218 |
+ percpu_up_write(sb->s_writers.rw_sem + level); |
1219 |
+ } |
1220 |
+ |
1221 |
+@@ -1479,7 +1477,14 @@ int freeze_super(struct super_block *sb) |
1222 |
+ sb_wait_write(sb, SB_FREEZE_PAGEFAULT); |
1223 |
+ |
1224 |
+ /* All writers are done so after syncing there won't be dirty data */ |
1225 |
+- sync_filesystem(sb); |
1226 |
++ ret = sync_filesystem(sb); |
1227 |
++ if (ret) { |
1228 |
++ sb->s_writers.frozen = SB_UNFROZEN; |
1229 |
++ sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); |
1230 |
++ wake_up(&sb->s_writers.wait_unfrozen); |
1231 |
++ deactivate_locked_super(sb); |
1232 |
++ return ret; |
1233 |
++ } |
1234 |
+ |
1235 |
+ /* Now wait for internal filesystem counter */ |
1236 |
+ sb->s_writers.frozen = SB_FREEZE_FS; |
1237 |
+@@ -1491,7 +1496,7 @@ int freeze_super(struct super_block *sb) |
1238 |
+ printk(KERN_ERR |
1239 |
+ "VFS:Filesystem freeze failed\n"); |
1240 |
+ sb->s_writers.frozen = SB_UNFROZEN; |
1241 |
+- sb_freeze_unlock(sb); |
1242 |
++ sb_freeze_unlock(sb, SB_FREEZE_FS); |
1243 |
+ wake_up(&sb->s_writers.wait_unfrozen); |
1244 |
+ deactivate_locked_super(sb); |
1245 |
+ return ret; |
1246 |
+@@ -1542,7 +1547,7 @@ static int thaw_super_locked(struct super_block *sb) |
1247 |
+ } |
1248 |
+ |
1249 |
+ sb->s_writers.frozen = SB_UNFROZEN; |
1250 |
+- sb_freeze_unlock(sb); |
1251 |
++ sb_freeze_unlock(sb, SB_FREEZE_FS); |
1252 |
+ out: |
1253 |
+ wake_up(&sb->s_writers.wait_unfrozen); |
1254 |
+ deactivate_locked_super(sb); |
1255 |
+diff --git a/include/linux/sched.h b/include/linux/sched.h |
1256 |
+index 761d0f85c4a50..f92d5ae6d04e7 100644 |
1257 |
+--- a/include/linux/sched.h |
1258 |
++++ b/include/linux/sched.h |
1259 |
+@@ -1389,7 +1389,6 @@ extern struct pid *cad_pid; |
1260 |
+ #define PF_MEMALLOC 0x00000800 /* Allocating memory */ |
1261 |
+ #define PF_NPROC_EXCEEDED 0x00001000 /* set_user() noticed that RLIMIT_NPROC was exceeded */ |
1262 |
+ #define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */ |
1263 |
+-#define PF_USED_ASYNC 0x00004000 /* Used async_schedule*(), used by module init */ |
1264 |
+ #define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */ |
1265 |
+ #define PF_FROZEN 0x00010000 /* Frozen for system suspend */ |
1266 |
+ #define PF_KSWAPD 0x00020000 /* I am kswapd */ |
1267 |
+diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h |
1268 |
+index fc3111515f5cb..732bc3b4606bf 100644 |
1269 |
+--- a/include/net/bond_3ad.h |
1270 |
++++ b/include/net/bond_3ad.h |
1271 |
+@@ -265,7 +265,7 @@ struct ad_system { |
1272 |
+ |
1273 |
+ struct ad_bond_info { |
1274 |
+ struct ad_system system; /* 802.3ad system structure */ |
1275 |
+- u32 agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */ |
1276 |
++ atomic_t agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */ |
1277 |
+ u16 aggregator_identifier; |
1278 |
+ }; |
1279 |
+ |
1280 |
+diff --git a/kernel/async.c b/kernel/async.c |
1281 |
+index a893d6170944f..4bf1b00a28d86 100644 |
1282 |
+--- a/kernel/async.c |
1283 |
++++ b/kernel/async.c |
1284 |
+@@ -191,9 +191,6 @@ static async_cookie_t __async_schedule(async_func_t func, void *data, struct asy |
1285 |
+ atomic_inc(&entry_count); |
1286 |
+ spin_unlock_irqrestore(&async_lock, flags); |
1287 |
+ |
1288 |
+- /* mark that this task has queued an async job, used by module init */ |
1289 |
+- current->flags |= PF_USED_ASYNC; |
1290 |
+- |
1291 |
+ /* schedule for execution */ |
1292 |
+ queue_work(system_unbound_wq, &entry->work); |
1293 |
+ |
1294 |
+diff --git a/kernel/module.c b/kernel/module.c |
1295 |
+index 68637e661d75c..42a604401c4dd 100644 |
1296 |
+--- a/kernel/module.c |
1297 |
++++ b/kernel/module.c |
1298 |
+@@ -3526,12 +3526,6 @@ static noinline int do_init_module(struct module *mod) |
1299 |
+ } |
1300 |
+ freeinit->module_init = mod->init_layout.base; |
1301 |
+ |
1302 |
+- /* |
1303 |
+- * We want to find out whether @mod uses async during init. Clear |
1304 |
+- * PF_USED_ASYNC. async_schedule*() will set it. |
1305 |
+- */ |
1306 |
+- current->flags &= ~PF_USED_ASYNC; |
1307 |
+- |
1308 |
+ do_mod_ctors(mod); |
1309 |
+ /* Start the module */ |
1310 |
+ if (mod->init != NULL) |
1311 |
+@@ -3557,22 +3551,13 @@ static noinline int do_init_module(struct module *mod) |
1312 |
+ |
1313 |
+ /* |
1314 |
+ * We need to finish all async code before the module init sequence |
1315 |
+- * is done. This has potential to deadlock. For example, a newly |
1316 |
+- * detected block device can trigger request_module() of the |
1317 |
+- * default iosched from async probing task. Once userland helper |
1318 |
+- * reaches here, async_synchronize_full() will wait on the async |
1319 |
+- * task waiting on request_module() and deadlock. |
1320 |
+- * |
1321 |
+- * This deadlock is avoided by perfomring async_synchronize_full() |
1322 |
+- * iff module init queued any async jobs. This isn't a full |
1323 |
+- * solution as it will deadlock the same if module loading from |
1324 |
+- * async jobs nests more than once; however, due to the various |
1325 |
+- * constraints, this hack seems to be the best option for now. |
1326 |
+- * Please refer to the following thread for details. |
1327 |
++ * is done. This has potential to deadlock if synchronous module |
1328 |
++ * loading is requested from async (which is not allowed!). |
1329 |
+ * |
1330 |
+- * http://thread.gmane.org/gmane.linux.kernel/1420814 |
1331 |
++ * See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous |
1332 |
++ * request_module() from async workers") for more details. |
1333 |
+ */ |
1334 |
+- if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC)) |
1335 |
++ if (!mod->async_probe_requested) |
1336 |
+ async_synchronize_full(); |
1337 |
+ |
1338 |
+ ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base + |
1339 |
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
1340 |
+index 17e337a22c239..19a6b088f1e72 100644 |
1341 |
+--- a/kernel/trace/trace.c |
1342 |
++++ b/kernel/trace/trace.c |
1343 |
+@@ -232,6 +232,10 @@ __setup("trace_clock=", set_trace_boot_clock); |
1344 |
+ |
1345 |
+ static int __init set_tracepoint_printk(char *str) |
1346 |
+ { |
1347 |
++ /* Ignore the "tp_printk_stop_on_boot" param */ |
1348 |
++ if (*str == '_') |
1349 |
++ return 0; |
1350 |
++ |
1351 |
+ if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) |
1352 |
+ tracepoint_printk = 1; |
1353 |
+ return 1; |
1354 |
+diff --git a/kernel/tsacct.c b/kernel/tsacct.c |
1355 |
+index 370724b453918..8d7c6d3f1daa7 100644 |
1356 |
+--- a/kernel/tsacct.c |
1357 |
++++ b/kernel/tsacct.c |
1358 |
+@@ -46,11 +46,10 @@ void bacct_add_tsk(struct user_namespace *user_ns, |
1359 |
+ /* Convert to seconds for btime */ |
1360 |
+ do_div(delta, USEC_PER_SEC); |
1361 |
+ stats->ac_btime = get_seconds() - delta; |
1362 |
+- if (thread_group_leader(tsk)) { |
1363 |
++ if (tsk->flags & PF_EXITING) |
1364 |
+ stats->ac_exitcode = tsk->exit_code; |
1365 |
+- if (tsk->flags & PF_FORKNOEXEC) |
1366 |
+- stats->ac_flag |= AFORK; |
1367 |
+- } |
1368 |
++ if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC)) |
1369 |
++ stats->ac_flag |= AFORK; |
1370 |
+ if (tsk->flags & PF_SUPERPRIV) |
1371 |
+ stats->ac_flag |= ASU; |
1372 |
+ if (tsk->flags & PF_DUMPCORE) |
1373 |
+diff --git a/lib/iov_iter.c b/lib/iov_iter.c |
1374 |
+index 39e6e978029c1..4391962230319 100644 |
1375 |
+--- a/lib/iov_iter.c |
1376 |
++++ b/lib/iov_iter.c |
1377 |
+@@ -393,6 +393,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by |
1378 |
+ return 0; |
1379 |
+ pipe->nrbufs++; |
1380 |
+ buf->ops = &page_cache_pipe_buf_ops; |
1381 |
++ buf->flags = 0; |
1382 |
+ get_page(buf->page = page); |
1383 |
+ buf->offset = offset; |
1384 |
+ buf->len = bytes; |
1385 |
+@@ -517,6 +518,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, |
1386 |
+ break; |
1387 |
+ pipe->nrbufs++; |
1388 |
+ pipe->bufs[idx].ops = &default_pipe_buf_ops; |
1389 |
++ pipe->bufs[idx].flags = 0; |
1390 |
+ pipe->bufs[idx].page = page; |
1391 |
+ pipe->bufs[idx].offset = 0; |
1392 |
+ if (left <= PAGE_SIZE) { |
1393 |
+diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c |
1394 |
+index 567fdfd9678d5..a2bf5e4e9fbee 100644 |
1395 |
+--- a/net/ax25/af_ax25.c |
1396 |
++++ b/net/ax25/af_ax25.c |
1397 |
+@@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev) |
1398 |
+ { |
1399 |
+ ax25_dev *ax25_dev; |
1400 |
+ ax25_cb *s; |
1401 |
++ struct sock *sk; |
1402 |
+ |
1403 |
+ if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) |
1404 |
+ return; |
1405 |
+@@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev) |
1406 |
+ again: |
1407 |
+ ax25_for_each(s, &ax25_list) { |
1408 |
+ if (s->ax25_dev == ax25_dev) { |
1409 |
++ sk = s->sk; |
1410 |
++ sock_hold(sk); |
1411 |
+ spin_unlock_bh(&ax25_list_lock); |
1412 |
+- lock_sock(s->sk); |
1413 |
++ lock_sock(sk); |
1414 |
+ s->ax25_dev = NULL; |
1415 |
+- release_sock(s->sk); |
1416 |
++ release_sock(sk); |
1417 |
+ ax25_disconnect(s, ENETUNREACH); |
1418 |
+ spin_lock_bh(&ax25_list_lock); |
1419 |
+- |
1420 |
++ sock_put(sk); |
1421 |
+ /* The entry could have been deleted from the |
1422 |
+ * list meanwhile and thus the next pointer is |
1423 |
+ * no longer valid. Play it safe and restart |
1424 |
+diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c |
1425 |
+index 3978a5e8d261c..2ed6000126408 100644 |
1426 |
+--- a/net/core/drop_monitor.c |
1427 |
++++ b/net/core/drop_monitor.c |
1428 |
+@@ -219,13 +219,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi, |
1429 |
+ |
1430 |
+ rcu_read_lock(); |
1431 |
+ list_for_each_entry_rcu(new_stat, &hw_stats_list, list) { |
1432 |
++ struct net_device *dev; |
1433 |
++ |
1434 |
+ /* |
1435 |
+ * only add a note to our monitor buffer if: |
1436 |
+ * 1) this is the dev we received on |
1437 |
+ * 2) its after the last_rx delta |
1438 |
+ * 3) our rx_dropped count has gone up |
1439 |
+ */ |
1440 |
+- if ((new_stat->dev == napi->dev) && |
1441 |
++ /* Paired with WRITE_ONCE() in dropmon_net_event() */ |
1442 |
++ dev = READ_ONCE(new_stat->dev); |
1443 |
++ if ((dev == napi->dev) && |
1444 |
+ (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) && |
1445 |
+ (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) { |
1446 |
+ trace_drop_common(NULL, NULL); |
1447 |
+@@ -340,7 +344,10 @@ static int dropmon_net_event(struct notifier_block *ev_block, |
1448 |
+ mutex_lock(&trace_state_mutex); |
1449 |
+ list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) { |
1450 |
+ if (new_stat->dev == dev) { |
1451 |
+- new_stat->dev = NULL; |
1452 |
++ |
1453 |
++ /* Paired with READ_ONCE() in trace_napi_poll_hit() */ |
1454 |
++ WRITE_ONCE(new_stat->dev, NULL); |
1455 |
++ |
1456 |
+ if (trace_state == TRACE_OFF) { |
1457 |
+ list_del_rcu(&new_stat->list); |
1458 |
+ kfree_rcu(new_stat, rcu); |
1459 |
+diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c |
1460 |
+index 276442443d322..28d171e6e10b9 100644 |
1461 |
+--- a/net/ipv4/ping.c |
1462 |
++++ b/net/ipv4/ping.c |
1463 |
+@@ -177,16 +177,23 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident) |
1464 |
+ struct sock *sk = NULL; |
1465 |
+ struct inet_sock *isk; |
1466 |
+ struct hlist_nulls_node *hnode; |
1467 |
+- int dif = skb->dev->ifindex; |
1468 |
++ int dif, sdif; |
1469 |
+ |
1470 |
+ if (skb->protocol == htons(ETH_P_IP)) { |
1471 |
++ dif = inet_iif(skb); |
1472 |
++ sdif = inet_sdif(skb); |
1473 |
+ pr_debug("try to find: num = %d, daddr = %pI4, dif = %d\n", |
1474 |
+ (int)ident, &ip_hdr(skb)->daddr, dif); |
1475 |
+ #if IS_ENABLED(CONFIG_IPV6) |
1476 |
+ } else if (skb->protocol == htons(ETH_P_IPV6)) { |
1477 |
++ dif = inet6_iif(skb); |
1478 |
++ sdif = inet6_sdif(skb); |
1479 |
+ pr_debug("try to find: num = %d, daddr = %pI6c, dif = %d\n", |
1480 |
+ (int)ident, &ipv6_hdr(skb)->daddr, dif); |
1481 |
+ #endif |
1482 |
++ } else { |
1483 |
++ pr_err("ping: protocol(%x) is not supported\n", ntohs(skb->protocol)); |
1484 |
++ return NULL; |
1485 |
+ } |
1486 |
+ |
1487 |
+ read_lock_bh(&ping_table.lock); |
1488 |
+@@ -226,7 +233,7 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident) |
1489 |
+ } |
1490 |
+ |
1491 |
+ if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && |
1492 |
+- sk->sk_bound_dev_if != inet_sdif(skb)) |
1493 |
++ sk->sk_bound_dev_if != sdif) |
1494 |
+ continue; |
1495 |
+ |
1496 |
+ sock_hold(sk); |
1497 |
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c |
1498 |
+index 1e5e2e4be0b27..e85b5f57d3e92 100644 |
1499 |
+--- a/net/ipv4/xfrm4_policy.c |
1500 |
++++ b/net/ipv4/xfrm4_policy.c |
1501 |
+@@ -17,6 +17,7 @@ |
1502 |
+ #include <net/xfrm.h> |
1503 |
+ #include <net/ip.h> |
1504 |
+ #include <net/l3mdev.h> |
1505 |
++#include <net/inet_ecn.h> |
1506 |
+ |
1507 |
+ static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4, |
1508 |
+ int tos, int oif, |
1509 |
+@@ -126,7 +127,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1510 |
+ fl4->flowi4_proto = iph->protocol; |
1511 |
+ fl4->daddr = reverse ? iph->saddr : iph->daddr; |
1512 |
+ fl4->saddr = reverse ? iph->daddr : iph->saddr; |
1513 |
+- fl4->flowi4_tos = iph->tos; |
1514 |
++ fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK; |
1515 |
+ |
1516 |
+ if (!ip_is_fragment(iph)) { |
1517 |
+ switch (iph->protocol) { |
1518 |
+diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c |
1519 |
+index a937d4f75613f..8cb62805fd684 100644 |
1520 |
+--- a/net/netfilter/nf_conntrack_proto_sctp.c |
1521 |
++++ b/net/netfilter/nf_conntrack_proto_sctp.c |
1522 |
+@@ -394,6 +394,15 @@ static int sctp_packet(struct nf_conn *ct, |
1523 |
+ pr_debug("Setting vtag %x for dir %d\n", |
1524 |
+ ih->init_tag, !dir); |
1525 |
+ ct->proto.sctp.vtag[!dir] = ih->init_tag; |
1526 |
++ |
1527 |
++ /* don't renew timeout on init retransmit so |
1528 |
++ * port reuse by client or NAT middlebox cannot |
1529 |
++ * keep entry alive indefinitely (incl. nat info). |
1530 |
++ */ |
1531 |
++ if (new_state == SCTP_CONNTRACK_CLOSED && |
1532 |
++ old_state == SCTP_CONNTRACK_CLOSED && |
1533 |
++ nf_ct_is_confirmed(ct)) |
1534 |
++ ignore = true; |
1535 |
+ } |
1536 |
+ |
1537 |
+ ct->proto.sctp.state = new_state; |
1538 |
+diff --git a/net/sched/act_api.c b/net/sched/act_api.c |
1539 |
+index 26710b297dcbb..ad0773b20d831 100644 |
1540 |
+--- a/net/sched/act_api.c |
1541 |
++++ b/net/sched/act_api.c |
1542 |
+@@ -609,15 +609,24 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions, |
1543 |
+ restart_act_graph: |
1544 |
+ for (i = 0; i < nr_actions; i++) { |
1545 |
+ const struct tc_action *a = actions[i]; |
1546 |
++ int repeat_ttl; |
1547 |
+ |
1548 |
+ if (jmp_prgcnt > 0) { |
1549 |
+ jmp_prgcnt -= 1; |
1550 |
+ continue; |
1551 |
+ } |
1552 |
++ |
1553 |
++ repeat_ttl = 32; |
1554 |
+ repeat: |
1555 |
+ ret = a->ops->act(skb, a, res); |
1556 |
+- if (ret == TC_ACT_REPEAT) |
1557 |
+- goto repeat; /* we need a ttl - JHS */ |
1558 |
++ |
1559 |
++ if (unlikely(ret == TC_ACT_REPEAT)) { |
1560 |
++ if (--repeat_ttl != 0) |
1561 |
++ goto repeat; |
1562 |
++ /* suspicious opcode, stop pipeline */ |
1563 |
++ net_warn_ratelimited("TC_ACT_REPEAT abuse ?\n"); |
1564 |
++ return TC_ACT_OK; |
1565 |
++ } |
1566 |
+ |
1567 |
+ if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) { |
1568 |
+ jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK; |
1569 |
+diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
1570 |
+index 37329e11dc3cc..22931a5f62bc6 100644 |
1571 |
+--- a/net/vmw_vsock/af_vsock.c |
1572 |
++++ b/net/vmw_vsock/af_vsock.c |
1573 |
+@@ -1230,6 +1230,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, |
1574 |
+ sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; |
1575 |
+ sock->state = SS_UNCONNECTED; |
1576 |
+ vsock_transport_cancel_pkt(vsk); |
1577 |
++ vsock_remove_connected(vsk); |
1578 |
+ goto out_wait; |
1579 |
+ } else if (timeout == 0) { |
1580 |
+ err = -ETIMEDOUT; |
1581 |
+diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn |
1582 |
+index 486e135d3e30a..65df6141397fe 100644 |
1583 |
+--- a/scripts/Makefile.extrawarn |
1584 |
++++ b/scripts/Makefile.extrawarn |
1585 |
+@@ -73,5 +73,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare) |
1586 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length) |
1587 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized) |
1588 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) |
1589 |
++KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) |
1590 |
+ endif |
1591 |
+ endif |
1592 |
+diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c |
1593 |
+index 389814b02d06b..8c7e51a6273cc 100644 |
1594 |
+--- a/scripts/kconfig/preprocess.c |
1595 |
++++ b/scripts/kconfig/preprocess.c |
1596 |
+@@ -138,7 +138,7 @@ static char *do_lineno(int argc, char *argv[]) |
1597 |
+ static char *do_shell(int argc, char *argv[]) |
1598 |
+ { |
1599 |
+ FILE *p; |
1600 |
+- char buf[256]; |
1601 |
++ char buf[4096]; |
1602 |
+ char *cmd; |
1603 |
+ size_t nread; |
1604 |
+ int i; |
1605 |
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
1606 |
+index 7d4b6c31dfe70..686f0fed6f6e4 100644 |
1607 |
+--- a/sound/pci/hda/hda_intel.c |
1608 |
++++ b/sound/pci/hda/hda_intel.c |
1609 |
+@@ -1674,6 +1674,7 @@ static struct snd_pci_quirk probe_mask_list[] = { |
1610 |
+ /* forced codec slots */ |
1611 |
+ SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103), |
1612 |
+ SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), |
1613 |
++ SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105), |
1614 |
+ /* WinFast VP200 H (Teradici) user reported broken communication */ |
1615 |
+ SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101), |
1616 |
+ {} |
1617 |
+@@ -1859,8 +1860,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
1618 |
+ |
1619 |
+ assign_position_fix(chip, check_position_fix(chip, position_fix[dev])); |
1620 |
+ |
1621 |
+- check_probe_mask(chip, dev); |
1622 |
+- |
1623 |
+ if (single_cmd < 0) /* allow fallback to single_cmd at errors */ |
1624 |
+ chip->fallback_to_single_cmd = 1; |
1625 |
+ else /* explicitly set to single_cmd or not */ |
1626 |
+@@ -1889,6 +1888,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
1627 |
+ chip->bus.needs_damn_long_delay = 1; |
1628 |
+ } |
1629 |
+ |
1630 |
++ check_probe_mask(chip, dev); |
1631 |
++ |
1632 |
+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); |
1633 |
+ if (err < 0) { |
1634 |
+ dev_err(card->dev, "Error creating device [card]!\n"); |
1635 |
+diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c |
1636 |
+index ef8fd331526b0..f5dcd625e4355 100644 |
1637 |
+--- a/sound/soc/soc-ops.c |
1638 |
++++ b/sound/soc/soc-ops.c |
1639 |
+@@ -314,7 +314,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
1640 |
+ unsigned int sign_bit = mc->sign_bit; |
1641 |
+ unsigned int mask = (1 << fls(max)) - 1; |
1642 |
+ unsigned int invert = mc->invert; |
1643 |
+- int err; |
1644 |
++ int err, ret; |
1645 |
+ bool type_2r = false; |
1646 |
+ unsigned int val2 = 0; |
1647 |
+ unsigned int val, val_mask; |
1648 |
+@@ -356,12 +356,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
1649 |
+ err = snd_soc_component_update_bits(component, reg, val_mask, val); |
1650 |
+ if (err < 0) |
1651 |
+ return err; |
1652 |
++ ret = err; |
1653 |
+ |
1654 |
+- if (type_2r) |
1655 |
++ if (type_2r) { |
1656 |
+ err = snd_soc_component_update_bits(component, reg2, val_mask, |
1657 |
+- val2); |
1658 |
++ val2); |
1659 |
++ /* Don't discard any error code or drop change flag */ |
1660 |
++ if (ret == 0 || err < 0) { |
1661 |
++ ret = err; |
1662 |
++ } |
1663 |
++ } |
1664 |
+ |
1665 |
+- return err; |
1666 |
++ return ret; |
1667 |
+ } |
1668 |
+ EXPORT_SYMBOL_GPL(snd_soc_put_volsw); |
1669 |
+ |
1670 |
+@@ -517,7 +523,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1671 |
+ unsigned int mask = (1 << fls(max)) - 1; |
1672 |
+ unsigned int invert = mc->invert; |
1673 |
+ unsigned int val, val_mask; |
1674 |
+- int ret; |
1675 |
++ int err, ret; |
1676 |
+ |
1677 |
+ if (invert) |
1678 |
+ val = (max - ucontrol->value.integer.value[0]) & mask; |
1679 |
+@@ -526,9 +532,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1680 |
+ val_mask = mask << shift; |
1681 |
+ val = val << shift; |
1682 |
+ |
1683 |
+- ret = snd_soc_component_update_bits(component, reg, val_mask, val); |
1684 |
+- if (ret < 0) |
1685 |
+- return ret; |
1686 |
++ err = snd_soc_component_update_bits(component, reg, val_mask, val); |
1687 |
++ if (err < 0) |
1688 |
++ return err; |
1689 |
++ ret = err; |
1690 |
+ |
1691 |
+ if (snd_soc_volsw_is_stereo(mc)) { |
1692 |
+ if (invert) |
1693 |
+@@ -538,8 +545,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1694 |
+ val_mask = mask << shift; |
1695 |
+ val = val << shift; |
1696 |
+ |
1697 |
+- ret = snd_soc_component_update_bits(component, rreg, val_mask, |
1698 |
++ err = snd_soc_component_update_bits(component, rreg, val_mask, |
1699 |
+ val); |
1700 |
++ /* Don't discard any error code or drop change flag */ |
1701 |
++ if (ret == 0 || err < 0) { |
1702 |
++ ret = err; |
1703 |
++ } |
1704 |
+ } |
1705 |
+ |
1706 |
+ return ret; |
1707 |
+diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h |
1708 |
+index 794a375dad360..b2aec04fce8f6 100644 |
1709 |
+--- a/tools/lib/subcmd/subcmd-util.h |
1710 |
++++ b/tools/lib/subcmd/subcmd-util.h |
1711 |
+@@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...) |
1712 |
+ static inline void *xrealloc(void *ptr, size_t size) |
1713 |
+ { |
1714 |
+ void *ret = realloc(ptr, size); |
1715 |
+- if (!ret && !size) |
1716 |
+- ret = realloc(ptr, 1); |
1717 |
+- if (!ret) { |
1718 |
+- ret = realloc(ptr, size); |
1719 |
+- if (!ret && !size) |
1720 |
+- ret = realloc(ptr, 1); |
1721 |
+- if (!ret) |
1722 |
+- die("Out of memory, realloc failed"); |
1723 |
+- } |
1724 |
++ if (!ret) |
1725 |
++ die("Out of memory, realloc failed"); |
1726 |
+ return ret; |
1727 |
+ } |
1728 |
+ |
1729 |
+diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh |
1730 |
+index 232e958ec4547..b0b91d9b0dc21 100755 |
1731 |
+--- a/tools/testing/selftests/zram/zram.sh |
1732 |
++++ b/tools/testing/selftests/zram/zram.sh |
1733 |
+@@ -2,9 +2,6 @@ |
1734 |
+ # SPDX-License-Identifier: GPL-2.0 |
1735 |
+ TCID="zram.sh" |
1736 |
+ |
1737 |
+-# Kselftest framework requirement - SKIP code is 4. |
1738 |
+-ksft_skip=4 |
1739 |
+- |
1740 |
+ . ./zram_lib.sh |
1741 |
+ |
1742 |
+ run_zram () { |
1743 |
+@@ -18,14 +15,4 @@ echo "" |
1744 |
+ |
1745 |
+ check_prereqs |
1746 |
+ |
1747 |
+-# check zram module exists |
1748 |
+-MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
1749 |
+-if [ -f $MODULE_PATH ]; then |
1750 |
+- run_zram |
1751 |
+-elif [ -b /dev/zram0 ]; then |
1752 |
+- run_zram |
1753 |
+-else |
1754 |
+- echo "$TCID : No zram.ko module or /dev/zram0 device file not found" |
1755 |
+- echo "$TCID : CONFIG_ZRAM is not set" |
1756 |
+- exit $ksft_skip |
1757 |
+-fi |
1758 |
++run_zram |
1759 |
+diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh |
1760 |
+index b9566a6478a9c..8abc9965089d1 100755 |
1761 |
+--- a/tools/testing/selftests/zram/zram01.sh |
1762 |
++++ b/tools/testing/selftests/zram/zram01.sh |
1763 |
+@@ -42,9 +42,7 @@ zram_algs="lzo" |
1764 |
+ |
1765 |
+ zram_fill_fs() |
1766 |
+ { |
1767 |
+- local mem_free0=$(free -m | awk 'NR==2 {print $4}') |
1768 |
+- |
1769 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1770 |
++ for i in $(seq $dev_start $dev_end); do |
1771 |
+ echo "fill zram$i..." |
1772 |
+ local b=0 |
1773 |
+ while [ true ]; do |
1774 |
+@@ -54,29 +52,17 @@ zram_fill_fs() |
1775 |
+ b=$(($b + 1)) |
1776 |
+ done |
1777 |
+ echo "zram$i can be filled with '$b' KB" |
1778 |
+- done |
1779 |
+ |
1780 |
+- local mem_free1=$(free -m | awk 'NR==2 {print $4}') |
1781 |
+- local used_mem=$(($mem_free0 - $mem_free1)) |
1782 |
++ local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"` |
1783 |
++ local v=$((100 * 1024 * $b / $mem_used_total)) |
1784 |
++ if [ "$v" -lt 100 ]; then |
1785 |
++ echo "FAIL compression ratio: 0.$v:1" |
1786 |
++ ERR_CODE=-1 |
1787 |
++ return |
1788 |
++ fi |
1789 |
+ |
1790 |
+- local total_size=0 |
1791 |
+- for sm in $zram_sizes; do |
1792 |
+- local s=$(echo $sm | sed 's/M//') |
1793 |
+- total_size=$(($total_size + $s)) |
1794 |
++ echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
1795 |
+ done |
1796 |
+- |
1797 |
+- echo "zram used ${used_mem}M, zram disk sizes ${total_size}M" |
1798 |
+- |
1799 |
+- local v=$((100 * $total_size / $used_mem)) |
1800 |
+- |
1801 |
+- if [ "$v" -lt 100 ]; then |
1802 |
+- echo "FAIL compression ratio: 0.$v:1" |
1803 |
+- ERR_CODE=-1 |
1804 |
+- zram_cleanup |
1805 |
+- return |
1806 |
+- fi |
1807 |
+- |
1808 |
+- echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
1809 |
+ } |
1810 |
+ |
1811 |
+ check_prereqs |
1812 |
+@@ -90,7 +76,6 @@ zram_mount |
1813 |
+ |
1814 |
+ zram_fill_fs |
1815 |
+ zram_cleanup |
1816 |
+-zram_unload |
1817 |
+ |
1818 |
+ if [ $ERR_CODE -ne 0 ]; then |
1819 |
+ echo "$TCID : [FAIL]" |
1820 |
+diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh |
1821 |
+index 74569b883737f..3768cfd2e5f83 100755 |
1822 |
+--- a/tools/testing/selftests/zram/zram02.sh |
1823 |
++++ b/tools/testing/selftests/zram/zram02.sh |
1824 |
+@@ -45,7 +45,6 @@ zram_set_memlimit |
1825 |
+ zram_makeswap |
1826 |
+ zram_swapoff |
1827 |
+ zram_cleanup |
1828 |
+-zram_unload |
1829 |
+ |
1830 |
+ if [ $ERR_CODE -ne 0 ]; then |
1831 |
+ echo "$TCID : [FAIL]" |
1832 |
+diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh |
1833 |
+index 9e73a4fb9b0aa..130d193cbd727 100755 |
1834 |
+--- a/tools/testing/selftests/zram/zram_lib.sh |
1835 |
++++ b/tools/testing/selftests/zram/zram_lib.sh |
1836 |
+@@ -14,12 +14,17 @@ |
1837 |
+ # Author: Alexey Kodanev <alexey.kodanev@××××××.com> |
1838 |
+ # Modified: Naresh Kamboju <naresh.kamboju@××××××.org> |
1839 |
+ |
1840 |
+-MODULE=0 |
1841 |
+ dev_makeswap=-1 |
1842 |
+ dev_mounted=-1 |
1843 |
+- |
1844 |
++dev_start=0 |
1845 |
++dev_end=-1 |
1846 |
++module_load=-1 |
1847 |
++sys_control=-1 |
1848 |
+ # Kselftest framework requirement - SKIP code is 4. |
1849 |
+ ksft_skip=4 |
1850 |
++kernel_version=`uname -r | cut -d'.' -f1,2` |
1851 |
++kernel_major=${kernel_version%.*} |
1852 |
++kernel_minor=${kernel_version#*.} |
1853 |
+ |
1854 |
+ trap INT |
1855 |
+ |
1856 |
+@@ -34,68 +39,104 @@ check_prereqs() |
1857 |
+ fi |
1858 |
+ } |
1859 |
+ |
1860 |
++kernel_gte() |
1861 |
++{ |
1862 |
++ major=${1%.*} |
1863 |
++ minor=${1#*.} |
1864 |
++ |
1865 |
++ if [ $kernel_major -gt $major ]; then |
1866 |
++ return 0 |
1867 |
++ elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then |
1868 |
++ return 0 |
1869 |
++ fi |
1870 |
++ |
1871 |
++ return 1 |
1872 |
++} |
1873 |
++ |
1874 |
+ zram_cleanup() |
1875 |
+ { |
1876 |
+ echo "zram cleanup" |
1877 |
+ local i= |
1878 |
+- for i in $(seq 0 $dev_makeswap); do |
1879 |
++ for i in $(seq $dev_start $dev_makeswap); do |
1880 |
+ swapoff /dev/zram$i |
1881 |
+ done |
1882 |
+ |
1883 |
+- for i in $(seq 0 $dev_mounted); do |
1884 |
++ for i in $(seq $dev_start $dev_mounted); do |
1885 |
+ umount /dev/zram$i |
1886 |
+ done |
1887 |
+ |
1888 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1889 |
++ for i in $(seq $dev_start $dev_end); do |
1890 |
+ echo 1 > /sys/block/zram${i}/reset |
1891 |
+ rm -rf zram$i |
1892 |
+ done |
1893 |
+ |
1894 |
+-} |
1895 |
++ if [ $sys_control -eq 1 ]; then |
1896 |
++ for i in $(seq $dev_start $dev_end); do |
1897 |
++ echo $i > /sys/class/zram-control/hot_remove |
1898 |
++ done |
1899 |
++ fi |
1900 |
+ |
1901 |
+-zram_unload() |
1902 |
+-{ |
1903 |
+- if [ $MODULE -ne 0 ] ; then |
1904 |
+- echo "zram rmmod zram" |
1905 |
++ if [ $module_load -eq 1 ]; then |
1906 |
+ rmmod zram > /dev/null 2>&1 |
1907 |
+ fi |
1908 |
+ } |
1909 |
+ |
1910 |
+ zram_load() |
1911 |
+ { |
1912 |
+- # check zram module exists |
1913 |
+- MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
1914 |
+- if [ -f $MODULE_PATH ]; then |
1915 |
+- MODULE=1 |
1916 |
+- echo "create '$dev_num' zram device(s)" |
1917 |
+- modprobe zram num_devices=$dev_num |
1918 |
+- if [ $? -ne 0 ]; then |
1919 |
+- echo "failed to insert zram module" |
1920 |
+- exit 1 |
1921 |
+- fi |
1922 |
+- |
1923 |
+- dev_num_created=$(ls /dev/zram* | wc -w) |
1924 |
++ echo "create '$dev_num' zram device(s)" |
1925 |
++ |
1926 |
++ # zram module loaded, new kernel |
1927 |
++ if [ -d "/sys/class/zram-control" ]; then |
1928 |
++ echo "zram modules already loaded, kernel supports" \ |
1929 |
++ "zram-control interface" |
1930 |
++ dev_start=$(ls /dev/zram* | wc -w) |
1931 |
++ dev_end=$(($dev_start + $dev_num - 1)) |
1932 |
++ sys_control=1 |
1933 |
++ |
1934 |
++ for i in $(seq $dev_start $dev_end); do |
1935 |
++ cat /sys/class/zram-control/hot_add > /dev/null |
1936 |
++ done |
1937 |
++ |
1938 |
++ echo "all zram devices (/dev/zram$dev_start~$dev_end" \ |
1939 |
++ "successfully created" |
1940 |
++ return 0 |
1941 |
++ fi |
1942 |
+ |
1943 |
+- if [ "$dev_num_created" -ne "$dev_num" ]; then |
1944 |
+- echo "unexpected num of devices: $dev_num_created" |
1945 |
+- ERR_CODE=-1 |
1946 |
++ # detect old kernel or built-in |
1947 |
++ modprobe zram num_devices=$dev_num |
1948 |
++ if [ ! -d "/sys/class/zram-control" ]; then |
1949 |
++ if grep -q '^zram' /proc/modules; then |
1950 |
++ rmmod zram > /dev/null 2>&1 |
1951 |
++ if [ $? -ne 0 ]; then |
1952 |
++ echo "zram module is being used on old kernel" \ |
1953 |
++ "without zram-control interface" |
1954 |
++ exit $ksft_skip |
1955 |
++ fi |
1956 |
+ else |
1957 |
+- echo "zram load module successful" |
1958 |
++ echo "test needs CONFIG_ZRAM=m on old kernel without" \ |
1959 |
++ "zram-control interface" |
1960 |
++ exit $ksft_skip |
1961 |
+ fi |
1962 |
+- elif [ -b /dev/zram0 ]; then |
1963 |
+- echo "/dev/zram0 device file found: OK" |
1964 |
+- else |
1965 |
+- echo "ERROR: No zram.ko module or no /dev/zram0 device found" |
1966 |
+- echo "$TCID : CONFIG_ZRAM is not set" |
1967 |
+- exit 1 |
1968 |
++ modprobe zram num_devices=$dev_num |
1969 |
+ fi |
1970 |
++ |
1971 |
++ module_load=1 |
1972 |
++ dev_end=$(($dev_num - 1)) |
1973 |
++ echo "all zram devices (/dev/zram0~$dev_end) successfully created" |
1974 |
+ } |
1975 |
+ |
1976 |
+ zram_max_streams() |
1977 |
+ { |
1978 |
+ echo "set max_comp_streams to zram device(s)" |
1979 |
+ |
1980 |
+- local i=0 |
1981 |
++ kernel_gte 4.7 |
1982 |
++ if [ $? -eq 0 ]; then |
1983 |
++ echo "The device attribute max_comp_streams was"\ |
1984 |
++ "deprecated in 4.7" |
1985 |
++ return 0 |
1986 |
++ fi |
1987 |
++ |
1988 |
++ local i=$dev_start |
1989 |
+ for max_s in $zram_max_streams; do |
1990 |
+ local sys_path="/sys/block/zram${i}/max_comp_streams" |
1991 |
+ echo $max_s > $sys_path || \ |
1992 |
+@@ -107,7 +148,7 @@ zram_max_streams() |
1993 |
+ echo "FAIL can't set max_streams '$max_s', get $max_stream" |
1994 |
+ |
1995 |
+ i=$(($i + 1)) |
1996 |
+- echo "$sys_path = '$max_streams' ($i/$dev_num)" |
1997 |
++ echo "$sys_path = '$max_streams'" |
1998 |
+ done |
1999 |
+ |
2000 |
+ echo "zram max streams: OK" |
2001 |
+@@ -117,15 +158,16 @@ zram_compress_alg() |
2002 |
+ { |
2003 |
+ echo "test that we can set compression algorithm" |
2004 |
+ |
2005 |
+- local algs=$(cat /sys/block/zram0/comp_algorithm) |
2006 |
++ local i=$dev_start |
2007 |
++ local algs=$(cat /sys/block/zram${i}/comp_algorithm) |
2008 |
+ echo "supported algs: $algs" |
2009 |
+- local i=0 |
2010 |
++ |
2011 |
+ for alg in $zram_algs; do |
2012 |
+ local sys_path="/sys/block/zram${i}/comp_algorithm" |
2013 |
+ echo "$alg" > $sys_path || \ |
2014 |
+ echo "FAIL can't set '$alg' to $sys_path" |
2015 |
+ i=$(($i + 1)) |
2016 |
+- echo "$sys_path = '$alg' ($i/$dev_num)" |
2017 |
++ echo "$sys_path = '$alg'" |
2018 |
+ done |
2019 |
+ |
2020 |
+ echo "zram set compression algorithm: OK" |
2021 |
+@@ -134,14 +176,14 @@ zram_compress_alg() |
2022 |
+ zram_set_disksizes() |
2023 |
+ { |
2024 |
+ echo "set disk size to zram device(s)" |
2025 |
+- local i=0 |
2026 |
++ local i=$dev_start |
2027 |
+ for ds in $zram_sizes; do |
2028 |
+ local sys_path="/sys/block/zram${i}/disksize" |
2029 |
+ echo "$ds" > $sys_path || \ |
2030 |
+ echo "FAIL can't set '$ds' to $sys_path" |
2031 |
+ |
2032 |
+ i=$(($i + 1)) |
2033 |
+- echo "$sys_path = '$ds' ($i/$dev_num)" |
2034 |
++ echo "$sys_path = '$ds'" |
2035 |
+ done |
2036 |
+ |
2037 |
+ echo "zram set disksizes: OK" |
2038 |
+@@ -151,14 +193,14 @@ zram_set_memlimit() |
2039 |
+ { |
2040 |
+ echo "set memory limit to zram device(s)" |
2041 |
+ |
2042 |
+- local i=0 |
2043 |
++ local i=$dev_start |
2044 |
+ for ds in $zram_mem_limits; do |
2045 |
+ local sys_path="/sys/block/zram${i}/mem_limit" |
2046 |
+ echo "$ds" > $sys_path || \ |
2047 |
+ echo "FAIL can't set '$ds' to $sys_path" |
2048 |
+ |
2049 |
+ i=$(($i + 1)) |
2050 |
+- echo "$sys_path = '$ds' ($i/$dev_num)" |
2051 |
++ echo "$sys_path = '$ds'" |
2052 |
+ done |
2053 |
+ |
2054 |
+ echo "zram set memory limit: OK" |
2055 |
+@@ -167,8 +209,8 @@ zram_set_memlimit() |
2056 |
+ zram_makeswap() |
2057 |
+ { |
2058 |
+ echo "make swap with zram device(s)" |
2059 |
+- local i=0 |
2060 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
2061 |
++ local i=$dev_start |
2062 |
++ for i in $(seq $dev_start $dev_end); do |
2063 |
+ mkswap /dev/zram$i > err.log 2>&1 |
2064 |
+ if [ $? -ne 0 ]; then |
2065 |
+ cat err.log |
2066 |
+@@ -191,7 +233,7 @@ zram_makeswap() |
2067 |
+ zram_swapoff() |
2068 |
+ { |
2069 |
+ local i= |
2070 |
+- for i in $(seq 0 $dev_makeswap); do |
2071 |
++ for i in $(seq $dev_start $dev_end); do |
2072 |
+ swapoff /dev/zram$i > err.log 2>&1 |
2073 |
+ if [ $? -ne 0 ]; then |
2074 |
+ cat err.log |
2075 |
+@@ -205,7 +247,7 @@ zram_swapoff() |
2076 |
+ |
2077 |
+ zram_makefs() |
2078 |
+ { |
2079 |
+- local i=0 |
2080 |
++ local i=$dev_start |
2081 |
+ for fs in $zram_filesystems; do |
2082 |
+ # if requested fs not supported default it to ext2 |
2083 |
+ which mkfs.$fs > /dev/null 2>&1 || fs=ext2 |
2084 |
+@@ -224,7 +266,7 @@ zram_makefs() |
2085 |
+ zram_mount() |
2086 |
+ { |
2087 |
+ local i=0 |
2088 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
2089 |
++ for i in $(seq $dev_start $dev_end); do |
2090 |
+ echo "mount /dev/zram$i" |
2091 |
+ mkdir zram$i |
2092 |
+ mount /dev/zram$i zram$i > /dev/null || \ |