Contents of /trunk/kernel-alx-legacy/patches-4.9/0338-4.9.239-all-fixes.patch
Parent Directory | Revision Log
Revision 3640 -
(show annotations)
(download)
Mon Oct 24 14:07:19 2022 UTC (23 months ago) by niro
File size: 64082 byte(s)
Mon Oct 24 14:07:19 2022 UTC (23 months ago) by niro
File size: 64082 byte(s)
-linux-4.9.239
1 | diff --git a/Makefile b/Makefile |
2 | index 41a7d6626e354..82bb1b27d2f57 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 238 |
9 | +SUBLEVEL = 239 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/drivers/base/dd.c b/drivers/base/dd.c |
14 | index 854d218ea76ac..ff59a1851cb4d 100644 |
15 | --- a/drivers/base/dd.c |
16 | +++ b/drivers/base/dd.c |
17 | @@ -343,7 +343,8 @@ static int really_probe(struct device *dev, struct device_driver *drv) |
18 | drv->bus->name, __func__, drv->name, dev_name(dev)); |
19 | if (!list_empty(&dev->devres_head)) { |
20 | dev_crit(dev, "Resources present before probing\n"); |
21 | - return -EBUSY; |
22 | + ret = -EBUSY; |
23 | + goto done; |
24 | } |
25 | |
26 | re_probe: |
27 | @@ -446,7 +447,7 @@ pinctrl_bind_failed: |
28 | ret = 0; |
29 | done: |
30 | atomic_dec(&probe_count); |
31 | - wake_up(&probe_waitqueue); |
32 | + wake_up_all(&probe_waitqueue); |
33 | return ret; |
34 | } |
35 | |
36 | diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c |
37 | index 91f9b79e39411..9a9402f568ef6 100644 |
38 | --- a/drivers/clk/samsung/clk-exynos4.c |
39 | +++ b/drivers/clk/samsung/clk-exynos4.c |
40 | @@ -1060,7 +1060,7 @@ static const struct samsung_gate_clock exynos4210_gate_clks[] __initconst = { |
41 | GATE(CLK_PCIE, "pcie", "aclk133", GATE_IP_FSYS, 14, 0, 0), |
42 | GATE(CLK_SMMU_PCIE, "smmu_pcie", "aclk133", GATE_IP_FSYS, 18, 0, 0), |
43 | GATE(CLK_MODEMIF, "modemif", "aclk100", GATE_IP_PERIL, 28, 0, 0), |
44 | - GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, 0, 0), |
45 | + GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, CLK_IGNORE_UNUSED, 0), |
46 | GATE(CLK_SYSREG, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0, |
47 | CLK_IGNORE_UNUSED, 0), |
48 | GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4210_GATE_IP_PERIR, 11, 0, |
49 | @@ -1101,7 +1101,7 @@ static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = { |
50 | 0), |
51 | GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0), |
52 | GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0), |
53 | - GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0), |
54 | + GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, CLK_IGNORE_UNUSED, 0), |
55 | GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, |
56 | CLK_IGNORE_UNUSED, 0), |
57 | GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4X12_GATE_IP_PERIR, 11, 0, |
58 | diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c |
59 | index d6e21f1a70a9d..6cc7c5d59e460 100644 |
60 | --- a/drivers/gpio/gpio-tc3589x.c |
61 | +++ b/drivers/gpio/gpio-tc3589x.c |
62 | @@ -210,7 +210,7 @@ static void tc3589x_gpio_irq_sync_unlock(struct irq_data *d) |
63 | continue; |
64 | |
65 | tc3589x_gpio->oldregs[i][j] = new; |
66 | - tc3589x_reg_write(tc3589x, regmap[i] + j * 8, new); |
67 | + tc3589x_reg_write(tc3589x, regmap[i] + j, new); |
68 | } |
69 | } |
70 | |
71 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |
72 | index fdf7a18058881..fd97532bf7ebc 100644 |
73 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |
74 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |
75 | @@ -283,7 +283,7 @@ int amdgpu_crtc_set_config(struct drm_mode_set *set) |
76 | take the current one */ |
77 | if (active && !adev->have_disp_power_ref) { |
78 | adev->have_disp_power_ref = true; |
79 | - goto out; |
80 | + return ret; |
81 | } |
82 | /* if we have no active crtcs, then drop the power ref |
83 | we got before */ |
84 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |
85 | index 05ff98b43c50f..80c60a62d39ef 100644 |
86 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |
87 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |
88 | @@ -637,6 +637,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm) |
89 | |
90 | release_sg: |
91 | kfree(ttm->sg); |
92 | + ttm->sg = NULL; |
93 | return r; |
94 | } |
95 | |
96 | diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c |
97 | index d89bde2c5da25..cf285b97a6422 100644 |
98 | --- a/drivers/i2c/busses/i2c-cpm.c |
99 | +++ b/drivers/i2c/busses/i2c-cpm.c |
100 | @@ -74,6 +74,9 @@ struct i2c_ram { |
101 | char res1[4]; /* Reserved */ |
102 | ushort rpbase; /* Relocation pointer */ |
103 | char res2[2]; /* Reserved */ |
104 | + /* The following elements are only for CPM2 */ |
105 | + char res3[4]; /* Reserved */ |
106 | + uint sdmatmp; /* Internal */ |
107 | }; |
108 | |
109 | #define I2COM_START 0x80 |
110 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
111 | index e5799639fb544..82ff44637ed78 100644 |
112 | --- a/drivers/input/serio/i8042-x86ia64io.h |
113 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
114 | @@ -797,6 +797,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = { |
115 | DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), |
116 | }, |
117 | }, |
118 | + { |
119 | + /* Acer Aspire 5 A515 */ |
120 | + .matches = { |
121 | + DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"), |
122 | + DMI_MATCH(DMI_BOARD_VENDOR, "PK"), |
123 | + }, |
124 | + }, |
125 | { } |
126 | }; |
127 | |
128 | diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c |
129 | index beef59eb94fa7..626b434e7967a 100644 |
130 | --- a/drivers/iommu/exynos-iommu.c |
131 | +++ b/drivers/iommu/exynos-iommu.c |
132 | @@ -1265,13 +1265,17 @@ static int exynos_iommu_of_xlate(struct device *dev, |
133 | return -ENODEV; |
134 | |
135 | data = platform_get_drvdata(sysmmu); |
136 | - if (!data) |
137 | + if (!data) { |
138 | + put_device(&sysmmu->dev); |
139 | return -ENODEV; |
140 | + } |
141 | |
142 | if (!owner) { |
143 | owner = kzalloc(sizeof(*owner), GFP_KERNEL); |
144 | - if (!owner) |
145 | + if (!owner) { |
146 | + put_device(&sysmmu->dev); |
147 | return -ENOMEM; |
148 | + } |
149 | |
150 | INIT_LIST_HEAD(&owner->controllers); |
151 | dev->archdata.iommu = owner; |
152 | diff --git a/drivers/mtd/nand/sunxi_nand.c b/drivers/mtd/nand/sunxi_nand.c |
153 | index ddf3e24cc2898..2cf19372efb90 100644 |
154 | --- a/drivers/mtd/nand/sunxi_nand.c |
155 | +++ b/drivers/mtd/nand/sunxi_nand.c |
156 | @@ -2108,7 +2108,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, |
157 | ret = mtd_device_register(mtd, NULL, 0); |
158 | if (ret) { |
159 | dev_err(dev, "failed to register mtd device: %d\n", ret); |
160 | - nand_release(nand); |
161 | + nand_cleanup(nand); |
162 | return ret; |
163 | } |
164 | |
165 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c |
166 | index 8322129c3f987..240d7850c8252 100644 |
167 | --- a/drivers/net/bonding/bond_main.c |
168 | +++ b/drivers/net/bonding/bond_main.c |
169 | @@ -1129,6 +1129,7 @@ static void bond_setup_by_slave(struct net_device *bond_dev, |
170 | |
171 | bond_dev->type = slave_dev->type; |
172 | bond_dev->hard_header_len = slave_dev->hard_header_len; |
173 | + bond_dev->needed_headroom = slave_dev->needed_headroom; |
174 | bond_dev->addr_len = slave_dev->addr_len; |
175 | |
176 | memcpy(bond_dev->broadcast, slave_dev->broadcast, |
177 | diff --git a/drivers/net/ethernet/dec/tulip/de2104x.c b/drivers/net/ethernet/dec/tulip/de2104x.c |
178 | index cadcee645f74e..11ce50a057998 100644 |
179 | --- a/drivers/net/ethernet/dec/tulip/de2104x.c |
180 | +++ b/drivers/net/ethernet/dec/tulip/de2104x.c |
181 | @@ -91,7 +91,7 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi |
182 | #define DSL CONFIG_DE2104X_DSL |
183 | #endif |
184 | |
185 | -#define DE_RX_RING_SIZE 64 |
186 | +#define DE_RX_RING_SIZE 128 |
187 | #define DE_TX_RING_SIZE 64 |
188 | #define DE_RING_BYTES \ |
189 | ((sizeof(struct de_desc) * DE_RX_RING_SIZE) + \ |
190 | diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c |
191 | index a5de56bcbac08..93d3152752ff4 100644 |
192 | --- a/drivers/net/ethernet/renesas/ravb_main.c |
193 | +++ b/drivers/net/ethernet/renesas/ravb_main.c |
194 | @@ -1336,51 +1336,6 @@ static inline int ravb_hook_irq(unsigned int irq, irq_handler_t handler, |
195 | return error; |
196 | } |
197 | |
198 | -/* MDIO bus init function */ |
199 | -static int ravb_mdio_init(struct ravb_private *priv) |
200 | -{ |
201 | - struct platform_device *pdev = priv->pdev; |
202 | - struct device *dev = &pdev->dev; |
203 | - int error; |
204 | - |
205 | - /* Bitbang init */ |
206 | - priv->mdiobb.ops = &bb_ops; |
207 | - |
208 | - /* MII controller setting */ |
209 | - priv->mii_bus = alloc_mdio_bitbang(&priv->mdiobb); |
210 | - if (!priv->mii_bus) |
211 | - return -ENOMEM; |
212 | - |
213 | - /* Hook up MII support for ethtool */ |
214 | - priv->mii_bus->name = "ravb_mii"; |
215 | - priv->mii_bus->parent = dev; |
216 | - snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
217 | - pdev->name, pdev->id); |
218 | - |
219 | - /* Register MDIO bus */ |
220 | - error = of_mdiobus_register(priv->mii_bus, dev->of_node); |
221 | - if (error) |
222 | - goto out_free_bus; |
223 | - |
224 | - return 0; |
225 | - |
226 | -out_free_bus: |
227 | - free_mdio_bitbang(priv->mii_bus); |
228 | - return error; |
229 | -} |
230 | - |
231 | -/* MDIO bus release function */ |
232 | -static int ravb_mdio_release(struct ravb_private *priv) |
233 | -{ |
234 | - /* Unregister mdio bus */ |
235 | - mdiobus_unregister(priv->mii_bus); |
236 | - |
237 | - /* Free bitbang info */ |
238 | - free_mdio_bitbang(priv->mii_bus); |
239 | - |
240 | - return 0; |
241 | -} |
242 | - |
243 | /* Network device open function for Ethernet AVB */ |
244 | static int ravb_open(struct net_device *ndev) |
245 | { |
246 | @@ -1389,13 +1344,6 @@ static int ravb_open(struct net_device *ndev) |
247 | struct device *dev = &pdev->dev; |
248 | int error; |
249 | |
250 | - /* MDIO bus init */ |
251 | - error = ravb_mdio_init(priv); |
252 | - if (error) { |
253 | - netdev_err(ndev, "failed to initialize MDIO\n"); |
254 | - return error; |
255 | - } |
256 | - |
257 | napi_enable(&priv->napi[RAVB_BE]); |
258 | napi_enable(&priv->napi[RAVB_NC]); |
259 | |
260 | @@ -1473,7 +1421,6 @@ out_free_irq: |
261 | out_napi_off: |
262 | napi_disable(&priv->napi[RAVB_NC]); |
263 | napi_disable(&priv->napi[RAVB_BE]); |
264 | - ravb_mdio_release(priv); |
265 | return error; |
266 | } |
267 | |
268 | @@ -1771,8 +1718,6 @@ static int ravb_close(struct net_device *ndev) |
269 | ravb_ring_free(ndev, RAVB_BE); |
270 | ravb_ring_free(ndev, RAVB_NC); |
271 | |
272 | - ravb_mdio_release(priv); |
273 | - |
274 | return 0; |
275 | } |
276 | |
277 | @@ -1875,6 +1820,51 @@ static const struct net_device_ops ravb_netdev_ops = { |
278 | .ndo_change_mtu = eth_change_mtu, |
279 | }; |
280 | |
281 | +/* MDIO bus init function */ |
282 | +static int ravb_mdio_init(struct ravb_private *priv) |
283 | +{ |
284 | + struct platform_device *pdev = priv->pdev; |
285 | + struct device *dev = &pdev->dev; |
286 | + int error; |
287 | + |
288 | + /* Bitbang init */ |
289 | + priv->mdiobb.ops = &bb_ops; |
290 | + |
291 | + /* MII controller setting */ |
292 | + priv->mii_bus = alloc_mdio_bitbang(&priv->mdiobb); |
293 | + if (!priv->mii_bus) |
294 | + return -ENOMEM; |
295 | + |
296 | + /* Hook up MII support for ethtool */ |
297 | + priv->mii_bus->name = "ravb_mii"; |
298 | + priv->mii_bus->parent = dev; |
299 | + snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
300 | + pdev->name, pdev->id); |
301 | + |
302 | + /* Register MDIO bus */ |
303 | + error = of_mdiobus_register(priv->mii_bus, dev->of_node); |
304 | + if (error) |
305 | + goto out_free_bus; |
306 | + |
307 | + return 0; |
308 | + |
309 | +out_free_bus: |
310 | + free_mdio_bitbang(priv->mii_bus); |
311 | + return error; |
312 | +} |
313 | + |
314 | +/* MDIO bus release function */ |
315 | +static int ravb_mdio_release(struct ravb_private *priv) |
316 | +{ |
317 | + /* Unregister mdio bus */ |
318 | + mdiobus_unregister(priv->mii_bus); |
319 | + |
320 | + /* Free bitbang info */ |
321 | + free_mdio_bitbang(priv->mii_bus); |
322 | + |
323 | + return 0; |
324 | +} |
325 | + |
326 | static const struct of_device_id ravb_match_table[] = { |
327 | { .compatible = "renesas,etheravb-r8a7790", .data = (void *)RCAR_GEN2 }, |
328 | { .compatible = "renesas,etheravb-r8a7794", .data = (void *)RCAR_GEN2 }, |
329 | @@ -2079,6 +2069,13 @@ static int ravb_probe(struct platform_device *pdev) |
330 | eth_hw_addr_random(ndev); |
331 | } |
332 | |
333 | + /* MDIO bus init */ |
334 | + error = ravb_mdio_init(priv); |
335 | + if (error) { |
336 | + dev_err(&pdev->dev, "failed to initialize MDIO\n"); |
337 | + goto out_dma_free; |
338 | + } |
339 | + |
340 | netif_napi_add(ndev, &priv->napi[RAVB_BE], ravb_poll, 64); |
341 | netif_napi_add(ndev, &priv->napi[RAVB_NC], ravb_poll, 64); |
342 | |
343 | @@ -2098,6 +2095,8 @@ static int ravb_probe(struct platform_device *pdev) |
344 | out_napi_del: |
345 | netif_napi_del(&priv->napi[RAVB_NC]); |
346 | netif_napi_del(&priv->napi[RAVB_BE]); |
347 | + ravb_mdio_release(priv); |
348 | +out_dma_free: |
349 | dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat, |
350 | priv->desc_bat_dma); |
351 | |
352 | @@ -2130,6 +2129,7 @@ static int ravb_remove(struct platform_device *pdev) |
353 | unregister_netdev(ndev); |
354 | netif_napi_del(&priv->napi[RAVB_NC]); |
355 | netif_napi_del(&priv->napi[RAVB_BE]); |
356 | + ravb_mdio_release(priv); |
357 | pm_runtime_disable(&pdev->dev); |
358 | free_netdev(ndev); |
359 | platform_set_drvdata(pdev, NULL); |
360 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c |
361 | index 3519a8a589dda..c8673e231a880 100644 |
362 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c |
363 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c |
364 | @@ -678,23 +678,16 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev, |
365 | struct stmmac_priv *priv = netdev_priv(dev); |
366 | int ret; |
367 | |
368 | - if (!edata->eee_enabled) { |
369 | + if (!priv->dma_cap.eee) |
370 | + return -EOPNOTSUPP; |
371 | + |
372 | + if (!edata->eee_enabled) |
373 | stmmac_disable_eee_mode(priv); |
374 | - } else { |
375 | - /* We are asking for enabling the EEE but it is safe |
376 | - * to verify all by invoking the eee_init function. |
377 | - * In case of failure it will return an error. |
378 | - */ |
379 | - edata->eee_enabled = stmmac_eee_init(priv); |
380 | - if (!edata->eee_enabled) |
381 | - return -EOPNOTSUPP; |
382 | - } |
383 | |
384 | ret = phy_ethtool_set_eee(dev->phydev, edata); |
385 | if (ret) |
386 | return ret; |
387 | |
388 | - priv->eee_enabled = edata->eee_enabled; |
389 | priv->tx_lpi_timer = edata->tx_lpi_timer; |
390 | return 0; |
391 | } |
392 | diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c |
393 | index 5defa29069ca3..774b9db0c811f 100644 |
394 | --- a/drivers/net/macsec.c |
395 | +++ b/drivers/net/macsec.c |
396 | @@ -1087,6 +1087,7 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) |
397 | struct macsec_rx_sa *rx_sa; |
398 | struct macsec_rxh_data *rxd; |
399 | struct macsec_dev *macsec; |
400 | + unsigned int len; |
401 | sci_t sci; |
402 | u32 pn; |
403 | bool cbit; |
404 | @@ -1242,9 +1243,10 @@ deliver: |
405 | macsec_rxsc_put(rx_sc); |
406 | |
407 | skb_orphan(skb); |
408 | + len = skb->len; |
409 | ret = gro_cells_receive(&macsec->gro_cells, skb); |
410 | if (ret == NET_RX_SUCCESS) |
411 | - count_rx(dev, skb->len); |
412 | + count_rx(dev, len); |
413 | else |
414 | macsec->secy.netdev->stats.rx_dropped++; |
415 | |
416 | diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig |
417 | index 2651c8d8de2f8..032017bd0ced5 100644 |
418 | --- a/drivers/net/phy/Kconfig |
419 | +++ b/drivers/net/phy/Kconfig |
420 | @@ -135,6 +135,7 @@ config MDIO_THUNDER |
421 | depends on 64BIT |
422 | depends on PCI |
423 | select MDIO_CAVIUM |
424 | + select MDIO_DEVRES |
425 | help |
426 | This driver supports the MDIO interfaces found on Cavium |
427 | ThunderX SoCs when the MDIO bus device appears as a PCI |
428 | diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c |
429 | index cea6d2eabe7e6..001dea7aaba3d 100644 |
430 | --- a/drivers/net/team/team.c |
431 | +++ b/drivers/net/team/team.c |
432 | @@ -299,7 +299,7 @@ inst_rollback: |
433 | for (i--; i >= 0; i--) |
434 | __team_option_inst_del_option(team, dst_opts[i]); |
435 | |
436 | - i = option_count - 1; |
437 | + i = option_count; |
438 | alloc_rollback: |
439 | for (i--; i >= 0; i--) |
440 | kfree(dst_opts[i]); |
441 | @@ -2085,6 +2085,7 @@ static void team_setup_by_port(struct net_device *dev, |
442 | dev->header_ops = port_dev->header_ops; |
443 | dev->type = port_dev->type; |
444 | dev->hard_header_len = port_dev->hard_header_len; |
445 | + dev->needed_headroom = port_dev->needed_headroom; |
446 | dev->addr_len = port_dev->addr_len; |
447 | dev->mtu = port_dev->mtu; |
448 | memcpy(dev->broadcast, port_dev->broadcast, port_dev->addr_len); |
449 | diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c |
450 | index 4f4f71b2966ba..9ccbdf1431063 100644 |
451 | --- a/drivers/net/usb/rndis_host.c |
452 | +++ b/drivers/net/usb/rndis_host.c |
453 | @@ -213,7 +213,7 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) |
454 | dev_dbg(&info->control->dev, |
455 | "rndis response error, code %d\n", retval); |
456 | } |
457 | - msleep(20); |
458 | + msleep(40); |
459 | } |
460 | dev_dbg(&info->control->dev, "rndis response timeout\n"); |
461 | return -ETIMEDOUT; |
462 | diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c |
463 | index 9504800217edd..4455493723681 100644 |
464 | --- a/drivers/net/usb/rtl8150.c |
465 | +++ b/drivers/net/usb/rtl8150.c |
466 | @@ -277,12 +277,20 @@ static int write_mii_word(rtl8150_t * dev, u8 phy, __u8 indx, u16 reg) |
467 | return 1; |
468 | } |
469 | |
470 | -static inline void set_ethernet_addr(rtl8150_t * dev) |
471 | +static void set_ethernet_addr(rtl8150_t *dev) |
472 | { |
473 | - u8 node_id[6]; |
474 | + u8 node_id[ETH_ALEN]; |
475 | + int ret; |
476 | + |
477 | + ret = get_registers(dev, IDR, sizeof(node_id), node_id); |
478 | |
479 | - get_registers(dev, IDR, sizeof(node_id), node_id); |
480 | - memcpy(dev->netdev->dev_addr, node_id, sizeof(node_id)); |
481 | + if (ret == sizeof(node_id)) { |
482 | + ether_addr_copy(dev->netdev->dev_addr, node_id); |
483 | + } else { |
484 | + eth_hw_addr_random(dev->netdev); |
485 | + netdev_notice(dev->netdev, "Assigned a random MAC address: %pM\n", |
486 | + dev->netdev->dev_addr); |
487 | + } |
488 | } |
489 | |
490 | static int rtl8150_set_mac_address(struct net_device *netdev, void *p) |
491 | diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c |
492 | index 7f99fb666f196..1587789ba9343 100644 |
493 | --- a/drivers/net/wan/hdlc_cisco.c |
494 | +++ b/drivers/net/wan/hdlc_cisco.c |
495 | @@ -120,6 +120,7 @@ static void cisco_keepalive_send(struct net_device *dev, u32 type, |
496 | skb_put(skb, sizeof(struct cisco_packet)); |
497 | skb->priority = TC_PRIO_CONTROL; |
498 | skb->dev = dev; |
499 | + skb->protocol = htons(ETH_P_HDLC); |
500 | skb_reset_network_header(skb); |
501 | |
502 | dev_queue_xmit(skb); |
503 | diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c |
504 | index b6e0cfb095d35..bba19d068207a 100644 |
505 | --- a/drivers/net/wan/hdlc_fr.c |
506 | +++ b/drivers/net/wan/hdlc_fr.c |
507 | @@ -435,6 +435,8 @@ static netdev_tx_t pvc_xmit(struct sk_buff *skb, struct net_device *dev) |
508 | if (pvc->state.fecn) /* TX Congestion counter */ |
509 | dev->stats.tx_compressed++; |
510 | skb->dev = pvc->frad; |
511 | + skb->protocol = htons(ETH_P_HDLC); |
512 | + skb_reset_network_header(skb); |
513 | dev_queue_xmit(skb); |
514 | return NETDEV_TX_OK; |
515 | } |
516 | @@ -557,6 +559,7 @@ static void fr_lmi_send(struct net_device *dev, int fullrep) |
517 | skb_put(skb, i); |
518 | skb->priority = TC_PRIO_CONTROL; |
519 | skb->dev = dev; |
520 | + skb->protocol = htons(ETH_P_HDLC); |
521 | skb_reset_network_header(skb); |
522 | |
523 | dev_queue_xmit(skb); |
524 | diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c |
525 | index 63546d1317982..35589ee0cde11 100644 |
526 | --- a/drivers/net/wan/hdlc_ppp.c |
527 | +++ b/drivers/net/wan/hdlc_ppp.c |
528 | @@ -254,6 +254,7 @@ static void ppp_tx_cp(struct net_device *dev, u16 pid, u8 code, |
529 | |
530 | skb->priority = TC_PRIO_CONTROL; |
531 | skb->dev = dev; |
532 | + skb->protocol = htons(ETH_P_HDLC); |
533 | skb_reset_network_header(skb); |
534 | skb_queue_tail(&tx_queue, skb); |
535 | } |
536 | diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c |
537 | index c6db9a4e7c457..ef746ba74ab4c 100644 |
538 | --- a/drivers/net/wan/lapbether.c |
539 | +++ b/drivers/net/wan/lapbether.c |
540 | @@ -201,8 +201,6 @@ static void lapbeth_data_transmit(struct net_device *ndev, struct sk_buff *skb) |
541 | struct net_device *dev; |
542 | int size = skb->len; |
543 | |
544 | - skb->protocol = htons(ETH_P_X25); |
545 | - |
546 | ptr = skb_push(skb, 2); |
547 | |
548 | *ptr++ = size % 256; |
549 | @@ -213,6 +211,8 @@ static void lapbeth_data_transmit(struct net_device *ndev, struct sk_buff *skb) |
550 | |
551 | skb->dev = dev = lapbeth->ethdev; |
552 | |
553 | + skb->protocol = htons(ETH_P_DEC); |
554 | + |
555 | skb_reset_network_header(skb); |
556 | |
557 | dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0); |
558 | diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c |
559 | index b65ce7519411a..379f9633f78e1 100644 |
560 | --- a/drivers/platform/x86/thinkpad_acpi.c |
561 | +++ b/drivers/platform/x86/thinkpad_acpi.c |
562 | @@ -2476,7 +2476,7 @@ static void hotkey_compare_and_issue_event(struct tp_nvram_state *oldn, |
563 | */ |
564 | static int hotkey_kthread(void *data) |
565 | { |
566 | - struct tp_nvram_state s[2]; |
567 | + struct tp_nvram_state s[2] = { 0 }; |
568 | u32 poll_mask, event_mask; |
569 | unsigned int si, so; |
570 | unsigned long t; |
571 | @@ -6640,8 +6640,10 @@ static int __init tpacpi_query_bcl_levels(acpi_handle handle) |
572 | list_for_each_entry(child, &device->children, node) { |
573 | acpi_status status = acpi_evaluate_object(child->handle, "_BCL", |
574 | NULL, &buffer); |
575 | - if (ACPI_FAILURE(status)) |
576 | + if (ACPI_FAILURE(status)) { |
577 | + buffer.length = ACPI_ALLOCATE_BUFFER; |
578 | continue; |
579 | + } |
580 | |
581 | obj = (union acpi_object *)buffer.pointer; |
582 | if (!obj || (obj->type != ACPI_TYPE_PACKAGE)) { |
583 | diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c |
584 | index b69747367bd75..0061bf130598e 100644 |
585 | --- a/drivers/usb/gadget/function/f_ncm.c |
586 | +++ b/drivers/usb/gadget/function/f_ncm.c |
587 | @@ -1217,7 +1217,6 @@ static int ncm_unwrap_ntb(struct gether *port, |
588 | const struct ndp_parser_opts *opts = ncm->parser_opts; |
589 | unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0; |
590 | int dgram_counter; |
591 | - bool ndp_after_header; |
592 | |
593 | /* dwSignature */ |
594 | if (get_unaligned_le32(tmp) != opts->nth_sign) { |
595 | @@ -1244,7 +1243,6 @@ static int ncm_unwrap_ntb(struct gether *port, |
596 | } |
597 | |
598 | ndp_index = get_ncm(&tmp, opts->ndp_index); |
599 | - ndp_after_header = false; |
600 | |
601 | /* Run through all the NDP's in the NTB */ |
602 | do { |
603 | @@ -1260,8 +1258,6 @@ static int ncm_unwrap_ntb(struct gether *port, |
604 | ndp_index); |
605 | goto err; |
606 | } |
607 | - if (ndp_index == opts->nth_size) |
608 | - ndp_after_header = true; |
609 | |
610 | /* |
611 | * walk through NDP |
612 | @@ -1340,37 +1336,13 @@ static int ncm_unwrap_ntb(struct gether *port, |
613 | index2 = get_ncm(&tmp, opts->dgram_item_len); |
614 | dg_len2 = get_ncm(&tmp, opts->dgram_item_len); |
615 | |
616 | - if (index2 == 0 || dg_len2 == 0) |
617 | - break; |
618 | - |
619 | /* wDatagramIndex[1] */ |
620 | - if (ndp_after_header) { |
621 | - if (index2 < opts->nth_size + opts->ndp_size) { |
622 | - INFO(port->func.config->cdev, |
623 | - "Bad index: %#X\n", index2); |
624 | - goto err; |
625 | - } |
626 | - } else { |
627 | - if (index2 < opts->nth_size + opts->dpe_size) { |
628 | - INFO(port->func.config->cdev, |
629 | - "Bad index: %#X\n", index2); |
630 | - goto err; |
631 | - } |
632 | - } |
633 | if (index2 > block_len - opts->dpe_size) { |
634 | INFO(port->func.config->cdev, |
635 | "Bad index: %#X\n", index2); |
636 | goto err; |
637 | } |
638 | |
639 | - /* wDatagramLength[1] */ |
640 | - if ((dg_len2 < 14 + crc_len) || |
641 | - (dg_len2 > frame_max)) { |
642 | - INFO(port->func.config->cdev, |
643 | - "Bad dgram length: %#X\n", dg_len); |
644 | - goto err; |
645 | - } |
646 | - |
647 | /* |
648 | * Copy the data into a new skb. |
649 | * This ensures the truesize is correct |
650 | @@ -1387,6 +1359,8 @@ static int ncm_unwrap_ntb(struct gether *port, |
651 | ndp_len -= 2 * (opts->dgram_item_len * 2); |
652 | |
653 | dgram_counter++; |
654 | + if (index2 == 0 || dg_len2 == 0) |
655 | + break; |
656 | } while (ndp_len > 2 * (opts->dgram_item_len * 2)); |
657 | } while (ndp_index); |
658 | |
659 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c |
660 | index 4b7d0f9a820aa..44df6f6fd0636 100644 |
661 | --- a/drivers/video/console/fbcon.c |
662 | +++ b/drivers/video/console/fbcon.c |
663 | @@ -2234,6 +2234,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) |
664 | |
665 | if (font->width <= 8) { |
666 | j = vc->vc_font.height; |
667 | + if (font->charcount * j > FNTSIZE(fontdata)) |
668 | + return -EINVAL; |
669 | + |
670 | for (i = 0; i < font->charcount; i++) { |
671 | memcpy(data, fontdata, j); |
672 | memset(data + j, 0, 32 - j); |
673 | @@ -2242,6 +2245,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) |
674 | } |
675 | } else if (font->width <= 16) { |
676 | j = vc->vc_font.height * 2; |
677 | + if (font->charcount * j > FNTSIZE(fontdata)) |
678 | + return -EINVAL; |
679 | + |
680 | for (i = 0; i < font->charcount; i++) { |
681 | memcpy(data, fontdata, j); |
682 | memset(data + j, 0, 64 - j); |
683 | @@ -2249,6 +2255,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) |
684 | fontdata += j; |
685 | } |
686 | } else if (font->width <= 24) { |
687 | + if (font->charcount * (vc->vc_font.height * sizeof(u32)) > FNTSIZE(fontdata)) |
688 | + return -EINVAL; |
689 | + |
690 | for (i = 0; i < font->charcount; i++) { |
691 | for (j = 0; j < vc->vc_font.height; j++) { |
692 | *data++ = fontdata[0]; |
693 | @@ -2261,6 +2270,9 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) |
694 | } |
695 | } else { |
696 | j = vc->vc_font.height * 4; |
697 | + if (font->charcount * j > FNTSIZE(fontdata)) |
698 | + return -EINVAL; |
699 | + |
700 | for (i = 0; i < font->charcount; i++) { |
701 | memcpy(data, fontdata, j); |
702 | memset(data + j, 0, 128 - j); |
703 | diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h |
704 | index 5ebdccd070eb8..701eecab33171 100644 |
705 | --- a/drivers/video/console/fbcon.h |
706 | +++ b/drivers/video/console/fbcon.h |
707 | @@ -151,13 +151,6 @@ static inline int attr_col_ec(int shift, struct vc_data *vc, |
708 | #define attr_bgcol_ec(bgshift, vc, info) attr_col_ec(bgshift, vc, info, 0) |
709 | #define attr_fgcol_ec(fgshift, vc, info) attr_col_ec(fgshift, vc, info, 1) |
710 | |
711 | -/* Font */ |
712 | -#define REFCOUNT(fd) (((int *)(fd))[-1]) |
713 | -#define FNTSIZE(fd) (((int *)(fd))[-2]) |
714 | -#define FNTCHARCNT(fd) (((int *)(fd))[-3]) |
715 | -#define FNTSUM(fd) (((int *)(fd))[-4]) |
716 | -#define FONT_EXTRA_WORDS 4 |
717 | - |
718 | /* |
719 | * Scroll Method |
720 | */ |
721 | diff --git a/drivers/video/console/fbcon_rotate.c b/drivers/video/console/fbcon_rotate.c |
722 | index db6528f2d3f29..0e33210819454 100644 |
723 | --- a/drivers/video/console/fbcon_rotate.c |
724 | +++ b/drivers/video/console/fbcon_rotate.c |
725 | @@ -14,6 +14,7 @@ |
726 | #include <linux/fb.h> |
727 | #include <linux/vt_kern.h> |
728 | #include <linux/console.h> |
729 | +#include <linux/font.h> |
730 | #include <asm/types.h> |
731 | #include "fbcon.h" |
732 | #include "fbcon_rotate.h" |
733 | diff --git a/drivers/video/console/newport_con.c b/drivers/video/console/newport_con.c |
734 | index 33bddf3f30406..1a3a2f1d9817d 100644 |
735 | --- a/drivers/video/console/newport_con.c |
736 | +++ b/drivers/video/console/newport_con.c |
737 | @@ -35,12 +35,6 @@ |
738 | |
739 | #define FONT_DATA ((unsigned char *)font_vga_8x16.data) |
740 | |
741 | -/* borrowed from fbcon.c */ |
742 | -#define REFCOUNT(fd) (((int *)(fd))[-1]) |
743 | -#define FNTSIZE(fd) (((int *)(fd))[-2]) |
744 | -#define FNTCHARCNT(fd) (((int *)(fd))[-3]) |
745 | -#define FONT_EXTRA_WORDS 3 |
746 | - |
747 | static unsigned char *font_data[MAX_NR_CONSOLES]; |
748 | |
749 | static struct newport_regs *npregs; |
750 | @@ -522,6 +516,7 @@ static int newport_set_font(int unit, struct console_font *op) |
751 | FNTSIZE(new_data) = size; |
752 | FNTCHARCNT(new_data) = op->charcount; |
753 | REFCOUNT(new_data) = 0; /* usage counter */ |
754 | + FNTSUM(new_data) = 0; |
755 | |
756 | p = new_data; |
757 | for (i = 0; i < op->charcount; i++) { |
758 | diff --git a/drivers/video/console/tileblit.c b/drivers/video/console/tileblit.c |
759 | index 3c0b242dba5f0..691717276c3e2 100644 |
760 | --- a/drivers/video/console/tileblit.c |
761 | +++ b/drivers/video/console/tileblit.c |
762 | @@ -13,6 +13,7 @@ |
763 | #include <linux/fb.h> |
764 | #include <linux/vt_kern.h> |
765 | #include <linux/console.h> |
766 | +#include <linux/font.h> |
767 | #include <asm/types.h> |
768 | #include "fbcon.h" |
769 | |
770 | diff --git a/fs/eventpoll.c b/fs/eventpoll.c |
771 | index 8c40d6652a9a9..865afb58266a7 100644 |
772 | --- a/fs/eventpoll.c |
773 | +++ b/fs/eventpoll.c |
774 | @@ -222,8 +222,7 @@ struct eventpoll { |
775 | struct file *file; |
776 | |
777 | /* used to optimize loop detection check */ |
778 | - int visited; |
779 | - struct list_head visited_list_link; |
780 | + u64 gen; |
781 | }; |
782 | |
783 | /* Wait structure used by the poll hooks */ |
784 | @@ -267,6 +266,8 @@ static long max_user_watches __read_mostly; |
785 | */ |
786 | static DEFINE_MUTEX(epmutex); |
787 | |
788 | +static u64 loop_check_gen = 0; |
789 | + |
790 | /* Used to check for epoll file descriptor inclusion loops */ |
791 | static struct nested_calls poll_loop_ncalls; |
792 | |
793 | @@ -282,9 +283,6 @@ static struct kmem_cache *epi_cache __read_mostly; |
794 | /* Slab cache used to allocate "struct eppoll_entry" */ |
795 | static struct kmem_cache *pwq_cache __read_mostly; |
796 | |
797 | -/* Visited nodes during ep_loop_check(), so we can unset them when we finish */ |
798 | -static LIST_HEAD(visited_list); |
799 | - |
800 | /* |
801 | * List of files with newly added links, where we may need to limit the number |
802 | * of emanating paths. Protected by the epmutex. |
803 | @@ -1262,7 +1260,7 @@ static int reverse_path_check(void) |
804 | |
805 | static int ep_create_wakeup_source(struct epitem *epi) |
806 | { |
807 | - const char *name; |
808 | + struct name_snapshot n; |
809 | struct wakeup_source *ws; |
810 | |
811 | if (!epi->ep->ws) { |
812 | @@ -1271,8 +1269,9 @@ static int ep_create_wakeup_source(struct epitem *epi) |
813 | return -ENOMEM; |
814 | } |
815 | |
816 | - name = epi->ffd.file->f_path.dentry->d_name.name; |
817 | - ws = wakeup_source_register(name); |
818 | + take_dentry_name_snapshot(&n, epi->ffd.file->f_path.dentry); |
819 | + ws = wakeup_source_register(n.name); |
820 | + release_dentry_name_snapshot(&n); |
821 | |
822 | if (!ws) |
823 | return -ENOMEM; |
824 | @@ -1332,6 +1331,22 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, |
825 | RCU_INIT_POINTER(epi->ws, NULL); |
826 | } |
827 | |
828 | + /* Add the current item to the list of active epoll hook for this file */ |
829 | + spin_lock(&tfile->f_lock); |
830 | + list_add_tail_rcu(&epi->fllink, &tfile->f_ep_links); |
831 | + spin_unlock(&tfile->f_lock); |
832 | + |
833 | + /* |
834 | + * Add the current item to the RB tree. All RB tree operations are |
835 | + * protected by "mtx", and ep_insert() is called with "mtx" held. |
836 | + */ |
837 | + ep_rbtree_insert(ep, epi); |
838 | + |
839 | + /* now check if we've created too many backpaths */ |
840 | + error = -EINVAL; |
841 | + if (full_check && reverse_path_check()) |
842 | + goto error_remove_epi; |
843 | + |
844 | /* Initialize the poll table using the queue callback */ |
845 | epq.epi = epi; |
846 | init_poll_funcptr(&epq.pt, ep_ptable_queue_proc); |
847 | @@ -1354,22 +1369,6 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, |
848 | if (epi->nwait < 0) |
849 | goto error_unregister; |
850 | |
851 | - /* Add the current item to the list of active epoll hook for this file */ |
852 | - spin_lock(&tfile->f_lock); |
853 | - list_add_tail_rcu(&epi->fllink, &tfile->f_ep_links); |
854 | - spin_unlock(&tfile->f_lock); |
855 | - |
856 | - /* |
857 | - * Add the current item to the RB tree. All RB tree operations are |
858 | - * protected by "mtx", and ep_insert() is called with "mtx" held. |
859 | - */ |
860 | - ep_rbtree_insert(ep, epi); |
861 | - |
862 | - /* now check if we've created too many backpaths */ |
863 | - error = -EINVAL; |
864 | - if (full_check && reverse_path_check()) |
865 | - goto error_remove_epi; |
866 | - |
867 | /* We have to drop the new item inside our item list to keep track of it */ |
868 | spin_lock_irqsave(&ep->lock, flags); |
869 | |
870 | @@ -1395,6 +1394,8 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event, |
871 | |
872 | return 0; |
873 | |
874 | +error_unregister: |
875 | + ep_unregister_pollwait(ep, epi); |
876 | error_remove_epi: |
877 | spin_lock(&tfile->f_lock); |
878 | list_del_rcu(&epi->fllink); |
879 | @@ -1402,9 +1403,6 @@ error_remove_epi: |
880 | |
881 | rb_erase(&epi->rbn, &ep->rbr); |
882 | |
883 | -error_unregister: |
884 | - ep_unregister_pollwait(ep, epi); |
885 | - |
886 | /* |
887 | * We need to do this because an event could have been arrived on some |
888 | * allocated wait queue. Note that we don't care about the ep->ovflist |
889 | @@ -1725,13 +1723,12 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests) |
890 | struct epitem *epi; |
891 | |
892 | mutex_lock_nested(&ep->mtx, call_nests + 1); |
893 | - ep->visited = 1; |
894 | - list_add(&ep->visited_list_link, &visited_list); |
895 | + ep->gen = loop_check_gen; |
896 | for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) { |
897 | epi = rb_entry(rbp, struct epitem, rbn); |
898 | if (unlikely(is_file_epoll(epi->ffd.file))) { |
899 | ep_tovisit = epi->ffd.file->private_data; |
900 | - if (ep_tovisit->visited) |
901 | + if (ep_tovisit->gen == loop_check_gen) |
902 | continue; |
903 | error = ep_call_nested(&poll_loop_ncalls, EP_MAX_NESTS, |
904 | ep_loop_check_proc, epi->ffd.file, |
905 | @@ -1772,18 +1769,8 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests) |
906 | */ |
907 | static int ep_loop_check(struct eventpoll *ep, struct file *file) |
908 | { |
909 | - int ret; |
910 | - struct eventpoll *ep_cur, *ep_next; |
911 | - |
912 | - ret = ep_call_nested(&poll_loop_ncalls, EP_MAX_NESTS, |
913 | + return ep_call_nested(&poll_loop_ncalls, EP_MAX_NESTS, |
914 | ep_loop_check_proc, file, ep, current); |
915 | - /* clear visited list */ |
916 | - list_for_each_entry_safe(ep_cur, ep_next, &visited_list, |
917 | - visited_list_link) { |
918 | - ep_cur->visited = 0; |
919 | - list_del(&ep_cur->visited_list_link); |
920 | - } |
921 | - return ret; |
922 | } |
923 | |
924 | static void clear_tfile_check_list(void) |
925 | @@ -1940,6 +1927,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, |
926 | mutex_lock_nested(&ep->mtx, 0); |
927 | if (op == EPOLL_CTL_ADD) { |
928 | if (!list_empty(&f.file->f_ep_links) || |
929 | + ep->gen == loop_check_gen || |
930 | is_file_epoll(tf.file)) { |
931 | full_check = 1; |
932 | mutex_unlock(&ep->mtx); |
933 | @@ -2000,6 +1988,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, |
934 | error_tgt_fput: |
935 | if (full_check) { |
936 | clear_tfile_check_list(); |
937 | + loop_check_gen++; |
938 | mutex_unlock(&epmutex); |
939 | } |
940 | |
941 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
942 | index 2517fcd423b68..d405b5a14073a 100644 |
943 | --- a/fs/nfs/dir.c |
944 | +++ b/fs/nfs/dir.c |
945 | @@ -583,6 +583,9 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en |
946 | xdr_set_scratch_buffer(&stream, page_address(scratch), PAGE_SIZE); |
947 | |
948 | do { |
949 | + if (entry->label) |
950 | + entry->label->len = NFS4_MAXLABELLEN; |
951 | + |
952 | status = xdr_decode(desc, entry, &stream); |
953 | if (status != 0) { |
954 | if (status == -EAGAIN) |
955 | diff --git a/include/linux/font.h b/include/linux/font.h |
956 | index d6821769dd1e1..f85e70bd4793e 100644 |
957 | --- a/include/linux/font.h |
958 | +++ b/include/linux/font.h |
959 | @@ -57,4 +57,17 @@ extern const struct font_desc *get_default_font(int xres, int yres, |
960 | /* Max. length for the name of a predefined font */ |
961 | #define MAX_FONT_NAME 32 |
962 | |
963 | +/* Extra word getters */ |
964 | +#define REFCOUNT(fd) (((int *)(fd))[-1]) |
965 | +#define FNTSIZE(fd) (((int *)(fd))[-2]) |
966 | +#define FNTCHARCNT(fd) (((int *)(fd))[-3]) |
967 | +#define FNTSUM(fd) (((int *)(fd))[-4]) |
968 | + |
969 | +#define FONT_EXTRA_WORDS 4 |
970 | + |
971 | +struct font_data { |
972 | + unsigned int extra[FONT_EXTRA_WORDS]; |
973 | + const unsigned char data[]; |
974 | +} __packed; |
975 | + |
976 | #endif /* _VIDEO_FONT_H */ |
977 | diff --git a/include/linux/khugepaged.h b/include/linux/khugepaged.h |
978 | index 1e032a1ddb3ea..60af12869ac7f 100644 |
979 | --- a/include/linux/khugepaged.h |
980 | +++ b/include/linux/khugepaged.h |
981 | @@ -13,6 +13,7 @@ extern int __khugepaged_enter(struct mm_struct *mm); |
982 | extern void __khugepaged_exit(struct mm_struct *mm); |
983 | extern int khugepaged_enter_vma_merge(struct vm_area_struct *vma, |
984 | unsigned long vm_flags); |
985 | +extern void khugepaged_min_free_kbytes_update(void); |
986 | |
987 | #define khugepaged_enabled() \ |
988 | (transparent_hugepage_flags & \ |
989 | @@ -70,6 +71,10 @@ static inline int khugepaged_enter_vma_merge(struct vm_area_struct *vma, |
990 | { |
991 | return 0; |
992 | } |
993 | + |
994 | +static inline void khugepaged_min_free_kbytes_update(void) |
995 | +{ |
996 | +} |
997 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
998 | |
999 | #endif /* _LINUX_KHUGEPAGED_H */ |
1000 | diff --git a/include/net/xfrm.h b/include/net/xfrm.h |
1001 | index 9e2f260cbb518..b2a405c93a342 100644 |
1002 | --- a/include/net/xfrm.h |
1003 | +++ b/include/net/xfrm.h |
1004 | @@ -1726,21 +1726,17 @@ static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay |
1005 | static inline int xfrm_replay_clone(struct xfrm_state *x, |
1006 | struct xfrm_state *orig) |
1007 | { |
1008 | - x->replay_esn = kzalloc(xfrm_replay_state_esn_len(orig->replay_esn), |
1009 | + |
1010 | + x->replay_esn = kmemdup(orig->replay_esn, |
1011 | + xfrm_replay_state_esn_len(orig->replay_esn), |
1012 | GFP_KERNEL); |
1013 | if (!x->replay_esn) |
1014 | return -ENOMEM; |
1015 | - |
1016 | - x->replay_esn->bmp_len = orig->replay_esn->bmp_len; |
1017 | - x->replay_esn->replay_window = orig->replay_esn->replay_window; |
1018 | - |
1019 | - x->preplay_esn = kmemdup(x->replay_esn, |
1020 | - xfrm_replay_state_esn_len(x->replay_esn), |
1021 | + x->preplay_esn = kmemdup(orig->preplay_esn, |
1022 | + xfrm_replay_state_esn_len(orig->preplay_esn), |
1023 | GFP_KERNEL); |
1024 | - if (!x->preplay_esn) { |
1025 | - kfree(x->replay_esn); |
1026 | + if (!x->preplay_esn) |
1027 | return -ENOMEM; |
1028 | - } |
1029 | |
1030 | return 0; |
1031 | } |
1032 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
1033 | index b562467d2d498..7aad4d22b4223 100644 |
1034 | --- a/kernel/events/core.c |
1035 | +++ b/kernel/events/core.c |
1036 | @@ -94,7 +94,7 @@ static void remote_function(void *data) |
1037 | * retry due to any failures in smp_call_function_single(), such as if the |
1038 | * task_cpu() goes offline concurrently. |
1039 | * |
1040 | - * returns @func return value or -ESRCH when the process isn't running |
1041 | + * returns @func return value or -ESRCH or -ENXIO when the process isn't running |
1042 | */ |
1043 | static int |
1044 | task_function_call(struct task_struct *p, remote_function_f func, void *info) |
1045 | @@ -110,7 +110,8 @@ task_function_call(struct task_struct *p, remote_function_f func, void *info) |
1046 | for (;;) { |
1047 | ret = smp_call_function_single(task_cpu(p), remote_function, |
1048 | &data, 1); |
1049 | - ret = !ret ? data.ret : -EAGAIN; |
1050 | + if (!ret) |
1051 | + ret = data.ret; |
1052 | |
1053 | if (ret != -EAGAIN) |
1054 | break; |
1055 | diff --git a/kernel/kmod.c b/kernel/kmod.c |
1056 | index e4e5e98002fe3..3f3bbae4cec33 100644 |
1057 | --- a/kernel/kmod.c |
1058 | +++ b/kernel/kmod.c |
1059 | @@ -28,6 +28,7 @@ |
1060 | #include <linux/cred.h> |
1061 | #include <linux/file.h> |
1062 | #include <linux/fdtable.h> |
1063 | +#include <linux/fs_struct.h> |
1064 | #include <linux/workqueue.h> |
1065 | #include <linux/security.h> |
1066 | #include <linux/mount.h> |
1067 | @@ -222,6 +223,14 @@ static int call_usermodehelper_exec_async(void *data) |
1068 | flush_signal_handlers(current, 1); |
1069 | spin_unlock_irq(¤t->sighand->siglock); |
1070 | |
1071 | + /* |
1072 | + * Initial kernel threads share ther FS with init, in order to |
1073 | + * get the init root directory. But we've now created a new |
1074 | + * thread that is going to execve a user process and has its own |
1075 | + * 'struct fs_struct'. Reset umask to the default. |
1076 | + */ |
1077 | + current->fs->umask = 0022; |
1078 | + |
1079 | /* |
1080 | * Our parent (unbound workqueue) runs with elevated scheduling |
1081 | * priority. Avoid propagating that into the userspace child. |
1082 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
1083 | index 4d1be82e7011a..51e47e18764e3 100644 |
1084 | --- a/kernel/trace/ftrace.c |
1085 | +++ b/kernel/trace/ftrace.c |
1086 | @@ -5334,17 +5334,15 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, |
1087 | { |
1088 | int bit; |
1089 | |
1090 | - if ((op->flags & FTRACE_OPS_FL_RCU) && !rcu_is_watching()) |
1091 | - return; |
1092 | - |
1093 | bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); |
1094 | if (bit < 0) |
1095 | return; |
1096 | |
1097 | preempt_disable_notrace(); |
1098 | |
1099 | - if (!(op->flags & FTRACE_OPS_FL_PER_CPU) || |
1100 | - !ftrace_function_local_disabled(op)) { |
1101 | + if ((!(op->flags & FTRACE_OPS_FL_RCU) || rcu_is_watching()) && |
1102 | + (!(op->flags & FTRACE_OPS_FL_PER_CPU) || |
1103 | + !ftrace_function_local_disabled(op))) { |
1104 | op->func(ip, parent_ip, op, regs); |
1105 | } |
1106 | |
1107 | diff --git a/lib/fonts/font_10x18.c b/lib/fonts/font_10x18.c |
1108 | index 6be72bb218ee4..87e904f550c15 100644 |
1109 | --- a/lib/fonts/font_10x18.c |
1110 | +++ b/lib/fonts/font_10x18.c |
1111 | @@ -7,8 +7,8 @@ |
1112 | |
1113 | #define FONTDATAMAX 9216 |
1114 | |
1115 | -static const unsigned char fontdata_10x18[FONTDATAMAX] = { |
1116 | - |
1117 | +static struct font_data fontdata_10x18 = { |
1118 | + { 0, 0, FONTDATAMAX, 0 }, { |
1119 | /* 0 0x00 '^@' */ |
1120 | 0x00, 0x00, /* 0000000000 */ |
1121 | 0x00, 0x00, /* 0000000000 */ |
1122 | @@ -5128,8 +5128,7 @@ static const unsigned char fontdata_10x18[FONTDATAMAX] = { |
1123 | 0x00, 0x00, /* 0000000000 */ |
1124 | 0x00, 0x00, /* 0000000000 */ |
1125 | 0x00, 0x00, /* 0000000000 */ |
1126 | - |
1127 | -}; |
1128 | +} }; |
1129 | |
1130 | |
1131 | const struct font_desc font_10x18 = { |
1132 | @@ -5137,7 +5136,7 @@ const struct font_desc font_10x18 = { |
1133 | .name = "10x18", |
1134 | .width = 10, |
1135 | .height = 18, |
1136 | - .data = fontdata_10x18, |
1137 | + .data = fontdata_10x18.data, |
1138 | #ifdef __sparc__ |
1139 | .pref = 5, |
1140 | #else |
1141 | diff --git a/lib/fonts/font_6x10.c b/lib/fonts/font_6x10.c |
1142 | index b20620904d314..896ffa987c97b 100644 |
1143 | --- a/lib/fonts/font_6x10.c |
1144 | +++ b/lib/fonts/font_6x10.c |
1145 | @@ -1,7 +1,9 @@ |
1146 | #include <linux/font.h> |
1147 | |
1148 | -static const unsigned char fontdata_6x10[] = { |
1149 | +#define FONTDATAMAX 2560 |
1150 | |
1151 | +static struct font_data fontdata_6x10 = { |
1152 | + { 0, 0, FONTDATAMAX, 0 }, { |
1153 | /* 0 0x00 '^@' */ |
1154 | 0x00, /* 00000000 */ |
1155 | 0x00, /* 00000000 */ |
1156 | @@ -3073,14 +3075,13 @@ static const unsigned char fontdata_6x10[] = { |
1157 | 0x00, /* 00000000 */ |
1158 | 0x00, /* 00000000 */ |
1159 | 0x00, /* 00000000 */ |
1160 | - |
1161 | -}; |
1162 | +} }; |
1163 | |
1164 | const struct font_desc font_6x10 = { |
1165 | .idx = FONT6x10_IDX, |
1166 | .name = "6x10", |
1167 | .width = 6, |
1168 | .height = 10, |
1169 | - .data = fontdata_6x10, |
1170 | + .data = fontdata_6x10.data, |
1171 | .pref = 0, |
1172 | }; |
1173 | diff --git a/lib/fonts/font_6x11.c b/lib/fonts/font_6x11.c |
1174 | index 46e86e67aa6aa..eb46a59307d2e 100644 |
1175 | --- a/lib/fonts/font_6x11.c |
1176 | +++ b/lib/fonts/font_6x11.c |
1177 | @@ -8,8 +8,8 @@ |
1178 | |
1179 | #define FONTDATAMAX (11*256) |
1180 | |
1181 | -static const unsigned char fontdata_6x11[FONTDATAMAX] = { |
1182 | - |
1183 | +static struct font_data fontdata_6x11 = { |
1184 | + { 0, 0, FONTDATAMAX, 0 }, { |
1185 | /* 0 0x00 '^@' */ |
1186 | 0x00, /* 00000000 */ |
1187 | 0x00, /* 00000000 */ |
1188 | @@ -3337,8 +3337,7 @@ static const unsigned char fontdata_6x11[FONTDATAMAX] = { |
1189 | 0x00, /* 00000000 */ |
1190 | 0x00, /* 00000000 */ |
1191 | 0x00, /* 00000000 */ |
1192 | - |
1193 | -}; |
1194 | +} }; |
1195 | |
1196 | |
1197 | const struct font_desc font_vga_6x11 = { |
1198 | @@ -3346,7 +3345,7 @@ const struct font_desc font_vga_6x11 = { |
1199 | .name = "ProFont6x11", |
1200 | .width = 6, |
1201 | .height = 11, |
1202 | - .data = fontdata_6x11, |
1203 | + .data = fontdata_6x11.data, |
1204 | /* Try avoiding this font if possible unless on MAC */ |
1205 | .pref = -2000, |
1206 | }; |
1207 | diff --git a/lib/fonts/font_7x14.c b/lib/fonts/font_7x14.c |
1208 | index 3b7dbf9c060b3..c88b3bba001bd 100644 |
1209 | --- a/lib/fonts/font_7x14.c |
1210 | +++ b/lib/fonts/font_7x14.c |
1211 | @@ -7,8 +7,8 @@ |
1212 | |
1213 | #define FONTDATAMAX 3584 |
1214 | |
1215 | -static const unsigned char fontdata_7x14[FONTDATAMAX] = { |
1216 | - |
1217 | +static struct font_data fontdata_7x14 = { |
1218 | + { 0, 0, FONTDATAMAX, 0 }, { |
1219 | /* 0 0x00 '^@' */ |
1220 | 0x00, /* 0000000 */ |
1221 | 0x00, /* 0000000 */ |
1222 | @@ -4104,8 +4104,7 @@ static const unsigned char fontdata_7x14[FONTDATAMAX] = { |
1223 | 0x00, /* 0000000 */ |
1224 | 0x00, /* 0000000 */ |
1225 | 0x00, /* 0000000 */ |
1226 | - |
1227 | -}; |
1228 | +} }; |
1229 | |
1230 | |
1231 | const struct font_desc font_7x14 = { |
1232 | @@ -4113,6 +4112,6 @@ const struct font_desc font_7x14 = { |
1233 | .name = "7x14", |
1234 | .width = 7, |
1235 | .height = 14, |
1236 | - .data = fontdata_7x14, |
1237 | + .data = fontdata_7x14.data, |
1238 | .pref = 0, |
1239 | }; |
1240 | diff --git a/lib/fonts/font_8x16.c b/lib/fonts/font_8x16.c |
1241 | index 00a0c67a5c7d0..ba53e2643670b 100644 |
1242 | --- a/lib/fonts/font_8x16.c |
1243 | +++ b/lib/fonts/font_8x16.c |
1244 | @@ -9,8 +9,8 @@ |
1245 | |
1246 | #define FONTDATAMAX 4096 |
1247 | |
1248 | -static const unsigned char fontdata_8x16[FONTDATAMAX] = { |
1249 | - |
1250 | +static struct font_data fontdata_8x16 = { |
1251 | + { 0, 0, FONTDATAMAX, 0 }, { |
1252 | /* 0 0x00 '^@' */ |
1253 | 0x00, /* 00000000 */ |
1254 | 0x00, /* 00000000 */ |
1255 | @@ -4618,8 +4618,7 @@ static const unsigned char fontdata_8x16[FONTDATAMAX] = { |
1256 | 0x00, /* 00000000 */ |
1257 | 0x00, /* 00000000 */ |
1258 | 0x00, /* 00000000 */ |
1259 | - |
1260 | -}; |
1261 | +} }; |
1262 | |
1263 | |
1264 | const struct font_desc font_vga_8x16 = { |
1265 | @@ -4627,7 +4626,7 @@ const struct font_desc font_vga_8x16 = { |
1266 | .name = "VGA8x16", |
1267 | .width = 8, |
1268 | .height = 16, |
1269 | - .data = fontdata_8x16, |
1270 | + .data = fontdata_8x16.data, |
1271 | .pref = 0, |
1272 | }; |
1273 | EXPORT_SYMBOL(font_vga_8x16); |
1274 | diff --git a/lib/fonts/font_8x8.c b/lib/fonts/font_8x8.c |
1275 | index 9f56efe2cee72..4d28b81e8237c 100644 |
1276 | --- a/lib/fonts/font_8x8.c |
1277 | +++ b/lib/fonts/font_8x8.c |
1278 | @@ -8,8 +8,8 @@ |
1279 | |
1280 | #define FONTDATAMAX 2048 |
1281 | |
1282 | -static const unsigned char fontdata_8x8[FONTDATAMAX] = { |
1283 | - |
1284 | +static struct font_data fontdata_8x8 = { |
1285 | + { 0, 0, FONTDATAMAX, 0 }, { |
1286 | /* 0 0x00 '^@' */ |
1287 | 0x00, /* 00000000 */ |
1288 | 0x00, /* 00000000 */ |
1289 | @@ -2569,8 +2569,7 @@ static const unsigned char fontdata_8x8[FONTDATAMAX] = { |
1290 | 0x00, /* 00000000 */ |
1291 | 0x00, /* 00000000 */ |
1292 | 0x00, /* 00000000 */ |
1293 | - |
1294 | -}; |
1295 | +} }; |
1296 | |
1297 | |
1298 | const struct font_desc font_vga_8x8 = { |
1299 | @@ -2578,6 +2577,6 @@ const struct font_desc font_vga_8x8 = { |
1300 | .name = "VGA8x8", |
1301 | .width = 8, |
1302 | .height = 8, |
1303 | - .data = fontdata_8x8, |
1304 | + .data = fontdata_8x8.data, |
1305 | .pref = 0, |
1306 | }; |
1307 | diff --git a/lib/fonts/font_acorn_8x8.c b/lib/fonts/font_acorn_8x8.c |
1308 | index 639e31ae1100a..957398b762d38 100644 |
1309 | --- a/lib/fonts/font_acorn_8x8.c |
1310 | +++ b/lib/fonts/font_acorn_8x8.c |
1311 | @@ -2,7 +2,10 @@ |
1312 | |
1313 | #include <linux/font.h> |
1314 | |
1315 | -static const unsigned char acorndata_8x8[] = { |
1316 | +#define FONTDATAMAX 2048 |
1317 | + |
1318 | +static struct font_data acorndata_8x8 = { |
1319 | +{ 0, 0, FONTDATAMAX, 0 }, { |
1320 | /* 00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^@ */ |
1321 | /* 01 */ 0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e, /* ^A */ |
1322 | /* 02 */ 0x7e, 0xff, 0xbd, 0xff, 0xc3, 0xe7, 0xff, 0x7e, /* ^B */ |
1323 | @@ -259,14 +262,14 @@ static const unsigned char acorndata_8x8[] = { |
1324 | /* FD */ 0x38, 0x04, 0x18, 0x20, 0x3c, 0x00, 0x00, 0x00, |
1325 | /* FE */ 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00, |
1326 | /* FF */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
1327 | -}; |
1328 | +} }; |
1329 | |
1330 | const struct font_desc font_acorn_8x8 = { |
1331 | .idx = ACORN8x8_IDX, |
1332 | .name = "Acorn8x8", |
1333 | .width = 8, |
1334 | .height = 8, |
1335 | - .data = acorndata_8x8, |
1336 | + .data = acorndata_8x8.data, |
1337 | #ifdef CONFIG_ARCH_ACORN |
1338 | .pref = 20, |
1339 | #else |
1340 | diff --git a/lib/fonts/font_mini_4x6.c b/lib/fonts/font_mini_4x6.c |
1341 | index 838caa1cfef70..1449876c6a270 100644 |
1342 | --- a/lib/fonts/font_mini_4x6.c |
1343 | +++ b/lib/fonts/font_mini_4x6.c |
1344 | @@ -43,8 +43,8 @@ __END__; |
1345 | |
1346 | #define FONTDATAMAX 1536 |
1347 | |
1348 | -static const unsigned char fontdata_mini_4x6[FONTDATAMAX] = { |
1349 | - |
1350 | +static struct font_data fontdata_mini_4x6 = { |
1351 | + { 0, 0, FONTDATAMAX, 0 }, { |
1352 | /*{*/ |
1353 | /* Char 0: ' ' */ |
1354 | 0xee, /*= [*** ] */ |
1355 | @@ -2145,14 +2145,14 @@ static const unsigned char fontdata_mini_4x6[FONTDATAMAX] = { |
1356 | 0xee, /*= [*** ] */ |
1357 | 0x00, /*= [ ] */ |
1358 | /*}*/ |
1359 | -}; |
1360 | +} }; |
1361 | |
1362 | const struct font_desc font_mini_4x6 = { |
1363 | .idx = MINI4x6_IDX, |
1364 | .name = "MINI4x6", |
1365 | .width = 4, |
1366 | .height = 6, |
1367 | - .data = fontdata_mini_4x6, |
1368 | + .data = fontdata_mini_4x6.data, |
1369 | .pref = 3, |
1370 | }; |
1371 | |
1372 | diff --git a/lib/fonts/font_pearl_8x8.c b/lib/fonts/font_pearl_8x8.c |
1373 | index dc6ad539ca4e4..4649314333bb0 100644 |
1374 | --- a/lib/fonts/font_pearl_8x8.c |
1375 | +++ b/lib/fonts/font_pearl_8x8.c |
1376 | @@ -13,8 +13,8 @@ |
1377 | |
1378 | #define FONTDATAMAX 2048 |
1379 | |
1380 | -static const unsigned char fontdata_pearl8x8[FONTDATAMAX] = { |
1381 | - |
1382 | +static struct font_data fontdata_pearl8x8 = { |
1383 | + { 0, 0, FONTDATAMAX, 0 }, { |
1384 | /* 0 0x00 '^@' */ |
1385 | 0x00, /* 00000000 */ |
1386 | 0x00, /* 00000000 */ |
1387 | @@ -2574,14 +2574,13 @@ static const unsigned char fontdata_pearl8x8[FONTDATAMAX] = { |
1388 | 0x00, /* 00000000 */ |
1389 | 0x00, /* 00000000 */ |
1390 | 0x00, /* 00000000 */ |
1391 | - |
1392 | -}; |
1393 | +} }; |
1394 | |
1395 | const struct font_desc font_pearl_8x8 = { |
1396 | .idx = PEARL8x8_IDX, |
1397 | .name = "PEARL8x8", |
1398 | .width = 8, |
1399 | .height = 8, |
1400 | - .data = fontdata_pearl8x8, |
1401 | + .data = fontdata_pearl8x8.data, |
1402 | .pref = 2, |
1403 | }; |
1404 | diff --git a/lib/fonts/font_sun12x22.c b/lib/fonts/font_sun12x22.c |
1405 | index d3643853c33af..c6967cdf4207b 100644 |
1406 | --- a/lib/fonts/font_sun12x22.c |
1407 | +++ b/lib/fonts/font_sun12x22.c |
1408 | @@ -2,8 +2,8 @@ |
1409 | |
1410 | #define FONTDATAMAX 11264 |
1411 | |
1412 | -static const unsigned char fontdata_sun12x22[FONTDATAMAX] = { |
1413 | - |
1414 | +static struct font_data fontdata_sun12x22 = { |
1415 | + { 0, 0, FONTDATAMAX, 0 }, { |
1416 | /* 0 0x00 '^@' */ |
1417 | 0x00, 0x00, /* 000000000000 */ |
1418 | 0x00, 0x00, /* 000000000000 */ |
1419 | @@ -6147,8 +6147,7 @@ static const unsigned char fontdata_sun12x22[FONTDATAMAX] = { |
1420 | 0x00, 0x00, /* 000000000000 */ |
1421 | 0x00, 0x00, /* 000000000000 */ |
1422 | 0x00, 0x00, /* 000000000000 */ |
1423 | - |
1424 | -}; |
1425 | +} }; |
1426 | |
1427 | |
1428 | const struct font_desc font_sun_12x22 = { |
1429 | @@ -6156,7 +6155,7 @@ const struct font_desc font_sun_12x22 = { |
1430 | .name = "SUN12x22", |
1431 | .width = 12, |
1432 | .height = 22, |
1433 | - .data = fontdata_sun12x22, |
1434 | + .data = fontdata_sun12x22.data, |
1435 | #ifdef __sparc__ |
1436 | .pref = 5, |
1437 | #else |
1438 | diff --git a/lib/fonts/font_sun8x16.c b/lib/fonts/font_sun8x16.c |
1439 | index 268151325b83e..7d979e5788999 100644 |
1440 | --- a/lib/fonts/font_sun8x16.c |
1441 | +++ b/lib/fonts/font_sun8x16.c |
1442 | @@ -2,7 +2,8 @@ |
1443 | |
1444 | #define FONTDATAMAX 4096 |
1445 | |
1446 | -static const unsigned char fontdata_sun8x16[FONTDATAMAX] = { |
1447 | +static struct font_data fontdata_sun8x16 = { |
1448 | +{ 0, 0, FONTDATAMAX, 0 }, { |
1449 | /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
1450 | /* */ 0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00, |
1451 | /* */ 0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00, |
1452 | @@ -259,14 +260,14 @@ static const unsigned char fontdata_sun8x16[FONTDATAMAX] = { |
1453 | /* */ 0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
1454 | /* */ 0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00, |
1455 | /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, |
1456 | -}; |
1457 | +} }; |
1458 | |
1459 | const struct font_desc font_sun_8x16 = { |
1460 | .idx = SUN8x16_IDX, |
1461 | .name = "SUN8x16", |
1462 | .width = 8, |
1463 | .height = 16, |
1464 | - .data = fontdata_sun8x16, |
1465 | + .data = fontdata_sun8x16.data, |
1466 | #ifdef __sparc__ |
1467 | .pref = 10, |
1468 | #else |
1469 | diff --git a/lib/random32.c b/lib/random32.c |
1470 | index 889dab44bd747..d5c3137d93f49 100644 |
1471 | --- a/lib/random32.c |
1472 | +++ b/lib/random32.c |
1473 | @@ -47,7 +47,7 @@ static inline void prandom_state_selftest(void) |
1474 | } |
1475 | #endif |
1476 | |
1477 | -DEFINE_PER_CPU(struct rnd_state, net_rand_state); |
1478 | +DEFINE_PER_CPU(struct rnd_state, net_rand_state) __latent_entropy; |
1479 | |
1480 | /** |
1481 | * prandom_u32_state - seeded pseudo-random number generator. |
1482 | diff --git a/mm/khugepaged.c b/mm/khugepaged.c |
1483 | index 1538e5e5c628a..753b0e2fef368 100644 |
1484 | --- a/mm/khugepaged.c |
1485 | +++ b/mm/khugepaged.c |
1486 | @@ -50,6 +50,9 @@ enum scan_result { |
1487 | #define CREATE_TRACE_POINTS |
1488 | #include <trace/events/huge_memory.h> |
1489 | |
1490 | +static struct task_struct *khugepaged_thread __read_mostly; |
1491 | +static DEFINE_MUTEX(khugepaged_mutex); |
1492 | + |
1493 | /* default scan 8*512 pte (or vmas) every 30 second */ |
1494 | static unsigned int khugepaged_pages_to_scan __read_mostly; |
1495 | static unsigned int khugepaged_pages_collapsed; |
1496 | @@ -802,6 +805,18 @@ static struct page *khugepaged_alloc_hugepage(bool *wait) |
1497 | |
1498 | static bool khugepaged_prealloc_page(struct page **hpage, bool *wait) |
1499 | { |
1500 | + /* |
1501 | + * If the hpage allocated earlier was briefly exposed in page cache |
1502 | + * before collapse_file() failed, it is possible that racing lookups |
1503 | + * have not yet completed, and would then be unpleasantly surprised by |
1504 | + * finding the hpage reused for the same mapping at a different offset. |
1505 | + * Just release the previous allocation if there is any danger of that. |
1506 | + */ |
1507 | + if (*hpage && page_count(*hpage) > 1) { |
1508 | + put_page(*hpage); |
1509 | + *hpage = NULL; |
1510 | + } |
1511 | + |
1512 | if (!*hpage) |
1513 | *hpage = khugepaged_alloc_hugepage(wait); |
1514 | |
1515 | @@ -1936,8 +1951,6 @@ static void set_recommended_min_free_kbytes(void) |
1516 | |
1517 | int start_stop_khugepaged(void) |
1518 | { |
1519 | - static struct task_struct *khugepaged_thread __read_mostly; |
1520 | - static DEFINE_MUTEX(khugepaged_mutex); |
1521 | int err = 0; |
1522 | |
1523 | mutex_lock(&khugepaged_mutex); |
1524 | @@ -1964,3 +1977,11 @@ fail: |
1525 | mutex_unlock(&khugepaged_mutex); |
1526 | return err; |
1527 | } |
1528 | + |
1529 | +void khugepaged_min_free_kbytes_update(void) |
1530 | +{ |
1531 | + mutex_lock(&khugepaged_mutex); |
1532 | + if (khugepaged_enabled() && khugepaged_thread) |
1533 | + set_recommended_min_free_kbytes(); |
1534 | + mutex_unlock(&khugepaged_mutex); |
1535 | +} |
1536 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
1537 | index 458523bc73916..b0c451e3b59f3 100644 |
1538 | --- a/mm/page_alloc.c |
1539 | +++ b/mm/page_alloc.c |
1540 | @@ -64,6 +64,7 @@ |
1541 | #include <linux/page_owner.h> |
1542 | #include <linux/kthread.h> |
1543 | #include <linux/memcontrol.h> |
1544 | +#include <linux/khugepaged.h> |
1545 | |
1546 | #include <asm/sections.h> |
1547 | #include <asm/tlbflush.h> |
1548 | @@ -6785,6 +6786,8 @@ int __meminit init_per_zone_wmark_min(void) |
1549 | setup_min_slab_ratio(); |
1550 | #endif |
1551 | |
1552 | + khugepaged_min_free_kbytes_update(); |
1553 | + |
1554 | return 0; |
1555 | } |
1556 | postcore_initcall(init_per_zone_wmark_min) |
1557 | diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c |
1558 | index 43e45bb660bcd..b1d3fa708e16b 100644 |
1559 | --- a/net/mac80211/vht.c |
1560 | +++ b/net/mac80211/vht.c |
1561 | @@ -170,10 +170,7 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata, |
1562 | /* take some capabilities as-is */ |
1563 | cap_info = le32_to_cpu(vht_cap_ie->vht_cap_info); |
1564 | vht_cap->cap = cap_info; |
1565 | - vht_cap->cap &= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 | |
1566 | - IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 | |
1567 | - IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 | |
1568 | - IEEE80211_VHT_CAP_RXLDPC | |
1569 | + vht_cap->cap &= IEEE80211_VHT_CAP_RXLDPC | |
1570 | IEEE80211_VHT_CAP_VHT_TXOP_PS | |
1571 | IEEE80211_VHT_CAP_HTC_VHT | |
1572 | IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK | |
1573 | @@ -182,6 +179,9 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata, |
1574 | IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN | |
1575 | IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN; |
1576 | |
1577 | + vht_cap->cap |= min_t(u32, cap_info & IEEE80211_VHT_CAP_MAX_MPDU_MASK, |
1578 | + own_cap.cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK); |
1579 | + |
1580 | /* and some based on our own capabilities */ |
1581 | switch (own_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { |
1582 | case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ: |
1583 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
1584 | index 5e28702c801fd..a25be03f60f59 100644 |
1585 | --- a/net/netfilter/nf_conntrack_netlink.c |
1586 | +++ b/net/netfilter/nf_conntrack_netlink.c |
1587 | @@ -1031,6 +1031,8 @@ ctnetlink_parse_tuple(const struct nlattr * const cda[], |
1588 | if (!tb[CTA_TUPLE_IP]) |
1589 | return -EINVAL; |
1590 | |
1591 | + if (l3num != NFPROTO_IPV4 && l3num != NFPROTO_IPV6) |
1592 | + return -EOPNOTSUPP; |
1593 | tuple->src.l3num = l3num; |
1594 | |
1595 | err = ctnetlink_parse_tuple_ip(tb[CTA_TUPLE_IP], tuple); |
1596 | diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c |
1597 | index beb2897d8ddf5..cff76ffcaac28 100644 |
1598 | --- a/net/openvswitch/conntrack.c |
1599 | +++ b/net/openvswitch/conntrack.c |
1600 | @@ -709,15 +709,19 @@ static int ovs_ct_nat(struct net *net, struct sw_flow_key *key, |
1601 | } |
1602 | err = ovs_ct_nat_execute(skb, ct, ctinfo, &info->range, maniptype); |
1603 | |
1604 | - if (err == NF_ACCEPT && |
1605 | - ct->status & IPS_SRC_NAT && ct->status & IPS_DST_NAT) { |
1606 | - if (maniptype == NF_NAT_MANIP_SRC) |
1607 | - maniptype = NF_NAT_MANIP_DST; |
1608 | - else |
1609 | - maniptype = NF_NAT_MANIP_SRC; |
1610 | - |
1611 | - err = ovs_ct_nat_execute(skb, ct, ctinfo, &info->range, |
1612 | - maniptype); |
1613 | + if (err == NF_ACCEPT && ct->status & IPS_DST_NAT) { |
1614 | + if (ct->status & IPS_SRC_NAT) { |
1615 | + if (maniptype == NF_NAT_MANIP_SRC) |
1616 | + maniptype = NF_NAT_MANIP_DST; |
1617 | + else |
1618 | + maniptype = NF_NAT_MANIP_SRC; |
1619 | + |
1620 | + err = ovs_ct_nat_execute(skb, ct, ctinfo, &info->range, |
1621 | + maniptype); |
1622 | + } else if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL) { |
1623 | + err = ovs_ct_nat_execute(skb, ct, ctinfo, NULL, |
1624 | + NF_NAT_MANIP_SRC); |
1625 | + } |
1626 | } |
1627 | |
1628 | /* Mark NAT done if successful and update the flow key. */ |
1629 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
1630 | index fb643945e4244..b5b79f5015415 100644 |
1631 | --- a/net/packet/af_packet.c |
1632 | +++ b/net/packet/af_packet.c |
1633 | @@ -2161,7 +2161,8 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, |
1634 | int skb_len = skb->len; |
1635 | unsigned int snaplen, res; |
1636 | unsigned long status = TP_STATUS_USER; |
1637 | - unsigned short macoff, netoff, hdrlen; |
1638 | + unsigned short macoff, hdrlen; |
1639 | + unsigned int netoff; |
1640 | struct sk_buff *copy_skb = NULL; |
1641 | struct timespec ts; |
1642 | __u32 ts_status; |
1643 | @@ -2223,6 +2224,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, |
1644 | } |
1645 | macoff = netoff - maclen; |
1646 | } |
1647 | + if (netoff > USHRT_MAX) { |
1648 | + spin_lock(&sk->sk_receive_queue.lock); |
1649 | + po->stats.stats1.tp_drops++; |
1650 | + spin_unlock(&sk->sk_receive_queue.lock); |
1651 | + goto drop_n_restore; |
1652 | + } |
1653 | if (po->tp_version <= TPACKET_V2) { |
1654 | if (macoff + snaplen > po->rx_ring.frame_size) { |
1655 | if (po->copy_thresh && |
1656 | diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c |
1657 | index b099b64366f35..ec02dd7c12ef4 100644 |
1658 | --- a/net/rxrpc/conn_event.c |
1659 | +++ b/net/rxrpc/conn_event.c |
1660 | @@ -309,18 +309,18 @@ static int rxrpc_process_event(struct rxrpc_connection *conn, |
1661 | return ret; |
1662 | |
1663 | spin_lock(&conn->channel_lock); |
1664 | - spin_lock(&conn->state_lock); |
1665 | + spin_lock_bh(&conn->state_lock); |
1666 | |
1667 | if (conn->state == RXRPC_CONN_SERVICE_CHALLENGING) { |
1668 | conn->state = RXRPC_CONN_SERVICE; |
1669 | - spin_unlock(&conn->state_lock); |
1670 | + spin_unlock_bh(&conn->state_lock); |
1671 | for (loop = 0; loop < RXRPC_MAXCALLS; loop++) |
1672 | rxrpc_call_is_secure( |
1673 | rcu_dereference_protected( |
1674 | conn->channels[loop].call, |
1675 | lockdep_is_held(&conn->channel_lock))); |
1676 | } else { |
1677 | - spin_unlock(&conn->state_lock); |
1678 | + spin_unlock_bh(&conn->state_lock); |
1679 | } |
1680 | |
1681 | spin_unlock(&conn->channel_lock); |
1682 | diff --git a/net/rxrpc/key.c b/net/rxrpc/key.c |
1683 | index 7fc340726d034..fa475b02bdceb 100644 |
1684 | --- a/net/rxrpc/key.c |
1685 | +++ b/net/rxrpc/key.c |
1686 | @@ -899,7 +899,7 @@ int rxrpc_request_key(struct rxrpc_sock *rx, char __user *optval, int optlen) |
1687 | |
1688 | _enter(""); |
1689 | |
1690 | - if (optlen <= 0 || optlen > PAGE_SIZE - 1) |
1691 | + if (optlen <= 0 || optlen > PAGE_SIZE - 1 || rx->securities) |
1692 | return -EINVAL; |
1693 | |
1694 | description = memdup_user_nul(optval, optlen); |
1695 | @@ -1104,7 +1104,8 @@ static long rxrpc_read(const struct key *key, |
1696 | break; |
1697 | |
1698 | default: /* we have a ticket we can't encode */ |
1699 | - BUG(); |
1700 | + pr_err("Unsupported key token type (%u)\n", |
1701 | + token->security_index); |
1702 | continue; |
1703 | } |
1704 | |
1705 | @@ -1139,6 +1140,14 @@ static long rxrpc_read(const struct key *key, |
1706 | goto fault; \ |
1707 | xdr += (_l + 3) >> 2; \ |
1708 | } while(0) |
1709 | +#define ENCODE_BYTES(l, s) \ |
1710 | + do { \ |
1711 | + u32 _l = (l); \ |
1712 | + memcpy(xdr, (s), _l); \ |
1713 | + if (_l & 3) \ |
1714 | + memcpy((u8 *)xdr + _l, &zero, 4 - (_l & 3)); \ |
1715 | + xdr += (_l + 3) >> 2; \ |
1716 | + } while(0) |
1717 | #define ENCODE64(x) \ |
1718 | do { \ |
1719 | __be64 y = cpu_to_be64(x); \ |
1720 | @@ -1167,7 +1176,7 @@ static long rxrpc_read(const struct key *key, |
1721 | case RXRPC_SECURITY_RXKAD: |
1722 | ENCODE(token->kad->vice_id); |
1723 | ENCODE(token->kad->kvno); |
1724 | - ENCODE_DATA(8, token->kad->session_key); |
1725 | + ENCODE_BYTES(8, token->kad->session_key); |
1726 | ENCODE(token->kad->start); |
1727 | ENCODE(token->kad->expiry); |
1728 | ENCODE(token->kad->primary_flag); |
1729 | @@ -1217,7 +1226,6 @@ static long rxrpc_read(const struct key *key, |
1730 | break; |
1731 | |
1732 | default: |
1733 | - BUG(); |
1734 | break; |
1735 | } |
1736 | |
1737 | diff --git a/net/sctp/auth.c b/net/sctp/auth.c |
1738 | index f99d4855d3de3..6ab11ee3d3a56 100644 |
1739 | --- a/net/sctp/auth.c |
1740 | +++ b/net/sctp/auth.c |
1741 | @@ -494,6 +494,7 @@ int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp) |
1742 | out_err: |
1743 | /* Clean up any successful allocations */ |
1744 | sctp_auth_destroy_hmacs(ep->auth_hmacs); |
1745 | + ep->auth_hmacs = NULL; |
1746 | return -ENOMEM; |
1747 | } |
1748 | |
1749 | diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c |
1750 | index 0bd5a60f3bdeb..67aba63b5c96d 100644 |
1751 | --- a/net/vmw_vsock/virtio_transport.c |
1752 | +++ b/net/vmw_vsock/virtio_transport.c |
1753 | @@ -39,6 +39,7 @@ struct virtio_vsock { |
1754 | * must be accessed with tx_lock held. |
1755 | */ |
1756 | struct mutex tx_lock; |
1757 | + bool tx_run; |
1758 | |
1759 | struct work_struct send_pkt_work; |
1760 | spinlock_t send_pkt_list_lock; |
1761 | @@ -50,6 +51,7 @@ struct virtio_vsock { |
1762 | * must be accessed with rx_lock held. |
1763 | */ |
1764 | struct mutex rx_lock; |
1765 | + bool rx_run; |
1766 | int rx_buf_nr; |
1767 | int rx_buf_max_nr; |
1768 | |
1769 | @@ -57,24 +59,28 @@ struct virtio_vsock { |
1770 | * vqs[VSOCK_VQ_EVENT] must be accessed with event_lock held. |
1771 | */ |
1772 | struct mutex event_lock; |
1773 | + bool event_run; |
1774 | struct virtio_vsock_event event_list[8]; |
1775 | |
1776 | u32 guest_cid; |
1777 | }; |
1778 | |
1779 | -static struct virtio_vsock *virtio_vsock_get(void) |
1780 | -{ |
1781 | - return the_virtio_vsock; |
1782 | -} |
1783 | - |
1784 | static u32 virtio_transport_get_local_cid(void) |
1785 | { |
1786 | - struct virtio_vsock *vsock = virtio_vsock_get(); |
1787 | + struct virtio_vsock *vsock; |
1788 | + u32 ret; |
1789 | |
1790 | - if (!vsock) |
1791 | - return VMADDR_CID_ANY; |
1792 | + rcu_read_lock(); |
1793 | + vsock = rcu_dereference(the_virtio_vsock); |
1794 | + if (!vsock) { |
1795 | + ret = VMADDR_CID_ANY; |
1796 | + goto out_rcu; |
1797 | + } |
1798 | |
1799 | - return vsock->guest_cid; |
1800 | + ret = vsock->guest_cid; |
1801 | +out_rcu: |
1802 | + rcu_read_unlock(); |
1803 | + return ret; |
1804 | } |
1805 | |
1806 | static void |
1807 | @@ -88,6 +94,9 @@ virtio_transport_send_pkt_work(struct work_struct *work) |
1808 | |
1809 | mutex_lock(&vsock->tx_lock); |
1810 | |
1811 | + if (!vsock->tx_run) |
1812 | + goto out; |
1813 | + |
1814 | vq = vsock->vqs[VSOCK_VQ_TX]; |
1815 | |
1816 | for (;;) { |
1817 | @@ -144,6 +153,7 @@ virtio_transport_send_pkt_work(struct work_struct *work) |
1818 | if (added) |
1819 | virtqueue_kick(vq); |
1820 | |
1821 | +out: |
1822 | mutex_unlock(&vsock->tx_lock); |
1823 | |
1824 | if (restart_rx) |
1825 | @@ -156,10 +166,12 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt) |
1826 | struct virtio_vsock *vsock; |
1827 | int len = pkt->len; |
1828 | |
1829 | - vsock = virtio_vsock_get(); |
1830 | + rcu_read_lock(); |
1831 | + vsock = rcu_dereference(the_virtio_vsock); |
1832 | if (!vsock) { |
1833 | virtio_transport_free_pkt(pkt); |
1834 | - return -ENODEV; |
1835 | + len = -ENODEV; |
1836 | + goto out_rcu; |
1837 | } |
1838 | |
1839 | if (pkt->reply) |
1840 | @@ -170,6 +182,9 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt) |
1841 | spin_unlock_bh(&vsock->send_pkt_list_lock); |
1842 | |
1843 | queue_work(virtio_vsock_workqueue, &vsock->send_pkt_work); |
1844 | + |
1845 | +out_rcu: |
1846 | + rcu_read_unlock(); |
1847 | return len; |
1848 | } |
1849 | |
1850 | @@ -222,6 +237,10 @@ static void virtio_transport_tx_work(struct work_struct *work) |
1851 | |
1852 | vq = vsock->vqs[VSOCK_VQ_TX]; |
1853 | mutex_lock(&vsock->tx_lock); |
1854 | + |
1855 | + if (!vsock->tx_run) |
1856 | + goto out; |
1857 | + |
1858 | do { |
1859 | struct virtio_vsock_pkt *pkt; |
1860 | unsigned int len; |
1861 | @@ -232,6 +251,8 @@ static void virtio_transport_tx_work(struct work_struct *work) |
1862 | added = true; |
1863 | } |
1864 | } while (!virtqueue_enable_cb(vq)); |
1865 | + |
1866 | +out: |
1867 | mutex_unlock(&vsock->tx_lock); |
1868 | |
1869 | if (added) |
1870 | @@ -260,6 +281,9 @@ static void virtio_transport_rx_work(struct work_struct *work) |
1871 | |
1872 | mutex_lock(&vsock->rx_lock); |
1873 | |
1874 | + if (!vsock->rx_run) |
1875 | + goto out; |
1876 | + |
1877 | do { |
1878 | virtqueue_disable_cb(vq); |
1879 | for (;;) { |
1880 | @@ -368,6 +392,9 @@ static void virtio_transport_event_work(struct work_struct *work) |
1881 | |
1882 | mutex_lock(&vsock->event_lock); |
1883 | |
1884 | + if (!vsock->event_run) |
1885 | + goto out; |
1886 | + |
1887 | do { |
1888 | struct virtio_vsock_event *event; |
1889 | unsigned int len; |
1890 | @@ -382,7 +409,7 @@ static void virtio_transport_event_work(struct work_struct *work) |
1891 | } while (!virtqueue_enable_cb(vq)); |
1892 | |
1893 | virtqueue_kick(vsock->vqs[VSOCK_VQ_EVENT]); |
1894 | - |
1895 | +out: |
1896 | mutex_unlock(&vsock->event_lock); |
1897 | } |
1898 | |
1899 | @@ -478,7 +505,8 @@ static int virtio_vsock_probe(struct virtio_device *vdev) |
1900 | return ret; |
1901 | |
1902 | /* Only one virtio-vsock device per guest is supported */ |
1903 | - if (the_virtio_vsock) { |
1904 | + if (rcu_dereference_protected(the_virtio_vsock, |
1905 | + lockdep_is_held(&the_virtio_vsock_mutex))) { |
1906 | ret = -EBUSY; |
1907 | goto out; |
1908 | } |
1909 | @@ -502,8 +530,6 @@ static int virtio_vsock_probe(struct virtio_device *vdev) |
1910 | vsock->rx_buf_max_nr = 0; |
1911 | atomic_set(&vsock->queued_replies, 0); |
1912 | |
1913 | - vdev->priv = vsock; |
1914 | - the_virtio_vsock = vsock; |
1915 | mutex_init(&vsock->tx_lock); |
1916 | mutex_init(&vsock->rx_lock); |
1917 | mutex_init(&vsock->event_lock); |
1918 | @@ -514,14 +540,23 @@ static int virtio_vsock_probe(struct virtio_device *vdev) |
1919 | INIT_WORK(&vsock->event_work, virtio_transport_event_work); |
1920 | INIT_WORK(&vsock->send_pkt_work, virtio_transport_send_pkt_work); |
1921 | |
1922 | + mutex_lock(&vsock->tx_lock); |
1923 | + vsock->tx_run = true; |
1924 | + mutex_unlock(&vsock->tx_lock); |
1925 | + |
1926 | mutex_lock(&vsock->rx_lock); |
1927 | virtio_vsock_rx_fill(vsock); |
1928 | + vsock->rx_run = true; |
1929 | mutex_unlock(&vsock->rx_lock); |
1930 | |
1931 | mutex_lock(&vsock->event_lock); |
1932 | virtio_vsock_event_fill(vsock); |
1933 | + vsock->event_run = true; |
1934 | mutex_unlock(&vsock->event_lock); |
1935 | |
1936 | + vdev->priv = vsock; |
1937 | + rcu_assign_pointer(the_virtio_vsock, vsock); |
1938 | + |
1939 | mutex_unlock(&the_virtio_vsock_mutex); |
1940 | return 0; |
1941 | |
1942 | @@ -536,6 +571,12 @@ static void virtio_vsock_remove(struct virtio_device *vdev) |
1943 | struct virtio_vsock *vsock = vdev->priv; |
1944 | struct virtio_vsock_pkt *pkt; |
1945 | |
1946 | + mutex_lock(&the_virtio_vsock_mutex); |
1947 | + |
1948 | + vdev->priv = NULL; |
1949 | + rcu_assign_pointer(the_virtio_vsock, NULL); |
1950 | + synchronize_rcu(); |
1951 | + |
1952 | flush_work(&vsock->rx_work); |
1953 | flush_work(&vsock->tx_work); |
1954 | flush_work(&vsock->event_work); |
1955 | @@ -544,6 +585,24 @@ static void virtio_vsock_remove(struct virtio_device *vdev) |
1956 | /* Reset all connected sockets when the device disappear */ |
1957 | vsock_for_each_connected_socket(virtio_vsock_reset_sock); |
1958 | |
1959 | + /* Stop all work handlers to make sure no one is accessing the device, |
1960 | + * so we can safely call vdev->config->reset(). |
1961 | + */ |
1962 | + mutex_lock(&vsock->rx_lock); |
1963 | + vsock->rx_run = false; |
1964 | + mutex_unlock(&vsock->rx_lock); |
1965 | + |
1966 | + mutex_lock(&vsock->tx_lock); |
1967 | + vsock->tx_run = false; |
1968 | + mutex_unlock(&vsock->tx_lock); |
1969 | + |
1970 | + mutex_lock(&vsock->event_lock); |
1971 | + vsock->event_run = false; |
1972 | + mutex_unlock(&vsock->event_lock); |
1973 | + |
1974 | + /* Flush all device writes and interrupts, device will not use any |
1975 | + * more buffers. |
1976 | + */ |
1977 | vdev->config->reset(vdev); |
1978 | |
1979 | mutex_lock(&vsock->rx_lock); |
1980 | @@ -565,12 +624,11 @@ static void virtio_vsock_remove(struct virtio_device *vdev) |
1981 | } |
1982 | spin_unlock_bh(&vsock->send_pkt_list_lock); |
1983 | |
1984 | - mutex_lock(&the_virtio_vsock_mutex); |
1985 | - the_virtio_vsock = NULL; |
1986 | - mutex_unlock(&the_virtio_vsock_mutex); |
1987 | - |
1988 | + /* Delete virtqueues and flush outstanding callbacks if any */ |
1989 | vdev->config->del_vqs(vdev); |
1990 | |
1991 | + mutex_unlock(&the_virtio_vsock_mutex); |
1992 | + |
1993 | kfree(vsock); |
1994 | } |
1995 | |
1996 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
1997 | index e107754e29a77..1eb77161d5e64 100644 |
1998 | --- a/net/wireless/nl80211.c |
1999 | +++ b/net/wireless/nl80211.c |
2000 | @@ -3283,6 +3283,9 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) |
2001 | if (err) |
2002 | return err; |
2003 | |
2004 | + if (key.idx < 0) |
2005 | + return -EINVAL; |
2006 | + |
2007 | if (info->attrs[NL80211_ATTR_MAC]) |
2008 | mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); |
2009 | |
2010 | diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c |
2011 | index 3734ad56b456c..0eb85765d35a1 100644 |
2012 | --- a/net/xfrm/xfrm_state.c |
2013 | +++ b/net/xfrm/xfrm_state.c |
2014 | @@ -761,7 +761,8 @@ static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x, |
2015 | */ |
2016 | if (x->km.state == XFRM_STATE_VALID) { |
2017 | if ((x->sel.family && |
2018 | - !xfrm_selector_match(&x->sel, fl, x->sel.family)) || |
2019 | + (x->sel.family != family || |
2020 | + !xfrm_selector_match(&x->sel, fl, family))) || |
2021 | !security_xfrm_state_pol_flow_match(x, pol, fl)) |
2022 | return; |
2023 | |
2024 | @@ -774,7 +775,9 @@ static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x, |
2025 | *acq_in_progress = 1; |
2026 | } else if (x->km.state == XFRM_STATE_ERROR || |
2027 | x->km.state == XFRM_STATE_EXPIRED) { |
2028 | - if (xfrm_selector_match(&x->sel, fl, x->sel.family) && |
2029 | + if ((!x->sel.family || |
2030 | + (x->sel.family == family && |
2031 | + xfrm_selector_match(&x->sel, fl, family))) && |
2032 | security_xfrm_state_pol_flow_match(x, pol, fl)) |
2033 | *error = -ESRCH; |
2034 | } |
2035 | @@ -813,7 +816,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, |
2036 | tmpl->mode == x->props.mode && |
2037 | tmpl->id.proto == x->id.proto && |
2038 | (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) |
2039 | - xfrm_state_look_at(pol, x, fl, encap_family, |
2040 | + xfrm_state_look_at(pol, x, fl, family, |
2041 | &best, &acquire_in_progress, &error); |
2042 | } |
2043 | if (best || acquire_in_progress) |
2044 | @@ -829,7 +832,7 @@ xfrm_state_find(const xfrm_address_t *daddr, const xfrm_address_t *saddr, |
2045 | tmpl->mode == x->props.mode && |
2046 | tmpl->id.proto == x->id.proto && |
2047 | (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) |
2048 | - xfrm_state_look_at(pol, x, fl, encap_family, |
2049 | + xfrm_state_look_at(pol, x, fl, family, |
2050 | &best, &acquire_in_progress, &error); |
2051 | } |
2052 | |
2053 | @@ -1244,7 +1247,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig) |
2054 | x->tfcpad = orig->tfcpad; |
2055 | x->replay_maxdiff = orig->replay_maxdiff; |
2056 | x->replay_maxage = orig->replay_maxage; |
2057 | - x->curlft.add_time = orig->curlft.add_time; |
2058 | + memcpy(&x->curlft, &orig->curlft, sizeof(x->curlft)); |
2059 | x->km.state = orig->km.state; |
2060 | x->km.seq = orig->km.seq; |
2061 | x->replay = orig->replay; |
2062 | diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c |
2063 | index cd2900ac473fc..280448114add1 100644 |
2064 | --- a/tools/perf/builtin-top.c |
2065 | +++ b/tools/perf/builtin-top.c |
2066 | @@ -633,7 +633,9 @@ repeat: |
2067 | delay_msecs = top->delay_secs * MSEC_PER_SEC; |
2068 | set_term_quiet_input(&save); |
2069 | /* trash return*/ |
2070 | - getc(stdin); |
2071 | + clearerr(stdin); |
2072 | + if (poll(&stdin_poll, 1, 0) > 0) |
2073 | + getc(stdin); |
2074 | |
2075 | while (!done) { |
2076 | perf_top__print_sym_table(top); |