1 |
commit: ceafe7df41a12a32bf25b8e5917f5975e27b72ea |
2 |
Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
3 |
AuthorDate: Wed Jul 9 23:17:24 2014 +0000 |
4 |
Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed Jul 9 23:17:24 2014 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/linux-patches.git;a=commit;h=ceafe7df |
7 |
|
8 |
Linux patch 3.4.98 |
9 |
|
10 |
--- |
11 |
0000_README | 4 + |
12 |
1097_linux-3.4.98.patch | 1534 +++++++++++++++++++++++++++++++++++++++++++++++ |
13 |
2 files changed, 1538 insertions(+) |
14 |
|
15 |
diff --git a/0000_README b/0000_README |
16 |
index bacfd0f..3c72076 100644 |
17 |
--- a/0000_README |
18 |
+++ b/0000_README |
19 |
@@ -427,6 +427,10 @@ Patch: 1096_linux-3.4.97.patch |
20 |
From: http://www.kernel.org |
21 |
Desc: Linux 3.4.97 |
22 |
|
23 |
+Patch: 1097_linux-3.4.98.patch |
24 |
+From: http://www.kernel.org |
25 |
+Desc: Linux 3.4.98 |
26 |
+ |
27 |
Patch: 1500_XATTR_USER_PREFIX.patch |
28 |
From: https://bugs.gentoo.org/show_bug.cgi?id=470644 |
29 |
Desc: Support for namespace user.pax.* on tmpfs. |
30 |
|
31 |
diff --git a/1097_linux-3.4.98.patch b/1097_linux-3.4.98.patch |
32 |
new file mode 100644 |
33 |
index 0000000..db655a8 |
34 |
--- /dev/null |
35 |
+++ b/1097_linux-3.4.98.patch |
36 |
@@ -0,0 +1,1534 @@ |
37 |
+diff --git a/Makefile b/Makefile |
38 |
+index fdd7c32ea1f7..d277446ee8ee 100644 |
39 |
+--- a/Makefile |
40 |
++++ b/Makefile |
41 |
+@@ -1,6 +1,6 @@ |
42 |
+ VERSION = 3 |
43 |
+ PATCHLEVEL = 4 |
44 |
+-SUBLEVEL = 97 |
45 |
++SUBLEVEL = 98 |
46 |
+ EXTRAVERSION = |
47 |
+ NAME = Saber-toothed Squirrel |
48 |
+ |
49 |
+diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c |
50 |
+index 65c33911341f..90b33c55ac1b 100644 |
51 |
+--- a/arch/arm/mach-omap2/mux.c |
52 |
++++ b/arch/arm/mach-omap2/mux.c |
53 |
+@@ -184,8 +184,10 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition, |
54 |
+ m0_entry = mux->muxnames[0]; |
55 |
+ |
56 |
+ /* First check for full name in mode0.muxmode format */ |
57 |
+- if (mode0_len && strncmp(muxname, m0_entry, mode0_len)) |
58 |
+- continue; |
59 |
++ if (mode0_len) |
60 |
++ if (strncmp(muxname, m0_entry, mode0_len) || |
61 |
++ (strlen(m0_entry) != mode0_len)) |
62 |
++ continue; |
63 |
+ |
64 |
+ /* Then check for muxmode only */ |
65 |
+ for (i = 0; i < OMAP_MUX_NR_MODES; i++) { |
66 |
+diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S |
67 |
+index 8f880bc77c56..846a16378d01 100644 |
68 |
+--- a/arch/powerpc/kernel/exceptions-64s.S |
69 |
++++ b/arch/powerpc/kernel/exceptions-64s.S |
70 |
+@@ -491,7 +491,7 @@ machine_check_common: |
71 |
+ STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) |
72 |
+ STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) |
73 |
+ STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) |
74 |
+- STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) |
75 |
++ STD_EXCEPTION_COMMON(0xe40, emulation_assist, .emulation_assist_interrupt) |
76 |
+ STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) |
77 |
+ STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception) |
78 |
+ STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception) |
79 |
+diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c |
80 |
+index f5725bce9ed2..f62fda1b6d61 100644 |
81 |
+--- a/arch/powerpc/kernel/lparcfg.c |
82 |
++++ b/arch/powerpc/kernel/lparcfg.c |
83 |
+@@ -35,7 +35,13 @@ |
84 |
+ #include <asm/vdso_datapage.h> |
85 |
+ #include <asm/vio.h> |
86 |
+ #include <asm/mmu.h> |
87 |
++#include <asm/machdep.h> |
88 |
+ |
89 |
++ |
90 |
++/* |
91 |
++ * This isn't a module but we expose that to userspace |
92 |
++ * via /proc so leave the definitions here |
93 |
++ */ |
94 |
+ #define MODULE_VERS "1.9" |
95 |
+ #define MODULE_NAME "lparcfg" |
96 |
+ |
97 |
+@@ -301,6 +307,7 @@ static void parse_system_parameter_string(struct seq_file *m) |
98 |
+ __pa(rtas_data_buf), |
99 |
+ RTAS_DATA_BUF_SIZE); |
100 |
+ memcpy(local_buffer, rtas_data_buf, SPLPAR_MAXLENGTH); |
101 |
++ local_buffer[SPLPAR_MAXLENGTH - 1] = '\0'; |
102 |
+ spin_unlock(&rtas_data_buf_lock); |
103 |
+ |
104 |
+ if (call_status != 0) { |
105 |
+@@ -419,7 +426,8 @@ static void parse_em_data(struct seq_file *m) |
106 |
+ { |
107 |
+ unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; |
108 |
+ |
109 |
+- if (plpar_hcall(H_GET_EM_PARMS, retbuf) == H_SUCCESS) |
110 |
++ if (firmware_has_feature(FW_FEATURE_LPAR) && |
111 |
++ plpar_hcall(H_GET_EM_PARMS, retbuf) == H_SUCCESS) |
112 |
+ seq_printf(m, "power_mode_data=%016lx\n", retbuf[0]); |
113 |
+ } |
114 |
+ |
115 |
+@@ -678,7 +686,6 @@ static int lparcfg_open(struct inode *inode, struct file *file) |
116 |
+ } |
117 |
+ |
118 |
+ static const struct file_operations lparcfg_fops = { |
119 |
+- .owner = THIS_MODULE, |
120 |
+ .read = seq_read, |
121 |
+ .write = lparcfg_write, |
122 |
+ .open = lparcfg_open, |
123 |
+@@ -704,15 +711,4 @@ static int __init lparcfg_init(void) |
124 |
+ proc_ppc64_lparcfg = ent; |
125 |
+ return 0; |
126 |
+ } |
127 |
+- |
128 |
+-static void __exit lparcfg_cleanup(void) |
129 |
+-{ |
130 |
+- if (proc_ppc64_lparcfg) |
131 |
+- remove_proc_entry("lparcfg", proc_ppc64_lparcfg->parent); |
132 |
+-} |
133 |
+- |
134 |
+-module_init(lparcfg_init); |
135 |
+-module_exit(lparcfg_cleanup); |
136 |
+-MODULE_DESCRIPTION("Interface for LPAR configuration data"); |
137 |
+-MODULE_AUTHOR("Dave Engebretsen"); |
138 |
+-MODULE_LICENSE("GPL"); |
139 |
++machine_device_initcall(pseries, lparcfg_init); |
140 |
+diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c |
141 |
+index 389bd4f0cdb1..5c9eccc602ef 100644 |
142 |
+--- a/arch/powerpc/kernel/setup_64.c |
143 |
++++ b/arch/powerpc/kernel/setup_64.c |
144 |
+@@ -76,7 +76,7 @@ |
145 |
+ #endif |
146 |
+ |
147 |
+ int boot_cpuid = 0; |
148 |
+-int __initdata spinning_secondaries; |
149 |
++int spinning_secondaries; |
150 |
+ u64 ppc64_pft_size; |
151 |
+ |
152 |
+ /* Pick defaults since we might want to patch instructions |
153 |
+diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c |
154 |
+index 8302af649219..a191a72372fa 100644 |
155 |
+--- a/arch/powerpc/kernel/sysfs.c |
156 |
++++ b/arch/powerpc/kernel/sysfs.c |
157 |
+@@ -17,6 +17,7 @@ |
158 |
+ #include <asm/machdep.h> |
159 |
+ #include <asm/smp.h> |
160 |
+ #include <asm/pmc.h> |
161 |
++#include <asm/firmware.h> |
162 |
+ |
163 |
+ #include "cacheinfo.h" |
164 |
+ |
165 |
+@@ -179,15 +180,25 @@ SYSFS_PMCSETUP(spurr, SPRN_SPURR); |
166 |
+ SYSFS_PMCSETUP(dscr, SPRN_DSCR); |
167 |
+ SYSFS_PMCSETUP(pir, SPRN_PIR); |
168 |
+ |
169 |
++/* |
170 |
++ Lets only enable read for phyp resources and |
171 |
++ enable write when needed with a separate function. |
172 |
++ Lets be conservative and default to pseries. |
173 |
++ */ |
174 |
+ static DEVICE_ATTR(mmcra, 0600, show_mmcra, store_mmcra); |
175 |
+ static DEVICE_ATTR(spurr, 0600, show_spurr, NULL); |
176 |
+ static DEVICE_ATTR(dscr, 0600, show_dscr, store_dscr); |
177 |
+-static DEVICE_ATTR(purr, 0600, show_purr, store_purr); |
178 |
++static DEVICE_ATTR(purr, 0400, show_purr, store_purr); |
179 |
+ static DEVICE_ATTR(pir, 0400, show_pir, NULL); |
180 |
+ |
181 |
+ unsigned long dscr_default = 0; |
182 |
+ EXPORT_SYMBOL(dscr_default); |
183 |
+ |
184 |
++static void add_write_permission_dev_attr(struct device_attribute *attr) |
185 |
++{ |
186 |
++ attr->attr.mode |= 0200; |
187 |
++} |
188 |
++ |
189 |
+ static ssize_t show_dscr_default(struct device *dev, |
190 |
+ struct device_attribute *attr, char *buf) |
191 |
+ { |
192 |
+@@ -394,8 +405,11 @@ static void __cpuinit register_cpu_online(unsigned int cpu) |
193 |
+ if (cpu_has_feature(CPU_FTR_MMCRA)) |
194 |
+ device_create_file(s, &dev_attr_mmcra); |
195 |
+ |
196 |
+- if (cpu_has_feature(CPU_FTR_PURR)) |
197 |
++ if (cpu_has_feature(CPU_FTR_PURR)) { |
198 |
++ if (!firmware_has_feature(FW_FEATURE_LPAR)) |
199 |
++ add_write_permission_dev_attr(&dev_attr_purr); |
200 |
+ device_create_file(s, &dev_attr_purr); |
201 |
++ } |
202 |
+ |
203 |
+ if (cpu_has_feature(CPU_FTR_SPURR)) |
204 |
+ device_create_file(s, &dev_attr_spurr); |
205 |
+diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c |
206 |
+index eb6b72faec0d..b32729b694c2 100644 |
207 |
+--- a/arch/powerpc/kernel/time.c |
208 |
++++ b/arch/powerpc/kernel/time.c |
209 |
+@@ -212,8 +212,6 @@ static u64 scan_dispatch_log(u64 stop_tb) |
210 |
+ if (i == vpa->dtl_idx) |
211 |
+ return 0; |
212 |
+ while (i < vpa->dtl_idx) { |
213 |
+- if (dtl_consumer) |
214 |
+- dtl_consumer(dtl, i); |
215 |
+ dtb = dtl->timebase; |
216 |
+ tb_delta = dtl->enqueue_to_dispatch_time + |
217 |
+ dtl->ready_to_enqueue_time; |
218 |
+@@ -226,6 +224,8 @@ static u64 scan_dispatch_log(u64 stop_tb) |
219 |
+ } |
220 |
+ if (dtb > stop_tb) |
221 |
+ break; |
222 |
++ if (dtl_consumer) |
223 |
++ dtl_consumer(dtl, i); |
224 |
+ stolen += tb_delta; |
225 |
+ ++i; |
226 |
+ ++dtl; |
227 |
+diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c |
228 |
+index 3bb7197a7bdc..5557044b78ab 100644 |
229 |
+--- a/arch/powerpc/kernel/traps.c |
230 |
++++ b/arch/powerpc/kernel/traps.c |
231 |
+@@ -1074,6 +1074,16 @@ void __kprobes program_check_exception(struct pt_regs *regs) |
232 |
+ _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); |
233 |
+ } |
234 |
+ |
235 |
++/* |
236 |
++ * This occurs when running in hypervisor mode on POWER6 or later |
237 |
++ * and an illegal instruction is encountered. |
238 |
++ */ |
239 |
++void __kprobes emulation_assist_interrupt(struct pt_regs *regs) |
240 |
++{ |
241 |
++ regs->msr |= REASON_ILLEGAL; |
242 |
++ program_check_exception(regs); |
243 |
++} |
244 |
++ |
245 |
+ void alignment_exception(struct pt_regs *regs) |
246 |
+ { |
247 |
+ int sig, code, fixed = 0; |
248 |
+diff --git a/arch/powerpc/lib/checksum_64.S b/arch/powerpc/lib/checksum_64.S |
249 |
+index afa2ebaee174..3cdbc648d979 100644 |
250 |
+--- a/arch/powerpc/lib/checksum_64.S |
251 |
++++ b/arch/powerpc/lib/checksum_64.S |
252 |
+@@ -229,19 +229,35 @@ _GLOBAL(csum_partial) |
253 |
+ blr |
254 |
+ |
255 |
+ |
256 |
+- .macro source |
257 |
++ .macro srcnr |
258 |
+ 100: |
259 |
+ .section __ex_table,"a" |
260 |
+ .align 3 |
261 |
+- .llong 100b,.Lsrc_error |
262 |
++ .llong 100b,.Lsrc_error_nr |
263 |
+ .previous |
264 |
+ .endm |
265 |
+ |
266 |
+- .macro dest |
267 |
++ .macro source |
268 |
++150: |
269 |
++ .section __ex_table,"a" |
270 |
++ .align 3 |
271 |
++ .llong 150b,.Lsrc_error |
272 |
++ .previous |
273 |
++ .endm |
274 |
++ |
275 |
++ .macro dstnr |
276 |
+ 200: |
277 |
+ .section __ex_table,"a" |
278 |
+ .align 3 |
279 |
+- .llong 200b,.Ldest_error |
280 |
++ .llong 200b,.Ldest_error_nr |
281 |
++ .previous |
282 |
++ .endm |
283 |
++ |
284 |
++ .macro dest |
285 |
++250: |
286 |
++ .section __ex_table,"a" |
287 |
++ .align 3 |
288 |
++ .llong 250b,.Ldest_error |
289 |
+ .previous |
290 |
+ .endm |
291 |
+ |
292 |
+@@ -277,11 +293,11 @@ _GLOBAL(csum_partial_copy_generic) |
293 |
+ mtctr r6 |
294 |
+ |
295 |
+ 1: |
296 |
+-source; lhz r6,0(r3) /* align to doubleword */ |
297 |
++srcnr; lhz r6,0(r3) /* align to doubleword */ |
298 |
+ subi r5,r5,2 |
299 |
+ addi r3,r3,2 |
300 |
+ adde r0,r0,r6 |
301 |
+-dest; sth r6,0(r4) |
302 |
++dstnr; sth r6,0(r4) |
303 |
+ addi r4,r4,2 |
304 |
+ bdnz 1b |
305 |
+ |
306 |
+@@ -395,10 +411,10 @@ dest; std r16,56(r4) |
307 |
+ |
308 |
+ mtctr r6 |
309 |
+ 3: |
310 |
+-source; ld r6,0(r3) |
311 |
++srcnr; ld r6,0(r3) |
312 |
+ addi r3,r3,8 |
313 |
+ adde r0,r0,r6 |
314 |
+-dest; std r6,0(r4) |
315 |
++dstnr; std r6,0(r4) |
316 |
+ addi r4,r4,8 |
317 |
+ bdnz 3b |
318 |
+ |
319 |
+@@ -408,10 +424,10 @@ dest; std r6,0(r4) |
320 |
+ srdi. r6,r5,2 |
321 |
+ beq .Lcopy_tail_halfword |
322 |
+ |
323 |
+-source; lwz r6,0(r3) |
324 |
++srcnr; lwz r6,0(r3) |
325 |
+ addi r3,r3,4 |
326 |
+ adde r0,r0,r6 |
327 |
+-dest; stw r6,0(r4) |
328 |
++dstnr; stw r6,0(r4) |
329 |
+ addi r4,r4,4 |
330 |
+ subi r5,r5,4 |
331 |
+ |
332 |
+@@ -419,10 +435,10 @@ dest; stw r6,0(r4) |
333 |
+ srdi. r6,r5,1 |
334 |
+ beq .Lcopy_tail_byte |
335 |
+ |
336 |
+-source; lhz r6,0(r3) |
337 |
++srcnr; lhz r6,0(r3) |
338 |
+ addi r3,r3,2 |
339 |
+ adde r0,r0,r6 |
340 |
+-dest; sth r6,0(r4) |
341 |
++dstnr; sth r6,0(r4) |
342 |
+ addi r4,r4,2 |
343 |
+ subi r5,r5,2 |
344 |
+ |
345 |
+@@ -430,10 +446,10 @@ dest; sth r6,0(r4) |
346 |
+ andi. r6,r5,1 |
347 |
+ beq .Lcopy_finish |
348 |
+ |
349 |
+-source; lbz r6,0(r3) |
350 |
++srcnr; lbz r6,0(r3) |
351 |
+ sldi r9,r6,8 /* Pad the byte out to 16 bits */ |
352 |
+ adde r0,r0,r9 |
353 |
+-dest; stb r6,0(r4) |
354 |
++dstnr; stb r6,0(r4) |
355 |
+ |
356 |
+ .Lcopy_finish: |
357 |
+ addze r0,r0 /* add in final carry */ |
358 |
+@@ -443,6 +459,11 @@ dest; stb r6,0(r4) |
359 |
+ blr |
360 |
+ |
361 |
+ .Lsrc_error: |
362 |
++ ld r14,STK_REG(r14)(r1) |
363 |
++ ld r15,STK_REG(r15)(r1) |
364 |
++ ld r16,STK_REG(r16)(r1) |
365 |
++ addi r1,r1,STACKFRAMESIZE |
366 |
++.Lsrc_error_nr: |
367 |
+ cmpdi 0,r7,0 |
368 |
+ beqlr |
369 |
+ li r6,-EFAULT |
370 |
+@@ -450,6 +471,11 @@ dest; stb r6,0(r4) |
371 |
+ blr |
372 |
+ |
373 |
+ .Ldest_error: |
374 |
++ ld r14,STK_REG(r14)(r1) |
375 |
++ ld r15,STK_REG(r15)(r1) |
376 |
++ ld r16,STK_REG(r16)(r1) |
377 |
++ addi r1,r1,STACKFRAMESIZE |
378 |
++.Ldest_error_nr: |
379 |
+ cmpdi 0,r8,0 |
380 |
+ beqlr |
381 |
+ li r6,-EFAULT |
382 |
+diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
383 |
+index d57eacb9fcf6..944471f4d142 100644 |
384 |
+--- a/arch/x86/include/asm/kvm_host.h |
385 |
++++ b/arch/x86/include/asm/kvm_host.h |
386 |
+@@ -102,7 +102,7 @@ |
387 |
+ #define KVM_REFILL_PAGES 25 |
388 |
+ #define KVM_MAX_CPUID_ENTRIES 80 |
389 |
+ #define KVM_NR_FIXED_MTRR_REGION 88 |
390 |
+-#define KVM_NR_VAR_MTRR 8 |
391 |
++#define KVM_NR_VAR_MTRR 10 |
392 |
+ |
393 |
+ #define ASYNC_PF_PER_VCPU 64 |
394 |
+ |
395 |
+@@ -436,7 +436,7 @@ struct kvm_vcpu_arch { |
396 |
+ bool nmi_injected; /* Trying to inject an NMI this entry */ |
397 |
+ |
398 |
+ struct mtrr_state_type mtrr_state; |
399 |
+- u32 pat; |
400 |
++ u64 pat; |
401 |
+ |
402 |
+ int switch_db_regs; |
403 |
+ unsigned long db[KVM_NR_DB_REGS]; |
404 |
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
405 |
+index 415448af36bf..8c5ad89a65a5 100644 |
406 |
+--- a/drivers/acpi/video.c |
407 |
++++ b/drivers/acpi/video.c |
408 |
+@@ -463,6 +463,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
409 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), |
410 |
+ }, |
411 |
+ }, |
412 |
++ { |
413 |
++ .callback = video_ignore_initial_backlight, |
414 |
++ .ident = "HP 1000 Notebook PC", |
415 |
++ .matches = { |
416 |
++ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
417 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), |
418 |
++ }, |
419 |
++ }, |
420 |
++ { |
421 |
++ .callback = video_ignore_initial_backlight, |
422 |
++ .ident = "HP Pavilion dm4", |
423 |
++ .matches = { |
424 |
++ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
425 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dm4 Notebook PC"), |
426 |
++ }, |
427 |
++ }, |
428 |
+ {} |
429 |
+ }; |
430 |
+ |
431 |
+diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c |
432 |
+index 45d8097ef4cf..144088717b86 100644 |
433 |
+--- a/drivers/acpi/video_detect.c |
434 |
++++ b/drivers/acpi/video_detect.c |
435 |
+@@ -132,6 +132,49 @@ find_video(acpi_handle handle, u32 lvl, void *context, void **rv) |
436 |
+ return AE_OK; |
437 |
+ } |
438 |
+ |
439 |
++/* Force to use vendor driver when the ACPI device is known to be |
440 |
++ * buggy */ |
441 |
++static int video_detect_force_vendor(const struct dmi_system_id *d) |
442 |
++{ |
443 |
++ acpi_video_support |= ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; |
444 |
++ return 0; |
445 |
++} |
446 |
++ |
447 |
++static struct dmi_system_id video_detect_dmi_table[] = { |
448 |
++ /* On Samsung X360, the BIOS will set a flag (VDRV) if generic |
449 |
++ * ACPI backlight device is used. This flag will definitively break |
450 |
++ * the backlight interface (even the vendor interface) untill next |
451 |
++ * reboot. It's why we should prevent video.ko from being used here |
452 |
++ * and we can't rely on a later call to acpi_video_unregister(). |
453 |
++ */ |
454 |
++ { |
455 |
++ .callback = video_detect_force_vendor, |
456 |
++ .ident = "X360", |
457 |
++ .matches = { |
458 |
++ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), |
459 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "X360"), |
460 |
++ DMI_MATCH(DMI_BOARD_NAME, "X360"), |
461 |
++ }, |
462 |
++ }, |
463 |
++ { |
464 |
++ .callback = video_detect_force_vendor, |
465 |
++ .ident = "Asus UL30VT", |
466 |
++ .matches = { |
467 |
++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
468 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "UL30VT"), |
469 |
++ }, |
470 |
++ }, |
471 |
++ { |
472 |
++ .callback = video_detect_force_vendor, |
473 |
++ .ident = "Asus UL30A", |
474 |
++ .matches = { |
475 |
++ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), |
476 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), |
477 |
++ }, |
478 |
++ }, |
479 |
++ { }, |
480 |
++}; |
481 |
++ |
482 |
+ /* |
483 |
+ * Returns the video capabilities of a specific ACPI graphics device |
484 |
+ * |
485 |
+@@ -164,6 +207,8 @@ long acpi_video_get_capabilities(acpi_handle graphics_handle) |
486 |
+ * ACPI_VIDEO_BACKLIGHT_DMI_VENDOR; |
487 |
+ *} |
488 |
+ */ |
489 |
++ |
490 |
++ dmi_check_system(video_detect_dmi_table); |
491 |
+ } else { |
492 |
+ status = acpi_bus_get_device(graphics_handle, &tmp_dev); |
493 |
+ if (ACPI_FAILURE(status)) { |
494 |
+diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
495 |
+index dc612efbeb7a..d51c08da3f69 100644 |
496 |
+--- a/drivers/gpu/drm/radeon/atombios_crtc.c |
497 |
++++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
498 |
+@@ -863,14 +863,16 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc, |
499 |
+ args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */ |
500 |
+ if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK)) |
501 |
+ args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_REF_DIV_SRC; |
502 |
+- switch (bpc) { |
503 |
+- case 8: |
504 |
+- default: |
505 |
+- args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_24BPP; |
506 |
+- break; |
507 |
+- case 10: |
508 |
+- args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_30BPP; |
509 |
+- break; |
510 |
++ if (encoder_mode == ATOM_ENCODER_MODE_HDMI) { |
511 |
++ switch (bpc) { |
512 |
++ case 8: |
513 |
++ default: |
514 |
++ args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_24BPP; |
515 |
++ break; |
516 |
++ case 10: |
517 |
++ args.v5.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_30BPP; |
518 |
++ break; |
519 |
++ } |
520 |
+ } |
521 |
+ args.v5.ucTransmitterID = encoder_id; |
522 |
+ args.v5.ucEncoderMode = encoder_mode; |
523 |
+@@ -885,20 +887,22 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc, |
524 |
+ args.v6.ucMiscInfo = 0; /* HDMI depth, etc. */ |
525 |
+ if (ss_enabled && (ss->type & ATOM_EXTERNAL_SS_MASK)) |
526 |
+ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_REF_DIV_SRC; |
527 |
+- switch (bpc) { |
528 |
+- case 8: |
529 |
+- default: |
530 |
+- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_24BPP; |
531 |
+- break; |
532 |
+- case 10: |
533 |
+- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_30BPP; |
534 |
+- break; |
535 |
+- case 12: |
536 |
+- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_36BPP; |
537 |
+- break; |
538 |
+- case 16: |
539 |
+- args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_48BPP; |
540 |
+- break; |
541 |
++ if (encoder_mode == ATOM_ENCODER_MODE_HDMI) { |
542 |
++ switch (bpc) { |
543 |
++ case 8: |
544 |
++ default: |
545 |
++ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_24BPP; |
546 |
++ break; |
547 |
++ case 10: |
548 |
++ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_30BPP; |
549 |
++ break; |
550 |
++ case 12: |
551 |
++ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_36BPP; |
552 |
++ break; |
553 |
++ case 16: |
554 |
++ args.v6.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_48BPP; |
555 |
++ break; |
556 |
++ } |
557 |
+ } |
558 |
+ args.v6.ucTransmitterID = encoder_id; |
559 |
+ args.v6.ucEncoderMode = encoder_mode; |
560 |
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
561 |
+index 072229dca464..dd5c14e917e0 100644 |
562 |
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c |
563 |
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
564 |
+@@ -1666,8 +1666,11 @@ atombios_set_encoder_crtc_source(struct drm_encoder *encoder) |
565 |
+ args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT; |
566 |
+ else |
567 |
+ args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); |
568 |
+- } else |
569 |
++ } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
570 |
++ args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; |
571 |
++ } else { |
572 |
+ args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); |
573 |
++ } |
574 |
+ switch (radeon_encoder->encoder_id) { |
575 |
+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: |
576 |
+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
577 |
+diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c |
578 |
+index 1334dbd15c1b..9184bbe7c602 100644 |
579 |
+--- a/drivers/gpu/drm/radeon/radeon_connectors.c |
580 |
++++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
581 |
+@@ -1279,7 +1279,7 @@ bool radeon_connector_is_dp12_capable(struct drm_connector *connector) |
582 |
+ struct radeon_device *rdev = dev->dev_private; |
583 |
+ |
584 |
+ if (ASIC_IS_DCE5(rdev) && |
585 |
+- (rdev->clock.dp_extclk >= 53900) && |
586 |
++ (rdev->clock.default_dispclk >= 53900) && |
587 |
+ radeon_connector_encoder_is_hbr2(connector)) { |
588 |
+ return true; |
589 |
+ } |
590 |
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c |
591 |
+index 6651cb328598..7fc3dc7f9985 100644 |
592 |
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c |
593 |
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c |
594 |
+@@ -179,7 +179,6 @@ static int vmw_fb_set_par(struct fb_info *info) |
595 |
+ vmw_write(vmw_priv, SVGA_REG_DISPLAY_POSITION_Y, info->var.yoffset); |
596 |
+ vmw_write(vmw_priv, SVGA_REG_DISPLAY_WIDTH, info->var.xres); |
597 |
+ vmw_write(vmw_priv, SVGA_REG_DISPLAY_HEIGHT, info->var.yres); |
598 |
+- vmw_write(vmw_priv, SVGA_REG_BYTES_PER_LINE, info->fix.line_length); |
599 |
+ vmw_write(vmw_priv, SVGA_REG_DISPLAY_ID, SVGA_ID_INVALID); |
600 |
+ } |
601 |
+ |
602 |
+diff --git a/drivers/md/md.c b/drivers/md/md.c |
603 |
+index 3a8ef589d8c0..17e2f526457c 100644 |
604 |
+--- a/drivers/md/md.c |
605 |
++++ b/drivers/md/md.c |
606 |
+@@ -7180,6 +7180,19 @@ void md_do_sync(struct mddev *mddev) |
607 |
+ rdev->recovery_offset < j) |
608 |
+ j = rdev->recovery_offset; |
609 |
+ rcu_read_unlock(); |
610 |
++ |
611 |
++ /* If there is a bitmap, we need to make sure all |
612 |
++ * writes that started before we added a spare |
613 |
++ * complete before we start doing a recovery. |
614 |
++ * Otherwise the write might complete and (via |
615 |
++ * bitmap_endwrite) set a bit in the bitmap after the |
616 |
++ * recovery has checked that bit and skipped that |
617 |
++ * region. |
618 |
++ */ |
619 |
++ if (mddev->bitmap) { |
620 |
++ mddev->pers->quiesce(mddev, 1); |
621 |
++ mddev->pers->quiesce(mddev, 0); |
622 |
++ } |
623 |
+ } |
624 |
+ |
625 |
+ printk(KERN_INFO "md: %s of RAID array %s\n", desc, mdname(mddev)); |
626 |
+diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c |
627 |
+index def50caa6f84..fd11af4a702a 100644 |
628 |
+--- a/drivers/mtd/nand/pxa3xx_nand.c |
629 |
++++ b/drivers/mtd/nand/pxa3xx_nand.c |
630 |
+@@ -93,10 +93,10 @@ |
631 |
+ |
632 |
+ /* macros for registers read/write */ |
633 |
+ #define nand_writel(info, off, val) \ |
634 |
+- __raw_writel((val), (info)->mmio_base + (off)) |
635 |
++ writel_relaxed((val), (info)->mmio_base + (off)) |
636 |
+ |
637 |
+ #define nand_readl(info, off) \ |
638 |
+- __raw_readl((info)->mmio_base + (off)) |
639 |
++ readl_relaxed((info)->mmio_base + (off)) |
640 |
+ |
641 |
+ /* error code and state */ |
642 |
+ enum { |
643 |
+diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c |
644 |
+index 9db0f8e132e6..ad3961177c68 100644 |
645 |
+--- a/drivers/net/wireless/b43/xmit.c |
646 |
++++ b/drivers/net/wireless/b43/xmit.c |
647 |
+@@ -808,9 +808,13 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr) |
648 |
+ break; |
649 |
+ case B43_PHYTYPE_G: |
650 |
+ status.band = IEEE80211_BAND_2GHZ; |
651 |
+- /* chanid is the radio channel cookie value as used |
652 |
+- * to tune the radio. */ |
653 |
+- status.freq = chanid + 2400; |
654 |
++ /* Somewhere between 478.104 and 508.1084 firmware for G-PHY |
655 |
++ * has been modified to be compatible with N-PHY and others. |
656 |
++ */ |
657 |
++ if (dev->fw.rev >= 508) |
658 |
++ status.freq = ieee80211_channel_to_frequency(chanid, status.band); |
659 |
++ else |
660 |
++ status.freq = chanid + 2400; |
661 |
+ break; |
662 |
+ case B43_PHYTYPE_N: |
663 |
+ case B43_PHYTYPE_LP: |
664 |
+diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c |
665 |
+index aa10c48c0dfa..f8ea77c87b20 100644 |
666 |
+--- a/drivers/net/wireless/rt2x00/rt2500pci.c |
667 |
++++ b/drivers/net/wireless/rt2x00/rt2500pci.c |
668 |
+@@ -1679,8 +1679,13 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev) |
669 |
+ /* |
670 |
+ * Detect if this device has an hardware controlled radio. |
671 |
+ */ |
672 |
+- if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) |
673 |
++ if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO)) { |
674 |
+ __set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags); |
675 |
++ /* |
676 |
++ * On this device RFKILL initialized during probe does not work. |
677 |
++ */ |
678 |
++ __set_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags); |
679 |
++ } |
680 |
+ |
681 |
+ /* |
682 |
+ * Check if the BBP tuning should be enabled. |
683 |
+diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h |
684 |
+index c264dfa6e611..4be11e36e3ca 100644 |
685 |
+--- a/drivers/net/wireless/rt2x00/rt2x00.h |
686 |
++++ b/drivers/net/wireless/rt2x00/rt2x00.h |
687 |
+@@ -717,6 +717,7 @@ enum rt2x00_capability_flags { |
688 |
+ REQUIRE_SW_SEQNO, |
689 |
+ REQUIRE_HT_TX_DESC, |
690 |
+ REQUIRE_PS_AUTOWAKE, |
691 |
++ REQUIRE_DELAYED_RFKILL, |
692 |
+ |
693 |
+ /* |
694 |
+ * Capabilities |
695 |
+diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c |
696 |
+index 8f2c88e2c339..da65f8e97754 100644 |
697 |
+--- a/drivers/net/wireless/rt2x00/rt2x00dev.c |
698 |
++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c |
699 |
+@@ -1022,9 +1022,10 @@ static void rt2x00lib_uninitialize(struct rt2x00_dev *rt2x00dev) |
700 |
+ return; |
701 |
+ |
702 |
+ /* |
703 |
+- * Unregister extra components. |
704 |
++ * Stop rfkill polling. |
705 |
+ */ |
706 |
+- rt2x00rfkill_unregister(rt2x00dev); |
707 |
++ if (test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) |
708 |
++ rt2x00rfkill_unregister(rt2x00dev); |
709 |
+ |
710 |
+ /* |
711 |
+ * Allow the HW to uninitialize. |
712 |
+@@ -1062,6 +1063,12 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) |
713 |
+ |
714 |
+ set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags); |
715 |
+ |
716 |
++ /* |
717 |
++ * Start rfkill polling. |
718 |
++ */ |
719 |
++ if (test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) |
720 |
++ rt2x00rfkill_register(rt2x00dev); |
721 |
++ |
722 |
+ return 0; |
723 |
+ } |
724 |
+ |
725 |
+@@ -1207,7 +1214,12 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) |
726 |
+ rt2x00link_register(rt2x00dev); |
727 |
+ rt2x00leds_register(rt2x00dev); |
728 |
+ rt2x00debug_register(rt2x00dev); |
729 |
+- rt2x00rfkill_register(rt2x00dev); |
730 |
++ |
731 |
++ /* |
732 |
++ * Start rfkill polling. |
733 |
++ */ |
734 |
++ if (!test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) |
735 |
++ rt2x00rfkill_register(rt2x00dev); |
736 |
+ |
737 |
+ return 0; |
738 |
+ |
739 |
+@@ -1223,6 +1235,12 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) |
740 |
+ clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); |
741 |
+ |
742 |
+ /* |
743 |
++ * Stop rfkill polling. |
744 |
++ */ |
745 |
++ if (!test_bit(REQUIRE_DELAYED_RFKILL, &rt2x00dev->cap_flags)) |
746 |
++ rt2x00rfkill_unregister(rt2x00dev); |
747 |
++ |
748 |
++ /* |
749 |
+ * Disable radio. |
750 |
+ */ |
751 |
+ rt2x00lib_disable_radio(rt2x00dev); |
752 |
+diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c |
753 |
+index af247b06c842..e6daf129cc36 100644 |
754 |
+--- a/drivers/net/wireless/rt2x00/rt2x00mac.c |
755 |
++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c |
756 |
+@@ -517,6 +517,8 @@ int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, |
757 |
+ crypto.cipher = rt2x00crypto_key_to_cipher(key); |
758 |
+ if (crypto.cipher == CIPHER_NONE) |
759 |
+ return -EOPNOTSUPP; |
760 |
++ if (crypto.cipher == CIPHER_TKIP && rt2x00_is_usb(rt2x00dev)) |
761 |
++ return -EOPNOTSUPP; |
762 |
+ |
763 |
+ crypto.cmd = cmd; |
764 |
+ |
765 |
+diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c |
766 |
+index 337e8b33d9aa..ac58ee344790 100644 |
767 |
+--- a/drivers/scsi/ibmvscsi/ibmvscsi.c |
768 |
++++ b/drivers/scsi/ibmvscsi/ibmvscsi.c |
769 |
+@@ -484,7 +484,8 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code) |
770 |
+ evt->hostdata->dev); |
771 |
+ if (evt->cmnd_done) |
772 |
+ evt->cmnd_done(evt->cmnd); |
773 |
+- } else if (evt->done) |
774 |
++ } else if (evt->done && evt->crq.format != VIOSRP_MAD_FORMAT && |
775 |
++ evt->iu.srp.login_req.opcode != SRP_LOGIN_REQ) |
776 |
+ evt->done(evt); |
777 |
+ free_event_struct(&evt->hostdata->pool, evt); |
778 |
+ spin_lock_irqsave(hostdata->host->host_lock, flags); |
779 |
+diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c |
780 |
+index d92fe4037e94..6b349e301869 100644 |
781 |
+--- a/drivers/scsi/sym53c8xx_2/sym_hipd.c |
782 |
++++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c |
783 |
+@@ -3000,7 +3000,11 @@ sym_dequeue_from_squeue(struct sym_hcb *np, int i, int target, int lun, int task |
784 |
+ if ((target == -1 || cp->target == target) && |
785 |
+ (lun == -1 || cp->lun == lun) && |
786 |
+ (task == -1 || cp->tag == task)) { |
787 |
++#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING |
788 |
+ sym_set_cam_status(cp->cmd, DID_SOFT_ERROR); |
789 |
++#else |
790 |
++ sym_set_cam_status(cp->cmd, DID_REQUEUE); |
791 |
++#endif |
792 |
+ sym_remque(&cp->link_ccbq); |
793 |
+ sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq); |
794 |
+ } |
795 |
+diff --git a/drivers/staging/bcm/InterfaceInit.c b/drivers/staging/bcm/InterfaceInit.c |
796 |
+index 8e3c586a699c..e0f40ae358ed 100644 |
797 |
+--- a/drivers/staging/bcm/InterfaceInit.c |
798 |
++++ b/drivers/staging/bcm/InterfaceInit.c |
799 |
+@@ -4,10 +4,12 @@ static struct usb_device_id InterfaceUsbtable[] = { |
800 |
+ { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_T3) }, |
801 |
+ { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_T3B) }, |
802 |
+ { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_T3L) }, |
803 |
+- { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_SM250) }, |
804 |
++ { USB_DEVICE(BCM_USB_VENDOR_ID_T3, BCM_USB_PRODUCT_ID_SYM) }, |
805 |
+ { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_226) }, |
806 |
+ { USB_DEVICE(BCM_USB_VENDOR_ID_FOXCONN, BCM_USB_PRODUCT_ID_1901) }, |
807 |
+ { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_ZTE_TU25) }, |
808 |
++ { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_ZTE_226) }, |
809 |
++ { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE, BCM_USB_PRODUCT_ID_ZTE_326) }, |
810 |
+ { } |
811 |
+ }; |
812 |
+ MODULE_DEVICE_TABLE(usb, InterfaceUsbtable); |
813 |
+diff --git a/drivers/staging/bcm/InterfaceInit.h b/drivers/staging/bcm/InterfaceInit.h |
814 |
+index 058315a64c05..6fa4f09a37c6 100644 |
815 |
+--- a/drivers/staging/bcm/InterfaceInit.h |
816 |
++++ b/drivers/staging/bcm/InterfaceInit.h |
817 |
+@@ -8,10 +8,11 @@ |
818 |
+ #define BCM_USB_PRODUCT_ID_T3 0x0300 |
819 |
+ #define BCM_USB_PRODUCT_ID_T3B 0x0210 |
820 |
+ #define BCM_USB_PRODUCT_ID_T3L 0x0220 |
821 |
+-#define BCM_USB_PRODUCT_ID_SM250 0xbccd |
822 |
+ #define BCM_USB_PRODUCT_ID_SYM 0x15E |
823 |
+ #define BCM_USB_PRODUCT_ID_1901 0xe017 |
824 |
+-#define BCM_USB_PRODUCT_ID_226 0x0132 |
825 |
++#define BCM_USB_PRODUCT_ID_226 0x0132 /* not sure if this is valid */ |
826 |
++#define BCM_USB_PRODUCT_ID_ZTE_226 0x172 |
827 |
++#define BCM_USB_PRODUCT_ID_ZTE_326 0x173 /* ZTE AX326 */ |
828 |
+ #define BCM_USB_PRODUCT_ID_ZTE_TU25 0x0007 |
829 |
+ |
830 |
+ #define BCM_USB_MINOR_BASE 192 |
831 |
+diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c |
832 |
+index 50dc93e2a227..fff275753416 100644 |
833 |
+--- a/drivers/staging/comedi/comedi_fops.c |
834 |
++++ b/drivers/staging/comedi/comedi_fops.c |
835 |
+@@ -1078,22 +1078,19 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
836 |
+ DPRINTK("subdevice busy\n"); |
837 |
+ return -EBUSY; |
838 |
+ } |
839 |
+- s->busy = file; |
840 |
+ |
841 |
+ /* make sure channel/gain list isn't too long */ |
842 |
+ if (user_cmd.chanlist_len > s->len_chanlist) { |
843 |
+ DPRINTK("channel/gain list too long %u > %d\n", |
844 |
+ user_cmd.chanlist_len, s->len_chanlist); |
845 |
+- ret = -EINVAL; |
846 |
+- goto cleanup; |
847 |
++ return -EINVAL; |
848 |
+ } |
849 |
+ |
850 |
+ /* make sure channel/gain list isn't too short */ |
851 |
+ if (user_cmd.chanlist_len < 1) { |
852 |
+ DPRINTK("channel/gain list too short %u < 1\n", |
853 |
+ user_cmd.chanlist_len); |
854 |
+- ret = -EINVAL; |
855 |
+- goto cleanup; |
856 |
++ return -EINVAL; |
857 |
+ } |
858 |
+ |
859 |
+ async->cmd = user_cmd; |
860 |
+@@ -1103,8 +1100,7 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
861 |
+ kmalloc(async->cmd.chanlist_len * sizeof(int), GFP_KERNEL); |
862 |
+ if (!async->cmd.chanlist) { |
863 |
+ DPRINTK("allocation failed\n"); |
864 |
+- ret = -ENOMEM; |
865 |
+- goto cleanup; |
866 |
++ return -ENOMEM; |
867 |
+ } |
868 |
+ |
869 |
+ if (copy_from_user(async->cmd.chanlist, user_cmd.chanlist, |
870 |
+@@ -1156,6 +1152,9 @@ static int do_cmd_ioctl(struct comedi_device *dev, |
871 |
+ |
872 |
+ comedi_set_subdevice_runflags(s, ~0, SRF_USER | SRF_RUNNING); |
873 |
+ |
874 |
++ /* set s->busy _after_ setting SRF_RUNNING flag to avoid race with |
875 |
++ * comedi_read() or comedi_write() */ |
876 |
++ s->busy = file; |
877 |
+ ret = s->do_cmd(dev, s); |
878 |
+ if (ret == 0) |
879 |
+ return 0; |
880 |
+@@ -1658,6 +1657,7 @@ static ssize_t comedi_write(struct file *file, const char __user *buf, |
881 |
+ |
882 |
+ if (!(comedi_get_subdevice_runflags(s) & SRF_RUNNING)) { |
883 |
+ if (count == 0) { |
884 |
++ mutex_lock(&dev->mutex); |
885 |
+ if (comedi_get_subdevice_runflags(s) & |
886 |
+ SRF_ERROR) { |
887 |
+ retval = -EPIPE; |
888 |
+@@ -1665,6 +1665,7 @@ static ssize_t comedi_write(struct file *file, const char __user *buf, |
889 |
+ retval = 0; |
890 |
+ } |
891 |
+ do_become_nonbusy(dev, s); |
892 |
++ mutex_unlock(&dev->mutex); |
893 |
+ } |
894 |
+ break; |
895 |
+ } |
896 |
+@@ -1779,6 +1780,7 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, |
897 |
+ |
898 |
+ if (n == 0) { |
899 |
+ if (!(comedi_get_subdevice_runflags(s) & SRF_RUNNING)) { |
900 |
++ mutex_lock(&dev->mutex); |
901 |
+ do_become_nonbusy(dev, s); |
902 |
+ if (comedi_get_subdevice_runflags(s) & |
903 |
+ SRF_ERROR) { |
904 |
+@@ -1786,6 +1788,7 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, |
905 |
+ } else { |
906 |
+ retval = 0; |
907 |
+ } |
908 |
++ mutex_unlock(&dev->mutex); |
909 |
+ break; |
910 |
+ } |
911 |
+ if (file->f_flags & O_NONBLOCK) { |
912 |
+@@ -1823,9 +1826,11 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes, |
913 |
+ buf += n; |
914 |
+ break; /* makes device work like a pipe */ |
915 |
+ } |
916 |
+- if (!(comedi_get_subdevice_runflags(s) & (SRF_ERROR | SRF_RUNNING)) && |
917 |
+- async->buf_read_count - async->buf_write_count == 0) { |
918 |
+- do_become_nonbusy(dev, s); |
919 |
++ if (!(comedi_get_subdevice_runflags(s) & (SRF_ERROR | SRF_RUNNING))) { |
920 |
++ mutex_lock(&dev->mutex); |
921 |
++ if (async->buf_read_count - async->buf_write_count == 0) |
922 |
++ do_become_nonbusy(dev, s); |
923 |
++ mutex_unlock(&dev->mutex); |
924 |
+ } |
925 |
+ set_current_state(TASK_RUNNING); |
926 |
+ remove_wait_queue(&async->wait_head, &wait); |
927 |
+diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c |
928 |
+index d2dd75e2af7f..e16d1f38ca64 100644 |
929 |
+--- a/drivers/staging/comedi/drivers/das08.c |
930 |
++++ b/drivers/staging/comedi/drivers/das08.c |
931 |
+@@ -385,7 +385,7 @@ static const struct das08_board_struct das08_boards[] = { |
932 |
+ .ai = das08_ai_rinsn, |
933 |
+ .ai_nbits = 16, |
934 |
+ .ai_pg = das08_pg_none, |
935 |
+- .ai_encoding = das08_encode12, |
936 |
++ .ai_encoding = das08_encode16, |
937 |
+ .ao = das08jr_ao_winsn, |
938 |
+ .ao_nbits = 16, |
939 |
+ .di = das08jr_di_rbits, |
940 |
+diff --git a/drivers/staging/wlags49_h2/wl_priv.c b/drivers/staging/wlags49_h2/wl_priv.c |
941 |
+index f30e5ee4bca3..ff459b206756 100644 |
942 |
+--- a/drivers/staging/wlags49_h2/wl_priv.c |
943 |
++++ b/drivers/staging/wlags49_h2/wl_priv.c |
944 |
+@@ -570,6 +570,7 @@ int wvlan_uil_put_info( struct uilreq *urq, struct wl_private *lp ) |
945 |
+ ltv_t *pLtv; |
946 |
+ bool_t ltvAllocated = FALSE; |
947 |
+ ENCSTRCT sEncryption; |
948 |
++ size_t len; |
949 |
+ |
950 |
+ #ifdef USE_WDS |
951 |
+ hcf_16 hcfPort = HCF_PORT_0; |
952 |
+@@ -686,7 +687,8 @@ int wvlan_uil_put_info( struct uilreq *urq, struct wl_private *lp ) |
953 |
+ break; |
954 |
+ case CFG_CNF_OWN_NAME: |
955 |
+ memset( lp->StationName, 0, sizeof( lp->StationName )); |
956 |
+- memcpy( (void *)lp->StationName, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]); |
957 |
++ len = min_t(size_t, pLtv->u.u16[0], sizeof(lp->StationName)); |
958 |
++ strlcpy(lp->StationName, &pLtv->u.u8[2], len); |
959 |
+ pLtv->u.u16[0] = CNV_INT_TO_LITTLE( pLtv->u.u16[0] ); |
960 |
+ break; |
961 |
+ case CFG_CNF_LOAD_BALANCING: |
962 |
+@@ -1800,6 +1802,7 @@ int wvlan_set_station_nickname(struct net_device *dev, |
963 |
+ { |
964 |
+ struct wl_private *lp = wl_priv(dev); |
965 |
+ unsigned long flags; |
966 |
++ size_t len; |
967 |
+ int ret = 0; |
968 |
+ /*------------------------------------------------------------------------*/ |
969 |
+ |
970 |
+@@ -1810,8 +1813,8 @@ int wvlan_set_station_nickname(struct net_device *dev, |
971 |
+ wl_lock(lp, &flags); |
972 |
+ |
973 |
+ memset( lp->StationName, 0, sizeof( lp->StationName )); |
974 |
+- |
975 |
+- memcpy( lp->StationName, extra, wrqu->data.length); |
976 |
++ len = min_t(size_t, wrqu->data.length, sizeof(lp->StationName)); |
977 |
++ strlcpy(lp->StationName, extra, len); |
978 |
+ |
979 |
+ /* Commit the adapter parameters */ |
980 |
+ wl_apply( lp ); |
981 |
+diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c |
982 |
+index f52cb1ae45d9..32d1effe3d44 100644 |
983 |
+--- a/drivers/usb/gadget/f_fs.c |
984 |
++++ b/drivers/usb/gadget/f_fs.c |
985 |
+@@ -1361,11 +1361,13 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) |
986 |
+ ffs->ep0req->context = ffs; |
987 |
+ |
988 |
+ lang = ffs->stringtabs; |
989 |
+- for (lang = ffs->stringtabs; *lang; ++lang) { |
990 |
+- struct usb_string *str = (*lang)->strings; |
991 |
+- int id = first_id; |
992 |
+- for (; str->s; ++id, ++str) |
993 |
+- str->id = id; |
994 |
++ if (lang) { |
995 |
++ for (; *lang; ++lang) { |
996 |
++ struct usb_string *str = (*lang)->strings; |
997 |
++ int id = first_id; |
998 |
++ for (; str->s; ++id, ++str) |
999 |
++ str->id = id; |
1000 |
++ } |
1001 |
+ } |
1002 |
+ |
1003 |
+ ffs->gadget = cdev->gadget; |
1004 |
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1005 |
+index 87ee28e1e65e..6f1b36d15419 100644 |
1006 |
+--- a/drivers/usb/host/xhci-ring.c |
1007 |
++++ b/drivers/usb/host/xhci-ring.c |
1008 |
+@@ -3588,7 +3588,7 @@ static unsigned int xhci_get_burst_count(struct xhci_hcd *xhci, |
1009 |
+ return 0; |
1010 |
+ |
1011 |
+ max_burst = urb->ep->ss_ep_comp.bMaxBurst; |
1012 |
+- return roundup(total_packet_count, max_burst + 1) - 1; |
1013 |
++ return DIV_ROUND_UP(total_packet_count, max_burst + 1) - 1; |
1014 |
+ } |
1015 |
+ |
1016 |
+ /* |
1017 |
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
1018 |
+index 7299a06af9db..424d9cf9d9a0 100644 |
1019 |
+--- a/drivers/usb/host/xhci.c |
1020 |
++++ b/drivers/usb/host/xhci.c |
1021 |
+@@ -963,7 +963,7 @@ int xhci_suspend(struct xhci_hcd *xhci) |
1022 |
+ */ |
1023 |
+ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
1024 |
+ { |
1025 |
+- u32 command, temp = 0; |
1026 |
++ u32 command, temp = 0, status; |
1027 |
+ struct usb_hcd *hcd = xhci_to_hcd(xhci); |
1028 |
+ struct usb_hcd *secondary_hcd; |
1029 |
+ int retval = 0; |
1030 |
+@@ -1087,8 +1087,12 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) |
1031 |
+ |
1032 |
+ done: |
1033 |
+ if (retval == 0) { |
1034 |
+- usb_hcd_resume_root_hub(hcd); |
1035 |
+- usb_hcd_resume_root_hub(xhci->shared_hcd); |
1036 |
++ /* Resume root hubs only when have pending events. */ |
1037 |
++ status = readl(&xhci->op_regs->status); |
1038 |
++ if (status & STS_EINT) { |
1039 |
++ usb_hcd_resume_root_hub(hcd); |
1040 |
++ usb_hcd_resume_root_hub(xhci->shared_hcd); |
1041 |
++ } |
1042 |
+ } |
1043 |
+ |
1044 |
+ /* |
1045 |
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1046 |
+index bb9f4111d1b8..ed1650fb910d 100644 |
1047 |
+--- a/drivers/usb/serial/ftdi_sio.c |
1048 |
++++ b/drivers/usb/serial/ftdi_sio.c |
1049 |
+@@ -1593,14 +1593,17 @@ static void ftdi_set_max_packet_size(struct usb_serial_port *port) |
1050 |
+ struct usb_device *udev = serial->dev; |
1051 |
+ |
1052 |
+ struct usb_interface *interface = serial->interface; |
1053 |
+- struct usb_endpoint_descriptor *ep_desc = &interface->cur_altsetting->endpoint[1].desc; |
1054 |
++ struct usb_endpoint_descriptor *ep_desc; |
1055 |
+ |
1056 |
+ unsigned num_endpoints; |
1057 |
+- int i; |
1058 |
++ unsigned i; |
1059 |
+ |
1060 |
+ num_endpoints = interface->cur_altsetting->desc.bNumEndpoints; |
1061 |
+ dev_info(&udev->dev, "Number of endpoints %d\n", num_endpoints); |
1062 |
+ |
1063 |
++ if (!num_endpoints) |
1064 |
++ return; |
1065 |
++ |
1066 |
+ /* NOTE: some customers have programmed FT232R/FT245R devices |
1067 |
+ * with an endpoint size of 0 - not good. In this case, we |
1068 |
+ * want to override the endpoint descriptor setting and use a |
1069 |
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1070 |
+index f7ccfbcdbf04..58fcaa5ae548 100644 |
1071 |
+--- a/drivers/usb/serial/option.c |
1072 |
++++ b/drivers/usb/serial/option.c |
1073 |
+@@ -357,6 +357,9 @@ static void option_instat_callback(struct urb *urb); |
1074 |
+ /* Zoom */ |
1075 |
+ #define ZOOM_PRODUCT_4597 0x9607 |
1076 |
+ |
1077 |
++/* SpeedUp SU9800 usb 3g modem */ |
1078 |
++#define SPEEDUP_PRODUCT_SU9800 0x9800 |
1079 |
++ |
1080 |
+ /* Haier products */ |
1081 |
+ #define HAIER_VENDOR_ID 0x201e |
1082 |
+ #define HAIER_PRODUCT_CE100 0x2009 |
1083 |
+@@ -377,8 +380,12 @@ static void option_instat_callback(struct urb *urb); |
1084 |
+ /* Olivetti products */ |
1085 |
+ #define OLIVETTI_VENDOR_ID 0x0b3c |
1086 |
+ #define OLIVETTI_PRODUCT_OLICARD100 0xc000 |
1087 |
++#define OLIVETTI_PRODUCT_OLICARD120 0xc001 |
1088 |
++#define OLIVETTI_PRODUCT_OLICARD140 0xc002 |
1089 |
+ #define OLIVETTI_PRODUCT_OLICARD145 0xc003 |
1090 |
++#define OLIVETTI_PRODUCT_OLICARD155 0xc004 |
1091 |
+ #define OLIVETTI_PRODUCT_OLICARD200 0xc005 |
1092 |
++#define OLIVETTI_PRODUCT_OLICARD160 0xc00a |
1093 |
+ #define OLIVETTI_PRODUCT_OLICARD500 0xc00b |
1094 |
+ |
1095 |
+ /* Celot products */ |
1096 |
+@@ -1597,6 +1604,7 @@ static const struct usb_device_id option_ids[] = { |
1097 |
+ { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), |
1098 |
+ .driver_info = (kernel_ulong_t)&four_g_w14_blacklist |
1099 |
+ }, |
1100 |
++ { USB_DEVICE_INTERFACE_CLASS(LONGCHEER_VENDOR_ID, SPEEDUP_PRODUCT_SU9800, 0xff) }, |
1101 |
+ { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, |
1102 |
+ { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, |
1103 |
+ { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, |
1104 |
+@@ -1631,15 +1639,21 @@ static const struct usb_device_id option_ids[] = { |
1105 |
+ { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) }, |
1106 |
+ { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, /* HC28 enumerates with Siemens or Cinterion VID depending on FW revision */ |
1107 |
+ { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, |
1108 |
+- |
1109 |
+- { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, |
1110 |
++ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100), |
1111 |
++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1112 |
++ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120), |
1113 |
++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1114 |
++ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD140), |
1115 |
++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1116 |
+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, |
1117 |
++ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD155), |
1118 |
++ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, |
1119 |
+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), |
1120 |
+- .driver_info = (kernel_ulong_t)&net_intf6_blacklist |
1121 |
+- }, |
1122 |
++ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, |
1123 |
++ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD160), |
1124 |
++ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, |
1125 |
+ { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD500), |
1126 |
+- .driver_info = (kernel_ulong_t)&net_intf4_blacklist |
1127 |
+- }, |
1128 |
++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1129 |
+ { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
1130 |
+ { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
1131 |
+ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, |
1132 |
+diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c |
1133 |
+index 6a8568c6466f..f2da2bd20188 100644 |
1134 |
+--- a/fs/cifs/cifs_unicode.c |
1135 |
++++ b/fs/cifs/cifs_unicode.c |
1136 |
+@@ -290,7 +290,8 @@ int |
1137 |
+ cifsConvertToUTF16(__le16 *target, const char *source, int srclen, |
1138 |
+ const struct nls_table *cp, int mapChars) |
1139 |
+ { |
1140 |
+- int i, j, charlen; |
1141 |
++ int i, charlen; |
1142 |
++ int j = 0; |
1143 |
+ char src_char; |
1144 |
+ __le16 dst_char; |
1145 |
+ wchar_t tmp; |
1146 |
+@@ -298,12 +299,11 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen, |
1147 |
+ if (!mapChars) |
1148 |
+ return cifs_strtoUTF16(target, source, PATH_MAX, cp); |
1149 |
+ |
1150 |
+- for (i = 0, j = 0; i < srclen; j++) { |
1151 |
++ for (i = 0; i < srclen; j++) { |
1152 |
+ src_char = source[i]; |
1153 |
+ charlen = 1; |
1154 |
+ switch (src_char) { |
1155 |
+ case 0: |
1156 |
+- put_unaligned(0, &target[j]); |
1157 |
+ goto ctoUTF16_out; |
1158 |
+ case ':': |
1159 |
+ dst_char = cpu_to_le16(UNI_COLON); |
1160 |
+@@ -350,6 +350,7 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen, |
1161 |
+ } |
1162 |
+ |
1163 |
+ ctoUTF16_out: |
1164 |
++ put_unaligned(0, &target[j]); /* Null terminate target unicode string */ |
1165 |
+ return j; |
1166 |
+ } |
1167 |
+ |
1168 |
+diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
1169 |
+index 97a142cde23b..22beaff3544a 100644 |
1170 |
+--- a/fs/nfsd/nfs4proc.c |
1171 |
++++ b/fs/nfsd/nfs4proc.c |
1172 |
+@@ -543,15 +543,6 @@ nfsd4_create(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
1173 |
+ |
1174 |
+ switch (create->cr_type) { |
1175 |
+ case NF4LNK: |
1176 |
+- /* ugh! we have to null-terminate the linktext, or |
1177 |
+- * vfs_symlink() will choke. it is always safe to |
1178 |
+- * null-terminate by brute force, since at worst we |
1179 |
+- * will overwrite the first byte of the create namelen |
1180 |
+- * in the XDR buffer, which has already been extracted |
1181 |
+- * during XDR decode. |
1182 |
+- */ |
1183 |
+- create->cr_linkname[create->cr_linklen] = 0; |
1184 |
+- |
1185 |
+ status = nfsd_symlink(rqstp, &cstate->current_fh, |
1186 |
+ create->cr_name, create->cr_namelen, |
1187 |
+ create->cr_linkname, create->cr_linklen, |
1188 |
+diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
1189 |
+index ba7bf4a11855..04a1ce42e32b 100644 |
1190 |
+--- a/fs/nfsd/nfs4xdr.c |
1191 |
++++ b/fs/nfsd/nfs4xdr.c |
1192 |
+@@ -465,7 +465,18 @@ nfsd4_decode_create(struct nfsd4_compoundargs *argp, struct nfsd4_create *create |
1193 |
+ READ_BUF(4); |
1194 |
+ READ32(create->cr_linklen); |
1195 |
+ READ_BUF(create->cr_linklen); |
1196 |
+- SAVEMEM(create->cr_linkname, create->cr_linklen); |
1197 |
++ /* |
1198 |
++ * The VFS will want a null-terminated string, and |
1199 |
++ * null-terminating in place isn't safe since this might |
1200 |
++ * end on a page boundary: |
1201 |
++ */ |
1202 |
++ create->cr_linkname = |
1203 |
++ kmalloc(create->cr_linklen + 1, GFP_KERNEL); |
1204 |
++ if (!create->cr_linkname) |
1205 |
++ return nfserr_jukebox; |
1206 |
++ memcpy(create->cr_linkname, p, create->cr_linklen); |
1207 |
++ create->cr_linkname[create->cr_linklen] = '\0'; |
1208 |
++ defer_free(argp, kfree, create->cr_linkname); |
1209 |
+ break; |
1210 |
+ case NF4BLK: |
1211 |
+ case NF4CHR: |
1212 |
+diff --git a/include/linux/usb.h b/include/linux/usb.h |
1213 |
+index 4e8e6685f513..473907ac9104 100644 |
1214 |
+--- a/include/linux/usb.h |
1215 |
++++ b/include/linux/usb.h |
1216 |
+@@ -715,6 +715,22 @@ static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size) |
1217 |
+ .bcdDevice_hi = (hi) |
1218 |
+ |
1219 |
+ /** |
1220 |
++ * USB_DEVICE_INTERFACE_CLASS - describe a usb device with a specific interface class |
1221 |
++ * @vend: the 16 bit USB Vendor ID |
1222 |
++ * @prod: the 16 bit USB Product ID |
1223 |
++ * @cl: bInterfaceClass value |
1224 |
++ * |
1225 |
++ * This macro is used to create a struct usb_device_id that matches a |
1226 |
++ * specific interface class of devices. |
1227 |
++ */ |
1228 |
++#define USB_DEVICE_INTERFACE_CLASS(vend, prod, cl) \ |
1229 |
++ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ |
1230 |
++ USB_DEVICE_ID_MATCH_INT_CLASS, \ |
1231 |
++ .idVendor = (vend), \ |
1232 |
++ .idProduct = (prod), \ |
1233 |
++ .bInterfaceClass = (cl) |
1234 |
++ |
1235 |
++/** |
1236 |
+ * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol |
1237 |
+ * @vend: the 16 bit USB Vendor ID |
1238 |
+ * @prod: the 16 bit USB Product ID |
1239 |
+diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h |
1240 |
+index 4886c1144972..7d6cb0b2d061 100644 |
1241 |
+--- a/include/net/bluetooth/hci_core.h |
1242 |
++++ b/include/net/bluetooth/hci_core.h |
1243 |
+@@ -1068,7 +1068,6 @@ void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max, |
1244 |
+ u16 latency, u16 to_multiplier); |
1245 |
+ void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], |
1246 |
+ __u8 ltk[16]); |
1247 |
+-void hci_le_ltk_reply(struct hci_conn *conn, u8 ltk[16]); |
1248 |
+ void hci_le_ltk_neg_reply(struct hci_conn *conn); |
1249 |
+ |
1250 |
+ int hci_do_inquiry(struct hci_dev *hdev, u8 length); |
1251 |
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
1252 |
+index d5facc8d78a4..0d4e0ad97a04 100644 |
1253 |
+--- a/mm/hugetlb.c |
1254 |
++++ b/mm/hugetlb.c |
1255 |
+@@ -2276,6 +2276,31 @@ static void set_huge_ptep_writable(struct vm_area_struct *vma, |
1256 |
+ update_mmu_cache(vma, address, ptep); |
1257 |
+ } |
1258 |
+ |
1259 |
++static int is_hugetlb_entry_migration(pte_t pte) |
1260 |
++{ |
1261 |
++ swp_entry_t swp; |
1262 |
++ |
1263 |
++ if (huge_pte_none(pte) || pte_present(pte)) |
1264 |
++ return 0; |
1265 |
++ swp = pte_to_swp_entry(pte); |
1266 |
++ if (non_swap_entry(swp) && is_migration_entry(swp)) |
1267 |
++ return 1; |
1268 |
++ else |
1269 |
++ return 0; |
1270 |
++} |
1271 |
++ |
1272 |
++static int is_hugetlb_entry_hwpoisoned(pte_t pte) |
1273 |
++{ |
1274 |
++ swp_entry_t swp; |
1275 |
++ |
1276 |
++ if (huge_pte_none(pte) || pte_present(pte)) |
1277 |
++ return 0; |
1278 |
++ swp = pte_to_swp_entry(pte); |
1279 |
++ if (non_swap_entry(swp) && is_hwpoison_entry(swp)) |
1280 |
++ return 1; |
1281 |
++ else |
1282 |
++ return 0; |
1283 |
++} |
1284 |
+ |
1285 |
+ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, |
1286 |
+ struct vm_area_struct *vma) |
1287 |
+@@ -2303,10 +2328,26 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, |
1288 |
+ |
1289 |
+ spin_lock(&dst->page_table_lock); |
1290 |
+ spin_lock_nested(&src->page_table_lock, SINGLE_DEPTH_NESTING); |
1291 |
+- if (!huge_pte_none(huge_ptep_get(src_pte))) { |
1292 |
++ entry = huge_ptep_get(src_pte); |
1293 |
++ if (huge_pte_none(entry)) { /* skip none entry */ |
1294 |
++ ; |
1295 |
++ } else if (unlikely(is_hugetlb_entry_migration(entry) || |
1296 |
++ is_hugetlb_entry_hwpoisoned(entry))) { |
1297 |
++ swp_entry_t swp_entry = pte_to_swp_entry(entry); |
1298 |
++ |
1299 |
++ if (is_write_migration_entry(swp_entry) && cow) { |
1300 |
++ /* |
1301 |
++ * COW mappings require pages in both |
1302 |
++ * parent and child to be set to read. |
1303 |
++ */ |
1304 |
++ make_migration_entry_read(&swp_entry); |
1305 |
++ entry = swp_entry_to_pte(swp_entry); |
1306 |
++ set_huge_pte_at(src, addr, src_pte, entry); |
1307 |
++ } |
1308 |
++ set_huge_pte_at(dst, addr, dst_pte, entry); |
1309 |
++ } else { |
1310 |
+ if (cow) |
1311 |
+ huge_ptep_set_wrprotect(src, addr, src_pte); |
1312 |
+- entry = huge_ptep_get(src_pte); |
1313 |
+ ptepage = pte_page(entry); |
1314 |
+ get_page(ptepage); |
1315 |
+ page_dup_rmap(ptepage); |
1316 |
+@@ -2321,32 +2362,6 @@ nomem: |
1317 |
+ return -ENOMEM; |
1318 |
+ } |
1319 |
+ |
1320 |
+-static int is_hugetlb_entry_migration(pte_t pte) |
1321 |
+-{ |
1322 |
+- swp_entry_t swp; |
1323 |
+- |
1324 |
+- if (huge_pte_none(pte) || pte_present(pte)) |
1325 |
+- return 0; |
1326 |
+- swp = pte_to_swp_entry(pte); |
1327 |
+- if (non_swap_entry(swp) && is_migration_entry(swp)) |
1328 |
+- return 1; |
1329 |
+- else |
1330 |
+- return 0; |
1331 |
+-} |
1332 |
+- |
1333 |
+-static int is_hugetlb_entry_hwpoisoned(pte_t pte) |
1334 |
+-{ |
1335 |
+- swp_entry_t swp; |
1336 |
+- |
1337 |
+- if (huge_pte_none(pte) || pte_present(pte)) |
1338 |
+- return 0; |
1339 |
+- swp = pte_to_swp_entry(pte); |
1340 |
+- if (non_swap_entry(swp) && is_hwpoison_entry(swp)) |
1341 |
+- return 1; |
1342 |
+- else |
1343 |
+- return 0; |
1344 |
+-} |
1345 |
+- |
1346 |
+ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, |
1347 |
+ unsigned long end, struct page *ref_page) |
1348 |
+ { |
1349 |
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c |
1350 |
+index 82f1b027ba1c..ee50c256fdc3 100644 |
1351 |
+--- a/mm/mempolicy.c |
1352 |
++++ b/mm/mempolicy.c |
1353 |
+@@ -566,24 +566,24 @@ static inline int check_pgd_range(struct vm_area_struct *vma, |
1354 |
+ * If pagelist != NULL then isolate pages from the LRU and |
1355 |
+ * put them on the pagelist. |
1356 |
+ */ |
1357 |
+-static struct vm_area_struct * |
1358 |
++static int |
1359 |
+ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, |
1360 |
+ const nodemask_t *nodes, unsigned long flags, void *private) |
1361 |
+ { |
1362 |
+- int err; |
1363 |
+- struct vm_area_struct *first, *vma, *prev; |
1364 |
++ int err = 0; |
1365 |
++ struct vm_area_struct *vma, *prev; |
1366 |
+ |
1367 |
+ |
1368 |
+- first = find_vma(mm, start); |
1369 |
+- if (!first) |
1370 |
+- return ERR_PTR(-EFAULT); |
1371 |
++ vma = find_vma(mm, start); |
1372 |
++ if (!vma) |
1373 |
++ return -EFAULT; |
1374 |
+ prev = NULL; |
1375 |
+- for (vma = first; vma && vma->vm_start < end; vma = vma->vm_next) { |
1376 |
++ for (; vma && vma->vm_start < end; vma = vma->vm_next) { |
1377 |
+ if (!(flags & MPOL_MF_DISCONTIG_OK)) { |
1378 |
+ if (!vma->vm_next && vma->vm_end < end) |
1379 |
+- return ERR_PTR(-EFAULT); |
1380 |
++ return -EFAULT; |
1381 |
+ if (prev && prev->vm_end < vma->vm_start) |
1382 |
+- return ERR_PTR(-EFAULT); |
1383 |
++ return -EFAULT; |
1384 |
+ } |
1385 |
+ if (!is_vm_hugetlb_page(vma) && |
1386 |
+ ((flags & MPOL_MF_STRICT) || |
1387 |
+@@ -597,14 +597,12 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end, |
1388 |
+ start = vma->vm_start; |
1389 |
+ err = check_pgd_range(vma, start, endvma, nodes, |
1390 |
+ flags, private); |
1391 |
+- if (err) { |
1392 |
+- first = ERR_PTR(err); |
1393 |
++ if (err) |
1394 |
+ break; |
1395 |
+- } |
1396 |
+ } |
1397 |
+ prev = vma; |
1398 |
+ } |
1399 |
+- return first; |
1400 |
++ return err; |
1401 |
+ } |
1402 |
+ |
1403 |
+ /* |
1404 |
+@@ -945,16 +943,15 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest, |
1405 |
+ { |
1406 |
+ nodemask_t nmask; |
1407 |
+ LIST_HEAD(pagelist); |
1408 |
+- int err = 0; |
1409 |
+- struct vm_area_struct *vma; |
1410 |
++ int err; |
1411 |
+ |
1412 |
+ nodes_clear(nmask); |
1413 |
+ node_set(source, nmask); |
1414 |
+ |
1415 |
+- vma = check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask, |
1416 |
++ err = check_range(mm, mm->mmap->vm_start, mm->task_size, &nmask, |
1417 |
+ flags | MPOL_MF_DISCONTIG_OK, &pagelist); |
1418 |
+- if (IS_ERR(vma)) |
1419 |
+- return PTR_ERR(vma); |
1420 |
++ if (err) |
1421 |
++ return err; |
1422 |
+ |
1423 |
+ if (!list_empty(&pagelist)) { |
1424 |
+ err = migrate_pages(&pagelist, new_node_page, dest, |
1425 |
+@@ -1058,16 +1055,17 @@ out: |
1426 |
+ |
1427 |
+ /* |
1428 |
+ * Allocate a new page for page migration based on vma policy. |
1429 |
+- * Start assuming that page is mapped by vma pointed to by @private. |
1430 |
++ * Start by assuming the page is mapped by the same vma as contains @start. |
1431 |
+ * Search forward from there, if not. N.B., this assumes that the |
1432 |
+ * list of pages handed to migrate_pages()--which is how we get here-- |
1433 |
+ * is in virtual address order. |
1434 |
+ */ |
1435 |
+-static struct page *new_vma_page(struct page *page, unsigned long private, int **x) |
1436 |
++static struct page *new_page(struct page *page, unsigned long start, int **x) |
1437 |
+ { |
1438 |
+- struct vm_area_struct *vma = (struct vm_area_struct *)private; |
1439 |
++ struct vm_area_struct *vma; |
1440 |
+ unsigned long uninitialized_var(address); |
1441 |
+ |
1442 |
++ vma = find_vma(current->mm, start); |
1443 |
+ while (vma) { |
1444 |
+ address = page_address_in_vma(page, vma); |
1445 |
+ if (address != -EFAULT) |
1446 |
+@@ -1093,7 +1091,7 @@ int do_migrate_pages(struct mm_struct *mm, |
1447 |
+ return -ENOSYS; |
1448 |
+ } |
1449 |
+ |
1450 |
+-static struct page *new_vma_page(struct page *page, unsigned long private, int **x) |
1451 |
++static struct page *new_page(struct page *page, unsigned long start, int **x) |
1452 |
+ { |
1453 |
+ return NULL; |
1454 |
+ } |
1455 |
+@@ -1103,7 +1101,6 @@ static long do_mbind(unsigned long start, unsigned long len, |
1456 |
+ unsigned short mode, unsigned short mode_flags, |
1457 |
+ nodemask_t *nmask, unsigned long flags) |
1458 |
+ { |
1459 |
+- struct vm_area_struct *vma; |
1460 |
+ struct mm_struct *mm = current->mm; |
1461 |
+ struct mempolicy *new; |
1462 |
+ unsigned long end; |
1463 |
+@@ -1167,19 +1164,17 @@ static long do_mbind(unsigned long start, unsigned long len, |
1464 |
+ if (err) |
1465 |
+ goto mpol_out; |
1466 |
+ |
1467 |
+- vma = check_range(mm, start, end, nmask, |
1468 |
++ err = check_range(mm, start, end, nmask, |
1469 |
+ flags | MPOL_MF_INVERT, &pagelist); |
1470 |
+ |
1471 |
+- err = PTR_ERR(vma); |
1472 |
+- if (!IS_ERR(vma)) { |
1473 |
++ if (!err) { |
1474 |
+ int nr_failed = 0; |
1475 |
+ |
1476 |
+ err = mbind_range(mm, start, end, new); |
1477 |
+ |
1478 |
+ if (!list_empty(&pagelist)) { |
1479 |
+- nr_failed = migrate_pages(&pagelist, new_vma_page, |
1480 |
+- (unsigned long)vma, |
1481 |
+- false, true); |
1482 |
++ nr_failed = migrate_pages(&pagelist, new_page, |
1483 |
++ start, false, true); |
1484 |
+ if (nr_failed) |
1485 |
+ putback_lru_pages(&pagelist); |
1486 |
+ } |
1487 |
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c |
1488 |
+index 39b2baf6c1d5..70bdb7d1d6df 100644 |
1489 |
+--- a/net/bluetooth/hci_conn.c |
1490 |
++++ b/net/bluetooth/hci_conn.c |
1491 |
+@@ -224,22 +224,6 @@ void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], |
1492 |
+ } |
1493 |
+ EXPORT_SYMBOL(hci_le_start_enc); |
1494 |
+ |
1495 |
+-void hci_le_ltk_reply(struct hci_conn *conn, u8 ltk[16]) |
1496 |
+-{ |
1497 |
+- struct hci_dev *hdev = conn->hdev; |
1498 |
+- struct hci_cp_le_ltk_reply cp; |
1499 |
+- |
1500 |
+- BT_DBG("%p", conn); |
1501 |
+- |
1502 |
+- memset(&cp, 0, sizeof(cp)); |
1503 |
+- |
1504 |
+- cp.handle = cpu_to_le16(conn->handle); |
1505 |
+- memcpy(cp.ltk, ltk, sizeof(ltk)); |
1506 |
+- |
1507 |
+- hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp); |
1508 |
+-} |
1509 |
+-EXPORT_SYMBOL(hci_le_ltk_reply); |
1510 |
+- |
1511 |
+ void hci_le_ltk_neg_reply(struct hci_conn *conn) |
1512 |
+ { |
1513 |
+ struct hci_dev *hdev = conn->hdev; |
1514 |
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c |
1515 |
+index 21b2de18c3b7..04bff67d5efc 100644 |
1516 |
+--- a/net/bluetooth/hci_event.c |
1517 |
++++ b/net/bluetooth/hci_event.c |
1518 |
+@@ -3156,8 +3156,11 @@ static inline void hci_user_confirm_request_evt(struct hci_dev *hdev, |
1519 |
+ |
1520 |
+ /* If we're not the initiators request authorization to |
1521 |
+ * proceed from user space (mgmt_user_confirm with |
1522 |
+- * confirm_hint set to 1). */ |
1523 |
+- if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { |
1524 |
++ * confirm_hint set to 1). The exception is if neither |
1525 |
++ * side had MITM in which case we do auto-accept. |
1526 |
++ */ |
1527 |
++ if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && |
1528 |
++ (loc_mitm || rem_mitm)) { |
1529 |
+ BT_DBG("Confirming auto-accept as acceptor"); |
1530 |
+ confirm_hint = 1; |
1531 |
+ goto confirm; |
1532 |
+diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c |
1533 |
+index 30f99c344847..d5404cc0248d 100644 |
1534 |
+--- a/net/mac80211/debugfs_netdev.c |
1535 |
++++ b/net/mac80211/debugfs_netdev.c |
1536 |
+@@ -33,8 +33,7 @@ static ssize_t ieee80211_if_read( |
1537 |
+ ssize_t ret = -EINVAL; |
1538 |
+ |
1539 |
+ read_lock(&dev_base_lock); |
1540 |
+- if (sdata->dev->reg_state == NETREG_REGISTERED) |
1541 |
+- ret = (*format)(sdata, buf, sizeof(buf)); |
1542 |
++ ret = (*format)(sdata, buf, sizeof(buf)); |
1543 |
+ read_unlock(&dev_base_lock); |
1544 |
+ |
1545 |
+ if (ret >= 0) |
1546 |
+@@ -61,8 +60,7 @@ static ssize_t ieee80211_if_write( |
1547 |
+ |
1548 |
+ ret = -ENODEV; |
1549 |
+ rtnl_lock(); |
1550 |
+- if (sdata->dev->reg_state == NETREG_REGISTERED) |
1551 |
+- ret = (*write)(sdata, buf, count); |
1552 |
++ ret = (*write)(sdata, buf, count); |
1553 |
+ rtnl_unlock(); |
1554 |
+ |
1555 |
+ return ret; |
1556 |
+diff --git a/tools/usb/ffs-test.c b/tools/usb/ffs-test.c |
1557 |
+index 8674b9ec14f6..b3dbf8e1ff05 100644 |
1558 |
+--- a/tools/usb/ffs-test.c |
1559 |
++++ b/tools/usb/ffs-test.c |
1560 |
+@@ -116,8 +116,8 @@ static const struct { |
1561 |
+ .header = { |
1562 |
+ .magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC), |
1563 |
+ .length = cpu_to_le32(sizeof descriptors), |
1564 |
+- .fs_count = 3, |
1565 |
+- .hs_count = 3, |
1566 |
++ .fs_count = cpu_to_le32(3), |
1567 |
++ .hs_count = cpu_to_le32(3), |
1568 |
+ }, |
1569 |
+ .fs_descs = { |
1570 |
+ .intf = { |