Annotation of /trunk/kernel-alx-legacy/patches-4.9/0367-4.9.268-all-fixes.patch
Parent Directory | Revision Log
Revision 3669 -
(hide annotations)
(download)
Mon Oct 24 14:07:46 2022 UTC (19 months, 1 week ago) by niro
File size: 33024 byte(s)
Mon Oct 24 14:07:46 2022 UTC (19 months, 1 week ago) by niro
File size: 33024 byte(s)
-linux-4.9.268
1 | niro | 3669 | diff --git a/Makefile b/Makefile |
2 | index 790f3619772a8..642365d416be1 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 267 | ||
9 | +SUBLEVEL = 268 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c | ||
14 | index d347bbc086fed..16cdb471d3db6 100644 | ||
15 | --- a/arch/arc/kernel/signal.c | ||
16 | +++ b/arch/arc/kernel/signal.c | ||
17 | @@ -97,7 +97,7 @@ stash_usr_regs(struct rt_sigframe __user *sf, struct pt_regs *regs, | ||
18 | sizeof(sf->uc.uc_mcontext.regs.scratch)); | ||
19 | err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(sigset_t)); | ||
20 | |||
21 | - return err; | ||
22 | + return err ? -EFAULT : 0; | ||
23 | } | ||
24 | |||
25 | static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf) | ||
26 | @@ -111,7 +111,7 @@ static int restore_usr_regs(struct pt_regs *regs, struct rt_sigframe __user *sf) | ||
27 | &(sf->uc.uc_mcontext.regs.scratch), | ||
28 | sizeof(sf->uc.uc_mcontext.regs.scratch)); | ||
29 | if (err) | ||
30 | - return err; | ||
31 | + return -EFAULT; | ||
32 | |||
33 | set_current_blocked(&set); | ||
34 | regs->bta = uregs.scratch.bta; | ||
35 | diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi | ||
36 | index 2008648b8c9f9..0a7600d06fb56 100644 | ||
37 | --- a/arch/arm/boot/dts/omap3.dtsi | ||
38 | +++ b/arch/arm/boot/dts/omap3.dtsi | ||
39 | @@ -23,6 +23,9 @@ | ||
40 | i2c0 = &i2c1; | ||
41 | i2c1 = &i2c2; | ||
42 | i2c2 = &i2c3; | ||
43 | + mmc0 = &mmc1; | ||
44 | + mmc1 = &mmc2; | ||
45 | + mmc2 = &mmc3; | ||
46 | serial0 = &uart1; | ||
47 | serial1 = &uart2; | ||
48 | serial2 = &uart3; | ||
49 | diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi | ||
50 | index 4d6584f15b174..7e5a09c3d2a6b 100644 | ||
51 | --- a/arch/arm/boot/dts/omap4.dtsi | ||
52 | +++ b/arch/arm/boot/dts/omap4.dtsi | ||
53 | @@ -22,6 +22,11 @@ | ||
54 | i2c1 = &i2c2; | ||
55 | i2c2 = &i2c3; | ||
56 | i2c3 = &i2c4; | ||
57 | + mmc0 = &mmc1; | ||
58 | + mmc1 = &mmc2; | ||
59 | + mmc2 = &mmc3; | ||
60 | + mmc3 = &mmc4; | ||
61 | + mmc4 = &mmc5; | ||
62 | serial0 = &uart1; | ||
63 | serial1 = &uart2; | ||
64 | serial2 = &uart3; | ||
65 | diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi | ||
66 | index a76266f242a1f..586fe60b9921f 100644 | ||
67 | --- a/arch/arm/boot/dts/omap5.dtsi | ||
68 | +++ b/arch/arm/boot/dts/omap5.dtsi | ||
69 | @@ -25,6 +25,11 @@ | ||
70 | i2c2 = &i2c3; | ||
71 | i2c3 = &i2c4; | ||
72 | i2c4 = &i2c5; | ||
73 | + mmc0 = &mmc1; | ||
74 | + mmc1 = &mmc2; | ||
75 | + mmc2 = &mmc3; | ||
76 | + mmc3 = &mmc4; | ||
77 | + mmc4 = &mmc5; | ||
78 | serial0 = &uart1; | ||
79 | serial1 = &uart2; | ||
80 | serial2 = &uart3; | ||
81 | diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c | ||
82 | index 84613abf35a33..79ff5b9534313 100644 | ||
83 | --- a/arch/arm/mach-keystone/keystone.c | ||
84 | +++ b/arch/arm/mach-keystone/keystone.c | ||
85 | @@ -65,7 +65,7 @@ static void __init keystone_init(void) | ||
86 | static long long __init keystone_pv_fixup(void) | ||
87 | { | ||
88 | long long offset; | ||
89 | - phys_addr_t mem_start, mem_end; | ||
90 | + u64 mem_start, mem_end; | ||
91 | |||
92 | mem_start = memblock_start_of_DRAM(); | ||
93 | mem_end = memblock_end_of_DRAM(); | ||
94 | @@ -78,7 +78,7 @@ static long long __init keystone_pv_fixup(void) | ||
95 | if (mem_start < KEYSTONE_HIGH_PHYS_START || | ||
96 | mem_end > KEYSTONE_HIGH_PHYS_END) { | ||
97 | pr_crit("Invalid address space for memory (%08llx-%08llx)\n", | ||
98 | - (u64)mem_start, (u64)mem_end); | ||
99 | + mem_start, mem_end); | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | diff --git a/arch/arm/probes/uprobes/core.c b/arch/arm/probes/uprobes/core.c | ||
104 | index d1329f1ba4e4c..b97230704b744 100644 | ||
105 | --- a/arch/arm/probes/uprobes/core.c | ||
106 | +++ b/arch/arm/probes/uprobes/core.c | ||
107 | @@ -207,7 +207,7 @@ unsigned long uprobe_get_swbp_addr(struct pt_regs *regs) | ||
108 | static struct undef_hook uprobes_arm_break_hook = { | ||
109 | .instr_mask = 0x0fffffff, | ||
110 | .instr_val = (UPROBE_SWBP_ARM_INSN & 0x0fffffff), | ||
111 | - .cpsr_mask = MODE_MASK, | ||
112 | + .cpsr_mask = (PSR_T_BIT | MODE_MASK), | ||
113 | .cpsr_val = USR_MODE, | ||
114 | .fn = uprobe_trap_handler, | ||
115 | }; | ||
116 | @@ -215,7 +215,7 @@ static struct undef_hook uprobes_arm_break_hook = { | ||
117 | static struct undef_hook uprobes_arm_ss_hook = { | ||
118 | .instr_mask = 0x0fffffff, | ||
119 | .instr_val = (UPROBE_SS_ARM_INSN & 0x0fffffff), | ||
120 | - .cpsr_mask = MODE_MASK, | ||
121 | + .cpsr_mask = (PSR_T_BIT | MODE_MASK), | ||
122 | .cpsr_val = USR_MODE, | ||
123 | .fn = uprobe_trap_handler, | ||
124 | }; | ||
125 | diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c | ||
126 | index 8786268053693..3b0c892953ab4 100644 | ||
127 | --- a/arch/ia64/mm/discontig.c | ||
128 | +++ b/arch/ia64/mm/discontig.c | ||
129 | @@ -99,7 +99,7 @@ static int __init build_node_maps(unsigned long start, unsigned long len, | ||
130 | * acpi_boot_init() (which builds the node_to_cpu_mask array) hasn't been | ||
131 | * called yet. Note that node 0 will also count all non-existent cpus. | ||
132 | */ | ||
133 | -static int __meminit early_nr_cpus_node(int node) | ||
134 | +static int early_nr_cpus_node(int node) | ||
135 | { | ||
136 | int cpu, n = 0; | ||
137 | |||
138 | @@ -114,7 +114,7 @@ static int __meminit early_nr_cpus_node(int node) | ||
139 | * compute_pernodesize - compute size of pernode data | ||
140 | * @node: the node id. | ||
141 | */ | ||
142 | -static unsigned long __meminit compute_pernodesize(int node) | ||
143 | +static unsigned long compute_pernodesize(int node) | ||
144 | { | ||
145 | unsigned long pernodesize = 0, cpus; | ||
146 | |||
147 | @@ -411,7 +411,7 @@ static void __init reserve_pernode_space(void) | ||
148 | } | ||
149 | } | ||
150 | |||
151 | -static void __meminit scatter_node_data(void) | ||
152 | +static void scatter_node_data(void) | ||
153 | { | ||
154 | pg_data_t **dst; | ||
155 | int node; | ||
156 | diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S | ||
157 | index 771cfd2e1e6d8..708b8ee604d0a 100644 | ||
158 | --- a/arch/s390/kernel/entry.S | ||
159 | +++ b/arch/s390/kernel/entry.S | ||
160 | @@ -902,6 +902,7 @@ ENTRY(ext_int_handler) | ||
161 | * Load idle PSW. The second "half" of this function is in .Lcleanup_idle. | ||
162 | */ | ||
163 | ENTRY(psw_idle) | ||
164 | + stg %r14,(__SF_GPRS+8*8)(%r15) | ||
165 | stg %r3,__SF_EMPTY(%r15) | ||
166 | larl %r1,.Lpsw_idle_lpsw+4 | ||
167 | stg %r1,__SF_EMPTY+8(%r15) | ||
168 | diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c | ||
169 | index 650830e39e3a7..b3ac57f0e068e 100644 | ||
170 | --- a/arch/x86/kernel/crash.c | ||
171 | +++ b/arch/x86/kernel/crash.c | ||
172 | @@ -23,6 +23,7 @@ | ||
173 | #include <linux/export.h> | ||
174 | #include <linux/slab.h> | ||
175 | #include <linux/vmalloc.h> | ||
176 | +#include <linux/overflow.h> | ||
177 | |||
178 | #include <asm/processor.h> | ||
179 | #include <asm/hardirq.h> | ||
180 | @@ -564,7 +565,7 @@ int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params) | ||
181 | struct crash_memmap_data cmd; | ||
182 | struct crash_mem *cmem; | ||
183 | |||
184 | - cmem = vzalloc(sizeof(struct crash_mem)); | ||
185 | + cmem = vzalloc(struct_size(cmem, ranges, 1)); | ||
186 | if (!cmem) | ||
187 | return -ENOMEM; | ||
188 | |||
189 | diff --git a/drivers/dma/dw/Kconfig b/drivers/dma/dw/Kconfig | ||
190 | index e00c9b0229647..6ea3e95c287bd 100644 | ||
191 | --- a/drivers/dma/dw/Kconfig | ||
192 | +++ b/drivers/dma/dw/Kconfig | ||
193 | @@ -11,6 +11,7 @@ config DW_DMAC_BIG_ENDIAN_IO | ||
194 | |||
195 | config DW_DMAC | ||
196 | tristate "Synopsys DesignWare AHB DMA platform driver" | ||
197 | + depends on HAS_IOMEM | ||
198 | select DW_DMAC_CORE | ||
199 | select DW_DMAC_BIG_ENDIAN_IO if AVR32 | ||
200 | default y if CPU_AT32AP7000 | ||
201 | @@ -21,6 +22,7 @@ config DW_DMAC | ||
202 | config DW_DMAC_PCI | ||
203 | tristate "Synopsys DesignWare AHB DMA PCI driver" | ||
204 | depends on PCI | ||
205 | + depends on HAS_IOMEM | ||
206 | select DW_DMAC_CORE | ||
207 | help | ||
208 | Support the Synopsys DesignWare AHB DMA controller on the | ||
209 | diff --git a/drivers/hid/hid-alps.c b/drivers/hid/hid-alps.c | ||
210 | index ed9c0ea5b026e..1bc6ad0339d22 100644 | ||
211 | --- a/drivers/hid/hid-alps.c | ||
212 | +++ b/drivers/hid/hid-alps.c | ||
213 | @@ -429,6 +429,7 @@ static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) | ||
214 | ret = input_register_device(data->input2); | ||
215 | if (ret) { | ||
216 | input_free_device(input2); | ||
217 | + ret = -ENOENT; | ||
218 | goto exit; | ||
219 | } | ||
220 | } | ||
221 | diff --git a/drivers/input/keyboard/nspire-keypad.c b/drivers/input/keyboard/nspire-keypad.c | ||
222 | index 7abfd34eb87ec..bcec72367c1d4 100644 | ||
223 | --- a/drivers/input/keyboard/nspire-keypad.c | ||
224 | +++ b/drivers/input/keyboard/nspire-keypad.c | ||
225 | @@ -96,9 +96,15 @@ static irqreturn_t nspire_keypad_irq(int irq, void *dev_id) | ||
226 | return IRQ_HANDLED; | ||
227 | } | ||
228 | |||
229 | -static int nspire_keypad_chip_init(struct nspire_keypad *keypad) | ||
230 | +static int nspire_keypad_open(struct input_dev *input) | ||
231 | { | ||
232 | + struct nspire_keypad *keypad = input_get_drvdata(input); | ||
233 | unsigned long val = 0, cycles_per_us, delay_cycles, row_delay_cycles; | ||
234 | + int error; | ||
235 | + | ||
236 | + error = clk_prepare_enable(keypad->clk); | ||
237 | + if (error) | ||
238 | + return error; | ||
239 | |||
240 | cycles_per_us = (clk_get_rate(keypad->clk) / 1000000); | ||
241 | if (cycles_per_us == 0) | ||
242 | @@ -124,30 +130,6 @@ static int nspire_keypad_chip_init(struct nspire_keypad *keypad) | ||
243 | keypad->int_mask = 1 << 1; | ||
244 | writel(keypad->int_mask, keypad->reg_base + KEYPAD_INTMSK); | ||
245 | |||
246 | - /* Disable GPIO interrupts to prevent hanging on touchpad */ | ||
247 | - /* Possibly used to detect touchpad events */ | ||
248 | - writel(0, keypad->reg_base + KEYPAD_UNKNOWN_INT); | ||
249 | - /* Acknowledge existing interrupts */ | ||
250 | - writel(~0, keypad->reg_base + KEYPAD_UNKNOWN_INT_STS); | ||
251 | - | ||
252 | - return 0; | ||
253 | -} | ||
254 | - | ||
255 | -static int nspire_keypad_open(struct input_dev *input) | ||
256 | -{ | ||
257 | - struct nspire_keypad *keypad = input_get_drvdata(input); | ||
258 | - int error; | ||
259 | - | ||
260 | - error = clk_prepare_enable(keypad->clk); | ||
261 | - if (error) | ||
262 | - return error; | ||
263 | - | ||
264 | - error = nspire_keypad_chip_init(keypad); | ||
265 | - if (error) { | ||
266 | - clk_disable_unprepare(keypad->clk); | ||
267 | - return error; | ||
268 | - } | ||
269 | - | ||
270 | return 0; | ||
271 | } | ||
272 | |||
273 | @@ -155,6 +137,11 @@ static void nspire_keypad_close(struct input_dev *input) | ||
274 | { | ||
275 | struct nspire_keypad *keypad = input_get_drvdata(input); | ||
276 | |||
277 | + /* Disable interrupts */ | ||
278 | + writel(0, keypad->reg_base + KEYPAD_INTMSK); | ||
279 | + /* Acknowledge existing interrupts */ | ||
280 | + writel(~0, keypad->reg_base + KEYPAD_INT); | ||
281 | + | ||
282 | clk_disable_unprepare(keypad->clk); | ||
283 | } | ||
284 | |||
285 | @@ -215,6 +202,25 @@ static int nspire_keypad_probe(struct platform_device *pdev) | ||
286 | return -ENOMEM; | ||
287 | } | ||
288 | |||
289 | + error = clk_prepare_enable(keypad->clk); | ||
290 | + if (error) { | ||
291 | + dev_err(&pdev->dev, "failed to enable clock\n"); | ||
292 | + return error; | ||
293 | + } | ||
294 | + | ||
295 | + /* Disable interrupts */ | ||
296 | + writel(0, keypad->reg_base + KEYPAD_INTMSK); | ||
297 | + /* Acknowledge existing interrupts */ | ||
298 | + writel(~0, keypad->reg_base + KEYPAD_INT); | ||
299 | + | ||
300 | + /* Disable GPIO interrupts to prevent hanging on touchpad */ | ||
301 | + /* Possibly used to detect touchpad events */ | ||
302 | + writel(0, keypad->reg_base + KEYPAD_UNKNOWN_INT); | ||
303 | + /* Acknowledge existing GPIO interrupts */ | ||
304 | + writel(~0, keypad->reg_base + KEYPAD_UNKNOWN_INT_STS); | ||
305 | + | ||
306 | + clk_disable_unprepare(keypad->clk); | ||
307 | + | ||
308 | input_set_drvdata(input, keypad); | ||
309 | |||
310 | input->id.bustype = BUS_HOST; | ||
311 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h | ||
312 | index ff0f3c3e2f804..3049bccf24227 100644 | ||
313 | --- a/drivers/input/serio/i8042-x86ia64io.h | ||
314 | +++ b/drivers/input/serio/i8042-x86ia64io.h | ||
315 | @@ -579,6 +579,7 @@ static const struct dmi_system_id i8042_dmi_forcemux_table[] __initconst = { | ||
316 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
317 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"), | ||
318 | }, | ||
319 | + }, { | ||
320 | .matches = { | ||
321 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
322 | DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */ | ||
323 | diff --git a/drivers/net/ethernet/amd/pcnet32.c b/drivers/net/ethernet/amd/pcnet32.c | ||
324 | index c22bf52d3320b..c3887ac3d04d5 100644 | ||
325 | --- a/drivers/net/ethernet/amd/pcnet32.c | ||
326 | +++ b/drivers/net/ethernet/amd/pcnet32.c | ||
327 | @@ -1493,8 +1493,7 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
328 | } | ||
329 | pci_set_master(pdev); | ||
330 | |||
331 | - ioaddr = pci_resource_start(pdev, 0); | ||
332 | - if (!ioaddr) { | ||
333 | + if (!pci_resource_len(pdev, 0)) { | ||
334 | if (pcnet32_debug & NETIF_MSG_PROBE) | ||
335 | pr_err("card has no PCI IO resources, aborting\n"); | ||
336 | return -ENODEV; | ||
337 | @@ -1506,6 +1505,8 @@ pcnet32_probe_pci(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
338 | pr_err("architecture does not support 32bit PCI busmaster DMA\n"); | ||
339 | return err; | ||
340 | } | ||
341 | + | ||
342 | + ioaddr = pci_resource_start(pdev, 0); | ||
343 | if (!request_region(ioaddr, PCNET32_TOTAL_SIZE, "pcnet32_probe_pci")) { | ||
344 | if (pcnet32_debug & NETIF_MSG_PROBE) | ||
345 | pr_err("io address range already allocated\n"); | ||
346 | diff --git a/drivers/net/ethernet/cavium/liquidio/cn66xx_regs.h b/drivers/net/ethernet/cavium/liquidio/cn66xx_regs.h | ||
347 | index 5e3aff242ad38..3ab84d18ad3ac 100644 | ||
348 | --- a/drivers/net/ethernet/cavium/liquidio/cn66xx_regs.h | ||
349 | +++ b/drivers/net/ethernet/cavium/liquidio/cn66xx_regs.h | ||
350 | @@ -417,7 +417,7 @@ | ||
351 | | CN6XXX_INTR_M0UNWI_ERR \ | ||
352 | | CN6XXX_INTR_M1UPB0_ERR \ | ||
353 | | CN6XXX_INTR_M1UPWI_ERR \ | ||
354 | - | CN6XXX_INTR_M1UPB0_ERR \ | ||
355 | + | CN6XXX_INTR_M1UNB0_ERR \ | ||
356 | | CN6XXX_INTR_M1UNWI_ERR \ | ||
357 | | CN6XXX_INTR_INSTR_DB_OF_ERR \ | ||
358 | | CN6XXX_INTR_SLIST_DB_OF_ERR \ | ||
359 | diff --git a/drivers/net/ethernet/davicom/dm9000.c b/drivers/net/ethernet/davicom/dm9000.c | ||
360 | index f1e4cde963d8f..0fe4d89998230 100644 | ||
361 | --- a/drivers/net/ethernet/davicom/dm9000.c | ||
362 | +++ b/drivers/net/ethernet/davicom/dm9000.c | ||
363 | @@ -1481,8 +1481,10 @@ dm9000_probe(struct platform_device *pdev) | ||
364 | |||
365 | /* Init network device */ | ||
366 | ndev = alloc_etherdev(sizeof(struct board_info)); | ||
367 | - if (!ndev) | ||
368 | - return -ENOMEM; | ||
369 | + if (!ndev) { | ||
370 | + ret = -ENOMEM; | ||
371 | + goto out_regulator_disable; | ||
372 | + } | ||
373 | |||
374 | SET_NETDEV_DEV(ndev, &pdev->dev); | ||
375 | |||
376 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
377 | index 043b69b5843b0..40644657b1b74 100644 | ||
378 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
379 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
380 | @@ -8504,6 +8504,7 @@ static int i40e_sw_init(struct i40e_pf *pf) | ||
381 | { | ||
382 | int err = 0; | ||
383 | int size; | ||
384 | + u16 pow; | ||
385 | |||
386 | pf->msg_enable = netif_msg_init(I40E_DEFAULT_MSG_ENABLE, | ||
387 | (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK)); | ||
388 | @@ -8531,6 +8532,11 @@ static int i40e_sw_init(struct i40e_pf *pf) | ||
389 | pf->rss_table_size = pf->hw.func_caps.rss_table_size; | ||
390 | pf->rss_size_max = min_t(int, pf->rss_size_max, | ||
391 | pf->hw.func_caps.num_tx_qp); | ||
392 | + | ||
393 | + /* find the next higher power-of-2 of num cpus */ | ||
394 | + pow = roundup_pow_of_two(num_online_cpus()); | ||
395 | + pf->rss_size_max = min_t(int, pf->rss_size_max, pow); | ||
396 | + | ||
397 | if (pf->hw.func_caps.rss) { | ||
398 | pf->flags |= I40E_FLAG_RSS_ENABLED; | ||
399 | pf->alloc_rss_size = min_t(int, pf->rss_size_max, | ||
400 | diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c | ||
401 | index c4b4c2c347647..6ecccc737974c 100644 | ||
402 | --- a/drivers/net/usb/hso.c | ||
403 | +++ b/drivers/net/usb/hso.c | ||
404 | @@ -626,7 +626,7 @@ static struct hso_serial *get_serial_by_index(unsigned index) | ||
405 | return serial; | ||
406 | } | ||
407 | |||
408 | -static int get_free_serial_index(void) | ||
409 | +static int obtain_minor(struct hso_serial *serial) | ||
410 | { | ||
411 | int index; | ||
412 | unsigned long flags; | ||
413 | @@ -634,8 +634,10 @@ static int get_free_serial_index(void) | ||
414 | spin_lock_irqsave(&serial_table_lock, flags); | ||
415 | for (index = 0; index < HSO_SERIAL_TTY_MINORS; index++) { | ||
416 | if (serial_table[index] == NULL) { | ||
417 | + serial_table[index] = serial->parent; | ||
418 | + serial->minor = index; | ||
419 | spin_unlock_irqrestore(&serial_table_lock, flags); | ||
420 | - return index; | ||
421 | + return 0; | ||
422 | } | ||
423 | } | ||
424 | spin_unlock_irqrestore(&serial_table_lock, flags); | ||
425 | @@ -644,15 +646,12 @@ static int get_free_serial_index(void) | ||
426 | return -1; | ||
427 | } | ||
428 | |||
429 | -static void set_serial_by_index(unsigned index, struct hso_serial *serial) | ||
430 | +static void release_minor(struct hso_serial *serial) | ||
431 | { | ||
432 | unsigned long flags; | ||
433 | |||
434 | spin_lock_irqsave(&serial_table_lock, flags); | ||
435 | - if (serial) | ||
436 | - serial_table[index] = serial->parent; | ||
437 | - else | ||
438 | - serial_table[index] = NULL; | ||
439 | + serial_table[serial->minor] = NULL; | ||
440 | spin_unlock_irqrestore(&serial_table_lock, flags); | ||
441 | } | ||
442 | |||
443 | @@ -2243,6 +2242,7 @@ static int hso_stop_serial_device(struct hso_device *hso_dev) | ||
444 | static void hso_serial_tty_unregister(struct hso_serial *serial) | ||
445 | { | ||
446 | tty_unregister_device(tty_drv, serial->minor); | ||
447 | + release_minor(serial); | ||
448 | } | ||
449 | |||
450 | static void hso_serial_common_free(struct hso_serial *serial) | ||
451 | @@ -2267,25 +2267,23 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs, | ||
452 | int rx_size, int tx_size) | ||
453 | { | ||
454 | struct device *dev; | ||
455 | - int minor; | ||
456 | int i; | ||
457 | |||
458 | tty_port_init(&serial->port); | ||
459 | |||
460 | - minor = get_free_serial_index(); | ||
461 | - if (minor < 0) | ||
462 | + if (obtain_minor(serial)) | ||
463 | goto exit2; | ||
464 | |||
465 | /* register our minor number */ | ||
466 | serial->parent->dev = tty_port_register_device_attr(&serial->port, | ||
467 | - tty_drv, minor, &serial->parent->interface->dev, | ||
468 | + tty_drv, serial->minor, &serial->parent->interface->dev, | ||
469 | serial->parent, hso_serial_dev_groups); | ||
470 | - if (IS_ERR(serial->parent->dev)) | ||
471 | + if (IS_ERR(serial->parent->dev)) { | ||
472 | + release_minor(serial); | ||
473 | goto exit2; | ||
474 | + } | ||
475 | dev = serial->parent->dev; | ||
476 | |||
477 | - /* fill in specific data for later use */ | ||
478 | - serial->minor = minor; | ||
479 | serial->magic = HSO_SERIAL_MAGIC; | ||
480 | spin_lock_init(&serial->serial_lock); | ||
481 | serial->num_rx_urbs = num_urbs; | ||
482 | @@ -2678,9 +2676,6 @@ static struct hso_device *hso_create_bulk_serial_device( | ||
483 | |||
484 | serial->write_data = hso_std_serial_write_data; | ||
485 | |||
486 | - /* and record this serial */ | ||
487 | - set_serial_by_index(serial->minor, serial); | ||
488 | - | ||
489 | /* setup the proc dirs and files if needed */ | ||
490 | hso_log_port(hso_dev); | ||
491 | |||
492 | @@ -2737,9 +2732,6 @@ struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface, | ||
493 | serial->shared_int->ref_count++; | ||
494 | mutex_unlock(&serial->shared_int->shared_int_lock); | ||
495 | |||
496 | - /* and record this serial */ | ||
497 | - set_serial_by_index(serial->minor, serial); | ||
498 | - | ||
499 | /* setup the proc dirs and files if needed */ | ||
500 | hso_log_port(hso_dev); | ||
501 | |||
502 | @@ -3123,8 +3115,7 @@ static void hso_free_interface(struct usb_interface *interface) | ||
503 | cancel_work_sync(&serial_table[i]->async_put_intf); | ||
504 | cancel_work_sync(&serial_table[i]->async_get_intf); | ||
505 | hso_serial_tty_unregister(serial); | ||
506 | - kref_put(&serial_table[i]->ref, hso_serial_ref_free); | ||
507 | - set_serial_by_index(i, NULL); | ||
508 | + kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
509 | } | ||
510 | } | ||
511 | |||
512 | diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c | ||
513 | index 78788402edd8b..e6646c8a7bdbb 100644 | ||
514 | --- a/drivers/net/xen-netback/xenbus.c | ||
515 | +++ b/drivers/net/xen-netback/xenbus.c | ||
516 | @@ -1040,11 +1040,15 @@ static void connect(struct backend_info *be) | ||
517 | xenvif_carrier_on(be->vif); | ||
518 | |||
519 | unregister_hotplug_status_watch(be); | ||
520 | - err = xenbus_watch_pathfmt(dev, &be->hotplug_status_watch, NULL, | ||
521 | - hotplug_status_changed, | ||
522 | - "%s/%s", dev->nodename, "hotplug-status"); | ||
523 | - if (!err) | ||
524 | + if (xenbus_exists(XBT_NIL, dev->nodename, "hotplug-status")) { | ||
525 | + err = xenbus_watch_pathfmt(dev, &be->hotplug_status_watch, | ||
526 | + NULL, hotplug_status_changed, | ||
527 | + "%s/%s", dev->nodename, | ||
528 | + "hotplug-status"); | ||
529 | + if (err) | ||
530 | + goto err; | ||
531 | be->have_hotplug_status_watch = 1; | ||
532 | + } | ||
533 | |||
534 | netif_tx_wake_all_queues(be->vif->dev); | ||
535 | |||
536 | diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c | ||
537 | index b820c3a022eac..8800ff615bdd4 100644 | ||
538 | --- a/drivers/scsi/libsas/sas_ata.c | ||
539 | +++ b/drivers/scsi/libsas/sas_ata.c | ||
540 | @@ -219,18 +219,17 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc) | ||
541 | memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len); | ||
542 | task->total_xfer_len = qc->nbytes; | ||
543 | task->num_scatter = qc->n_elem; | ||
544 | + task->data_dir = qc->dma_dir; | ||
545 | + } else if (qc->tf.protocol == ATA_PROT_NODATA) { | ||
546 | + task->data_dir = DMA_NONE; | ||
547 | } else { | ||
548 | for_each_sg(qc->sg, sg, qc->n_elem, si) | ||
549 | xfer += sg_dma_len(sg); | ||
550 | |||
551 | task->total_xfer_len = xfer; | ||
552 | task->num_scatter = si; | ||
553 | - } | ||
554 | - | ||
555 | - if (qc->tf.protocol == ATA_PROT_NODATA) | ||
556 | - task->data_dir = DMA_NONE; | ||
557 | - else | ||
558 | task->data_dir = qc->dma_dir; | ||
559 | + } | ||
560 | task->scatter = qc->sg; | ||
561 | task->ata_task.retry_count = 1; | ||
562 | task->task_state_flags = SAS_TASK_STATE_PENDING; | ||
563 | diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c | ||
564 | index 6b643e6c8f0bd..cec5805feb254 100644 | ||
565 | --- a/drivers/usb/usbip/stub_dev.c | ||
566 | +++ b/drivers/usb/usbip/stub_dev.c | ||
567 | @@ -77,6 +77,7 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | ||
568 | |||
569 | dev_info(dev, "stub up\n"); | ||
570 | |||
571 | + mutex_lock(&sdev->ud.sysfs_lock); | ||
572 | spin_lock_irq(&sdev->ud.lock); | ||
573 | |||
574 | if (sdev->ud.status != SDEV_ST_AVAILABLE) { | ||
575 | @@ -101,13 +102,13 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | ||
576 | tcp_rx = kthread_create(stub_rx_loop, &sdev->ud, "stub_rx"); | ||
577 | if (IS_ERR(tcp_rx)) { | ||
578 | sockfd_put(socket); | ||
579 | - return -EINVAL; | ||
580 | + goto unlock_mutex; | ||
581 | } | ||
582 | tcp_tx = kthread_create(stub_tx_loop, &sdev->ud, "stub_tx"); | ||
583 | if (IS_ERR(tcp_tx)) { | ||
584 | kthread_stop(tcp_rx); | ||
585 | sockfd_put(socket); | ||
586 | - return -EINVAL; | ||
587 | + goto unlock_mutex; | ||
588 | } | ||
589 | |||
590 | /* get task structs now */ | ||
591 | @@ -126,6 +127,8 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | ||
592 | wake_up_process(sdev->ud.tcp_rx); | ||
593 | wake_up_process(sdev->ud.tcp_tx); | ||
594 | |||
595 | + mutex_unlock(&sdev->ud.sysfs_lock); | ||
596 | + | ||
597 | } else { | ||
598 | dev_info(dev, "stub down\n"); | ||
599 | |||
600 | @@ -136,6 +139,7 @@ static ssize_t store_sockfd(struct device *dev, struct device_attribute *attr, | ||
601 | spin_unlock_irq(&sdev->ud.lock); | ||
602 | |||
603 | usbip_event_add(&sdev->ud, SDEV_EVENT_DOWN); | ||
604 | + mutex_unlock(&sdev->ud.sysfs_lock); | ||
605 | } | ||
606 | |||
607 | return count; | ||
608 | @@ -144,6 +148,8 @@ sock_err: | ||
609 | sockfd_put(socket); | ||
610 | err: | ||
611 | spin_unlock_irq(&sdev->ud.lock); | ||
612 | +unlock_mutex: | ||
613 | + mutex_unlock(&sdev->ud.sysfs_lock); | ||
614 | return -EINVAL; | ||
615 | } | ||
616 | static DEVICE_ATTR(usbip_sockfd, S_IWUSR, NULL, store_sockfd); | ||
617 | @@ -309,6 +315,7 @@ static struct stub_device *stub_device_alloc(struct usb_device *udev) | ||
618 | sdev->ud.side = USBIP_STUB; | ||
619 | sdev->ud.status = SDEV_ST_AVAILABLE; | ||
620 | spin_lock_init(&sdev->ud.lock); | ||
621 | + mutex_init(&sdev->ud.sysfs_lock); | ||
622 | sdev->ud.tcp_socket = NULL; | ||
623 | sdev->ud.sockfd = -1; | ||
624 | |||
625 | diff --git a/drivers/usb/usbip/usbip_common.h b/drivers/usb/usbip/usbip_common.h | ||
626 | index 0b199a2664c00..3d47c681aea2f 100644 | ||
627 | --- a/drivers/usb/usbip/usbip_common.h | ||
628 | +++ b/drivers/usb/usbip/usbip_common.h | ||
629 | @@ -278,6 +278,9 @@ struct usbip_device { | ||
630 | /* lock for status */ | ||
631 | spinlock_t lock; | ||
632 | |||
633 | + /* mutex for synchronizing sysfs store paths */ | ||
634 | + struct mutex sysfs_lock; | ||
635 | + | ||
636 | int sockfd; | ||
637 | struct socket *tcp_socket; | ||
638 | |||
639 | diff --git a/drivers/usb/usbip/usbip_event.c b/drivers/usb/usbip/usbip_event.c | ||
640 | index f8f7f3803a99c..01eaae1f265b2 100644 | ||
641 | --- a/drivers/usb/usbip/usbip_event.c | ||
642 | +++ b/drivers/usb/usbip/usbip_event.c | ||
643 | @@ -84,6 +84,7 @@ static void event_handler(struct work_struct *work) | ||
644 | while ((ud = get_event()) != NULL) { | ||
645 | usbip_dbg_eh("pending event %lx\n", ud->event); | ||
646 | |||
647 | + mutex_lock(&ud->sysfs_lock); | ||
648 | /* | ||
649 | * NOTE: shutdown must come first. | ||
650 | * Shutdown the device. | ||
651 | @@ -104,6 +105,7 @@ static void event_handler(struct work_struct *work) | ||
652 | ud->eh_ops.unusable(ud); | ||
653 | unset_event(ud, USBIP_EH_UNUSABLE); | ||
654 | } | ||
655 | + mutex_unlock(&ud->sysfs_lock); | ||
656 | |||
657 | wake_up(&ud->eh_waitq); | ||
658 | } | ||
659 | diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c | ||
660 | index 8bda6455dfcb2..fb7b03029b8e6 100644 | ||
661 | --- a/drivers/usb/usbip/vhci_hcd.c | ||
662 | +++ b/drivers/usb/usbip/vhci_hcd.c | ||
663 | @@ -907,6 +907,7 @@ static void vhci_device_init(struct vhci_device *vdev) | ||
664 | vdev->ud.side = USBIP_VHCI; | ||
665 | vdev->ud.status = VDEV_ST_NULL; | ||
666 | spin_lock_init(&vdev->ud.lock); | ||
667 | + mutex_init(&vdev->ud.sysfs_lock); | ||
668 | |||
669 | INIT_LIST_HEAD(&vdev->priv_rx); | ||
670 | INIT_LIST_HEAD(&vdev->priv_tx); | ||
671 | diff --git a/drivers/usb/usbip/vhci_sysfs.c b/drivers/usb/usbip/vhci_sysfs.c | ||
672 | index ca00d38d22afd..3496b402aa1b7 100644 | ||
673 | --- a/drivers/usb/usbip/vhci_sysfs.c | ||
674 | +++ b/drivers/usb/usbip/vhci_sysfs.c | ||
675 | @@ -161,6 +161,8 @@ static int vhci_port_disconnect(struct vhci_hcd *vhci, __u32 rhport) | ||
676 | |||
677 | usbip_dbg_vhci_sysfs("enter\n"); | ||
678 | |||
679 | + mutex_lock(&vdev->ud.sysfs_lock); | ||
680 | + | ||
681 | /* lock */ | ||
682 | spin_lock_irqsave(&vhci->lock, flags); | ||
683 | spin_lock(&vdev->ud.lock); | ||
684 | @@ -171,6 +173,7 @@ static int vhci_port_disconnect(struct vhci_hcd *vhci, __u32 rhport) | ||
685 | /* unlock */ | ||
686 | spin_unlock(&vdev->ud.lock); | ||
687 | spin_unlock_irqrestore(&vhci->lock, flags); | ||
688 | + mutex_unlock(&vdev->ud.sysfs_lock); | ||
689 | |||
690 | return -EINVAL; | ||
691 | } | ||
692 | @@ -181,6 +184,8 @@ static int vhci_port_disconnect(struct vhci_hcd *vhci, __u32 rhport) | ||
693 | |||
694 | usbip_event_add(&vdev->ud, VDEV_EVENT_DOWN); | ||
695 | |||
696 | + mutex_unlock(&vdev->ud.sysfs_lock); | ||
697 | + | ||
698 | return 0; | ||
699 | } | ||
700 | |||
701 | @@ -309,30 +314,36 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | ||
702 | vhci = hcd_to_vhci(hcd); | ||
703 | vdev = &vhci->vdev[rhport]; | ||
704 | |||
705 | + mutex_lock(&vdev->ud.sysfs_lock); | ||
706 | + | ||
707 | /* Extract socket from fd. */ | ||
708 | socket = sockfd_lookup(sockfd, &err); | ||
709 | if (!socket) { | ||
710 | dev_err(dev, "failed to lookup sock"); | ||
711 | - return -EINVAL; | ||
712 | + err = -EINVAL; | ||
713 | + goto unlock_mutex; | ||
714 | } | ||
715 | if (socket->type != SOCK_STREAM) { | ||
716 | dev_err(dev, "Expecting SOCK_STREAM - found %d", | ||
717 | socket->type); | ||
718 | sockfd_put(socket); | ||
719 | - return -EINVAL; | ||
720 | + err = -EINVAL; | ||
721 | + goto unlock_mutex; | ||
722 | } | ||
723 | |||
724 | /* create threads before locking */ | ||
725 | tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx"); | ||
726 | if (IS_ERR(tcp_rx)) { | ||
727 | sockfd_put(socket); | ||
728 | - return -EINVAL; | ||
729 | + err = -EINVAL; | ||
730 | + goto unlock_mutex; | ||
731 | } | ||
732 | tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx"); | ||
733 | if (IS_ERR(tcp_tx)) { | ||
734 | kthread_stop(tcp_rx); | ||
735 | sockfd_put(socket); | ||
736 | - return -EINVAL; | ||
737 | + err = -EINVAL; | ||
738 | + goto unlock_mutex; | ||
739 | } | ||
740 | |||
741 | /* get task structs now */ | ||
742 | @@ -353,7 +364,8 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | ||
743 | kthread_stop_put(tcp_tx); | ||
744 | |||
745 | dev_err(dev, "port %d already used\n", rhport); | ||
746 | - return -EINVAL; | ||
747 | + err = -EINVAL; | ||
748 | + goto unlock_mutex; | ||
749 | } | ||
750 | |||
751 | dev_info(dev, "pdev(%u) rhport(%u) sockfd(%d)\n", | ||
752 | @@ -378,7 +390,15 @@ static ssize_t store_attach(struct device *dev, struct device_attribute *attr, | ||
753 | |||
754 | rh_port_connect(vdev, speed); | ||
755 | |||
756 | + dev_info(dev, "Device attached\n"); | ||
757 | + | ||
758 | + mutex_unlock(&vdev->ud.sysfs_lock); | ||
759 | + | ||
760 | return count; | ||
761 | + | ||
762 | +unlock_mutex: | ||
763 | + mutex_unlock(&vdev->ud.sysfs_lock); | ||
764 | + return err; | ||
765 | } | ||
766 | static DEVICE_ATTR(attach, S_IWUSR, NULL, store_attach); | ||
767 | |||
768 | diff --git a/drivers/usb/usbip/vudc_dev.c b/drivers/usb/usbip/vudc_dev.c | ||
769 | index 7091848df6c8b..d61b22bb1d8bb 100644 | ||
770 | --- a/drivers/usb/usbip/vudc_dev.c | ||
771 | +++ b/drivers/usb/usbip/vudc_dev.c | ||
772 | @@ -582,6 +582,7 @@ static int init_vudc_hw(struct vudc *udc) | ||
773 | init_waitqueue_head(&udc->tx_waitq); | ||
774 | |||
775 | spin_lock_init(&ud->lock); | ||
776 | + mutex_init(&ud->sysfs_lock); | ||
777 | ud->status = SDEV_ST_AVAILABLE; | ||
778 | ud->side = USBIP_VUDC; | ||
779 | |||
780 | diff --git a/drivers/usb/usbip/vudc_sysfs.c b/drivers/usb/usbip/vudc_sysfs.c | ||
781 | index f44d98eeb36ac..0a4482ced945e 100644 | ||
782 | --- a/drivers/usb/usbip/vudc_sysfs.c | ||
783 | +++ b/drivers/usb/usbip/vudc_sysfs.c | ||
784 | @@ -125,6 +125,7 @@ static ssize_t store_sockfd(struct device *dev, | ||
785 | dev_err(dev, "no device"); | ||
786 | return -ENODEV; | ||
787 | } | ||
788 | + mutex_lock(&udc->ud.sysfs_lock); | ||
789 | spin_lock_irqsave(&udc->lock, flags); | ||
790 | /* Don't export what we don't have */ | ||
791 | if (!udc->driver || !udc->pullup) { | ||
792 | @@ -187,7 +188,7 @@ static ssize_t store_sockfd(struct device *dev, | ||
793 | |||
794 | udc->ud.tcp_socket = socket; | ||
795 | udc->ud.tcp_rx = tcp_rx; | ||
796 | - udc->ud.tcp_rx = tcp_tx; | ||
797 | + udc->ud.tcp_tx = tcp_tx; | ||
798 | udc->ud.status = SDEV_ST_USED; | ||
799 | |||
800 | spin_unlock_irq(&udc->ud.lock); | ||
801 | @@ -200,6 +201,8 @@ static ssize_t store_sockfd(struct device *dev, | ||
802 | |||
803 | wake_up_process(udc->ud.tcp_rx); | ||
804 | wake_up_process(udc->ud.tcp_tx); | ||
805 | + | ||
806 | + mutex_unlock(&udc->ud.sysfs_lock); | ||
807 | return count; | ||
808 | |||
809 | } else { | ||
810 | @@ -220,6 +223,7 @@ static ssize_t store_sockfd(struct device *dev, | ||
811 | } | ||
812 | |||
813 | spin_unlock_irqrestore(&udc->lock, flags); | ||
814 | + mutex_unlock(&udc->ud.sysfs_lock); | ||
815 | |||
816 | return count; | ||
817 | |||
818 | @@ -229,6 +233,7 @@ unlock_ud: | ||
819 | spin_unlock_irq(&udc->ud.lock); | ||
820 | unlock: | ||
821 | spin_unlock_irqrestore(&udc->lock, flags); | ||
822 | + mutex_unlock(&udc->ud.sysfs_lock); | ||
823 | |||
824 | return ret; | ||
825 | } | ||
826 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
827 | index bbda3ea7039f3..4d9901a18b975 100644 | ||
828 | --- a/fs/ext4/namei.c | ||
829 | +++ b/fs/ext4/namei.c | ||
830 | @@ -3621,7 +3621,7 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | ||
831 | ext4_encrypted_inode(new.dir) && | ||
832 | !fscrypt_has_permitted_context(new.dir, old.inode)) { | ||
833 | retval = -EXDEV; | ||
834 | - goto end_rename; | ||
835 | + goto release_bh; | ||
836 | } | ||
837 | |||
838 | new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, | ||
839 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c | ||
840 | index d267dc04d9f74..2aa5c231560d2 100644 | ||
841 | --- a/net/core/neighbour.c | ||
842 | +++ b/net/core/neighbour.c | ||
843 | @@ -1230,7 +1230,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, | ||
844 | * we can reinject the packet there. | ||
845 | */ | ||
846 | n2 = NULL; | ||
847 | - if (dst) { | ||
848 | + if (dst && dst->obsolete != DST_OBSOLETE_DEAD) { | ||
849 | n2 = dst_neigh_lookup_skb(dst, skb); | ||
850 | if (n2) | ||
851 | n1 = n2; | ||
852 | diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c | ||
853 | index f07a208ae21fe..cfc01314958f7 100644 | ||
854 | --- a/net/ieee802154/nl802154.c | ||
855 | +++ b/net/ieee802154/nl802154.c | ||
856 | @@ -1531,6 +1531,11 @@ nl802154_dump_llsec_key(struct sk_buff *skb, struct netlink_callback *cb) | ||
857 | if (err) | ||
858 | return err; | ||
859 | |||
860 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) { | ||
861 | + err = skb->len; | ||
862 | + goto out_err; | ||
863 | + } | ||
864 | + | ||
865 | if (!wpan_dev->netdev) { | ||
866 | err = -EINVAL; | ||
867 | goto out_err; | ||
868 | @@ -1703,6 +1708,11 @@ nl802154_dump_llsec_dev(struct sk_buff *skb, struct netlink_callback *cb) | ||
869 | if (err) | ||
870 | return err; | ||
871 | |||
872 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) { | ||
873 | + err = skb->len; | ||
874 | + goto out_err; | ||
875 | + } | ||
876 | + | ||
877 | if (!wpan_dev->netdev) { | ||
878 | err = -EINVAL; | ||
879 | goto out_err; | ||
880 | @@ -1790,6 +1800,9 @@ static int nl802154_add_llsec_dev(struct sk_buff *skb, struct genl_info *info) | ||
881 | struct wpan_dev *wpan_dev = dev->ieee802154_ptr; | ||
882 | struct ieee802154_llsec_device dev_desc; | ||
883 | |||
884 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) | ||
885 | + return -EOPNOTSUPP; | ||
886 | + | ||
887 | if (ieee802154_llsec_parse_device(info->attrs[NL802154_ATTR_SEC_DEVICE], | ||
888 | &dev_desc) < 0) | ||
889 | return -EINVAL; | ||
890 | @@ -1876,6 +1889,11 @@ nl802154_dump_llsec_devkey(struct sk_buff *skb, struct netlink_callback *cb) | ||
891 | if (err) | ||
892 | return err; | ||
893 | |||
894 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) { | ||
895 | + err = skb->len; | ||
896 | + goto out_err; | ||
897 | + } | ||
898 | + | ||
899 | if (!wpan_dev->netdev) { | ||
900 | err = -EINVAL; | ||
901 | goto out_err; | ||
902 | @@ -1933,6 +1951,9 @@ static int nl802154_add_llsec_devkey(struct sk_buff *skb, struct genl_info *info | ||
903 | struct ieee802154_llsec_device_key key; | ||
904 | __le64 extended_addr; | ||
905 | |||
906 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) | ||
907 | + return -EOPNOTSUPP; | ||
908 | + | ||
909 | if (!info->attrs[NL802154_ATTR_SEC_DEVKEY] || | ||
910 | nla_parse_nested(attrs, NL802154_DEVKEY_ATTR_MAX, | ||
911 | info->attrs[NL802154_ATTR_SEC_DEVKEY], | ||
912 | @@ -2042,6 +2063,11 @@ nl802154_dump_llsec_seclevel(struct sk_buff *skb, struct netlink_callback *cb) | ||
913 | if (err) | ||
914 | return err; | ||
915 | |||
916 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) { | ||
917 | + err = skb->len; | ||
918 | + goto out_err; | ||
919 | + } | ||
920 | + | ||
921 | if (!wpan_dev->netdev) { | ||
922 | err = -EINVAL; | ||
923 | goto out_err; | ||
924 | @@ -2127,6 +2153,9 @@ static int nl802154_add_llsec_seclevel(struct sk_buff *skb, | ||
925 | struct wpan_dev *wpan_dev = dev->ieee802154_ptr; | ||
926 | struct ieee802154_llsec_seclevel sl; | ||
927 | |||
928 | + if (wpan_dev->iftype == NL802154_IFTYPE_MONITOR) | ||
929 | + return -EOPNOTSUPP; | ||
930 | + | ||
931 | if (llsec_parse_seclevel(info->attrs[NL802154_ATTR_SEC_LEVEL], | ||
932 | &sl) < 0) | ||
933 | return -EINVAL; | ||
934 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c | ||
935 | index a4a5863e482cd..157358a15d599 100644 | ||
936 | --- a/net/ipv6/sit.c | ||
937 | +++ b/net/ipv6/sit.c | ||
938 | @@ -1799,9 +1799,9 @@ static void __net_exit sit_destroy_tunnels(struct net *net, | ||
939 | if (dev->rtnl_link_ops == &sit_link_ops) | ||
940 | unregister_netdevice_queue(dev, head); | ||
941 | |||
942 | - for (prio = 1; prio < 4; prio++) { | ||
943 | + for (prio = 0; prio < 4; prio++) { | ||
944 | int h; | ||
945 | - for (h = 0; h < IP6_SIT_HASH_SIZE; h++) { | ||
946 | + for (h = 0; h < (prio ? IP6_SIT_HASH_SIZE : 1); h++) { | ||
947 | struct ip_tunnel *t; | ||
948 | |||
949 | t = rtnl_dereference(sitn->tunnels[prio][h]); | ||
950 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
951 | index c0fe647dd4acb..029ec12c77bd7 100644 | ||
952 | --- a/net/sctp/socket.c | ||
953 | +++ b/net/sctp/socket.c | ||
954 | @@ -1582,11 +1582,9 @@ static void sctp_close(struct sock *sk, long timeout) | ||
955 | |||
956 | /* Supposedly, no process has access to the socket, but | ||
957 | * the net layers still may. | ||
958 | - * Also, sctp_destroy_sock() needs to be called with addr_wq_lock | ||
959 | - * held and that should be grabbed before socket lock. | ||
960 | */ | ||
961 | - spin_lock_bh(&net->sctp.addr_wq_lock); | ||
962 | - bh_lock_sock_nested(sk); | ||
963 | + local_bh_disable(); | ||
964 | + bh_lock_sock(sk); | ||
965 | |||
966 | /* Hold the sock, since sk_common_release() will put sock_put() | ||
967 | * and we have just a little more cleanup. | ||
968 | @@ -1595,7 +1593,7 @@ static void sctp_close(struct sock *sk, long timeout) | ||
969 | sk_common_release(sk); | ||
970 | |||
971 | bh_unlock_sock(sk); | ||
972 | - spin_unlock_bh(&net->sctp.addr_wq_lock); | ||
973 | + local_bh_enable(); | ||
974 | |||
975 | sock_put(sk); | ||
976 | |||
977 | @@ -4262,9 +4260,6 @@ static int sctp_init_sock(struct sock *sk) | ||
978 | sk_sockets_allocated_inc(sk); | ||
979 | sock_prot_inuse_add(net, sk->sk_prot, 1); | ||
980 | |||
981 | - /* Nothing can fail after this block, otherwise | ||
982 | - * sctp_destroy_sock() will be called without addr_wq_lock held | ||
983 | - */ | ||
984 | if (net->sctp.default_auto_asconf) { | ||
985 | spin_lock(&sock_net(sk)->sctp.addr_wq_lock); | ||
986 | list_add_tail(&sp->auto_asconf_list, | ||
987 | @@ -4299,7 +4294,9 @@ static void sctp_destroy_sock(struct sock *sk) | ||
988 | |||
989 | if (sp->do_auto_asconf) { | ||
990 | sp->do_auto_asconf = 0; | ||
991 | + spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock); | ||
992 | list_del(&sp->auto_asconf_list); | ||
993 | + spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock); | ||
994 | } | ||
995 | sctp_endpoint_free(sp->ep); | ||
996 | local_bh_disable(); | ||
997 | diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c | ||
998 | index fa64cc2b1729f..94bf497092b20 100644 | ||
999 | --- a/sound/soc/fsl/fsl_esai.c | ||
1000 | +++ b/sound/soc/fsl/fsl_esai.c | ||
1001 | @@ -495,11 +495,13 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream, | ||
1002 | ESAI_SAICR_SYNC, esai_priv->synchronous ? | ||
1003 | ESAI_SAICR_SYNC : 0); | ||
1004 | |||
1005 | - /* Set a default slot number -- 2 */ | ||
1006 | + /* Set slots count */ | ||
1007 | regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR, | ||
1008 | - ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(2)); | ||
1009 | + ESAI_xCCR_xDC_MASK, | ||
1010 | + ESAI_xCCR_xDC(esai_priv->slots)); | ||
1011 | regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, | ||
1012 | - ESAI_xCCR_xDC_MASK, ESAI_xCCR_xDC(2)); | ||
1013 | + ESAI_xCCR_xDC_MASK, | ||
1014 | + ESAI_xCCR_xDC(esai_priv->slots)); | ||
1015 | } | ||
1016 | |||
1017 | return 0; | ||
1018 | diff --git a/tools/arch/ia64/include/asm/barrier.h b/tools/arch/ia64/include/asm/barrier.h | ||
1019 | index e4422b4b634e6..94ae4a333a35f 100644 | ||
1020 | --- a/tools/arch/ia64/include/asm/barrier.h | ||
1021 | +++ b/tools/arch/ia64/include/asm/barrier.h | ||
1022 | @@ -38,9 +38,6 @@ | ||
1023 | * sequential memory pages only. | ||
1024 | */ | ||
1025 | |||
1026 | -/* XXX From arch/ia64/include/uapi/asm/gcc_intrin.h */ | ||
1027 | -#define ia64_mf() asm volatile ("mf" ::: "memory") | ||
1028 | - | ||
1029 | #define mb() ia64_mf() | ||
1030 | #define rmb() mb() | ||
1031 | #define wmb() mb() |