1 |
commit: 93861e4fd29bb4696b4649477a425761eb394c8b |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sat Sep 15 10:09:16 2018 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Nov 21 15:01:30 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=93861e4f |
7 |
|
8 |
Linux patch 4.4.156 |
9 |
|
10 |
Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> |
11 |
|
12 |
0000_README | 4 + |
13 |
1155_linux-4.4.156.patch | 1864 ++++++++++++++++++++++++++++++++++++++++++++++ |
14 |
2 files changed, 1868 insertions(+) |
15 |
|
16 |
diff --git a/0000_README b/0000_README |
17 |
index 6b63ef8..6a3a701 100644 |
18 |
--- a/0000_README |
19 |
+++ b/0000_README |
20 |
@@ -663,6 +663,10 @@ Patch: 1154_linux-4.4.155.patch |
21 |
From: http://www.kernel.org |
22 |
Desc: Linux 4.4.155 |
23 |
|
24 |
+Patch: 1155_linux-4.4.156.patch |
25 |
+From: http://www.kernel.org |
26 |
+Desc: Linux 4.4.156 |
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/1155_linux-4.4.156.patch b/1155_linux-4.4.156.patch |
33 |
new file mode 100644 |
34 |
index 0000000..9615eee |
35 |
--- /dev/null |
36 |
+++ b/1155_linux-4.4.156.patch |
37 |
@@ -0,0 +1,1864 @@ |
38 |
+diff --git a/Makefile b/Makefile |
39 |
+index 2d9f89ec8397..6dd5924a7ea5 100644 |
40 |
+--- a/Makefile |
41 |
++++ b/Makefile |
42 |
+@@ -1,6 +1,6 @@ |
43 |
+ VERSION = 4 |
44 |
+ PATCHLEVEL = 4 |
45 |
+-SUBLEVEL = 155 |
46 |
++SUBLEVEL = 156 |
47 |
+ EXTRAVERSION = |
48 |
+ NAME = Blurry Fish Butt |
49 |
+ |
50 |
+diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig |
51 |
+index b3490c1c49d1..4187f69f6630 100644 |
52 |
+--- a/arch/arm/configs/imx_v6_v7_defconfig |
53 |
++++ b/arch/arm/configs/imx_v6_v7_defconfig |
54 |
+@@ -261,7 +261,6 @@ CONFIG_USB_STORAGE=y |
55 |
+ CONFIG_USB_CHIPIDEA=y |
56 |
+ CONFIG_USB_CHIPIDEA_UDC=y |
57 |
+ CONFIG_USB_CHIPIDEA_HOST=y |
58 |
+-CONFIG_USB_CHIPIDEA_ULPI=y |
59 |
+ CONFIG_USB_SERIAL=m |
60 |
+ CONFIG_USB_SERIAL_GENERIC=y |
61 |
+ CONFIG_USB_SERIAL_FTDI_SIO=m |
62 |
+@@ -288,7 +287,6 @@ CONFIG_USB_G_NCM=m |
63 |
+ CONFIG_USB_GADGETFS=m |
64 |
+ CONFIG_USB_MASS_STORAGE=m |
65 |
+ CONFIG_USB_G_SERIAL=m |
66 |
+-CONFIG_USB_ULPI_BUS=y |
67 |
+ CONFIG_MMC=y |
68 |
+ CONFIG_MMC_SDHCI=y |
69 |
+ CONFIG_MMC_SDHCI_PLTFM=y |
70 |
+diff --git a/arch/arm/include/asm/arch_gicv3.h b/arch/arm/include/asm/arch_gicv3.h |
71 |
+index 7da5503c0591..e08d15184056 100644 |
72 |
+--- a/arch/arm/include/asm/arch_gicv3.h |
73 |
++++ b/arch/arm/include/asm/arch_gicv3.h |
74 |
+@@ -117,6 +117,7 @@ static inline u32 gic_read_iar(void) |
75 |
+ u32 irqstat; |
76 |
+ |
77 |
+ asm volatile("mrc " __stringify(ICC_IAR1) : "=r" (irqstat)); |
78 |
++ dsb(sy); |
79 |
+ return irqstat; |
80 |
+ } |
81 |
+ |
82 |
+diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c |
83 |
+index f5313a78e5d6..9795e52bab3d 100644 |
84 |
+--- a/arch/powerpc/platforms/pseries/ras.c |
85 |
++++ b/arch/powerpc/platforms/pseries/ras.c |
86 |
+@@ -311,7 +311,7 @@ static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs) |
87 |
+ int len, error_log_length; |
88 |
+ |
89 |
+ error_log_length = 8 + rtas_error_extended_log_length(h); |
90 |
+- len = max_t(int, error_log_length, RTAS_ERROR_LOG_MAX); |
91 |
++ len = min_t(int, error_log_length, RTAS_ERROR_LOG_MAX); |
92 |
+ memset(global_mce_data_buf, 0, RTAS_ERROR_LOG_MAX); |
93 |
+ memcpy(global_mce_data_buf, h, len); |
94 |
+ errhdr = (struct rtas_error_log *)global_mce_data_buf; |
95 |
+diff --git a/arch/powerpc/sysdev/mpic_msgr.c b/arch/powerpc/sysdev/mpic_msgr.c |
96 |
+index 3f165d972a0e..994fe73c2ed0 100644 |
97 |
+--- a/arch/powerpc/sysdev/mpic_msgr.c |
98 |
++++ b/arch/powerpc/sysdev/mpic_msgr.c |
99 |
+@@ -196,7 +196,7 @@ static int mpic_msgr_probe(struct platform_device *dev) |
100 |
+ |
101 |
+ /* IO map the message register block. */ |
102 |
+ of_address_to_resource(np, 0, &rsrc); |
103 |
+- msgr_block_addr = ioremap(rsrc.start, rsrc.end - rsrc.start); |
104 |
++ msgr_block_addr = ioremap(rsrc.start, resource_size(&rsrc)); |
105 |
+ if (!msgr_block_addr) { |
106 |
+ dev_err(&dev->dev, "Failed to iomap MPIC message registers"); |
107 |
+ return -EFAULT; |
108 |
+diff --git a/arch/s390/lib/mem.S b/arch/s390/lib/mem.S |
109 |
+index 16c5998b9792..4254c477e8e0 100644 |
110 |
+--- a/arch/s390/lib/mem.S |
111 |
++++ b/arch/s390/lib/mem.S |
112 |
+@@ -26,7 +26,7 @@ |
113 |
+ */ |
114 |
+ ENTRY(memset) |
115 |
+ ltgr %r4,%r4 |
116 |
+- bzr %r14 |
117 |
++ jz .Lmemset_exit |
118 |
+ ltgr %r3,%r3 |
119 |
+ jnz .Lmemset_fill |
120 |
+ aghi %r4,-1 |
121 |
+@@ -41,12 +41,13 @@ ENTRY(memset) |
122 |
+ .Lmemset_clear_rest: |
123 |
+ larl %r3,.Lmemset_xc |
124 |
+ ex %r4,0(%r3) |
125 |
++.Lmemset_exit: |
126 |
+ BR_EX %r14 |
127 |
+ .Lmemset_fill: |
128 |
+ stc %r3,0(%r2) |
129 |
+ cghi %r4,1 |
130 |
+ lgr %r1,%r2 |
131 |
+- ber %r14 |
132 |
++ je .Lmemset_fill_exit |
133 |
+ aghi %r4,-2 |
134 |
+ srlg %r3,%r4,8 |
135 |
+ ltgr %r3,%r3 |
136 |
+@@ -58,6 +59,7 @@ ENTRY(memset) |
137 |
+ .Lmemset_fill_rest: |
138 |
+ larl %r3,.Lmemset_mvc |
139 |
+ ex %r4,0(%r3) |
140 |
++.Lmemset_fill_exit: |
141 |
+ BR_EX %r14 |
142 |
+ .Lmemset_xc: |
143 |
+ xc 0(1,%r1),0(%r1) |
144 |
+@@ -71,7 +73,7 @@ ENTRY(memset) |
145 |
+ */ |
146 |
+ ENTRY(memcpy) |
147 |
+ ltgr %r4,%r4 |
148 |
+- bzr %r14 |
149 |
++ jz .Lmemcpy_exit |
150 |
+ aghi %r4,-1 |
151 |
+ srlg %r5,%r4,8 |
152 |
+ ltgr %r5,%r5 |
153 |
+@@ -80,6 +82,7 @@ ENTRY(memcpy) |
154 |
+ .Lmemcpy_rest: |
155 |
+ larl %r5,.Lmemcpy_mvc |
156 |
+ ex %r4,0(%r5) |
157 |
++.Lmemcpy_exit: |
158 |
+ BR_EX %r14 |
159 |
+ .Lmemcpy_loop: |
160 |
+ mvc 0(256,%r1),0(%r3) |
161 |
+diff --git a/arch/x86/include/asm/pgtable-3level.h b/arch/x86/include/asm/pgtable-3level.h |
162 |
+index 5c686382d84b..095dbc25122a 100644 |
163 |
+--- a/arch/x86/include/asm/pgtable-3level.h |
164 |
++++ b/arch/x86/include/asm/pgtable-3level.h |
165 |
+@@ -1,6 +1,8 @@ |
166 |
+ #ifndef _ASM_X86_PGTABLE_3LEVEL_H |
167 |
+ #define _ASM_X86_PGTABLE_3LEVEL_H |
168 |
+ |
169 |
++#include <asm/atomic64_32.h> |
170 |
++ |
171 |
+ /* |
172 |
+ * Intel Physical Address Extension (PAE) Mode - three-level page |
173 |
+ * tables on PPro+ CPUs. |
174 |
+@@ -142,10 +144,7 @@ static inline pte_t native_ptep_get_and_clear(pte_t *ptep) |
175 |
+ { |
176 |
+ pte_t res; |
177 |
+ |
178 |
+- /* xchg acts as a barrier before the setting of the high bits */ |
179 |
+- res.pte_low = xchg(&ptep->pte_low, 0); |
180 |
+- res.pte_high = ptep->pte_high; |
181 |
+- ptep->pte_high = 0; |
182 |
++ res.pte = (pteval_t)atomic64_xchg((atomic64_t *)ptep, 0); |
183 |
+ |
184 |
+ return res; |
185 |
+ } |
186 |
+diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h |
187 |
+index 68a55273ce0f..a67d7f210b7c 100644 |
188 |
+--- a/arch/x86/include/asm/pgtable.h |
189 |
++++ b/arch/x86/include/asm/pgtable.h |
190 |
+@@ -385,7 +385,7 @@ static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot) |
191 |
+ |
192 |
+ static inline pud_t pfn_pud(unsigned long page_nr, pgprot_t pgprot) |
193 |
+ { |
194 |
+- phys_addr_t pfn = page_nr << PAGE_SHIFT; |
195 |
++ phys_addr_t pfn = (phys_addr_t)page_nr << PAGE_SHIFT; |
196 |
+ pfn ^= protnone_mask(pgprot_val(pgprot)); |
197 |
+ pfn &= PHYSICAL_PUD_PAGE_MASK; |
198 |
+ return __pud(pfn | massage_pgprot(pgprot)); |
199 |
+diff --git a/drivers/irqchip/irq-bcm7038-l1.c b/drivers/irqchip/irq-bcm7038-l1.c |
200 |
+index d7af88534971..6fb34bf0f352 100644 |
201 |
+--- a/drivers/irqchip/irq-bcm7038-l1.c |
202 |
++++ b/drivers/irqchip/irq-bcm7038-l1.c |
203 |
+@@ -216,6 +216,7 @@ static int bcm7038_l1_set_affinity(struct irq_data *d, |
204 |
+ return 0; |
205 |
+ } |
206 |
+ |
207 |
++#ifdef CONFIG_SMP |
208 |
+ static void bcm7038_l1_cpu_offline(struct irq_data *d) |
209 |
+ { |
210 |
+ struct cpumask *mask = irq_data_get_affinity_mask(d); |
211 |
+@@ -240,6 +241,7 @@ static void bcm7038_l1_cpu_offline(struct irq_data *d) |
212 |
+ } |
213 |
+ irq_set_affinity_locked(d, &new_affinity, false); |
214 |
+ } |
215 |
++#endif |
216 |
+ |
217 |
+ static int __init bcm7038_l1_init_one(struct device_node *dn, |
218 |
+ unsigned int idx, |
219 |
+@@ -292,7 +294,9 @@ static struct irq_chip bcm7038_l1_irq_chip = { |
220 |
+ .irq_mask = bcm7038_l1_mask, |
221 |
+ .irq_unmask = bcm7038_l1_unmask, |
222 |
+ .irq_set_affinity = bcm7038_l1_set_affinity, |
223 |
++#ifdef CONFIG_SMP |
224 |
+ .irq_cpu_offline = bcm7038_l1_cpu_offline, |
225 |
++#endif |
226 |
+ }; |
227 |
+ |
228 |
+ static int bcm7038_l1_map(struct irq_domain *d, unsigned int virq, |
229 |
+diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c |
230 |
+index 82e00e3ad0e0..c3d7a1461043 100644 |
231 |
+--- a/drivers/irqchip/irq-gic-v3-its.c |
232 |
++++ b/drivers/irqchip/irq-gic-v3-its.c |
233 |
+@@ -67,7 +67,10 @@ struct its_node { |
234 |
+ unsigned long phys_base; |
235 |
+ struct its_cmd_block *cmd_base; |
236 |
+ struct its_cmd_block *cmd_write; |
237 |
+- void *tables[GITS_BASER_NR_REGS]; |
238 |
++ struct { |
239 |
++ void *base; |
240 |
++ u32 order; |
241 |
++ } tables[GITS_BASER_NR_REGS]; |
242 |
+ struct its_collection *collections; |
243 |
+ struct list_head its_device_list; |
244 |
+ u64 flags; |
245 |
+@@ -77,6 +80,9 @@ struct its_node { |
246 |
+ |
247 |
+ #define ITS_ITT_ALIGN SZ_256 |
248 |
+ |
249 |
++/* Convert page order to size in bytes */ |
250 |
++#define PAGE_ORDER_TO_SIZE(o) (PAGE_SIZE << (o)) |
251 |
++ |
252 |
+ struct event_lpi_map { |
253 |
+ unsigned long *lpi_map; |
254 |
+ u16 *col_map; |
255 |
+@@ -816,9 +822,10 @@ static void its_free_tables(struct its_node *its) |
256 |
+ int i; |
257 |
+ |
258 |
+ for (i = 0; i < GITS_BASER_NR_REGS; i++) { |
259 |
+- if (its->tables[i]) { |
260 |
+- free_page((unsigned long)its->tables[i]); |
261 |
+- its->tables[i] = NULL; |
262 |
++ if (its->tables[i].base) { |
263 |
++ free_pages((unsigned long)its->tables[i].base, |
264 |
++ its->tables[i].order); |
265 |
++ its->tables[i].base = NULL; |
266 |
+ } |
267 |
+ } |
268 |
+ } |
269 |
+@@ -851,7 +858,6 @@ static int its_alloc_tables(const char *node_name, struct its_node *its) |
270 |
+ u64 type = GITS_BASER_TYPE(val); |
271 |
+ u64 entry_size = GITS_BASER_ENTRY_SIZE(val); |
272 |
+ int order = get_order(psz); |
273 |
+- int alloc_size; |
274 |
+ int alloc_pages; |
275 |
+ u64 tmp; |
276 |
+ void *base; |
277 |
+@@ -883,8 +889,8 @@ static int its_alloc_tables(const char *node_name, struct its_node *its) |
278 |
+ } |
279 |
+ } |
280 |
+ |
281 |
+- alloc_size = (1 << order) * PAGE_SIZE; |
282 |
+- alloc_pages = (alloc_size / psz); |
283 |
++retry_alloc_baser: |
284 |
++ alloc_pages = (PAGE_ORDER_TO_SIZE(order) / psz); |
285 |
+ if (alloc_pages > GITS_BASER_PAGES_MAX) { |
286 |
+ alloc_pages = GITS_BASER_PAGES_MAX; |
287 |
+ order = get_order(GITS_BASER_PAGES_MAX * psz); |
288 |
+@@ -898,7 +904,8 @@ static int its_alloc_tables(const char *node_name, struct its_node *its) |
289 |
+ goto out_free; |
290 |
+ } |
291 |
+ |
292 |
+- its->tables[i] = base; |
293 |
++ its->tables[i].base = base; |
294 |
++ its->tables[i].order = order; |
295 |
+ |
296 |
+ retry_baser: |
297 |
+ val = (virt_to_phys(base) | |
298 |
+@@ -936,7 +943,7 @@ retry_baser: |
299 |
+ shr = tmp & GITS_BASER_SHAREABILITY_MASK; |
300 |
+ if (!shr) { |
301 |
+ cache = GITS_BASER_nC; |
302 |
+- __flush_dcache_area(base, alloc_size); |
303 |
++ __flush_dcache_area(base, PAGE_ORDER_TO_SIZE(order)); |
304 |
+ } |
305 |
+ goto retry_baser; |
306 |
+ } |
307 |
+@@ -947,13 +954,16 @@ retry_baser: |
308 |
+ * size and retry. If we reach 4K, then |
309 |
+ * something is horribly wrong... |
310 |
+ */ |
311 |
++ free_pages((unsigned long)base, order); |
312 |
++ its->tables[i].base = NULL; |
313 |
++ |
314 |
+ switch (psz) { |
315 |
+ case SZ_16K: |
316 |
+ psz = SZ_4K; |
317 |
+- goto retry_baser; |
318 |
++ goto retry_alloc_baser; |
319 |
+ case SZ_64K: |
320 |
+ psz = SZ_16K; |
321 |
+- goto retry_baser; |
322 |
++ goto retry_alloc_baser; |
323 |
+ } |
324 |
+ } |
325 |
+ |
326 |
+@@ -966,7 +976,7 @@ retry_baser: |
327 |
+ } |
328 |
+ |
329 |
+ pr_info("ITS: allocated %d %s @%lx (psz %dK, shr %d)\n", |
330 |
+- (int)(alloc_size / entry_size), |
331 |
++ (int)(PAGE_ORDER_TO_SIZE(order) / entry_size), |
332 |
+ its_base_type_string[type], |
333 |
+ (unsigned long)virt_to_phys(base), |
334 |
+ psz / SZ_1K, (int)shr >> GITS_BASER_SHAREABILITY_SHIFT); |
335 |
+diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c |
336 |
+index cebd8efe651a..5fe968a4338a 100644 |
337 |
+--- a/drivers/irqchip/irq-gic.c |
338 |
++++ b/drivers/irqchip/irq-gic.c |
339 |
+@@ -336,7 +336,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) |
340 |
+ irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK); |
341 |
+ irqnr = irqstat & GICC_IAR_INT_ID_MASK; |
342 |
+ |
343 |
+- if (likely(irqnr > 15 && irqnr < 1021)) { |
344 |
++ if (likely(irqnr > 15 && irqnr < 1020)) { |
345 |
+ if (static_key_true(&supports_deactivate)) |
346 |
+ writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI); |
347 |
+ handle_domain_irq(gic->domain, irqnr, regs); |
348 |
+diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c |
349 |
+index 1452ed9aacb4..54c308e6704f 100644 |
350 |
+--- a/drivers/md/dm-kcopyd.c |
351 |
++++ b/drivers/md/dm-kcopyd.c |
352 |
+@@ -454,6 +454,8 @@ static int run_complete_job(struct kcopyd_job *job) |
353 |
+ if (atomic_dec_and_test(&kc->nr_jobs)) |
354 |
+ wake_up(&kc->destroyq); |
355 |
+ |
356 |
++ cond_resched(); |
357 |
++ |
358 |
+ return 0; |
359 |
+ } |
360 |
+ |
361 |
+diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c |
362 |
+index c646784c5a7d..fbec711c4195 100644 |
363 |
+--- a/drivers/mfd/sm501.c |
364 |
++++ b/drivers/mfd/sm501.c |
365 |
+@@ -714,6 +714,7 @@ sm501_create_subdev(struct sm501_devdata *sm, char *name, |
366 |
+ smdev->pdev.name = name; |
367 |
+ smdev->pdev.id = sm->pdev_id; |
368 |
+ smdev->pdev.dev.parent = sm->dev; |
369 |
++ smdev->pdev.dev.coherent_dma_mask = 0xffffffff; |
370 |
+ |
371 |
+ if (res_count) { |
372 |
+ smdev->pdev.resource = (struct resource *)(smdev+1); |
373 |
+diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c |
374 |
+index adab5bbb642a..d5b84d68f988 100644 |
375 |
+--- a/drivers/misc/mei/pci-me.c |
376 |
++++ b/drivers/misc/mei/pci-me.c |
377 |
+@@ -230,8 +230,11 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
378 |
+ if (!pci_dev_run_wake(pdev)) |
379 |
+ mei_me_set_pm_domain(dev); |
380 |
+ |
381 |
+- if (mei_pg_is_enabled(dev)) |
382 |
++ if (mei_pg_is_enabled(dev)) { |
383 |
+ pm_runtime_put_noidle(&pdev->dev); |
384 |
++ if (hw->d0i3_supported) |
385 |
++ pm_runtime_allow(&pdev->dev); |
386 |
++ } |
387 |
+ |
388 |
+ dev_dbg(&pdev->dev, "initialization successful.\n"); |
389 |
+ |
390 |
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
391 |
+index cef53f2d9854..ce20bc939b38 100644 |
392 |
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
393 |
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h |
394 |
+@@ -185,6 +185,9 @@ struct bcmgenet_mib_counters { |
395 |
+ #define UMAC_MAC1 0x010 |
396 |
+ #define UMAC_MAX_FRAME_LEN 0x014 |
397 |
+ |
398 |
++#define UMAC_MODE 0x44 |
399 |
++#define MODE_LINK_STATUS (1 << 5) |
400 |
++ |
401 |
+ #define UMAC_EEE_CTRL 0x064 |
402 |
+ #define EN_LPI_RX_PAUSE (1 << 0) |
403 |
+ #define EN_LPI_TX_PFC (1 << 1) |
404 |
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c |
405 |
+index e96d1f95bb47..4c73feca4842 100644 |
406 |
+--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c |
407 |
++++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c |
408 |
+@@ -167,8 +167,14 @@ void bcmgenet_mii_setup(struct net_device *dev) |
409 |
+ static int bcmgenet_fixed_phy_link_update(struct net_device *dev, |
410 |
+ struct fixed_phy_status *status) |
411 |
+ { |
412 |
+- if (dev && dev->phydev && status) |
413 |
+- status->link = dev->phydev->link; |
414 |
++ struct bcmgenet_priv *priv; |
415 |
++ u32 reg; |
416 |
++ |
417 |
++ if (dev && dev->phydev && status) { |
418 |
++ priv = netdev_priv(dev); |
419 |
++ reg = bcmgenet_umac_readl(priv, UMAC_MODE); |
420 |
++ status->link = !!(reg & MODE_LINK_STATUS); |
421 |
++ } |
422 |
+ |
423 |
+ return 0; |
424 |
+ } |
425 |
+diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c |
426 |
+index b20bce2c7da1..0433fdebda25 100644 |
427 |
+--- a/drivers/net/ethernet/cisco/enic/enic_main.c |
428 |
++++ b/drivers/net/ethernet/cisco/enic/enic_main.c |
429 |
+@@ -2683,7 +2683,6 @@ static int enic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
430 |
+ */ |
431 |
+ |
432 |
+ enic->port_mtu = enic->config.mtu; |
433 |
+- (void)enic_change_mtu(netdev, enic->port_mtu); |
434 |
+ |
435 |
+ err = enic_set_mac_addr(netdev, enic->mac_addr); |
436 |
+ if (err) { |
437 |
+@@ -2732,6 +2731,7 @@ static int enic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
438 |
+ netdev->features |= NETIF_F_HIGHDMA; |
439 |
+ |
440 |
+ netdev->priv_flags |= IFF_UNICAST_FLT; |
441 |
++ netdev->mtu = enic->port_mtu; |
442 |
+ |
443 |
+ err = register_netdev(netdev); |
444 |
+ if (err) { |
445 |
+diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c |
446 |
+index b28e73ea2c25..f39ad0e66637 100644 |
447 |
+--- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c |
448 |
++++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c |
449 |
+@@ -2388,26 +2388,20 @@ static int qlge_update_hw_vlan_features(struct net_device *ndev, |
450 |
+ return status; |
451 |
+ } |
452 |
+ |
453 |
+-static netdev_features_t qlge_fix_features(struct net_device *ndev, |
454 |
+- netdev_features_t features) |
455 |
+-{ |
456 |
+- int err; |
457 |
+- |
458 |
+- /* Update the behavior of vlan accel in the adapter */ |
459 |
+- err = qlge_update_hw_vlan_features(ndev, features); |
460 |
+- if (err) |
461 |
+- return err; |
462 |
+- |
463 |
+- return features; |
464 |
+-} |
465 |
+- |
466 |
+ static int qlge_set_features(struct net_device *ndev, |
467 |
+ netdev_features_t features) |
468 |
+ { |
469 |
+ netdev_features_t changed = ndev->features ^ features; |
470 |
++ int err; |
471 |
++ |
472 |
++ if (changed & NETIF_F_HW_VLAN_CTAG_RX) { |
473 |
++ /* Update the behavior of vlan accel in the adapter */ |
474 |
++ err = qlge_update_hw_vlan_features(ndev, features); |
475 |
++ if (err) |
476 |
++ return err; |
477 |
+ |
478 |
+- if (changed & NETIF_F_HW_VLAN_CTAG_RX) |
479 |
+ qlge_vlan_mode(ndev, features); |
480 |
++ } |
481 |
+ |
482 |
+ return 0; |
483 |
+ } |
484 |
+@@ -4720,7 +4714,6 @@ static const struct net_device_ops qlge_netdev_ops = { |
485 |
+ .ndo_set_mac_address = qlge_set_mac_address, |
486 |
+ .ndo_validate_addr = eth_validate_addr, |
487 |
+ .ndo_tx_timeout = qlge_tx_timeout, |
488 |
+- .ndo_fix_features = qlge_fix_features, |
489 |
+ .ndo_set_features = qlge_set_features, |
490 |
+ .ndo_vlan_rx_add_vid = qlge_vlan_rx_add_vid, |
491 |
+ .ndo_vlan_rx_kill_vid = qlge_vlan_rx_kill_vid, |
492 |
+diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c |
493 |
+index 379d08f76146..d0a4652bb9ac 100644 |
494 |
+--- a/drivers/pci/host/pci-mvebu.c |
495 |
++++ b/drivers/pci/host/pci-mvebu.c |
496 |
+@@ -1235,7 +1235,7 @@ static int mvebu_pcie_probe(struct platform_device *pdev) |
497 |
+ pcie->realio.start = PCIBIOS_MIN_IO; |
498 |
+ pcie->realio.end = min_t(resource_size_t, |
499 |
+ IO_SPACE_LIMIT, |
500 |
+- resource_size(&pcie->io)); |
501 |
++ resource_size(&pcie->io) - 1); |
502 |
+ } else |
503 |
+ pcie->realio = pcie->io; |
504 |
+ |
505 |
+diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c |
506 |
+index 0e0403e024c5..852d2de7f69f 100644 |
507 |
+--- a/drivers/platform/x86/asus-nb-wmi.c |
508 |
++++ b/drivers/platform/x86/asus-nb-wmi.c |
509 |
+@@ -392,6 +392,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = { |
510 |
+ { KE_KEY, 0xC4, { KEY_KBDILLUMUP } }, |
511 |
+ { KE_KEY, 0xC5, { KEY_KBDILLUMDOWN } }, |
512 |
+ { KE_IGNORE, 0xC6, }, /* Ambient Light Sensor notification */ |
513 |
++ { KE_KEY, 0xFA, { KEY_PROG2 } }, /* Lid flip action */ |
514 |
+ { KE_END, 0}, |
515 |
+ }; |
516 |
+ |
517 |
+diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c |
518 |
+index 21d174e9ebdb..dac2f6883e28 100644 |
519 |
+--- a/drivers/s390/block/dasd_eckd.c |
520 |
++++ b/drivers/s390/block/dasd_eckd.c |
521 |
+@@ -2101,8 +2101,11 @@ static int dasd_eckd_basic_to_ready(struct dasd_device *device) |
522 |
+ |
523 |
+ static int dasd_eckd_online_to_ready(struct dasd_device *device) |
524 |
+ { |
525 |
+- cancel_work_sync(&device->reload_device); |
526 |
+- cancel_work_sync(&device->kick_validate); |
527 |
++ if (cancel_work_sync(&device->reload_device)) |
528 |
++ dasd_put_device(device); |
529 |
++ if (cancel_work_sync(&device->kick_validate)) |
530 |
++ dasd_put_device(device); |
531 |
++ |
532 |
+ return 0; |
533 |
+ }; |
534 |
+ |
535 |
+diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c |
536 |
+index 662b2321d1b0..913ebb6d0d29 100644 |
537 |
+--- a/drivers/scsi/aic94xx/aic94xx_init.c |
538 |
++++ b/drivers/scsi/aic94xx/aic94xx_init.c |
539 |
+@@ -1031,8 +1031,10 @@ static int __init aic94xx_init(void) |
540 |
+ |
541 |
+ aic94xx_transport_template = |
542 |
+ sas_domain_attach_transport(&aic94xx_transport_functions); |
543 |
+- if (!aic94xx_transport_template) |
544 |
++ if (!aic94xx_transport_template) { |
545 |
++ err = -ENOMEM; |
546 |
+ goto out_destroy_caches; |
547 |
++ } |
548 |
+ |
549 |
+ err = pci_register_driver(&aic94xx_pci_driver); |
550 |
+ if (err) |
551 |
+diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c |
552 |
+index 47cb163da9a0..4adb1138af09 100644 |
553 |
+--- a/drivers/staging/android/ion/ion.c |
554 |
++++ b/drivers/staging/android/ion/ion.c |
555 |
+@@ -449,18 +449,6 @@ static struct ion_handle *ion_handle_get_by_id_nolock(struct ion_client *client, |
556 |
+ return ERR_PTR(-EINVAL); |
557 |
+ } |
558 |
+ |
559 |
+-struct ion_handle *ion_handle_get_by_id(struct ion_client *client, |
560 |
+- int id) |
561 |
+-{ |
562 |
+- struct ion_handle *handle; |
563 |
+- |
564 |
+- mutex_lock(&client->lock); |
565 |
+- handle = ion_handle_get_by_id_nolock(client, id); |
566 |
+- mutex_unlock(&client->lock); |
567 |
+- |
568 |
+- return handle; |
569 |
+-} |
570 |
+- |
571 |
+ static bool ion_handle_validate(struct ion_client *client, |
572 |
+ struct ion_handle *handle) |
573 |
+ { |
574 |
+@@ -1138,24 +1126,28 @@ static struct dma_buf_ops dma_buf_ops = { |
575 |
+ .kunmap = ion_dma_buf_kunmap, |
576 |
+ }; |
577 |
+ |
578 |
+-struct dma_buf *ion_share_dma_buf(struct ion_client *client, |
579 |
+- struct ion_handle *handle) |
580 |
++static struct dma_buf *__ion_share_dma_buf(struct ion_client *client, |
581 |
++ struct ion_handle *handle, |
582 |
++ bool lock_client) |
583 |
+ { |
584 |
+ DEFINE_DMA_BUF_EXPORT_INFO(exp_info); |
585 |
+ struct ion_buffer *buffer; |
586 |
+ struct dma_buf *dmabuf; |
587 |
+ bool valid_handle; |
588 |
+ |
589 |
+- mutex_lock(&client->lock); |
590 |
++ if (lock_client) |
591 |
++ mutex_lock(&client->lock); |
592 |
+ valid_handle = ion_handle_validate(client, handle); |
593 |
+ if (!valid_handle) { |
594 |
+ WARN(1, "%s: invalid handle passed to share.\n", __func__); |
595 |
+- mutex_unlock(&client->lock); |
596 |
++ if (lock_client) |
597 |
++ mutex_unlock(&client->lock); |
598 |
+ return ERR_PTR(-EINVAL); |
599 |
+ } |
600 |
+ buffer = handle->buffer; |
601 |
+ ion_buffer_get(buffer); |
602 |
+- mutex_unlock(&client->lock); |
603 |
++ if (lock_client) |
604 |
++ mutex_unlock(&client->lock); |
605 |
+ |
606 |
+ exp_info.ops = &dma_buf_ops; |
607 |
+ exp_info.size = buffer->size; |
608 |
+@@ -1170,14 +1162,21 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client, |
609 |
+ |
610 |
+ return dmabuf; |
611 |
+ } |
612 |
++ |
613 |
++struct dma_buf *ion_share_dma_buf(struct ion_client *client, |
614 |
++ struct ion_handle *handle) |
615 |
++{ |
616 |
++ return __ion_share_dma_buf(client, handle, true); |
617 |
++} |
618 |
+ EXPORT_SYMBOL(ion_share_dma_buf); |
619 |
+ |
620 |
+-int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle) |
621 |
++static int __ion_share_dma_buf_fd(struct ion_client *client, |
622 |
++ struct ion_handle *handle, bool lock_client) |
623 |
+ { |
624 |
+ struct dma_buf *dmabuf; |
625 |
+ int fd; |
626 |
+ |
627 |
+- dmabuf = ion_share_dma_buf(client, handle); |
628 |
++ dmabuf = __ion_share_dma_buf(client, handle, lock_client); |
629 |
+ if (IS_ERR(dmabuf)) |
630 |
+ return PTR_ERR(dmabuf); |
631 |
+ |
632 |
+@@ -1187,8 +1186,19 @@ int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle) |
633 |
+ |
634 |
+ return fd; |
635 |
+ } |
636 |
++ |
637 |
++int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle) |
638 |
++{ |
639 |
++ return __ion_share_dma_buf_fd(client, handle, true); |
640 |
++} |
641 |
+ EXPORT_SYMBOL(ion_share_dma_buf_fd); |
642 |
+ |
643 |
++static int ion_share_dma_buf_fd_nolock(struct ion_client *client, |
644 |
++ struct ion_handle *handle) |
645 |
++{ |
646 |
++ return __ion_share_dma_buf_fd(client, handle, false); |
647 |
++} |
648 |
++ |
649 |
+ struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd) |
650 |
+ { |
651 |
+ struct dma_buf *dmabuf; |
652 |
+@@ -1335,11 +1345,15 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
653 |
+ { |
654 |
+ struct ion_handle *handle; |
655 |
+ |
656 |
+- handle = ion_handle_get_by_id(client, data.handle.handle); |
657 |
+- if (IS_ERR(handle)) |
658 |
++ mutex_lock(&client->lock); |
659 |
++ handle = ion_handle_get_by_id_nolock(client, data.handle.handle); |
660 |
++ if (IS_ERR(handle)) { |
661 |
++ mutex_unlock(&client->lock); |
662 |
+ return PTR_ERR(handle); |
663 |
+- data.fd.fd = ion_share_dma_buf_fd(client, handle); |
664 |
+- ion_handle_put(handle); |
665 |
++ } |
666 |
++ data.fd.fd = ion_share_dma_buf_fd_nolock(client, handle); |
667 |
++ ion_handle_put_nolock(handle); |
668 |
++ mutex_unlock(&client->lock); |
669 |
+ if (data.fd.fd < 0) |
670 |
+ ret = data.fd.fd; |
671 |
+ break; |
672 |
+diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c |
673 |
+index 8f181caffca3..619c989c5f37 100644 |
674 |
+--- a/drivers/staging/comedi/drivers/ni_mio_common.c |
675 |
++++ b/drivers/staging/comedi/drivers/ni_mio_common.c |
676 |
+@@ -5275,11 +5275,11 @@ static int ni_E_init(struct comedi_device *dev, |
677 |
+ /* Digital I/O (PFI) subdevice */ |
678 |
+ s = &dev->subdevices[NI_PFI_DIO_SUBDEV]; |
679 |
+ s->type = COMEDI_SUBD_DIO; |
680 |
+- s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL; |
681 |
+ s->maxdata = 1; |
682 |
+ if (devpriv->is_m_series) { |
683 |
+ s->n_chan = 16; |
684 |
+ s->insn_bits = ni_pfi_insn_bits; |
685 |
++ s->subdev_flags = SDF_READABLE | SDF_WRITABLE | SDF_INTERNAL; |
686 |
+ |
687 |
+ ni_writew(dev, s->state, NI_M_PFI_DO_REG); |
688 |
+ for (i = 0; i < NUM_PFI_OUTPUT_SELECT_REGS; ++i) { |
689 |
+@@ -5288,6 +5288,7 @@ static int ni_E_init(struct comedi_device *dev, |
690 |
+ } |
691 |
+ } else { |
692 |
+ s->n_chan = 10; |
693 |
++ s->subdev_flags = SDF_INTERNAL; |
694 |
+ } |
695 |
+ s->insn_config = ni_pfi_insn_config; |
696 |
+ |
697 |
+diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c |
698 |
+index 1e668fb7dd4c..176a27bc63aa 100644 |
699 |
+--- a/fs/btrfs/dev-replace.c |
700 |
++++ b/fs/btrfs/dev-replace.c |
701 |
+@@ -573,6 +573,12 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info, |
702 |
+ |
703 |
+ btrfs_rm_dev_replace_unblocked(fs_info); |
704 |
+ |
705 |
++ /* |
706 |
++ * Increment dev_stats_ccnt so that btrfs_run_dev_stats() will |
707 |
++ * update on-disk dev stats value during commit transaction |
708 |
++ */ |
709 |
++ atomic_inc(&tgt_device->dev_stats_ccnt); |
710 |
++ |
711 |
+ /* |
712 |
+ * this is again a consistent state where no dev_replace procedure |
713 |
+ * is running, the target device is part of the filesystem, the |
714 |
+diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c |
715 |
+index d106b981d86f..ae6e3a30e61e 100644 |
716 |
+--- a/fs/btrfs/disk-io.c |
717 |
++++ b/fs/btrfs/disk-io.c |
718 |
+@@ -1011,8 +1011,9 @@ static int btree_writepages(struct address_space *mapping, |
719 |
+ |
720 |
+ fs_info = BTRFS_I(mapping->host)->root->fs_info; |
721 |
+ /* this is a bit racy, but that's ok */ |
722 |
+- ret = percpu_counter_compare(&fs_info->dirty_metadata_bytes, |
723 |
+- BTRFS_DIRTY_METADATA_THRESH); |
724 |
++ ret = __percpu_counter_compare(&fs_info->dirty_metadata_bytes, |
725 |
++ BTRFS_DIRTY_METADATA_THRESH, |
726 |
++ fs_info->dirty_metadata_batch); |
727 |
+ if (ret < 0) |
728 |
+ return 0; |
729 |
+ } |
730 |
+@@ -3987,8 +3988,9 @@ static void __btrfs_btree_balance_dirty(struct btrfs_root *root, |
731 |
+ if (flush_delayed) |
732 |
+ btrfs_balance_delayed_items(root); |
733 |
+ |
734 |
+- ret = percpu_counter_compare(&root->fs_info->dirty_metadata_bytes, |
735 |
+- BTRFS_DIRTY_METADATA_THRESH); |
736 |
++ ret = __percpu_counter_compare(&root->fs_info->dirty_metadata_bytes, |
737 |
++ BTRFS_DIRTY_METADATA_THRESH, |
738 |
++ root->fs_info->dirty_metadata_batch); |
739 |
+ if (ret > 0) { |
740 |
+ balance_dirty_pages_ratelimited( |
741 |
+ root->fs_info->btree_inode->i_mapping); |
742 |
+diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c |
743 |
+index 493c7354ec0b..a72f941ca750 100644 |
744 |
+--- a/fs/btrfs/extent-tree.c |
745 |
++++ b/fs/btrfs/extent-tree.c |
746 |
+@@ -10410,7 +10410,7 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info) |
747 |
+ /* Don't want to race with allocators so take the groups_sem */ |
748 |
+ down_write(&space_info->groups_sem); |
749 |
+ spin_lock(&block_group->lock); |
750 |
+- if (block_group->reserved || |
751 |
++ if (block_group->reserved || block_group->pinned || |
752 |
+ btrfs_block_group_used(&block_group->item) || |
753 |
+ block_group->ro || |
754 |
+ list_is_singular(&block_group->list)) { |
755 |
+diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c |
756 |
+index 9ebe027cc4b7..cfe913d2d3df 100644 |
757 |
+--- a/fs/btrfs/relocation.c |
758 |
++++ b/fs/btrfs/relocation.c |
759 |
+@@ -1318,18 +1318,19 @@ static void __del_reloc_root(struct btrfs_root *root) |
760 |
+ struct mapping_node *node = NULL; |
761 |
+ struct reloc_control *rc = root->fs_info->reloc_ctl; |
762 |
+ |
763 |
+- spin_lock(&rc->reloc_root_tree.lock); |
764 |
+- rb_node = tree_search(&rc->reloc_root_tree.rb_root, |
765 |
+- root->node->start); |
766 |
+- if (rb_node) { |
767 |
+- node = rb_entry(rb_node, struct mapping_node, rb_node); |
768 |
+- rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); |
769 |
++ if (rc) { |
770 |
++ spin_lock(&rc->reloc_root_tree.lock); |
771 |
++ rb_node = tree_search(&rc->reloc_root_tree.rb_root, |
772 |
++ root->node->start); |
773 |
++ if (rb_node) { |
774 |
++ node = rb_entry(rb_node, struct mapping_node, rb_node); |
775 |
++ rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); |
776 |
++ } |
777 |
++ spin_unlock(&rc->reloc_root_tree.lock); |
778 |
++ if (!node) |
779 |
++ return; |
780 |
++ BUG_ON((struct btrfs_root *)node->data != root); |
781 |
+ } |
782 |
+- spin_unlock(&rc->reloc_root_tree.lock); |
783 |
+- |
784 |
+- if (!node) |
785 |
+- return; |
786 |
+- BUG_ON((struct btrfs_root *)node->data != root); |
787 |
+ |
788 |
+ spin_lock(&root->fs_info->trans_lock); |
789 |
+ list_del_init(&root->root_list); |
790 |
+diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c |
791 |
+index bcbe42fb7e92..0e72a14228f8 100644 |
792 |
+--- a/fs/cifs/cifs_debug.c |
793 |
++++ b/fs/cifs/cifs_debug.c |
794 |
+@@ -285,6 +285,10 @@ static ssize_t cifs_stats_proc_write(struct file *file, |
795 |
+ atomic_set(&totBufAllocCount, 0); |
796 |
+ atomic_set(&totSmBufAllocCount, 0); |
797 |
+ #endif /* CONFIG_CIFS_STATS2 */ |
798 |
++ spin_lock(&GlobalMid_Lock); |
799 |
++ GlobalMaxActiveXid = 0; |
800 |
++ GlobalCurrentXid = 0; |
801 |
++ spin_unlock(&GlobalMid_Lock); |
802 |
+ spin_lock(&cifs_tcp_ses_lock); |
803 |
+ list_for_each(tmp1, &cifs_tcp_ses_list) { |
804 |
+ server = list_entry(tmp1, struct TCP_Server_Info, |
805 |
+@@ -297,6 +301,10 @@ static ssize_t cifs_stats_proc_write(struct file *file, |
806 |
+ struct cifs_tcon, |
807 |
+ tcon_list); |
808 |
+ atomic_set(&tcon->num_smbs_sent, 0); |
809 |
++ spin_lock(&tcon->stat_lock); |
810 |
++ tcon->bytes_read = 0; |
811 |
++ tcon->bytes_written = 0; |
812 |
++ spin_unlock(&tcon->stat_lock); |
813 |
+ if (server->ops->clear_stats) |
814 |
+ server->ops->clear_stats(tcon); |
815 |
+ } |
816 |
+diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c |
817 |
+index 76ccf20fbfb7..0e62bf1ebbd7 100644 |
818 |
+--- a/fs/cifs/smb2misc.c |
819 |
++++ b/fs/cifs/smb2misc.c |
820 |
+@@ -184,6 +184,13 @@ smb2_check_message(char *buf, unsigned int length) |
821 |
+ if (clc_len == 4 + len + 1) |
822 |
+ return 0; |
823 |
+ |
824 |
++ /* |
825 |
++ * Some windows servers (win2016) will pad also the final |
826 |
++ * PDU in a compound to 8 bytes. |
827 |
++ */ |
828 |
++ if (((clc_len + 7) & ~7) == len) |
829 |
++ return 0; |
830 |
++ |
831 |
+ /* |
832 |
+ * MacOS server pads after SMB2.1 write response with 3 bytes |
833 |
+ * of junk. Other servers match RFC1001 len to actual |
834 |
+diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
835 |
+index 5f5ba807b414..52d79fb04115 100644 |
836 |
+--- a/fs/cifs/smb2pdu.c |
837 |
++++ b/fs/cifs/smb2pdu.c |
838 |
+@@ -315,7 +315,7 @@ small_smb2_init(__le16 smb2_command, struct cifs_tcon *tcon, |
839 |
+ smb2_hdr_assemble((struct smb2_hdr *) *request_buf, smb2_command, tcon); |
840 |
+ |
841 |
+ if (tcon != NULL) { |
842 |
+-#ifdef CONFIG_CIFS_STATS2 |
843 |
++#ifdef CONFIG_CIFS_STATS |
844 |
+ uint16_t com_code = le16_to_cpu(smb2_command); |
845 |
+ cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]); |
846 |
+ #endif |
847 |
+diff --git a/fs/dcache.c b/fs/dcache.c |
848 |
+index 807efaab838e..141651b0c766 100644 |
849 |
+--- a/fs/dcache.c |
850 |
++++ b/fs/dcache.c |
851 |
+@@ -278,7 +278,8 @@ void take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry |
852 |
+ spin_unlock(&dentry->d_lock); |
853 |
+ name->name = p->name; |
854 |
+ } else { |
855 |
+- memcpy(name->inline_name, dentry->d_iname, DNAME_INLINE_LEN); |
856 |
++ memcpy(name->inline_name, dentry->d_iname, |
857 |
++ dentry->d_name.len + 1); |
858 |
+ spin_unlock(&dentry->d_lock); |
859 |
+ name->name = name->inline_name; |
860 |
+ } |
861 |
+diff --git a/fs/fat/cache.c b/fs/fat/cache.c |
862 |
+index 93fc62232ec2..9ae2c4d7e921 100644 |
863 |
+--- a/fs/fat/cache.c |
864 |
++++ b/fs/fat/cache.c |
865 |
+@@ -224,7 +224,8 @@ static inline void cache_init(struct fat_cache_id *cid, int fclus, int dclus) |
866 |
+ int fat_get_cluster(struct inode *inode, int cluster, int *fclus, int *dclus) |
867 |
+ { |
868 |
+ struct super_block *sb = inode->i_sb; |
869 |
+- const int limit = sb->s_maxbytes >> MSDOS_SB(sb)->cluster_bits; |
870 |
++ struct msdos_sb_info *sbi = MSDOS_SB(sb); |
871 |
++ const int limit = sb->s_maxbytes >> sbi->cluster_bits; |
872 |
+ struct fat_entry fatent; |
873 |
+ struct fat_cache_id cid; |
874 |
+ int nr; |
875 |
+@@ -233,6 +234,12 @@ int fat_get_cluster(struct inode *inode, int cluster, int *fclus, int *dclus) |
876 |
+ |
877 |
+ *fclus = 0; |
878 |
+ *dclus = MSDOS_I(inode)->i_start; |
879 |
++ if (!fat_valid_entry(sbi, *dclus)) { |
880 |
++ fat_fs_error_ratelimit(sb, |
881 |
++ "%s: invalid start cluster (i_pos %lld, start %08x)", |
882 |
++ __func__, MSDOS_I(inode)->i_pos, *dclus); |
883 |
++ return -EIO; |
884 |
++ } |
885 |
+ if (cluster == 0) |
886 |
+ return 0; |
887 |
+ |
888 |
+@@ -249,9 +256,8 @@ int fat_get_cluster(struct inode *inode, int cluster, int *fclus, int *dclus) |
889 |
+ /* prevent the infinite loop of cluster chain */ |
890 |
+ if (*fclus > limit) { |
891 |
+ fat_fs_error_ratelimit(sb, |
892 |
+- "%s: detected the cluster chain loop" |
893 |
+- " (i_pos %lld)", __func__, |
894 |
+- MSDOS_I(inode)->i_pos); |
895 |
++ "%s: detected the cluster chain loop (i_pos %lld)", |
896 |
++ __func__, MSDOS_I(inode)->i_pos); |
897 |
+ nr = -EIO; |
898 |
+ goto out; |
899 |
+ } |
900 |
+@@ -261,9 +267,8 @@ int fat_get_cluster(struct inode *inode, int cluster, int *fclus, int *dclus) |
901 |
+ goto out; |
902 |
+ else if (nr == FAT_ENT_FREE) { |
903 |
+ fat_fs_error_ratelimit(sb, |
904 |
+- "%s: invalid cluster chain (i_pos %lld)", |
905 |
+- __func__, |
906 |
+- MSDOS_I(inode)->i_pos); |
907 |
++ "%s: invalid cluster chain (i_pos %lld)", |
908 |
++ __func__, MSDOS_I(inode)->i_pos); |
909 |
+ nr = -EIO; |
910 |
+ goto out; |
911 |
+ } else if (nr == FAT_ENT_EOF) { |
912 |
+diff --git a/fs/fat/fat.h b/fs/fat/fat.h |
913 |
+index be5e15323bab..1849b1adb6b9 100644 |
914 |
+--- a/fs/fat/fat.h |
915 |
++++ b/fs/fat/fat.h |
916 |
+@@ -344,6 +344,11 @@ static inline void fatent_brelse(struct fat_entry *fatent) |
917 |
+ fatent->fat_inode = NULL; |
918 |
+ } |
919 |
+ |
920 |
++static inline bool fat_valid_entry(struct msdos_sb_info *sbi, int entry) |
921 |
++{ |
922 |
++ return FAT_START_ENT <= entry && entry < sbi->max_cluster; |
923 |
++} |
924 |
++ |
925 |
+ extern void fat_ent_access_init(struct super_block *sb); |
926 |
+ extern int fat_ent_read(struct inode *inode, struct fat_entry *fatent, |
927 |
+ int entry); |
928 |
+diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c |
929 |
+index 8226557130a2..a70e37c47a78 100644 |
930 |
+--- a/fs/fat/fatent.c |
931 |
++++ b/fs/fat/fatent.c |
932 |
+@@ -23,7 +23,7 @@ static void fat12_ent_blocknr(struct super_block *sb, int entry, |
933 |
+ { |
934 |
+ struct msdos_sb_info *sbi = MSDOS_SB(sb); |
935 |
+ int bytes = entry + (entry >> 1); |
936 |
+- WARN_ON(entry < FAT_START_ENT || sbi->max_cluster <= entry); |
937 |
++ WARN_ON(!fat_valid_entry(sbi, entry)); |
938 |
+ *offset = bytes & (sb->s_blocksize - 1); |
939 |
+ *blocknr = sbi->fat_start + (bytes >> sb->s_blocksize_bits); |
940 |
+ } |
941 |
+@@ -33,7 +33,7 @@ static void fat_ent_blocknr(struct super_block *sb, int entry, |
942 |
+ { |
943 |
+ struct msdos_sb_info *sbi = MSDOS_SB(sb); |
944 |
+ int bytes = (entry << sbi->fatent_shift); |
945 |
+- WARN_ON(entry < FAT_START_ENT || sbi->max_cluster <= entry); |
946 |
++ WARN_ON(!fat_valid_entry(sbi, entry)); |
947 |
+ *offset = bytes & (sb->s_blocksize - 1); |
948 |
+ *blocknr = sbi->fat_start + (bytes >> sb->s_blocksize_bits); |
949 |
+ } |
950 |
+@@ -353,7 +353,7 @@ int fat_ent_read(struct inode *inode, struct fat_entry *fatent, int entry) |
951 |
+ int err, offset; |
952 |
+ sector_t blocknr; |
953 |
+ |
954 |
+- if (entry < FAT_START_ENT || sbi->max_cluster <= entry) { |
955 |
++ if (!fat_valid_entry(sbi, entry)) { |
956 |
+ fatent_brelse(fatent); |
957 |
+ fat_fs_error(sb, "invalid access to FAT (entry 0x%08x)", entry); |
958 |
+ return -EIO; |
959 |
+diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c |
960 |
+index 6fc766df0461..2a6f3c67cb3f 100644 |
961 |
+--- a/fs/hfs/brec.c |
962 |
++++ b/fs/hfs/brec.c |
963 |
+@@ -74,9 +74,10 @@ int hfs_brec_insert(struct hfs_find_data *fd, void *entry, int entry_len) |
964 |
+ if (!fd->bnode) { |
965 |
+ if (!tree->root) |
966 |
+ hfs_btree_inc_height(tree); |
967 |
+- fd->bnode = hfs_bnode_find(tree, tree->leaf_head); |
968 |
+- if (IS_ERR(fd->bnode)) |
969 |
+- return PTR_ERR(fd->bnode); |
970 |
++ node = hfs_bnode_find(tree, tree->leaf_head); |
971 |
++ if (IS_ERR(node)) |
972 |
++ return PTR_ERR(node); |
973 |
++ fd->bnode = node; |
974 |
+ fd->record = -1; |
975 |
+ } |
976 |
+ new_node = NULL; |
977 |
+diff --git a/fs/hfsplus/dir.c b/fs/hfsplus/dir.c |
978 |
+index d0f39dcbb58e..2b6e2ad57bf9 100644 |
979 |
+--- a/fs/hfsplus/dir.c |
980 |
++++ b/fs/hfsplus/dir.c |
981 |
+@@ -77,13 +77,13 @@ again: |
982 |
+ cpu_to_be32(HFSP_HARDLINK_TYPE) && |
983 |
+ entry.file.user_info.fdCreator == |
984 |
+ cpu_to_be32(HFSP_HFSPLUS_CREATOR) && |
985 |
++ HFSPLUS_SB(sb)->hidden_dir && |
986 |
+ (entry.file.create_date == |
987 |
+ HFSPLUS_I(HFSPLUS_SB(sb)->hidden_dir)-> |
988 |
+ create_date || |
989 |
+ entry.file.create_date == |
990 |
+ HFSPLUS_I(d_inode(sb->s_root))-> |
991 |
+- create_date) && |
992 |
+- HFSPLUS_SB(sb)->hidden_dir) { |
993 |
++ create_date)) { |
994 |
+ struct qstr str; |
995 |
+ char name[32]; |
996 |
+ |
997 |
+diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c |
998 |
+index fa40e756c501..422e00dc5f3b 100644 |
999 |
+--- a/fs/hfsplus/super.c |
1000 |
++++ b/fs/hfsplus/super.c |
1001 |
+@@ -521,8 +521,10 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent) |
1002 |
+ goto out_put_root; |
1003 |
+ if (!hfs_brec_read(&fd, &entry, sizeof(entry))) { |
1004 |
+ hfs_find_exit(&fd); |
1005 |
+- if (entry.type != cpu_to_be16(HFSPLUS_FOLDER)) |
1006 |
++ if (entry.type != cpu_to_be16(HFSPLUS_FOLDER)) { |
1007 |
++ err = -EINVAL; |
1008 |
+ goto out_put_root; |
1009 |
++ } |
1010 |
+ inode = hfsplus_iget(sb, be32_to_cpu(entry.folder.id)); |
1011 |
+ if (IS_ERR(inode)) { |
1012 |
+ err = PTR_ERR(inode); |
1013 |
+diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c |
1014 |
+index 63a0d0ba36de..64c5386d0c1b 100644 |
1015 |
+--- a/fs/overlayfs/copy_up.c |
1016 |
++++ b/fs/overlayfs/copy_up.c |
1017 |
+@@ -317,7 +317,6 @@ int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, |
1018 |
+ struct dentry *upperdir; |
1019 |
+ struct dentry *upperdentry; |
1020 |
+ const struct cred *old_cred; |
1021 |
+- struct cred *override_cred; |
1022 |
+ char *link = NULL; |
1023 |
+ |
1024 |
+ if (WARN_ON(!workdir)) |
1025 |
+@@ -336,28 +335,7 @@ int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, |
1026 |
+ return PTR_ERR(link); |
1027 |
+ } |
1028 |
+ |
1029 |
+- err = -ENOMEM; |
1030 |
+- override_cred = prepare_creds(); |
1031 |
+- if (!override_cred) |
1032 |
+- goto out_free_link; |
1033 |
+- |
1034 |
+- override_cred->fsuid = stat->uid; |
1035 |
+- override_cred->fsgid = stat->gid; |
1036 |
+- /* |
1037 |
+- * CAP_SYS_ADMIN for copying up extended attributes |
1038 |
+- * CAP_DAC_OVERRIDE for create |
1039 |
+- * CAP_FOWNER for chmod, timestamp update |
1040 |
+- * CAP_FSETID for chmod |
1041 |
+- * CAP_CHOWN for chown |
1042 |
+- * CAP_MKNOD for mknod |
1043 |
+- */ |
1044 |
+- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN); |
1045 |
+- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); |
1046 |
+- cap_raise(override_cred->cap_effective, CAP_FOWNER); |
1047 |
+- cap_raise(override_cred->cap_effective, CAP_FSETID); |
1048 |
+- cap_raise(override_cred->cap_effective, CAP_CHOWN); |
1049 |
+- cap_raise(override_cred->cap_effective, CAP_MKNOD); |
1050 |
+- old_cred = override_creds(override_cred); |
1051 |
++ old_cred = ovl_override_creds(dentry->d_sb); |
1052 |
+ |
1053 |
+ err = -EIO; |
1054 |
+ if (lock_rename(workdir, upperdir) != NULL) { |
1055 |
+@@ -380,9 +358,7 @@ int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, |
1056 |
+ out_unlock: |
1057 |
+ unlock_rename(workdir, upperdir); |
1058 |
+ revert_creds(old_cred); |
1059 |
+- put_cred(override_cred); |
1060 |
+ |
1061 |
+-out_free_link: |
1062 |
+ if (link) |
1063 |
+ free_page((unsigned long) link); |
1064 |
+ |
1065 |
+diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c |
1066 |
+index 327177df03a5..f8aa54272121 100644 |
1067 |
+--- a/fs/overlayfs/dir.c |
1068 |
++++ b/fs/overlayfs/dir.c |
1069 |
+@@ -408,28 +408,13 @@ static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev, |
1070 |
+ err = ovl_create_upper(dentry, inode, &stat, link, hardlink); |
1071 |
+ } else { |
1072 |
+ const struct cred *old_cred; |
1073 |
+- struct cred *override_cred; |
1074 |
+ |
1075 |
+- err = -ENOMEM; |
1076 |
+- override_cred = prepare_creds(); |
1077 |
+- if (!override_cred) |
1078 |
+- goto out_iput; |
1079 |
+- |
1080 |
+- /* |
1081 |
+- * CAP_SYS_ADMIN for setting opaque xattr |
1082 |
+- * CAP_DAC_OVERRIDE for create in workdir, rename |
1083 |
+- * CAP_FOWNER for removing whiteout from sticky dir |
1084 |
+- */ |
1085 |
+- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN); |
1086 |
+- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); |
1087 |
+- cap_raise(override_cred->cap_effective, CAP_FOWNER); |
1088 |
+- old_cred = override_creds(override_cred); |
1089 |
++ old_cred = ovl_override_creds(dentry->d_sb); |
1090 |
+ |
1091 |
+ err = ovl_create_over_whiteout(dentry, inode, &stat, link, |
1092 |
+ hardlink); |
1093 |
+ |
1094 |
+ revert_creds(old_cred); |
1095 |
+- put_cred(override_cred); |
1096 |
+ } |
1097 |
+ |
1098 |
+ if (!err) |
1099 |
+@@ -659,32 +644,11 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) |
1100 |
+ if (OVL_TYPE_PURE_UPPER(type)) { |
1101 |
+ err = ovl_remove_upper(dentry, is_dir); |
1102 |
+ } else { |
1103 |
+- const struct cred *old_cred; |
1104 |
+- struct cred *override_cred; |
1105 |
+- |
1106 |
+- err = -ENOMEM; |
1107 |
+- override_cred = prepare_creds(); |
1108 |
+- if (!override_cred) |
1109 |
+- goto out_drop_write; |
1110 |
+- |
1111 |
+- /* |
1112 |
+- * CAP_SYS_ADMIN for setting xattr on whiteout, opaque dir |
1113 |
+- * CAP_DAC_OVERRIDE for create in workdir, rename |
1114 |
+- * CAP_FOWNER for removing whiteout from sticky dir |
1115 |
+- * CAP_FSETID for chmod of opaque dir |
1116 |
+- * CAP_CHOWN for chown of opaque dir |
1117 |
+- */ |
1118 |
+- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN); |
1119 |
+- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); |
1120 |
+- cap_raise(override_cred->cap_effective, CAP_FOWNER); |
1121 |
+- cap_raise(override_cred->cap_effective, CAP_FSETID); |
1122 |
+- cap_raise(override_cred->cap_effective, CAP_CHOWN); |
1123 |
+- old_cred = override_creds(override_cred); |
1124 |
++ const struct cred *old_cred = ovl_override_creds(dentry->d_sb); |
1125 |
+ |
1126 |
+ err = ovl_remove_and_whiteout(dentry, is_dir); |
1127 |
+ |
1128 |
+ revert_creds(old_cred); |
1129 |
+- put_cred(override_cred); |
1130 |
+ } |
1131 |
+ out_drop_write: |
1132 |
+ ovl_drop_write(dentry); |
1133 |
+@@ -723,7 +687,6 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, |
1134 |
+ bool new_is_dir = false; |
1135 |
+ struct dentry *opaquedir = NULL; |
1136 |
+ const struct cred *old_cred = NULL; |
1137 |
+- struct cred *override_cred = NULL; |
1138 |
+ |
1139 |
+ err = -EINVAL; |
1140 |
+ if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE)) |
1141 |
+@@ -792,26 +755,8 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, |
1142 |
+ old_opaque = !OVL_TYPE_PURE_UPPER(old_type); |
1143 |
+ new_opaque = !OVL_TYPE_PURE_UPPER(new_type); |
1144 |
+ |
1145 |
+- if (old_opaque || new_opaque) { |
1146 |
+- err = -ENOMEM; |
1147 |
+- override_cred = prepare_creds(); |
1148 |
+- if (!override_cred) |
1149 |
+- goto out_drop_write; |
1150 |
+- |
1151 |
+- /* |
1152 |
+- * CAP_SYS_ADMIN for setting xattr on whiteout, opaque dir |
1153 |
+- * CAP_DAC_OVERRIDE for create in workdir |
1154 |
+- * CAP_FOWNER for removing whiteout from sticky dir |
1155 |
+- * CAP_FSETID for chmod of opaque dir |
1156 |
+- * CAP_CHOWN for chown of opaque dir |
1157 |
+- */ |
1158 |
+- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN); |
1159 |
+- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); |
1160 |
+- cap_raise(override_cred->cap_effective, CAP_FOWNER); |
1161 |
+- cap_raise(override_cred->cap_effective, CAP_FSETID); |
1162 |
+- cap_raise(override_cred->cap_effective, CAP_CHOWN); |
1163 |
+- old_cred = override_creds(override_cred); |
1164 |
+- } |
1165 |
++ if (old_opaque || new_opaque) |
1166 |
++ old_cred = ovl_override_creds(old->d_sb); |
1167 |
+ |
1168 |
+ if (overwrite && OVL_TYPE_MERGE_OR_LOWER(new_type) && new_is_dir) { |
1169 |
+ opaquedir = ovl_check_empty_and_clear(new); |
1170 |
+@@ -942,10 +887,8 @@ out_dput_old: |
1171 |
+ out_unlock: |
1172 |
+ unlock_rename(new_upperdir, old_upperdir); |
1173 |
+ out_revert_creds: |
1174 |
+- if (old_opaque || new_opaque) { |
1175 |
++ if (old_opaque || new_opaque) |
1176 |
+ revert_creds(old_cred); |
1177 |
+- put_cred(override_cred); |
1178 |
+- } |
1179 |
+ out_drop_write: |
1180 |
+ ovl_drop_write(old); |
1181 |
+ out: |
1182 |
+diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h |
1183 |
+index 28316b292b8a..27a42975d7cd 100644 |
1184 |
+--- a/fs/overlayfs/overlayfs.h |
1185 |
++++ b/fs/overlayfs/overlayfs.h |
1186 |
+@@ -150,6 +150,7 @@ void ovl_drop_write(struct dentry *dentry); |
1187 |
+ bool ovl_dentry_is_opaque(struct dentry *dentry); |
1188 |
+ void ovl_dentry_set_opaque(struct dentry *dentry, bool opaque); |
1189 |
+ bool ovl_is_whiteout(struct dentry *dentry); |
1190 |
++const struct cred *ovl_override_creds(struct super_block *sb); |
1191 |
+ void ovl_dentry_update(struct dentry *dentry, struct dentry *upperdentry); |
1192 |
+ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, |
1193 |
+ unsigned int flags); |
1194 |
+@@ -164,6 +165,8 @@ int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list); |
1195 |
+ void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list); |
1196 |
+ void ovl_cache_free(struct list_head *list); |
1197 |
+ int ovl_check_d_type_supported(struct path *realpath); |
1198 |
++void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt, |
1199 |
++ struct dentry *dentry, int level); |
1200 |
+ |
1201 |
+ /* inode.c */ |
1202 |
+ int ovl_setattr(struct dentry *dentry, struct iattr *attr); |
1203 |
+diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c |
1204 |
+index 0c59955c4653..da999e73c97a 100644 |
1205 |
+--- a/fs/overlayfs/readdir.c |
1206 |
++++ b/fs/overlayfs/readdir.c |
1207 |
+@@ -36,7 +36,8 @@ struct ovl_dir_cache { |
1208 |
+ |
1209 |
+ struct ovl_readdir_data { |
1210 |
+ struct dir_context ctx; |
1211 |
+- bool is_merge; |
1212 |
++ struct dentry *dentry; |
1213 |
++ bool is_lowest; |
1214 |
+ struct rb_root root; |
1215 |
+ struct list_head *list; |
1216 |
+ struct list_head middle; |
1217 |
+@@ -140,9 +141,9 @@ static int ovl_cache_entry_add_rb(struct ovl_readdir_data *rdd, |
1218 |
+ return 0; |
1219 |
+ } |
1220 |
+ |
1221 |
+-static int ovl_fill_lower(struct ovl_readdir_data *rdd, |
1222 |
+- const char *name, int namelen, |
1223 |
+- loff_t offset, u64 ino, unsigned int d_type) |
1224 |
++static int ovl_fill_lowest(struct ovl_readdir_data *rdd, |
1225 |
++ const char *name, int namelen, |
1226 |
++ loff_t offset, u64 ino, unsigned int d_type) |
1227 |
+ { |
1228 |
+ struct ovl_cache_entry *p; |
1229 |
+ |
1230 |
+@@ -194,10 +195,10 @@ static int ovl_fill_merge(struct dir_context *ctx, const char *name, |
1231 |
+ container_of(ctx, struct ovl_readdir_data, ctx); |
1232 |
+ |
1233 |
+ rdd->count++; |
1234 |
+- if (!rdd->is_merge) |
1235 |
++ if (!rdd->is_lowest) |
1236 |
+ return ovl_cache_entry_add_rb(rdd, name, namelen, ino, d_type); |
1237 |
+ else |
1238 |
+- return ovl_fill_lower(rdd, name, namelen, offset, ino, d_type); |
1239 |
++ return ovl_fill_lowest(rdd, name, namelen, offset, ino, d_type); |
1240 |
+ } |
1241 |
+ |
1242 |
+ static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd) |
1243 |
+@@ -206,17 +207,8 @@ static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd) |
1244 |
+ struct ovl_cache_entry *p; |
1245 |
+ struct dentry *dentry; |
1246 |
+ const struct cred *old_cred; |
1247 |
+- struct cred *override_cred; |
1248 |
+- |
1249 |
+- override_cred = prepare_creds(); |
1250 |
+- if (!override_cred) |
1251 |
+- return -ENOMEM; |
1252 |
+ |
1253 |
+- /* |
1254 |
+- * CAP_DAC_OVERRIDE for lookup |
1255 |
+- */ |
1256 |
+- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE); |
1257 |
+- old_cred = override_creds(override_cred); |
1258 |
++ old_cred = ovl_override_creds(rdd->dentry->d_sb); |
1259 |
+ |
1260 |
+ err = mutex_lock_killable(&dir->d_inode->i_mutex); |
1261 |
+ if (!err) { |
1262 |
+@@ -232,7 +224,6 @@ static int ovl_check_whiteouts(struct dentry *dir, struct ovl_readdir_data *rdd) |
1263 |
+ mutex_unlock(&dir->d_inode->i_mutex); |
1264 |
+ } |
1265 |
+ revert_creds(old_cred); |
1266 |
+- put_cred(override_cred); |
1267 |
+ |
1268 |
+ return err; |
1269 |
+ } |
1270 |
+@@ -257,7 +248,7 @@ static inline int ovl_dir_read(struct path *realpath, |
1271 |
+ err = rdd->err; |
1272 |
+ } while (!err && rdd->count); |
1273 |
+ |
1274 |
+- if (!err && rdd->first_maybe_whiteout) |
1275 |
++ if (!err && rdd->first_maybe_whiteout && rdd->dentry) |
1276 |
+ err = ovl_check_whiteouts(realpath->dentry, rdd); |
1277 |
+ |
1278 |
+ fput(realfile); |
1279 |
+@@ -288,9 +279,10 @@ static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list) |
1280 |
+ struct path realpath; |
1281 |
+ struct ovl_readdir_data rdd = { |
1282 |
+ .ctx.actor = ovl_fill_merge, |
1283 |
++ .dentry = dentry, |
1284 |
+ .list = list, |
1285 |
+ .root = RB_ROOT, |
1286 |
+- .is_merge = false, |
1287 |
++ .is_lowest = false, |
1288 |
+ }; |
1289 |
+ int idx, next; |
1290 |
+ |
1291 |
+@@ -307,7 +299,7 @@ static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list) |
1292 |
+ * allows offsets to be reasonably constant |
1293 |
+ */ |
1294 |
+ list_add(&rdd.middle, rdd.list); |
1295 |
+- rdd.is_merge = true; |
1296 |
++ rdd.is_lowest = true; |
1297 |
+ err = ovl_dir_read(&realpath, &rdd); |
1298 |
+ list_del(&rdd.middle); |
1299 |
+ } |
1300 |
+@@ -618,3 +610,64 @@ int ovl_check_d_type_supported(struct path *realpath) |
1301 |
+ |
1302 |
+ return rdd.d_type_supported; |
1303 |
+ } |
1304 |
++ |
1305 |
++static void ovl_workdir_cleanup_recurse(struct path *path, int level) |
1306 |
++{ |
1307 |
++ int err; |
1308 |
++ struct inode *dir = path->dentry->d_inode; |
1309 |
++ LIST_HEAD(list); |
1310 |
++ struct ovl_cache_entry *p; |
1311 |
++ struct ovl_readdir_data rdd = { |
1312 |
++ .ctx.actor = ovl_fill_merge, |
1313 |
++ .dentry = NULL, |
1314 |
++ .list = &list, |
1315 |
++ .root = RB_ROOT, |
1316 |
++ .is_lowest = false, |
1317 |
++ }; |
1318 |
++ |
1319 |
++ err = ovl_dir_read(path, &rdd); |
1320 |
++ if (err) |
1321 |
++ goto out; |
1322 |
++ |
1323 |
++ inode_lock_nested(dir, I_MUTEX_PARENT); |
1324 |
++ list_for_each_entry(p, &list, l_node) { |
1325 |
++ struct dentry *dentry; |
1326 |
++ |
1327 |
++ if (p->name[0] == '.') { |
1328 |
++ if (p->len == 1) |
1329 |
++ continue; |
1330 |
++ if (p->len == 2 && p->name[1] == '.') |
1331 |
++ continue; |
1332 |
++ } |
1333 |
++ dentry = lookup_one_len(p->name, path->dentry, p->len); |
1334 |
++ if (IS_ERR(dentry)) |
1335 |
++ continue; |
1336 |
++ if (dentry->d_inode) |
1337 |
++ ovl_workdir_cleanup(dir, path->mnt, dentry, level); |
1338 |
++ dput(dentry); |
1339 |
++ } |
1340 |
++ inode_unlock(dir); |
1341 |
++out: |
1342 |
++ ovl_cache_free(&list); |
1343 |
++} |
1344 |
++ |
1345 |
++void ovl_workdir_cleanup(struct inode *dir, struct vfsmount *mnt, |
1346 |
++ struct dentry *dentry, int level) |
1347 |
++{ |
1348 |
++ int err; |
1349 |
++ |
1350 |
++ if (!d_is_dir(dentry) || level > 1) { |
1351 |
++ ovl_cleanup(dir, dentry); |
1352 |
++ return; |
1353 |
++ } |
1354 |
++ |
1355 |
++ err = ovl_do_rmdir(dir, dentry); |
1356 |
++ if (err) { |
1357 |
++ struct path path = { .mnt = mnt, .dentry = dentry }; |
1358 |
++ |
1359 |
++ inode_unlock(dir); |
1360 |
++ ovl_workdir_cleanup_recurse(&path, level + 1); |
1361 |
++ inode_lock_nested(dir, I_MUTEX_PARENT); |
1362 |
++ ovl_cleanup(dir, dentry); |
1363 |
++ } |
1364 |
++} |
1365 |
+diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c |
1366 |
+index 0035cb80ecd1..fa20c95bd456 100644 |
1367 |
+--- a/fs/overlayfs/super.c |
1368 |
++++ b/fs/overlayfs/super.c |
1369 |
+@@ -42,6 +42,8 @@ struct ovl_fs { |
1370 |
+ long lower_namelen; |
1371 |
+ /* pathnames of lower and upper dirs, for show_options */ |
1372 |
+ struct ovl_config config; |
1373 |
++ /* creds of process who forced instantiation of super block */ |
1374 |
++ const struct cred *creator_cred; |
1375 |
+ }; |
1376 |
+ |
1377 |
+ struct ovl_dir_cache; |
1378 |
+@@ -246,6 +248,13 @@ bool ovl_is_whiteout(struct dentry *dentry) |
1379 |
+ return inode && IS_WHITEOUT(inode); |
1380 |
+ } |
1381 |
+ |
1382 |
++const struct cred *ovl_override_creds(struct super_block *sb) |
1383 |
++{ |
1384 |
++ struct ovl_fs *ofs = sb->s_fs_info; |
1385 |
++ |
1386 |
++ return override_creds(ofs->creator_cred); |
1387 |
++} |
1388 |
++ |
1389 |
+ static bool ovl_is_opaquedir(struct dentry *dentry) |
1390 |
+ { |
1391 |
+ int res; |
1392 |
+@@ -587,6 +596,7 @@ static void ovl_put_super(struct super_block *sb) |
1393 |
+ kfree(ufs->config.lowerdir); |
1394 |
+ kfree(ufs->config.upperdir); |
1395 |
+ kfree(ufs->config.workdir); |
1396 |
++ put_cred(ufs->creator_cred); |
1397 |
+ kfree(ufs); |
1398 |
+ } |
1399 |
+ |
1400 |
+@@ -774,7 +784,7 @@ retry: |
1401 |
+ goto out_dput; |
1402 |
+ |
1403 |
+ retried = true; |
1404 |
+- ovl_cleanup(dir, work); |
1405 |
++ ovl_workdir_cleanup(dir, mnt, work, 0); |
1406 |
+ dput(work); |
1407 |
+ goto retry; |
1408 |
+ } |
1409 |
+@@ -1107,10 +1117,14 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) |
1410 |
+ else |
1411 |
+ sb->s_d_op = &ovl_dentry_operations; |
1412 |
+ |
1413 |
++ ufs->creator_cred = prepare_creds(); |
1414 |
++ if (!ufs->creator_cred) |
1415 |
++ goto out_put_lower_mnt; |
1416 |
++ |
1417 |
+ err = -ENOMEM; |
1418 |
+ oe = ovl_alloc_entry(numlower); |
1419 |
+ if (!oe) |
1420 |
+- goto out_put_lower_mnt; |
1421 |
++ goto out_put_cred; |
1422 |
+ |
1423 |
+ root_dentry = d_make_root(ovl_new_inode(sb, S_IFDIR, oe)); |
1424 |
+ if (!root_dentry) |
1425 |
+@@ -1143,6 +1157,8 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) |
1426 |
+ |
1427 |
+ out_free_oe: |
1428 |
+ kfree(oe); |
1429 |
++out_put_cred: |
1430 |
++ put_cred(ufs->creator_cred); |
1431 |
+ out_put_lower_mnt: |
1432 |
+ for (i = 0; i < ufs->numlower; i++) |
1433 |
+ mntput(ufs->lower_mnt[i]); |
1434 |
+diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h |
1435 |
+index 6ca00471afbf..d920a646b578 100644 |
1436 |
+--- a/fs/reiserfs/reiserfs.h |
1437 |
++++ b/fs/reiserfs/reiserfs.h |
1438 |
+@@ -270,7 +270,7 @@ struct reiserfs_journal_list { |
1439 |
+ |
1440 |
+ struct mutex j_commit_mutex; |
1441 |
+ unsigned int j_trans_id; |
1442 |
+- time_t j_timestamp; |
1443 |
++ time64_t j_timestamp; /* write-only but useful for crash dump analysis */ |
1444 |
+ struct reiserfs_list_bitmap *j_list_bitmap; |
1445 |
+ struct buffer_head *j_commit_bh; /* commit buffer head */ |
1446 |
+ struct reiserfs_journal_cnode *j_realblock; |
1447 |
+diff --git a/kernel/fork.c b/kernel/fork.c |
1448 |
+index ac00f14208b7..37ec96fe739d 100644 |
1449 |
+--- a/kernel/fork.c |
1450 |
++++ b/kernel/fork.c |
1451 |
+@@ -1109,7 +1109,9 @@ static int copy_sighand(unsigned long clone_flags, struct task_struct *tsk) |
1452 |
+ return -ENOMEM; |
1453 |
+ |
1454 |
+ atomic_set(&sig->count, 1); |
1455 |
++ spin_lock_irq(¤t->sighand->siglock); |
1456 |
+ memcpy(sig->action, current->sighand->action, sizeof(sig->action)); |
1457 |
++ spin_unlock_irq(¤t->sighand->siglock); |
1458 |
+ return 0; |
1459 |
+ } |
1460 |
+ |
1461 |
+diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c |
1462 |
+index e4453d9f788c..3c74e13a95dc 100644 |
1463 |
+--- a/kernel/irq/chip.c |
1464 |
++++ b/kernel/irq/chip.c |
1465 |
+@@ -338,7 +338,6 @@ void handle_nested_irq(unsigned int irq) |
1466 |
+ raw_spin_lock_irq(&desc->lock); |
1467 |
+ |
1468 |
+ desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); |
1469 |
+- kstat_incr_irqs_this_cpu(desc); |
1470 |
+ |
1471 |
+ action = desc->action; |
1472 |
+ if (unlikely(!action || irqd_irq_disabled(&desc->irq_data))) { |
1473 |
+@@ -346,6 +345,7 @@ void handle_nested_irq(unsigned int irq) |
1474 |
+ goto out_unlock; |
1475 |
+ } |
1476 |
+ |
1477 |
++ kstat_incr_irqs_this_cpu(desc); |
1478 |
+ irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS); |
1479 |
+ raw_spin_unlock_irq(&desc->lock); |
1480 |
+ |
1481 |
+@@ -412,13 +412,13 @@ void handle_simple_irq(struct irq_desc *desc) |
1482 |
+ goto out_unlock; |
1483 |
+ |
1484 |
+ desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); |
1485 |
+- kstat_incr_irqs_this_cpu(desc); |
1486 |
+ |
1487 |
+ if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { |
1488 |
+ desc->istate |= IRQS_PENDING; |
1489 |
+ goto out_unlock; |
1490 |
+ } |
1491 |
+ |
1492 |
++ kstat_incr_irqs_this_cpu(desc); |
1493 |
+ handle_irq_event(desc); |
1494 |
+ |
1495 |
+ out_unlock: |
1496 |
+@@ -462,7 +462,6 @@ void handle_level_irq(struct irq_desc *desc) |
1497 |
+ goto out_unlock; |
1498 |
+ |
1499 |
+ desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); |
1500 |
+- kstat_incr_irqs_this_cpu(desc); |
1501 |
+ |
1502 |
+ /* |
1503 |
+ * If its disabled or no action available |
1504 |
+@@ -473,6 +472,7 @@ void handle_level_irq(struct irq_desc *desc) |
1505 |
+ goto out_unlock; |
1506 |
+ } |
1507 |
+ |
1508 |
++ kstat_incr_irqs_this_cpu(desc); |
1509 |
+ handle_irq_event(desc); |
1510 |
+ |
1511 |
+ cond_unmask_irq(desc); |
1512 |
+@@ -532,7 +532,6 @@ void handle_fasteoi_irq(struct irq_desc *desc) |
1513 |
+ goto out; |
1514 |
+ |
1515 |
+ desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); |
1516 |
+- kstat_incr_irqs_this_cpu(desc); |
1517 |
+ |
1518 |
+ /* |
1519 |
+ * If its disabled or no action available |
1520 |
+@@ -544,6 +543,7 @@ void handle_fasteoi_irq(struct irq_desc *desc) |
1521 |
+ goto out; |
1522 |
+ } |
1523 |
+ |
1524 |
++ kstat_incr_irqs_this_cpu(desc); |
1525 |
+ if (desc->istate & IRQS_ONESHOT) |
1526 |
+ mask_irq(desc); |
1527 |
+ |
1528 |
+diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
1529 |
+index 547f7f923dbc..a26328ec39f1 100644 |
1530 |
+--- a/lib/debugobjects.c |
1531 |
++++ b/lib/debugobjects.c |
1532 |
+@@ -295,9 +295,12 @@ static void debug_object_is_on_stack(void *addr, int onstack) |
1533 |
+ |
1534 |
+ limit++; |
1535 |
+ if (is_on_stack) |
1536 |
+- pr_warn("object is on stack, but not annotated\n"); |
1537 |
++ pr_warn("object %p is on stack %p, but NOT annotated.\n", addr, |
1538 |
++ task_stack_page(current)); |
1539 |
+ else |
1540 |
+- pr_warn("object is not on stack, but annotated\n"); |
1541 |
++ pr_warn("object %p is NOT on stack %p, but annotated.\n", addr, |
1542 |
++ task_stack_page(current)); |
1543 |
++ |
1544 |
+ WARN_ON(1); |
1545 |
+ } |
1546 |
+ |
1547 |
+diff --git a/mm/fadvise.c b/mm/fadvise.c |
1548 |
+index b8a5bc66b0c0..001877e32f0c 100644 |
1549 |
+--- a/mm/fadvise.c |
1550 |
++++ b/mm/fadvise.c |
1551 |
+@@ -68,8 +68,12 @@ SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice) |
1552 |
+ goto out; |
1553 |
+ } |
1554 |
+ |
1555 |
+- /* Careful about overflows. Len == 0 means "as much as possible" */ |
1556 |
+- endbyte = offset + len; |
1557 |
++ /* |
1558 |
++ * Careful about overflows. Len == 0 means "as much as possible". Use |
1559 |
++ * unsigned math because signed overflows are undefined and UBSan |
1560 |
++ * complains. |
1561 |
++ */ |
1562 |
++ endbyte = (u64)offset + (u64)len; |
1563 |
+ if (!len || endbyte < len) |
1564 |
+ endbyte = -1; |
1565 |
+ else |
1566 |
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
1567 |
+index 0127b788272f..c4ea57ee2fd1 100644 |
1568 |
+--- a/mm/huge_memory.c |
1569 |
++++ b/mm/huge_memory.c |
1570 |
+@@ -1393,12 +1393,12 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, |
1571 |
+ |
1572 |
+ /* Migration could have started since the pmd_trans_migrating check */ |
1573 |
+ if (!page_locked) { |
1574 |
++ page_nid = -1; |
1575 |
+ if (!get_page_unless_zero(page)) |
1576 |
+ goto out_unlock; |
1577 |
+ spin_unlock(ptl); |
1578 |
+ wait_on_page_locked(page); |
1579 |
+ put_page(page); |
1580 |
+- page_nid = -1; |
1581 |
+ goto out; |
1582 |
+ } |
1583 |
+ |
1584 |
+diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c |
1585 |
+index 6018a1c0dc28..2a15b6aa9cdd 100644 |
1586 |
+--- a/net/9p/trans_virtio.c |
1587 |
++++ b/net/9p/trans_virtio.c |
1588 |
+@@ -574,7 +574,7 @@ static int p9_virtio_probe(struct virtio_device *vdev) |
1589 |
+ chan->vq = virtio_find_single_vq(vdev, req_done, "requests"); |
1590 |
+ if (IS_ERR(chan->vq)) { |
1591 |
+ err = PTR_ERR(chan->vq); |
1592 |
+- goto out_free_vq; |
1593 |
++ goto out_free_chan; |
1594 |
+ } |
1595 |
+ chan->vq->vdev->priv = chan; |
1596 |
+ spin_lock_init(&chan->lock); |
1597 |
+@@ -627,6 +627,7 @@ out_free_tag: |
1598 |
+ kfree(tag); |
1599 |
+ out_free_vq: |
1600 |
+ vdev->config->del_vqs(vdev); |
1601 |
++out_free_chan: |
1602 |
+ kfree(chan); |
1603 |
+ fail: |
1604 |
+ return err; |
1605 |
+diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c |
1606 |
+index 4c1c94fa8f08..d270870bf492 100644 |
1607 |
+--- a/net/ipv4/tcp_minisocks.c |
1608 |
++++ b/net/ipv4/tcp_minisocks.c |
1609 |
+@@ -200,8 +200,9 @@ kill: |
1610 |
+ inet_twsk_deschedule_put(tw); |
1611 |
+ return TCP_TW_SUCCESS; |
1612 |
+ } |
1613 |
++ } else { |
1614 |
++ inet_twsk_reschedule(tw, TCP_TIMEWAIT_LEN); |
1615 |
+ } |
1616 |
+- inet_twsk_reschedule(tw, TCP_TIMEWAIT_LEN); |
1617 |
+ |
1618 |
+ if (tmp_opt.saw_tstamp) { |
1619 |
+ tcptw->tw_ts_recent = tmp_opt.rcv_tsval; |
1620 |
+diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c |
1621 |
+index 6aca9a6b2303..60d4052d97a6 100644 |
1622 |
+--- a/net/ipv6/ip6_vti.c |
1623 |
++++ b/net/ipv6/ip6_vti.c |
1624 |
+@@ -470,7 +470,7 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl) |
1625 |
+ } |
1626 |
+ |
1627 |
+ mtu = dst_mtu(dst); |
1628 |
+- if (!skb->ignore_df && skb->len > mtu) { |
1629 |
++ if (skb->len > mtu) { |
1630 |
+ skb_dst(skb)->ops->update_pmtu(dst, NULL, skb, mtu); |
1631 |
+ |
1632 |
+ if (skb->protocol == htons(ETH_P_IPV6)) { |
1633 |
+diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c |
1634 |
+index 4a116d766c15..7cc9db38e1b6 100644 |
1635 |
+--- a/net/irda/af_irda.c |
1636 |
++++ b/net/irda/af_irda.c |
1637 |
+@@ -774,6 +774,13 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
1638 |
+ return -EINVAL; |
1639 |
+ |
1640 |
+ lock_sock(sk); |
1641 |
++ |
1642 |
++ /* Ensure that the socket is not already bound */ |
1643 |
++ if (self->ias_obj) { |
1644 |
++ err = -EINVAL; |
1645 |
++ goto out; |
1646 |
++ } |
1647 |
++ |
1648 |
+ #ifdef CONFIG_IRDA_ULTRA |
1649 |
+ /* Special care for Ultra sockets */ |
1650 |
+ if ((sk->sk_type == SOCK_DGRAM) && |
1651 |
+@@ -2020,7 +2027,11 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, |
1652 |
+ err = -EINVAL; |
1653 |
+ goto out; |
1654 |
+ } |
1655 |
+- irias_insert_object(ias_obj); |
1656 |
++ |
1657 |
++ /* Only insert newly allocated objects */ |
1658 |
++ if (free_ias) |
1659 |
++ irias_insert_object(ias_obj); |
1660 |
++ |
1661 |
+ kfree(ias_opt); |
1662 |
+ break; |
1663 |
+ case IRLMP_IAS_DEL: |
1664 |
+diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c |
1665 |
+index dd1649caa2b2..ac212542a217 100644 |
1666 |
+--- a/net/netfilter/ipvs/ip_vs_core.c |
1667 |
++++ b/net/netfilter/ipvs/ip_vs_core.c |
1668 |
+@@ -1809,13 +1809,20 @@ ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int |
1669 |
+ if (cp->dest && !(cp->dest->flags & IP_VS_DEST_F_AVAILABLE)) { |
1670 |
+ /* the destination server is not available */ |
1671 |
+ |
1672 |
+- if (sysctl_expire_nodest_conn(ipvs)) { |
1673 |
++ __u32 flags = cp->flags; |
1674 |
++ |
1675 |
++ /* when timer already started, silently drop the packet.*/ |
1676 |
++ if (timer_pending(&cp->timer)) |
1677 |
++ __ip_vs_conn_put(cp); |
1678 |
++ else |
1679 |
++ ip_vs_conn_put(cp); |
1680 |
++ |
1681 |
++ if (sysctl_expire_nodest_conn(ipvs) && |
1682 |
++ !(flags & IP_VS_CONN_F_ONE_PACKET)) { |
1683 |
+ /* try to expire the connection immediately */ |
1684 |
+ ip_vs_conn_expire_now(cp); |
1685 |
+ } |
1686 |
+- /* don't restart its timer, and silently |
1687 |
+- drop the packet. */ |
1688 |
+- __ip_vs_conn_put(cp); |
1689 |
++ |
1690 |
+ return NF_DROP; |
1691 |
+ } |
1692 |
+ |
1693 |
+diff --git a/net/sched/sch_hhf.c b/net/sched/sch_hhf.c |
1694 |
+index 45d4b2f22f62..aff2a1b46f7f 100644 |
1695 |
+--- a/net/sched/sch_hhf.c |
1696 |
++++ b/net/sched/sch_hhf.c |
1697 |
+@@ -501,6 +501,9 @@ static void hhf_destroy(struct Qdisc *sch) |
1698 |
+ hhf_free(q->hhf_valid_bits[i]); |
1699 |
+ } |
1700 |
+ |
1701 |
++ if (!q->hh_flows) |
1702 |
++ return; |
1703 |
++ |
1704 |
+ for (i = 0; i < HH_FLOWS_CNT; i++) { |
1705 |
+ struct hh_flow_state *flow, *next; |
1706 |
+ struct list_head *head = &q->hh_flows[i]; |
1707 |
+diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c |
1708 |
+index 87b02ed3d5f2..daa01d5604c2 100644 |
1709 |
+--- a/net/sched/sch_htb.c |
1710 |
++++ b/net/sched/sch_htb.c |
1711 |
+@@ -1025,6 +1025,9 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt) |
1712 |
+ int err; |
1713 |
+ int i; |
1714 |
+ |
1715 |
++ qdisc_watchdog_init(&q->watchdog, sch); |
1716 |
++ INIT_WORK(&q->work, htb_work_func); |
1717 |
++ |
1718 |
+ if (!opt) |
1719 |
+ return -EINVAL; |
1720 |
+ |
1721 |
+@@ -1045,8 +1048,6 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt) |
1722 |
+ for (i = 0; i < TC_HTB_NUMPRIO; i++) |
1723 |
+ INIT_LIST_HEAD(q->drops + i); |
1724 |
+ |
1725 |
+- qdisc_watchdog_init(&q->watchdog, sch); |
1726 |
+- INIT_WORK(&q->work, htb_work_func); |
1727 |
+ __skb_queue_head_init(&q->direct_queue); |
1728 |
+ |
1729 |
+ if (tb[TCA_HTB_DIRECT_QLEN]) |
1730 |
+diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c |
1731 |
+index bcdd54bb101c..cef36ad691dd 100644 |
1732 |
+--- a/net/sched/sch_multiq.c |
1733 |
++++ b/net/sched/sch_multiq.c |
1734 |
+@@ -254,7 +254,7 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) |
1735 |
+ static int multiq_init(struct Qdisc *sch, struct nlattr *opt) |
1736 |
+ { |
1737 |
+ struct multiq_sched_data *q = qdisc_priv(sch); |
1738 |
+- int i, err; |
1739 |
++ int i; |
1740 |
+ |
1741 |
+ q->queues = NULL; |
1742 |
+ |
1743 |
+@@ -269,12 +269,7 @@ static int multiq_init(struct Qdisc *sch, struct nlattr *opt) |
1744 |
+ for (i = 0; i < q->max_bands; i++) |
1745 |
+ q->queues[i] = &noop_qdisc; |
1746 |
+ |
1747 |
+- err = multiq_tune(sch, opt); |
1748 |
+- |
1749 |
+- if (err) |
1750 |
+- kfree(q->queues); |
1751 |
+- |
1752 |
+- return err; |
1753 |
++ return multiq_tune(sch, opt); |
1754 |
+ } |
1755 |
+ |
1756 |
+ static int multiq_dump(struct Qdisc *sch, struct sk_buff *skb) |
1757 |
+diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c |
1758 |
+index b7c29d5b6f04..743ff23885da 100644 |
1759 |
+--- a/net/sched/sch_netem.c |
1760 |
++++ b/net/sched/sch_netem.c |
1761 |
+@@ -943,11 +943,11 @@ static int netem_init(struct Qdisc *sch, struct nlattr *opt) |
1762 |
+ struct netem_sched_data *q = qdisc_priv(sch); |
1763 |
+ int ret; |
1764 |
+ |
1765 |
++ qdisc_watchdog_init(&q->watchdog, sch); |
1766 |
++ |
1767 |
+ if (!opt) |
1768 |
+ return -EINVAL; |
1769 |
+ |
1770 |
+- qdisc_watchdog_init(&q->watchdog, sch); |
1771 |
+- |
1772 |
+ q->loss_model = CLG_RANDOM; |
1773 |
+ ret = netem_change(sch, opt); |
1774 |
+ if (ret) |
1775 |
+diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c |
1776 |
+index c2fbde742f37..a06c9d6bfc9c 100644 |
1777 |
+--- a/net/sched/sch_tbf.c |
1778 |
++++ b/net/sched/sch_tbf.c |
1779 |
+@@ -432,12 +432,13 @@ static int tbf_init(struct Qdisc *sch, struct nlattr *opt) |
1780 |
+ { |
1781 |
+ struct tbf_sched_data *q = qdisc_priv(sch); |
1782 |
+ |
1783 |
++ qdisc_watchdog_init(&q->watchdog, sch); |
1784 |
++ q->qdisc = &noop_qdisc; |
1785 |
++ |
1786 |
+ if (opt == NULL) |
1787 |
+ return -EINVAL; |
1788 |
+ |
1789 |
+ q->t_c = ktime_get_ns(); |
1790 |
+- qdisc_watchdog_init(&q->watchdog, sch); |
1791 |
+- q->qdisc = &noop_qdisc; |
1792 |
+ |
1793 |
+ return tbf_change(sch, opt); |
1794 |
+ } |
1795 |
+diff --git a/scripts/depmod.sh b/scripts/depmod.sh |
1796 |
+index ea1e96921e3b..baedaef53ca0 100755 |
1797 |
+--- a/scripts/depmod.sh |
1798 |
++++ b/scripts/depmod.sh |
1799 |
+@@ -15,9 +15,9 @@ if ! test -r System.map ; then |
1800 |
+ fi |
1801 |
+ |
1802 |
+ if [ -z $(command -v $DEPMOD) ]; then |
1803 |
+- echo "'make modules_install' requires $DEPMOD. Please install it." >&2 |
1804 |
++ echo "Warning: 'make modules_install' requires $DEPMOD. Please install it." >&2 |
1805 |
+ echo "This is probably in the kmod package." >&2 |
1806 |
+- exit 1 |
1807 |
++ exit 0 |
1808 |
+ fi |
1809 |
+ |
1810 |
+ # older versions of depmod don't support -P <symbol-prefix> |
1811 |
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c |
1812 |
+index bd5151915e5a..064fbfbbb22c 100644 |
1813 |
+--- a/scripts/mod/modpost.c |
1814 |
++++ b/scripts/mod/modpost.c |
1815 |
+@@ -649,7 +649,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info, |
1816 |
+ if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) |
1817 |
+ break; |
1818 |
+ if (symname[0] == '.') { |
1819 |
+- char *munged = strdup(symname); |
1820 |
++ char *munged = NOFAIL(strdup(symname)); |
1821 |
+ munged[0] = '_'; |
1822 |
+ munged[1] = toupper(munged[1]); |
1823 |
+ symname = munged; |
1824 |
+@@ -1311,7 +1311,7 @@ static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr, |
1825 |
+ static char *sec2annotation(const char *s) |
1826 |
+ { |
1827 |
+ if (match(s, init_exit_sections)) { |
1828 |
+- char *p = malloc(20); |
1829 |
++ char *p = NOFAIL(malloc(20)); |
1830 |
+ char *r = p; |
1831 |
+ |
1832 |
+ *p++ = '_'; |
1833 |
+@@ -1331,7 +1331,7 @@ static char *sec2annotation(const char *s) |
1834 |
+ strcat(p, " "); |
1835 |
+ return r; |
1836 |
+ } else { |
1837 |
+- return strdup(""); |
1838 |
++ return NOFAIL(strdup("")); |
1839 |
+ } |
1840 |
+ } |
1841 |
+ |
1842 |
+@@ -2032,7 +2032,7 @@ void buf_write(struct buffer *buf, const char *s, int len) |
1843 |
+ { |
1844 |
+ if (buf->size - buf->pos < len) { |
1845 |
+ buf->size += len + SZ; |
1846 |
+- buf->p = realloc(buf->p, buf->size); |
1847 |
++ buf->p = NOFAIL(realloc(buf->p, buf->size)); |
1848 |
+ } |
1849 |
+ strncpy(buf->p + buf->pos, s, len); |
1850 |
+ buf->pos += len; |
1851 |
+diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c |
1852 |
+index a18aecb49935..2b770d3f05d4 100644 |
1853 |
+--- a/sound/soc/codecs/wm8994.c |
1854 |
++++ b/sound/soc/codecs/wm8994.c |
1855 |
+@@ -2431,6 +2431,7 @@ static int wm8994_set_dai_sysclk(struct snd_soc_dai *dai, |
1856 |
+ snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_2, |
1857 |
+ WM8994_OPCLK_ENA, 0); |
1858 |
+ } |
1859 |
++ break; |
1860 |
+ |
1861 |
+ default: |
1862 |
+ return -EINVAL; |
1863 |
+diff --git a/tools/testing/selftests/powerpc/harness.c b/tools/testing/selftests/powerpc/harness.c |
1864 |
+index f45cee80c58b..af2b1e66e35e 100644 |
1865 |
+--- a/tools/testing/selftests/powerpc/harness.c |
1866 |
++++ b/tools/testing/selftests/powerpc/harness.c |
1867 |
+@@ -85,13 +85,13 @@ wait: |
1868 |
+ return status; |
1869 |
+ } |
1870 |
+ |
1871 |
+-static void alarm_handler(int signum) |
1872 |
++static void sig_handler(int signum) |
1873 |
+ { |
1874 |
+- /* Jut wake us up from waitpid */ |
1875 |
++ /* Just wake us up from waitpid */ |
1876 |
+ } |
1877 |
+ |
1878 |
+-static struct sigaction alarm_action = { |
1879 |
+- .sa_handler = alarm_handler, |
1880 |
++static struct sigaction sig_action = { |
1881 |
++ .sa_handler = sig_handler, |
1882 |
+ }; |
1883 |
+ |
1884 |
+ int test_harness(int (test_function)(void), char *name) |
1885 |
+@@ -101,8 +101,14 @@ int test_harness(int (test_function)(void), char *name) |
1886 |
+ test_start(name); |
1887 |
+ test_set_git_version(GIT_VERSION); |
1888 |
+ |
1889 |
+- if (sigaction(SIGALRM, &alarm_action, NULL)) { |
1890 |
+- perror("sigaction"); |
1891 |
++ if (sigaction(SIGINT, &sig_action, NULL)) { |
1892 |
++ perror("sigaction (sigint)"); |
1893 |
++ test_error(name); |
1894 |
++ return 1; |
1895 |
++ } |
1896 |
++ |
1897 |
++ if (sigaction(SIGALRM, &sig_action, NULL)) { |
1898 |
++ perror("sigaction (sigalrm)"); |
1899 |
+ test_error(name); |
1900 |
+ return 1; |
1901 |
+ } |