Contents of /trunk/kernel-alx/patches-4.4/0147-4.4.48-all-fixes.patch
Parent Directory | Revision Log
Revision 2883 -
(show annotations)
(download)
Mon Mar 27 13:49:22 2017 UTC (7 years, 6 months ago) by niro
File size: 34276 byte(s)
Mon Mar 27 13:49:22 2017 UTC (7 years, 6 months ago) by niro
File size: 34276 byte(s)
linux-4.4.48
1 | diff --git a/Makefile b/Makefile |
2 | index 7b233ac7f86c..0793cd412656 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 4 |
8 | -SUBLEVEL = 47 |
9 | +SUBLEVEL = 48 |
10 | EXTRAVERSION = |
11 | NAME = Blurry Fish Butt |
12 | |
13 | diff --git a/arch/arm64/crypto/aes-modes.S b/arch/arm64/crypto/aes-modes.S |
14 | index c53dbeae79f2..838dad5c209f 100644 |
15 | --- a/arch/arm64/crypto/aes-modes.S |
16 | +++ b/arch/arm64/crypto/aes-modes.S |
17 | @@ -193,15 +193,16 @@ AES_ENTRY(aes_cbc_encrypt) |
18 | cbz w6, .Lcbcencloop |
19 | |
20 | ld1 {v0.16b}, [x5] /* get iv */ |
21 | - enc_prepare w3, x2, x5 |
22 | + enc_prepare w3, x2, x6 |
23 | |
24 | .Lcbcencloop: |
25 | ld1 {v1.16b}, [x1], #16 /* get next pt block */ |
26 | eor v0.16b, v0.16b, v1.16b /* ..and xor with iv */ |
27 | - encrypt_block v0, w3, x2, x5, w6 |
28 | + encrypt_block v0, w3, x2, x6, w7 |
29 | st1 {v0.16b}, [x0], #16 |
30 | subs w4, w4, #1 |
31 | bne .Lcbcencloop |
32 | + st1 {v0.16b}, [x5] /* return iv */ |
33 | ret |
34 | AES_ENDPROC(aes_cbc_encrypt) |
35 | |
36 | @@ -211,7 +212,7 @@ AES_ENTRY(aes_cbc_decrypt) |
37 | cbz w6, .LcbcdecloopNx |
38 | |
39 | ld1 {v7.16b}, [x5] /* get iv */ |
40 | - dec_prepare w3, x2, x5 |
41 | + dec_prepare w3, x2, x6 |
42 | |
43 | .LcbcdecloopNx: |
44 | #if INTERLEAVE >= 2 |
45 | @@ -248,7 +249,7 @@ AES_ENTRY(aes_cbc_decrypt) |
46 | .Lcbcdecloop: |
47 | ld1 {v1.16b}, [x1], #16 /* get next ct block */ |
48 | mov v0.16b, v1.16b /* ...and copy to v0 */ |
49 | - decrypt_block v0, w3, x2, x5, w6 |
50 | + decrypt_block v0, w3, x2, x6, w7 |
51 | eor v0.16b, v0.16b, v7.16b /* xor with iv => pt */ |
52 | mov v7.16b, v1.16b /* ct is next iv */ |
53 | st1 {v0.16b}, [x0], #16 |
54 | @@ -256,6 +257,7 @@ AES_ENTRY(aes_cbc_decrypt) |
55 | bne .Lcbcdecloop |
56 | .Lcbcdecout: |
57 | FRAME_POP |
58 | + st1 {v7.16b}, [x5] /* return iv */ |
59 | ret |
60 | AES_ENDPROC(aes_cbc_decrypt) |
61 | |
62 | @@ -267,24 +269,15 @@ AES_ENDPROC(aes_cbc_decrypt) |
63 | |
64 | AES_ENTRY(aes_ctr_encrypt) |
65 | FRAME_PUSH |
66 | - cbnz w6, .Lctrfirst /* 1st time around? */ |
67 | - umov x5, v4.d[1] /* keep swabbed ctr in reg */ |
68 | - rev x5, x5 |
69 | -#if INTERLEAVE >= 2 |
70 | - cmn w5, w4 /* 32 bit overflow? */ |
71 | - bcs .Lctrinc |
72 | - add x5, x5, #1 /* increment BE ctr */ |
73 | - b .LctrincNx |
74 | -#else |
75 | - b .Lctrinc |
76 | -#endif |
77 | -.Lctrfirst: |
78 | + cbz w6, .Lctrnotfirst /* 1st time around? */ |
79 | enc_prepare w3, x2, x6 |
80 | ld1 {v4.16b}, [x5] |
81 | - umov x5, v4.d[1] /* keep swabbed ctr in reg */ |
82 | - rev x5, x5 |
83 | + |
84 | +.Lctrnotfirst: |
85 | + umov x8, v4.d[1] /* keep swabbed ctr in reg */ |
86 | + rev x8, x8 |
87 | #if INTERLEAVE >= 2 |
88 | - cmn w5, w4 /* 32 bit overflow? */ |
89 | + cmn w8, w4 /* 32 bit overflow? */ |
90 | bcs .Lctrloop |
91 | .LctrloopNx: |
92 | subs w4, w4, #INTERLEAVE |
93 | @@ -292,11 +285,11 @@ AES_ENTRY(aes_ctr_encrypt) |
94 | #if INTERLEAVE == 2 |
95 | mov v0.8b, v4.8b |
96 | mov v1.8b, v4.8b |
97 | - rev x7, x5 |
98 | - add x5, x5, #1 |
99 | + rev x7, x8 |
100 | + add x8, x8, #1 |
101 | ins v0.d[1], x7 |
102 | - rev x7, x5 |
103 | - add x5, x5, #1 |
104 | + rev x7, x8 |
105 | + add x8, x8, #1 |
106 | ins v1.d[1], x7 |
107 | ld1 {v2.16b-v3.16b}, [x1], #32 /* get 2 input blocks */ |
108 | do_encrypt_block2x |
109 | @@ -305,7 +298,7 @@ AES_ENTRY(aes_ctr_encrypt) |
110 | st1 {v0.16b-v1.16b}, [x0], #32 |
111 | #else |
112 | ldr q8, =0x30000000200000001 /* addends 1,2,3[,0] */ |
113 | - dup v7.4s, w5 |
114 | + dup v7.4s, w8 |
115 | mov v0.16b, v4.16b |
116 | add v7.4s, v7.4s, v8.4s |
117 | mov v1.16b, v4.16b |
118 | @@ -323,18 +316,12 @@ AES_ENTRY(aes_ctr_encrypt) |
119 | eor v2.16b, v7.16b, v2.16b |
120 | eor v3.16b, v5.16b, v3.16b |
121 | st1 {v0.16b-v3.16b}, [x0], #64 |
122 | - add x5, x5, #INTERLEAVE |
123 | + add x8, x8, #INTERLEAVE |
124 | #endif |
125 | - cbz w4, .LctroutNx |
126 | -.LctrincNx: |
127 | - rev x7, x5 |
128 | + rev x7, x8 |
129 | ins v4.d[1], x7 |
130 | + cbz w4, .Lctrout |
131 | b .LctrloopNx |
132 | -.LctroutNx: |
133 | - sub x5, x5, #1 |
134 | - rev x7, x5 |
135 | - ins v4.d[1], x7 |
136 | - b .Lctrout |
137 | .Lctr1x: |
138 | adds w4, w4, #INTERLEAVE |
139 | beq .Lctrout |
140 | @@ -342,30 +329,39 @@ AES_ENTRY(aes_ctr_encrypt) |
141 | .Lctrloop: |
142 | mov v0.16b, v4.16b |
143 | encrypt_block v0, w3, x2, x6, w7 |
144 | + |
145 | + adds x8, x8, #1 /* increment BE ctr */ |
146 | + rev x7, x8 |
147 | + ins v4.d[1], x7 |
148 | + bcs .Lctrcarry /* overflow? */ |
149 | + |
150 | +.Lctrcarrydone: |
151 | subs w4, w4, #1 |
152 | bmi .Lctrhalfblock /* blocks < 0 means 1/2 block */ |
153 | ld1 {v3.16b}, [x1], #16 |
154 | eor v3.16b, v0.16b, v3.16b |
155 | st1 {v3.16b}, [x0], #16 |
156 | - beq .Lctrout |
157 | -.Lctrinc: |
158 | - adds x5, x5, #1 /* increment BE ctr */ |
159 | - rev x7, x5 |
160 | - ins v4.d[1], x7 |
161 | - bcc .Lctrloop /* no overflow? */ |
162 | - umov x7, v4.d[0] /* load upper word of ctr */ |
163 | - rev x7, x7 /* ... to handle the carry */ |
164 | - add x7, x7, #1 |
165 | - rev x7, x7 |
166 | - ins v4.d[0], x7 |
167 | - b .Lctrloop |
168 | + bne .Lctrloop |
169 | + |
170 | +.Lctrout: |
171 | + st1 {v4.16b}, [x5] /* return next CTR value */ |
172 | + FRAME_POP |
173 | + ret |
174 | + |
175 | .Lctrhalfblock: |
176 | ld1 {v3.8b}, [x1] |
177 | eor v3.8b, v0.8b, v3.8b |
178 | st1 {v3.8b}, [x0] |
179 | -.Lctrout: |
180 | FRAME_POP |
181 | ret |
182 | + |
183 | +.Lctrcarry: |
184 | + umov x7, v4.d[0] /* load upper word of ctr */ |
185 | + rev x7, x7 /* ... to handle the carry */ |
186 | + add x7, x7, #1 |
187 | + rev x7, x7 |
188 | + ins v4.d[0], x7 |
189 | + b .Lctrcarrydone |
190 | AES_ENDPROC(aes_ctr_encrypt) |
191 | .ltorg |
192 | |
193 | diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c |
194 | index 300382e5a2cc..c314db8b798c 100644 |
195 | --- a/arch/powerpc/kernel/eeh_driver.c |
196 | +++ b/arch/powerpc/kernel/eeh_driver.c |
197 | @@ -485,7 +485,7 @@ static void *eeh_pe_detach_dev(void *data, void *userdata) |
198 | static void *__eeh_clear_pe_frozen_state(void *data, void *flag) |
199 | { |
200 | struct eeh_pe *pe = (struct eeh_pe *)data; |
201 | - bool *clear_sw_state = flag; |
202 | + bool clear_sw_state = *(bool *)flag; |
203 | int i, rc = 1; |
204 | |
205 | for (i = 0; rc && i < 3; i++) |
206 | diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c |
207 | index 7b89e7b305e6..3139533640fc 100644 |
208 | --- a/arch/powerpc/kernel/prom_init.c |
209 | +++ b/arch/powerpc/kernel/prom_init.c |
210 | @@ -2664,6 +2664,9 @@ static void __init prom_find_boot_cpu(void) |
211 | |
212 | cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); |
213 | |
214 | + if (!PHANDLE_VALID(cpu_pkg)) |
215 | + return; |
216 | + |
217 | prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval)); |
218 | prom.cpu = be32_to_cpu(rval); |
219 | |
220 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c |
221 | index aaacbd667212..1e5d2f07416b 100644 |
222 | --- a/arch/x86/kernel/apic/io_apic.c |
223 | +++ b/arch/x86/kernel/apic/io_apic.c |
224 | @@ -2117,6 +2117,7 @@ static inline void __init check_timer(void) |
225 | if (idx != -1 && irq_trigger(idx)) |
226 | unmask_ioapic_irq(irq_get_chip_data(0)); |
227 | } |
228 | + irq_domain_deactivate_irq(irq_data); |
229 | irq_domain_activate_irq(irq_data); |
230 | if (timer_irq_works()) { |
231 | if (disable_timer_pin_1 > 0) |
232 | @@ -2138,6 +2139,7 @@ static inline void __init check_timer(void) |
233 | * legacy devices should be connected to IO APIC #0 |
234 | */ |
235 | replace_pin_at_irq_node(data, node, apic1, pin1, apic2, pin2); |
236 | + irq_domain_deactivate_irq(irq_data); |
237 | irq_domain_activate_irq(irq_data); |
238 | legacy_pic->unmask(0); |
239 | if (timer_irq_works()) { |
240 | diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c |
241 | index b8e6ff5cd5d0..acc9b8f19ca8 100644 |
242 | --- a/arch/x86/kernel/hpet.c |
243 | +++ b/arch/x86/kernel/hpet.c |
244 | @@ -351,6 +351,7 @@ static int hpet_resume(struct clock_event_device *evt, int timer) |
245 | } else { |
246 | struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt); |
247 | |
248 | + irq_domain_deactivate_irq(irq_get_irq_data(hdev->irq)); |
249 | irq_domain_activate_irq(irq_get_irq_data(hdev->irq)); |
250 | disable_irq(hdev->irq); |
251 | irq_set_affinity(hdev->irq, cpumask_of(hdev->cpu)); |
252 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
253 | index 25a6efcfdf7f..e75095fa414e 100644 |
254 | --- a/arch/x86/kvm/x86.c |
255 | +++ b/arch/x86/kvm/x86.c |
256 | @@ -3057,6 +3057,7 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu) |
257 | memcpy(dest, xsave, XSAVE_HDR_OFFSET); |
258 | |
259 | /* Set XSTATE_BV */ |
260 | + xstate_bv &= vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FPSSE; |
261 | *(u64 *)(dest + XSAVE_HDR_OFFSET) = xstate_bv; |
262 | |
263 | /* |
264 | diff --git a/crypto/algapi.c b/crypto/algapi.c |
265 | index 59bf491fe3d8..43f5bdb6b570 100644 |
266 | --- a/crypto/algapi.c |
267 | +++ b/crypto/algapi.c |
268 | @@ -357,6 +357,7 @@ int crypto_register_alg(struct crypto_alg *alg) |
269 | struct crypto_larval *larval; |
270 | int err; |
271 | |
272 | + alg->cra_flags &= ~CRYPTO_ALG_DEAD; |
273 | err = crypto_check_alg(alg); |
274 | if (err) |
275 | return err; |
276 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
277 | index bd370c98f77d..b0b77b61c40c 100644 |
278 | --- a/drivers/ata/libata-core.c |
279 | +++ b/drivers/ata/libata-core.c |
280 | @@ -4139,10 +4139,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
281 | { "ST380013AS", "3.20", ATA_HORKAGE_MAX_SEC_1024 }, |
282 | |
283 | /* |
284 | - * Device times out with higher max sects. |
285 | + * These devices time out with higher max sects. |
286 | * https://bugzilla.kernel.org/show_bug.cgi?id=121671 |
287 | */ |
288 | - { "LITEON CX1-JB256-HP", NULL, ATA_HORKAGE_MAX_SEC_1024 }, |
289 | + { "LITEON CX1-JB*-HP", NULL, ATA_HORKAGE_MAX_SEC_1024 }, |
290 | |
291 | /* Devices we expect to fail diagnostics */ |
292 | |
293 | diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c |
294 | index bd74ee555278..729f26322095 100644 |
295 | --- a/drivers/ata/sata_mv.c |
296 | +++ b/drivers/ata/sata_mv.c |
297 | @@ -4121,6 +4121,9 @@ static int mv_platform_probe(struct platform_device *pdev) |
298 | host->iomap = NULL; |
299 | hpriv->base = devm_ioremap(&pdev->dev, res->start, |
300 | resource_size(res)); |
301 | + if (!hpriv->base) |
302 | + return -ENOMEM; |
303 | + |
304 | hpriv->base -= SATAHC0_REG_BASE; |
305 | |
306 | hpriv->clk = clk_get(&pdev->dev, NULL); |
307 | diff --git a/drivers/base/memory.c b/drivers/base/memory.c |
308 | index 25425d3f2575..48c0a1d0dd3a 100644 |
309 | --- a/drivers/base/memory.c |
310 | +++ b/drivers/base/memory.c |
311 | @@ -388,30 +388,29 @@ static ssize_t show_valid_zones(struct device *dev, |
312 | { |
313 | struct memory_block *mem = to_memory_block(dev); |
314 | unsigned long start_pfn, end_pfn; |
315 | + unsigned long valid_start, valid_end; |
316 | unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; |
317 | - struct page *first_page; |
318 | struct zone *zone; |
319 | |
320 | start_pfn = section_nr_to_pfn(mem->start_section_nr); |
321 | end_pfn = start_pfn + nr_pages; |
322 | - first_page = pfn_to_page(start_pfn); |
323 | |
324 | /* The block contains more than one zone can not be offlined. */ |
325 | - if (!test_pages_in_a_zone(start_pfn, end_pfn)) |
326 | + if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) |
327 | return sprintf(buf, "none\n"); |
328 | |
329 | - zone = page_zone(first_page); |
330 | + zone = page_zone(pfn_to_page(valid_start)); |
331 | |
332 | if (zone_idx(zone) == ZONE_MOVABLE - 1) { |
333 | /*The mem block is the last memoryblock of this zone.*/ |
334 | - if (end_pfn == zone_end_pfn(zone)) |
335 | + if (valid_end == zone_end_pfn(zone)) |
336 | return sprintf(buf, "%s %s\n", |
337 | zone->name, (zone + 1)->name); |
338 | } |
339 | |
340 | if (zone_idx(zone) == ZONE_MOVABLE) { |
341 | /*The mem block is the first memoryblock of ZONE_MOVABLE.*/ |
342 | - if (start_pfn == zone->zone_start_pfn) |
343 | + if (valid_start == zone->zone_start_pfn) |
344 | return sprintf(buf, "%s %s\n", |
345 | zone->name, (zone - 1)->name); |
346 | } |
347 | diff --git a/drivers/gpu/drm/nouveau/dispnv04/hw.c b/drivers/gpu/drm/nouveau/dispnv04/hw.c |
348 | index 956a833b8200..57c7389feee4 100644 |
349 | --- a/drivers/gpu/drm/nouveau/dispnv04/hw.c |
350 | +++ b/drivers/gpu/drm/nouveau/dispnv04/hw.c |
351 | @@ -222,6 +222,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) |
352 | uint32_t mpllP; |
353 | |
354 | pci_read_config_dword(pci_get_bus_and_slot(0, 3), 0x6c, &mpllP); |
355 | + mpllP = (mpllP >> 8) & 0xf; |
356 | if (!mpllP) |
357 | mpllP = 4; |
358 | |
359 | @@ -232,7 +233,7 @@ nouveau_hw_get_clock(struct drm_device *dev, enum nvbios_pll_type plltype) |
360 | uint32_t clock; |
361 | |
362 | pci_read_config_dword(pci_get_bus_and_slot(0, 5), 0x4c, &clock); |
363 | - return clock; |
364 | + return clock / 1000; |
365 | } |
366 | |
367 | ret = nouveau_hw_get_pllvals(dev, plltype, &pllvals); |
368 | diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c |
369 | index c1590b746f13..eb58cd7bfbc9 100644 |
370 | --- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c |
371 | +++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/hdagt215.c |
372 | @@ -59,7 +59,7 @@ gt215_hda_eld(NV50_DISP_MTHD_V1) |
373 | ); |
374 | } |
375 | for (i = 0; i < size; i++) |
376 | - nvkm_wr32(device, 0x61c440 + soff, (i << 8) | args->v0.data[0]); |
377 | + nvkm_wr32(device, 0x61c440 + soff, (i << 8) | args->v0.data[i]); |
378 | for (; i < 0x60; i++) |
379 | nvkm_wr32(device, 0x61c440 + soff, (i << 8)); |
380 | nvkm_mask(device, 0x61c448 + soff, 0x80000003, 0x80000003); |
381 | diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c |
382 | index 5c02d7bbc7f2..35e3fd9fadf6 100644 |
383 | --- a/drivers/hid/wacom_wac.c |
384 | +++ b/drivers/hid/wacom_wac.c |
385 | @@ -148,19 +148,21 @@ static int wacom_pl_irq(struct wacom_wac *wacom) |
386 | wacom->id[0] = STYLUS_DEVICE_ID; |
387 | } |
388 | |
389 | - pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); |
390 | - if (features->pressure_max > 255) |
391 | - pressure = (pressure << 1) | ((data[4] >> 6) & 1); |
392 | - pressure += (features->pressure_max + 1) / 2; |
393 | - |
394 | - input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); |
395 | - input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); |
396 | - input_report_abs(input, ABS_PRESSURE, pressure); |
397 | - |
398 | - input_report_key(input, BTN_TOUCH, data[4] & 0x08); |
399 | - input_report_key(input, BTN_STYLUS, data[4] & 0x10); |
400 | - /* Only allow the stylus2 button to be reported for the pen tool. */ |
401 | - input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); |
402 | + if (prox) { |
403 | + pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); |
404 | + if (features->pressure_max > 255) |
405 | + pressure = (pressure << 1) | ((data[4] >> 6) & 1); |
406 | + pressure += (features->pressure_max + 1) / 2; |
407 | + |
408 | + input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); |
409 | + input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); |
410 | + input_report_abs(input, ABS_PRESSURE, pressure); |
411 | + |
412 | + input_report_key(input, BTN_TOUCH, data[4] & 0x08); |
413 | + input_report_key(input, BTN_STYLUS, data[4] & 0x10); |
414 | + /* Only allow the stylus2 button to be reported for the pen tool. */ |
415 | + input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20)); |
416 | + } |
417 | |
418 | if (!prox) |
419 | wacom->id[0] = 0; |
420 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c |
421 | index 7277dfd7338f..bda164089904 100644 |
422 | --- a/drivers/mmc/host/sdhci.c |
423 | +++ b/drivers/mmc/host/sdhci.c |
424 | @@ -2629,7 +2629,8 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) |
425 | pr_err("%s: Card is consuming too much power!\n", |
426 | mmc_hostname(host->mmc)); |
427 | |
428 | - if (intmask & SDHCI_INT_CARD_INT) { |
429 | + if ((intmask & SDHCI_INT_CARD_INT) && |
430 | + (host->ier & SDHCI_INT_CARD_INT)) { |
431 | sdhci_enable_sdio_irq_nolock(host, false); |
432 | host->thread_isr |= SDHCI_INT_CARD_INT; |
433 | result = IRQ_WAKE_THREAD; |
434 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c |
435 | index 317e3558a35e..c6a012b5ba39 100644 |
436 | --- a/drivers/pci/pcie/aspm.c |
437 | +++ b/drivers/pci/pcie/aspm.c |
438 | @@ -518,25 +518,32 @@ static struct pcie_link_state *alloc_pcie_link_state(struct pci_dev *pdev) |
439 | link = kzalloc(sizeof(*link), GFP_KERNEL); |
440 | if (!link) |
441 | return NULL; |
442 | + |
443 | INIT_LIST_HEAD(&link->sibling); |
444 | INIT_LIST_HEAD(&link->children); |
445 | INIT_LIST_HEAD(&link->link); |
446 | link->pdev = pdev; |
447 | - if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) { |
448 | + |
449 | + /* |
450 | + * Root Ports and PCI/PCI-X to PCIe Bridges are roots of PCIe |
451 | + * hierarchies. |
452 | + */ |
453 | + if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT || |
454 | + pci_pcie_type(pdev) == PCI_EXP_TYPE_PCIE_BRIDGE) { |
455 | + link->root = link; |
456 | + } else { |
457 | struct pcie_link_state *parent; |
458 | + |
459 | parent = pdev->bus->parent->self->link_state; |
460 | if (!parent) { |
461 | kfree(link); |
462 | return NULL; |
463 | } |
464 | + |
465 | link->parent = parent; |
466 | + link->root = link->parent->root; |
467 | list_add(&link->link, &parent->children); |
468 | } |
469 | - /* Setup a pointer to the root port link */ |
470 | - if (!link->parent) |
471 | - link->root = link; |
472 | - else |
473 | - link->root = link->parent->root; |
474 | |
475 | list_add(&link->sibling, &link_list); |
476 | pdev->link_state = link; |
477 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
478 | index d2e50a27140c..24f9f98968a5 100644 |
479 | --- a/drivers/usb/core/quirks.c |
480 | +++ b/drivers/usb/core/quirks.c |
481 | @@ -37,6 +37,10 @@ static const struct usb_device_id usb_quirk_list[] = { |
482 | /* CBM - Flash disk */ |
483 | { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, |
484 | |
485 | + /* WORLDE easy key (easykey.25) MIDI controller */ |
486 | + { USB_DEVICE(0x0218, 0x0401), .driver_info = |
487 | + USB_QUIRK_CONFIG_INTF_STRINGS }, |
488 | + |
489 | /* HP 5300/5370C scanner */ |
490 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = |
491 | USB_QUIRK_STRING_FETCH_255 }, |
492 | diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c |
493 | index 803c503a2e3d..cfda1a1c0ab6 100644 |
494 | --- a/drivers/usb/gadget/function/f_fs.c |
495 | +++ b/drivers/usb/gadget/function/f_fs.c |
496 | @@ -2079,6 +2079,8 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, |
497 | if (len < sizeof(*d) || h->interface >= ffs->interfaces_count) |
498 | return -EINVAL; |
499 | length = le32_to_cpu(d->dwSize); |
500 | + if (len < length) |
501 | + return -EINVAL; |
502 | type = le32_to_cpu(d->dwPropertyDataType); |
503 | if (type < USB_EXT_PROP_UNICODE || |
504 | type > USB_EXT_PROP_UNICODE_MULTI) { |
505 | @@ -2087,6 +2089,11 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, |
506 | return -EINVAL; |
507 | } |
508 | pnl = le16_to_cpu(d->wPropertyNameLength); |
509 | + if (length < 14 + pnl) { |
510 | + pr_vdebug("invalid os descriptor length: %d pnl:%d (descriptor %d)\n", |
511 | + length, pnl, type); |
512 | + return -EINVAL; |
513 | + } |
514 | pdl = le32_to_cpu(*(u32 *)((u8 *)data + 10 + pnl)); |
515 | if (length != 14 + pnl + pdl) { |
516 | pr_vdebug("invalid os descriptor length: %d pnl:%d pdl:%d (descriptor %d)\n", |
517 | @@ -2171,6 +2178,9 @@ static int __ffs_data_got_descs(struct ffs_data *ffs, |
518 | } |
519 | } |
520 | if (flags & (1 << i)) { |
521 | + if (len < 4) { |
522 | + goto error; |
523 | + } |
524 | os_descs_count = get_unaligned_le32(data); |
525 | data += 4; |
526 | len -= 4; |
527 | @@ -2243,7 +2253,8 @@ static int __ffs_data_got_strings(struct ffs_data *ffs, |
528 | |
529 | ENTER(); |
530 | |
531 | - if (unlikely(get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC || |
532 | + if (unlikely(len < 16 || |
533 | + get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC || |
534 | get_unaligned_le32(data + 4) != len)) |
535 | goto error; |
536 | str_count = get_unaligned_le32(data + 8); |
537 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
538 | index 7ce31a4c7e7f..42cc72e54c05 100644 |
539 | --- a/drivers/usb/serial/option.c |
540 | +++ b/drivers/usb/serial/option.c |
541 | @@ -2007,6 +2007,7 @@ static const struct usb_device_id option_ids[] = { |
542 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD200, 0xff, 0xff, 0xff) }, |
543 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_6802, 0xff, 0xff, 0xff) }, |
544 | { USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD300, 0xff, 0xff, 0xff) }, |
545 | + { USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x421d, 0xff, 0xff, 0xff) }, /* HP lt2523 (Novatel E371) */ |
546 | { } /* Terminating entry */ |
547 | }; |
548 | MODULE_DEVICE_TABLE(usb, option_ids); |
549 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
550 | index 46fca6b75846..1db4b61bdf7b 100644 |
551 | --- a/drivers/usb/serial/pl2303.c |
552 | +++ b/drivers/usb/serial/pl2303.c |
553 | @@ -49,6 +49,7 @@ static const struct usb_device_id id_table[] = { |
554 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
555 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, |
556 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, |
557 | + { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) }, |
558 | { USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) }, |
559 | { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) }, |
560 | { USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) }, |
561 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
562 | index e3b7af8adfb7..09d9be88209e 100644 |
563 | --- a/drivers/usb/serial/pl2303.h |
564 | +++ b/drivers/usb/serial/pl2303.h |
565 | @@ -27,6 +27,7 @@ |
566 | #define ATEN_VENDOR_ID 0x0557 |
567 | #define ATEN_VENDOR_ID2 0x0547 |
568 | #define ATEN_PRODUCT_ID 0x2008 |
569 | +#define ATEN_PRODUCT_ID2 0x2118 |
570 | |
571 | #define IODATA_VENDOR_ID 0x04bb |
572 | #define IODATA_PRODUCT_ID 0x0a03 |
573 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c |
574 | index 1bc6089b9008..696458db7e3c 100644 |
575 | --- a/drivers/usb/serial/qcserial.c |
576 | +++ b/drivers/usb/serial/qcserial.c |
577 | @@ -124,6 +124,7 @@ static const struct usb_device_id id_table[] = { |
578 | {USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */ |
579 | {USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */ |
580 | {USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */ |
581 | + {USB_DEVICE(0x413c, 0x81a6)}, /* Dell DW5570 QDL (MC8805) */ |
582 | {USB_DEVICE(0x1199, 0x68a4)}, /* Sierra Wireless QDL */ |
583 | {USB_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */ |
584 | {USB_DEVICE(0x1199, 0x68a8)}, /* Sierra Wireless QDL */ |
585 | diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c |
586 | index 833e5844a2db..97d1a15873c5 100644 |
587 | --- a/fs/cifs/readdir.c |
588 | +++ b/fs/cifs/readdir.c |
589 | @@ -282,6 +282,7 @@ initiate_cifs_search(const unsigned int xid, struct file *file) |
590 | rc = -ENOMEM; |
591 | goto error_exit; |
592 | } |
593 | + spin_lock_init(&cifsFile->file_info_lock); |
594 | file->private_data = cifsFile; |
595 | cifsFile->tlink = cifs_get_tlink(tlink); |
596 | tcon = tlink_tcon(tlink); |
597 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
598 | index 68640e6f95c5..b405a7b74ce0 100644 |
599 | --- a/fs/ext4/super.c |
600 | +++ b/fs/ext4/super.c |
601 | @@ -3663,6 +3663,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) |
602 | (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); |
603 | db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / |
604 | EXT4_DESC_PER_BLOCK(sb); |
605 | + if (ext4_has_feature_meta_bg(sb)) { |
606 | + if (le32_to_cpu(es->s_first_meta_bg) >= db_count) { |
607 | + ext4_msg(sb, KERN_WARNING, |
608 | + "first meta block group too large: %u " |
609 | + "(group descriptor block count %u)", |
610 | + le32_to_cpu(es->s_first_meta_bg), db_count); |
611 | + goto failed_mount; |
612 | + } |
613 | + } |
614 | sbi->s_group_desc = ext4_kvmalloc(db_count * |
615 | sizeof(struct buffer_head *), |
616 | GFP_KERNEL); |
617 | diff --git a/fs/nfsd/nfs4layouts.c b/fs/nfsd/nfs4layouts.c |
618 | index c9d6c715c0fb..9eed219f57a5 100644 |
619 | --- a/fs/nfsd/nfs4layouts.c |
620 | +++ b/fs/nfsd/nfs4layouts.c |
621 | @@ -189,10 +189,11 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate, |
622 | struct nfs4_layout_stateid *ls; |
623 | struct nfs4_stid *stp; |
624 | |
625 | - stp = nfs4_alloc_stid(cstate->clp, nfs4_layout_stateid_cache); |
626 | + stp = nfs4_alloc_stid(cstate->clp, nfs4_layout_stateid_cache, |
627 | + nfsd4_free_layout_stateid); |
628 | if (!stp) |
629 | return NULL; |
630 | - stp->sc_free = nfsd4_free_layout_stateid; |
631 | + |
632 | get_nfs4_file(fp); |
633 | stp->sc_file = fp; |
634 | |
635 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
636 | index 55638110cb06..c7f1ce41442a 100644 |
637 | --- a/fs/nfsd/nfs4state.c |
638 | +++ b/fs/nfsd/nfs4state.c |
639 | @@ -553,8 +553,8 @@ out: |
640 | return co; |
641 | } |
642 | |
643 | -struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, |
644 | - struct kmem_cache *slab) |
645 | +struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab, |
646 | + void (*sc_free)(struct nfs4_stid *)) |
647 | { |
648 | struct nfs4_stid *stid; |
649 | int new_id; |
650 | @@ -570,6 +570,8 @@ struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, |
651 | idr_preload_end(); |
652 | if (new_id < 0) |
653 | goto out_free; |
654 | + |
655 | + stid->sc_free = sc_free; |
656 | stid->sc_client = cl; |
657 | stid->sc_stateid.si_opaque.so_id = new_id; |
658 | stid->sc_stateid.si_opaque.so_clid = cl->cl_clientid; |
659 | @@ -595,15 +597,12 @@ out_free: |
660 | static struct nfs4_ol_stateid * nfs4_alloc_open_stateid(struct nfs4_client *clp) |
661 | { |
662 | struct nfs4_stid *stid; |
663 | - struct nfs4_ol_stateid *stp; |
664 | |
665 | - stid = nfs4_alloc_stid(clp, stateid_slab); |
666 | + stid = nfs4_alloc_stid(clp, stateid_slab, nfs4_free_ol_stateid); |
667 | if (!stid) |
668 | return NULL; |
669 | |
670 | - stp = openlockstateid(stid); |
671 | - stp->st_stid.sc_free = nfs4_free_ol_stateid; |
672 | - return stp; |
673 | + return openlockstateid(stid); |
674 | } |
675 | |
676 | static void nfs4_free_deleg(struct nfs4_stid *stid) |
677 | @@ -701,11 +700,10 @@ alloc_init_deleg(struct nfs4_client *clp, struct svc_fh *current_fh, |
678 | goto out_dec; |
679 | if (delegation_blocked(¤t_fh->fh_handle)) |
680 | goto out_dec; |
681 | - dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab)); |
682 | + dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab, nfs4_free_deleg)); |
683 | if (dp == NULL) |
684 | goto out_dec; |
685 | |
686 | - dp->dl_stid.sc_free = nfs4_free_deleg; |
687 | /* |
688 | * delegation seqid's are never incremented. The 4.1 special |
689 | * meaning of seqid 0 isn't meaningful, really, but let's avoid |
690 | @@ -5396,7 +5394,6 @@ init_lock_stateid(struct nfs4_ol_stateid *stp, struct nfs4_lockowner *lo, |
691 | stp->st_stateowner = nfs4_get_stateowner(&lo->lo_owner); |
692 | get_nfs4_file(fp); |
693 | stp->st_stid.sc_file = fp; |
694 | - stp->st_stid.sc_free = nfs4_free_lock_stateid; |
695 | stp->st_access_bmap = 0; |
696 | stp->st_deny_bmap = open_stp->st_deny_bmap; |
697 | stp->st_openstp = open_stp; |
698 | @@ -5439,7 +5436,7 @@ find_or_create_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fi, |
699 | lst = find_lock_stateid(lo, fi); |
700 | if (lst == NULL) { |
701 | spin_unlock(&clp->cl_lock); |
702 | - ns = nfs4_alloc_stid(clp, stateid_slab); |
703 | + ns = nfs4_alloc_stid(clp, stateid_slab, nfs4_free_lock_stateid); |
704 | if (ns == NULL) |
705 | return NULL; |
706 | |
707 | diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h |
708 | index 77860b75da9d..5134eedcb16c 100644 |
709 | --- a/fs/nfsd/state.h |
710 | +++ b/fs/nfsd/state.h |
711 | @@ -583,8 +583,8 @@ extern __be32 nfs4_preprocess_stateid_op(struct svc_rqst *rqstp, |
712 | __be32 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, |
713 | stateid_t *stateid, unsigned char typemask, |
714 | struct nfs4_stid **s, struct nfsd_net *nn); |
715 | -struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, |
716 | - struct kmem_cache *slab); |
717 | +struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab, |
718 | + void (*sc_free)(struct nfs4_stid *)); |
719 | void nfs4_unhash_stid(struct nfs4_stid *s); |
720 | void nfs4_put_stid(struct nfs4_stid *s); |
721 | void nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid); |
722 | diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h |
723 | index 2ea574ff9714..538488bd1d3d 100644 |
724 | --- a/include/linux/memory_hotplug.h |
725 | +++ b/include/linux/memory_hotplug.h |
726 | @@ -85,7 +85,8 @@ extern int zone_grow_waitqueues(struct zone *zone, unsigned long nr_pages); |
727 | extern int add_one_highpage(struct page *page, int pfn, int bad_ppro); |
728 | /* VM interface that may be used by firmware interface */ |
729 | extern int online_pages(unsigned long, unsigned long, int); |
730 | -extern int test_pages_in_a_zone(unsigned long, unsigned long); |
731 | +extern int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, |
732 | + unsigned long *valid_start, unsigned long *valid_end); |
733 | extern void __offline_isolated_pages(unsigned long, unsigned long); |
734 | |
735 | typedef void (*online_page_callback_t)(struct page *page); |
736 | diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h |
737 | index 12c9b485beb7..abd7c01c84db 100644 |
738 | --- a/include/linux/percpu-refcount.h |
739 | +++ b/include/linux/percpu-refcount.h |
740 | @@ -206,7 +206,7 @@ static inline void percpu_ref_get(struct percpu_ref *ref) |
741 | static inline bool percpu_ref_tryget(struct percpu_ref *ref) |
742 | { |
743 | unsigned long __percpu *percpu_count; |
744 | - int ret; |
745 | + bool ret; |
746 | |
747 | rcu_read_lock_sched(); |
748 | |
749 | @@ -240,7 +240,7 @@ static inline bool percpu_ref_tryget(struct percpu_ref *ref) |
750 | static inline bool percpu_ref_tryget_live(struct percpu_ref *ref) |
751 | { |
752 | unsigned long __percpu *percpu_count; |
753 | - int ret = false; |
754 | + bool ret = false; |
755 | |
756 | rcu_read_lock_sched(); |
757 | |
758 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
759 | index bc6371b0e4fb..9bbe9ac23cf2 100644 |
760 | --- a/kernel/events/core.c |
761 | +++ b/kernel/events/core.c |
762 | @@ -6039,6 +6039,27 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) |
763 | char *buf = NULL; |
764 | char *name; |
765 | |
766 | + if (vma->vm_flags & VM_READ) |
767 | + prot |= PROT_READ; |
768 | + if (vma->vm_flags & VM_WRITE) |
769 | + prot |= PROT_WRITE; |
770 | + if (vma->vm_flags & VM_EXEC) |
771 | + prot |= PROT_EXEC; |
772 | + |
773 | + if (vma->vm_flags & VM_MAYSHARE) |
774 | + flags = MAP_SHARED; |
775 | + else |
776 | + flags = MAP_PRIVATE; |
777 | + |
778 | + if (vma->vm_flags & VM_DENYWRITE) |
779 | + flags |= MAP_DENYWRITE; |
780 | + if (vma->vm_flags & VM_MAYEXEC) |
781 | + flags |= MAP_EXECUTABLE; |
782 | + if (vma->vm_flags & VM_LOCKED) |
783 | + flags |= MAP_LOCKED; |
784 | + if (vma->vm_flags & VM_HUGETLB) |
785 | + flags |= MAP_HUGETLB; |
786 | + |
787 | if (file) { |
788 | struct inode *inode; |
789 | dev_t dev; |
790 | @@ -6065,27 +6086,6 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event) |
791 | maj = MAJOR(dev); |
792 | min = MINOR(dev); |
793 | |
794 | - if (vma->vm_flags & VM_READ) |
795 | - prot |= PROT_READ; |
796 | - if (vma->vm_flags & VM_WRITE) |
797 | - prot |= PROT_WRITE; |
798 | - if (vma->vm_flags & VM_EXEC) |
799 | - prot |= PROT_EXEC; |
800 | - |
801 | - if (vma->vm_flags & VM_MAYSHARE) |
802 | - flags = MAP_SHARED; |
803 | - else |
804 | - flags = MAP_PRIVATE; |
805 | - |
806 | - if (vma->vm_flags & VM_DENYWRITE) |
807 | - flags |= MAP_DENYWRITE; |
808 | - if (vma->vm_flags & VM_MAYEXEC) |
809 | - flags |= MAP_EXECUTABLE; |
810 | - if (vma->vm_flags & VM_LOCKED) |
811 | - flags |= MAP_LOCKED; |
812 | - if (vma->vm_flags & VM_HUGETLB) |
813 | - flags |= MAP_HUGETLB; |
814 | - |
815 | goto got_name; |
816 | } else { |
817 | if (vma->vm_ops && vma->vm_ops->name) { |
818 | diff --git a/mm/filemap.c b/mm/filemap.c |
819 | index c588d1222b2a..c33c31d75a2b 100644 |
820 | --- a/mm/filemap.c |
821 | +++ b/mm/filemap.c |
822 | @@ -1559,6 +1559,11 @@ static ssize_t do_generic_file_read(struct file *filp, loff_t *ppos, |
823 | |
824 | cond_resched(); |
825 | find_page: |
826 | + if (fatal_signal_pending(current)) { |
827 | + error = -EINTR; |
828 | + goto out; |
829 | + } |
830 | + |
831 | page = find_get_page(mapping, index); |
832 | if (!page) { |
833 | page_cache_sync_readahead(mapping, |
834 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c |
835 | index a042a9d537bb..a18923e4359d 100644 |
836 | --- a/mm/memory_hotplug.c |
837 | +++ b/mm/memory_hotplug.c |
838 | @@ -1371,17 +1371,20 @@ int is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) |
839 | } |
840 | |
841 | /* |
842 | - * Confirm all pages in a range [start, end) is belongs to the same zone. |
843 | + * Confirm all pages in a range [start, end) belong to the same zone. |
844 | + * When true, return its valid [start, end). |
845 | */ |
846 | -int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) |
847 | +int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn, |
848 | + unsigned long *valid_start, unsigned long *valid_end) |
849 | { |
850 | unsigned long pfn, sec_end_pfn; |
851 | + unsigned long start, end; |
852 | struct zone *zone = NULL; |
853 | struct page *page; |
854 | int i; |
855 | - for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn); |
856 | + for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn + 1); |
857 | pfn < end_pfn; |
858 | - pfn = sec_end_pfn + 1, sec_end_pfn += PAGES_PER_SECTION) { |
859 | + pfn = sec_end_pfn, sec_end_pfn += PAGES_PER_SECTION) { |
860 | /* Make sure the memory section is present first */ |
861 | if (!present_section_nr(pfn_to_section_nr(pfn))) |
862 | continue; |
863 | @@ -1397,10 +1400,20 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) |
864 | page = pfn_to_page(pfn + i); |
865 | if (zone && page_zone(page) != zone) |
866 | return 0; |
867 | + if (!zone) |
868 | + start = pfn + i; |
869 | zone = page_zone(page); |
870 | + end = pfn + MAX_ORDER_NR_PAGES; |
871 | } |
872 | } |
873 | - return 1; |
874 | + |
875 | + if (zone) { |
876 | + *valid_start = start; |
877 | + *valid_end = end; |
878 | + return 1; |
879 | + } else { |
880 | + return 0; |
881 | + } |
882 | } |
883 | |
884 | /* |
885 | @@ -1718,6 +1731,7 @@ static int __ref __offline_pages(unsigned long start_pfn, |
886 | long offlined_pages; |
887 | int ret, drain, retry_max, node; |
888 | unsigned long flags; |
889 | + unsigned long valid_start, valid_end; |
890 | struct zone *zone; |
891 | struct memory_notify arg; |
892 | |
893 | @@ -1728,10 +1742,10 @@ static int __ref __offline_pages(unsigned long start_pfn, |
894 | return -EINVAL; |
895 | /* This makes hotplug much easier...and readable. |
896 | we assume this for now. .*/ |
897 | - if (!test_pages_in_a_zone(start_pfn, end_pfn)) |
898 | + if (!test_pages_in_a_zone(start_pfn, end_pfn, &valid_start, &valid_end)) |
899 | return -EINVAL; |
900 | |
901 | - zone = page_zone(pfn_to_page(start_pfn)); |
902 | + zone = page_zone(pfn_to_page(valid_start)); |
903 | node = zone_to_nid(zone); |
904 | nr_pages = end_pfn - start_pfn; |
905 | |
906 | diff --git a/mm/zswap.c b/mm/zswap.c |
907 | index 340261946fda..45476f429789 100644 |
908 | --- a/mm/zswap.c |
909 | +++ b/mm/zswap.c |
910 | @@ -78,7 +78,13 @@ static u64 zswap_duplicate_entry; |
911 | |
912 | /* Enable/disable zswap (disabled by default) */ |
913 | static bool zswap_enabled; |
914 | -module_param_named(enabled, zswap_enabled, bool, 0644); |
915 | +static int zswap_enabled_param_set(const char *, |
916 | + const struct kernel_param *); |
917 | +static struct kernel_param_ops zswap_enabled_param_ops = { |
918 | + .set = zswap_enabled_param_set, |
919 | + .get = param_get_bool, |
920 | +}; |
921 | +module_param_cb(enabled, &zswap_enabled_param_ops, &zswap_enabled, 0644); |
922 | |
923 | /* Crypto compressor to use */ |
924 | #define ZSWAP_COMPRESSOR_DEFAULT "lzo" |
925 | @@ -176,6 +182,9 @@ static atomic_t zswap_pools_count = ATOMIC_INIT(0); |
926 | /* used by param callback function */ |
927 | static bool zswap_init_started; |
928 | |
929 | +/* fatal error during init */ |
930 | +static bool zswap_init_failed; |
931 | + |
932 | /********************************* |
933 | * helpers and fwd declarations |
934 | **********************************/ |
935 | @@ -702,6 +711,11 @@ static int __zswap_param_set(const char *val, const struct kernel_param *kp, |
936 | char *s = strstrip((char *)val); |
937 | int ret; |
938 | |
939 | + if (zswap_init_failed) { |
940 | + pr_err("can't set param, initialization failed\n"); |
941 | + return -ENODEV; |
942 | + } |
943 | + |
944 | /* no change required */ |
945 | if (!strcmp(s, *(char **)kp->arg)) |
946 | return 0; |
947 | @@ -781,6 +795,17 @@ static int zswap_zpool_param_set(const char *val, |
948 | return __zswap_param_set(val, kp, NULL, zswap_compressor); |
949 | } |
950 | |
951 | +static int zswap_enabled_param_set(const char *val, |
952 | + const struct kernel_param *kp) |
953 | +{ |
954 | + if (zswap_init_failed) { |
955 | + pr_err("can't enable, initialization failed\n"); |
956 | + return -ENODEV; |
957 | + } |
958 | + |
959 | + return param_set_bool(val, kp); |
960 | +} |
961 | + |
962 | /********************************* |
963 | * writeback code |
964 | **********************************/ |
965 | @@ -1267,6 +1292,9 @@ pool_fail: |
966 | dstmem_fail: |
967 | zswap_entry_cache_destroy(); |
968 | cache_fail: |
969 | + /* if built-in, we aren't unloaded on failure; don't allow use */ |
970 | + zswap_init_failed = true; |
971 | + zswap_enabled = false; |
972 | return -ENOMEM; |
973 | } |
974 | /* must be late so crypto has time to come up */ |
975 | diff --git a/net/can/bcm.c b/net/can/bcm.c |
976 | index 8ef1afacad82..24d66c1cc0cd 100644 |
977 | --- a/net/can/bcm.c |
978 | +++ b/net/can/bcm.c |
979 | @@ -710,14 +710,23 @@ static struct bcm_op *bcm_find_op(struct list_head *ops, canid_t can_id, |
980 | |
981 | static void bcm_remove_op(struct bcm_op *op) |
982 | { |
983 | - hrtimer_cancel(&op->timer); |
984 | - hrtimer_cancel(&op->thrtimer); |
985 | - |
986 | - if (op->tsklet.func) |
987 | - tasklet_kill(&op->tsklet); |
988 | + if (op->tsklet.func) { |
989 | + while (test_bit(TASKLET_STATE_SCHED, &op->tsklet.state) || |
990 | + test_bit(TASKLET_STATE_RUN, &op->tsklet.state) || |
991 | + hrtimer_active(&op->timer)) { |
992 | + hrtimer_cancel(&op->timer); |
993 | + tasklet_kill(&op->tsklet); |
994 | + } |
995 | + } |
996 | |
997 | - if (op->thrtsklet.func) |
998 | - tasklet_kill(&op->thrtsklet); |
999 | + if (op->thrtsklet.func) { |
1000 | + while (test_bit(TASKLET_STATE_SCHED, &op->thrtsklet.state) || |
1001 | + test_bit(TASKLET_STATE_RUN, &op->thrtsklet.state) || |
1002 | + hrtimer_active(&op->thrtimer)) { |
1003 | + hrtimer_cancel(&op->thrtimer); |
1004 | + tasklet_kill(&op->thrtsklet); |
1005 | + } |
1006 | + } |
1007 | |
1008 | if ((op->frames) && (op->frames != &op->sframe)) |
1009 | kfree(op->frames); |
1010 | diff --git a/net/sunrpc/auth_gss/gss_rpc_xdr.c b/net/sunrpc/auth_gss/gss_rpc_xdr.c |
1011 | index eeeba5adee6d..2410d557ae39 100644 |
1012 | --- a/net/sunrpc/auth_gss/gss_rpc_xdr.c |
1013 | +++ b/net/sunrpc/auth_gss/gss_rpc_xdr.c |
1014 | @@ -260,7 +260,7 @@ static int gssx_dec_option_array(struct xdr_stream *xdr, |
1015 | if (!oa->data) |
1016 | return -ENOMEM; |
1017 | |
1018 | - creds = kmalloc(sizeof(struct svc_cred), GFP_KERNEL); |
1019 | + creds = kzalloc(sizeof(struct svc_cred), GFP_KERNEL); |
1020 | if (!creds) { |
1021 | kfree(oa->data); |
1022 | return -ENOMEM; |