Magellan Linux

Contents of /trunk/kernel26-alx/patches-3.10/0136-3.10.37-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2672 - (show annotations) (download)
Tue Jul 21 16:46:35 2015 UTC (8 years, 10 months ago) by niro
File size: 50505 byte(s)
-3.10.84-alx-r1
1 diff --git a/Makefile b/Makefile
2 index b5f4ef30f6e6..bd9fb5b72fc0 100644
3 --- a/Makefile
4 +++ b/Makefile
5 @@ -1,6 +1,6 @@
6 VERSION = 3
7 PATCHLEVEL = 10
8 -SUBLEVEL = 36
9 +SUBLEVEL = 37
10 EXTRAVERSION =
11 NAME = TOSSUG Baby Fish
12
13 diff --git a/arch/arc/boot/dts/nsimosci.dts b/arch/arc/boot/dts/nsimosci.dts
14 index ea16d782af58..4f31b2eb5cdf 100644
15 --- a/arch/arc/boot/dts/nsimosci.dts
16 +++ b/arch/arc/boot/dts/nsimosci.dts
17 @@ -11,13 +11,16 @@
18
19 / {
20 compatible = "snps,nsimosci";
21 - clock-frequency = <80000000>; /* 80 MHZ */
22 + clock-frequency = <20000000>; /* 20 MHZ */
23 #address-cells = <1>;
24 #size-cells = <1>;
25 interrupt-parent = <&intc>;
26
27 chosen {
28 - bootargs = "console=tty0 consoleblank=0";
29 + /* this is for console on PGU */
30 + /* bootargs = "console=tty0 consoleblank=0"; */
31 + /* this is for console on serial */
32 + bootargs = "earlycon=uart8250,mmio32,0xc0000000,115200n8 console=ttyS0,115200n8 consoleblank=0 debug";
33 };
34
35 aliases {
36 @@ -44,15 +47,14 @@
37 };
38
39 uart0: serial@c0000000 {
40 - compatible = "snps,dw-apb-uart";
41 + compatible = "ns8250";
42 reg = <0xc0000000 0x2000>;
43 interrupts = <11>;
44 - #clock-frequency = <80000000>;
45 clock-frequency = <3686400>;
46 baud = <115200>;
47 reg-shift = <2>;
48 reg-io-width = <4>;
49 - status = "okay";
50 + no-loopback-test = <1>;
51 };
52
53 pgu0: pgu@c9000000 {
54 diff --git a/arch/arc/configs/nsimosci_defconfig b/arch/arc/configs/nsimosci_defconfig
55 index 446c96c24eff..00788e741ce7 100644
56 --- a/arch/arc/configs/nsimosci_defconfig
57 +++ b/arch/arc/configs/nsimosci_defconfig
58 @@ -54,6 +54,7 @@ CONFIG_SERIO_ARC_PS2=y
59 CONFIG_SERIAL_8250=y
60 CONFIG_SERIAL_8250_CONSOLE=y
61 CONFIG_SERIAL_8250_DW=y
62 +CONFIG_SERIAL_OF_PLATFORM=y
63 CONFIG_SERIAL_ARC=y
64 CONFIG_SERIAL_ARC_CONSOLE=y
65 # CONFIG_HW_RANDOM is not set
66 diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
67 index 821170e5f6ed..b969eea4e237 100644
68 --- a/arch/m68k/Kconfig
69 +++ b/arch/m68k/Kconfig
70 @@ -16,6 +16,7 @@ config M68K
71 select FPU if MMU
72 select ARCH_WANT_IPC_PARSE_VERSION
73 select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE
74 + select HAVE_FUTEX_CMPXCHG if MMU && FUTEX
75 select HAVE_MOD_ARCH_SPECIFIC
76 select MODULES_USE_ELF_REL
77 select MODULES_USE_ELF_RELA
78 diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
79 index 97dcbea97a1c..d8d6eeca56b0 100644
80 --- a/arch/s390/Kconfig
81 +++ b/arch/s390/Kconfig
82 @@ -116,6 +116,7 @@ config S390
83 select HAVE_FUNCTION_GRAPH_TRACER
84 select HAVE_FUNCTION_TRACER
85 select HAVE_FUNCTION_TRACE_MCOUNT_TEST
86 + select HAVE_FUTEX_CMPXCHG if FUTEX
87 select HAVE_KERNEL_BZIP2
88 select HAVE_KERNEL_GZIP
89 select HAVE_KERNEL_LZMA
90 diff --git a/arch/x86/crypto/ghash-clmulni-intel_asm.S b/arch/x86/crypto/ghash-clmulni-intel_asm.S
91 index 586f41aac361..185fad49d86f 100644
92 --- a/arch/x86/crypto/ghash-clmulni-intel_asm.S
93 +++ b/arch/x86/crypto/ghash-clmulni-intel_asm.S
94 @@ -24,10 +24,6 @@
95 .align 16
96 .Lbswap_mask:
97 .octa 0x000102030405060708090a0b0c0d0e0f
98 -.Lpoly:
99 - .octa 0xc2000000000000000000000000000001
100 -.Ltwo_one:
101 - .octa 0x00000001000000000000000000000001
102
103 #define DATA %xmm0
104 #define SHASH %xmm1
105 @@ -134,28 +130,3 @@ ENTRY(clmul_ghash_update)
106 .Lupdate_just_ret:
107 ret
108 ENDPROC(clmul_ghash_update)
109 -
110 -/*
111 - * void clmul_ghash_setkey(be128 *shash, const u8 *key);
112 - *
113 - * Calculate hash_key << 1 mod poly
114 - */
115 -ENTRY(clmul_ghash_setkey)
116 - movaps .Lbswap_mask, BSWAP
117 - movups (%rsi), %xmm0
118 - PSHUFB_XMM BSWAP %xmm0
119 - movaps %xmm0, %xmm1
120 - psllq $1, %xmm0
121 - psrlq $63, %xmm1
122 - movaps %xmm1, %xmm2
123 - pslldq $8, %xmm1
124 - psrldq $8, %xmm2
125 - por %xmm1, %xmm0
126 - # reduction
127 - pshufd $0b00100100, %xmm2, %xmm1
128 - pcmpeqd .Ltwo_one, %xmm1
129 - pand .Lpoly, %xmm1
130 - pxor %xmm1, %xmm0
131 - movups %xmm0, (%rdi)
132 - ret
133 -ENDPROC(clmul_ghash_setkey)
134 diff --git a/arch/x86/crypto/ghash-clmulni-intel_glue.c b/arch/x86/crypto/ghash-clmulni-intel_glue.c
135 index 6759dd1135be..d785cf2c529c 100644
136 --- a/arch/x86/crypto/ghash-clmulni-intel_glue.c
137 +++ b/arch/x86/crypto/ghash-clmulni-intel_glue.c
138 @@ -30,8 +30,6 @@ void clmul_ghash_mul(char *dst, const be128 *shash);
139 void clmul_ghash_update(char *dst, const char *src, unsigned int srclen,
140 const be128 *shash);
141
142 -void clmul_ghash_setkey(be128 *shash, const u8 *key);
143 -
144 struct ghash_async_ctx {
145 struct cryptd_ahash *cryptd_tfm;
146 };
147 @@ -58,13 +56,23 @@ static int ghash_setkey(struct crypto_shash *tfm,
148 const u8 *key, unsigned int keylen)
149 {
150 struct ghash_ctx *ctx = crypto_shash_ctx(tfm);
151 + be128 *x = (be128 *)key;
152 + u64 a, b;
153
154 if (keylen != GHASH_BLOCK_SIZE) {
155 crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
156 return -EINVAL;
157 }
158
159 - clmul_ghash_setkey(&ctx->shash, key);
160 + /* perform multiplication by 'x' in GF(2^128) */
161 + a = be64_to_cpu(x->a);
162 + b = be64_to_cpu(x->b);
163 +
164 + ctx->shash.a = (__be64)((b << 1) | (a >> 63));
165 + ctx->shash.b = (__be64)((a << 1) | (b >> 63));
166 +
167 + if (a >> 63)
168 + ctx->shash.b ^= cpu_to_be64(0xc2);
169
170 return 0;
171 }
172 diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
173 index 648554742a99..66f6cf5064ec 100644
174 --- a/drivers/cpufreq/cpufreq.c
175 +++ b/drivers/cpufreq/cpufreq.c
176 @@ -46,6 +46,7 @@ static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data);
177 static DEFINE_PER_CPU(char[CPUFREQ_NAME_LEN], cpufreq_cpu_governor);
178 #endif
179 static DEFINE_RWLOCK(cpufreq_driver_lock);
180 +static DEFINE_MUTEX(cpufreq_governor_lock);
181
182 /*
183 * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
184 @@ -1563,6 +1564,21 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
185
186 pr_debug("__cpufreq_governor for CPU %u, event %u\n",
187 policy->cpu, event);
188 +
189 + mutex_lock(&cpufreq_governor_lock);
190 + if ((!policy->governor_enabled && (event == CPUFREQ_GOV_STOP)) ||
191 + (policy->governor_enabled && (event == CPUFREQ_GOV_START))) {
192 + mutex_unlock(&cpufreq_governor_lock);
193 + return -EBUSY;
194 + }
195 +
196 + if (event == CPUFREQ_GOV_STOP)
197 + policy->governor_enabled = false;
198 + else if (event == CPUFREQ_GOV_START)
199 + policy->governor_enabled = true;
200 +
201 + mutex_unlock(&cpufreq_governor_lock);
202 +
203 ret = policy->governor->governor(policy, event);
204
205 if (!ret) {
206 @@ -1570,6 +1586,14 @@ static int __cpufreq_governor(struct cpufreq_policy *policy,
207 policy->governor->initialized++;
208 else if (event == CPUFREQ_GOV_POLICY_EXIT)
209 policy->governor->initialized--;
210 + } else {
211 + /* Restore original values */
212 + mutex_lock(&cpufreq_governor_lock);
213 + if (event == CPUFREQ_GOV_STOP)
214 + policy->governor_enabled = true;
215 + else if (event == CPUFREQ_GOV_START)
216 + policy->governor_enabled = false;
217 + mutex_unlock(&cpufreq_governor_lock);
218 }
219
220 /* we keep one module reference alive for
221 diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
222 index a86ff72141f3..28a0b32c73b3 100644
223 --- a/drivers/cpufreq/cpufreq_governor.c
224 +++ b/drivers/cpufreq/cpufreq_governor.c
225 @@ -177,6 +177,9 @@ void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy,
226 {
227 int i;
228
229 + if (!policy->governor_enabled)
230 + return;
231 +
232 if (!all_cpus) {
233 __gov_queue_work(smp_processor_id(), dbs_data, delay);
234 } else {
235 diff --git a/drivers/cpufreq/powernow-k6.c b/drivers/cpufreq/powernow-k6.c
236 index ea0222a45b7b..b07ca0d3f56a 100644
237 --- a/drivers/cpufreq/powernow-k6.c
238 +++ b/drivers/cpufreq/powernow-k6.c
239 @@ -26,41 +26,108 @@
240 static unsigned int busfreq; /* FSB, in 10 kHz */
241 static unsigned int max_multiplier;
242
243 +static unsigned int param_busfreq = 0;
244 +static unsigned int param_max_multiplier = 0;
245 +
246 +module_param_named(max_multiplier, param_max_multiplier, uint, S_IRUGO);
247 +MODULE_PARM_DESC(max_multiplier, "Maximum multiplier (allowed values: 20 30 35 40 45 50 55 60)");
248 +
249 +module_param_named(bus_frequency, param_busfreq, uint, S_IRUGO);
250 +MODULE_PARM_DESC(bus_frequency, "Bus frequency in kHz");
251
252 /* Clock ratio multiplied by 10 - see table 27 in AMD#23446 */
253 static struct cpufreq_frequency_table clock_ratio[] = {
254 - {45, /* 000 -> 4.5x */ 0},
255 + {60, /* 110 -> 6.0x */ 0},
256 + {55, /* 011 -> 5.5x */ 0},
257 {50, /* 001 -> 5.0x */ 0},
258 + {45, /* 000 -> 4.5x */ 0},
259 {40, /* 010 -> 4.0x */ 0},
260 - {55, /* 011 -> 5.5x */ 0},
261 - {20, /* 100 -> 2.0x */ 0},
262 - {30, /* 101 -> 3.0x */ 0},
263 - {60, /* 110 -> 6.0x */ 0},
264 {35, /* 111 -> 3.5x */ 0},
265 + {30, /* 101 -> 3.0x */ 0},
266 + {20, /* 100 -> 2.0x */ 0},
267 {0, CPUFREQ_TABLE_END}
268 };
269
270 +static const u8 index_to_register[8] = { 6, 3, 1, 0, 2, 7, 5, 4 };
271 +static const u8 register_to_index[8] = { 3, 2, 4, 1, 7, 6, 0, 5 };
272 +
273 +static const struct {
274 + unsigned freq;
275 + unsigned mult;
276 +} usual_frequency_table[] = {
277 + { 400000, 40 }, // 100 * 4
278 + { 450000, 45 }, // 100 * 4.5
279 + { 475000, 50 }, // 95 * 5
280 + { 500000, 50 }, // 100 * 5
281 + { 506250, 45 }, // 112.5 * 4.5
282 + { 533500, 55 }, // 97 * 5.5
283 + { 550000, 55 }, // 100 * 5.5
284 + { 562500, 50 }, // 112.5 * 5
285 + { 570000, 60 }, // 95 * 6
286 + { 600000, 60 }, // 100 * 6
287 + { 618750, 55 }, // 112.5 * 5.5
288 + { 660000, 55 }, // 120 * 5.5
289 + { 675000, 60 }, // 112.5 * 6
290 + { 720000, 60 }, // 120 * 6
291 +};
292 +
293 +#define FREQ_RANGE 3000
294
295 /**
296 * powernow_k6_get_cpu_multiplier - returns the current FSB multiplier
297 *
298 - * Returns the current setting of the frequency multiplier. Core clock
299 + * Returns the current setting of the frequency multiplier. Core clock
300 * speed is frequency of the Front-Side Bus multiplied with this value.
301 */
302 static int powernow_k6_get_cpu_multiplier(void)
303 {
304 - u64 invalue = 0;
305 + unsigned long invalue = 0;
306 u32 msrval;
307
308 + local_irq_disable();
309 +
310 msrval = POWERNOW_IOPORT + 0x1;
311 wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */
312 invalue = inl(POWERNOW_IOPORT + 0x8);
313 msrval = POWERNOW_IOPORT + 0x0;
314 wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */
315
316 - return clock_ratio[(invalue >> 5)&7].index;
317 + local_irq_enable();
318 +
319 + return clock_ratio[register_to_index[(invalue >> 5)&7]].index;
320 }
321
322 +static void powernow_k6_set_cpu_multiplier(unsigned int best_i)
323 +{
324 + unsigned long outvalue, invalue;
325 + unsigned long msrval;
326 + unsigned long cr0;
327 +
328 + /* we now need to transform best_i to the BVC format, see AMD#23446 */
329 +
330 + /*
331 + * The processor doesn't respond to inquiry cycles while changing the
332 + * frequency, so we must disable cache.
333 + */
334 + local_irq_disable();
335 + cr0 = read_cr0();
336 + write_cr0(cr0 | X86_CR0_CD);
337 + wbinvd();
338 +
339 + outvalue = (1<<12) | (1<<10) | (1<<9) | (index_to_register[best_i]<<5);
340 +
341 + msrval = POWERNOW_IOPORT + 0x1;
342 + wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */
343 + invalue = inl(POWERNOW_IOPORT + 0x8);
344 + invalue = invalue & 0x1f;
345 + outvalue = outvalue | invalue;
346 + outl(outvalue, (POWERNOW_IOPORT + 0x8));
347 + msrval = POWERNOW_IOPORT + 0x0;
348 + wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */
349 +
350 + write_cr0(cr0);
351 + local_irq_enable();
352 +}
353
354 /**
355 * powernow_k6_set_state - set the PowerNow! multiplier
356 @@ -71,8 +138,6 @@ static int powernow_k6_get_cpu_multiplier(void)
357 static void powernow_k6_set_state(struct cpufreq_policy *policy,
358 unsigned int best_i)
359 {
360 - unsigned long outvalue = 0, invalue = 0;
361 - unsigned long msrval;
362 struct cpufreq_freqs freqs;
363
364 if (clock_ratio[best_i].index > max_multiplier) {
365 @@ -85,18 +150,7 @@ static void powernow_k6_set_state(struct cpufreq_policy *policy,
366
367 cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
368
369 - /* we now need to transform best_i to the BVC format, see AMD#23446 */
370 -
371 - outvalue = (1<<12) | (1<<10) | (1<<9) | (best_i<<5);
372 -
373 - msrval = POWERNOW_IOPORT + 0x1;
374 - wrmsr(MSR_K6_EPMR, msrval, 0); /* enable the PowerNow port */
375 - invalue = inl(POWERNOW_IOPORT + 0x8);
376 - invalue = invalue & 0xf;
377 - outvalue = outvalue | invalue;
378 - outl(outvalue , (POWERNOW_IOPORT + 0x8));
379 - msrval = POWERNOW_IOPORT + 0x0;
380 - wrmsr(MSR_K6_EPMR, msrval, 0); /* disable it again */
381 + powernow_k6_set_cpu_multiplier(best_i);
382
383 cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
384
385 @@ -141,18 +195,57 @@ static int powernow_k6_target(struct cpufreq_policy *policy,
386 return 0;
387 }
388
389 -
390 static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
391 {
392 unsigned int i, f;
393 int result;
394 + unsigned khz;
395
396 if (policy->cpu != 0)
397 return -ENODEV;
398
399 - /* get frequencies */
400 - max_multiplier = powernow_k6_get_cpu_multiplier();
401 - busfreq = cpu_khz / max_multiplier;
402 + max_multiplier = 0;
403 + khz = cpu_khz;
404 + for (i = 0; i < ARRAY_SIZE(usual_frequency_table); i++) {
405 + if (khz >= usual_frequency_table[i].freq - FREQ_RANGE &&
406 + khz <= usual_frequency_table[i].freq + FREQ_RANGE) {
407 + khz = usual_frequency_table[i].freq;
408 + max_multiplier = usual_frequency_table[i].mult;
409 + break;
410 + }
411 + }
412 + if (param_max_multiplier) {
413 + for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) {
414 + if (clock_ratio[i].index == param_max_multiplier) {
415 + max_multiplier = param_max_multiplier;
416 + goto have_max_multiplier;
417 + }
418 + }
419 + printk(KERN_ERR "powernow-k6: invalid max_multiplier parameter, valid parameters 20, 30, 35, 40, 45, 50, 55, 60\n");
420 + return -EINVAL;
421 + }
422 +
423 + if (!max_multiplier) {
424 + printk(KERN_WARNING "powernow-k6: unknown frequency %u, cannot determine current multiplier\n", khz);
425 + printk(KERN_WARNING "powernow-k6: use module parameters max_multiplier and bus_frequency\n");
426 + return -EOPNOTSUPP;
427 + }
428 +
429 +have_max_multiplier:
430 + param_max_multiplier = max_multiplier;
431 +
432 + if (param_busfreq) {
433 + if (param_busfreq >= 50000 && param_busfreq <= 150000) {
434 + busfreq = param_busfreq / 10;
435 + goto have_busfreq;
436 + }
437 + printk(KERN_ERR "powernow-k6: invalid bus_frequency parameter, allowed range 50000 - 150000 kHz\n");
438 + return -EINVAL;
439 + }
440 +
441 + busfreq = khz / max_multiplier;
442 +have_busfreq:
443 + param_busfreq = busfreq * 10;
444
445 /* table init */
446 for (i = 0; (clock_ratio[i].frequency != CPUFREQ_TABLE_END); i++) {
447 @@ -164,7 +257,7 @@ static int powernow_k6_cpu_init(struct cpufreq_policy *policy)
448 }
449
450 /* cpuinfo and default policy values */
451 - policy->cpuinfo.transition_latency = 200000;
452 + policy->cpuinfo.transition_latency = 500000;
453 policy->cur = busfreq * max_multiplier;
454
455 result = cpufreq_frequency_table_cpuinfo(policy, clock_ratio);
456 diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c
457 index 8dfaaae94444..2253271b3fac 100644
458 --- a/drivers/cpuidle/driver.c
459 +++ b/drivers/cpuidle/driver.c
460 @@ -251,7 +251,8 @@ struct cpuidle_driver *cpuidle_driver_ref(void)
461 spin_lock(&cpuidle_driver_lock);
462
463 drv = cpuidle_get_driver();
464 - drv->refcnt++;
465 + if (drv)
466 + drv->refcnt++;
467
468 spin_unlock(&cpuidle_driver_lock);
469 return drv;
470 diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c
471 index 02125e6a9109..5a4da94aefb0 100644
472 --- a/drivers/isdn/isdnloop/isdnloop.c
473 +++ b/drivers/isdn/isdnloop/isdnloop.c
474 @@ -518,9 +518,9 @@ static isdnloop_stat isdnloop_cmd_table[] =
475 static void
476 isdnloop_fake_err(isdnloop_card *card)
477 {
478 - char buf[60];
479 + char buf[64];
480
481 - sprintf(buf, "E%s", card->omsg);
482 + snprintf(buf, sizeof(buf), "E%s", card->omsg);
483 isdnloop_fake(card, buf, -1);
484 isdnloop_fake(card, "NAK", -1);
485 }
486 @@ -903,6 +903,8 @@ isdnloop_parse_cmd(isdnloop_card *card)
487 case 7:
488 /* 0x;EAZ */
489 p += 3;
490 + if (strlen(p) >= sizeof(card->eazlist[0]))
491 + break;
492 strcpy(card->eazlist[ch - 1], p);
493 break;
494 case 8:
495 @@ -1070,6 +1072,12 @@ isdnloop_start(isdnloop_card *card, isdnloop_sdef *sdefp)
496 return -EBUSY;
497 if (copy_from_user((char *) &sdef, (char *) sdefp, sizeof(sdef)))
498 return -EFAULT;
499 +
500 + for (i = 0; i < 3; i++) {
501 + if (!memchr(sdef.num[i], 0, sizeof(sdef.num[i])))
502 + return -EINVAL;
503 + }
504 +
505 spin_lock_irqsave(&card->isdnloop_lock, flags);
506 switch (sdef.ptype) {
507 case ISDN_PTYPE_EURO:
508 @@ -1127,7 +1135,7 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card)
509 {
510 ulong a;
511 int i;
512 - char cbuf[60];
513 + char cbuf[80];
514 isdn_ctrl cmd;
515 isdnloop_cdef cdef;
516
517 @@ -1192,7 +1200,6 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card)
518 break;
519 if ((c->arg & 255) < ISDNLOOP_BCH) {
520 char *p;
521 - char dial[50];
522 char dcode[4];
523
524 a = c->arg;
525 @@ -1204,10 +1211,10 @@ isdnloop_command(isdn_ctrl *c, isdnloop_card *card)
526 } else
527 /* Normal Dial */
528 strcpy(dcode, "CAL");
529 - strcpy(dial, p);
530 - sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
531 - dcode, dial, c->parm.setup.si1,
532 - c->parm.setup.si2, c->parm.setup.eazmsn);
533 + snprintf(cbuf, sizeof(cbuf),
534 + "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
535 + dcode, p, c->parm.setup.si1,
536 + c->parm.setup.si2, c->parm.setup.eazmsn);
537 i = isdnloop_writecmd(cbuf, strlen(cbuf), 0, card);
538 }
539 break;
540 diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
541 index e27d5c839be5..4a0db617ab64 100644
542 --- a/drivers/net/ethernet/broadcom/tg3.c
543 +++ b/drivers/net/ethernet/broadcom/tg3.c
544 @@ -17308,8 +17308,6 @@ static int tg3_init_one(struct pci_dev *pdev,
545
546 tg3_init_bufmgr_config(tp);
547
548 - features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX;
549 -
550 /* 5700 B0 chips do not support checksumming correctly due
551 * to hardware bugs.
552 */
553 @@ -17341,7 +17339,8 @@ static int tg3_init_one(struct pci_dev *pdev,
554 features |= NETIF_F_TSO_ECN;
555 }
556
557 - dev->features |= features;
558 + dev->features |= features | NETIF_F_HW_VLAN_CTAG_TX |
559 + NETIF_F_HW_VLAN_CTAG_RX;
560 dev->vlan_features |= features;
561
562 /*
563 diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
564 index f6dce4765de4..3d50e7db141e 100644
565 --- a/drivers/net/usb/usbnet.c
566 +++ b/drivers/net/usb/usbnet.c
567 @@ -727,14 +727,12 @@ EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs);
568 // precondition: never called in_interrupt
569 static void usbnet_terminate_urbs(struct usbnet *dev)
570 {
571 - DECLARE_WAIT_QUEUE_HEAD_ONSTACK(unlink_wakeup);
572 DECLARE_WAITQUEUE(wait, current);
573 int temp;
574
575 /* ensure there are no more active urbs */
576 - add_wait_queue(&unlink_wakeup, &wait);
577 + add_wait_queue(&dev->wait, &wait);
578 set_current_state(TASK_UNINTERRUPTIBLE);
579 - dev->wait = &unlink_wakeup;
580 temp = unlink_urbs(dev, &dev->txq) +
581 unlink_urbs(dev, &dev->rxq);
582
583 @@ -748,15 +746,14 @@ static void usbnet_terminate_urbs(struct usbnet *dev)
584 "waited for %d urb completions\n", temp);
585 }
586 set_current_state(TASK_RUNNING);
587 - dev->wait = NULL;
588 - remove_wait_queue(&unlink_wakeup, &wait);
589 + remove_wait_queue(&dev->wait, &wait);
590 }
591
592 int usbnet_stop (struct net_device *net)
593 {
594 struct usbnet *dev = netdev_priv(net);
595 struct driver_info *info = dev->driver_info;
596 - int retval;
597 + int retval, pm;
598
599 clear_bit(EVENT_DEV_OPEN, &dev->flags);
600 netif_stop_queue (net);
601 @@ -766,6 +763,8 @@ int usbnet_stop (struct net_device *net)
602 net->stats.rx_packets, net->stats.tx_packets,
603 net->stats.rx_errors, net->stats.tx_errors);
604
605 + /* to not race resume */
606 + pm = usb_autopm_get_interface(dev->intf);
607 /* allow minidriver to stop correctly (wireless devices to turn off
608 * radio etc) */
609 if (info->stop) {
610 @@ -792,6 +791,9 @@ int usbnet_stop (struct net_device *net)
611 dev->flags = 0;
612 del_timer_sync (&dev->delay);
613 tasklet_kill (&dev->bh);
614 + if (!pm)
615 + usb_autopm_put_interface(dev->intf);
616 +
617 if (info->manage_power &&
618 !test_and_clear_bit(EVENT_NO_RUNTIME_PM, &dev->flags))
619 info->manage_power(dev, 0);
620 @@ -1360,11 +1362,12 @@ static void usbnet_bh (unsigned long param)
621 /* restart RX again after disabling due to high error rate */
622 clear_bit(EVENT_RX_KILL, &dev->flags);
623
624 - // waiting for all pending urbs to complete?
625 - if (dev->wait) {
626 - if ((dev->txq.qlen + dev->rxq.qlen + dev->done.qlen) == 0) {
627 - wake_up (dev->wait);
628 - }
629 + /* waiting for all pending urbs to complete?
630 + * only then can we forgo submitting anew
631 + */
632 + if (waitqueue_active(&dev->wait)) {
633 + if (dev->txq.qlen + dev->rxq.qlen + dev->done.qlen == 0)
634 + wake_up_all(&dev->wait);
635
636 // or are we maybe short a few urbs?
637 } else if (netif_running (dev->net) &&
638 @@ -1502,6 +1505,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
639 dev->driver_name = name;
640 dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV
641 | NETIF_MSG_PROBE | NETIF_MSG_LINK);
642 + init_waitqueue_head(&dev->wait);
643 skb_queue_head_init (&dev->rxq);
644 skb_queue_head_init (&dev->txq);
645 skb_queue_head_init (&dev->done);
646 @@ -1694,9 +1698,10 @@ int usbnet_resume (struct usb_interface *intf)
647 spin_unlock_irq(&dev->txq.lock);
648
649 if (test_bit(EVENT_DEV_OPEN, &dev->flags)) {
650 - /* handle remote wakeup ASAP */
651 - if (!dev->wait &&
652 - netif_device_present(dev->net) &&
653 + /* handle remote wakeup ASAP
654 + * we cannot race against stop
655 + */
656 + if (netif_device_present(dev->net) &&
657 !timer_pending(&dev->delay) &&
658 !test_bit(EVENT_RX_HALT, &dev->flags))
659 rx_alloc_submit(dev, GFP_NOIO);
660 diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
661 index 054489fdf54a..9673edfff451 100644
662 --- a/drivers/net/vxlan.c
663 +++ b/drivers/net/vxlan.c
664 @@ -845,6 +845,9 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb)
665
666 neigh_release(n);
667
668 + if (reply == NULL)
669 + goto out;
670 +
671 skb_reset_mac_header(reply);
672 __skb_pull(reply, skb_network_offset(reply));
673 reply->ip_summed = CHECKSUM_UNNECESSARY;
674 diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
675 index 36efb418c26f..70b830f6c4bf 100644
676 --- a/drivers/net/xen-netback/netback.c
677 +++ b/drivers/net/xen-netback/netback.c
678 @@ -347,8 +347,8 @@ static bool start_new_rx_buffer(int offset, unsigned long size, int head)
679 * into multiple copies tend to give large frags their
680 * own buffers as before.
681 */
682 - if ((offset + size > MAX_BUFFER_OFFSET) &&
683 - (size <= MAX_BUFFER_OFFSET) && offset && !head)
684 + BUG_ON(size > MAX_BUFFER_OFFSET);
685 + if ((offset + size > MAX_BUFFER_OFFSET) && offset && !head)
686 return true;
687
688 return false;
689 diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
690 index d6a518ce4d6d..c7fdabd0e5d3 100644
691 --- a/drivers/vhost/net.c
692 +++ b/drivers/vhost/net.c
693 @@ -513,9 +513,13 @@ static int get_rx_bufs(struct vhost_virtqueue *vq,
694 r = -ENOBUFS;
695 goto err;
696 }
697 - d = vhost_get_vq_desc(vq->dev, vq, vq->iov + seg,
698 + r = vhost_get_vq_desc(vq->dev, vq, vq->iov + seg,
699 ARRAY_SIZE(vq->iov) - seg, &out,
700 &in, log, log_num);
701 + if (unlikely(r < 0))
702 + goto err;
703 +
704 + d = r;
705 if (d == vq->num) {
706 r = 0;
707 goto err;
708 @@ -540,6 +544,12 @@ static int get_rx_bufs(struct vhost_virtqueue *vq,
709 *iovcount = seg;
710 if (unlikely(log))
711 *log_num = nlogs;
712 +
713 + /* Detect overrun */
714 + if (unlikely(datalen > 0)) {
715 + r = UIO_MAXIOV + 1;
716 + goto err;
717 + }
718 return headcount;
719 err:
720 vhost_discard_vq_desc(vq, headcount);
721 @@ -595,6 +605,14 @@ static void handle_rx(struct vhost_net *net)
722 /* On error, stop handling until the next kick. */
723 if (unlikely(headcount < 0))
724 break;
725 + /* On overrun, truncate and discard */
726 + if (unlikely(headcount > UIO_MAXIOV)) {
727 + msg.msg_iovlen = 1;
728 + err = sock->ops->recvmsg(NULL, sock, &msg,
729 + 1, MSG_DONTWAIT | MSG_TRUNC);
730 + pr_debug("Discarded rx packet: len %zd\n", sock_len);
731 + continue;
732 + }
733 /* OK, now we need to know about added descriptors. */
734 if (!headcount) {
735 if (unlikely(vhost_enable_notify(&net->dev, vq))) {
736 diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
737 index 037d36ae63e5..1a81b7470bc4 100644
738 --- a/include/linux/cpufreq.h
739 +++ b/include/linux/cpufreq.h
740 @@ -107,6 +107,7 @@ struct cpufreq_policy {
741 unsigned int policy; /* see above */
742 struct cpufreq_governor *governor; /* see below */
743 void *governor_data;
744 + bool governor_enabled; /* governor start/stop flag */
745
746 struct work_struct update; /* if update_policy() needs to be
747 * called, but you're in IRQ context */
748 diff --git a/include/linux/futex.h b/include/linux/futex.h
749 index b0d95cac826e..6435f46d6e13 100644
750 --- a/include/linux/futex.h
751 +++ b/include/linux/futex.h
752 @@ -55,7 +55,11 @@ union futex_key {
753 #ifdef CONFIG_FUTEX
754 extern void exit_robust_list(struct task_struct *curr);
755 extern void exit_pi_state_list(struct task_struct *curr);
756 +#ifdef CONFIG_HAVE_FUTEX_CMPXCHG
757 +#define futex_cmpxchg_enabled 1
758 +#else
759 extern int futex_cmpxchg_enabled;
760 +#endif
761 #else
762 static inline void exit_robust_list(struct task_struct *curr)
763 {
764 diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
765 index f18d64129f99..123b21bef1b4 100644
766 --- a/include/linux/usb/usbnet.h
767 +++ b/include/linux/usb/usbnet.h
768 @@ -30,7 +30,7 @@ struct usbnet {
769 struct driver_info *driver_info;
770 const char *driver_name;
771 void *driver_priv;
772 - wait_queue_head_t *wait;
773 + wait_queue_head_t wait;
774 struct mutex phy_mutex;
775 unsigned char suspend_count;
776 unsigned char pkt_cnt, pkt_err;
777 diff --git a/include/net/sock.h b/include/net/sock.h
778 index cec4c723db9a..8f32b779bc83 100644
779 --- a/include/net/sock.h
780 +++ b/include/net/sock.h
781 @@ -1437,6 +1437,11 @@ static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
782 */
783 #define sock_owned_by_user(sk) ((sk)->sk_lock.owned)
784
785 +static inline void sock_release_ownership(struct sock *sk)
786 +{
787 + sk->sk_lock.owned = 0;
788 +}
789 +
790 /*
791 * Macro so as to not evaluate some arguments when
792 * lockdep is not enabled.
793 diff --git a/init/Kconfig b/init/Kconfig
794 index 2d9b83104dcf..5d6febaea56d 100644
795 --- a/init/Kconfig
796 +++ b/init/Kconfig
797 @@ -1365,6 +1365,13 @@ config FUTEX
798 support for "fast userspace mutexes". The resulting kernel may not
799 run glibc-based applications correctly.
800
801 +config HAVE_FUTEX_CMPXCHG
802 + bool
803 + help
804 + Architectures should select this if futex_atomic_cmpxchg_inatomic()
805 + is implemented and always working. This removes a couple of runtime
806 + checks.
807 +
808 config EPOLL
809 bool "Enable eventpoll support" if EXPERT
810 default y
811 diff --git a/kernel/futex.c b/kernel/futex.c
812 index a283b3041072..3bc18bf48d0c 100644
813 --- a/kernel/futex.c
814 +++ b/kernel/futex.c
815 @@ -67,7 +67,9 @@
816
817 #include "rtmutex_common.h"
818
819 +#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
820 int __read_mostly futex_cmpxchg_enabled;
821 +#endif
822
823 #define FUTEX_HASHBITS (CONFIG_BASE_SMALL ? 4 : 8)
824
825 @@ -2729,10 +2731,10 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
826 return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
827 }
828
829 -static int __init futex_init(void)
830 +static void __init futex_detect_cmpxchg(void)
831 {
832 +#ifndef CONFIG_HAVE_FUTEX_CMPXCHG
833 u32 curval;
834 - int i;
835
836 /*
837 * This will fail and we want it. Some arch implementations do
838 @@ -2746,6 +2748,14 @@ static int __init futex_init(void)
839 */
840 if (cmpxchg_futex_value_locked(&curval, NULL, 0, 0) == -EFAULT)
841 futex_cmpxchg_enabled = 1;
842 +#endif
843 +}
844 +
845 +static int __init futex_init(void)
846 +{
847 + int i;
848 +
849 + futex_detect_cmpxchg();
850
851 for (i = 0; i < ARRAY_SIZE(futex_queues); i++) {
852 plist_head_init(&futex_queues[i].chain);
853 diff --git a/lib/nlattr.c b/lib/nlattr.c
854 index 18eca7809b08..fc6754720ced 100644
855 --- a/lib/nlattr.c
856 +++ b/lib/nlattr.c
857 @@ -303,9 +303,15 @@ int nla_memcmp(const struct nlattr *nla, const void *data,
858 */
859 int nla_strcmp(const struct nlattr *nla, const char *str)
860 {
861 - int len = strlen(str) + 1;
862 - int d = nla_len(nla) - len;
863 + int len = strlen(str);
864 + char *buf = nla_data(nla);
865 + int attrlen = nla_len(nla);
866 + int d;
867
868 + if (attrlen > 0 && buf[attrlen - 1] == '\0')
869 + attrlen--;
870 +
871 + d = attrlen - len;
872 if (d == 0)
873 d = memcmp(nla_data(nla), str, len);
874
875 diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
876 index 9424f3718ea7..86abb2e59aea 100644
877 --- a/net/8021q/vlan.c
878 +++ b/net/8021q/vlan.c
879 @@ -305,9 +305,11 @@ static void vlan_sync_address(struct net_device *dev,
880 static void vlan_transfer_features(struct net_device *dev,
881 struct net_device *vlandev)
882 {
883 + struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev);
884 +
885 vlandev->gso_max_size = dev->gso_max_size;
886
887 - if (dev->features & NETIF_F_HW_VLAN_CTAG_TX)
888 + if (vlan_hw_offload_capable(dev->features, vlan->vlan_proto))
889 vlandev->hard_header_len = dev->hard_header_len;
890 else
891 vlandev->hard_header_len = dev->hard_header_len + VLAN_HLEN;
892 diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
893 index 4af64afc7022..cf35f383db4c 100644
894 --- a/net/8021q/vlan_dev.c
895 +++ b/net/8021q/vlan_dev.c
896 @@ -557,6 +557,9 @@ static int vlan_passthru_hard_header(struct sk_buff *skb, struct net_device *dev
897 struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
898 struct net_device *real_dev = vlan->real_dev;
899
900 + if (saddr == NULL)
901 + saddr = dev->dev_addr;
902 +
903 return dev_hard_header(skb, real_dev, type, daddr, saddr, len);
904 }
905
906 @@ -608,7 +611,8 @@ static int vlan_dev_init(struct net_device *dev)
907 #endif
908
909 dev->needed_headroom = real_dev->needed_headroom;
910 - if (real_dev->features & NETIF_F_HW_VLAN_CTAG_TX) {
911 + if (vlan_hw_offload_capable(real_dev->features,
912 + vlan_dev_priv(dev)->vlan_proto)) {
913 dev->header_ops = &vlan_passthru_header_ops;
914 dev->hard_header_len = real_dev->hard_header_len;
915 } else {
916 diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
917 index 2a180a380181..81de0106528b 100644
918 --- a/net/bridge/br_multicast.c
919 +++ b/net/bridge/br_multicast.c
920 @@ -1176,6 +1176,12 @@ static int br_ip6_multicast_query(struct net_bridge *br,
921
922 br_multicast_query_received(br, port, !ipv6_addr_any(&ip6h->saddr));
923
924 + /* RFC2710+RFC3810 (MLDv1+MLDv2) require link-local source addresses */
925 + if (!(ipv6_addr_type(&ip6h->saddr) & IPV6_ADDR_LINKLOCAL)) {
926 + err = -EINVAL;
927 + goto out;
928 + }
929 +
930 if (skb->len == sizeof(*mld)) {
931 if (!pskb_may_pull(skb, sizeof(*mld))) {
932 err = -EINVAL;
933 diff --git a/net/core/netpoll.c b/net/core/netpoll.c
934 index 433a1051d323..e861438d5454 100644
935 --- a/net/core/netpoll.c
936 +++ b/net/core/netpoll.c
937 @@ -745,7 +745,7 @@ static bool pkt_is_ns(struct sk_buff *skb)
938 struct nd_msg *msg;
939 struct ipv6hdr *hdr;
940
941 - if (skb->protocol != htons(ETH_P_ARP))
942 + if (skb->protocol != htons(ETH_P_IPV6))
943 return false;
944 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + sizeof(struct nd_msg)))
945 return false;
946 diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
947 index fd01eca52a13..4c3087dffe78 100644
948 --- a/net/core/rtnetlink.c
949 +++ b/net/core/rtnetlink.c
950 @@ -1973,12 +1973,13 @@ EXPORT_SYMBOL(rtmsg_ifinfo);
951 static int nlmsg_populate_fdb_fill(struct sk_buff *skb,
952 struct net_device *dev,
953 u8 *addr, u32 pid, u32 seq,
954 - int type, unsigned int flags)
955 + int type, unsigned int flags,
956 + int nlflags)
957 {
958 struct nlmsghdr *nlh;
959 struct ndmsg *ndm;
960
961 - nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), NLM_F_MULTI);
962 + nlh = nlmsg_put(skb, pid, seq, type, sizeof(*ndm), nlflags);
963 if (!nlh)
964 return -EMSGSIZE;
965
966 @@ -2016,7 +2017,7 @@ static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, int type)
967 if (!skb)
968 goto errout;
969
970 - err = nlmsg_populate_fdb_fill(skb, dev, addr, 0, 0, type, NTF_SELF);
971 + err = nlmsg_populate_fdb_fill(skb, dev, addr, 0, 0, type, NTF_SELF, 0);
972 if (err < 0) {
973 kfree_skb(skb);
974 goto errout;
975 @@ -2249,7 +2250,8 @@ static int nlmsg_populate_fdb(struct sk_buff *skb,
976
977 err = nlmsg_populate_fdb_fill(skb, dev, ha->addr,
978 portid, seq,
979 - RTM_NEWNEIGH, NTF_SELF);
980 + RTM_NEWNEIGH, NTF_SELF,
981 + NLM_F_MULTI);
982 if (err < 0)
983 return err;
984 skip:
985 diff --git a/net/core/sock.c b/net/core/sock.c
986 index 3ba527074f7f..d743099250f4 100644
987 --- a/net/core/sock.c
988 +++ b/net/core/sock.c
989 @@ -2309,10 +2309,13 @@ void release_sock(struct sock *sk)
990 if (sk->sk_backlog.tail)
991 __release_sock(sk);
992
993 + /* Warning : release_cb() might need to release sk ownership,
994 + * ie call sock_release_ownership(sk) before us.
995 + */
996 if (sk->sk_prot->release_cb)
997 sk->sk_prot->release_cb(sk);
998
999 - sk->sk_lock.owned = 0;
1000 + sock_release_ownership(sk);
1001 if (waitqueue_active(&sk->sk_lock.wq))
1002 wake_up(&sk->sk_lock.wq);
1003 spin_unlock_bh(&sk->sk_lock.slock);
1004 diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c
1005 index 7e06641e36ae..af02a39175e3 100644
1006 --- a/net/ipv4/inet_fragment.c
1007 +++ b/net/ipv4/inet_fragment.c
1008 @@ -211,7 +211,7 @@ int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f, bool force)
1009 }
1010
1011 work = frag_mem_limit(nf) - nf->low_thresh;
1012 - while (work > 0) {
1013 + while (work > 0 || force) {
1014 spin_lock(&nf->lru_lock);
1015
1016 if (list_empty(&nf->lru_list)) {
1017 @@ -283,9 +283,10 @@ static struct inet_frag_queue *inet_frag_intern(struct netns_frags *nf,
1018
1019 atomic_inc(&qp->refcnt);
1020 hlist_add_head(&qp->list, &hb->chain);
1021 + inet_frag_lru_add(nf, qp);
1022 spin_unlock(&hb->chain_lock);
1023 read_unlock(&f->lock);
1024 - inet_frag_lru_add(nf, qp);
1025 +
1026 return qp;
1027 }
1028
1029 diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
1030 index 7dbad6835843..49797ed0917c 100644
1031 --- a/net/ipv4/ipmr.c
1032 +++ b/net/ipv4/ipmr.c
1033 @@ -2255,13 +2255,14 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb,
1034 }
1035
1036 static int ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
1037 - u32 portid, u32 seq, struct mfc_cache *c, int cmd)
1038 + u32 portid, u32 seq, struct mfc_cache *c, int cmd,
1039 + int flags)
1040 {
1041 struct nlmsghdr *nlh;
1042 struct rtmsg *rtm;
1043 int err;
1044
1045 - nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), NLM_F_MULTI);
1046 + nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), flags);
1047 if (nlh == NULL)
1048 return -EMSGSIZE;
1049
1050 @@ -2329,7 +2330,7 @@ static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
1051 if (skb == NULL)
1052 goto errout;
1053
1054 - err = ipmr_fill_mroute(mrt, skb, 0, 0, mfc, cmd);
1055 + err = ipmr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0);
1056 if (err < 0)
1057 goto errout;
1058
1059 @@ -2368,7 +2369,8 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
1060 if (ipmr_fill_mroute(mrt, skb,
1061 NETLINK_CB(cb->skb).portid,
1062 cb->nlh->nlmsg_seq,
1063 - mfc, RTM_NEWROUTE) < 0)
1064 + mfc, RTM_NEWROUTE,
1065 + NLM_F_MULTI) < 0)
1066 goto done;
1067 next_entry:
1068 e++;
1069 @@ -2382,7 +2384,8 @@ next_entry:
1070 if (ipmr_fill_mroute(mrt, skb,
1071 NETLINK_CB(cb->skb).portid,
1072 cb->nlh->nlmsg_seq,
1073 - mfc, RTM_NEWROUTE) < 0) {
1074 + mfc, RTM_NEWROUTE,
1075 + NLM_F_MULTI) < 0) {
1076 spin_unlock_bh(&mfc_unres_lock);
1077 goto done;
1078 }
1079 diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
1080 index 6da3d94a114b..4a4e8746d1b2 100644
1081 --- a/net/ipv4/tcp_output.c
1082 +++ b/net/ipv4/tcp_output.c
1083 @@ -755,6 +755,17 @@ void tcp_release_cb(struct sock *sk)
1084 if (flags & (1UL << TCP_TSQ_DEFERRED))
1085 tcp_tsq_handler(sk);
1086
1087 + /* Here begins the tricky part :
1088 + * We are called from release_sock() with :
1089 + * 1) BH disabled
1090 + * 2) sk_lock.slock spinlock held
1091 + * 3) socket owned by us (sk->sk_lock.owned == 1)
1092 + *
1093 + * But following code is meant to be called from BH handlers,
1094 + * so we should keep BH disabled, but early release socket ownership
1095 + */
1096 + sock_release_ownership(sk);
1097 +
1098 if (flags & (1UL << TCP_WRITE_TIMER_DEFERRED)) {
1099 tcp_write_timer_handler(sk);
1100 __sock_put(sk);
1101 diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
1102 index b78a3ee93d52..7bcdd0df68db 100644
1103 --- a/net/ipv6/addrconf.c
1104 +++ b/net/ipv6/addrconf.c
1105 @@ -1111,8 +1111,11 @@ retry:
1106 * Lifetime is greater than REGEN_ADVANCE time units. In particular,
1107 * an implementation must not create a temporary address with a zero
1108 * Preferred Lifetime.
1109 + * Use age calculation as in addrconf_verify to avoid unnecessary
1110 + * temporary addresses being generated.
1111 */
1112 - if (tmp_prefered_lft <= regen_advance) {
1113 + age = (now - tmp_tstamp + ADDRCONF_TIMER_FUZZ_MINUS) / HZ;
1114 + if (tmp_prefered_lft <= regen_advance + age) {
1115 in6_ifa_put(ifp);
1116 in6_dev_put(idev);
1117 ret = -1;
1118 diff --git a/net/ipv6/exthdrs_offload.c b/net/ipv6/exthdrs_offload.c
1119 index cf77f3abfd06..447a7fbd1bb6 100644
1120 --- a/net/ipv6/exthdrs_offload.c
1121 +++ b/net/ipv6/exthdrs_offload.c
1122 @@ -25,11 +25,11 @@ int __init ipv6_exthdrs_offload_init(void)
1123 int ret;
1124
1125 ret = inet6_add_offload(&rthdr_offload, IPPROTO_ROUTING);
1126 - if (!ret)
1127 + if (ret)
1128 goto out;
1129
1130 ret = inet6_add_offload(&dstopt_offload, IPPROTO_DSTOPTS);
1131 - if (!ret)
1132 + if (ret)
1133 goto out_rt;
1134
1135 out:
1136 diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
1137 index 70e704d49007..2dee1d9d7305 100644
1138 --- a/net/ipv6/icmp.c
1139 +++ b/net/ipv6/icmp.c
1140 @@ -508,7 +508,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
1141 np->tclass, NULL, &fl6, (struct rt6_info *)dst,
1142 MSG_DONTWAIT, np->dontfrag);
1143 if (err) {
1144 - ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTERRORS);
1145 + ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTERRORS);
1146 ip6_flush_pending_frames(sk);
1147 } else {
1148 err = icmpv6_push_pending_frames(sk, &fl6, &tmp_hdr,
1149 diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
1150 index 98a262b759ae..32fb114b86bb 100644
1151 --- a/net/ipv6/ip6_output.c
1152 +++ b/net/ipv6/ip6_output.c
1153 @@ -1108,21 +1108,19 @@ static void ip6_append_data_mtu(unsigned int *mtu,
1154 unsigned int fragheaderlen,
1155 struct sk_buff *skb,
1156 struct rt6_info *rt,
1157 - bool pmtuprobe)
1158 + unsigned int orig_mtu)
1159 {
1160 if (!(rt->dst.flags & DST_XFRM_TUNNEL)) {
1161 if (skb == NULL) {
1162 /* first fragment, reserve header_len */
1163 - *mtu = *mtu - rt->dst.header_len;
1164 + *mtu = orig_mtu - rt->dst.header_len;
1165
1166 } else {
1167 /*
1168 * this fragment is not first, the headers
1169 * space is regarded as data space.
1170 */
1171 - *mtu = min(*mtu, pmtuprobe ?
1172 - rt->dst.dev->mtu :
1173 - dst_mtu(rt->dst.path));
1174 + *mtu = orig_mtu;
1175 }
1176 *maxfraglen = ((*mtu - fragheaderlen) & ~7)
1177 + fragheaderlen - sizeof(struct frag_hdr);
1178 @@ -1139,7 +1137,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
1179 struct ipv6_pinfo *np = inet6_sk(sk);
1180 struct inet_cork *cork;
1181 struct sk_buff *skb, *skb_prev = NULL;
1182 - unsigned int maxfraglen, fragheaderlen, mtu;
1183 + unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu;
1184 int exthdrlen;
1185 int dst_exthdrlen;
1186 int hh_len;
1187 @@ -1221,6 +1219,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
1188 dst_exthdrlen = 0;
1189 mtu = cork->fragsize;
1190 }
1191 + orig_mtu = mtu;
1192
1193 hh_len = LL_RESERVED_SPACE(rt->dst.dev);
1194
1195 @@ -1300,8 +1299,7 @@ alloc_new_skb:
1196 if (skb == NULL || skb_prev == NULL)
1197 ip6_append_data_mtu(&mtu, &maxfraglen,
1198 fragheaderlen, skb, rt,
1199 - np->pmtudisc ==
1200 - IPV6_PMTUDISC_PROBE);
1201 + orig_mtu);
1202
1203 skb_prev = skb;
1204
1205 @@ -1556,8 +1554,8 @@ int ip6_push_pending_frames(struct sock *sk)
1206 if (proto == IPPROTO_ICMPV6) {
1207 struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
1208
1209 - ICMP6MSGOUT_INC_STATS_BH(net, idev, icmp6_hdr(skb)->icmp6_type);
1210 - ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS);
1211 + ICMP6MSGOUT_INC_STATS(net, idev, icmp6_hdr(skb)->icmp6_type);
1212 + ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1213 }
1214
1215 err = ip6_local_out(skb);
1216 diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c
1217 index 9f44ebc17759..2c84072b1da7 100644
1218 --- a/net/ipv6/ip6mr.c
1219 +++ b/net/ipv6/ip6mr.c
1220 @@ -2351,13 +2351,14 @@ int ip6mr_get_route(struct net *net,
1221 }
1222
1223 static int ip6mr_fill_mroute(struct mr6_table *mrt, struct sk_buff *skb,
1224 - u32 portid, u32 seq, struct mfc6_cache *c, int cmd)
1225 + u32 portid, u32 seq, struct mfc6_cache *c, int cmd,
1226 + int flags)
1227 {
1228 struct nlmsghdr *nlh;
1229 struct rtmsg *rtm;
1230 int err;
1231
1232 - nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), NLM_F_MULTI);
1233 + nlh = nlmsg_put(skb, portid, seq, cmd, sizeof(*rtm), flags);
1234 if (nlh == NULL)
1235 return -EMSGSIZE;
1236
1237 @@ -2425,7 +2426,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc,
1238 if (skb == NULL)
1239 goto errout;
1240
1241 - err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd);
1242 + err = ip6mr_fill_mroute(mrt, skb, 0, 0, mfc, cmd, 0);
1243 if (err < 0)
1244 goto errout;
1245
1246 @@ -2464,7 +2465,8 @@ static int ip6mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
1247 if (ip6mr_fill_mroute(mrt, skb,
1248 NETLINK_CB(cb->skb).portid,
1249 cb->nlh->nlmsg_seq,
1250 - mfc, RTM_NEWROUTE) < 0)
1251 + mfc, RTM_NEWROUTE,
1252 + NLM_F_MULTI) < 0)
1253 goto done;
1254 next_entry:
1255 e++;
1256 @@ -2478,7 +2480,8 @@ next_entry:
1257 if (ip6mr_fill_mroute(mrt, skb,
1258 NETLINK_CB(cb->skb).portid,
1259 cb->nlh->nlmsg_seq,
1260 - mfc, RTM_NEWROUTE) < 0) {
1261 + mfc, RTM_NEWROUTE,
1262 + NLM_F_MULTI) < 0) {
1263 spin_unlock_bh(&mfc_unres_lock);
1264 goto done;
1265 }
1266 diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
1267 index 952eaed38808..734aec059ffd 100644
1268 --- a/net/ipv6/mcast.c
1269 +++ b/net/ipv6/mcast.c
1270 @@ -1439,11 +1439,12 @@ static void mld_sendpack(struct sk_buff *skb)
1271 dst_output);
1272 out:
1273 if (!err) {
1274 - ICMP6MSGOUT_INC_STATS_BH(net, idev, ICMPV6_MLD2_REPORT);
1275 - ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_OUTMSGS);
1276 - IP6_UPD_PO_STATS_BH(net, idev, IPSTATS_MIB_OUTMCAST, payload_len);
1277 - } else
1278 - IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_OUTDISCARDS);
1279 + ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT);
1280 + ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1281 + IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, payload_len);
1282 + } else {
1283 + IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
1284 + }
1285
1286 rcu_read_unlock();
1287 return;
1288 diff --git a/net/ipv6/route.c b/net/ipv6/route.c
1289 index 6c389300f4e9..3fde3e977862 100644
1290 --- a/net/ipv6/route.c
1291 +++ b/net/ipv6/route.c
1292 @@ -1428,7 +1428,7 @@ int ip6_route_add(struct fib6_config *cfg)
1293 if (!table)
1294 goto out;
1295
1296 - rt = ip6_dst_alloc(net, NULL, DST_NOCOUNT, table);
1297 + rt = ip6_dst_alloc(net, NULL, (cfg->fc_flags & RTF_ADDRCONF) ? 0 : DST_NOCOUNT, table);
1298
1299 if (!rt) {
1300 err = -ENOMEM;
1301 diff --git a/net/rds/iw.c b/net/rds/iw.c
1302 index 7826d46baa70..589935661d66 100644
1303 --- a/net/rds/iw.c
1304 +++ b/net/rds/iw.c
1305 @@ -239,7 +239,8 @@ static int rds_iw_laddr_check(__be32 addr)
1306 ret = rdma_bind_addr(cm_id, (struct sockaddr *)&sin);
1307 /* due to this, we will claim to support IB devices unless we
1308 check node_type. */
1309 - if (ret || cm_id->device->node_type != RDMA_NODE_RNIC)
1310 + if (ret || !cm_id->device ||
1311 + cm_id->device->node_type != RDMA_NODE_RNIC)
1312 ret = -EADDRNOTAVAIL;
1313
1314 rdsdebug("addr %pI4 ret %d node type %d\n",
1315 diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
1316 index cf579e71cff0..673921cfb97e 100644
1317 --- a/net/sctp/sm_make_chunk.c
1318 +++ b/net/sctp/sm_make_chunk.c
1319 @@ -1403,8 +1403,8 @@ static void sctp_chunk_destroy(struct sctp_chunk *chunk)
1320 BUG_ON(!list_empty(&chunk->list));
1321 list_del_init(&chunk->transmitted_list);
1322
1323 - /* Free the chunk skb data and the SCTP_chunk stub itself. */
1324 - dev_kfree_skb(chunk->skb);
1325 + consume_skb(chunk->skb);
1326 + consume_skb(chunk->auth_chunk);
1327
1328 SCTP_DBG_OBJCNT_DEC(chunk);
1329 kmem_cache_free(sctp_chunk_cachep, chunk);
1330 diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
1331 index 7ceb25ba85b8..9973079401c4 100644
1332 --- a/net/sctp/sm_statefuns.c
1333 +++ b/net/sctp/sm_statefuns.c
1334 @@ -767,7 +767,6 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
1335
1336 /* Make sure that we and the peer are AUTH capable */
1337 if (!net->sctp.auth_enable || !new_asoc->peer.auth_capable) {
1338 - kfree_skb(chunk->auth_chunk);
1339 sctp_association_free(new_asoc);
1340 return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
1341 }
1342 @@ -782,10 +781,6 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
1343 auth.transport = chunk->transport;
1344
1345 ret = sctp_sf_authenticate(net, ep, new_asoc, type, &auth);
1346 -
1347 - /* We can now safely free the auth_chunk clone */
1348 - kfree_skb(chunk->auth_chunk);
1349 -
1350 if (ret != SCTP_IERROR_NO_ERROR) {
1351 sctp_association_free(new_asoc);
1352 return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
1353 diff --git a/net/socket.c b/net/socket.c
1354 index ac72efc3d965..fc90b4f0da3c 100644
1355 --- a/net/socket.c
1356 +++ b/net/socket.c
1357 @@ -1964,6 +1964,10 @@ static int copy_msghdr_from_user(struct msghdr *kmsg,
1358 {
1359 if (copy_from_user(kmsg, umsg, sizeof(struct msghdr)))
1360 return -EFAULT;
1361 +
1362 + if (kmsg->msg_namelen < 0)
1363 + return -EINVAL;
1364 +
1365 if (kmsg->msg_namelen > sizeof(struct sockaddr_storage))
1366 kmsg->msg_namelen = sizeof(struct sockaddr_storage);
1367 return 0;
1368 diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
1369 index 94d334781554..75e198d029d2 100644
1370 --- a/net/unix/af_unix.c
1371 +++ b/net/unix/af_unix.c
1372 @@ -1792,8 +1792,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
1373 goto out;
1374
1375 err = mutex_lock_interruptible(&u->readlock);
1376 - if (err) {
1377 - err = sock_intr_errno(sock_rcvtimeo(sk, noblock));
1378 + if (unlikely(err)) {
1379 + /* recvmsg() in non blocking mode is supposed to return -EAGAIN
1380 + * sk_rcvtimeo is not honored by mutex_lock_interruptible()
1381 + */
1382 + err = noblock ? -EAGAIN : -ERESTARTSYS;
1383 goto out;
1384 }
1385
1386 @@ -1913,6 +1916,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
1387 struct unix_sock *u = unix_sk(sk);
1388 struct sockaddr_un *sunaddr = msg->msg_name;
1389 int copied = 0;
1390 + int noblock = flags & MSG_DONTWAIT;
1391 int check_creds = 0;
1392 int target;
1393 int err = 0;
1394 @@ -1928,7 +1932,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
1395 goto out;
1396
1397 target = sock_rcvlowat(sk, flags&MSG_WAITALL, size);
1398 - timeo = sock_rcvtimeo(sk, flags&MSG_DONTWAIT);
1399 + timeo = sock_rcvtimeo(sk, noblock);
1400
1401 /* Lock the socket to prevent queue disordering
1402 * while sleeps in memcpy_tomsg
1403 @@ -1940,8 +1944,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
1404 }
1405
1406 err = mutex_lock_interruptible(&u->readlock);
1407 - if (err) {
1408 - err = sock_intr_errno(timeo);
1409 + if (unlikely(err)) {
1410 + /* recvmsg() in non blocking mode is supposed to return -EAGAIN
1411 + * sk_rcvtimeo is not honored by mutex_lock_interruptible()
1412 + */
1413 + err = noblock ? -EAGAIN : -ERESTARTSYS;
1414 goto out;
1415 }
1416
1417 diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
1418 index 182084d728c8..8ccf83056a7a 100644
1419 --- a/scripts/Makefile.headersinst
1420 +++ b/scripts/Makefile.headersinst
1421 @@ -47,18 +47,24 @@ header-y := $(filter-out $(generic-y), $(header-y))
1422 all-files := $(header-y) $(genhdr-y) $(wrapper-files)
1423 output-files := $(addprefix $(installdir)/, $(all-files))
1424
1425 -input-files := $(foreach hdr, $(header-y), \
1426 +input-files1 := $(foreach hdr, $(header-y), \
1427 $(if $(wildcard $(srcdir)/$(hdr)), \
1428 - $(wildcard $(srcdir)/$(hdr)), \
1429 + $(wildcard $(srcdir)/$(hdr))) \
1430 + )
1431 +input-files1-name := $(notdir $(input-files1))
1432 +input-files2 := $(foreach hdr, $(header-y), \
1433 + $(if $(wildcard $(srcdir)/$(hdr)),, \
1434 $(if $(wildcard $(oldsrcdir)/$(hdr)), \
1435 $(wildcard $(oldsrcdir)/$(hdr)), \
1436 $(error Missing UAPI file $(srcdir)/$(hdr))) \
1437 - )) \
1438 - $(foreach hdr, $(genhdr-y), \
1439 + ))
1440 +input-files2-name := $(notdir $(input-files2))
1441 +input-files3 := $(foreach hdr, $(genhdr-y), \
1442 $(if $(wildcard $(gendir)/$(hdr)), \
1443 $(wildcard $(gendir)/$(hdr)), \
1444 $(error Missing generated UAPI file $(gendir)/$(hdr)) \
1445 ))
1446 +input-files3-name := $(notdir $(input-files3))
1447
1448 # Work out what needs to be removed
1449 oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
1450 @@ -72,7 +78,9 @@ printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
1451 quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
1452 file$(if $(word 2, $(all-files)),s))
1453 cmd_install = \
1454 - $(CONFIG_SHELL) $< $(installdir) $(input-files); \
1455 + $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(input-files1-name); \
1456 + $(CONFIG_SHELL) $< $(installdir) $(oldsrcdir) $(input-files2-name); \
1457 + $(CONFIG_SHELL) $< $(installdir) $(gendir) $(input-files3-name); \
1458 for F in $(wrapper-files); do \
1459 echo "\#include <asm-generic/$$F>" > $(installdir)/$$F; \
1460 done; \
1461 @@ -98,7 +106,7 @@ __headersinst: $(subdirs) $(install-file)
1462 @:
1463
1464 targets += $(install-file)
1465 -$(install-file): scripts/headers_install.sh $(input-files) FORCE
1466 +$(install-file): scripts/headers_install.sh $(input-files1) $(input-files2) $(input-files3) FORCE
1467 $(if $(unwanted),$(call cmd,remove),)
1468 $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
1469 $(call if_changed,install)
1470 diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh
1471 index 643764f53ea7..5de5660cb708 100644
1472 --- a/scripts/headers_install.sh
1473 +++ b/scripts/headers_install.sh
1474 @@ -2,7 +2,7 @@
1475
1476 if [ $# -lt 1 ]
1477 then
1478 - echo "Usage: headers_install.sh OUTDIR [FILES...]
1479 + echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]
1480 echo
1481 echo "Prepares kernel header files for use by user space, by removing"
1482 echo "all compiler.h definitions and #includes, removing any"
1483 @@ -10,6 +10,7 @@ then
1484 echo "asm/inline/volatile keywords."
1485 echo
1486 echo "OUTDIR: directory to write each userspace header FILE to."
1487 + echo "SRCDIR: source directory where files are picked."
1488 echo "FILES: list of header files to operate on."
1489
1490 exit 1
1491 @@ -19,6 +20,8 @@ fi
1492
1493 OUTDIR="$1"
1494 shift
1495 +SRCDIR="$1"
1496 +shift
1497
1498 # Iterate through files listed on command line
1499
1500 @@ -34,7 +37,7 @@ do
1501 -e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
1502 -e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
1503 -e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \
1504 - "$i" > "$OUTDIR/$FILE.sed" || exit 1
1505 + "$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1
1506 scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \
1507 > "$OUTDIR/$FILE"
1508 [ $? -gt 1 ] && exit 1
1509 diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
1510 index a7096e130c04..70d4a8a7f21c 100644
1511 --- a/security/selinux/hooks.c
1512 +++ b/security/selinux/hooks.c
1513 @@ -1361,15 +1361,33 @@ static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dent
1514 isec->sid = sbsec->sid;
1515
1516 if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
1517 - if (opt_dentry) {
1518 - isec->sclass = inode_mode_to_security_class(inode->i_mode);
1519 - rc = selinux_proc_get_sid(opt_dentry,
1520 - isec->sclass,
1521 - &sid);
1522 - if (rc)
1523 - goto out_unlock;
1524 - isec->sid = sid;
1525 - }
1526 + /* We must have a dentry to determine the label on
1527 + * procfs inodes */
1528 + if (opt_dentry)
1529 + /* Called from d_instantiate or
1530 + * d_splice_alias. */
1531 + dentry = dget(opt_dentry);
1532 + else
1533 + /* Called from selinux_complete_init, try to
1534 + * find a dentry. */
1535 + dentry = d_find_alias(inode);
1536 + /*
1537 + * This can be hit on boot when a file is accessed
1538 + * before the policy is loaded. When we load policy we
1539 + * may find inodes that have no dentry on the
1540 + * sbsec->isec_head list. No reason to complain as
1541 + * these will get fixed up the next time we go through
1542 + * inode_doinit() with a dentry, before these inodes
1543 + * could be used again by userspace.
1544 + */
1545 + if (!dentry)
1546 + goto out_unlock;
1547 + isec->sclass = inode_mode_to_security_class(inode->i_mode);
1548 + rc = selinux_proc_get_sid(dentry, isec->sclass, &sid);
1549 + dput(dentry);
1550 + if (rc)
1551 + goto out_unlock;
1552 + isec->sid = sid;
1553 }
1554 break;
1555 }