1 |
commit: 95263d7678490baa4dee89a82442393210eac8d5 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Wed Feb 23 12:39:53 2022 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Feb 23 12:39:53 2022 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=95263d76 |
7 |
|
8 |
Linux patch 4.14.268 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1267_linux-4.14.268.patch | 1575 +++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 1579 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 1ea11882..d97a880d 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -1115,6 +1115,10 @@ Patch: 1266_linux-4.14.267.patch |
21 |
From: https://www.kernel.org |
22 |
Desc: Linux 4.14.267 |
23 |
|
24 |
+Patch: 1267_linux-4.14.268.patch |
25 |
+From: https://www.kernel.org |
26 |
+Desc: Linux 4.14.268 |
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/1267_linux-4.14.268.patch b/1267_linux-4.14.268.patch |
33 |
new file mode 100644 |
34 |
index 00000000..f128e939 |
35 |
--- /dev/null |
36 |
+++ b/1267_linux-4.14.268.patch |
37 |
@@ -0,0 +1,1575 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index d953c6f478aaa..e3be05e00d9d2 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,7 +1,7 @@ |
43 |
+ # SPDX-License-Identifier: GPL-2.0 |
44 |
+ VERSION = 4 |
45 |
+ PATCHLEVEL = 14 |
46 |
+-SUBLEVEL = 267 |
47 |
++SUBLEVEL = 268 |
48 |
+ EXTRAVERSION = |
49 |
+ NAME = Petit Gorille |
50 |
+ |
51 |
+diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c |
52 |
+index 9274a484c6a39..f6afd866e4cf9 100644 |
53 |
+--- a/arch/arm/mach-omap2/omap_hwmod.c |
54 |
++++ b/arch/arm/mach-omap2/omap_hwmod.c |
55 |
+@@ -768,8 +768,10 @@ static int _init_clkctrl_providers(void) |
56 |
+ |
57 |
+ for_each_matching_node(np, ti_clkctrl_match_table) { |
58 |
+ ret = _setup_clkctrl_provider(np); |
59 |
+- if (ret) |
60 |
++ if (ret) { |
61 |
++ of_node_put(np); |
62 |
+ break; |
63 |
++ } |
64 |
+ } |
65 |
+ |
66 |
+ return ret; |
67 |
+diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c |
68 |
+index f208f560aecd0..eb3f7237d09a4 100644 |
69 |
+--- a/arch/powerpc/lib/sstep.c |
70 |
++++ b/arch/powerpc/lib/sstep.c |
71 |
+@@ -2652,12 +2652,14 @@ void emulate_update_regs(struct pt_regs *regs, struct instruction_op *op) |
72 |
+ case BARRIER_EIEIO: |
73 |
+ eieio(); |
74 |
+ break; |
75 |
++#ifdef CONFIG_PPC64 |
76 |
+ case BARRIER_LWSYNC: |
77 |
+ asm volatile("lwsync" : : : "memory"); |
78 |
+ break; |
79 |
+ case BARRIER_PTESYNC: |
80 |
+ asm volatile("ptesync" : : : "memory"); |
81 |
+ break; |
82 |
++#endif |
83 |
+ } |
84 |
+ break; |
85 |
+ |
86 |
+diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c |
87 |
+index 1bca8016ee8ae..b1fde6a548403 100644 |
88 |
+--- a/arch/x86/kvm/pmu.c |
89 |
++++ b/arch/x86/kvm/pmu.c |
90 |
+@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) |
91 |
+ } |
92 |
+ |
93 |
+ if (type == PERF_TYPE_RAW) |
94 |
+- config = eventsel & X86_RAW_EVENT_MASK; |
95 |
++ config = eventsel & AMD64_RAW_EVENT_MASK; |
96 |
+ |
97 |
+ pmc_reprogram_counter(pmc, type, config, |
98 |
+ !(eventsel & ARCH_PERFMON_EVENTSEL_USR), |
99 |
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
100 |
+index 8ec71243cdcca..791374199e227 100644 |
101 |
+--- a/drivers/ata/libata-core.c |
102 |
++++ b/drivers/ata/libata-core.c |
103 |
+@@ -4603,6 +4603,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
104 |
+ |
105 |
+ /* devices that don't properly handle TRIM commands */ |
106 |
+ { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, |
107 |
++ { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, |
108 |
+ |
109 |
+ /* |
110 |
+ * As defined, the DRAT (Deterministic Read After Trim) and RZAT |
111 |
+diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c |
112 |
+index f7ca57125ac7c..e31fb3f91d074 100644 |
113 |
+--- a/drivers/dma/sh/rcar-dmac.c |
114 |
++++ b/drivers/dma/sh/rcar-dmac.c |
115 |
+@@ -1767,7 +1767,9 @@ static int rcar_dmac_probe(struct platform_device *pdev) |
116 |
+ platform_set_drvdata(pdev, dmac); |
117 |
+ dmac->dev->dma_parms = &dmac->parms; |
118 |
+ dma_set_max_seg_size(dmac->dev, RCAR_DMATCR_MASK); |
119 |
+- dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40)); |
120 |
++ ret = dma_set_mask_and_coherent(dmac->dev, DMA_BIT_MASK(40)); |
121 |
++ if (ret) |
122 |
++ return ret; |
123 |
+ |
124 |
+ ret = rcar_dmac_parse_of(&pdev->dev, dmac); |
125 |
+ if (ret < 0) |
126 |
+diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c |
127 |
+index 329021189c38b..60b7b9b7fde99 100644 |
128 |
+--- a/drivers/edac/edac_mc.c |
129 |
++++ b/drivers/edac/edac_mc.c |
130 |
+@@ -264,7 +264,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems) |
131 |
+ else |
132 |
+ return (char *)ptr; |
133 |
+ |
134 |
+- r = (unsigned long)p % align; |
135 |
++ r = (unsigned long)ptr % align; |
136 |
+ |
137 |
+ if (r == 0) |
138 |
+ return (char *)ptr; |
139 |
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
140 |
+index e67ed383e11b1..79aef5c063fae 100644 |
141 |
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c |
142 |
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
143 |
+@@ -193,7 +193,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, |
144 |
+ * so don't register a backlight device |
145 |
+ */ |
146 |
+ if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && |
147 |
+- (rdev->pdev->device == 0x6741)) |
148 |
++ (rdev->pdev->device == 0x6741) && |
149 |
++ !dmi_match(DMI_PRODUCT_NAME, "iMac12,1")) |
150 |
+ return; |
151 |
+ |
152 |
+ if (!radeon_encoder->enc_priv) |
153 |
+diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c |
154 |
+index a658f975605a7..fe51d3fb5c6b1 100644 |
155 |
+--- a/drivers/i2c/busses/i2c-brcmstb.c |
156 |
++++ b/drivers/i2c/busses/i2c-brcmstb.c |
157 |
+@@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev) |
158 |
+ |
159 |
+ /* set the data in/out register size for compatible SoCs */ |
160 |
+ if (of_device_is_compatible(dev->device->of_node, |
161 |
+- "brcmstb,brcmper-i2c")) |
162 |
++ "brcm,brcmper-i2c")) |
163 |
+ dev->data_regsz = sizeof(u8); |
164 |
+ else |
165 |
+ dev->data_regsz = sizeof(u32); |
166 |
+diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c |
167 |
+index c65724d0c725d..2741147481c0a 100644 |
168 |
+--- a/drivers/mtd/nand/brcmnand/brcmnand.c |
169 |
++++ b/drivers/mtd/nand/brcmnand/brcmnand.c |
170 |
+@@ -589,6 +589,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl, |
171 |
+ __raw_writel(val, ctrl->nand_fc + word * 4); |
172 |
+ } |
173 |
+ |
174 |
++static void brcmnand_clear_ecc_addr(struct brcmnand_controller *ctrl) |
175 |
++{ |
176 |
++ |
177 |
++ /* Clear error addresses */ |
178 |
++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); |
179 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); |
180 |
++ brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); |
181 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); |
182 |
++} |
183 |
++ |
184 |
++static u64 brcmnand_get_uncorrecc_addr(struct brcmnand_controller *ctrl) |
185 |
++{ |
186 |
++ u64 err_addr; |
187 |
++ |
188 |
++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_UNCORR_ADDR); |
189 |
++ err_addr |= ((u64)(brcmnand_read_reg(ctrl, |
190 |
++ BRCMNAND_UNCORR_EXT_ADDR) |
191 |
++ & 0xffff) << 32); |
192 |
++ |
193 |
++ return err_addr; |
194 |
++} |
195 |
++ |
196 |
++static u64 brcmnand_get_correcc_addr(struct brcmnand_controller *ctrl) |
197 |
++{ |
198 |
++ u64 err_addr; |
199 |
++ |
200 |
++ err_addr = brcmnand_read_reg(ctrl, BRCMNAND_CORR_ADDR); |
201 |
++ err_addr |= ((u64)(brcmnand_read_reg(ctrl, |
202 |
++ BRCMNAND_CORR_EXT_ADDR) |
203 |
++ & 0xffff) << 32); |
204 |
++ |
205 |
++ return err_addr; |
206 |
++} |
207 |
++ |
208 |
++static void brcmnand_set_cmd_addr(struct mtd_info *mtd, u64 addr) |
209 |
++{ |
210 |
++ struct nand_chip *chip = mtd_to_nand(mtd); |
211 |
++ struct brcmnand_host *host = nand_get_controller_data(chip); |
212 |
++ struct brcmnand_controller *ctrl = host->ctrl; |
213 |
++ |
214 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
215 |
++ (host->cs << 16) | ((addr >> 32) & 0xffff)); |
216 |
++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
217 |
++ brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, |
218 |
++ lower_32_bits(addr)); |
219 |
++ (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
220 |
++} |
221 |
++ |
222 |
+ static inline u16 brcmnand_cs_offset(struct brcmnand_controller *ctrl, int cs, |
223 |
+ enum brcmnand_cs_reg reg) |
224 |
+ { |
225 |
+@@ -1217,9 +1265,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) |
226 |
+ { |
227 |
+ struct brcmnand_controller *ctrl = host->ctrl; |
228 |
+ int ret; |
229 |
++ u64 cmd_addr; |
230 |
++ |
231 |
++ cmd_addr = brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
232 |
++ |
233 |
++ dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr); |
234 |
+ |
235 |
+- dev_dbg(ctrl->dev, "send native cmd %d addr_lo 0x%x\n", cmd, |
236 |
+- brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS)); |
237 |
+ BUG_ON(ctrl->cmd_pending != 0); |
238 |
+ ctrl->cmd_pending = cmd; |
239 |
+ |
240 |
+@@ -1380,12 +1431,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command, |
241 |
+ if (!native_cmd) |
242 |
+ return; |
243 |
+ |
244 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
245 |
+- (host->cs << 16) | ((addr >> 32) & 0xffff)); |
246 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
247 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, lower_32_bits(addr)); |
248 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
249 |
+- |
250 |
++ brcmnand_set_cmd_addr(mtd, addr); |
251 |
+ brcmnand_send_cmd(host, native_cmd); |
252 |
+ brcmnand_waitfunc(mtd, chip); |
253 |
+ |
254 |
+@@ -1605,20 +1651,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, |
255 |
+ struct brcmnand_controller *ctrl = host->ctrl; |
256 |
+ int i, j, ret = 0; |
257 |
+ |
258 |
+- /* Clear error addresses */ |
259 |
+- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_ADDR, 0); |
260 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CORR_ADDR, 0); |
261 |
+- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_EXT_ADDR, 0); |
262 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CORR_EXT_ADDR, 0); |
263 |
+- |
264 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
265 |
+- (host->cs << 16) | ((addr >> 32) & 0xffff)); |
266 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
267 |
++ brcmnand_clear_ecc_addr(ctrl); |
268 |
+ |
269 |
+ for (i = 0; i < trans; i++, addr += FC_BYTES) { |
270 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, |
271 |
+- lower_32_bits(addr)); |
272 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
273 |
++ brcmnand_set_cmd_addr(mtd, addr); |
274 |
+ /* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */ |
275 |
+ brcmnand_send_cmd(host, CMD_PAGE_READ); |
276 |
+ brcmnand_waitfunc(mtd, chip); |
277 |
+@@ -1637,22 +1673,16 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, |
278 |
+ mtd->oobsize / trans, |
279 |
+ host->hwcfg.sector_size_1k); |
280 |
+ |
281 |
+- if (!ret) { |
282 |
+- *err_addr = brcmnand_read_reg(ctrl, |
283 |
+- BRCMNAND_UNCORR_ADDR) | |
284 |
+- ((u64)(brcmnand_read_reg(ctrl, |
285 |
+- BRCMNAND_UNCORR_EXT_ADDR) |
286 |
+- & 0xffff) << 32); |
287 |
++ if (ret != -EBADMSG) { |
288 |
++ *err_addr = brcmnand_get_uncorrecc_addr(ctrl); |
289 |
++ |
290 |
+ if (*err_addr) |
291 |
+ ret = -EBADMSG; |
292 |
+ } |
293 |
+ |
294 |
+ if (!ret) { |
295 |
+- *err_addr = brcmnand_read_reg(ctrl, |
296 |
+- BRCMNAND_CORR_ADDR) | |
297 |
+- ((u64)(brcmnand_read_reg(ctrl, |
298 |
+- BRCMNAND_CORR_EXT_ADDR) |
299 |
+- & 0xffff) << 32); |
300 |
++ *err_addr = brcmnand_get_correcc_addr(ctrl); |
301 |
++ |
302 |
+ if (*err_addr) |
303 |
+ ret = -EUCLEAN; |
304 |
+ } |
305 |
+@@ -1723,7 +1753,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip, |
306 |
+ dev_dbg(ctrl->dev, "read %llx -> %p\n", (unsigned long long)addr, buf); |
307 |
+ |
308 |
+ try_dmaread: |
309 |
+- brcmnand_write_reg(ctrl, BRCMNAND_UNCORR_COUNT, 0); |
310 |
++ brcmnand_clear_ecc_addr(ctrl); |
311 |
+ |
312 |
+ if (has_flash_dma(ctrl) && !oob && flash_dma_buf_ok(buf)) { |
313 |
+ err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES, |
314 |
+@@ -1863,15 +1893,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, |
315 |
+ goto out; |
316 |
+ } |
317 |
+ |
318 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS, |
319 |
+- (host->cs << 16) | ((addr >> 32) & 0xffff)); |
320 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_EXT_ADDRESS); |
321 |
+- |
322 |
+ for (i = 0; i < trans; i++, addr += FC_BYTES) { |
323 |
+ /* full address MUST be set before populating FC */ |
324 |
+- brcmnand_write_reg(ctrl, BRCMNAND_CMD_ADDRESS, |
325 |
+- lower_32_bits(addr)); |
326 |
+- (void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS); |
327 |
++ brcmnand_set_cmd_addr(mtd, addr); |
328 |
+ |
329 |
+ if (buf) { |
330 |
+ brcmnand_soc_data_bus_prepare(ctrl->soc, false); |
331 |
+diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c |
332 |
+index 035923876c617..e3f814e83d9c8 100644 |
333 |
+--- a/drivers/net/bonding/bond_3ad.c |
334 |
++++ b/drivers/net/bonding/bond_3ad.c |
335 |
+@@ -249,7 +249,7 @@ static inline int __check_agg_selection_timer(struct port *port) |
336 |
+ if (bond == NULL) |
337 |
+ return 0; |
338 |
+ |
339 |
+- return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0; |
340 |
++ return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0; |
341 |
+ } |
342 |
+ |
343 |
+ /** |
344 |
+@@ -1965,7 +1965,7 @@ static void ad_marker_response_received(struct bond_marker *marker, |
345 |
+ */ |
346 |
+ void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout) |
347 |
+ { |
348 |
+- BOND_AD_INFO(bond).agg_select_timer = timeout; |
349 |
++ atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout); |
350 |
+ } |
351 |
+ |
352 |
+ /** |
353 |
+@@ -2249,6 +2249,28 @@ void bond_3ad_update_ad_actor_settings(struct bonding *bond) |
354 |
+ spin_unlock_bh(&bond->mode_lock); |
355 |
+ } |
356 |
+ |
357 |
++/** |
358 |
++ * bond_agg_timer_advance - advance agg_select_timer |
359 |
++ * @bond: bonding structure |
360 |
++ * |
361 |
++ * Return true when agg_select_timer reaches 0. |
362 |
++ */ |
363 |
++static bool bond_agg_timer_advance(struct bonding *bond) |
364 |
++{ |
365 |
++ int val, nval; |
366 |
++ |
367 |
++ while (1) { |
368 |
++ val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer); |
369 |
++ if (!val) |
370 |
++ return false; |
371 |
++ nval = val - 1; |
372 |
++ if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer, |
373 |
++ val, nval) == val) |
374 |
++ break; |
375 |
++ } |
376 |
++ return nval == 0; |
377 |
++} |
378 |
++ |
379 |
+ /** |
380 |
+ * bond_3ad_state_machine_handler - handle state machines timeout |
381 |
+ * @bond: bonding struct to work on |
382 |
+@@ -2284,9 +2306,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work) |
383 |
+ if (!bond_has_slaves(bond)) |
384 |
+ goto re_arm; |
385 |
+ |
386 |
+- /* check if agg_select_timer timer after initialize is timed out */ |
387 |
+- if (BOND_AD_INFO(bond).agg_select_timer && |
388 |
+- !(--BOND_AD_INFO(bond).agg_select_timer)) { |
389 |
++ if (bond_agg_timer_advance(bond)) { |
390 |
+ slave = bond_first_slave_rcu(bond); |
391 |
+ port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; |
392 |
+ |
393 |
+diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
394 |
+index b07ea8a26c20a..045ab0ec5ca25 100644 |
395 |
+--- a/drivers/net/ethernet/cadence/macb_main.c |
396 |
++++ b/drivers/net/ethernet/cadence/macb_main.c |
397 |
+@@ -3528,7 +3528,7 @@ static int macb_probe(struct platform_device *pdev) |
398 |
+ |
399 |
+ #ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT |
400 |
+ if (GEM_BFEXT(DAW64, gem_readl(bp, DCFG6))) { |
401 |
+- dma_set_mask(&pdev->dev, DMA_BIT_MASK(44)); |
402 |
++ dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44)); |
403 |
+ bp->hw_dma_cap |= HW_DMA_CAP_64B; |
404 |
+ } |
405 |
+ #endif |
406 |
+diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c |
407 |
+index 5c48bdb6f6787..c2667c71a0cd1 100644 |
408 |
+--- a/drivers/net/ieee802154/at86rf230.c |
409 |
++++ b/drivers/net/ieee802154/at86rf230.c |
410 |
+@@ -108,6 +108,7 @@ struct at86rf230_local { |
411 |
+ unsigned long cal_timeout; |
412 |
+ bool is_tx; |
413 |
+ bool is_tx_from_off; |
414 |
++ bool was_tx; |
415 |
+ u8 tx_retry; |
416 |
+ struct sk_buff *tx_skb; |
417 |
+ struct at86rf230_state_change tx; |
418 |
+@@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context) |
419 |
+ if (ctx->free) |
420 |
+ kfree(ctx); |
421 |
+ |
422 |
+- ieee802154_wake_queue(lp->hw); |
423 |
++ if (lp->was_tx) { |
424 |
++ lp->was_tx = 0; |
425 |
++ dev_kfree_skb_any(lp->tx_skb); |
426 |
++ ieee802154_wake_queue(lp->hw); |
427 |
++ } |
428 |
+ } |
429 |
+ |
430 |
+ static void |
431 |
+@@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context) |
432 |
+ struct at86rf230_state_change *ctx = context; |
433 |
+ struct at86rf230_local *lp = ctx->lp; |
434 |
+ |
435 |
+- lp->is_tx = 0; |
436 |
++ if (lp->is_tx) { |
437 |
++ lp->was_tx = 1; |
438 |
++ lp->is_tx = 0; |
439 |
++ } |
440 |
++ |
441 |
+ at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, |
442 |
+ at86rf230_async_error_recover_complete); |
443 |
+ } |
444 |
+diff --git a/drivers/net/ieee802154/ca8210.c b/drivers/net/ieee802154/ca8210.c |
445 |
+index 893a5787d81d7..9a1352f3fa4cc 100644 |
446 |
+--- a/drivers/net/ieee802154/ca8210.c |
447 |
++++ b/drivers/net/ieee802154/ca8210.c |
448 |
+@@ -2976,8 +2976,8 @@ static void ca8210_hw_setup(struct ieee802154_hw *ca8210_hw) |
449 |
+ ca8210_hw->phy->cca.opt = NL802154_CCA_OPT_ENERGY_CARRIER_AND; |
450 |
+ ca8210_hw->phy->cca_ed_level = -9800; |
451 |
+ ca8210_hw->phy->symbol_duration = 16; |
452 |
+- ca8210_hw->phy->lifs_period = 40; |
453 |
+- ca8210_hw->phy->sifs_period = 12; |
454 |
++ ca8210_hw->phy->lifs_period = 40 * ca8210_hw->phy->symbol_duration; |
455 |
++ ca8210_hw->phy->sifs_period = 12 * ca8210_hw->phy->symbol_duration; |
456 |
+ ca8210_hw->flags = |
457 |
+ IEEE802154_HW_AFILT | |
458 |
+ IEEE802154_HW_OMIT_CKSUM | |
459 |
+diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c |
460 |
+index 8a7f2fdc69391..03153c30a8210 100644 |
461 |
+--- a/drivers/net/usb/ax88179_178a.c |
462 |
++++ b/drivers/net/usb/ax88179_178a.c |
463 |
+@@ -1373,59 +1373,69 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
464 |
+ u16 hdr_off; |
465 |
+ u32 *pkt_hdr; |
466 |
+ |
467 |
+- /* This check is no longer done by usbnet */ |
468 |
+- if (skb->len < dev->net->hard_header_len) |
469 |
++ /* At the end of the SKB, there's a header telling us how many packets |
470 |
++ * are bundled into this buffer and where we can find an array of |
471 |
++ * per-packet metadata (which contains elements encoded into u16). |
472 |
++ */ |
473 |
++ if (skb->len < 4) |
474 |
+ return 0; |
475 |
+- |
476 |
+ skb_trim(skb, skb->len - 4); |
477 |
+ memcpy(&rx_hdr, skb_tail_pointer(skb), 4); |
478 |
+ le32_to_cpus(&rx_hdr); |
479 |
+- |
480 |
+ pkt_cnt = (u16)rx_hdr; |
481 |
+ hdr_off = (u16)(rx_hdr >> 16); |
482 |
++ |
483 |
++ if (pkt_cnt == 0) |
484 |
++ return 0; |
485 |
++ |
486 |
++ /* Make sure that the bounds of the metadata array are inside the SKB |
487 |
++ * (and in front of the counter at the end). |
488 |
++ */ |
489 |
++ if (pkt_cnt * 2 + hdr_off > skb->len) |
490 |
++ return 0; |
491 |
+ pkt_hdr = (u32 *)(skb->data + hdr_off); |
492 |
+ |
493 |
+- while (pkt_cnt--) { |
494 |
++ /* Packets must not overlap the metadata array */ |
495 |
++ skb_trim(skb, hdr_off); |
496 |
++ |
497 |
++ for (; ; pkt_cnt--, pkt_hdr++) { |
498 |
+ u16 pkt_len; |
499 |
+ |
500 |
+ le32_to_cpus(pkt_hdr); |
501 |
+ pkt_len = (*pkt_hdr >> 16) & 0x1fff; |
502 |
+ |
503 |
+- /* Check CRC or runt packet */ |
504 |
+- if ((*pkt_hdr & AX_RXHDR_CRC_ERR) || |
505 |
+- (*pkt_hdr & AX_RXHDR_DROP_ERR)) { |
506 |
+- skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
507 |
+- pkt_hdr++; |
508 |
+- continue; |
509 |
+- } |
510 |
+- |
511 |
+- if (pkt_cnt == 0) { |
512 |
+- skb->len = pkt_len; |
513 |
+- /* Skip IP alignment pseudo header */ |
514 |
+- skb_pull(skb, 2); |
515 |
+- skb_set_tail_pointer(skb, skb->len); |
516 |
+- skb->truesize = pkt_len + sizeof(struct sk_buff); |
517 |
+- ax88179_rx_checksum(skb, pkt_hdr); |
518 |
+- return 1; |
519 |
+- } |
520 |
++ if (pkt_len > skb->len) |
521 |
++ return 0; |
522 |
+ |
523 |
+- ax_skb = skb_clone(skb, GFP_ATOMIC); |
524 |
+- if (ax_skb) { |
525 |
++ /* Check CRC or runt packet */ |
526 |
++ if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) && |
527 |
++ pkt_len >= 2 + ETH_HLEN) { |
528 |
++ bool last = (pkt_cnt == 0); |
529 |
++ |
530 |
++ if (last) { |
531 |
++ ax_skb = skb; |
532 |
++ } else { |
533 |
++ ax_skb = skb_clone(skb, GFP_ATOMIC); |
534 |
++ if (!ax_skb) |
535 |
++ return 0; |
536 |
++ } |
537 |
+ ax_skb->len = pkt_len; |
538 |
+ /* Skip IP alignment pseudo header */ |
539 |
+ skb_pull(ax_skb, 2); |
540 |
+ skb_set_tail_pointer(ax_skb, ax_skb->len); |
541 |
+ ax_skb->truesize = pkt_len + sizeof(struct sk_buff); |
542 |
+ ax88179_rx_checksum(ax_skb, pkt_hdr); |
543 |
++ |
544 |
++ if (last) |
545 |
++ return 1; |
546 |
++ |
547 |
+ usbnet_skb_return(dev, ax_skb); |
548 |
+- } else { |
549 |
+- return 0; |
550 |
+ } |
551 |
+ |
552 |
+- skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
553 |
+- pkt_hdr++; |
554 |
++ /* Trim this packet away from the SKB */ |
555 |
++ if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8)) |
556 |
++ return 0; |
557 |
+ } |
558 |
+- return 1; |
559 |
+ } |
560 |
+ |
561 |
+ static struct sk_buff * |
562 |
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
563 |
+index 928219ab09128..e8d57954596d2 100644 |
564 |
+--- a/drivers/net/usb/qmi_wwan.c |
565 |
++++ b/drivers/net/usb/qmi_wwan.c |
566 |
+@@ -1347,6 +1347,8 @@ static const struct usb_device_id products[] = { |
567 |
+ {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
568 |
+ {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
569 |
+ {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ |
570 |
++ {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ |
571 |
++ {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ |
572 |
+ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
573 |
+ {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ |
574 |
+ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ |
575 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c |
576 |
+index ade3c27050471..9cadfedf8c776 100644 |
577 |
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c |
578 |
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c |
579 |
+@@ -1511,6 +1511,8 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) |
580 |
+ out_unbind: |
581 |
+ complete(&drv->request_firmware_complete); |
582 |
+ device_release_driver(drv->trans->dev); |
583 |
++ /* drv has just been freed by the release */ |
584 |
++ failure = false; |
585 |
+ free: |
586 |
+ if (failure) |
587 |
+ iwl_dealloc_ucode(drv); |
588 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c |
589 |
+index ac05fd1e74c4c..1c3635be6a2d4 100644 |
590 |
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c |
591 |
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c |
592 |
+@@ -292,8 +292,7 @@ int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans, |
593 |
+ /* This may fail if AMT took ownership of the device */ |
594 |
+ if (iwl_pcie_prepare_card_hw(trans)) { |
595 |
+ IWL_WARN(trans, "Exit HW not ready\n"); |
596 |
+- ret = -EIO; |
597 |
+- goto out; |
598 |
++ return -EIO; |
599 |
+ } |
600 |
+ |
601 |
+ iwl_enable_rfkill_int(trans); |
602 |
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
603 |
+index 7bfddce582ad6..4d3cbe554f5bf 100644 |
604 |
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
605 |
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
606 |
+@@ -1240,8 +1240,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, |
607 |
+ /* This may fail if AMT took ownership of the device */ |
608 |
+ if (iwl_pcie_prepare_card_hw(trans)) { |
609 |
+ IWL_WARN(trans, "Exit HW not ready\n"); |
610 |
+- ret = -EIO; |
611 |
+- goto out; |
612 |
++ return -EIO; |
613 |
+ } |
614 |
+ |
615 |
+ iwl_enable_rfkill_int(trans); |
616 |
+diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c |
617 |
+index d7649a70a0c45..224a364097672 100644 |
618 |
+--- a/drivers/parisc/ccio-dma.c |
619 |
++++ b/drivers/parisc/ccio-dma.c |
620 |
+@@ -1010,7 +1010,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
621 |
+ ioc->usg_calls++; |
622 |
+ #endif |
623 |
+ |
624 |
+- while(sg_dma_len(sglist) && nents--) { |
625 |
++ while (nents && sg_dma_len(sglist)) { |
626 |
+ |
627 |
+ #ifdef CCIO_COLLECT_STATS |
628 |
+ ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT; |
629 |
+@@ -1018,6 +1018,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
630 |
+ ccio_unmap_page(dev, sg_dma_address(sglist), |
631 |
+ sg_dma_len(sglist), direction, 0); |
632 |
+ ++sglist; |
633 |
++ nents--; |
634 |
+ } |
635 |
+ |
636 |
+ DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
637 |
+diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c |
638 |
+index 55b3274328eb8..0ad2f32b91dc2 100644 |
639 |
+--- a/drivers/parisc/sba_iommu.c |
640 |
++++ b/drivers/parisc/sba_iommu.c |
641 |
+@@ -1063,7 +1063,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
642 |
+ spin_unlock_irqrestore(&ioc->res_lock, flags); |
643 |
+ #endif |
644 |
+ |
645 |
+- while (sg_dma_len(sglist) && nents--) { |
646 |
++ while (nents && sg_dma_len(sglist)) { |
647 |
+ |
648 |
+ sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist), |
649 |
+ direction, 0); |
650 |
+@@ -1072,6 +1072,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
651 |
+ ioc->usingle_calls--; /* kluge since call is unmap_sg() */ |
652 |
+ #endif |
653 |
+ ++sglist; |
654 |
++ nents--; |
655 |
+ } |
656 |
+ |
657 |
+ DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
658 |
+diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c |
659 |
+index df2931e1e0868..68ee0c543971f 100644 |
660 |
+--- a/drivers/tty/serial/8250/8250_gsc.c |
661 |
++++ b/drivers/tty/serial/8250/8250_gsc.c |
662 |
+@@ -30,7 +30,7 @@ static int __init serial_init_chip(struct parisc_device *dev) |
663 |
+ unsigned long address; |
664 |
+ int err; |
665 |
+ |
666 |
+-#ifdef CONFIG_64BIT |
667 |
++#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC) |
668 |
+ if (!dev->irq && (dev->id.sversion == 0xad)) |
669 |
+ dev->irq = iosapic_serial_irq(dev); |
670 |
+ #endif |
671 |
+diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
672 |
+index ad570c3b6a0bb..efab9446eac87 100644 |
673 |
+--- a/fs/btrfs/send.c |
674 |
++++ b/fs/btrfs/send.c |
675 |
+@@ -4944,6 +4944,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len) |
676 |
+ lock_page(page); |
677 |
+ if (!PageUptodate(page)) { |
678 |
+ unlock_page(page); |
679 |
++ btrfs_err(fs_info, |
680 |
++ "send: IO error at offset %llu for inode %llu root %llu", |
681 |
++ page_offset(page), sctx->cur_ino, |
682 |
++ sctx->send_root->root_key.objectid); |
683 |
+ put_page(page); |
684 |
+ ret = -EIO; |
685 |
+ break; |
686 |
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
687 |
+index c3ae37036b9d1..c702bcad59e39 100644 |
688 |
+--- a/fs/nfs/dir.c |
689 |
++++ b/fs/nfs/dir.c |
690 |
+@@ -1610,14 +1610,14 @@ no_open: |
691 |
+ if (!res) { |
692 |
+ inode = d_inode(dentry); |
693 |
+ if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
694 |
+- !S_ISDIR(inode->i_mode)) |
695 |
++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) |
696 |
+ res = ERR_PTR(-ENOTDIR); |
697 |
+ else if (inode && S_ISREG(inode->i_mode)) |
698 |
+ res = ERR_PTR(-EOPENSTALE); |
699 |
+ } else if (!IS_ERR(res)) { |
700 |
+ inode = d_inode(res); |
701 |
+ if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
702 |
+- !S_ISDIR(inode->i_mode)) { |
703 |
++ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) { |
704 |
+ dput(res); |
705 |
+ res = ERR_PTR(-ENOTDIR); |
706 |
+ } else if (inode && S_ISREG(inode->i_mode)) { |
707 |
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
708 |
+index ad01d4fb795ee..ac836e202ff78 100644 |
709 |
+--- a/fs/nfs/inode.c |
710 |
++++ b/fs/nfs/inode.c |
711 |
+@@ -740,11 +740,8 @@ int nfs_getattr(const struct path *path, struct kstat *stat, |
712 |
+ |
713 |
+ trace_nfs_getattr_enter(inode); |
714 |
+ /* Flush out writes to the server in order to update c/mtime. */ |
715 |
+- if (S_ISREG(inode->i_mode)) { |
716 |
+- err = filemap_write_and_wait(inode->i_mapping); |
717 |
+- if (err) |
718 |
+- goto out; |
719 |
+- } |
720 |
++ if (S_ISREG(inode->i_mode)) |
721 |
++ filemap_write_and_wait(inode->i_mapping); |
722 |
+ |
723 |
+ /* |
724 |
+ * We may force a getattr if the user cares about atime. |
725 |
+@@ -775,7 +772,7 @@ int nfs_getattr(const struct path *path, struct kstat *stat, |
726 |
+ if (S_ISDIR(inode->i_mode)) |
727 |
+ stat->blksize = NFS_SERVER(inode)->dtsize; |
728 |
+ } |
729 |
+-out: |
730 |
++ |
731 |
+ trace_nfs_getattr_exit(inode, err); |
732 |
+ return err; |
733 |
+ } |
734 |
+diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
735 |
+index 30f5da8f4affa..7c364cda8daac 100644 |
736 |
+--- a/fs/quota/dquot.c |
737 |
++++ b/fs/quota/dquot.c |
738 |
+@@ -680,9 +680,14 @@ int dquot_quota_sync(struct super_block *sb, int type) |
739 |
+ /* This is not very clever (and fast) but currently I don't know about |
740 |
+ * any other simple way of getting quota data to disk and we must get |
741 |
+ * them there for userspace to be visible... */ |
742 |
+- if (sb->s_op->sync_fs) |
743 |
+- sb->s_op->sync_fs(sb, 1); |
744 |
+- sync_blockdev(sb->s_bdev); |
745 |
++ if (sb->s_op->sync_fs) { |
746 |
++ ret = sb->s_op->sync_fs(sb, 1); |
747 |
++ if (ret) |
748 |
++ return ret; |
749 |
++ } |
750 |
++ ret = sync_blockdev(sb->s_bdev); |
751 |
++ if (ret) |
752 |
++ return ret; |
753 |
+ |
754 |
+ /* |
755 |
+ * Now when everything is written we can discard the pagecache so |
756 |
+diff --git a/fs/super.c b/fs/super.c |
757 |
+index 1d7461bca1600..819a33e79a011 100644 |
758 |
+--- a/fs/super.c |
759 |
++++ b/fs/super.c |
760 |
+@@ -1380,11 +1380,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb) |
761 |
+ percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); |
762 |
+ } |
763 |
+ |
764 |
+-static void sb_freeze_unlock(struct super_block *sb) |
765 |
++static void sb_freeze_unlock(struct super_block *sb, int level) |
766 |
+ { |
767 |
+- int level; |
768 |
+- |
769 |
+- for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--) |
770 |
++ for (level--; level >= 0; level--) |
771 |
+ percpu_up_write(sb->s_writers.rw_sem + level); |
772 |
+ } |
773 |
+ |
774 |
+@@ -1455,7 +1453,14 @@ int freeze_super(struct super_block *sb) |
775 |
+ sb_wait_write(sb, SB_FREEZE_PAGEFAULT); |
776 |
+ |
777 |
+ /* All writers are done so after syncing there won't be dirty data */ |
778 |
+- sync_filesystem(sb); |
779 |
++ ret = sync_filesystem(sb); |
780 |
++ if (ret) { |
781 |
++ sb->s_writers.frozen = SB_UNFROZEN; |
782 |
++ sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); |
783 |
++ wake_up(&sb->s_writers.wait_unfrozen); |
784 |
++ deactivate_locked_super(sb); |
785 |
++ return ret; |
786 |
++ } |
787 |
+ |
788 |
+ /* Now wait for internal filesystem counter */ |
789 |
+ sb->s_writers.frozen = SB_FREEZE_FS; |
790 |
+@@ -1467,7 +1472,7 @@ int freeze_super(struct super_block *sb) |
791 |
+ printk(KERN_ERR |
792 |
+ "VFS:Filesystem freeze failed\n"); |
793 |
+ sb->s_writers.frozen = SB_UNFROZEN; |
794 |
+- sb_freeze_unlock(sb); |
795 |
++ sb_freeze_unlock(sb, SB_FREEZE_FS); |
796 |
+ wake_up(&sb->s_writers.wait_unfrozen); |
797 |
+ deactivate_locked_super(sb); |
798 |
+ return ret; |
799 |
+@@ -1519,7 +1524,7 @@ int thaw_super(struct super_block *sb) |
800 |
+ } |
801 |
+ |
802 |
+ sb->s_writers.frozen = SB_UNFROZEN; |
803 |
+- sb_freeze_unlock(sb); |
804 |
++ sb_freeze_unlock(sb, SB_FREEZE_FS); |
805 |
+ out: |
806 |
+ wake_up(&sb->s_writers.wait_unfrozen); |
807 |
+ deactivate_locked_super(sb); |
808 |
+diff --git a/include/linux/sched.h b/include/linux/sched.h |
809 |
+index 914cc8b180eda..63522a384f5aa 100644 |
810 |
+--- a/include/linux/sched.h |
811 |
++++ b/include/linux/sched.h |
812 |
+@@ -1346,7 +1346,6 @@ extern struct pid *cad_pid; |
813 |
+ #define PF_MEMALLOC 0x00000800 /* Allocating memory */ |
814 |
+ #define PF_NPROC_EXCEEDED 0x00001000 /* set_user() noticed that RLIMIT_NPROC was exceeded */ |
815 |
+ #define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */ |
816 |
+-#define PF_USED_ASYNC 0x00004000 /* Used async_schedule*(), used by module init */ |
817 |
+ #define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */ |
818 |
+ #define PF_FROZEN 0x00010000 /* Frozen for system suspend */ |
819 |
+ #define PF_KSWAPD 0x00020000 /* I am kswapd */ |
820 |
+diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h |
821 |
+index f358ad5e42145..a353814dee901 100644 |
822 |
+--- a/include/net/bond_3ad.h |
823 |
++++ b/include/net/bond_3ad.h |
824 |
+@@ -265,7 +265,7 @@ struct ad_system { |
825 |
+ |
826 |
+ struct ad_bond_info { |
827 |
+ struct ad_system system; /* 802.3ad system structure */ |
828 |
+- u32 agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */ |
829 |
++ atomic_t agg_select_timer; /* Timer to select aggregator after all adapter's hand shakes */ |
830 |
+ u16 aggregator_identifier; |
831 |
+ }; |
832 |
+ |
833 |
+diff --git a/kernel/async.c b/kernel/async.c |
834 |
+index a893d6170944f..4bf1b00a28d86 100644 |
835 |
+--- a/kernel/async.c |
836 |
++++ b/kernel/async.c |
837 |
+@@ -191,9 +191,6 @@ static async_cookie_t __async_schedule(async_func_t func, void *data, struct asy |
838 |
+ atomic_inc(&entry_count); |
839 |
+ spin_unlock_irqrestore(&async_lock, flags); |
840 |
+ |
841 |
+- /* mark that this task has queued an async job, used by module init */ |
842 |
+- current->flags |= PF_USED_ASYNC; |
843 |
+- |
844 |
+ /* schedule for execution */ |
845 |
+ queue_work(system_unbound_wq, &entry->work); |
846 |
+ |
847 |
+diff --git a/kernel/module.c b/kernel/module.c |
848 |
+index e962096672636..8404b41be7c6f 100644 |
849 |
+--- a/kernel/module.c |
850 |
++++ b/kernel/module.c |
851 |
+@@ -3499,12 +3499,6 @@ static noinline int do_init_module(struct module *mod) |
852 |
+ } |
853 |
+ freeinit->module_init = mod->init_layout.base; |
854 |
+ |
855 |
+- /* |
856 |
+- * We want to find out whether @mod uses async during init. Clear |
857 |
+- * PF_USED_ASYNC. async_schedule*() will set it. |
858 |
+- */ |
859 |
+- current->flags &= ~PF_USED_ASYNC; |
860 |
+- |
861 |
+ do_mod_ctors(mod); |
862 |
+ /* Start the module */ |
863 |
+ if (mod->init != NULL) |
864 |
+@@ -3530,22 +3524,13 @@ static noinline int do_init_module(struct module *mod) |
865 |
+ |
866 |
+ /* |
867 |
+ * We need to finish all async code before the module init sequence |
868 |
+- * is done. This has potential to deadlock. For example, a newly |
869 |
+- * detected block device can trigger request_module() of the |
870 |
+- * default iosched from async probing task. Once userland helper |
871 |
+- * reaches here, async_synchronize_full() will wait on the async |
872 |
+- * task waiting on request_module() and deadlock. |
873 |
+- * |
874 |
+- * This deadlock is avoided by perfomring async_synchronize_full() |
875 |
+- * iff module init queued any async jobs. This isn't a full |
876 |
+- * solution as it will deadlock the same if module loading from |
877 |
+- * async jobs nests more than once; however, due to the various |
878 |
+- * constraints, this hack seems to be the best option for now. |
879 |
+- * Please refer to the following thread for details. |
880 |
++ * is done. This has potential to deadlock if synchronous module |
881 |
++ * loading is requested from async (which is not allowed!). |
882 |
+ * |
883 |
+- * http://thread.gmane.org/gmane.linux.kernel/1420814 |
884 |
++ * See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous |
885 |
++ * request_module() from async workers") for more details. |
886 |
+ */ |
887 |
+- if (!mod->async_probe_requested && (current->flags & PF_USED_ASYNC)) |
888 |
++ if (!mod->async_probe_requested) |
889 |
+ async_synchronize_full(); |
890 |
+ |
891 |
+ mutex_lock(&module_mutex); |
892 |
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
893 |
+index fd8e1ec39c270..c1da2a4a629a1 100644 |
894 |
+--- a/kernel/trace/trace.c |
895 |
++++ b/kernel/trace/trace.c |
896 |
+@@ -230,6 +230,10 @@ __setup("trace_clock=", set_trace_boot_clock); |
897 |
+ |
898 |
+ static int __init set_tracepoint_printk(char *str) |
899 |
+ { |
900 |
++ /* Ignore the "tp_printk_stop_on_boot" param */ |
901 |
++ if (*str == '_') |
902 |
++ return 0; |
903 |
++ |
904 |
+ if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) |
905 |
+ tracepoint_printk = 1; |
906 |
+ return 1; |
907 |
+diff --git a/kernel/tsacct.c b/kernel/tsacct.c |
908 |
+index 370724b453918..8d7c6d3f1daa7 100644 |
909 |
+--- a/kernel/tsacct.c |
910 |
++++ b/kernel/tsacct.c |
911 |
+@@ -46,11 +46,10 @@ void bacct_add_tsk(struct user_namespace *user_ns, |
912 |
+ /* Convert to seconds for btime */ |
913 |
+ do_div(delta, USEC_PER_SEC); |
914 |
+ stats->ac_btime = get_seconds() - delta; |
915 |
+- if (thread_group_leader(tsk)) { |
916 |
++ if (tsk->flags & PF_EXITING) |
917 |
+ stats->ac_exitcode = tsk->exit_code; |
918 |
+- if (tsk->flags & PF_FORKNOEXEC) |
919 |
+- stats->ac_flag |= AFORK; |
920 |
+- } |
921 |
++ if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC)) |
922 |
++ stats->ac_flag |= AFORK; |
923 |
+ if (tsk->flags & PF_SUPERPRIV) |
924 |
+ stats->ac_flag |= ASU; |
925 |
+ if (tsk->flags & PF_DUMPCORE) |
926 |
+diff --git a/lib/iov_iter.c b/lib/iov_iter.c |
927 |
+index 9bdc797ef2571..ffa90d4c098e5 100644 |
928 |
+--- a/lib/iov_iter.c |
929 |
++++ b/lib/iov_iter.c |
930 |
+@@ -393,6 +393,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by |
931 |
+ return 0; |
932 |
+ pipe->nrbufs++; |
933 |
+ buf->ops = &page_cache_pipe_buf_ops; |
934 |
++ buf->flags = 0; |
935 |
+ get_page(buf->page = page); |
936 |
+ buf->offset = offset; |
937 |
+ buf->len = bytes; |
938 |
+@@ -517,6 +518,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, |
939 |
+ break; |
940 |
+ pipe->nrbufs++; |
941 |
+ pipe->bufs[idx].ops = &default_pipe_buf_ops; |
942 |
++ pipe->bufs[idx].flags = 0; |
943 |
+ pipe->bufs[idx].page = page; |
944 |
+ pipe->bufs[idx].offset = 0; |
945 |
+ if (left <= PAGE_SIZE) { |
946 |
+diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c |
947 |
+index 0232afd9d9c3c..36d2e1dfa1e6b 100644 |
948 |
+--- a/net/ax25/af_ax25.c |
949 |
++++ b/net/ax25/af_ax25.c |
950 |
+@@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev) |
951 |
+ { |
952 |
+ ax25_dev *ax25_dev; |
953 |
+ ax25_cb *s; |
954 |
++ struct sock *sk; |
955 |
+ |
956 |
+ if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) |
957 |
+ return; |
958 |
+@@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev) |
959 |
+ again: |
960 |
+ ax25_for_each(s, &ax25_list) { |
961 |
+ if (s->ax25_dev == ax25_dev) { |
962 |
++ sk = s->sk; |
963 |
++ sock_hold(sk); |
964 |
+ spin_unlock_bh(&ax25_list_lock); |
965 |
+- lock_sock(s->sk); |
966 |
++ lock_sock(sk); |
967 |
+ s->ax25_dev = NULL; |
968 |
+- release_sock(s->sk); |
969 |
++ release_sock(sk); |
970 |
+ ax25_disconnect(s, ENETUNREACH); |
971 |
+ spin_lock_bh(&ax25_list_lock); |
972 |
+- |
973 |
++ sock_put(sk); |
974 |
+ /* The entry could have been deleted from the |
975 |
+ * list meanwhile and thus the next pointer is |
976 |
+ * no longer valid. Play it safe and restart |
977 |
+diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c |
978 |
+index ef9fe5f95093b..006b7d72aea7b 100644 |
979 |
+--- a/net/core/drop_monitor.c |
980 |
++++ b/net/core/drop_monitor.c |
981 |
+@@ -219,13 +219,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi, |
982 |
+ |
983 |
+ rcu_read_lock(); |
984 |
+ list_for_each_entry_rcu(new_stat, &hw_stats_list, list) { |
985 |
++ struct net_device *dev; |
986 |
++ |
987 |
+ /* |
988 |
+ * only add a note to our monitor buffer if: |
989 |
+ * 1) this is the dev we received on |
990 |
+ * 2) its after the last_rx delta |
991 |
+ * 3) our rx_dropped count has gone up |
992 |
+ */ |
993 |
+- if ((new_stat->dev == napi->dev) && |
994 |
++ /* Paired with WRITE_ONCE() in dropmon_net_event() */ |
995 |
++ dev = READ_ONCE(new_stat->dev); |
996 |
++ if ((dev == napi->dev) && |
997 |
+ (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) && |
998 |
+ (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) { |
999 |
+ trace_drop_common(NULL, NULL); |
1000 |
+@@ -340,7 +344,10 @@ static int dropmon_net_event(struct notifier_block *ev_block, |
1001 |
+ mutex_lock(&trace_state_mutex); |
1002 |
+ list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) { |
1003 |
+ if (new_stat->dev == dev) { |
1004 |
+- new_stat->dev = NULL; |
1005 |
++ |
1006 |
++ /* Paired with READ_ONCE() in trace_napi_poll_hit() */ |
1007 |
++ WRITE_ONCE(new_stat->dev, NULL); |
1008 |
++ |
1009 |
+ if (trace_state == TRACE_OFF) { |
1010 |
+ list_del_rcu(&new_stat->list); |
1011 |
+ kfree_rcu(new_stat, rcu); |
1012 |
+diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c |
1013 |
+index bfd0ab9d3b578..1ee488a539363 100644 |
1014 |
+--- a/net/ipv4/ping.c |
1015 |
++++ b/net/ipv4/ping.c |
1016 |
+@@ -177,16 +177,23 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident) |
1017 |
+ struct sock *sk = NULL; |
1018 |
+ struct inet_sock *isk; |
1019 |
+ struct hlist_nulls_node *hnode; |
1020 |
+- int dif = skb->dev->ifindex; |
1021 |
++ int dif, sdif; |
1022 |
+ |
1023 |
+ if (skb->protocol == htons(ETH_P_IP)) { |
1024 |
++ dif = inet_iif(skb); |
1025 |
++ sdif = inet_sdif(skb); |
1026 |
+ pr_debug("try to find: num = %d, daddr = %pI4, dif = %d\n", |
1027 |
+ (int)ident, &ip_hdr(skb)->daddr, dif); |
1028 |
+ #if IS_ENABLED(CONFIG_IPV6) |
1029 |
+ } else if (skb->protocol == htons(ETH_P_IPV6)) { |
1030 |
++ dif = inet6_iif(skb); |
1031 |
++ sdif = inet6_sdif(skb); |
1032 |
+ pr_debug("try to find: num = %d, daddr = %pI6c, dif = %d\n", |
1033 |
+ (int)ident, &ipv6_hdr(skb)->daddr, dif); |
1034 |
+ #endif |
1035 |
++ } else { |
1036 |
++ pr_err("ping: protocol(%x) is not supported\n", ntohs(skb->protocol)); |
1037 |
++ return NULL; |
1038 |
+ } |
1039 |
+ |
1040 |
+ read_lock_bh(&ping_table.lock); |
1041 |
+@@ -226,7 +233,7 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident) |
1042 |
+ } |
1043 |
+ |
1044 |
+ if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && |
1045 |
+- sk->sk_bound_dev_if != inet_sdif(skb)) |
1046 |
++ sk->sk_bound_dev_if != sdif) |
1047 |
+ continue; |
1048 |
+ |
1049 |
+ sock_hold(sk); |
1050 |
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c |
1051 |
+index 08f00225ed1b9..368e5a33d073a 100644 |
1052 |
+--- a/net/ipv4/xfrm4_policy.c |
1053 |
++++ b/net/ipv4/xfrm4_policy.c |
1054 |
+@@ -17,6 +17,7 @@ |
1055 |
+ #include <net/xfrm.h> |
1056 |
+ #include <net/ip.h> |
1057 |
+ #include <net/l3mdev.h> |
1058 |
++#include <net/inet_ecn.h> |
1059 |
+ |
1060 |
+ static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4, |
1061 |
+ int tos, int oif, |
1062 |
+@@ -126,7 +127,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
1063 |
+ fl4->flowi4_proto = iph->protocol; |
1064 |
+ fl4->daddr = reverse ? iph->saddr : iph->daddr; |
1065 |
+ fl4->saddr = reverse ? iph->daddr : iph->saddr; |
1066 |
+- fl4->flowi4_tos = iph->tos; |
1067 |
++ fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK; |
1068 |
+ |
1069 |
+ if (!ip_is_fragment(iph)) { |
1070 |
+ switch (iph->protocol) { |
1071 |
+diff --git a/net/sched/act_api.c b/net/sched/act_api.c |
1072 |
+index 8ae0addb76576..a6a9306048602 100644 |
1073 |
+--- a/net/sched/act_api.c |
1074 |
++++ b/net/sched/act_api.c |
1075 |
+@@ -482,15 +482,24 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions, |
1076 |
+ restart_act_graph: |
1077 |
+ for (i = 0; i < nr_actions; i++) { |
1078 |
+ const struct tc_action *a = actions[i]; |
1079 |
++ int repeat_ttl; |
1080 |
+ |
1081 |
+ if (jmp_prgcnt > 0) { |
1082 |
+ jmp_prgcnt -= 1; |
1083 |
+ continue; |
1084 |
+ } |
1085 |
++ |
1086 |
++ repeat_ttl = 32; |
1087 |
+ repeat: |
1088 |
+ ret = a->ops->act(skb, a, res); |
1089 |
+- if (ret == TC_ACT_REPEAT) |
1090 |
+- goto repeat; /* we need a ttl - JHS */ |
1091 |
++ |
1092 |
++ if (unlikely(ret == TC_ACT_REPEAT)) { |
1093 |
++ if (--repeat_ttl != 0) |
1094 |
++ goto repeat; |
1095 |
++ /* suspicious opcode, stop pipeline */ |
1096 |
++ net_warn_ratelimited("TC_ACT_REPEAT abuse ?\n"); |
1097 |
++ return TC_ACT_OK; |
1098 |
++ } |
1099 |
+ |
1100 |
+ if (TC_ACT_EXT_CMP(ret, TC_ACT_JUMP)) { |
1101 |
+ jmp_prgcnt = ret & TCA_ACT_MAX_PRIO_MASK; |
1102 |
+diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
1103 |
+index 8b211d164beea..b14e96b6831dc 100644 |
1104 |
+--- a/net/vmw_vsock/af_vsock.c |
1105 |
++++ b/net/vmw_vsock/af_vsock.c |
1106 |
+@@ -1237,6 +1237,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, |
1107 |
+ sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; |
1108 |
+ sock->state = SS_UNCONNECTED; |
1109 |
+ vsock_transport_cancel_pkt(vsk); |
1110 |
++ vsock_remove_connected(vsk); |
1111 |
+ goto out_wait; |
1112 |
+ } else if (timeout == 0) { |
1113 |
+ err = -ETIMEDOUT; |
1114 |
+diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn |
1115 |
+index 486e135d3e30a..65df6141397fe 100644 |
1116 |
+--- a/scripts/Makefile.extrawarn |
1117 |
++++ b/scripts/Makefile.extrawarn |
1118 |
+@@ -73,5 +73,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare) |
1119 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length) |
1120 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized) |
1121 |
+ KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) |
1122 |
++KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) |
1123 |
+ endif |
1124 |
+ endif |
1125 |
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
1126 |
+index de090a3d2b384..2a3090ab80cfe 100644 |
1127 |
+--- a/sound/pci/hda/hda_intel.c |
1128 |
++++ b/sound/pci/hda/hda_intel.c |
1129 |
+@@ -1636,6 +1636,7 @@ static struct snd_pci_quirk probe_mask_list[] = { |
1130 |
+ /* forced codec slots */ |
1131 |
+ SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103), |
1132 |
+ SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), |
1133 |
++ SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105), |
1134 |
+ /* WinFast VP200 H (Teradici) user reported broken communication */ |
1135 |
+ SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101), |
1136 |
+ {} |
1137 |
+@@ -1821,8 +1822,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
1138 |
+ |
1139 |
+ assign_position_fix(chip, check_position_fix(chip, position_fix[dev])); |
1140 |
+ |
1141 |
+- check_probe_mask(chip, dev); |
1142 |
+- |
1143 |
+ if (single_cmd < 0) /* allow fallback to single_cmd at errors */ |
1144 |
+ chip->fallback_to_single_cmd = 1; |
1145 |
+ else /* explicitly set to single_cmd or not */ |
1146 |
+@@ -1851,6 +1850,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
1147 |
+ chip->bus.needs_damn_long_delay = 1; |
1148 |
+ } |
1149 |
+ |
1150 |
++ check_probe_mask(chip, dev); |
1151 |
++ |
1152 |
+ err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); |
1153 |
+ if (err < 0) { |
1154 |
+ dev_err(card->dev, "Error creating device [card]!\n"); |
1155 |
+diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c |
1156 |
+index e1c897ad0fe5f..76bd264ee88dd 100644 |
1157 |
+--- a/sound/soc/soc-ops.c |
1158 |
++++ b/sound/soc/soc-ops.c |
1159 |
+@@ -319,7 +319,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
1160 |
+ unsigned int sign_bit = mc->sign_bit; |
1161 |
+ unsigned int mask = (1 << fls(max)) - 1; |
1162 |
+ unsigned int invert = mc->invert; |
1163 |
+- int err; |
1164 |
++ int err, ret; |
1165 |
+ bool type_2r = false; |
1166 |
+ unsigned int val2 = 0; |
1167 |
+ unsigned int val, val_mask; |
1168 |
+@@ -361,12 +361,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
1169 |
+ err = snd_soc_component_update_bits(component, reg, val_mask, val); |
1170 |
+ if (err < 0) |
1171 |
+ return err; |
1172 |
++ ret = err; |
1173 |
+ |
1174 |
+- if (type_2r) |
1175 |
++ if (type_2r) { |
1176 |
+ err = snd_soc_component_update_bits(component, reg2, val_mask, |
1177 |
+- val2); |
1178 |
++ val2); |
1179 |
++ /* Don't discard any error code or drop change flag */ |
1180 |
++ if (ret == 0 || err < 0) { |
1181 |
++ ret = err; |
1182 |
++ } |
1183 |
++ } |
1184 |
+ |
1185 |
+- return err; |
1186 |
++ return ret; |
1187 |
+ } |
1188 |
+ EXPORT_SYMBOL_GPL(snd_soc_put_volsw); |
1189 |
+ |
1190 |
+@@ -522,7 +528,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1191 |
+ unsigned int mask = (1 << fls(max)) - 1; |
1192 |
+ unsigned int invert = mc->invert; |
1193 |
+ unsigned int val, val_mask; |
1194 |
+- int ret; |
1195 |
++ int err, ret; |
1196 |
+ |
1197 |
+ if (invert) |
1198 |
+ val = (max - ucontrol->value.integer.value[0]) & mask; |
1199 |
+@@ -531,9 +537,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1200 |
+ val_mask = mask << shift; |
1201 |
+ val = val << shift; |
1202 |
+ |
1203 |
+- ret = snd_soc_component_update_bits(component, reg, val_mask, val); |
1204 |
+- if (ret < 0) |
1205 |
+- return ret; |
1206 |
++ err = snd_soc_component_update_bits(component, reg, val_mask, val); |
1207 |
++ if (err < 0) |
1208 |
++ return err; |
1209 |
++ ret = err; |
1210 |
+ |
1211 |
+ if (snd_soc_volsw_is_stereo(mc)) { |
1212 |
+ if (invert) |
1213 |
+@@ -543,8 +550,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
1214 |
+ val_mask = mask << shift; |
1215 |
+ val = val << shift; |
1216 |
+ |
1217 |
+- ret = snd_soc_component_update_bits(component, rreg, val_mask, |
1218 |
++ err = snd_soc_component_update_bits(component, rreg, val_mask, |
1219 |
+ val); |
1220 |
++ /* Don't discard any error code or drop change flag */ |
1221 |
++ if (ret == 0 || err < 0) { |
1222 |
++ ret = err; |
1223 |
++ } |
1224 |
+ } |
1225 |
+ |
1226 |
+ return ret; |
1227 |
+diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h |
1228 |
+index 794a375dad360..b2aec04fce8f6 100644 |
1229 |
+--- a/tools/lib/subcmd/subcmd-util.h |
1230 |
++++ b/tools/lib/subcmd/subcmd-util.h |
1231 |
+@@ -50,15 +50,8 @@ static NORETURN inline void die(const char *err, ...) |
1232 |
+ static inline void *xrealloc(void *ptr, size_t size) |
1233 |
+ { |
1234 |
+ void *ret = realloc(ptr, size); |
1235 |
+- if (!ret && !size) |
1236 |
+- ret = realloc(ptr, 1); |
1237 |
+- if (!ret) { |
1238 |
+- ret = realloc(ptr, size); |
1239 |
+- if (!ret && !size) |
1240 |
+- ret = realloc(ptr, 1); |
1241 |
+- if (!ret) |
1242 |
+- die("Out of memory, realloc failed"); |
1243 |
+- } |
1244 |
++ if (!ret) |
1245 |
++ die("Out of memory, realloc failed"); |
1246 |
+ return ret; |
1247 |
+ } |
1248 |
+ |
1249 |
+diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh |
1250 |
+index 232e958ec4547..b0b91d9b0dc21 100755 |
1251 |
+--- a/tools/testing/selftests/zram/zram.sh |
1252 |
++++ b/tools/testing/selftests/zram/zram.sh |
1253 |
+@@ -2,9 +2,6 @@ |
1254 |
+ # SPDX-License-Identifier: GPL-2.0 |
1255 |
+ TCID="zram.sh" |
1256 |
+ |
1257 |
+-# Kselftest framework requirement - SKIP code is 4. |
1258 |
+-ksft_skip=4 |
1259 |
+- |
1260 |
+ . ./zram_lib.sh |
1261 |
+ |
1262 |
+ run_zram () { |
1263 |
+@@ -18,14 +15,4 @@ echo "" |
1264 |
+ |
1265 |
+ check_prereqs |
1266 |
+ |
1267 |
+-# check zram module exists |
1268 |
+-MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
1269 |
+-if [ -f $MODULE_PATH ]; then |
1270 |
+- run_zram |
1271 |
+-elif [ -b /dev/zram0 ]; then |
1272 |
+- run_zram |
1273 |
+-else |
1274 |
+- echo "$TCID : No zram.ko module or /dev/zram0 device file not found" |
1275 |
+- echo "$TCID : CONFIG_ZRAM is not set" |
1276 |
+- exit $ksft_skip |
1277 |
+-fi |
1278 |
++run_zram |
1279 |
+diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh |
1280 |
+index b9566a6478a9c..8abc9965089d1 100755 |
1281 |
+--- a/tools/testing/selftests/zram/zram01.sh |
1282 |
++++ b/tools/testing/selftests/zram/zram01.sh |
1283 |
+@@ -42,9 +42,7 @@ zram_algs="lzo" |
1284 |
+ |
1285 |
+ zram_fill_fs() |
1286 |
+ { |
1287 |
+- local mem_free0=$(free -m | awk 'NR==2 {print $4}') |
1288 |
+- |
1289 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1290 |
++ for i in $(seq $dev_start $dev_end); do |
1291 |
+ echo "fill zram$i..." |
1292 |
+ local b=0 |
1293 |
+ while [ true ]; do |
1294 |
+@@ -54,29 +52,17 @@ zram_fill_fs() |
1295 |
+ b=$(($b + 1)) |
1296 |
+ done |
1297 |
+ echo "zram$i can be filled with '$b' KB" |
1298 |
+- done |
1299 |
+ |
1300 |
+- local mem_free1=$(free -m | awk 'NR==2 {print $4}') |
1301 |
+- local used_mem=$(($mem_free0 - $mem_free1)) |
1302 |
++ local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"` |
1303 |
++ local v=$((100 * 1024 * $b / $mem_used_total)) |
1304 |
++ if [ "$v" -lt 100 ]; then |
1305 |
++ echo "FAIL compression ratio: 0.$v:1" |
1306 |
++ ERR_CODE=-1 |
1307 |
++ return |
1308 |
++ fi |
1309 |
+ |
1310 |
+- local total_size=0 |
1311 |
+- for sm in $zram_sizes; do |
1312 |
+- local s=$(echo $sm | sed 's/M//') |
1313 |
+- total_size=$(($total_size + $s)) |
1314 |
++ echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
1315 |
+ done |
1316 |
+- |
1317 |
+- echo "zram used ${used_mem}M, zram disk sizes ${total_size}M" |
1318 |
+- |
1319 |
+- local v=$((100 * $total_size / $used_mem)) |
1320 |
+- |
1321 |
+- if [ "$v" -lt 100 ]; then |
1322 |
+- echo "FAIL compression ratio: 0.$v:1" |
1323 |
+- ERR_CODE=-1 |
1324 |
+- zram_cleanup |
1325 |
+- return |
1326 |
+- fi |
1327 |
+- |
1328 |
+- echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
1329 |
+ } |
1330 |
+ |
1331 |
+ check_prereqs |
1332 |
+@@ -90,7 +76,6 @@ zram_mount |
1333 |
+ |
1334 |
+ zram_fill_fs |
1335 |
+ zram_cleanup |
1336 |
+-zram_unload |
1337 |
+ |
1338 |
+ if [ $ERR_CODE -ne 0 ]; then |
1339 |
+ echo "$TCID : [FAIL]" |
1340 |
+diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh |
1341 |
+index 74569b883737f..3768cfd2e5f83 100755 |
1342 |
+--- a/tools/testing/selftests/zram/zram02.sh |
1343 |
++++ b/tools/testing/selftests/zram/zram02.sh |
1344 |
+@@ -45,7 +45,6 @@ zram_set_memlimit |
1345 |
+ zram_makeswap |
1346 |
+ zram_swapoff |
1347 |
+ zram_cleanup |
1348 |
+-zram_unload |
1349 |
+ |
1350 |
+ if [ $ERR_CODE -ne 0 ]; then |
1351 |
+ echo "$TCID : [FAIL]" |
1352 |
+diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh |
1353 |
+index 9e73a4fb9b0aa..130d193cbd727 100755 |
1354 |
+--- a/tools/testing/selftests/zram/zram_lib.sh |
1355 |
++++ b/tools/testing/selftests/zram/zram_lib.sh |
1356 |
+@@ -14,12 +14,17 @@ |
1357 |
+ # Author: Alexey Kodanev <alexey.kodanev@××××××.com> |
1358 |
+ # Modified: Naresh Kamboju <naresh.kamboju@××××××.org> |
1359 |
+ |
1360 |
+-MODULE=0 |
1361 |
+ dev_makeswap=-1 |
1362 |
+ dev_mounted=-1 |
1363 |
+- |
1364 |
++dev_start=0 |
1365 |
++dev_end=-1 |
1366 |
++module_load=-1 |
1367 |
++sys_control=-1 |
1368 |
+ # Kselftest framework requirement - SKIP code is 4. |
1369 |
+ ksft_skip=4 |
1370 |
++kernel_version=`uname -r | cut -d'.' -f1,2` |
1371 |
++kernel_major=${kernel_version%.*} |
1372 |
++kernel_minor=${kernel_version#*.} |
1373 |
+ |
1374 |
+ trap INT |
1375 |
+ |
1376 |
+@@ -34,68 +39,104 @@ check_prereqs() |
1377 |
+ fi |
1378 |
+ } |
1379 |
+ |
1380 |
++kernel_gte() |
1381 |
++{ |
1382 |
++ major=${1%.*} |
1383 |
++ minor=${1#*.} |
1384 |
++ |
1385 |
++ if [ $kernel_major -gt $major ]; then |
1386 |
++ return 0 |
1387 |
++ elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then |
1388 |
++ return 0 |
1389 |
++ fi |
1390 |
++ |
1391 |
++ return 1 |
1392 |
++} |
1393 |
++ |
1394 |
+ zram_cleanup() |
1395 |
+ { |
1396 |
+ echo "zram cleanup" |
1397 |
+ local i= |
1398 |
+- for i in $(seq 0 $dev_makeswap); do |
1399 |
++ for i in $(seq $dev_start $dev_makeswap); do |
1400 |
+ swapoff /dev/zram$i |
1401 |
+ done |
1402 |
+ |
1403 |
+- for i in $(seq 0 $dev_mounted); do |
1404 |
++ for i in $(seq $dev_start $dev_mounted); do |
1405 |
+ umount /dev/zram$i |
1406 |
+ done |
1407 |
+ |
1408 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1409 |
++ for i in $(seq $dev_start $dev_end); do |
1410 |
+ echo 1 > /sys/block/zram${i}/reset |
1411 |
+ rm -rf zram$i |
1412 |
+ done |
1413 |
+ |
1414 |
+-} |
1415 |
++ if [ $sys_control -eq 1 ]; then |
1416 |
++ for i in $(seq $dev_start $dev_end); do |
1417 |
++ echo $i > /sys/class/zram-control/hot_remove |
1418 |
++ done |
1419 |
++ fi |
1420 |
+ |
1421 |
+-zram_unload() |
1422 |
+-{ |
1423 |
+- if [ $MODULE -ne 0 ] ; then |
1424 |
+- echo "zram rmmod zram" |
1425 |
++ if [ $module_load -eq 1 ]; then |
1426 |
+ rmmod zram > /dev/null 2>&1 |
1427 |
+ fi |
1428 |
+ } |
1429 |
+ |
1430 |
+ zram_load() |
1431 |
+ { |
1432 |
+- # check zram module exists |
1433 |
+- MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
1434 |
+- if [ -f $MODULE_PATH ]; then |
1435 |
+- MODULE=1 |
1436 |
+- echo "create '$dev_num' zram device(s)" |
1437 |
+- modprobe zram num_devices=$dev_num |
1438 |
+- if [ $? -ne 0 ]; then |
1439 |
+- echo "failed to insert zram module" |
1440 |
+- exit 1 |
1441 |
+- fi |
1442 |
+- |
1443 |
+- dev_num_created=$(ls /dev/zram* | wc -w) |
1444 |
++ echo "create '$dev_num' zram device(s)" |
1445 |
++ |
1446 |
++ # zram module loaded, new kernel |
1447 |
++ if [ -d "/sys/class/zram-control" ]; then |
1448 |
++ echo "zram modules already loaded, kernel supports" \ |
1449 |
++ "zram-control interface" |
1450 |
++ dev_start=$(ls /dev/zram* | wc -w) |
1451 |
++ dev_end=$(($dev_start + $dev_num - 1)) |
1452 |
++ sys_control=1 |
1453 |
++ |
1454 |
++ for i in $(seq $dev_start $dev_end); do |
1455 |
++ cat /sys/class/zram-control/hot_add > /dev/null |
1456 |
++ done |
1457 |
++ |
1458 |
++ echo "all zram devices (/dev/zram$dev_start~$dev_end" \ |
1459 |
++ "successfully created" |
1460 |
++ return 0 |
1461 |
++ fi |
1462 |
+ |
1463 |
+- if [ "$dev_num_created" -ne "$dev_num" ]; then |
1464 |
+- echo "unexpected num of devices: $dev_num_created" |
1465 |
+- ERR_CODE=-1 |
1466 |
++ # detect old kernel or built-in |
1467 |
++ modprobe zram num_devices=$dev_num |
1468 |
++ if [ ! -d "/sys/class/zram-control" ]; then |
1469 |
++ if grep -q '^zram' /proc/modules; then |
1470 |
++ rmmod zram > /dev/null 2>&1 |
1471 |
++ if [ $? -ne 0 ]; then |
1472 |
++ echo "zram module is being used on old kernel" \ |
1473 |
++ "without zram-control interface" |
1474 |
++ exit $ksft_skip |
1475 |
++ fi |
1476 |
+ else |
1477 |
+- echo "zram load module successful" |
1478 |
++ echo "test needs CONFIG_ZRAM=m on old kernel without" \ |
1479 |
++ "zram-control interface" |
1480 |
++ exit $ksft_skip |
1481 |
+ fi |
1482 |
+- elif [ -b /dev/zram0 ]; then |
1483 |
+- echo "/dev/zram0 device file found: OK" |
1484 |
+- else |
1485 |
+- echo "ERROR: No zram.ko module or no /dev/zram0 device found" |
1486 |
+- echo "$TCID : CONFIG_ZRAM is not set" |
1487 |
+- exit 1 |
1488 |
++ modprobe zram num_devices=$dev_num |
1489 |
+ fi |
1490 |
++ |
1491 |
++ module_load=1 |
1492 |
++ dev_end=$(($dev_num - 1)) |
1493 |
++ echo "all zram devices (/dev/zram0~$dev_end) successfully created" |
1494 |
+ } |
1495 |
+ |
1496 |
+ zram_max_streams() |
1497 |
+ { |
1498 |
+ echo "set max_comp_streams to zram device(s)" |
1499 |
+ |
1500 |
+- local i=0 |
1501 |
++ kernel_gte 4.7 |
1502 |
++ if [ $? -eq 0 ]; then |
1503 |
++ echo "The device attribute max_comp_streams was"\ |
1504 |
++ "deprecated in 4.7" |
1505 |
++ return 0 |
1506 |
++ fi |
1507 |
++ |
1508 |
++ local i=$dev_start |
1509 |
+ for max_s in $zram_max_streams; do |
1510 |
+ local sys_path="/sys/block/zram${i}/max_comp_streams" |
1511 |
+ echo $max_s > $sys_path || \ |
1512 |
+@@ -107,7 +148,7 @@ zram_max_streams() |
1513 |
+ echo "FAIL can't set max_streams '$max_s', get $max_stream" |
1514 |
+ |
1515 |
+ i=$(($i + 1)) |
1516 |
+- echo "$sys_path = '$max_streams' ($i/$dev_num)" |
1517 |
++ echo "$sys_path = '$max_streams'" |
1518 |
+ done |
1519 |
+ |
1520 |
+ echo "zram max streams: OK" |
1521 |
+@@ -117,15 +158,16 @@ zram_compress_alg() |
1522 |
+ { |
1523 |
+ echo "test that we can set compression algorithm" |
1524 |
+ |
1525 |
+- local algs=$(cat /sys/block/zram0/comp_algorithm) |
1526 |
++ local i=$dev_start |
1527 |
++ local algs=$(cat /sys/block/zram${i}/comp_algorithm) |
1528 |
+ echo "supported algs: $algs" |
1529 |
+- local i=0 |
1530 |
++ |
1531 |
+ for alg in $zram_algs; do |
1532 |
+ local sys_path="/sys/block/zram${i}/comp_algorithm" |
1533 |
+ echo "$alg" > $sys_path || \ |
1534 |
+ echo "FAIL can't set '$alg' to $sys_path" |
1535 |
+ i=$(($i + 1)) |
1536 |
+- echo "$sys_path = '$alg' ($i/$dev_num)" |
1537 |
++ echo "$sys_path = '$alg'" |
1538 |
+ done |
1539 |
+ |
1540 |
+ echo "zram set compression algorithm: OK" |
1541 |
+@@ -134,14 +176,14 @@ zram_compress_alg() |
1542 |
+ zram_set_disksizes() |
1543 |
+ { |
1544 |
+ echo "set disk size to zram device(s)" |
1545 |
+- local i=0 |
1546 |
++ local i=$dev_start |
1547 |
+ for ds in $zram_sizes; do |
1548 |
+ local sys_path="/sys/block/zram${i}/disksize" |
1549 |
+ echo "$ds" > $sys_path || \ |
1550 |
+ echo "FAIL can't set '$ds' to $sys_path" |
1551 |
+ |
1552 |
+ i=$(($i + 1)) |
1553 |
+- echo "$sys_path = '$ds' ($i/$dev_num)" |
1554 |
++ echo "$sys_path = '$ds'" |
1555 |
+ done |
1556 |
+ |
1557 |
+ echo "zram set disksizes: OK" |
1558 |
+@@ -151,14 +193,14 @@ zram_set_memlimit() |
1559 |
+ { |
1560 |
+ echo "set memory limit to zram device(s)" |
1561 |
+ |
1562 |
+- local i=0 |
1563 |
++ local i=$dev_start |
1564 |
+ for ds in $zram_mem_limits; do |
1565 |
+ local sys_path="/sys/block/zram${i}/mem_limit" |
1566 |
+ echo "$ds" > $sys_path || \ |
1567 |
+ echo "FAIL can't set '$ds' to $sys_path" |
1568 |
+ |
1569 |
+ i=$(($i + 1)) |
1570 |
+- echo "$sys_path = '$ds' ($i/$dev_num)" |
1571 |
++ echo "$sys_path = '$ds'" |
1572 |
+ done |
1573 |
+ |
1574 |
+ echo "zram set memory limit: OK" |
1575 |
+@@ -167,8 +209,8 @@ zram_set_memlimit() |
1576 |
+ zram_makeswap() |
1577 |
+ { |
1578 |
+ echo "make swap with zram device(s)" |
1579 |
+- local i=0 |
1580 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1581 |
++ local i=$dev_start |
1582 |
++ for i in $(seq $dev_start $dev_end); do |
1583 |
+ mkswap /dev/zram$i > err.log 2>&1 |
1584 |
+ if [ $? -ne 0 ]; then |
1585 |
+ cat err.log |
1586 |
+@@ -191,7 +233,7 @@ zram_makeswap() |
1587 |
+ zram_swapoff() |
1588 |
+ { |
1589 |
+ local i= |
1590 |
+- for i in $(seq 0 $dev_makeswap); do |
1591 |
++ for i in $(seq $dev_start $dev_end); do |
1592 |
+ swapoff /dev/zram$i > err.log 2>&1 |
1593 |
+ if [ $? -ne 0 ]; then |
1594 |
+ cat err.log |
1595 |
+@@ -205,7 +247,7 @@ zram_swapoff() |
1596 |
+ |
1597 |
+ zram_makefs() |
1598 |
+ { |
1599 |
+- local i=0 |
1600 |
++ local i=$dev_start |
1601 |
+ for fs in $zram_filesystems; do |
1602 |
+ # if requested fs not supported default it to ext2 |
1603 |
+ which mkfs.$fs > /dev/null 2>&1 || fs=ext2 |
1604 |
+@@ -224,7 +266,7 @@ zram_makefs() |
1605 |
+ zram_mount() |
1606 |
+ { |
1607 |
+ local i=0 |
1608 |
+- for i in $(seq 0 $(($dev_num - 1))); do |
1609 |
++ for i in $(seq $dev_start $dev_end); do |
1610 |
+ echo "mount /dev/zram$i" |
1611 |
+ mkdir zram$i |
1612 |
+ mount /dev/zram$i zram$i > /dev/null || \ |