1 |
commit: 1851ea6d5b5babc7df0ca2f6b9c680a38f3154d7 |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue Oct 29 10:08:07 2019 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Tue Oct 29 10:08:07 2019 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=1851ea6d |
7 |
|
8 |
Linux patch 4.4.198 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1197_linux-4.4.198.patch | 1004 ++++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 1008 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index e5ffd05..9bdacaa 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -831,6 +831,10 @@ Patch: 1196_linux-4.4.197.patch |
21 |
From: http://www.kernel.org |
22 |
Desc: Linux 4.4.197 |
23 |
|
24 |
+Patch: 1197_linux-4.4.198.patch |
25 |
+From: http://www.kernel.org |
26 |
+Desc: Linux 4.4.198 |
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/1197_linux-4.4.198.patch b/1197_linux-4.4.198.patch |
33 |
new file mode 100644 |
34 |
index 0000000..14f4fd1 |
35 |
--- /dev/null |
36 |
+++ b/1197_linux-4.4.198.patch |
37 |
@@ -0,0 +1,1004 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index 5c150d32cae7..3de38e5e93d1 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,6 +1,6 @@ |
43 |
+ VERSION = 4 |
44 |
+ PATCHLEVEL = 4 |
45 |
+-SUBLEVEL = 197 |
46 |
++SUBLEVEL = 198 |
47 |
+ EXTRAVERSION = |
48 |
+ NAME = Blurry Fish Butt |
49 |
+ |
50 |
+diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi |
51 |
+index 3ef1d5a26389..3bb5254a227a 100644 |
52 |
+--- a/arch/arm/boot/dts/am4372.dtsi |
53 |
++++ b/arch/arm/boot/dts/am4372.dtsi |
54 |
+@@ -1002,6 +1002,8 @@ |
55 |
+ ti,hwmods = "dss_dispc"; |
56 |
+ clocks = <&disp_clk>; |
57 |
+ clock-names = "fck"; |
58 |
++ |
59 |
++ max-memory-bandwidth = <230000000>; |
60 |
+ }; |
61 |
+ |
62 |
+ rfbi: rfbi@4832a800 { |
63 |
+diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c |
64 |
+index b31ad596be79..6b09debcf484 100644 |
65 |
+--- a/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c |
66 |
++++ b/arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c |
67 |
+@@ -1020,7 +1020,8 @@ static struct omap_hwmod_class_sysconfig am33xx_timer_sysc = { |
68 |
+ .rev_offs = 0x0000, |
69 |
+ .sysc_offs = 0x0010, |
70 |
+ .syss_offs = 0x0014, |
71 |
+- .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET), |
72 |
++ .sysc_flags = SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET | |
73 |
++ SYSC_HAS_RESET_STATUS, |
74 |
+ .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | |
75 |
+ SIDLE_SMART_WKUP), |
76 |
+ .sysc_fields = &omap_hwmod_sysc_type2, |
77 |
+diff --git a/arch/mips/loongson64/common/serial.c b/arch/mips/loongson64/common/serial.c |
78 |
+index ffefc1cb2612..98c3a7feb10f 100644 |
79 |
+--- a/arch/mips/loongson64/common/serial.c |
80 |
++++ b/arch/mips/loongson64/common/serial.c |
81 |
+@@ -110,7 +110,7 @@ static int __init serial_init(void) |
82 |
+ } |
83 |
+ module_init(serial_init); |
84 |
+ |
85 |
+-static void __init serial_exit(void) |
86 |
++static void __exit serial_exit(void) |
87 |
+ { |
88 |
+ platform_device_unregister(&uart8250_device); |
89 |
+ } |
90 |
+diff --git a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c |
91 |
+index 838d0259cd27..3741f91fc186 100644 |
92 |
+--- a/arch/parisc/mm/ioremap.c |
93 |
++++ b/arch/parisc/mm/ioremap.c |
94 |
+@@ -2,7 +2,7 @@ |
95 |
+ * arch/parisc/mm/ioremap.c |
96 |
+ * |
97 |
+ * (C) Copyright 1995 1996 Linus Torvalds |
98 |
+- * (C) Copyright 2001-2006 Helge Deller <deller@×××.de> |
99 |
++ * (C) Copyright 2001-2019 Helge Deller <deller@×××.de> |
100 |
+ * (C) Copyright 2005 Kyle McMartin <kyle@××××××××××××.org> |
101 |
+ */ |
102 |
+ |
103 |
+@@ -83,7 +83,7 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l |
104 |
+ addr = (void __iomem *) area->addr; |
105 |
+ if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size, |
106 |
+ phys_addr, pgprot)) { |
107 |
+- vfree(addr); |
108 |
++ vunmap(addr); |
109 |
+ return NULL; |
110 |
+ } |
111 |
+ |
112 |
+@@ -91,9 +91,11 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l |
113 |
+ } |
114 |
+ EXPORT_SYMBOL(__ioremap); |
115 |
+ |
116 |
+-void iounmap(const volatile void __iomem *addr) |
117 |
++void iounmap(const volatile void __iomem *io_addr) |
118 |
+ { |
119 |
+- if (addr > high_memory) |
120 |
+- return vfree((void *) (PAGE_MASK & (unsigned long __force) addr)); |
121 |
++ unsigned long addr = (unsigned long)io_addr & PAGE_MASK; |
122 |
++ |
123 |
++ if (is_vmalloc_addr((void *)addr)) |
124 |
++ vunmap((void *)addr); |
125 |
+ } |
126 |
+ EXPORT_SYMBOL(iounmap); |
127 |
+diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c |
128 |
+index 4d2872fd9bb5..e2dd9109df63 100644 |
129 |
+--- a/arch/xtensa/kernel/xtensa_ksyms.c |
130 |
++++ b/arch/xtensa/kernel/xtensa_ksyms.c |
131 |
+@@ -116,13 +116,6 @@ EXPORT_SYMBOL(__invalidate_icache_range); |
132 |
+ // FIXME EXPORT_SYMBOL(screen_info); |
133 |
+ #endif |
134 |
+ |
135 |
+-EXPORT_SYMBOL(outsb); |
136 |
+-EXPORT_SYMBOL(outsw); |
137 |
+-EXPORT_SYMBOL(outsl); |
138 |
+-EXPORT_SYMBOL(insb); |
139 |
+-EXPORT_SYMBOL(insw); |
140 |
+-EXPORT_SYMBOL(insl); |
141 |
+- |
142 |
+ extern long common_exception_return; |
143 |
+ EXPORT_SYMBOL(common_exception_return); |
144 |
+ |
145 |
+diff --git a/drivers/base/core.c b/drivers/base/core.c |
146 |
+index af948fedd232..64b59552e744 100644 |
147 |
+--- a/drivers/base/core.c |
148 |
++++ b/drivers/base/core.c |
149 |
+@@ -10,6 +10,7 @@ |
150 |
+ * |
151 |
+ */ |
152 |
+ |
153 |
++#include <linux/cpufreq.h> |
154 |
+ #include <linux/device.h> |
155 |
+ #include <linux/err.h> |
156 |
+ #include <linux/fwnode.h> |
157 |
+@@ -2124,6 +2125,8 @@ void device_shutdown(void) |
158 |
+ { |
159 |
+ struct device *dev, *parent; |
160 |
+ |
161 |
++ cpufreq_suspend(); |
162 |
++ |
163 |
+ spin_lock(&devices_kset->list_lock); |
164 |
+ /* |
165 |
+ * Walk the devices list backward, shutting down each in turn. |
166 |
+diff --git a/drivers/block/loop.c b/drivers/block/loop.c |
167 |
+index da3902ac16c8..8aadd4d0c3a8 100644 |
168 |
+--- a/drivers/block/loop.c |
169 |
++++ b/drivers/block/loop.c |
170 |
+@@ -1557,6 +1557,7 @@ static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode, |
171 |
+ arg = (unsigned long) compat_ptr(arg); |
172 |
+ case LOOP_SET_FD: |
173 |
+ case LOOP_CHANGE_FD: |
174 |
++ case LOOP_SET_DIRECT_IO: |
175 |
+ err = lo_ioctl(bdev, mode, cmd, arg); |
176 |
+ break; |
177 |
+ default: |
178 |
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c |
179 |
+index 205df72ee873..0836d2939c7a 100644 |
180 |
+--- a/drivers/cpufreq/cpufreq.c |
181 |
++++ b/drivers/cpufreq/cpufreq.c |
182 |
+@@ -2512,14 +2512,6 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) |
183 |
+ } |
184 |
+ EXPORT_SYMBOL_GPL(cpufreq_unregister_driver); |
185 |
+ |
186 |
+-/* |
187 |
+- * Stop cpufreq at shutdown to make sure it isn't holding any locks |
188 |
+- * or mutexes when secondary CPUs are halted. |
189 |
+- */ |
190 |
+-static struct syscore_ops cpufreq_syscore_ops = { |
191 |
+- .shutdown = cpufreq_suspend, |
192 |
+-}; |
193 |
+- |
194 |
+ struct kobject *cpufreq_global_kobject; |
195 |
+ EXPORT_SYMBOL(cpufreq_global_kobject); |
196 |
+ |
197 |
+@@ -2531,8 +2523,6 @@ static int __init cpufreq_core_init(void) |
198 |
+ cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj); |
199 |
+ BUG_ON(!cpufreq_global_kobject); |
200 |
+ |
201 |
+- register_syscore_ops(&cpufreq_syscore_ops); |
202 |
+- |
203 |
+ return 0; |
204 |
+ } |
205 |
+ core_initcall(cpufreq_core_init); |
206 |
+diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c |
207 |
+index 724f7cf52253..b439e2f8ee00 100644 |
208 |
+--- a/drivers/gpu/drm/drm_edid.c |
209 |
++++ b/drivers/gpu/drm/drm_edid.c |
210 |
+@@ -150,6 +150,9 @@ static struct edid_quirk { |
211 |
+ /* Medion MD 30217 PG */ |
212 |
+ { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, |
213 |
+ |
214 |
++ /* Lenovo G50 */ |
215 |
++ { "SDC", 18514, EDID_QUIRK_FORCE_6BPC }, |
216 |
++ |
217 |
+ /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ |
218 |
+ { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC }, |
219 |
+ |
220 |
+diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c |
221 |
+index 8218d714fa01..4b682375f465 100644 |
222 |
+--- a/drivers/infiniband/hw/cxgb4/mem.c |
223 |
++++ b/drivers/infiniband/hw/cxgb4/mem.c |
224 |
+@@ -254,13 +254,17 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, |
225 |
+ u64 len, u8 page_size, u32 pbl_size, u32 pbl_addr) |
226 |
+ { |
227 |
+ int err; |
228 |
+- struct fw_ri_tpte tpt; |
229 |
++ struct fw_ri_tpte *tpt; |
230 |
+ u32 stag_idx; |
231 |
+ static atomic_t key; |
232 |
+ |
233 |
+ if (c4iw_fatal_error(rdev)) |
234 |
+ return -EIO; |
235 |
+ |
236 |
++ tpt = kmalloc(sizeof(*tpt), GFP_KERNEL); |
237 |
++ if (!tpt) |
238 |
++ return -ENOMEM; |
239 |
++ |
240 |
+ stag_state = stag_state > 0; |
241 |
+ stag_idx = (*stag) >> 8; |
242 |
+ |
243 |
+@@ -270,6 +274,7 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, |
244 |
+ mutex_lock(&rdev->stats.lock); |
245 |
+ rdev->stats.stag.fail++; |
246 |
+ mutex_unlock(&rdev->stats.lock); |
247 |
++ kfree(tpt); |
248 |
+ return -ENOMEM; |
249 |
+ } |
250 |
+ mutex_lock(&rdev->stats.lock); |
251 |
+@@ -284,28 +289,28 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, |
252 |
+ |
253 |
+ /* write TPT entry */ |
254 |
+ if (reset_tpt_entry) |
255 |
+- memset(&tpt, 0, sizeof(tpt)); |
256 |
++ memset(tpt, 0, sizeof(*tpt)); |
257 |
+ else { |
258 |
+- tpt.valid_to_pdid = cpu_to_be32(FW_RI_TPTE_VALID_F | |
259 |
++ tpt->valid_to_pdid = cpu_to_be32(FW_RI_TPTE_VALID_F | |
260 |
+ FW_RI_TPTE_STAGKEY_V((*stag & FW_RI_TPTE_STAGKEY_M)) | |
261 |
+ FW_RI_TPTE_STAGSTATE_V(stag_state) | |
262 |
+ FW_RI_TPTE_STAGTYPE_V(type) | FW_RI_TPTE_PDID_V(pdid)); |
263 |
+- tpt.locread_to_qpid = cpu_to_be32(FW_RI_TPTE_PERM_V(perm) | |
264 |
++ tpt->locread_to_qpid = cpu_to_be32(FW_RI_TPTE_PERM_V(perm) | |
265 |
+ (bind_enabled ? FW_RI_TPTE_MWBINDEN_F : 0) | |
266 |
+ FW_RI_TPTE_ADDRTYPE_V((zbva ? FW_RI_ZERO_BASED_TO : |
267 |
+ FW_RI_VA_BASED_TO))| |
268 |
+ FW_RI_TPTE_PS_V(page_size)); |
269 |
+- tpt.nosnoop_pbladdr = !pbl_size ? 0 : cpu_to_be32( |
270 |
++ tpt->nosnoop_pbladdr = !pbl_size ? 0 : cpu_to_be32( |
271 |
+ FW_RI_TPTE_PBLADDR_V(PBL_OFF(rdev, pbl_addr)>>3)); |
272 |
+- tpt.len_lo = cpu_to_be32((u32)(len & 0xffffffffUL)); |
273 |
+- tpt.va_hi = cpu_to_be32((u32)(to >> 32)); |
274 |
+- tpt.va_lo_fbo = cpu_to_be32((u32)(to & 0xffffffffUL)); |
275 |
+- tpt.dca_mwbcnt_pstag = cpu_to_be32(0); |
276 |
+- tpt.len_hi = cpu_to_be32((u32)(len >> 32)); |
277 |
++ tpt->len_lo = cpu_to_be32((u32)(len & 0xffffffffUL)); |
278 |
++ tpt->va_hi = cpu_to_be32((u32)(to >> 32)); |
279 |
++ tpt->va_lo_fbo = cpu_to_be32((u32)(to & 0xffffffffUL)); |
280 |
++ tpt->dca_mwbcnt_pstag = cpu_to_be32(0); |
281 |
++ tpt->len_hi = cpu_to_be32((u32)(len >> 32)); |
282 |
+ } |
283 |
+ err = write_adapter_mem(rdev, stag_idx + |
284 |
+ (rdev->lldi.vr->stag.start >> 5), |
285 |
+- sizeof(tpt), &tpt); |
286 |
++ sizeof(*tpt), tpt); |
287 |
+ |
288 |
+ if (reset_tpt_entry) { |
289 |
+ c4iw_put_resource(&rdev->resource.tpt_table, stag_idx); |
290 |
+@@ -313,6 +318,7 @@ static int write_tpt_entry(struct c4iw_rdev *rdev, u32 reset_tpt_entry, |
291 |
+ rdev->stats.stag.cur -= 32; |
292 |
+ mutex_unlock(&rdev->stats.lock); |
293 |
+ } |
294 |
++ kfree(tpt); |
295 |
+ return err; |
296 |
+ } |
297 |
+ |
298 |
+diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c |
299 |
+index 48db922075e2..08fa6400d255 100644 |
300 |
+--- a/drivers/memstick/host/jmb38x_ms.c |
301 |
++++ b/drivers/memstick/host/jmb38x_ms.c |
302 |
+@@ -947,7 +947,7 @@ static int jmb38x_ms_probe(struct pci_dev *pdev, |
303 |
+ if (!cnt) { |
304 |
+ rc = -ENODEV; |
305 |
+ pci_dev_busy = 1; |
306 |
+- goto err_out; |
307 |
++ goto err_out_int; |
308 |
+ } |
309 |
+ |
310 |
+ jm = kzalloc(sizeof(struct jmb38x_ms) |
311 |
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
312 |
+index ce20bc939b38..e651845c6605 100644 |
313 |
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
314 |
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
315 |
+@@ -362,6 +362,7 @@ struct bcmgenet_mib_counters { |
316 |
+ #define EXT_ENERGY_DET_MASK (1 << 12) |
317 |
+ |
318 |
+ #define EXT_RGMII_OOB_CTRL 0x0C |
319 |
++#define RGMII_MODE_EN_V123 (1 << 0) |
320 |
+ #define RGMII_LINK (1 << 4) |
321 |
+ #define OOB_DISABLE (1 << 5) |
322 |
+ #define RGMII_MODE_EN (1 << 6) |
323 |
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c |
324 |
+index 0565efad6e6e..3ad016f500b5 100644 |
325 |
+--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c |
326 |
++++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c |
327 |
+@@ -328,7 +328,11 @@ int bcmgenet_mii_config(struct net_device *dev) |
328 |
+ */ |
329 |
+ if (priv->ext_phy) { |
330 |
+ reg = bcmgenet_ext_readl(priv, EXT_RGMII_OOB_CTRL); |
331 |
+- reg |= RGMII_MODE_EN | id_mode_dis; |
332 |
++ reg |= id_mode_dis; |
333 |
++ if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv)) |
334 |
++ reg |= RGMII_MODE_EN_V123; |
335 |
++ else |
336 |
++ reg |= RGMII_MODE_EN; |
337 |
+ bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL); |
338 |
+ } |
339 |
+ |
340 |
+@@ -342,11 +346,12 @@ int bcmgenet_mii_probe(struct net_device *dev) |
341 |
+ struct bcmgenet_priv *priv = netdev_priv(dev); |
342 |
+ struct device_node *dn = priv->pdev->dev.of_node; |
343 |
+ struct phy_device *phydev; |
344 |
+- u32 phy_flags; |
345 |
++ u32 phy_flags = 0; |
346 |
+ int ret; |
347 |
+ |
348 |
+ /* Communicate the integrated PHY revision */ |
349 |
+- phy_flags = priv->gphy_rev; |
350 |
++ if (priv->internal_phy) |
351 |
++ phy_flags = priv->gphy_rev; |
352 |
+ |
353 |
+ /* Initialize link state variables that bcmgenet_mii_setup() uses */ |
354 |
+ priv->old_link = -1; |
355 |
+diff --git a/drivers/net/ethernet/hisilicon/hns_mdio.c b/drivers/net/ethernet/hisilicon/hns_mdio.c |
356 |
+index 6ff13c559e52..09fcc821b7da 100644 |
357 |
+--- a/drivers/net/ethernet/hisilicon/hns_mdio.c |
358 |
++++ b/drivers/net/ethernet/hisilicon/hns_mdio.c |
359 |
+@@ -156,11 +156,15 @@ static int mdio_sc_cfg_reg_write(struct hns_mdio_device *mdio_dev, |
360 |
+ { |
361 |
+ u32 time_cnt; |
362 |
+ u32 reg_value; |
363 |
++ int ret; |
364 |
+ |
365 |
+ regmap_write(mdio_dev->subctrl_vbase, cfg_reg, set_val); |
366 |
+ |
367 |
+ for (time_cnt = MDIO_TIMEOUT; time_cnt; time_cnt--) { |
368 |
+- regmap_read(mdio_dev->subctrl_vbase, st_reg, ®_value); |
369 |
++ ret = regmap_read(mdio_dev->subctrl_vbase, st_reg, ®_value); |
370 |
++ if (ret) |
371 |
++ return ret; |
372 |
++ |
373 |
+ reg_value &= st_msk; |
374 |
+ if ((!!check_st) == (!!reg_value)) |
375 |
+ break; |
376 |
+diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c |
377 |
+index 60b26f32d31d..2008c6a02b8a 100644 |
378 |
+--- a/drivers/net/xen-netback/interface.c |
379 |
++++ b/drivers/net/xen-netback/interface.c |
380 |
+@@ -620,7 +620,6 @@ err_tx_unbind: |
381 |
+ err_unmap: |
382 |
+ xenvif_unmap_frontend_rings(queue); |
383 |
+ err: |
384 |
+- module_put(THIS_MODULE); |
385 |
+ return err; |
386 |
+ } |
387 |
+ |
388 |
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
389 |
+index 82b0c2cc2fd3..b7f65fc54dc2 100644 |
390 |
+--- a/drivers/pci/pci.c |
391 |
++++ b/drivers/pci/pci.c |
392 |
+@@ -703,19 +703,6 @@ void pci_update_current_state(struct pci_dev *dev, pci_power_t state) |
393 |
+ } |
394 |
+ } |
395 |
+ |
396 |
+-/** |
397 |
+- * pci_power_up - Put the given device into D0 forcibly |
398 |
+- * @dev: PCI device to power up |
399 |
+- */ |
400 |
+-void pci_power_up(struct pci_dev *dev) |
401 |
+-{ |
402 |
+- if (platform_pci_power_manageable(dev)) |
403 |
+- platform_pci_set_power_state(dev, PCI_D0); |
404 |
+- |
405 |
+- pci_raw_set_power_state(dev, PCI_D0); |
406 |
+- pci_update_current_state(dev, PCI_D0); |
407 |
+-} |
408 |
+- |
409 |
+ /** |
410 |
+ * pci_platform_power_transition - Use platform to change device power state |
411 |
+ * @dev: PCI device to handle. |
412 |
+@@ -891,6 +878,17 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state) |
413 |
+ } |
414 |
+ EXPORT_SYMBOL(pci_set_power_state); |
415 |
+ |
416 |
++/** |
417 |
++ * pci_power_up - Put the given device into D0 forcibly |
418 |
++ * @dev: PCI device to power up |
419 |
++ */ |
420 |
++void pci_power_up(struct pci_dev *dev) |
421 |
++{ |
422 |
++ __pci_start_power_transition(dev, PCI_D0); |
423 |
++ pci_raw_set_power_state(dev, PCI_D0); |
424 |
++ pci_update_current_state(dev, PCI_D0); |
425 |
++} |
426 |
++ |
427 |
+ /** |
428 |
+ * pci_choose_state - Choose the power state of a PCI device |
429 |
+ * @dev: PCI device to be suspended |
430 |
+diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c |
431 |
+index 1964391db904..a3aaef4c53a3 100644 |
432 |
+--- a/drivers/s390/scsi/zfcp_fsf.c |
433 |
++++ b/drivers/s390/scsi/zfcp_fsf.c |
434 |
+@@ -20,6 +20,11 @@ |
435 |
+ |
436 |
+ struct kmem_cache *zfcp_fsf_qtcb_cache; |
437 |
+ |
438 |
++static bool ber_stop = true; |
439 |
++module_param(ber_stop, bool, 0600); |
440 |
++MODULE_PARM_DESC(ber_stop, |
441 |
++ "Shuts down FCP devices for FCP channels that report a bit-error count in excess of its threshold (default on)"); |
442 |
++ |
443 |
+ static void zfcp_fsf_request_timeout_handler(unsigned long data) |
444 |
+ { |
445 |
+ struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; |
446 |
+@@ -231,10 +236,15 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req) |
447 |
+ case FSF_STATUS_READ_SENSE_DATA_AVAIL: |
448 |
+ break; |
449 |
+ case FSF_STATUS_READ_BIT_ERROR_THRESHOLD: |
450 |
+- dev_warn(&adapter->ccw_device->dev, |
451 |
+- "The error threshold for checksum statistics " |
452 |
+- "has been exceeded\n"); |
453 |
+ zfcp_dbf_hba_bit_err("fssrh_3", req); |
454 |
++ if (ber_stop) { |
455 |
++ dev_warn(&adapter->ccw_device->dev, |
456 |
++ "All paths over this FCP device are disused because of excessive bit errors\n"); |
457 |
++ zfcp_erp_adapter_shutdown(adapter, 0, "fssrh_b"); |
458 |
++ } else { |
459 |
++ dev_warn(&adapter->ccw_device->dev, |
460 |
++ "The error threshold for checksum statistics has been exceeded\n"); |
461 |
++ } |
462 |
+ break; |
463 |
+ case FSF_STATUS_READ_LINK_DOWN: |
464 |
+ zfcp_fsf_status_read_link_down(req); |
465 |
+diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c |
466 |
+index 19bffe0b2cc0..2cbfec6a7466 100644 |
467 |
+--- a/drivers/scsi/megaraid.c |
468 |
++++ b/drivers/scsi/megaraid.c |
469 |
+@@ -4219,11 +4219,11 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
470 |
+ */ |
471 |
+ if (pdev->subsystem_vendor == PCI_VENDOR_ID_COMPAQ && |
472 |
+ pdev->subsystem_device == 0xC000) |
473 |
+- return -ENODEV; |
474 |
++ goto out_disable_device; |
475 |
+ /* Now check the magic signature byte */ |
476 |
+ pci_read_config_word(pdev, PCI_CONF_AMISIG, &magic); |
477 |
+ if (magic != HBA_SIGNATURE_471 && magic != HBA_SIGNATURE) |
478 |
+- return -ENODEV; |
479 |
++ goto out_disable_device; |
480 |
+ /* Ok it is probably a megaraid */ |
481 |
+ } |
482 |
+ |
483 |
+diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c |
484 |
+index 824e27eec7a1..6c4f54aa60df 100644 |
485 |
+--- a/drivers/scsi/qla2xxx/qla_target.c |
486 |
++++ b/drivers/scsi/qla2xxx/qla_target.c |
487 |
+@@ -437,6 +437,7 @@ static void qlt_free_session_done(struct work_struct *work) |
488 |
+ |
489 |
+ if (logout_started) { |
490 |
+ bool traced = false; |
491 |
++ u16 cnt = 0; |
492 |
+ |
493 |
+ while (!ACCESS_ONCE(sess->logout_completed)) { |
494 |
+ if (!traced) { |
495 |
+@@ -446,6 +447,9 @@ static void qlt_free_session_done(struct work_struct *work) |
496 |
+ traced = true; |
497 |
+ } |
498 |
+ msleep(100); |
499 |
++ cnt++; |
500 |
++ if (cnt > 200) |
501 |
++ break; |
502 |
+ } |
503 |
+ |
504 |
+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf087, |
505 |
+diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c |
506 |
+index 085e470d1c49..b89af3841e44 100644 |
507 |
+--- a/drivers/scsi/scsi_sysfs.c |
508 |
++++ b/drivers/scsi/scsi_sysfs.c |
509 |
+@@ -679,6 +679,14 @@ sdev_store_delete(struct device *dev, struct device_attribute *attr, |
510 |
+ const char *buf, size_t count) |
511 |
+ { |
512 |
+ struct kernfs_node *kn; |
513 |
++ struct scsi_device *sdev = to_scsi_device(dev); |
514 |
++ |
515 |
++ /* |
516 |
++ * We need to try to get module, avoiding the module been removed |
517 |
++ * during delete. |
518 |
++ */ |
519 |
++ if (scsi_device_get(sdev)) |
520 |
++ return -ENODEV; |
521 |
+ |
522 |
+ kn = sysfs_break_active_protection(&dev->kobj, &attr->attr); |
523 |
+ WARN_ON_ONCE(!kn); |
524 |
+@@ -693,9 +701,10 @@ sdev_store_delete(struct device *dev, struct device_attribute *attr, |
525 |
+ * state into SDEV_DEL. |
526 |
+ */ |
527 |
+ device_remove_file(dev, attr); |
528 |
+- scsi_remove_device(to_scsi_device(dev)); |
529 |
++ scsi_remove_device(sdev); |
530 |
+ if (kn) |
531 |
+ sysfs_unbreak_active_protection(kn); |
532 |
++ scsi_device_put(sdev); |
533 |
+ return count; |
534 |
+ }; |
535 |
+ static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete); |
536 |
+diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c |
537 |
+index fd8bbd2b5d0e..504d36796152 100644 |
538 |
+--- a/drivers/scsi/ufs/ufshcd.c |
539 |
++++ b/drivers/scsi/ufs/ufshcd.c |
540 |
+@@ -5371,6 +5371,9 @@ int ufshcd_shutdown(struct ufs_hba *hba) |
541 |
+ { |
542 |
+ int ret = 0; |
543 |
+ |
544 |
++ if (!hba->is_powered) |
545 |
++ goto out; |
546 |
++ |
547 |
+ if (ufshcd_is_ufs_dev_poweroff(hba) && ufshcd_is_link_off(hba)) |
548 |
+ goto out; |
549 |
+ |
550 |
+diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c |
551 |
+index 0669fbb0ec25..07c3c3449147 100644 |
552 |
+--- a/drivers/usb/class/usblp.c |
553 |
++++ b/drivers/usb/class/usblp.c |
554 |
+@@ -458,6 +458,7 @@ static void usblp_cleanup(struct usblp *usblp) |
555 |
+ kfree(usblp->readbuf); |
556 |
+ kfree(usblp->device_id_string); |
557 |
+ kfree(usblp->statusbuf); |
558 |
++ usb_put_intf(usblp->intf); |
559 |
+ kfree(usblp); |
560 |
+ } |
561 |
+ |
562 |
+@@ -1120,7 +1121,7 @@ static int usblp_probe(struct usb_interface *intf, |
563 |
+ init_waitqueue_head(&usblp->wwait); |
564 |
+ init_usb_anchor(&usblp->urbs); |
565 |
+ usblp->ifnum = intf->cur_altsetting->desc.bInterfaceNumber; |
566 |
+- usblp->intf = intf; |
567 |
++ usblp->intf = usb_get_intf(intf); |
568 |
+ |
569 |
+ /* Malloc device ID string buffer to the largest expected length, |
570 |
+ * since we can re-query it on an ioctl and a dynamic string |
571 |
+@@ -1209,6 +1210,7 @@ abort: |
572 |
+ kfree(usblp->readbuf); |
573 |
+ kfree(usblp->statusbuf); |
574 |
+ kfree(usblp->device_id_string); |
575 |
++ usb_put_intf(usblp->intf); |
576 |
+ kfree(usblp); |
577 |
+ abort_ret: |
578 |
+ return retval; |
579 |
+diff --git a/drivers/usb/gadget/udc/lpc32xx_udc.c b/drivers/usb/gadget/udc/lpc32xx_udc.c |
580 |
+index 90d24f62bd81..ea43cb74a6f2 100644 |
581 |
+--- a/drivers/usb/gadget/udc/lpc32xx_udc.c |
582 |
++++ b/drivers/usb/gadget/udc/lpc32xx_udc.c |
583 |
+@@ -1225,11 +1225,11 @@ static void udc_pop_fifo(struct lpc32xx_udc *udc, u8 *data, u32 bytes) |
584 |
+ tmp = readl(USBD_RXDATA(udc->udp_baseaddr)); |
585 |
+ |
586 |
+ bl = bytes - n; |
587 |
+- if (bl > 3) |
588 |
+- bl = 3; |
589 |
++ if (bl > 4) |
590 |
++ bl = 4; |
591 |
+ |
592 |
+ for (i = 0; i < bl; i++) |
593 |
+- data[n + i] = (u8) ((tmp >> (n * 8)) & 0xFF); |
594 |
++ data[n + i] = (u8) ((tmp >> (i * 8)) & 0xFF); |
595 |
+ } |
596 |
+ break; |
597 |
+ |
598 |
+diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c |
599 |
+index 84f12c1bf9e6..7da242bbe37b 100644 |
600 |
+--- a/drivers/usb/misc/ldusb.c |
601 |
++++ b/drivers/usb/misc/ldusb.c |
602 |
+@@ -384,10 +384,7 @@ static int ld_usb_release(struct inode *inode, struct file *file) |
603 |
+ goto exit; |
604 |
+ } |
605 |
+ |
606 |
+- if (mutex_lock_interruptible(&dev->mutex)) { |
607 |
+- retval = -ERESTARTSYS; |
608 |
+- goto exit; |
609 |
+- } |
610 |
++ mutex_lock(&dev->mutex); |
611 |
+ |
612 |
+ if (dev->open_count != 1) { |
613 |
+ retval = -ENODEV; |
614 |
+@@ -471,7 +468,7 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, |
615 |
+ |
616 |
+ /* wait for data */ |
617 |
+ spin_lock_irq(&dev->rbsl); |
618 |
+- if (dev->ring_head == dev->ring_tail) { |
619 |
++ while (dev->ring_head == dev->ring_tail) { |
620 |
+ dev->interrupt_in_done = 0; |
621 |
+ spin_unlock_irq(&dev->rbsl); |
622 |
+ if (file->f_flags & O_NONBLOCK) { |
623 |
+@@ -481,12 +478,17 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, |
624 |
+ retval = wait_event_interruptible(dev->read_wait, dev->interrupt_in_done); |
625 |
+ if (retval < 0) |
626 |
+ goto unlock_exit; |
627 |
+- } else { |
628 |
+- spin_unlock_irq(&dev->rbsl); |
629 |
++ |
630 |
++ spin_lock_irq(&dev->rbsl); |
631 |
+ } |
632 |
++ spin_unlock_irq(&dev->rbsl); |
633 |
+ |
634 |
+ /* actual_buffer contains actual_length + interrupt_in_buffer */ |
635 |
+ actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endpoint_size)); |
636 |
++ if (*actual_buffer > dev->interrupt_in_endpoint_size) { |
637 |
++ retval = -EIO; |
638 |
++ goto unlock_exit; |
639 |
++ } |
640 |
+ bytes_to_read = min(count, *actual_buffer); |
641 |
+ if (bytes_to_read < *actual_buffer) |
642 |
+ dev_warn(&dev->intf->dev, "Read buffer overflow, %zd bytes dropped\n", |
643 |
+@@ -706,7 +708,9 @@ static int ld_usb_probe(struct usb_interface *intf, const struct usb_device_id * |
644 |
+ dev_warn(&intf->dev, "Interrupt out endpoint not found (using control endpoint instead)\n"); |
645 |
+ |
646 |
+ dev->interrupt_in_endpoint_size = usb_endpoint_maxp(dev->interrupt_in_endpoint); |
647 |
+- dev->ring_buffer = kmalloc(ring_buffer_size*(sizeof(size_t)+dev->interrupt_in_endpoint_size), GFP_KERNEL); |
648 |
++ dev->ring_buffer = kcalloc(ring_buffer_size, |
649 |
++ sizeof(size_t) + dev->interrupt_in_endpoint_size, |
650 |
++ GFP_KERNEL); |
651 |
+ if (!dev->ring_buffer) { |
652 |
+ dev_err(&intf->dev, "Couldn't allocate ring_buffer\n"); |
653 |
+ goto error; |
654 |
+diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c |
655 |
+index 20e3d577ae5d..32b41eb07f00 100644 |
656 |
+--- a/drivers/usb/misc/legousbtower.c |
657 |
++++ b/drivers/usb/misc/legousbtower.c |
658 |
+@@ -425,10 +425,7 @@ static int tower_release (struct inode *inode, struct file *file) |
659 |
+ goto exit; |
660 |
+ } |
661 |
+ |
662 |
+- if (mutex_lock_interruptible(&dev->lock)) { |
663 |
+- retval = -ERESTARTSYS; |
664 |
+- goto exit; |
665 |
+- } |
666 |
++ mutex_lock(&dev->lock); |
667 |
+ |
668 |
+ if (dev->open_count != 1) { |
669 |
+ dev_dbg(&dev->udev->dev, "%s: device not opened exactly once\n", |
670 |
+diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c |
671 |
+index fe7f5ace6064..a33acb8c16d3 100644 |
672 |
+--- a/drivers/usb/serial/ti_usb_3410_5052.c |
673 |
++++ b/drivers/usb/serial/ti_usb_3410_5052.c |
674 |
+@@ -542,7 +542,6 @@ static void ti_close(struct usb_serial_port *port) |
675 |
+ struct ti_port *tport; |
676 |
+ int port_number; |
677 |
+ int status; |
678 |
+- int do_unlock; |
679 |
+ unsigned long flags; |
680 |
+ |
681 |
+ tdev = usb_get_serial_data(port->serial); |
682 |
+@@ -569,16 +568,13 @@ static void ti_close(struct usb_serial_port *port) |
683 |
+ "%s - cannot send close port command, %d\n" |
684 |
+ , __func__, status); |
685 |
+ |
686 |
+- /* if mutex_lock is interrupted, continue anyway */ |
687 |
+- do_unlock = !mutex_lock_interruptible(&tdev->td_open_close_lock); |
688 |
++ mutex_lock(&tdev->td_open_close_lock); |
689 |
+ --tport->tp_tdev->td_open_port_count; |
690 |
+- if (tport->tp_tdev->td_open_port_count <= 0) { |
691 |
++ if (tport->tp_tdev->td_open_port_count == 0) { |
692 |
+ /* last port is closed, shut down interrupt urb */ |
693 |
+ usb_kill_urb(port->serial->port[0]->interrupt_in_urb); |
694 |
+- tport->tp_tdev->td_open_port_count = 0; |
695 |
+ } |
696 |
+- if (do_unlock) |
697 |
+- mutex_unlock(&tdev->td_open_close_lock); |
698 |
++ mutex_unlock(&tdev->td_open_close_lock); |
699 |
+ } |
700 |
+ |
701 |
+ |
702 |
+diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c |
703 |
+index 4c316ca3ee78..34ffc125763f 100644 |
704 |
+--- a/fs/btrfs/extent-tree.c |
705 |
++++ b/fs/btrfs/extent-tree.c |
706 |
+@@ -9905,6 +9905,7 @@ int btrfs_read_block_groups(struct btrfs_root *root) |
707 |
+ btrfs_err(info, |
708 |
+ "bg %llu is a mixed block group but filesystem hasn't enabled mixed block groups", |
709 |
+ cache->key.objectid); |
710 |
++ btrfs_put_block_group(cache); |
711 |
+ ret = -EINVAL; |
712 |
+ goto error; |
713 |
+ } |
714 |
+diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c |
715 |
+index f7a9adab0b84..6f5d78b172ba 100644 |
716 |
+--- a/fs/cifs/smb1ops.c |
717 |
++++ b/fs/cifs/smb1ops.c |
718 |
+@@ -180,6 +180,9 @@ cifs_get_next_mid(struct TCP_Server_Info *server) |
719 |
+ /* we do not want to loop forever */ |
720 |
+ last_mid = cur_mid; |
721 |
+ cur_mid++; |
722 |
++ /* avoid 0xFFFF MID */ |
723 |
++ if (cur_mid == 0xffff) |
724 |
++ cur_mid++; |
725 |
+ |
726 |
+ /* |
727 |
+ * This nested loop looks more expensive than it is. |
728 |
+diff --git a/mm/shmem.c b/mm/shmem.c |
729 |
+index f11aec40f2e1..62668379623b 100644 |
730 |
+--- a/mm/shmem.c |
731 |
++++ b/mm/shmem.c |
732 |
+@@ -1854,11 +1854,12 @@ static void shmem_tag_pins(struct address_space *mapping) |
733 |
+ void **slot; |
734 |
+ pgoff_t start; |
735 |
+ struct page *page; |
736 |
++ unsigned int tagged = 0; |
737 |
+ |
738 |
+ lru_add_drain(); |
739 |
+ start = 0; |
740 |
+- rcu_read_lock(); |
741 |
+ |
742 |
++ spin_lock_irq(&mapping->tree_lock); |
743 |
+ restart: |
744 |
+ radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) { |
745 |
+ page = radix_tree_deref_slot(slot); |
746 |
+@@ -1866,19 +1867,20 @@ restart: |
747 |
+ if (radix_tree_deref_retry(page)) |
748 |
+ goto restart; |
749 |
+ } else if (page_count(page) - page_mapcount(page) > 1) { |
750 |
+- spin_lock_irq(&mapping->tree_lock); |
751 |
+ radix_tree_tag_set(&mapping->page_tree, iter.index, |
752 |
+ SHMEM_TAG_PINNED); |
753 |
+- spin_unlock_irq(&mapping->tree_lock); |
754 |
+ } |
755 |
+ |
756 |
+- if (need_resched()) { |
757 |
+- cond_resched_rcu(); |
758 |
+- start = iter.index + 1; |
759 |
+- goto restart; |
760 |
+- } |
761 |
++ if (++tagged % 1024) |
762 |
++ continue; |
763 |
++ |
764 |
++ spin_unlock_irq(&mapping->tree_lock); |
765 |
++ cond_resched(); |
766 |
++ start = iter.index + 1; |
767 |
++ spin_lock_irq(&mapping->tree_lock); |
768 |
++ goto restart; |
769 |
+ } |
770 |
+- rcu_read_unlock(); |
771 |
++ spin_unlock_irq(&mapping->tree_lock); |
772 |
+ } |
773 |
+ |
774 |
+ /* |
775 |
+diff --git a/mm/slub.c b/mm/slub.c |
776 |
+index c33b0e13cca7..8f5dcb0ac24f 100644 |
777 |
+--- a/mm/slub.c |
778 |
++++ b/mm/slub.c |
779 |
+@@ -4522,7 +4522,17 @@ static ssize_t show_slab_objects(struct kmem_cache *s, |
780 |
+ } |
781 |
+ } |
782 |
+ |
783 |
+- get_online_mems(); |
784 |
++ /* |
785 |
++ * It is impossible to take "mem_hotplug_lock" here with "kernfs_mutex" |
786 |
++ * already held which will conflict with an existing lock order: |
787 |
++ * |
788 |
++ * mem_hotplug_lock->slab_mutex->kernfs_mutex |
789 |
++ * |
790 |
++ * We don't really need mem_hotplug_lock (to hold off |
791 |
++ * slab_mem_going_offline_callback) here because slab's memory hot |
792 |
++ * unplug code doesn't destroy the kmem_cache->node[] data. |
793 |
++ */ |
794 |
++ |
795 |
+ #ifdef CONFIG_SLUB_DEBUG |
796 |
+ if (flags & SO_ALL) { |
797 |
+ struct kmem_cache_node *n; |
798 |
+@@ -4563,7 +4573,6 @@ static ssize_t show_slab_objects(struct kmem_cache *s, |
799 |
+ x += sprintf(buf + x, " N%d=%lu", |
800 |
+ node, nodes[node]); |
801 |
+ #endif |
802 |
+- put_online_mems(); |
803 |
+ kfree(nodes); |
804 |
+ return x + sprintf(buf + x, "\n"); |
805 |
+ } |
806 |
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
807 |
+index a60078de1191..42132ac2c497 100644 |
808 |
+--- a/net/ipv4/route.c |
809 |
++++ b/net/ipv4/route.c |
810 |
+@@ -2209,7 +2209,7 @@ struct rtable *__ip_route_output_key_hash(struct net *net, struct flowi4 *fl4, |
811 |
+ struct fib_result res; |
812 |
+ struct rtable *rth; |
813 |
+ int orig_oif; |
814 |
+- int err = -ENETUNREACH; |
815 |
++ int err; |
816 |
+ |
817 |
+ res.tclassid = 0; |
818 |
+ res.fi = NULL; |
819 |
+@@ -2224,11 +2224,14 @@ struct rtable *__ip_route_output_key_hash(struct net *net, struct flowi4 *fl4, |
820 |
+ |
821 |
+ rcu_read_lock(); |
822 |
+ if (fl4->saddr) { |
823 |
+- rth = ERR_PTR(-EINVAL); |
824 |
+ if (ipv4_is_multicast(fl4->saddr) || |
825 |
+ ipv4_is_lbcast(fl4->saddr) || |
826 |
+- ipv4_is_zeronet(fl4->saddr)) |
827 |
++ ipv4_is_zeronet(fl4->saddr)) { |
828 |
++ rth = ERR_PTR(-EINVAL); |
829 |
+ goto out; |
830 |
++ } |
831 |
++ |
832 |
++ rth = ERR_PTR(-ENETUNREACH); |
833 |
+ |
834 |
+ /* I removed check for oif == dev_out->oif here. |
835 |
+ It was wrong for two reasons: |
836 |
+diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
837 |
+index 24eec3cb922d..031fbfd36d58 100644 |
838 |
+--- a/net/mac80211/mlme.c |
839 |
++++ b/net/mac80211/mlme.c |
840 |
+@@ -2431,7 +2431,8 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw, |
841 |
+ |
842 |
+ rcu_read_lock(); |
843 |
+ ssid = ieee80211_bss_get_ie(cbss, WLAN_EID_SSID); |
844 |
+- if (WARN_ON_ONCE(ssid == NULL)) |
845 |
++ if (WARN_ONCE(!ssid || ssid[1] > IEEE80211_MAX_SSID_LEN, |
846 |
++ "invalid SSID element (len=%d)", ssid ? ssid[1] : -1)) |
847 |
+ ssid_len = 0; |
848 |
+ else |
849 |
+ ssid_len = ssid[1]; |
850 |
+@@ -4669,7 +4670,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, |
851 |
+ |
852 |
+ rcu_read_lock(); |
853 |
+ ssidie = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID); |
854 |
+- if (!ssidie) { |
855 |
++ if (!ssidie || ssidie[1] > sizeof(assoc_data->ssid)) { |
856 |
+ rcu_read_unlock(); |
857 |
+ kfree(assoc_data); |
858 |
+ return -EINVAL; |
859 |
+diff --git a/net/sched/act_api.c b/net/sched/act_api.c |
860 |
+index f44fea22d69c..b3a165cb63ee 100644 |
861 |
+--- a/net/sched/act_api.c |
862 |
++++ b/net/sched/act_api.c |
863 |
+@@ -946,10 +946,15 @@ static int |
864 |
+ tcf_action_add(struct net *net, struct nlattr *nla, struct nlmsghdr *n, |
865 |
+ u32 portid, int ovr) |
866 |
+ { |
867 |
+- int ret = 0; |
868 |
++ int loop, ret; |
869 |
+ LIST_HEAD(actions); |
870 |
+ |
871 |
+- ret = tcf_action_init(net, nla, NULL, NULL, ovr, 0, &actions); |
872 |
++ for (loop = 0; loop < 10; loop++) { |
873 |
++ ret = tcf_action_init(net, nla, NULL, NULL, ovr, 0, &actions); |
874 |
++ if (ret != -EAGAIN) |
875 |
++ break; |
876 |
++ } |
877 |
++ |
878 |
+ if (ret) |
879 |
+ goto done; |
880 |
+ |
881 |
+@@ -992,10 +997,7 @@ static int tc_ctl_action(struct sk_buff *skb, struct nlmsghdr *n) |
882 |
+ */ |
883 |
+ if (n->nlmsg_flags & NLM_F_REPLACE) |
884 |
+ ovr = 1; |
885 |
+-replay: |
886 |
+ ret = tcf_action_add(net, tca[TCA_ACT_TAB], n, portid, ovr); |
887 |
+- if (ret == -EAGAIN) |
888 |
+- goto replay; |
889 |
+ break; |
890 |
+ case RTM_DELACTION: |
891 |
+ ret = tca_action_gd(net, tca[TCA_ACT_TAB], n, |
892 |
+diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c |
893 |
+index 4fbb67430ce4..4d745a2efd20 100644 |
894 |
+--- a/net/sched/cls_u32.c |
895 |
++++ b/net/sched/cls_u32.c |
896 |
+@@ -734,6 +734,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb, |
897 |
+ struct nlattr *opt = tca[TCA_OPTIONS]; |
898 |
+ struct nlattr *tb[TCA_U32_MAX + 1]; |
899 |
+ u32 htid; |
900 |
++ size_t sel_size; |
901 |
+ int err; |
902 |
+ #ifdef CONFIG_CLS_U32_PERF |
903 |
+ size_t size; |
904 |
+@@ -827,8 +828,11 @@ static int u32_change(struct net *net, struct sk_buff *in_skb, |
905 |
+ return -EINVAL; |
906 |
+ |
907 |
+ s = nla_data(tb[TCA_U32_SEL]); |
908 |
++ sel_size = sizeof(*s) + sizeof(*s->keys) * s->nkeys; |
909 |
++ if (nla_len(tb[TCA_U32_SEL]) < sel_size) |
910 |
++ return -EINVAL; |
911 |
+ |
912 |
+- n = kzalloc(sizeof(*n) + s->nkeys*sizeof(struct tc_u32_key), GFP_KERNEL); |
913 |
++ n = kzalloc(offsetof(typeof(*n), sel) + sel_size, GFP_KERNEL); |
914 |
+ if (n == NULL) |
915 |
+ return -ENOBUFS; |
916 |
+ |
917 |
+@@ -841,7 +845,7 @@ static int u32_change(struct net *net, struct sk_buff *in_skb, |
918 |
+ } |
919 |
+ #endif |
920 |
+ |
921 |
+- memcpy(&n->sel, s, sizeof(*s) + s->nkeys*sizeof(struct tc_u32_key)); |
922 |
++ memcpy(&n->sel, s, sel_size); |
923 |
+ RCU_INIT_POINTER(n->ht_up, ht); |
924 |
+ n->handle = handle; |
925 |
+ n->fshift = s->hmask ? ffs(ntohl(s->hmask)) - 1 : 0; |
926 |
+diff --git a/net/sctp/socket.c b/net/sctp/socket.c |
927 |
+index 53f1b33bca4e..191fd251e8a0 100644 |
928 |
+--- a/net/sctp/socket.c |
929 |
++++ b/net/sctp/socket.c |
930 |
+@@ -7443,7 +7443,7 @@ struct proto sctp_prot = { |
931 |
+ .backlog_rcv = sctp_backlog_rcv, |
932 |
+ .hash = sctp_hash, |
933 |
+ .unhash = sctp_unhash, |
934 |
+- .get_port = sctp_get_port, |
935 |
++ .no_autobind = true, |
936 |
+ .obj_size = sizeof(struct sctp_sock), |
937 |
+ .sysctl_mem = sysctl_sctp_mem, |
938 |
+ .sysctl_rmem = sysctl_sctp_rmem, |
939 |
+@@ -7482,7 +7482,7 @@ struct proto sctpv6_prot = { |
940 |
+ .backlog_rcv = sctp_backlog_rcv, |
941 |
+ .hash = sctp_hash, |
942 |
+ .unhash = sctp_unhash, |
943 |
+- .get_port = sctp_get_port, |
944 |
++ .no_autobind = true, |
945 |
+ .obj_size = sizeof(struct sctp6_sock), |
946 |
+ .sysctl_mem = sysctl_sctp_mem, |
947 |
+ .sysctl_rmem = sysctl_sctp_rmem, |
948 |
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
949 |
+index 95c8e682b491..2023802b6c77 100644 |
950 |
+--- a/net/wireless/nl80211.c |
951 |
++++ b/net/wireless/nl80211.c |
952 |
+@@ -4816,6 +4816,9 @@ static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) |
953 |
+ if (!rdev->ops->del_mpath) |
954 |
+ return -EOPNOTSUPP; |
955 |
+ |
956 |
++ if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT) |
957 |
++ return -EOPNOTSUPP; |
958 |
++ |
959 |
+ return rdev_del_mpath(rdev, dev, dst); |
960 |
+ } |
961 |
+ |
962 |
+diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c |
963 |
+index a4e8af3321d2..98ff9d9e1aa9 100644 |
964 |
+--- a/net/wireless/wext-sme.c |
965 |
++++ b/net/wireless/wext-sme.c |
966 |
+@@ -225,6 +225,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, |
967 |
+ struct iw_point *data, char *ssid) |
968 |
+ { |
969 |
+ struct wireless_dev *wdev = dev->ieee80211_ptr; |
970 |
++ int ret = 0; |
971 |
+ |
972 |
+ /* call only for station! */ |
973 |
+ if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION)) |
974 |
+@@ -242,7 +243,10 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, |
975 |
+ if (ie) { |
976 |
+ data->flags = 1; |
977 |
+ data->length = ie[1]; |
978 |
+- memcpy(ssid, ie + 2, data->length); |
979 |
++ if (data->length > IW_ESSID_MAX_SIZE) |
980 |
++ ret = -EINVAL; |
981 |
++ else |
982 |
++ memcpy(ssid, ie + 2, data->length); |
983 |
+ } |
984 |
+ rcu_read_unlock(); |
985 |
+ } else if (wdev->wext.connect.ssid && wdev->wext.connect.ssid_len) { |
986 |
+@@ -252,7 +256,7 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, |
987 |
+ } |
988 |
+ wdev_unlock(wdev); |
989 |
+ |
990 |
+- return 0; |
991 |
++ return ret; |
992 |
+ } |
993 |
+ |
994 |
+ int cfg80211_mgd_wext_siwap(struct net_device *dev, |
995 |
+diff --git a/scripts/namespace.pl b/scripts/namespace.pl |
996 |
+index a71be6b7cdec..9a2a32ce8a3b 100755 |
997 |
+--- a/scripts/namespace.pl |
998 |
++++ b/scripts/namespace.pl |
999 |
+@@ -65,13 +65,14 @@ |
1000 |
+ require 5; # at least perl 5 |
1001 |
+ use strict; |
1002 |
+ use File::Find; |
1003 |
++use File::Spec; |
1004 |
+ |
1005 |
+ my $nm = ($ENV{'NM'} || "nm") . " -p"; |
1006 |
+ my $objdump = ($ENV{'OBJDUMP'} || "objdump") . " -s -j .comment"; |
1007 |
+-my $srctree = ""; |
1008 |
+-my $objtree = ""; |
1009 |
+-$srctree = "$ENV{'srctree'}/" if (exists($ENV{'srctree'})); |
1010 |
+-$objtree = "$ENV{'objtree'}/" if (exists($ENV{'objtree'})); |
1011 |
++my $srctree = File::Spec->curdir(); |
1012 |
++my $objtree = File::Spec->curdir(); |
1013 |
++$srctree = File::Spec->rel2abs($ENV{'srctree'}) if (exists($ENV{'srctree'})); |
1014 |
++$objtree = File::Spec->rel2abs($ENV{'objtree'}) if (exists($ENV{'objtree'})); |
1015 |
+ |
1016 |
+ if ($#ARGV != -1) { |
1017 |
+ print STDERR "usage: $0 takes no parameters\n"; |
1018 |
+@@ -229,9 +230,9 @@ sub do_nm |
1019 |
+ } |
1020 |
+ ($source = $basename) =~ s/\.o$//; |
1021 |
+ if (-e "$source.c" || -e "$source.S") { |
1022 |
+- $source = "$objtree$File::Find::dir/$source"; |
1023 |
++ $source = File::Spec->catfile($objtree, $File::Find::dir, $source) |
1024 |
+ } else { |
1025 |
+- $source = "$srctree$File::Find::dir/$source"; |
1026 |
++ $source = File::Spec->catfile($srctree, $File::Find::dir, $source) |
1027 |
+ } |
1028 |
+ if (! -e "$source.c" && ! -e "$source.S") { |
1029 |
+ # No obvious source, exclude the object if it is conglomerate |
1030 |
+diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c |
1031 |
+index e00dfbec22c5..f18485c6a5d8 100644 |
1032 |
+--- a/sound/soc/sh/rcar/core.c |
1033 |
++++ b/sound/soc/sh/rcar/core.c |
1034 |
+@@ -524,6 +524,7 @@ static int rsnd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
1035 |
+ } |
1036 |
+ |
1037 |
+ /* set format */ |
1038 |
++ rdai->bit_clk_inv = 0; |
1039 |
+ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
1040 |
+ case SND_SOC_DAIFMT_I2S: |
1041 |
+ rdai->sys_delay = 0; |