Annotation of /trunk/kernel-lts/patches-3.4/0107-3.4.8-all-fixes.patch
Parent Directory | Revision Log
Revision 1907 -
(hide annotations)
(download)
Wed Oct 10 11:20:27 2012 UTC (11 years, 11 months ago) by niro
File size: 152086 byte(s)
Wed Oct 10 11:20:27 2012 UTC (11 years, 11 months ago) by niro
File size: 152086 byte(s)
-3.4.13-lts-r1
1 | niro | 1907 | diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt |
2 | index 03f7897..286ec04 100644 | ||
3 | --- a/Documentation/sound/alsa/HD-Audio-Models.txt | ||
4 | +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | ||
5 | @@ -21,10 +21,11 @@ ALC267/268 | ||
6 | ========== | ||
7 | N/A | ||
8 | |||
9 | -ALC269 | ||
10 | +ALC269/270/275/276/280/282 | ||
11 | ====== | ||
12 | laptop-amic Laptops with analog-mic input | ||
13 | laptop-dmic Laptops with digital-mic input | ||
14 | + lenovo-dock Enables docking station I/O for some Lenovos | ||
15 | |||
16 | ALC662/663/272 | ||
17 | ============== | ||
18 | diff --git a/Documentation/stable_kernel_rules.txt b/Documentation/stable_kernel_rules.txt | ||
19 | index 4a7b54b..b0714d8 100644 | ||
20 | --- a/Documentation/stable_kernel_rules.txt | ||
21 | +++ b/Documentation/stable_kernel_rules.txt | ||
22 | @@ -1,4 +1,4 @@ | ||
23 | -Everything you ever wanted to know about Linux 2.6 -stable releases. | ||
24 | +Everything you ever wanted to know about Linux -stable releases. | ||
25 | |||
26 | Rules on what kind of patches are accepted, and which ones are not, into the | ||
27 | "-stable" tree: | ||
28 | @@ -42,10 +42,10 @@ Procedure for submitting patches to the -stable tree: | ||
29 | cherry-picked than this can be specified in the following format in | ||
30 | the sign-off area: | ||
31 | |||
32 | - Cc: <stable@vger.kernel.org> # .32.x: a1f84a3: sched: Check for idle | ||
33 | - Cc: <stable@vger.kernel.org> # .32.x: 1b9508f: sched: Rate-limit newidle | ||
34 | - Cc: <stable@vger.kernel.org> # .32.x: fd21073: sched: Fix affinity logic | ||
35 | - Cc: <stable@vger.kernel.org> # .32.x | ||
36 | + Cc: <stable@vger.kernel.org> # 3.3.x: a1f84a3: sched: Check for idle | ||
37 | + Cc: <stable@vger.kernel.org> # 3.3.x: 1b9508f: sched: Rate-limit newidle | ||
38 | + Cc: <stable@vger.kernel.org> # 3.3.x: fd21073: sched: Fix affinity logic | ||
39 | + Cc: <stable@vger.kernel.org> # 3.3.x | ||
40 | Signed-off-by: Ingo Molnar <mingo@elte.hu> | ||
41 | |||
42 | The tag sequence has the meaning of: | ||
43 | @@ -79,6 +79,15 @@ Review cycle: | ||
44 | security kernel team, and not go through the normal review cycle. | ||
45 | Contact the kernel security team for more details on this procedure. | ||
46 | |||
47 | +Trees: | ||
48 | + | ||
49 | + - The queues of patches, for both completed versions and in progress | ||
50 | + versions can be found at: | ||
51 | + http://git.kernel.org/?p=linux/kernel/git/stable/stable-queue.git | ||
52 | + - The finalized and tagged releases of all stable kernels can be found | ||
53 | + in separate branches per version at: | ||
54 | + http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git | ||
55 | + | ||
56 | |||
57 | Review committee: | ||
58 | |||
59 | diff --git a/arch/arm/mach-omap2/opp.c b/arch/arm/mach-omap2/opp.c | ||
60 | index de6d464..d8f6dbf 100644 | ||
61 | --- a/arch/arm/mach-omap2/opp.c | ||
62 | +++ b/arch/arm/mach-omap2/opp.c | ||
63 | @@ -53,7 +53,7 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, | ||
64 | omap_table_init = 1; | ||
65 | |||
66 | /* Lets now register with OPP library */ | ||
67 | - for (i = 0; i < opp_def_size; i++) { | ||
68 | + for (i = 0; i < opp_def_size; i++, opp_def++) { | ||
69 | struct omap_hwmod *oh; | ||
70 | struct device *dev; | ||
71 | |||
72 | @@ -86,7 +86,6 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, | ||
73 | __func__, opp_def->freq, | ||
74 | opp_def->hwmod_name, i, r); | ||
75 | } | ||
76 | - opp_def++; | ||
77 | } | ||
78 | |||
79 | return 0; | ||
80 | diff --git a/arch/m68k/include/asm/entry.h b/arch/m68k/include/asm/entry.h | ||
81 | index 622138d..34c2520 100644 | ||
82 | --- a/arch/m68k/include/asm/entry.h | ||
83 | +++ b/arch/m68k/include/asm/entry.h | ||
84 | @@ -33,8 +33,8 @@ | ||
85 | |||
86 | /* the following macro is used when enabling interrupts */ | ||
87 | #if defined(MACH_ATARI_ONLY) | ||
88 | - /* block out HSYNC on the atari */ | ||
89 | -#define ALLOWINT (~0x400) | ||
90 | + /* block out HSYNC = ipl 2 on the atari */ | ||
91 | +#define ALLOWINT (~0x500) | ||
92 | #define MAX_NOINT_IPL 3 | ||
93 | #else | ||
94 | /* portable version */ | ||
95 | diff --git a/arch/m68k/kernel/sys_m68k.c b/arch/m68k/kernel/sys_m68k.c | ||
96 | index 8623f8d..9a5932e 100644 | ||
97 | --- a/arch/m68k/kernel/sys_m68k.c | ||
98 | +++ b/arch/m68k/kernel/sys_m68k.c | ||
99 | @@ -479,9 +479,13 @@ sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5, | ||
100 | goto bad_access; | ||
101 | } | ||
102 | |||
103 | - mem_value = *mem; | ||
104 | + /* | ||
105 | + * No need to check for EFAULT; we know that the page is | ||
106 | + * present and writable. | ||
107 | + */ | ||
108 | + __get_user(mem_value, mem); | ||
109 | if (mem_value == oldval) | ||
110 | - *mem = newval; | ||
111 | + __put_user(newval, mem); | ||
112 | |||
113 | pte_unmap_unlock(pte, ptl); | ||
114 | up_read(&mm->mmap_sem); | ||
115 | diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c | ||
116 | index 84d0639..b77f56b 100644 | ||
117 | --- a/arch/mips/kernel/kspd.c | ||
118 | +++ b/arch/mips/kernel/kspd.c | ||
119 | @@ -323,7 +323,7 @@ static void sp_cleanup(void) | ||
120 | fdt = files_fdtable(files); | ||
121 | for (;;) { | ||
122 | unsigned long set; | ||
123 | - i = j * __NFDBITS; | ||
124 | + i = j * BITS_PER_LONG; | ||
125 | if (i >= fdt->max_fds) | ||
126 | break; | ||
127 | set = fdt->open_fds[j++]; | ||
128 | diff --git a/arch/powerpc/boot/dts/p1022ds.dtsi b/arch/powerpc/boot/dts/p1022ds.dtsi | ||
129 | index 7cdb505..1b0673e 100644 | ||
130 | --- a/arch/powerpc/boot/dts/p1022ds.dtsi | ||
131 | +++ b/arch/powerpc/boot/dts/p1022ds.dtsi | ||
132 | @@ -33,22 +33,6 @@ | ||
133 | */ | ||
134 | |||
135 | &board_lbc { | ||
136 | - /* | ||
137 | - * This node is used to access the pixis via "indirect" mode, | ||
138 | - * which is done by writing the pixis register index to chip | ||
139 | - * select 0 and the value to/from chip select 1. Indirect | ||
140 | - * mode is the only way to access the pixis when DIU video | ||
141 | - * is enabled. Note that this assumes that the first column | ||
142 | - * of the 'ranges' property above is the chip select number. | ||
143 | - */ | ||
144 | - board-control@0,0 { | ||
145 | - compatible = "fsl,p1022ds-indirect-pixis"; | ||
146 | - reg = <0x0 0x0 1 /* CS0 */ | ||
147 | - 0x1 0x0 1>; /* CS1 */ | ||
148 | - interrupt-parent = <&mpic>; | ||
149 | - interrupts = <8 0 0 0>; | ||
150 | - }; | ||
151 | - | ||
152 | nor@0,0 { | ||
153 | #address-cells = <1>; | ||
154 | #size-cells = <1>; | ||
155 | diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h | ||
156 | index 9d7f0fb..cae0ed7 100644 | ||
157 | --- a/arch/powerpc/include/asm/reg.h | ||
158 | +++ b/arch/powerpc/include/asm/reg.h | ||
159 | @@ -1022,7 +1022,8 @@ | ||
160 | /* Macros for setting and retrieving special purpose registers */ | ||
161 | #ifndef __ASSEMBLY__ | ||
162 | #define mfmsr() ({unsigned long rval; \ | ||
163 | - asm volatile("mfmsr %0" : "=r" (rval)); rval;}) | ||
164 | + asm volatile("mfmsr %0" : "=r" (rval) : \ | ||
165 | + : "memory"); rval;}) | ||
166 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
167 | #define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \ | ||
168 | : : "r" (v) : "memory") | ||
169 | diff --git a/arch/powerpc/kernel/ftrace.c b/arch/powerpc/kernel/ftrace.c | ||
170 | index bf99cfa..6324008 100644 | ||
171 | --- a/arch/powerpc/kernel/ftrace.c | ||
172 | +++ b/arch/powerpc/kernel/ftrace.c | ||
173 | @@ -245,9 +245,9 @@ __ftrace_make_nop(struct module *mod, | ||
174 | |||
175 | /* | ||
176 | * On PPC32 the trampoline looks like: | ||
177 | - * 0x3d, 0x60, 0x00, 0x00 lis r11,sym@ha | ||
178 | - * 0x39, 0x6b, 0x00, 0x00 addi r11,r11,sym@l | ||
179 | - * 0x7d, 0x69, 0x03, 0xa6 mtctr r11 | ||
180 | + * 0x3d, 0x80, 0x00, 0x00 lis r12,sym@ha | ||
181 | + * 0x39, 0x8c, 0x00, 0x00 addi r12,r12,sym@l | ||
182 | + * 0x7d, 0x89, 0x03, 0xa6 mtctr r12 | ||
183 | * 0x4e, 0x80, 0x04, 0x20 bctr | ||
184 | */ | ||
185 | |||
186 | @@ -262,9 +262,9 @@ __ftrace_make_nop(struct module *mod, | ||
187 | pr_devel(" %08x %08x ", jmp[0], jmp[1]); | ||
188 | |||
189 | /* verify that this is what we expect it to be */ | ||
190 | - if (((jmp[0] & 0xffff0000) != 0x3d600000) || | ||
191 | - ((jmp[1] & 0xffff0000) != 0x396b0000) || | ||
192 | - (jmp[2] != 0x7d6903a6) || | ||
193 | + if (((jmp[0] & 0xffff0000) != 0x3d800000) || | ||
194 | + ((jmp[1] & 0xffff0000) != 0x398c0000) || | ||
195 | + (jmp[2] != 0x7d8903a6) || | ||
196 | (jmp[3] != 0x4e800420)) { | ||
197 | printk(KERN_ERR "Not a trampoline\n"); | ||
198 | return -EINVAL; | ||
199 | diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c | ||
200 | index f700c81..978330c 100644 | ||
201 | --- a/arch/powerpc/platforms/85xx/p1022_ds.c | ||
202 | +++ b/arch/powerpc/platforms/85xx/p1022_ds.c | ||
203 | @@ -27,6 +27,7 @@ | ||
204 | #include <sysdev/fsl_pci.h> | ||
205 | #include <asm/udbg.h> | ||
206 | #include <asm/fsl_guts.h> | ||
207 | +#include <asm/fsl_lbc.h> | ||
208 | #include "smp.h" | ||
209 | |||
210 | #include "mpc85xx.h" | ||
211 | @@ -142,17 +143,73 @@ static void p1022ds_set_gamma_table(enum fsl_diu_monitor_port port, | ||
212 | { | ||
213 | } | ||
214 | |||
215 | +struct fsl_law { | ||
216 | + u32 lawbar; | ||
217 | + u32 reserved1; | ||
218 | + u32 lawar; | ||
219 | + u32 reserved[5]; | ||
220 | +}; | ||
221 | + | ||
222 | +#define LAWBAR_MASK 0x00F00000 | ||
223 | +#define LAWBAR_SHIFT 12 | ||
224 | + | ||
225 | +#define LAWAR_EN 0x80000000 | ||
226 | +#define LAWAR_TGT_MASK 0x01F00000 | ||
227 | +#define LAW_TRGT_IF_LBC (0x04 << 20) | ||
228 | + | ||
229 | +#define LAWAR_MASK (LAWAR_EN | LAWAR_TGT_MASK) | ||
230 | +#define LAWAR_MATCH (LAWAR_EN | LAW_TRGT_IF_LBC) | ||
231 | + | ||
232 | +#define BR_BA 0xFFFF8000 | ||
233 | + | ||
234 | +/* | ||
235 | + * Map a BRx value to a physical address | ||
236 | + * | ||
237 | + * The localbus BRx registers only store the lower 32 bits of the address. To | ||
238 | + * obtain the upper four bits, we need to scan the LAW table. The entry which | ||
239 | + * maps to the localbus will contain the upper four bits. | ||
240 | + */ | ||
241 | +static phys_addr_t lbc_br_to_phys(const void *ecm, unsigned int count, u32 br) | ||
242 | +{ | ||
243 | +#ifndef CONFIG_PHYS_64BIT | ||
244 | + /* | ||
245 | + * If we only have 32-bit addressing, then the BRx address *is* the | ||
246 | + * physical address. | ||
247 | + */ | ||
248 | + return br & BR_BA; | ||
249 | +#else | ||
250 | + const struct fsl_law *law = ecm + 0xc08; | ||
251 | + unsigned int i; | ||
252 | + | ||
253 | + for (i = 0; i < count; i++) { | ||
254 | + u64 lawbar = in_be32(&law[i].lawbar); | ||
255 | + u32 lawar = in_be32(&law[i].lawar); | ||
256 | + | ||
257 | + if ((lawar & LAWAR_MASK) == LAWAR_MATCH) | ||
258 | + /* Extract the upper four bits */ | ||
259 | + return (br & BR_BA) | ((lawbar & LAWBAR_MASK) << 12); | ||
260 | + } | ||
261 | + | ||
262 | + return 0; | ||
263 | +#endif | ||
264 | +} | ||
265 | + | ||
266 | /** | ||
267 | * p1022ds_set_monitor_port: switch the output to a different monitor port | ||
268 | - * | ||
269 | */ | ||
270 | static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) | ||
271 | { | ||
272 | struct device_node *guts_node; | ||
273 | - struct device_node *indirect_node = NULL; | ||
274 | + struct device_node *lbc_node = NULL; | ||
275 | + struct device_node *law_node = NULL; | ||
276 | struct ccsr_guts __iomem *guts; | ||
277 | + struct fsl_lbc_regs *lbc = NULL; | ||
278 | + void *ecm = NULL; | ||
279 | u8 __iomem *lbc_lcs0_ba = NULL; | ||
280 | u8 __iomem *lbc_lcs1_ba = NULL; | ||
281 | + phys_addr_t cs0_addr, cs1_addr; | ||
282 | + const __be32 *iprop; | ||
283 | + unsigned int num_laws; | ||
284 | u8 b; | ||
285 | |||
286 | /* Map the global utilities registers. */ | ||
287 | @@ -168,25 +225,43 @@ static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) | ||
288 | goto exit; | ||
289 | } | ||
290 | |||
291 | - indirect_node = of_find_compatible_node(NULL, NULL, | ||
292 | - "fsl,p1022ds-indirect-pixis"); | ||
293 | - if (!indirect_node) { | ||
294 | - pr_err("p1022ds: missing pixis indirect mode node\n"); | ||
295 | + lbc_node = of_find_compatible_node(NULL, NULL, "fsl,p1022-elbc"); | ||
296 | + if (!lbc_node) { | ||
297 | + pr_err("p1022ds: missing localbus node\n"); | ||
298 | goto exit; | ||
299 | } | ||
300 | |||
301 | - lbc_lcs0_ba = of_iomap(indirect_node, 0); | ||
302 | - if (!lbc_lcs0_ba) { | ||
303 | - pr_err("p1022ds: could not map localbus chip select 0\n"); | ||
304 | + lbc = of_iomap(lbc_node, 0); | ||
305 | + if (!lbc) { | ||
306 | + pr_err("p1022ds: could not map localbus node\n"); | ||
307 | goto exit; | ||
308 | } | ||
309 | |||
310 | - lbc_lcs1_ba = of_iomap(indirect_node, 1); | ||
311 | - if (!lbc_lcs1_ba) { | ||
312 | - pr_err("p1022ds: could not map localbus chip select 1\n"); | ||
313 | + law_node = of_find_compatible_node(NULL, NULL, "fsl,ecm-law"); | ||
314 | + if (!law_node) { | ||
315 | + pr_err("p1022ds: missing local access window node\n"); | ||
316 | goto exit; | ||
317 | } | ||
318 | |||
319 | + ecm = of_iomap(law_node, 0); | ||
320 | + if (!ecm) { | ||
321 | + pr_err("p1022ds: could not map local access window node\n"); | ||
322 | + goto exit; | ||
323 | + } | ||
324 | + | ||
325 | + iprop = of_get_property(law_node, "fsl,num-laws", 0); | ||
326 | + if (!iprop) { | ||
327 | + pr_err("p1022ds: LAW node is missing fsl,num-laws property\n"); | ||
328 | + goto exit; | ||
329 | + } | ||
330 | + num_laws = be32_to_cpup(iprop); | ||
331 | + | ||
332 | + cs0_addr = lbc_br_to_phys(ecm, num_laws, in_be32(&lbc->bank[0].br)); | ||
333 | + cs1_addr = lbc_br_to_phys(ecm, num_laws, in_be32(&lbc->bank[1].br)); | ||
334 | + | ||
335 | + lbc_lcs0_ba = ioremap(cs0_addr, 1); | ||
336 | + lbc_lcs1_ba = ioremap(cs1_addr, 1); | ||
337 | + | ||
338 | /* Make sure we're in indirect mode first. */ | ||
339 | if ((in_be32(&guts->pmuxcr) & PMUXCR_ELBCDIU_MASK) != | ||
340 | PMUXCR_ELBCDIU_DIU) { | ||
341 | @@ -254,10 +329,15 @@ exit: | ||
342 | iounmap(lbc_lcs1_ba); | ||
343 | if (lbc_lcs0_ba) | ||
344 | iounmap(lbc_lcs0_ba); | ||
345 | + if (lbc) | ||
346 | + iounmap(lbc); | ||
347 | + if (ecm) | ||
348 | + iounmap(ecm); | ||
349 | if (guts) | ||
350 | iounmap(guts); | ||
351 | |||
352 | - of_node_put(indirect_node); | ||
353 | + of_node_put(law_node); | ||
354 | + of_node_put(lbc_node); | ||
355 | of_node_put(guts_node); | ||
356 | } | ||
357 | |||
358 | diff --git a/arch/powerpc/platforms/pseries/eeh_event.c b/arch/powerpc/platforms/pseries/eeh_event.c | ||
359 | index 4cb375c..fb50631 100644 | ||
360 | --- a/arch/powerpc/platforms/pseries/eeh_event.c | ||
361 | +++ b/arch/powerpc/platforms/pseries/eeh_event.c | ||
362 | @@ -85,8 +85,10 @@ static int eeh_event_handler(void * dummy) | ||
363 | set_current_state(TASK_INTERRUPTIBLE); /* Don't add to load average */ | ||
364 | edev = handle_eeh_events(event); | ||
365 | |||
366 | - eeh_clear_slot(eeh_dev_to_of_node(edev), EEH_MODE_RECOVERING); | ||
367 | - pci_dev_put(edev->pdev); | ||
368 | + if (edev) { | ||
369 | + eeh_clear_slot(eeh_dev_to_of_node(edev), EEH_MODE_RECOVERING); | ||
370 | + pci_dev_put(edev->pdev); | ||
371 | + } | ||
372 | |||
373 | kfree(event); | ||
374 | mutex_unlock(&eeh_event_mutex); | ||
375 | diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h | ||
376 | index 5d09e40..5d211f7 100644 | ||
377 | --- a/arch/s390/include/asm/mmu_context.h | ||
378 | +++ b/arch/s390/include/asm/mmu_context.h | ||
379 | @@ -13,7 +13,6 @@ | ||
380 | #include <asm/uaccess.h> | ||
381 | #include <asm/tlbflush.h> | ||
382 | #include <asm/ctl_reg.h> | ||
383 | -#include <asm-generic/mm_hooks.h> | ||
384 | |||
385 | static inline int init_new_context(struct task_struct *tsk, | ||
386 | struct mm_struct *mm) | ||
387 | @@ -93,4 +92,17 @@ static inline void activate_mm(struct mm_struct *prev, | ||
388 | switch_mm(prev, next, current); | ||
389 | } | ||
390 | |||
391 | +static inline void arch_dup_mmap(struct mm_struct *oldmm, | ||
392 | + struct mm_struct *mm) | ||
393 | +{ | ||
394 | +#ifdef CONFIG_64BIT | ||
395 | + if (oldmm->context.asce_limit < mm->context.asce_limit) | ||
396 | + crst_table_downgrade(mm, oldmm->context.asce_limit); | ||
397 | +#endif | ||
398 | +} | ||
399 | + | ||
400 | +static inline void arch_exit_mmap(struct mm_struct *mm) | ||
401 | +{ | ||
402 | +} | ||
403 | + | ||
404 | #endif /* __S390_MMU_CONTEXT_H */ | ||
405 | diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h | ||
406 | index d499b30..8b6f62e 100644 | ||
407 | --- a/arch/s390/include/asm/processor.h | ||
408 | +++ b/arch/s390/include/asm/processor.h | ||
409 | @@ -129,7 +129,9 @@ struct stack_frame { | ||
410 | regs->psw.mask = psw_user_bits | PSW_MASK_BA; \ | ||
411 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | ||
412 | regs->gprs[15] = new_stackp; \ | ||
413 | + __tlb_flush_mm(current->mm); \ | ||
414 | crst_table_downgrade(current->mm, 1UL << 31); \ | ||
415 | + update_mm(current->mm, current); \ | ||
416 | } while (0) | ||
417 | |||
418 | /* Forward declaration, a strange C thing */ | ||
419 | diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c | ||
420 | index 6e0073e..07c7bf4 100644 | ||
421 | --- a/arch/s390/kernel/processor.c | ||
422 | +++ b/arch/s390/kernel/processor.c | ||
423 | @@ -26,12 +26,14 @@ static DEFINE_PER_CPU(struct cpuid, cpu_id); | ||
424 | void __cpuinit cpu_init(void) | ||
425 | { | ||
426 | struct cpuid *id = &per_cpu(cpu_id, smp_processor_id()); | ||
427 | + struct s390_idle_data *idle = &__get_cpu_var(s390_idle); | ||
428 | |||
429 | get_cpu_id(id); | ||
430 | atomic_inc(&init_mm.mm_count); | ||
431 | current->active_mm = &init_mm; | ||
432 | BUG_ON(current->mm); | ||
433 | enter_lazy_tlb(&init_mm, current); | ||
434 | + memset(idle, 0, sizeof(*idle)); | ||
435 | } | ||
436 | |||
437 | /* | ||
438 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c | ||
439 | index 1f77227..c7b8822 100644 | ||
440 | --- a/arch/s390/kernel/smp.c | ||
441 | +++ b/arch/s390/kernel/smp.c | ||
442 | @@ -1034,14 +1034,11 @@ static int __cpuinit smp_cpu_notify(struct notifier_block *self, | ||
443 | unsigned int cpu = (unsigned int)(long)hcpu; | ||
444 | struct cpu *c = &pcpu_devices[cpu].cpu; | ||
445 | struct device *s = &c->dev; | ||
446 | - struct s390_idle_data *idle; | ||
447 | int err = 0; | ||
448 | |||
449 | switch (action) { | ||
450 | case CPU_ONLINE: | ||
451 | case CPU_ONLINE_FROZEN: | ||
452 | - idle = &per_cpu(s390_idle, cpu); | ||
453 | - memset(idle, 0, sizeof(struct s390_idle_data)); | ||
454 | err = sysfs_create_group(&s->kobj, &cpu_online_attr_group); | ||
455 | break; | ||
456 | case CPU_DEAD: | ||
457 | diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c | ||
458 | index 4e66860..f2b11ee 100644 | ||
459 | --- a/arch/s390/mm/fault.c | ||
460 | +++ b/arch/s390/mm/fault.c | ||
461 | @@ -443,6 +443,7 @@ int __handle_fault(unsigned long uaddr, unsigned long pgm_int_code, int write) | ||
462 | struct pt_regs regs; | ||
463 | int access, fault; | ||
464 | |||
465 | + /* Emulate a uaccess fault from kernel mode. */ | ||
466 | regs.psw.mask = psw_kernel_bits | PSW_MASK_DAT | PSW_MASK_MCHECK; | ||
467 | if (!irqs_disabled()) | ||
468 | regs.psw.mask |= PSW_MASK_IO | PSW_MASK_EXT; | ||
469 | @@ -452,12 +453,12 @@ int __handle_fault(unsigned long uaddr, unsigned long pgm_int_code, int write) | ||
470 | regs.int_parm_long = (uaddr & PAGE_MASK) | 2; | ||
471 | access = write ? VM_WRITE : VM_READ; | ||
472 | fault = do_exception(®s, access); | ||
473 | - if (unlikely(fault)) { | ||
474 | - if (fault & VM_FAULT_OOM) | ||
475 | - return -EFAULT; | ||
476 | - else if (fault & VM_FAULT_SIGBUS) | ||
477 | - do_sigbus(®s); | ||
478 | - } | ||
479 | + /* | ||
480 | + * Since the fault happened in kernel mode while performing a uaccess | ||
481 | + * all we need to do now is emulating a fixup in case "fault" is not | ||
482 | + * zero. | ||
483 | + * For the calling uaccess functions this results always in -EFAULT. | ||
484 | + */ | ||
485 | return fault ? -EFAULT : 0; | ||
486 | } | ||
487 | |||
488 | diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c | ||
489 | index 2857c48..a64fe53 100644 | ||
490 | --- a/arch/s390/mm/mmap.c | ||
491 | +++ b/arch/s390/mm/mmap.c | ||
492 | @@ -105,9 +105,15 @@ void arch_pick_mmap_layout(struct mm_struct *mm) | ||
493 | |||
494 | int s390_mmap_check(unsigned long addr, unsigned long len) | ||
495 | { | ||
496 | + int rc; | ||
497 | + | ||
498 | if (!is_compat_task() && | ||
499 | - len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) | ||
500 | - return crst_table_upgrade(current->mm, 1UL << 53); | ||
501 | + len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) { | ||
502 | + rc = crst_table_upgrade(current->mm, 1UL << 53); | ||
503 | + if (rc) | ||
504 | + return rc; | ||
505 | + update_mm(current->mm, current); | ||
506 | + } | ||
507 | return 0; | ||
508 | } | ||
509 | |||
510 | @@ -127,6 +133,7 @@ s390_get_unmapped_area(struct file *filp, unsigned long addr, | ||
511 | rc = crst_table_upgrade(mm, 1UL << 53); | ||
512 | if (rc) | ||
513 | return (unsigned long) rc; | ||
514 | + update_mm(mm, current); | ||
515 | area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); | ||
516 | } | ||
517 | return area; | ||
518 | @@ -149,6 +156,7 @@ s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr, | ||
519 | rc = crst_table_upgrade(mm, 1UL << 53); | ||
520 | if (rc) | ||
521 | return (unsigned long) rc; | ||
522 | + update_mm(mm, current); | ||
523 | area = arch_get_unmapped_area_topdown(filp, addr, len, | ||
524 | pgoff, flags); | ||
525 | } | ||
526 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c | ||
527 | index 6e765bf..87f0efd 100644 | ||
528 | --- a/arch/s390/mm/pgtable.c | ||
529 | +++ b/arch/s390/mm/pgtable.c | ||
530 | @@ -85,7 +85,6 @@ repeat: | ||
531 | crst_table_free(mm, table); | ||
532 | if (mm->context.asce_limit < limit) | ||
533 | goto repeat; | ||
534 | - update_mm(mm, current); | ||
535 | return 0; | ||
536 | } | ||
537 | |||
538 | @@ -93,9 +92,6 @@ void crst_table_downgrade(struct mm_struct *mm, unsigned long limit) | ||
539 | { | ||
540 | pgd_t *pgd; | ||
541 | |||
542 | - if (mm->context.asce_limit <= limit) | ||
543 | - return; | ||
544 | - __tlb_flush_mm(mm); | ||
545 | while (mm->context.asce_limit > limit) { | ||
546 | pgd = mm->pgd; | ||
547 | switch (pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) { | ||
548 | @@ -118,7 +114,6 @@ void crst_table_downgrade(struct mm_struct *mm, unsigned long limit) | ||
549 | mm->task_size = mm->context.asce_limit; | ||
550 | crst_table_free(mm, (unsigned long *) pgd); | ||
551 | } | ||
552 | - update_mm(mm, current); | ||
553 | } | ||
554 | #endif | ||
555 | |||
556 | diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c | ||
557 | index 61604ae..0d2db0e 100644 | ||
558 | --- a/arch/x86/kernel/cpu/mcheck/mce.c | ||
559 | +++ b/arch/x86/kernel/cpu/mcheck/mce.c | ||
560 | @@ -1180,6 +1180,7 @@ void mce_notify_process(void) | ||
561 | { | ||
562 | unsigned long pfn; | ||
563 | struct mce_info *mi = mce_find_info(); | ||
564 | + int flags = MF_ACTION_REQUIRED; | ||
565 | |||
566 | if (!mi) | ||
567 | mce_panic("Lost physical address for unconsumed uncorrectable error", NULL, NULL); | ||
568 | @@ -1194,8 +1195,9 @@ void mce_notify_process(void) | ||
569 | * doomed. We still need to mark the page as poisoned and alert any | ||
570 | * other users of the page. | ||
571 | */ | ||
572 | - if (memory_failure(pfn, MCE_VECTOR, MF_ACTION_REQUIRED) < 0 || | ||
573 | - mi->restartable == 0) { | ||
574 | + if (!mi->restartable) | ||
575 | + flags |= MF_MUST_KILL; | ||
576 | + if (memory_failure(pfn, MCE_VECTOR, flags) < 0) { | ||
577 | pr_err("Memory error not recovered"); | ||
578 | force_sig(SIGBUS, current); | ||
579 | } | ||
580 | diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c | ||
581 | index 6512b20..d1fcbc0 100644 | ||
582 | --- a/drivers/acpi/ac.c | ||
583 | +++ b/drivers/acpi/ac.c | ||
584 | @@ -292,7 +292,9 @@ static int acpi_ac_add(struct acpi_device *device) | ||
585 | ac->charger.properties = ac_props; | ||
586 | ac->charger.num_properties = ARRAY_SIZE(ac_props); | ||
587 | ac->charger.get_property = get_ac_property; | ||
588 | - power_supply_register(&ac->device->dev, &ac->charger); | ||
589 | + result = power_supply_register(&ac->device->dev, &ac->charger); | ||
590 | + if (result) | ||
591 | + goto end; | ||
592 | |||
593 | printk(KERN_INFO PREFIX "%s [%s] (%s)\n", | ||
594 | acpi_device_name(device), acpi_device_bid(device), | ||
595 | diff --git a/drivers/acpi/apei/apei-base.c b/drivers/acpi/apei/apei-base.c | ||
596 | index 6686b1e..00a7836 100644 | ||
597 | --- a/drivers/acpi/apei/apei-base.c | ||
598 | +++ b/drivers/acpi/apei/apei-base.c | ||
599 | @@ -586,6 +586,11 @@ static int apei_check_gar(struct acpi_generic_address *reg, u64 *paddr, | ||
600 | } | ||
601 | *access_bit_width = 1UL << (access_size_code + 2); | ||
602 | |||
603 | + /* Fixup common BIOS bug */ | ||
604 | + if (bit_width == 32 && bit_offset == 0 && (*paddr & 0x03) == 0 && | ||
605 | + *access_bit_width < 32) | ||
606 | + *access_bit_width = 32; | ||
607 | + | ||
608 | if ((bit_width + bit_offset) > *access_bit_width) { | ||
609 | pr_warning(FW_BUG APEI_PFX | ||
610 | "Invalid bit width + offset in GAR [0x%llx/%u/%u/%u/%u]\n", | ||
611 | diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c | ||
612 | index 3085f9b..f7eff25 100644 | ||
613 | --- a/drivers/base/power/main.c | ||
614 | +++ b/drivers/base/power/main.c | ||
615 | @@ -979,8 +979,16 @@ static int dpm_suspend_late(pm_message_t state) | ||
616 | int dpm_suspend_end(pm_message_t state) | ||
617 | { | ||
618 | int error = dpm_suspend_late(state); | ||
619 | + if (error) | ||
620 | + return error; | ||
621 | |||
622 | - return error ? : dpm_suspend_noirq(state); | ||
623 | + error = dpm_suspend_noirq(state); | ||
624 | + if (error) { | ||
625 | + dpm_resume_early(state); | ||
626 | + return error; | ||
627 | + } | ||
628 | + | ||
629 | + return 0; | ||
630 | } | ||
631 | EXPORT_SYMBOL_GPL(dpm_suspend_end); | ||
632 | |||
633 | diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c | ||
634 | index ad7c732..08427ab 100644 | ||
635 | --- a/drivers/char/tpm/tpm.c | ||
636 | +++ b/drivers/char/tpm/tpm.c | ||
637 | @@ -827,10 +827,10 @@ EXPORT_SYMBOL_GPL(tpm_pcr_extend); | ||
638 | int tpm_do_selftest(struct tpm_chip *chip) | ||
639 | { | ||
640 | int rc; | ||
641 | - u8 digest[TPM_DIGEST_SIZE]; | ||
642 | unsigned int loops; | ||
643 | unsigned int delay_msec = 1000; | ||
644 | unsigned long duration; | ||
645 | + struct tpm_cmd_t cmd; | ||
646 | |||
647 | duration = tpm_calc_ordinal_duration(chip, | ||
648 | TPM_ORD_CONTINUE_SELFTEST); | ||
649 | @@ -845,7 +845,15 @@ int tpm_do_selftest(struct tpm_chip *chip) | ||
650 | return rc; | ||
651 | |||
652 | do { | ||
653 | - rc = __tpm_pcr_read(chip, 0, digest); | ||
654 | + /* Attempt to read a PCR value */ | ||
655 | + cmd.header.in = pcrread_header; | ||
656 | + cmd.params.pcrread_in.pcr_idx = cpu_to_be32(0); | ||
657 | + rc = tpm_transmit(chip, (u8 *) &cmd, READ_PCR_RESULT_SIZE); | ||
658 | + | ||
659 | + if (rc < TPM_HEADER_SIZE) | ||
660 | + return -EFAULT; | ||
661 | + | ||
662 | + rc = be32_to_cpu(cmd.header.out.return_code); | ||
663 | if (rc == TPM_ERR_DISABLED || rc == TPM_ERR_DEACTIVATED) { | ||
664 | dev_info(chip->dev, | ||
665 | "TPM is disabled/deactivated (0x%X)\n", rc); | ||
666 | diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc b/drivers/gpu/drm/nouveau/nva3_copy.fuc | ||
667 | index abc3662..219850d 100644 | ||
668 | --- a/drivers/gpu/drm/nouveau/nva3_copy.fuc | ||
669 | +++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc | ||
670 | @@ -119,9 +119,9 @@ dispatch_dma: | ||
671 | // mthd 0x030c-0x0340, various stuff | ||
672 | .b16 0xc3 14 | ||
673 | .b32 #ctx_src_address_high ~0x000000ff | ||
674 | -.b32 #ctx_src_address_low ~0xfffffff0 | ||
675 | +.b32 #ctx_src_address_low ~0xffffffff | ||
676 | .b32 #ctx_dst_address_high ~0x000000ff | ||
677 | -.b32 #ctx_dst_address_low ~0xfffffff0 | ||
678 | +.b32 #ctx_dst_address_low ~0xffffffff | ||
679 | .b32 #ctx_src_pitch ~0x0007ffff | ||
680 | .b32 #ctx_dst_pitch ~0x0007ffff | ||
681 | .b32 #ctx_xcnt ~0x0000ffff | ||
682 | diff --git a/drivers/gpu/drm/nouveau/nva3_copy.fuc.h b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h | ||
683 | index 1f33fbd..37d6de3 100644 | ||
684 | --- a/drivers/gpu/drm/nouveau/nva3_copy.fuc.h | ||
685 | +++ b/drivers/gpu/drm/nouveau/nva3_copy.fuc.h | ||
686 | @@ -1,37 +1,72 @@ | ||
687 | -uint32_t nva3_pcopy_data[] = { | ||
688 | +u32 nva3_pcopy_data[] = { | ||
689 | +/* 0x0000: ctx_object */ | ||
690 | 0x00000000, | ||
691 | +/* 0x0004: ctx_dma */ | ||
692 | +/* 0x0004: ctx_dma_query */ | ||
693 | 0x00000000, | ||
694 | +/* 0x0008: ctx_dma_src */ | ||
695 | 0x00000000, | ||
696 | +/* 0x000c: ctx_dma_dst */ | ||
697 | 0x00000000, | ||
698 | +/* 0x0010: ctx_query_address_high */ | ||
699 | 0x00000000, | ||
700 | +/* 0x0014: ctx_query_address_low */ | ||
701 | 0x00000000, | ||
702 | +/* 0x0018: ctx_query_counter */ | ||
703 | 0x00000000, | ||
704 | +/* 0x001c: ctx_src_address_high */ | ||
705 | 0x00000000, | ||
706 | +/* 0x0020: ctx_src_address_low */ | ||
707 | 0x00000000, | ||
708 | +/* 0x0024: ctx_src_pitch */ | ||
709 | 0x00000000, | ||
710 | +/* 0x0028: ctx_src_tile_mode */ | ||
711 | 0x00000000, | ||
712 | +/* 0x002c: ctx_src_xsize */ | ||
713 | 0x00000000, | ||
714 | +/* 0x0030: ctx_src_ysize */ | ||
715 | 0x00000000, | ||
716 | +/* 0x0034: ctx_src_zsize */ | ||
717 | 0x00000000, | ||
718 | +/* 0x0038: ctx_src_zoff */ | ||
719 | 0x00000000, | ||
720 | +/* 0x003c: ctx_src_xoff */ | ||
721 | 0x00000000, | ||
722 | +/* 0x0040: ctx_src_yoff */ | ||
723 | 0x00000000, | ||
724 | +/* 0x0044: ctx_src_cpp */ | ||
725 | 0x00000000, | ||
726 | +/* 0x0048: ctx_dst_address_high */ | ||
727 | 0x00000000, | ||
728 | +/* 0x004c: ctx_dst_address_low */ | ||
729 | 0x00000000, | ||
730 | +/* 0x0050: ctx_dst_pitch */ | ||
731 | 0x00000000, | ||
732 | +/* 0x0054: ctx_dst_tile_mode */ | ||
733 | 0x00000000, | ||
734 | +/* 0x0058: ctx_dst_xsize */ | ||
735 | 0x00000000, | ||
736 | +/* 0x005c: ctx_dst_ysize */ | ||
737 | 0x00000000, | ||
738 | +/* 0x0060: ctx_dst_zsize */ | ||
739 | 0x00000000, | ||
740 | +/* 0x0064: ctx_dst_zoff */ | ||
741 | 0x00000000, | ||
742 | +/* 0x0068: ctx_dst_xoff */ | ||
743 | 0x00000000, | ||
744 | +/* 0x006c: ctx_dst_yoff */ | ||
745 | 0x00000000, | ||
746 | +/* 0x0070: ctx_dst_cpp */ | ||
747 | 0x00000000, | ||
748 | +/* 0x0074: ctx_format */ | ||
749 | 0x00000000, | ||
750 | +/* 0x0078: ctx_swz_const0 */ | ||
751 | 0x00000000, | ||
752 | +/* 0x007c: ctx_swz_const1 */ | ||
753 | 0x00000000, | ||
754 | +/* 0x0080: ctx_xcnt */ | ||
755 | 0x00000000, | ||
756 | +/* 0x0084: ctx_ycnt */ | ||
757 | 0x00000000, | ||
758 | 0x00000000, | ||
759 | 0x00000000, | ||
760 | @@ -63,6 +98,7 @@ uint32_t nva3_pcopy_data[] = { | ||
761 | 0x00000000, | ||
762 | 0x00000000, | ||
763 | 0x00000000, | ||
764 | +/* 0x0100: dispatch_table */ | ||
765 | 0x00010000, | ||
766 | 0x00000000, | ||
767 | 0x00000000, | ||
768 | @@ -73,6 +109,7 @@ uint32_t nva3_pcopy_data[] = { | ||
769 | 0x00010162, | ||
770 | 0x00000000, | ||
771 | 0x00030060, | ||
772 | +/* 0x0128: dispatch_dma */ | ||
773 | 0x00010170, | ||
774 | 0x00000000, | ||
775 | 0x00010170, | ||
776 | @@ -118,11 +155,11 @@ uint32_t nva3_pcopy_data[] = { | ||
777 | 0x0000001c, | ||
778 | 0xffffff00, | ||
779 | 0x00000020, | ||
780 | - 0x0000000f, | ||
781 | + 0x00000000, | ||
782 | 0x00000048, | ||
783 | 0xffffff00, | ||
784 | 0x0000004c, | ||
785 | - 0x0000000f, | ||
786 | + 0x00000000, | ||
787 | 0x00000024, | ||
788 | 0xfff80000, | ||
789 | 0x00000050, | ||
790 | @@ -146,7 +183,8 @@ uint32_t nva3_pcopy_data[] = { | ||
791 | 0x00000800, | ||
792 | }; | ||
793 | |||
794 | -uint32_t nva3_pcopy_code[] = { | ||
795 | +u32 nva3_pcopy_code[] = { | ||
796 | +/* 0x0000: main */ | ||
797 | 0x04fe04bd, | ||
798 | 0x3517f000, | ||
799 | 0xf10010fe, | ||
800 | @@ -158,23 +196,31 @@ uint32_t nva3_pcopy_code[] = { | ||
801 | 0x17f11031, | ||
802 | 0x27f01200, | ||
803 | 0x0012d003, | ||
804 | +/* 0x002f: spin */ | ||
805 | 0xf40031f4, | ||
806 | 0x0ef40028, | ||
807 | +/* 0x0035: ih */ | ||
808 | 0x8001cffd, | ||
809 | 0xf40812c4, | ||
810 | 0x21f4060b, | ||
811 | +/* 0x0041: ih_no_chsw */ | ||
812 | 0x0412c472, | ||
813 | 0xf4060bf4, | ||
814 | +/* 0x004a: ih_no_cmd */ | ||
815 | 0x11c4c321, | ||
816 | 0x4001d00c, | ||
817 | +/* 0x0052: swctx */ | ||
818 | 0x47f101f8, | ||
819 | 0x4bfe7700, | ||
820 | 0x0007fe00, | ||
821 | 0xf00204b9, | ||
822 | 0x01f40643, | ||
823 | 0x0604fa09, | ||
824 | +/* 0x006b: swctx_load */ | ||
825 | 0xfa060ef4, | ||
826 | +/* 0x006e: swctx_done */ | ||
827 | 0x03f80504, | ||
828 | +/* 0x0072: chsw */ | ||
829 | 0x27f100f8, | ||
830 | 0x23cf1400, | ||
831 | 0x1e3fc800, | ||
832 | @@ -183,18 +229,22 @@ uint32_t nva3_pcopy_code[] = { | ||
833 | 0x1e3af052, | ||
834 | 0xf00023d0, | ||
835 | 0x24d00147, | ||
836 | +/* 0x0093: chsw_no_unload */ | ||
837 | 0xcf00f880, | ||
838 | 0x3dc84023, | ||
839 | 0x220bf41e, | ||
840 | 0xf40131f4, | ||
841 | 0x57f05221, | ||
842 | 0x0367f004, | ||
843 | +/* 0x00a8: chsw_load_ctx_dma */ | ||
844 | 0xa07856bc, | ||
845 | 0xb6018068, | ||
846 | 0x87d00884, | ||
847 | 0x0162b600, | ||
848 | +/* 0x00bb: chsw_finish_load */ | ||
849 | 0xf0f018f4, | ||
850 | 0x23d00237, | ||
851 | +/* 0x00c3: dispatch */ | ||
852 | 0xf100f880, | ||
853 | 0xcf190037, | ||
854 | 0x33cf4032, | ||
855 | @@ -202,6 +252,7 @@ uint32_t nva3_pcopy_code[] = { | ||
856 | 0x1024b607, | ||
857 | 0x010057f1, | ||
858 | 0x74bd64bd, | ||
859 | +/* 0x00dc: dispatch_loop */ | ||
860 | 0x58005658, | ||
861 | 0x50b60157, | ||
862 | 0x0446b804, | ||
863 | @@ -211,6 +262,7 @@ uint32_t nva3_pcopy_code[] = { | ||
864 | 0xb60276bb, | ||
865 | 0x57bb0374, | ||
866 | 0xdf0ef400, | ||
867 | +/* 0x0100: dispatch_valid_mthd */ | ||
868 | 0xb60246bb, | ||
869 | 0x45bb0344, | ||
870 | 0x01459800, | ||
871 | @@ -220,31 +272,41 @@ uint32_t nva3_pcopy_code[] = { | ||
872 | 0xb0014658, | ||
873 | 0x1bf40064, | ||
874 | 0x00538009, | ||
875 | +/* 0x0127: dispatch_cmd */ | ||
876 | 0xf4300ef4, | ||
877 | 0x55f90132, | ||
878 | 0xf40c01f4, | ||
879 | +/* 0x0132: dispatch_invalid_bitfield */ | ||
880 | 0x25f0250e, | ||
881 | +/* 0x0135: dispatch_illegal_mthd */ | ||
882 | 0x0125f002, | ||
883 | +/* 0x0138: dispatch_error */ | ||
884 | 0x100047f1, | ||
885 | 0xd00042d0, | ||
886 | 0x27f04043, | ||
887 | 0x0002d040, | ||
888 | +/* 0x0148: hostirq_wait */ | ||
889 | 0xf08002cf, | ||
890 | 0x24b04024, | ||
891 | 0xf71bf400, | ||
892 | +/* 0x0154: dispatch_done */ | ||
893 | 0x1d0027f1, | ||
894 | 0xd00137f0, | ||
895 | 0x00f80023, | ||
896 | +/* 0x0160: cmd_nop */ | ||
897 | +/* 0x0162: cmd_pm_trigger */ | ||
898 | 0x27f100f8, | ||
899 | 0x34bd2200, | ||
900 | 0xd00233f0, | ||
901 | 0x00f80023, | ||
902 | +/* 0x0170: cmd_dma */ | ||
903 | 0x012842b7, | ||
904 | 0xf00145b6, | ||
905 | 0x43801e39, | ||
906 | 0x0040b701, | ||
907 | 0x0644b606, | ||
908 | 0xf80043d0, | ||
909 | +/* 0x0189: cmd_exec_set_format */ | ||
910 | 0xf030f400, | ||
911 | 0xb00001b0, | ||
912 | 0x01b00101, | ||
913 | @@ -256,20 +318,26 @@ uint32_t nva3_pcopy_code[] = { | ||
914 | 0x70b63847, | ||
915 | 0x0232f401, | ||
916 | 0x94bd84bd, | ||
917 | +/* 0x01b4: ncomp_loop */ | ||
918 | 0xb60f4ac4, | ||
919 | 0xb4bd0445, | ||
920 | +/* 0x01bc: bpc_loop */ | ||
921 | 0xf404a430, | ||
922 | 0xa5ff0f18, | ||
923 | 0x00cbbbc0, | ||
924 | 0xf40231f4, | ||
925 | +/* 0x01ce: cmp_c0 */ | ||
926 | 0x1bf4220e, | ||
927 | 0x10c7f00c, | ||
928 | 0xf400cbbb, | ||
929 | +/* 0x01da: cmp_c1 */ | ||
930 | 0xa430160e, | ||
931 | 0x0c18f406, | ||
932 | 0xbb14c7f0, | ||
933 | 0x0ef400cb, | ||
934 | +/* 0x01e9: cmp_zero */ | ||
935 | 0x80c7f107, | ||
936 | +/* 0x01ed: bpc_next */ | ||
937 | 0x01c83800, | ||
938 | 0xb60180b6, | ||
939 | 0xb5b801b0, | ||
940 | @@ -280,6 +348,7 @@ uint32_t nva3_pcopy_code[] = { | ||
941 | 0x98110680, | ||
942 | 0x68fd2008, | ||
943 | 0x0502f400, | ||
944 | +/* 0x0216: dst_xcnt */ | ||
945 | 0x75fd64bd, | ||
946 | 0x1c078000, | ||
947 | 0xf10078fd, | ||
948 | @@ -304,6 +373,7 @@ uint32_t nva3_pcopy_code[] = { | ||
949 | 0x980056d0, | ||
950 | 0x56d01f06, | ||
951 | 0x1030f440, | ||
952 | +/* 0x0276: cmd_exec_set_surface_tiled */ | ||
953 | 0x579800f8, | ||
954 | 0x6879c70a, | ||
955 | 0xb66478c7, | ||
956 | @@ -311,9 +381,11 @@ uint32_t nva3_pcopy_code[] = { | ||
957 | 0x0e76b060, | ||
958 | 0xf0091bf4, | ||
959 | 0x0ef40477, | ||
960 | +/* 0x0291: xtile64 */ | ||
961 | 0x027cf00f, | ||
962 | 0xfd1170b6, | ||
963 | 0x77f00947, | ||
964 | +/* 0x029d: xtileok */ | ||
965 | 0x0f5a9806, | ||
966 | 0xfd115b98, | ||
967 | 0xb7f000ab, | ||
968 | @@ -371,6 +443,7 @@ uint32_t nva3_pcopy_code[] = { | ||
969 | 0x67d00600, | ||
970 | 0x0060b700, | ||
971 | 0x0068d004, | ||
972 | +/* 0x0382: cmd_exec_set_surface_linear */ | ||
973 | 0x6cf000f8, | ||
974 | 0x0260b702, | ||
975 | 0x0864b602, | ||
976 | @@ -381,13 +454,16 @@ uint32_t nva3_pcopy_code[] = { | ||
977 | 0xb70067d0, | ||
978 | 0x98040060, | ||
979 | 0x67d00957, | ||
980 | +/* 0x03ab: cmd_exec_wait */ | ||
981 | 0xf900f800, | ||
982 | 0xf110f900, | ||
983 | 0xb6080007, | ||
984 | +/* 0x03b6: loop */ | ||
985 | 0x01cf0604, | ||
986 | 0x0114f000, | ||
987 | 0xfcfa1bf4, | ||
988 | 0xf800fc10, | ||
989 | +/* 0x03c5: cmd_exec_query */ | ||
990 | 0x0d34c800, | ||
991 | 0xf5701bf4, | ||
992 | 0xf103ab21, | ||
993 | @@ -417,6 +493,7 @@ uint32_t nva3_pcopy_code[] = { | ||
994 | 0x47f10153, | ||
995 | 0x44b60800, | ||
996 | 0x0045d006, | ||
997 | +/* 0x0438: query_counter */ | ||
998 | 0x03ab21f5, | ||
999 | 0x080c47f1, | ||
1000 | 0x980644b6, | ||
1001 | @@ -439,11 +516,13 @@ uint32_t nva3_pcopy_code[] = { | ||
1002 | 0x47f10153, | ||
1003 | 0x44b60800, | ||
1004 | 0x0045d006, | ||
1005 | +/* 0x0492: cmd_exec */ | ||
1006 | 0x21f500f8, | ||
1007 | 0x3fc803ab, | ||
1008 | 0x0e0bf400, | ||
1009 | 0x018921f5, | ||
1010 | 0x020047f1, | ||
1011 | +/* 0x04a7: cmd_exec_no_format */ | ||
1012 | 0xf11e0ef4, | ||
1013 | 0xb6081067, | ||
1014 | 0x77f00664, | ||
1015 | @@ -451,19 +530,24 @@ uint32_t nva3_pcopy_code[] = { | ||
1016 | 0x981c0780, | ||
1017 | 0x67d02007, | ||
1018 | 0x4067d000, | ||
1019 | +/* 0x04c2: cmd_exec_init_src_surface */ | ||
1020 | 0x32f444bd, | ||
1021 | 0xc854bd02, | ||
1022 | 0x0bf4043f, | ||
1023 | 0x8221f50a, | ||
1024 | 0x0a0ef403, | ||
1025 | +/* 0x04d4: src_tiled */ | ||
1026 | 0x027621f5, | ||
1027 | +/* 0x04db: cmd_exec_init_dst_surface */ | ||
1028 | 0xf40749f0, | ||
1029 | 0x57f00231, | ||
1030 | 0x083fc82c, | ||
1031 | 0xf50a0bf4, | ||
1032 | 0xf4038221, | ||
1033 | +/* 0x04ee: dst_tiled */ | ||
1034 | 0x21f50a0e, | ||
1035 | 0x49f00276, | ||
1036 | +/* 0x04f5: cmd_exec_kick */ | ||
1037 | 0x0057f108, | ||
1038 | 0x0654b608, | ||
1039 | 0xd0210698, | ||
1040 | @@ -473,6 +557,8 @@ uint32_t nva3_pcopy_code[] = { | ||
1041 | 0xc80054d0, | ||
1042 | 0x0bf40c3f, | ||
1043 | 0xc521f507, | ||
1044 | +/* 0x0519: cmd_exec_done */ | ||
1045 | +/* 0x051b: cmd_wrcache_flush */ | ||
1046 | 0xf100f803, | ||
1047 | 0xbd220027, | ||
1048 | 0x0133f034, | ||
1049 | diff --git a/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h b/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h | ||
1050 | index a8d1745..cd879f3 100644 | ||
1051 | --- a/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h | ||
1052 | +++ b/drivers/gpu/drm/nouveau/nvc0_copy.fuc.h | ||
1053 | @@ -1,34 +1,65 @@ | ||
1054 | -uint32_t nvc0_pcopy_data[] = { | ||
1055 | +u32 nvc0_pcopy_data[] = { | ||
1056 | +/* 0x0000: ctx_object */ | ||
1057 | 0x00000000, | ||
1058 | +/* 0x0004: ctx_query_address_high */ | ||
1059 | 0x00000000, | ||
1060 | +/* 0x0008: ctx_query_address_low */ | ||
1061 | 0x00000000, | ||
1062 | +/* 0x000c: ctx_query_counter */ | ||
1063 | 0x00000000, | ||
1064 | +/* 0x0010: ctx_src_address_high */ | ||
1065 | 0x00000000, | ||
1066 | +/* 0x0014: ctx_src_address_low */ | ||
1067 | 0x00000000, | ||
1068 | +/* 0x0018: ctx_src_pitch */ | ||
1069 | 0x00000000, | ||
1070 | +/* 0x001c: ctx_src_tile_mode */ | ||
1071 | 0x00000000, | ||
1072 | +/* 0x0020: ctx_src_xsize */ | ||
1073 | 0x00000000, | ||
1074 | +/* 0x0024: ctx_src_ysize */ | ||
1075 | 0x00000000, | ||
1076 | +/* 0x0028: ctx_src_zsize */ | ||
1077 | 0x00000000, | ||
1078 | +/* 0x002c: ctx_src_zoff */ | ||
1079 | 0x00000000, | ||
1080 | +/* 0x0030: ctx_src_xoff */ | ||
1081 | 0x00000000, | ||
1082 | +/* 0x0034: ctx_src_yoff */ | ||
1083 | 0x00000000, | ||
1084 | +/* 0x0038: ctx_src_cpp */ | ||
1085 | 0x00000000, | ||
1086 | +/* 0x003c: ctx_dst_address_high */ | ||
1087 | 0x00000000, | ||
1088 | +/* 0x0040: ctx_dst_address_low */ | ||
1089 | 0x00000000, | ||
1090 | +/* 0x0044: ctx_dst_pitch */ | ||
1091 | 0x00000000, | ||
1092 | +/* 0x0048: ctx_dst_tile_mode */ | ||
1093 | 0x00000000, | ||
1094 | +/* 0x004c: ctx_dst_xsize */ | ||
1095 | 0x00000000, | ||
1096 | +/* 0x0050: ctx_dst_ysize */ | ||
1097 | 0x00000000, | ||
1098 | +/* 0x0054: ctx_dst_zsize */ | ||
1099 | 0x00000000, | ||
1100 | +/* 0x0058: ctx_dst_zoff */ | ||
1101 | 0x00000000, | ||
1102 | +/* 0x005c: ctx_dst_xoff */ | ||
1103 | 0x00000000, | ||
1104 | +/* 0x0060: ctx_dst_yoff */ | ||
1105 | 0x00000000, | ||
1106 | +/* 0x0064: ctx_dst_cpp */ | ||
1107 | 0x00000000, | ||
1108 | +/* 0x0068: ctx_format */ | ||
1109 | 0x00000000, | ||
1110 | +/* 0x006c: ctx_swz_const0 */ | ||
1111 | 0x00000000, | ||
1112 | +/* 0x0070: ctx_swz_const1 */ | ||
1113 | 0x00000000, | ||
1114 | +/* 0x0074: ctx_xcnt */ | ||
1115 | 0x00000000, | ||
1116 | +/* 0x0078: ctx_ycnt */ | ||
1117 | 0x00000000, | ||
1118 | 0x00000000, | ||
1119 | 0x00000000, | ||
1120 | @@ -63,6 +94,7 @@ uint32_t nvc0_pcopy_data[] = { | ||
1121 | 0x00000000, | ||
1122 | 0x00000000, | ||
1123 | 0x00000000, | ||
1124 | +/* 0x0100: dispatch_table */ | ||
1125 | 0x00010000, | ||
1126 | 0x00000000, | ||
1127 | 0x00000000, | ||
1128 | @@ -111,11 +143,11 @@ uint32_t nvc0_pcopy_data[] = { | ||
1129 | 0x00000010, | ||
1130 | 0xffffff00, | ||
1131 | 0x00000014, | ||
1132 | - 0x0000000f, | ||
1133 | + 0x00000000, | ||
1134 | 0x0000003c, | ||
1135 | 0xffffff00, | ||
1136 | 0x00000040, | ||
1137 | - 0x0000000f, | ||
1138 | + 0x00000000, | ||
1139 | 0x00000018, | ||
1140 | 0xfff80000, | ||
1141 | 0x00000044, | ||
1142 | @@ -139,7 +171,8 @@ uint32_t nvc0_pcopy_data[] = { | ||
1143 | 0x00000800, | ||
1144 | }; | ||
1145 | |||
1146 | -uint32_t nvc0_pcopy_code[] = { | ||
1147 | +u32 nvc0_pcopy_code[] = { | ||
1148 | +/* 0x0000: main */ | ||
1149 | 0x04fe04bd, | ||
1150 | 0x3517f000, | ||
1151 | 0xf10010fe, | ||
1152 | @@ -151,15 +184,20 @@ uint32_t nvc0_pcopy_code[] = { | ||
1153 | 0x17f11031, | ||
1154 | 0x27f01200, | ||
1155 | 0x0012d003, | ||
1156 | +/* 0x002f: spin */ | ||
1157 | 0xf40031f4, | ||
1158 | 0x0ef40028, | ||
1159 | +/* 0x0035: ih */ | ||
1160 | 0x8001cffd, | ||
1161 | 0xf40812c4, | ||
1162 | 0x21f4060b, | ||
1163 | +/* 0x0041: ih_no_chsw */ | ||
1164 | 0x0412c4ca, | ||
1165 | 0xf5070bf4, | ||
1166 | +/* 0x004b: ih_no_cmd */ | ||
1167 | 0xc4010221, | ||
1168 | 0x01d00c11, | ||
1169 | +/* 0x0053: swctx */ | ||
1170 | 0xf101f840, | ||
1171 | 0xfe770047, | ||
1172 | 0x47f1004b, | ||
1173 | @@ -188,8 +226,11 @@ uint32_t nvc0_pcopy_code[] = { | ||
1174 | 0xf00204b9, | ||
1175 | 0x01f40643, | ||
1176 | 0x0604fa09, | ||
1177 | +/* 0x00c3: swctx_load */ | ||
1178 | 0xfa060ef4, | ||
1179 | +/* 0x00c6: swctx_done */ | ||
1180 | 0x03f80504, | ||
1181 | +/* 0x00ca: chsw */ | ||
1182 | 0x27f100f8, | ||
1183 | 0x23cf1400, | ||
1184 | 0x1e3fc800, | ||
1185 | @@ -198,18 +239,22 @@ uint32_t nvc0_pcopy_code[] = { | ||
1186 | 0x1e3af053, | ||
1187 | 0xf00023d0, | ||
1188 | 0x24d00147, | ||
1189 | +/* 0x00eb: chsw_no_unload */ | ||
1190 | 0xcf00f880, | ||
1191 | 0x3dc84023, | ||
1192 | 0x090bf41e, | ||
1193 | 0xf40131f4, | ||
1194 | +/* 0x00fa: chsw_finish_load */ | ||
1195 | 0x37f05321, | ||
1196 | 0x8023d002, | ||
1197 | +/* 0x0102: dispatch */ | ||
1198 | 0x37f100f8, | ||
1199 | 0x32cf1900, | ||
1200 | 0x0033cf40, | ||
1201 | 0x07ff24e4, | ||
1202 | 0xf11024b6, | ||
1203 | 0xbd010057, | ||
1204 | +/* 0x011b: dispatch_loop */ | ||
1205 | 0x5874bd64, | ||
1206 | 0x57580056, | ||
1207 | 0x0450b601, | ||
1208 | @@ -219,6 +264,7 @@ uint32_t nvc0_pcopy_code[] = { | ||
1209 | 0xbb0f08f4, | ||
1210 | 0x74b60276, | ||
1211 | 0x0057bb03, | ||
1212 | +/* 0x013f: dispatch_valid_mthd */ | ||
1213 | 0xbbdf0ef4, | ||
1214 | 0x44b60246, | ||
1215 | 0x0045bb03, | ||
1216 | @@ -229,24 +275,33 @@ uint32_t nvc0_pcopy_code[] = { | ||
1217 | 0x64b00146, | ||
1218 | 0x091bf400, | ||
1219 | 0xf4005380, | ||
1220 | +/* 0x0166: dispatch_cmd */ | ||
1221 | 0x32f4300e, | ||
1222 | 0xf455f901, | ||
1223 | 0x0ef40c01, | ||
1224 | +/* 0x0171: dispatch_invalid_bitfield */ | ||
1225 | 0x0225f025, | ||
1226 | +/* 0x0174: dispatch_illegal_mthd */ | ||
1227 | +/* 0x0177: dispatch_error */ | ||
1228 | 0xf10125f0, | ||
1229 | 0xd0100047, | ||
1230 | 0x43d00042, | ||
1231 | 0x4027f040, | ||
1232 | +/* 0x0187: hostirq_wait */ | ||
1233 | 0xcf0002d0, | ||
1234 | 0x24f08002, | ||
1235 | 0x0024b040, | ||
1236 | +/* 0x0193: dispatch_done */ | ||
1237 | 0xf1f71bf4, | ||
1238 | 0xf01d0027, | ||
1239 | 0x23d00137, | ||
1240 | +/* 0x019f: cmd_nop */ | ||
1241 | 0xf800f800, | ||
1242 | +/* 0x01a1: cmd_pm_trigger */ | ||
1243 | 0x0027f100, | ||
1244 | 0xf034bd22, | ||
1245 | 0x23d00233, | ||
1246 | +/* 0x01af: cmd_exec_set_format */ | ||
1247 | 0xf400f800, | ||
1248 | 0x01b0f030, | ||
1249 | 0x0101b000, | ||
1250 | @@ -258,20 +313,26 @@ uint32_t nvc0_pcopy_code[] = { | ||
1251 | 0x3847c701, | ||
1252 | 0xf40170b6, | ||
1253 | 0x84bd0232, | ||
1254 | +/* 0x01da: ncomp_loop */ | ||
1255 | 0x4ac494bd, | ||
1256 | 0x0445b60f, | ||
1257 | +/* 0x01e2: bpc_loop */ | ||
1258 | 0xa430b4bd, | ||
1259 | 0x0f18f404, | ||
1260 | 0xbbc0a5ff, | ||
1261 | 0x31f400cb, | ||
1262 | 0x220ef402, | ||
1263 | +/* 0x01f4: cmp_c0 */ | ||
1264 | 0xf00c1bf4, | ||
1265 | 0xcbbb10c7, | ||
1266 | 0x160ef400, | ||
1267 | +/* 0x0200: cmp_c1 */ | ||
1268 | 0xf406a430, | ||
1269 | 0xc7f00c18, | ||
1270 | 0x00cbbb14, | ||
1271 | +/* 0x020f: cmp_zero */ | ||
1272 | 0xf1070ef4, | ||
1273 | +/* 0x0213: bpc_next */ | ||
1274 | 0x380080c7, | ||
1275 | 0x80b601c8, | ||
1276 | 0x01b0b601, | ||
1277 | @@ -283,6 +344,7 @@ uint32_t nvc0_pcopy_code[] = { | ||
1278 | 0x1d08980e, | ||
1279 | 0xf40068fd, | ||
1280 | 0x64bd0502, | ||
1281 | +/* 0x023c: dst_xcnt */ | ||
1282 | 0x800075fd, | ||
1283 | 0x78fd1907, | ||
1284 | 0x1057f100, | ||
1285 | @@ -307,15 +369,18 @@ uint32_t nvc0_pcopy_code[] = { | ||
1286 | 0x1c069800, | ||
1287 | 0xf44056d0, | ||
1288 | 0x00f81030, | ||
1289 | +/* 0x029c: cmd_exec_set_surface_tiled */ | ||
1290 | 0xc7075798, | ||
1291 | 0x78c76879, | ||
1292 | 0x0380b664, | ||
1293 | 0xb06077c7, | ||
1294 | 0x1bf40e76, | ||
1295 | 0x0477f009, | ||
1296 | +/* 0x02b7: xtile64 */ | ||
1297 | 0xf00f0ef4, | ||
1298 | 0x70b6027c, | ||
1299 | 0x0947fd11, | ||
1300 | +/* 0x02c3: xtileok */ | ||
1301 | 0x980677f0, | ||
1302 | 0x5b980c5a, | ||
1303 | 0x00abfd0e, | ||
1304 | @@ -374,6 +439,7 @@ uint32_t nvc0_pcopy_code[] = { | ||
1305 | 0xb70067d0, | ||
1306 | 0xd0040060, | ||
1307 | 0x00f80068, | ||
1308 | +/* 0x03a8: cmd_exec_set_surface_linear */ | ||
1309 | 0xb7026cf0, | ||
1310 | 0xb6020260, | ||
1311 | 0x57980864, | ||
1312 | @@ -384,12 +450,15 @@ uint32_t nvc0_pcopy_code[] = { | ||
1313 | 0x0060b700, | ||
1314 | 0x06579804, | ||
1315 | 0xf80067d0, | ||
1316 | +/* 0x03d1: cmd_exec_wait */ | ||
1317 | 0xf900f900, | ||
1318 | 0x0007f110, | ||
1319 | 0x0604b608, | ||
1320 | +/* 0x03dc: loop */ | ||
1321 | 0xf00001cf, | ||
1322 | 0x1bf40114, | ||
1323 | 0xfc10fcfa, | ||
1324 | +/* 0x03eb: cmd_exec_query */ | ||
1325 | 0xc800f800, | ||
1326 | 0x1bf40d34, | ||
1327 | 0xd121f570, | ||
1328 | @@ -419,6 +488,7 @@ uint32_t nvc0_pcopy_code[] = { | ||
1329 | 0x0153f026, | ||
1330 | 0x080047f1, | ||
1331 | 0xd00644b6, | ||
1332 | +/* 0x045e: query_counter */ | ||
1333 | 0x21f50045, | ||
1334 | 0x47f103d1, | ||
1335 | 0x44b6080c, | ||
1336 | @@ -442,11 +512,13 @@ uint32_t nvc0_pcopy_code[] = { | ||
1337 | 0x080047f1, | ||
1338 | 0xd00644b6, | ||
1339 | 0x00f80045, | ||
1340 | +/* 0x04b8: cmd_exec */ | ||
1341 | 0x03d121f5, | ||
1342 | 0xf4003fc8, | ||
1343 | 0x21f50e0b, | ||
1344 | 0x47f101af, | ||
1345 | 0x0ef40200, | ||
1346 | +/* 0x04cd: cmd_exec_no_format */ | ||
1347 | 0x1067f11e, | ||
1348 | 0x0664b608, | ||
1349 | 0x800177f0, | ||
1350 | @@ -454,18 +526,23 @@ uint32_t nvc0_pcopy_code[] = { | ||
1351 | 0x1d079819, | ||
1352 | 0xd00067d0, | ||
1353 | 0x44bd4067, | ||
1354 | +/* 0x04e8: cmd_exec_init_src_surface */ | ||
1355 | 0xbd0232f4, | ||
1356 | 0x043fc854, | ||
1357 | 0xf50a0bf4, | ||
1358 | 0xf403a821, | ||
1359 | +/* 0x04fa: src_tiled */ | ||
1360 | 0x21f50a0e, | ||
1361 | 0x49f0029c, | ||
1362 | +/* 0x0501: cmd_exec_init_dst_surface */ | ||
1363 | 0x0231f407, | ||
1364 | 0xc82c57f0, | ||
1365 | 0x0bf4083f, | ||
1366 | 0xa821f50a, | ||
1367 | 0x0a0ef403, | ||
1368 | +/* 0x0514: dst_tiled */ | ||
1369 | 0x029c21f5, | ||
1370 | +/* 0x051b: cmd_exec_kick */ | ||
1371 | 0xf10849f0, | ||
1372 | 0xb6080057, | ||
1373 | 0x06980654, | ||
1374 | @@ -475,7 +552,9 @@ uint32_t nvc0_pcopy_code[] = { | ||
1375 | 0x54d00546, | ||
1376 | 0x0c3fc800, | ||
1377 | 0xf5070bf4, | ||
1378 | +/* 0x053f: cmd_exec_done */ | ||
1379 | 0xf803eb21, | ||
1380 | +/* 0x0541: cmd_wrcache_flush */ | ||
1381 | 0x0027f100, | ||
1382 | 0xf034bd22, | ||
1383 | 0x23d00133, | ||
1384 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c | ||
1385 | index c57d856..886b41f 100644 | ||
1386 | --- a/drivers/gpu/drm/radeon/atombios_dp.c | ||
1387 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c | ||
1388 | @@ -22,6 +22,7 @@ | ||
1389 | * | ||
1390 | * Authors: Dave Airlie | ||
1391 | * Alex Deucher | ||
1392 | + * Jerome Glisse | ||
1393 | */ | ||
1394 | #include "drmP.h" | ||
1395 | #include "radeon_drm.h" | ||
1396 | @@ -637,7 +638,6 @@ static bool radeon_dp_get_link_status(struct radeon_connector *radeon_connector, | ||
1397 | ret = radeon_dp_aux_native_read(radeon_connector, DP_LANE0_1_STATUS, | ||
1398 | link_status, DP_LINK_STATUS_SIZE, 100); | ||
1399 | if (ret <= 0) { | ||
1400 | - DRM_ERROR("displayport link status failed\n"); | ||
1401 | return false; | ||
1402 | } | ||
1403 | |||
1404 | @@ -816,8 +816,10 @@ static int radeon_dp_link_train_cr(struct radeon_dp_link_train_info *dp_info) | ||
1405 | else | ||
1406 | mdelay(dp_info->rd_interval * 4); | ||
1407 | |||
1408 | - if (!radeon_dp_get_link_status(dp_info->radeon_connector, dp_info->link_status)) | ||
1409 | + if (!radeon_dp_get_link_status(dp_info->radeon_connector, dp_info->link_status)) { | ||
1410 | + DRM_ERROR("displayport link status failed\n"); | ||
1411 | break; | ||
1412 | + } | ||
1413 | |||
1414 | if (dp_clock_recovery_ok(dp_info->link_status, dp_info->dp_lane_count)) { | ||
1415 | clock_recovery = true; | ||
1416 | @@ -879,8 +881,10 @@ static int radeon_dp_link_train_ce(struct radeon_dp_link_train_info *dp_info) | ||
1417 | else | ||
1418 | mdelay(dp_info->rd_interval * 4); | ||
1419 | |||
1420 | - if (!radeon_dp_get_link_status(dp_info->radeon_connector, dp_info->link_status)) | ||
1421 | + if (!radeon_dp_get_link_status(dp_info->radeon_connector, dp_info->link_status)) { | ||
1422 | + DRM_ERROR("displayport link status failed\n"); | ||
1423 | break; | ||
1424 | + } | ||
1425 | |||
1426 | if (dp_channel_eq_ok(dp_info->link_status, dp_info->dp_lane_count)) { | ||
1427 | channel_eq = true; | ||
1428 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1429 | index 2d39f99..a3ae788 100644 | ||
1430 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1431 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1432 | @@ -1392,10 +1392,18 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | ||
1433 | case DRM_MODE_DPMS_ON: | ||
1434 | /* some early dce3.2 boards have a bug in their transmitter control table */ | ||
1435 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || | ||
1436 | - ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) | ||
1437 | + ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | ||
1438 | + if (ASIC_IS_DCE6(rdev)) { | ||
1439 | + /* It seems we need to call ATOM_ENCODER_CMD_SETUP again | ||
1440 | + * before reenabling encoder on DPMS ON, otherwise we never | ||
1441 | + * get picture | ||
1442 | + */ | ||
1443 | + atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | ||
1444 | + } | ||
1445 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | ||
1446 | - else | ||
1447 | + } else { | ||
1448 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
1449 | + } | ||
1450 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | ||
1451 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | ||
1452 | atombios_set_edp_panel_power(connector, | ||
1453 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1454 | index 3c2e7a0..3fb7ca9 100644 | ||
1455 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1456 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1457 | @@ -64,14 +64,33 @@ void radeon_connector_hotplug(struct drm_connector *connector) | ||
1458 | |||
1459 | /* just deal with DP (not eDP) here. */ | ||
1460 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { | ||
1461 | - int saved_dpms = connector->dpms; | ||
1462 | - | ||
1463 | - /* Only turn off the display it it's physically disconnected */ | ||
1464 | - if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) | ||
1465 | - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | ||
1466 | - else if (radeon_dp_needs_link_train(radeon_connector)) | ||
1467 | - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
1468 | - connector->dpms = saved_dpms; | ||
1469 | + struct radeon_connector_atom_dig *dig_connector = | ||
1470 | + radeon_connector->con_priv; | ||
1471 | + | ||
1472 | + /* if existing sink type was not DP no need to retrain */ | ||
1473 | + if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT) | ||
1474 | + return; | ||
1475 | + | ||
1476 | + /* first get sink type as it may be reset after (un)plug */ | ||
1477 | + dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); | ||
1478 | + /* don't do anything if sink is not display port, i.e., | ||
1479 | + * passive dp->(dvi|hdmi) adaptor | ||
1480 | + */ | ||
1481 | + if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { | ||
1482 | + int saved_dpms = connector->dpms; | ||
1483 | + /* Only turn off the display if it's physically disconnected */ | ||
1484 | + if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { | ||
1485 | + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); | ||
1486 | + } else if (radeon_dp_needs_link_train(radeon_connector)) { | ||
1487 | + /* set it to OFF so that drm_helper_connector_dpms() | ||
1488 | + * won't return immediately since the current state | ||
1489 | + * is ON at this point. | ||
1490 | + */ | ||
1491 | + connector->dpms = DRM_MODE_DPMS_OFF; | ||
1492 | + drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
1493 | + } | ||
1494 | + connector->dpms = saved_dpms; | ||
1495 | + } | ||
1496 | } | ||
1497 | } | ||
1498 | |||
1499 | diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c | ||
1500 | index 2418cf6..cf723c4 100644 | ||
1501 | --- a/drivers/gpu/drm/radeon/radeon_cs.c | ||
1502 | +++ b/drivers/gpu/drm/radeon/radeon_cs.c | ||
1503 | @@ -377,7 +377,7 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev, | ||
1504 | if (r) { | ||
1505 | DRM_ERROR("Failed to schedule IB !\n"); | ||
1506 | } | ||
1507 | - return 0; | ||
1508 | + return r; | ||
1509 | } | ||
1510 | |||
1511 | static int radeon_bo_vm_update_pte(struct radeon_cs_parser *parser, | ||
1512 | diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
1513 | index 42acc64..711e95a 100644 | ||
1514 | --- a/drivers/gpu/drm/radeon/radeon_cursor.c | ||
1515 | +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
1516 | @@ -262,8 +262,14 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | ||
1517 | if (!(cursor_end & 0x7f)) | ||
1518 | w--; | ||
1519 | } | ||
1520 | - if (w <= 0) | ||
1521 | + if (w <= 0) { | ||
1522 | w = 1; | ||
1523 | + cursor_end = x - xorigin + w; | ||
1524 | + if (!(cursor_end & 0x7f)) { | ||
1525 | + x--; | ||
1526 | + WARN_ON_ONCE(x < 0); | ||
1527 | + } | ||
1528 | + } | ||
1529 | } | ||
1530 | } | ||
1531 | |||
1532 | diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c | ||
1533 | index df6a4db..80c6e8b 100644 | ||
1534 | --- a/drivers/gpu/drm/radeon/radeon_object.c | ||
1535 | +++ b/drivers/gpu/drm/radeon/radeon_object.c | ||
1536 | @@ -136,7 +136,6 @@ int radeon_bo_create(struct radeon_device *rdev, | ||
1537 | acc_size = ttm_bo_dma_acc_size(&rdev->mman.bdev, size, | ||
1538 | sizeof(struct radeon_bo)); | ||
1539 | |||
1540 | -retry: | ||
1541 | bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL); | ||
1542 | if (bo == NULL) | ||
1543 | return -ENOMEM; | ||
1544 | @@ -150,6 +149,8 @@ retry: | ||
1545 | bo->surface_reg = -1; | ||
1546 | INIT_LIST_HEAD(&bo->list); | ||
1547 | INIT_LIST_HEAD(&bo->va); | ||
1548 | + | ||
1549 | +retry: | ||
1550 | radeon_ttm_placement_from_domain(bo, domain); | ||
1551 | /* Kernel allocation are uninterruptible */ | ||
1552 | mutex_lock(&rdev->vram_mutex); | ||
1553 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c | ||
1554 | index dfe7d37..57ed244 100644 | ||
1555 | --- a/drivers/iommu/amd_iommu.c | ||
1556 | +++ b/drivers/iommu/amd_iommu.c | ||
1557 | @@ -2254,6 +2254,18 @@ static int device_change_notifier(struct notifier_block *nb, | ||
1558 | |||
1559 | iommu_init_device(dev); | ||
1560 | |||
1561 | + /* | ||
1562 | + * dev_data is still NULL and | ||
1563 | + * got initialized in iommu_init_device | ||
1564 | + */ | ||
1565 | + dev_data = get_dev_data(dev); | ||
1566 | + | ||
1567 | + if (iommu_pass_through || dev_data->iommu_v2) { | ||
1568 | + dev_data->passthrough = true; | ||
1569 | + attach_device(dev, pt_domain); | ||
1570 | + break; | ||
1571 | + } | ||
1572 | + | ||
1573 | domain = domain_for_device(dev); | ||
1574 | |||
1575 | /* allocate a protection domain if a device is added */ | ||
1576 | @@ -2271,10 +2283,7 @@ static int device_change_notifier(struct notifier_block *nb, | ||
1577 | |||
1578 | dev_data = get_dev_data(dev); | ||
1579 | |||
1580 | - if (!dev_data->passthrough) | ||
1581 | - dev->archdata.dma_ops = &amd_iommu_dma_ops; | ||
1582 | - else | ||
1583 | - dev->archdata.dma_ops = &nommu_dma_ops; | ||
1584 | + dev->archdata.dma_ops = &amd_iommu_dma_ops; | ||
1585 | |||
1586 | break; | ||
1587 | case BUS_NOTIFY_DEL_DEVICE: | ||
1588 | diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c | ||
1589 | index 036fe9b..a1f1bc8 100644 | ||
1590 | --- a/drivers/iommu/amd_iommu_v2.c | ||
1591 | +++ b/drivers/iommu/amd_iommu_v2.c | ||
1592 | @@ -681,6 +681,8 @@ int amd_iommu_bind_pasid(struct pci_dev *pdev, int pasid, | ||
1593 | |||
1594 | atomic_set(&pasid_state->count, 1); | ||
1595 | init_waitqueue_head(&pasid_state->wq); | ||
1596 | + spin_lock_init(&pasid_state->lock); | ||
1597 | + | ||
1598 | pasid_state->task = task; | ||
1599 | pasid_state->mm = get_task_mm(task); | ||
1600 | pasid_state->device_state = dev_state; | ||
1601 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
1602 | index e0a0ebe..1555f0b 100644 | ||
1603 | --- a/drivers/md/dm-thin.c | ||
1604 | +++ b/drivers/md/dm-thin.c | ||
1605 | @@ -19,7 +19,7 @@ | ||
1606 | /* | ||
1607 | * Tunable constants | ||
1608 | */ | ||
1609 | -#define ENDIO_HOOK_POOL_SIZE 10240 | ||
1610 | +#define ENDIO_HOOK_POOL_SIZE 1024 | ||
1611 | #define DEFERRED_SET_SIZE 64 | ||
1612 | #define MAPPING_POOL_SIZE 1024 | ||
1613 | #define PRISON_CELLS 1024 | ||
1614 | @@ -855,7 +855,7 @@ static void process_prepared_mapping(struct new_mapping *m) | ||
1615 | |||
1616 | if (m->err) { | ||
1617 | cell_error(m->cell); | ||
1618 | - return; | ||
1619 | + goto out; | ||
1620 | } | ||
1621 | |||
1622 | /* | ||
1623 | @@ -867,7 +867,7 @@ static void process_prepared_mapping(struct new_mapping *m) | ||
1624 | if (r) { | ||
1625 | DMERR("dm_thin_insert_block() failed"); | ||
1626 | cell_error(m->cell); | ||
1627 | - return; | ||
1628 | + goto out; | ||
1629 | } | ||
1630 | |||
1631 | /* | ||
1632 | @@ -882,6 +882,7 @@ static void process_prepared_mapping(struct new_mapping *m) | ||
1633 | } else | ||
1634 | cell_defer(tc, m->cell, m->data_block); | ||
1635 | |||
1636 | +out: | ||
1637 | list_del(&m->list); | ||
1638 | mempool_free(m, tc->pool->mapping_pool); | ||
1639 | } | ||
1640 | diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c | ||
1641 | index 69ef0be..504da71 100644 | ||
1642 | --- a/drivers/mmc/host/sdhci-pci.c | ||
1643 | +++ b/drivers/mmc/host/sdhci-pci.c | ||
1644 | @@ -157,6 +157,7 @@ static const struct sdhci_pci_fixes sdhci_ene_714 = { | ||
1645 | static const struct sdhci_pci_fixes sdhci_cafe = { | ||
1646 | .quirks = SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER | | ||
1647 | SDHCI_QUIRK_NO_BUSY_IRQ | | ||
1648 | + SDHCI_QUIRK_BROKEN_CARD_DETECTION | | ||
1649 | SDHCI_QUIRK_BROKEN_TIMEOUT_VAL, | ||
1650 | }; | ||
1651 | |||
1652 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
1653 | index ccefdeb..3c403aa 100644 | ||
1654 | --- a/drivers/mmc/host/sdhci.c | ||
1655 | +++ b/drivers/mmc/host/sdhci.c | ||
1656 | @@ -27,6 +27,7 @@ | ||
1657 | |||
1658 | #include <linux/mmc/mmc.h> | ||
1659 | #include <linux/mmc/host.h> | ||
1660 | +#include <linux/mmc/card.h> | ||
1661 | |||
1662 | #include "sdhci.h" | ||
1663 | |||
1664 | @@ -1245,6 +1246,7 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | ||
1665 | struct sdhci_host *host; | ||
1666 | bool present; | ||
1667 | unsigned long flags; | ||
1668 | + u32 tuning_opcode; | ||
1669 | |||
1670 | host = mmc_priv(mmc); | ||
1671 | |||
1672 | @@ -1292,8 +1294,12 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | ||
1673 | */ | ||
1674 | if ((host->flags & SDHCI_NEEDS_RETUNING) && | ||
1675 | !(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) { | ||
1676 | + /* eMMC uses cmd21 while sd and sdio use cmd19 */ | ||
1677 | + tuning_opcode = mmc->card->type == MMC_TYPE_MMC ? | ||
1678 | + MMC_SEND_TUNING_BLOCK_HS200 : | ||
1679 | + MMC_SEND_TUNING_BLOCK; | ||
1680 | spin_unlock_irqrestore(&host->lock, flags); | ||
1681 | - sdhci_execute_tuning(mmc, mrq->cmd->opcode); | ||
1682 | + sdhci_execute_tuning(mmc, tuning_opcode); | ||
1683 | spin_lock_irqsave(&host->lock, flags); | ||
1684 | |||
1685 | /* Restore original mmc_request structure */ | ||
1686 | diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c | ||
1687 | index 8a3054b..5de74e7 100644 | ||
1688 | --- a/drivers/net/caif/caif_serial.c | ||
1689 | +++ b/drivers/net/caif/caif_serial.c | ||
1690 | @@ -325,6 +325,9 @@ static int ldisc_open(struct tty_struct *tty) | ||
1691 | |||
1692 | sprintf(name, "cf%s", tty->name); | ||
1693 | dev = alloc_netdev(sizeof(*ser), name, caifdev_setup); | ||
1694 | + if (!dev) | ||
1695 | + return -ENOMEM; | ||
1696 | + | ||
1697 | ser = netdev_priv(dev); | ||
1698 | ser->tty = tty_kref_get(tty); | ||
1699 | ser->dev = dev; | ||
1700 | diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | ||
1701 | index 1ef0c92..65fe632 100644 | ||
1702 | --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | ||
1703 | +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | ||
1704 | @@ -267,7 +267,6 @@ static void atl1c_check_link_status(struct atl1c_adapter *adapter) | ||
1705 | dev_warn(&pdev->dev, "stop mac failed\n"); | ||
1706 | atl1c_set_aspm(hw, false); | ||
1707 | netif_carrier_off(netdev); | ||
1708 | - netif_stop_queue(netdev); | ||
1709 | atl1c_phy_reset(hw); | ||
1710 | atl1c_phy_init(&adapter->hw); | ||
1711 | } else { | ||
1712 | diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c | ||
1713 | index 8297e28..b8ade57 100644 | ||
1714 | --- a/drivers/net/ethernet/broadcom/bnx2.c | ||
1715 | +++ b/drivers/net/ethernet/broadcom/bnx2.c | ||
1716 | @@ -5372,7 +5372,7 @@ bnx2_free_tx_skbs(struct bnx2 *bp) | ||
1717 | int k, last; | ||
1718 | |||
1719 | if (skb == NULL) { | ||
1720 | - j++; | ||
1721 | + j = NEXT_TX_BD(j); | ||
1722 | continue; | ||
1723 | } | ||
1724 | |||
1725 | @@ -5384,8 +5384,8 @@ bnx2_free_tx_skbs(struct bnx2 *bp) | ||
1726 | tx_buf->skb = NULL; | ||
1727 | |||
1728 | last = tx_buf->nr_frags; | ||
1729 | - j++; | ||
1730 | - for (k = 0; k < last; k++, j++) { | ||
1731 | + j = NEXT_TX_BD(j); | ||
1732 | + for (k = 0; k < last; k++, j = NEXT_TX_BD(j)) { | ||
1733 | tx_buf = &txr->tx_buf_ring[TX_RING_IDX(j)]; | ||
1734 | dma_unmap_page(&bp->pdev->dev, | ||
1735 | dma_unmap_addr(tx_buf, mapping), | ||
1736 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
1737 | index 1a1b29f..689d2a1 100644 | ||
1738 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
1739 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
1740 | @@ -298,6 +298,7 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = { | ||
1741 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57795)}, | ||
1742 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)}, | ||
1743 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)}, | ||
1744 | + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57762)}, | ||
1745 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, | ||
1746 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, | ||
1747 | {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, | ||
1748 | @@ -8948,8 +8949,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | ||
1749 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 || | ||
1750 | tg3_flag(tp, 57765_PLUS)) { | ||
1751 | val = tr32(TG3_RDMA_RSRVCTRL_REG); | ||
1752 | - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 || | ||
1753 | - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) { | ||
1754 | + if (tp->pci_chip_rev_id == CHIPREV_ID_5719_A0) { | ||
1755 | val &= ~(TG3_RDMA_RSRVCTRL_TXMRGN_MASK | | ||
1756 | TG3_RDMA_RSRVCTRL_FIFO_LWM_MASK | | ||
1757 | TG3_RDMA_RSRVCTRL_FIFO_HWM_MASK); | ||
1758 | @@ -12255,10 +12255,12 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | ||
1759 | { | ||
1760 | struct tg3 *tp = netdev_priv(dev); | ||
1761 | |||
1762 | - if (!tp->hw_stats) | ||
1763 | + spin_lock_bh(&tp->lock); | ||
1764 | + if (!tp->hw_stats) { | ||
1765 | + spin_unlock_bh(&tp->lock); | ||
1766 | return &tp->net_stats_prev; | ||
1767 | + } | ||
1768 | |||
1769 | - spin_lock_bh(&tp->lock); | ||
1770 | tg3_get_nstats(tp, stats); | ||
1771 | spin_unlock_bh(&tp->lock); | ||
1772 | |||
1773 | diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c | ||
1774 | index e7bed53..24381e1 100644 | ||
1775 | --- a/drivers/net/ethernet/freescale/gianfar.c | ||
1776 | +++ b/drivers/net/ethernet/freescale/gianfar.c | ||
1777 | @@ -2065,10 +2065,9 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1778 | return NETDEV_TX_OK; | ||
1779 | } | ||
1780 | |||
1781 | - /* Steal sock reference for processing TX time stamps */ | ||
1782 | - swap(skb_new->sk, skb->sk); | ||
1783 | - swap(skb_new->destructor, skb->destructor); | ||
1784 | - kfree_skb(skb); | ||
1785 | + if (skb->sk) | ||
1786 | + skb_set_owner_w(skb_new, skb->sk); | ||
1787 | + consume_skb(skb); | ||
1788 | skb = skb_new; | ||
1789 | } | ||
1790 | |||
1791 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c | ||
1792 | index 161e045..a73bbe7 100644 | ||
1793 | --- a/drivers/net/ethernet/realtek/r8169.c | ||
1794 | +++ b/drivers/net/ethernet/realtek/r8169.c | ||
1795 | @@ -5000,7 +5000,6 @@ static void rtl8169_tx_clear(struct rtl8169_private *tp) | ||
1796 | { | ||
1797 | rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC); | ||
1798 | tp->cur_tx = tp->dirty_tx = 0; | ||
1799 | - netdev_reset_queue(tp->dev); | ||
1800 | } | ||
1801 | |||
1802 | static void rtl_reset_work(struct rtl8169_private *tp) | ||
1803 | @@ -5155,8 +5154,6 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | ||
1804 | |||
1805 | txd->opts2 = cpu_to_le32(opts[1]); | ||
1806 | |||
1807 | - netdev_sent_queue(dev, skb->len); | ||
1808 | - | ||
1809 | skb_tx_timestamp(skb); | ||
1810 | |||
1811 | wmb(); | ||
1812 | @@ -5253,16 +5250,9 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) | ||
1813 | rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING); | ||
1814 | } | ||
1815 | |||
1816 | -struct rtl_txc { | ||
1817 | - int packets; | ||
1818 | - int bytes; | ||
1819 | -}; | ||
1820 | - | ||
1821 | static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | ||
1822 | { | ||
1823 | - struct rtl8169_stats *tx_stats = &tp->tx_stats; | ||
1824 | unsigned int dirty_tx, tx_left; | ||
1825 | - struct rtl_txc txc = { 0, 0 }; | ||
1826 | |||
1827 | dirty_tx = tp->dirty_tx; | ||
1828 | smp_rmb(); | ||
1829 | @@ -5281,24 +5271,17 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | ||
1830 | rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb, | ||
1831 | tp->TxDescArray + entry); | ||
1832 | if (status & LastFrag) { | ||
1833 | - struct sk_buff *skb = tx_skb->skb; | ||
1834 | - | ||
1835 | - txc.packets++; | ||
1836 | - txc.bytes += skb->len; | ||
1837 | - dev_kfree_skb(skb); | ||
1838 | + u64_stats_update_begin(&tp->tx_stats.syncp); | ||
1839 | + tp->tx_stats.packets++; | ||
1840 | + tp->tx_stats.bytes += tx_skb->skb->len; | ||
1841 | + u64_stats_update_end(&tp->tx_stats.syncp); | ||
1842 | + dev_kfree_skb(tx_skb->skb); | ||
1843 | tx_skb->skb = NULL; | ||
1844 | } | ||
1845 | dirty_tx++; | ||
1846 | tx_left--; | ||
1847 | } | ||
1848 | |||
1849 | - u64_stats_update_begin(&tx_stats->syncp); | ||
1850 | - tx_stats->packets += txc.packets; | ||
1851 | - tx_stats->bytes += txc.bytes; | ||
1852 | - u64_stats_update_end(&tx_stats->syncp); | ||
1853 | - | ||
1854 | - netdev_completed_queue(dev, txc.packets, txc.bytes); | ||
1855 | - | ||
1856 | if (tp->dirty_tx != dirty_tx) { | ||
1857 | tp->dirty_tx = dirty_tx; | ||
1858 | /* Sync with rtl8169_start_xmit: | ||
1859 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
1860 | index bb8c72c..8f13420 100644 | ||
1861 | --- a/drivers/net/tun.c | ||
1862 | +++ b/drivers/net/tun.c | ||
1863 | @@ -358,6 +358,8 @@ static void tun_free_netdev(struct net_device *dev) | ||
1864 | { | ||
1865 | struct tun_struct *tun = netdev_priv(dev); | ||
1866 | |||
1867 | + BUG_ON(!test_bit(SOCK_EXTERNALLY_ALLOCATED, &tun->socket.flags)); | ||
1868 | + | ||
1869 | sk_release_kernel(tun->socket.sk); | ||
1870 | } | ||
1871 | |||
1872 | @@ -1115,6 +1117,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | ||
1873 | tun->flags = flags; | ||
1874 | tun->txflt.count = 0; | ||
1875 | tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); | ||
1876 | + set_bit(SOCK_EXTERNALLY_ALLOCATED, &tun->socket.flags); | ||
1877 | |||
1878 | err = -ENOMEM; | ||
1879 | sk = sk_alloc(&init_net, AF_UNSPEC, GFP_KERNEL, &tun_proto); | ||
1880 | @@ -1252,10 +1255,12 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, | ||
1881 | int vnet_hdr_sz; | ||
1882 | int ret; | ||
1883 | |||
1884 | - if (cmd == TUNSETIFF || _IOC_TYPE(cmd) == 0x89) | ||
1885 | + if (cmd == TUNSETIFF || _IOC_TYPE(cmd) == 0x89) { | ||
1886 | if (copy_from_user(&ifr, argp, ifreq_len)) | ||
1887 | return -EFAULT; | ||
1888 | - | ||
1889 | + } else { | ||
1890 | + memset(&ifr, 0, sizeof(ifr)); | ||
1891 | + } | ||
1892 | if (cmd == TUNGETFEATURES) { | ||
1893 | /* Currently this just means: "what IFF flags are valid?". | ||
1894 | * This is needed because we never checked for invalid flags on | ||
1895 | diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c | ||
1896 | index df2a2cf..7a6ccd6 100644 | ||
1897 | --- a/drivers/net/usb/kaweth.c | ||
1898 | +++ b/drivers/net/usb/kaweth.c | ||
1899 | @@ -1302,7 +1302,7 @@ static int kaweth_internal_control_msg(struct usb_device *usb_dev, | ||
1900 | int retv; | ||
1901 | int length = 0; /* shut up GCC */ | ||
1902 | |||
1903 | - urb = usb_alloc_urb(0, GFP_NOIO); | ||
1904 | + urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
1905 | if (!urb) | ||
1906 | return -ENOMEM; | ||
1907 | |||
1908 | diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c | ||
1909 | index bef3f24..8be535f 100644 | ||
1910 | --- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c | ||
1911 | +++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c | ||
1912 | @@ -191,6 +191,7 @@ static void iwl_sta_calc_ht_flags(struct iwl_priv *priv, | ||
1913 | mimo_ps_mode = (sta_ht_inf->cap & IEEE80211_HT_CAP_SM_PS) >> 2; | ||
1914 | |||
1915 | IWL_DEBUG_INFO(priv, "STA %pM SM PS mode: %s\n", | ||
1916 | + sta->addr, | ||
1917 | (mimo_ps_mode == WLAN_HT_CAP_SM_PS_STATIC) ? | ||
1918 | "static" : | ||
1919 | (mimo_ps_mode == WLAN_HT_CAP_SM_PS_DYNAMIC) ? | ||
1920 | diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c | ||
1921 | index baf6919..03560a8 100644 | ||
1922 | --- a/drivers/net/wireless/mwifiex/cfg80211.c | ||
1923 | +++ b/drivers/net/wireless/mwifiex/cfg80211.c | ||
1924 | @@ -544,9 +544,9 @@ mwifiex_dump_station_info(struct mwifiex_private *priv, | ||
1925 | |||
1926 | /* | ||
1927 | * Bit 0 in tx_htinfo indicates that current Tx rate is 11n rate. Valid | ||
1928 | - * MCS index values for us are 0 to 7. | ||
1929 | + * MCS index values for us are 0 to 15. | ||
1930 | */ | ||
1931 | - if ((priv->tx_htinfo & BIT(0)) && (priv->tx_rate < 8)) { | ||
1932 | + if ((priv->tx_htinfo & BIT(0)) && (priv->tx_rate < 16)) { | ||
1933 | sinfo->txrate.mcs = priv->tx_rate; | ||
1934 | sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS; | ||
1935 | /* 40MHz rate */ | ||
1936 | diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
1937 | index 5601302..f388b65 100644 | ||
1938 | --- a/drivers/net/wireless/rt2x00/rt2800usb.c | ||
1939 | +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | ||
1940 | @@ -1137,6 +1137,8 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
1941 | #ifdef CONFIG_RT2800USB_RT33XX | ||
1942 | /* Belkin */ | ||
1943 | { USB_DEVICE(0x050d, 0x945b) }, | ||
1944 | + /* D-Link */ | ||
1945 | + { USB_DEVICE(0x2001, 0x3c17) }, | ||
1946 | /* Panasonic */ | ||
1947 | { USB_DEVICE(0x083a, 0xb511) }, | ||
1948 | /* Philips */ | ||
1949 | @@ -1237,7 +1239,6 @@ static struct usb_device_id rt2800usb_device_table[] = { | ||
1950 | /* D-Link */ | ||
1951 | { USB_DEVICE(0x07d1, 0x3c0b) }, | ||
1952 | { USB_DEVICE(0x07d1, 0x3c17) }, | ||
1953 | - { USB_DEVICE(0x2001, 0x3c17) }, | ||
1954 | /* Encore */ | ||
1955 | { USB_DEVICE(0x203d, 0x14a1) }, | ||
1956 | /* Gemtek */ | ||
1957 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c | ||
1958 | index 28fc5fb..46f7917 100644 | ||
1959 | --- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c | ||
1960 | +++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c | ||
1961 | @@ -3344,21 +3344,21 @@ void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw) | ||
1962 | switch (rtlhal->macphymode) { | ||
1963 | case DUALMAC_SINGLEPHY: | ||
1964 | rtlphy->rf_type = RF_2T2R; | ||
1965 | - rtlhal->version |= CHIP_92D_SINGLEPHY; | ||
1966 | + rtlhal->version |= RF_TYPE_2T2R; | ||
1967 | rtlhal->bandset = BAND_ON_BOTH; | ||
1968 | rtlhal->current_bandtype = BAND_ON_2_4G; | ||
1969 | break; | ||
1970 | |||
1971 | case SINGLEMAC_SINGLEPHY: | ||
1972 | rtlphy->rf_type = RF_2T2R; | ||
1973 | - rtlhal->version |= CHIP_92D_SINGLEPHY; | ||
1974 | + rtlhal->version |= RF_TYPE_2T2R; | ||
1975 | rtlhal->bandset = BAND_ON_BOTH; | ||
1976 | rtlhal->current_bandtype = BAND_ON_2_4G; | ||
1977 | break; | ||
1978 | |||
1979 | case DUALMAC_DUALPHY: | ||
1980 | rtlphy->rf_type = RF_1T1R; | ||
1981 | - rtlhal->version &= (~CHIP_92D_SINGLEPHY); | ||
1982 | + rtlhal->version &= RF_TYPE_1T1R; | ||
1983 | /* Now we let MAC0 run on 5G band. */ | ||
1984 | if (rtlhal->interfaceindex == 0) { | ||
1985 | rtlhal->bandset = BAND_ON_5G; | ||
1986 | diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c | ||
1987 | index a6049d7..aa970fc 100644 | ||
1988 | --- a/drivers/net/wireless/rtlwifi/usb.c | ||
1989 | +++ b/drivers/net/wireless/rtlwifi/usb.c | ||
1990 | @@ -131,15 +131,19 @@ static u32 _usb_read_sync(struct rtl_priv *rtlpriv, u32 addr, u16 len) | ||
1991 | u8 request; | ||
1992 | u16 wvalue; | ||
1993 | u16 index; | ||
1994 | - __le32 *data = &rtlpriv->usb_data[rtlpriv->usb_data_index]; | ||
1995 | + __le32 *data; | ||
1996 | + unsigned long flags; | ||
1997 | |||
1998 | + spin_lock_irqsave(&rtlpriv->locks.usb_lock, flags); | ||
1999 | + if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT) | ||
2000 | + rtlpriv->usb_data_index = 0; | ||
2001 | + data = &rtlpriv->usb_data[rtlpriv->usb_data_index]; | ||
2002 | + spin_unlock_irqrestore(&rtlpriv->locks.usb_lock, flags); | ||
2003 | request = REALTEK_USB_VENQT_CMD_REQ; | ||
2004 | index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */ | ||
2005 | |||
2006 | wvalue = (u16)addr; | ||
2007 | _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len); | ||
2008 | - if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT) | ||
2009 | - rtlpriv->usb_data_index = 0; | ||
2010 | return le32_to_cpu(*data); | ||
2011 | } | ||
2012 | |||
2013 | @@ -951,6 +955,10 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, | ||
2014 | GFP_KERNEL); | ||
2015 | if (!rtlpriv->usb_data) | ||
2016 | return -ENOMEM; | ||
2017 | + | ||
2018 | + /* this spin lock must be initialized early */ | ||
2019 | + spin_lock_init(&rtlpriv->locks.usb_lock); | ||
2020 | + | ||
2021 | rtlpriv->usb_data_index = 0; | ||
2022 | init_completion(&rtlpriv->firmware_loading_complete); | ||
2023 | SET_IEEE80211_DEV(hw, &intf->dev); | ||
2024 | diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h | ||
2025 | index 28ebc69..717d3ba 100644 | ||
2026 | --- a/drivers/net/wireless/rtlwifi/wifi.h | ||
2027 | +++ b/drivers/net/wireless/rtlwifi/wifi.h | ||
2028 | @@ -1555,6 +1555,7 @@ struct rtl_locks { | ||
2029 | spinlock_t rf_ps_lock; | ||
2030 | spinlock_t rf_lock; | ||
2031 | spinlock_t waitq_lock; | ||
2032 | + spinlock_t usb_lock; | ||
2033 | |||
2034 | /*Dual mac*/ | ||
2035 | spinlock_t cck_and_rw_pagea_lock; | ||
2036 | diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c | ||
2037 | index f859216..951b6cf 100644 | ||
2038 | --- a/drivers/s390/net/qeth_l3_main.c | ||
2039 | +++ b/drivers/s390/net/qeth_l3_main.c | ||
2040 | @@ -1818,6 +1818,8 @@ static void qeth_l3_free_vlan_addresses4(struct qeth_card *card, | ||
2041 | QETH_CARD_TEXT(card, 4, "frvaddr4"); | ||
2042 | |||
2043 | netdev = __vlan_find_dev_deep(card->dev, vid); | ||
2044 | + if (!netdev) | ||
2045 | + return; | ||
2046 | in_dev = in_dev_get(netdev); | ||
2047 | if (!in_dev) | ||
2048 | return; | ||
2049 | @@ -1846,6 +1848,8 @@ static void qeth_l3_free_vlan_addresses6(struct qeth_card *card, | ||
2050 | QETH_CARD_TEXT(card, 4, "frvaddr6"); | ||
2051 | |||
2052 | netdev = __vlan_find_dev_deep(card->dev, vid); | ||
2053 | + if (!netdev) | ||
2054 | + return; | ||
2055 | in6_dev = in6_dev_get(netdev); | ||
2056 | if (!in6_dev) | ||
2057 | return; | ||
2058 | diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c | ||
2059 | index a3a056a..b48c24f 100644 | ||
2060 | --- a/drivers/scsi/hosts.c | ||
2061 | +++ b/drivers/scsi/hosts.c | ||
2062 | @@ -290,6 +290,7 @@ static void scsi_host_dev_release(struct device *dev) | ||
2063 | struct Scsi_Host *shost = dev_to_shost(dev); | ||
2064 | struct device *parent = dev->parent; | ||
2065 | struct request_queue *q; | ||
2066 | + void *queuedata; | ||
2067 | |||
2068 | scsi_proc_hostdir_rm(shost->hostt); | ||
2069 | |||
2070 | @@ -299,9 +300,9 @@ static void scsi_host_dev_release(struct device *dev) | ||
2071 | destroy_workqueue(shost->work_q); | ||
2072 | q = shost->uspace_req_q; | ||
2073 | if (q) { | ||
2074 | - kfree(q->queuedata); | ||
2075 | - q->queuedata = NULL; | ||
2076 | - scsi_free_queue(q); | ||
2077 | + queuedata = q->queuedata; | ||
2078 | + blk_cleanup_queue(q); | ||
2079 | + kfree(queuedata); | ||
2080 | } | ||
2081 | |||
2082 | scsi_destroy_command_freelist(shost); | ||
2083 | diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c | ||
2084 | index caa0525..101b28e 100644 | ||
2085 | --- a/drivers/scsi/libsas/sas_expander.c | ||
2086 | +++ b/drivers/scsi/libsas/sas_expander.c | ||
2087 | @@ -868,7 +868,7 @@ static struct domain_device *sas_ex_discover_end_dev( | ||
2088 | } | ||
2089 | |||
2090 | /* See if this phy is part of a wide port */ | ||
2091 | -static int sas_ex_join_wide_port(struct domain_device *parent, int phy_id) | ||
2092 | +static bool sas_ex_join_wide_port(struct domain_device *parent, int phy_id) | ||
2093 | { | ||
2094 | struct ex_phy *phy = &parent->ex_dev.ex_phy[phy_id]; | ||
2095 | int i; | ||
2096 | @@ -884,11 +884,11 @@ static int sas_ex_join_wide_port(struct domain_device *parent, int phy_id) | ||
2097 | sas_port_add_phy(ephy->port, phy->phy); | ||
2098 | phy->port = ephy->port; | ||
2099 | phy->phy_state = PHY_DEVICE_DISCOVERED; | ||
2100 | - return 0; | ||
2101 | + return true; | ||
2102 | } | ||
2103 | } | ||
2104 | |||
2105 | - return -ENODEV; | ||
2106 | + return false; | ||
2107 | } | ||
2108 | |||
2109 | static struct domain_device *sas_ex_discover_expander( | ||
2110 | @@ -1030,8 +1030,7 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id) | ||
2111 | return res; | ||
2112 | } | ||
2113 | |||
2114 | - res = sas_ex_join_wide_port(dev, phy_id); | ||
2115 | - if (!res) { | ||
2116 | + if (sas_ex_join_wide_port(dev, phy_id)) { | ||
2117 | SAS_DPRINTK("Attaching ex phy%d to wide port %016llx\n", | ||
2118 | phy_id, SAS_ADDR(ex_phy->attached_sas_addr)); | ||
2119 | return res; | ||
2120 | @@ -1077,8 +1076,7 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id) | ||
2121 | if (SAS_ADDR(ex->ex_phy[i].attached_sas_addr) == | ||
2122 | SAS_ADDR(child->sas_addr)) { | ||
2123 | ex->ex_phy[i].phy_state= PHY_DEVICE_DISCOVERED; | ||
2124 | - res = sas_ex_join_wide_port(dev, i); | ||
2125 | - if (!res) | ||
2126 | + if (sas_ex_join_wide_port(dev, i)) | ||
2127 | SAS_DPRINTK("Attaching ex phy%d to wide port %016llx\n", | ||
2128 | i, SAS_ADDR(ex->ex_phy[i].attached_sas_addr)); | ||
2129 | |||
2130 | @@ -1943,32 +1941,20 @@ static int sas_discover_new(struct domain_device *dev, int phy_id) | ||
2131 | { | ||
2132 | struct ex_phy *ex_phy = &dev->ex_dev.ex_phy[phy_id]; | ||
2133 | struct domain_device *child; | ||
2134 | - bool found = false; | ||
2135 | - int res, i; | ||
2136 | + int res; | ||
2137 | |||
2138 | SAS_DPRINTK("ex %016llx phy%d new device attached\n", | ||
2139 | SAS_ADDR(dev->sas_addr), phy_id); | ||
2140 | res = sas_ex_phy_discover(dev, phy_id); | ||
2141 | if (res) | ||
2142 | - goto out; | ||
2143 | - /* to support the wide port inserted */ | ||
2144 | - for (i = 0; i < dev->ex_dev.num_phys; i++) { | ||
2145 | - struct ex_phy *ex_phy_temp = &dev->ex_dev.ex_phy[i]; | ||
2146 | - if (i == phy_id) | ||
2147 | - continue; | ||
2148 | - if (SAS_ADDR(ex_phy_temp->attached_sas_addr) == | ||
2149 | - SAS_ADDR(ex_phy->attached_sas_addr)) { | ||
2150 | - found = true; | ||
2151 | - break; | ||
2152 | - } | ||
2153 | - } | ||
2154 | - if (found) { | ||
2155 | - sas_ex_join_wide_port(dev, phy_id); | ||
2156 | + return res; | ||
2157 | + | ||
2158 | + if (sas_ex_join_wide_port(dev, phy_id)) | ||
2159 | return 0; | ||
2160 | - } | ||
2161 | + | ||
2162 | res = sas_ex_discover_devices(dev, phy_id); | ||
2163 | - if (!res) | ||
2164 | - goto out; | ||
2165 | + if (res) | ||
2166 | + return res; | ||
2167 | list_for_each_entry(child, &dev->ex_dev.children, siblings) { | ||
2168 | if (SAS_ADDR(child->sas_addr) == | ||
2169 | SAS_ADDR(ex_phy->attached_sas_addr)) { | ||
2170 | @@ -1978,7 +1964,6 @@ static int sas_discover_new(struct domain_device *dev, int phy_id) | ||
2171 | break; | ||
2172 | } | ||
2173 | } | ||
2174 | -out: | ||
2175 | return res; | ||
2176 | } | ||
2177 | |||
2178 | @@ -2109,9 +2094,7 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev) | ||
2179 | struct domain_device *dev = NULL; | ||
2180 | |||
2181 | res = sas_find_bcast_dev(port_dev, &dev); | ||
2182 | - if (res) | ||
2183 | - goto out; | ||
2184 | - if (dev) { | ||
2185 | + while (res == 0 && dev) { | ||
2186 | struct expander_device *ex = &dev->ex_dev; | ||
2187 | int i = 0, phy_id; | ||
2188 | |||
2189 | @@ -2123,8 +2106,10 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev) | ||
2190 | res = sas_rediscover(dev, phy_id); | ||
2191 | i = phy_id + 1; | ||
2192 | } while (i < ex->num_phys); | ||
2193 | + | ||
2194 | + dev = NULL; | ||
2195 | + res = sas_find_bcast_dev(port_dev, &dev); | ||
2196 | } | ||
2197 | -out: | ||
2198 | return res; | ||
2199 | } | ||
2200 | |||
2201 | diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c | ||
2202 | index 386f0c5..cc8dc8c 100644 | ||
2203 | --- a/drivers/scsi/scsi_error.c | ||
2204 | +++ b/drivers/scsi/scsi_error.c | ||
2205 | @@ -1687,6 +1687,20 @@ static void scsi_restart_operations(struct Scsi_Host *shost) | ||
2206 | * requests are started. | ||
2207 | */ | ||
2208 | scsi_run_host_queues(shost); | ||
2209 | + | ||
2210 | + /* | ||
2211 | + * if eh is active and host_eh_scheduled is pending we need to re-run | ||
2212 | + * recovery. we do this check after scsi_run_host_queues() to allow | ||
2213 | + * everything pent up since the last eh run a chance to make forward | ||
2214 | + * progress before we sync again. Either we'll immediately re-run | ||
2215 | + * recovery or scsi_device_unbusy() will wake us again when these | ||
2216 | + * pending commands complete. | ||
2217 | + */ | ||
2218 | + spin_lock_irqsave(shost->host_lock, flags); | ||
2219 | + if (shost->host_eh_scheduled) | ||
2220 | + if (scsi_host_set_state(shost, SHOST_RECOVERY)) | ||
2221 | + WARN_ON(scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY)); | ||
2222 | + spin_unlock_irqrestore(shost->host_lock, flags); | ||
2223 | } | ||
2224 | |||
2225 | /** | ||
2226 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c | ||
2227 | index 4037fd5..1929146 100644 | ||
2228 | --- a/drivers/scsi/scsi_lib.c | ||
2229 | +++ b/drivers/scsi/scsi_lib.c | ||
2230 | @@ -406,10 +406,6 @@ static void scsi_run_queue(struct request_queue *q) | ||
2231 | LIST_HEAD(starved_list); | ||
2232 | unsigned long flags; | ||
2233 | |||
2234 | - /* if the device is dead, sdev will be NULL, so no queue to run */ | ||
2235 | - if (!sdev) | ||
2236 | - return; | ||
2237 | - | ||
2238 | shost = sdev->host; | ||
2239 | if (scsi_target(sdev)->single_lun) | ||
2240 | scsi_single_lun_run(sdev); | ||
2241 | @@ -483,15 +479,26 @@ void scsi_requeue_run_queue(struct work_struct *work) | ||
2242 | */ | ||
2243 | static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd) | ||
2244 | { | ||
2245 | + struct scsi_device *sdev = cmd->device; | ||
2246 | struct request *req = cmd->request; | ||
2247 | unsigned long flags; | ||
2248 | |||
2249 | + /* | ||
2250 | + * We need to hold a reference on the device to avoid the queue being | ||
2251 | + * killed after the unlock and before scsi_run_queue is invoked which | ||
2252 | + * may happen because scsi_unprep_request() puts the command which | ||
2253 | + * releases its reference on the device. | ||
2254 | + */ | ||
2255 | + get_device(&sdev->sdev_gendev); | ||
2256 | + | ||
2257 | spin_lock_irqsave(q->queue_lock, flags); | ||
2258 | scsi_unprep_request(req); | ||
2259 | blk_requeue_request(q, req); | ||
2260 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
2261 | |||
2262 | scsi_run_queue(q); | ||
2263 | + | ||
2264 | + put_device(&sdev->sdev_gendev); | ||
2265 | } | ||
2266 | |||
2267 | void scsi_next_command(struct scsi_cmnd *cmd) | ||
2268 | @@ -1370,16 +1377,16 @@ static inline int scsi_host_queue_ready(struct request_queue *q, | ||
2269 | * may be changed after request stacking drivers call the function, | ||
2270 | * regardless of taking lock or not. | ||
2271 | * | ||
2272 | - * When scsi can't dispatch I/Os anymore and needs to kill I/Os | ||
2273 | - * (e.g. !sdev), scsi needs to return 'not busy'. | ||
2274 | - * Otherwise, request stacking drivers may hold requests forever. | ||
2275 | + * When scsi can't dispatch I/Os anymore and needs to kill I/Os scsi | ||
2276 | + * needs to return 'not busy'. Otherwise, request stacking drivers | ||
2277 | + * may hold requests forever. | ||
2278 | */ | ||
2279 | static int scsi_lld_busy(struct request_queue *q) | ||
2280 | { | ||
2281 | struct scsi_device *sdev = q->queuedata; | ||
2282 | struct Scsi_Host *shost; | ||
2283 | |||
2284 | - if (!sdev) | ||
2285 | + if (blk_queue_dead(q)) | ||
2286 | return 0; | ||
2287 | |||
2288 | shost = sdev->host; | ||
2289 | @@ -1490,12 +1497,6 @@ static void scsi_request_fn(struct request_queue *q) | ||
2290 | struct scsi_cmnd *cmd; | ||
2291 | struct request *req; | ||
2292 | |||
2293 | - if (!sdev) { | ||
2294 | - while ((req = blk_peek_request(q)) != NULL) | ||
2295 | - scsi_kill_request(req, q); | ||
2296 | - return; | ||
2297 | - } | ||
2298 | - | ||
2299 | if(!get_device(&sdev->sdev_gendev)) | ||
2300 | /* We must be tearing the block queue down already */ | ||
2301 | return; | ||
2302 | @@ -1697,20 +1698,6 @@ struct request_queue *scsi_alloc_queue(struct scsi_device *sdev) | ||
2303 | return q; | ||
2304 | } | ||
2305 | |||
2306 | -void scsi_free_queue(struct request_queue *q) | ||
2307 | -{ | ||
2308 | - unsigned long flags; | ||
2309 | - | ||
2310 | - WARN_ON(q->queuedata); | ||
2311 | - | ||
2312 | - /* cause scsi_request_fn() to kill all non-finished requests */ | ||
2313 | - spin_lock_irqsave(q->queue_lock, flags); | ||
2314 | - q->request_fn(q); | ||
2315 | - spin_unlock_irqrestore(q->queue_lock, flags); | ||
2316 | - | ||
2317 | - blk_cleanup_queue(q); | ||
2318 | -} | ||
2319 | - | ||
2320 | /* | ||
2321 | * Function: scsi_block_requests() | ||
2322 | * | ||
2323 | diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h | ||
2324 | index be4fa6d..fd9f57f 100644 | ||
2325 | --- a/drivers/scsi/scsi_priv.h | ||
2326 | +++ b/drivers/scsi/scsi_priv.h | ||
2327 | @@ -84,7 +84,6 @@ extern void scsi_next_command(struct scsi_cmnd *cmd); | ||
2328 | extern void scsi_io_completion(struct scsi_cmnd *, unsigned int); | ||
2329 | extern void scsi_run_host_queues(struct Scsi_Host *shost); | ||
2330 | extern struct request_queue *scsi_alloc_queue(struct scsi_device *sdev); | ||
2331 | -extern void scsi_free_queue(struct request_queue *q); | ||
2332 | extern int scsi_init_queue(void); | ||
2333 | extern void scsi_exit_queue(void); | ||
2334 | struct request_queue; | ||
2335 | diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c | ||
2336 | index 01b0374..8906557 100644 | ||
2337 | --- a/drivers/scsi/scsi_scan.c | ||
2338 | +++ b/drivers/scsi/scsi_scan.c | ||
2339 | @@ -1714,6 +1714,9 @@ static void scsi_sysfs_add_devices(struct Scsi_Host *shost) | ||
2340 | { | ||
2341 | struct scsi_device *sdev; | ||
2342 | shost_for_each_device(sdev, shost) { | ||
2343 | + /* target removed before the device could be added */ | ||
2344 | + if (sdev->sdev_state == SDEV_DEL) | ||
2345 | + continue; | ||
2346 | if (!scsi_host_scan_allowed(shost) || | ||
2347 | scsi_sysfs_add_sdev(sdev) != 0) | ||
2348 | __scsi_remove_device(sdev); | ||
2349 | diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c | ||
2350 | index 04c2a27..bb7c482 100644 | ||
2351 | --- a/drivers/scsi/scsi_sysfs.c | ||
2352 | +++ b/drivers/scsi/scsi_sysfs.c | ||
2353 | @@ -971,11 +971,8 @@ void __scsi_remove_device(struct scsi_device *sdev) | ||
2354 | sdev->host->hostt->slave_destroy(sdev); | ||
2355 | transport_destroy_device(dev); | ||
2356 | |||
2357 | - /* cause the request function to reject all I/O requests */ | ||
2358 | - sdev->request_queue->queuedata = NULL; | ||
2359 | - | ||
2360 | /* Freeing the queue signals to block that we're done */ | ||
2361 | - scsi_free_queue(sdev->request_queue); | ||
2362 | + blk_cleanup_queue(sdev->request_queue); | ||
2363 | put_device(dev); | ||
2364 | } | ||
2365 | |||
2366 | @@ -1000,7 +997,6 @@ static void __scsi_remove_target(struct scsi_target *starget) | ||
2367 | struct scsi_device *sdev; | ||
2368 | |||
2369 | spin_lock_irqsave(shost->host_lock, flags); | ||
2370 | - starget->reap_ref++; | ||
2371 | restart: | ||
2372 | list_for_each_entry(sdev, &shost->__devices, siblings) { | ||
2373 | if (sdev->channel != starget->channel || | ||
2374 | @@ -1014,14 +1010,6 @@ static void __scsi_remove_target(struct scsi_target *starget) | ||
2375 | goto restart; | ||
2376 | } | ||
2377 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
2378 | - scsi_target_reap(starget); | ||
2379 | -} | ||
2380 | - | ||
2381 | -static int __remove_child (struct device * dev, void * data) | ||
2382 | -{ | ||
2383 | - if (scsi_is_target_device(dev)) | ||
2384 | - __scsi_remove_target(to_scsi_target(dev)); | ||
2385 | - return 0; | ||
2386 | } | ||
2387 | |||
2388 | /** | ||
2389 | @@ -1034,14 +1022,34 @@ static int __remove_child (struct device * dev, void * data) | ||
2390 | */ | ||
2391 | void scsi_remove_target(struct device *dev) | ||
2392 | { | ||
2393 | - if (scsi_is_target_device(dev)) { | ||
2394 | - __scsi_remove_target(to_scsi_target(dev)); | ||
2395 | - return; | ||
2396 | + struct Scsi_Host *shost = dev_to_shost(dev->parent); | ||
2397 | + struct scsi_target *starget, *found; | ||
2398 | + unsigned long flags; | ||
2399 | + | ||
2400 | + restart: | ||
2401 | + found = NULL; | ||
2402 | + spin_lock_irqsave(shost->host_lock, flags); | ||
2403 | + list_for_each_entry(starget, &shost->__targets, siblings) { | ||
2404 | + if (starget->state == STARGET_DEL) | ||
2405 | + continue; | ||
2406 | + if (starget->dev.parent == dev || &starget->dev == dev) { | ||
2407 | + found = starget; | ||
2408 | + found->reap_ref++; | ||
2409 | + break; | ||
2410 | + } | ||
2411 | } | ||
2412 | + spin_unlock_irqrestore(shost->host_lock, flags); | ||
2413 | |||
2414 | - get_device(dev); | ||
2415 | - device_for_each_child(dev, NULL, __remove_child); | ||
2416 | - put_device(dev); | ||
2417 | + if (found) { | ||
2418 | + __scsi_remove_target(found); | ||
2419 | + scsi_target_reap(found); | ||
2420 | + /* in the case where @dev has multiple starget children, | ||
2421 | + * continue removing. | ||
2422 | + * | ||
2423 | + * FIXME: does such a case exist? | ||
2424 | + */ | ||
2425 | + goto restart; | ||
2426 | + } | ||
2427 | } | ||
2428 | EXPORT_SYMBOL(scsi_remove_target); | ||
2429 | |||
2430 | diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c | ||
2431 | index 400ae21..469eb28 100644 | ||
2432 | --- a/drivers/spi/spi-pl022.c | ||
2433 | +++ b/drivers/spi/spi-pl022.c | ||
2434 | @@ -489,6 +489,11 @@ static void giveback(struct pl022 *pl022) | ||
2435 | pl022->cur_transfer = NULL; | ||
2436 | pl022->cur_chip = NULL; | ||
2437 | spi_finalize_current_message(pl022->master); | ||
2438 | + | ||
2439 | + /* disable the SPI/SSP operation */ | ||
2440 | + writew((readw(SSP_CR1(pl022->virtbase)) & | ||
2441 | + (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); | ||
2442 | + | ||
2443 | } | ||
2444 | |||
2445 | /** | ||
2446 | diff --git a/drivers/staging/zsmalloc/zsmalloc-main.c b/drivers/staging/zsmalloc/zsmalloc-main.c | ||
2447 | index 917461c..175b3c9 100644 | ||
2448 | --- a/drivers/staging/zsmalloc/zsmalloc-main.c | ||
2449 | +++ b/drivers/staging/zsmalloc/zsmalloc-main.c | ||
2450 | @@ -426,12 +426,6 @@ static struct page *find_get_zspage(struct size_class *class) | ||
2451 | } | ||
2452 | |||
2453 | |||
2454 | -/* | ||
2455 | - * If this becomes a separate module, register zs_init() with | ||
2456 | - * module_init(), zs_exit with module_exit(), and remove zs_initialized | ||
2457 | -*/ | ||
2458 | -static int zs_initialized; | ||
2459 | - | ||
2460 | static int zs_cpu_notifier(struct notifier_block *nb, unsigned long action, | ||
2461 | void *pcpu) | ||
2462 | { | ||
2463 | @@ -490,7 +484,7 @@ fail: | ||
2464 | |||
2465 | struct zs_pool *zs_create_pool(const char *name, gfp_t flags) | ||
2466 | { | ||
2467 | - int i, error, ovhd_size; | ||
2468 | + int i, ovhd_size; | ||
2469 | struct zs_pool *pool; | ||
2470 | |||
2471 | if (!name) | ||
2472 | @@ -517,28 +511,9 @@ struct zs_pool *zs_create_pool(const char *name, gfp_t flags) | ||
2473 | |||
2474 | } | ||
2475 | |||
2476 | - /* | ||
2477 | - * If this becomes a separate module, register zs_init with | ||
2478 | - * module_init, and remove this block | ||
2479 | - */ | ||
2480 | - if (!zs_initialized) { | ||
2481 | - error = zs_init(); | ||
2482 | - if (error) | ||
2483 | - goto cleanup; | ||
2484 | - zs_initialized = 1; | ||
2485 | - } | ||
2486 | - | ||
2487 | pool->flags = flags; | ||
2488 | pool->name = name; | ||
2489 | |||
2490 | - error = 0; /* Success */ | ||
2491 | - | ||
2492 | -cleanup: | ||
2493 | - if (error) { | ||
2494 | - zs_destroy_pool(pool); | ||
2495 | - pool = NULL; | ||
2496 | - } | ||
2497 | - | ||
2498 | return pool; | ||
2499 | } | ||
2500 | EXPORT_SYMBOL_GPL(zs_create_pool); | ||
2501 | @@ -749,3 +724,9 @@ u64 zs_get_total_size_bytes(struct zs_pool *pool) | ||
2502 | return npages << PAGE_SHIFT; | ||
2503 | } | ||
2504 | EXPORT_SYMBOL_GPL(zs_get_total_size_bytes); | ||
2505 | + | ||
2506 | +module_init(zs_init); | ||
2507 | +module_exit(zs_exit); | ||
2508 | + | ||
2509 | +MODULE_LICENSE("Dual BSD/GPL"); | ||
2510 | +MODULE_AUTHOR("Nitin Gupta <ngupta@vflare.org>"); | ||
2511 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
2512 | index 8b1d5e6..e326d17 100644 | ||
2513 | --- a/drivers/target/iscsi/iscsi_target.c | ||
2514 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
2515 | @@ -427,19 +427,8 @@ int iscsit_reset_np_thread( | ||
2516 | |||
2517 | int iscsit_del_np_comm(struct iscsi_np *np) | ||
2518 | { | ||
2519 | - if (!np->np_socket) | ||
2520 | - return 0; | ||
2521 | - | ||
2522 | - /* | ||
2523 | - * Some network transports allocate their own struct sock->file, | ||
2524 | - * see if we need to free any additional allocated resources. | ||
2525 | - */ | ||
2526 | - if (np->np_flags & NPF_SCTP_STRUCT_FILE) { | ||
2527 | - kfree(np->np_socket->file); | ||
2528 | - np->np_socket->file = NULL; | ||
2529 | - } | ||
2530 | - | ||
2531 | - sock_release(np->np_socket); | ||
2532 | + if (np->np_socket) | ||
2533 | + sock_release(np->np_socket); | ||
2534 | return 0; | ||
2535 | } | ||
2536 | |||
2537 | @@ -4094,13 +4083,8 @@ int iscsit_close_connection( | ||
2538 | kfree(conn->conn_ops); | ||
2539 | conn->conn_ops = NULL; | ||
2540 | |||
2541 | - if (conn->sock) { | ||
2542 | - if (conn->conn_flags & CONNFLAG_SCTP_STRUCT_FILE) { | ||
2543 | - kfree(conn->sock->file); | ||
2544 | - conn->sock->file = NULL; | ||
2545 | - } | ||
2546 | + if (conn->sock) | ||
2547 | sock_release(conn->sock); | ||
2548 | - } | ||
2549 | conn->thread_set = NULL; | ||
2550 | |||
2551 | pr_debug("Moving to TARG_CONN_STATE_FREE.\n"); | ||
2552 | diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h | ||
2553 | index 2aaee7e..d1c4bc2 100644 | ||
2554 | --- a/drivers/target/iscsi/iscsi_target_core.h | ||
2555 | +++ b/drivers/target/iscsi/iscsi_target_core.h | ||
2556 | @@ -224,7 +224,6 @@ enum iscsi_timer_flags_table { | ||
2557 | /* Used for struct iscsi_np->np_flags */ | ||
2558 | enum np_flags_table { | ||
2559 | NPF_IP_NETWORK = 0x00, | ||
2560 | - NPF_SCTP_STRUCT_FILE = 0x01 /* Bugfix */ | ||
2561 | }; | ||
2562 | |||
2563 | /* Used for struct iscsi_np->np_thread_state */ | ||
2564 | @@ -511,7 +510,6 @@ struct iscsi_conn { | ||
2565 | u16 local_port; | ||
2566 | int net_size; | ||
2567 | u32 auth_id; | ||
2568 | -#define CONNFLAG_SCTP_STRUCT_FILE 0x01 | ||
2569 | u32 conn_flags; | ||
2570 | /* Used for iscsi_tx_login_rsp() */ | ||
2571 | u32 login_itt; | ||
2572 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c | ||
2573 | index a3656c9..ae30424 100644 | ||
2574 | --- a/drivers/target/iscsi/iscsi_target_login.c | ||
2575 | +++ b/drivers/target/iscsi/iscsi_target_login.c | ||
2576 | @@ -795,22 +795,6 @@ int iscsi_target_setup_login_socket( | ||
2577 | } | ||
2578 | np->np_socket = sock; | ||
2579 | /* | ||
2580 | - * The SCTP stack needs struct socket->file. | ||
2581 | - */ | ||
2582 | - if ((np->np_network_transport == ISCSI_SCTP_TCP) || | ||
2583 | - (np->np_network_transport == ISCSI_SCTP_UDP)) { | ||
2584 | - if (!sock->file) { | ||
2585 | - sock->file = kzalloc(sizeof(struct file), GFP_KERNEL); | ||
2586 | - if (!sock->file) { | ||
2587 | - pr_err("Unable to allocate struct" | ||
2588 | - " file for SCTP\n"); | ||
2589 | - ret = -ENOMEM; | ||
2590 | - goto fail; | ||
2591 | - } | ||
2592 | - np->np_flags |= NPF_SCTP_STRUCT_FILE; | ||
2593 | - } | ||
2594 | - } | ||
2595 | - /* | ||
2596 | * Setup the np->np_sockaddr from the passed sockaddr setup | ||
2597 | * in iscsi_target_configfs.c code.. | ||
2598 | */ | ||
2599 | @@ -869,21 +853,15 @@ int iscsi_target_setup_login_socket( | ||
2600 | |||
2601 | fail: | ||
2602 | np->np_socket = NULL; | ||
2603 | - if (sock) { | ||
2604 | - if (np->np_flags & NPF_SCTP_STRUCT_FILE) { | ||
2605 | - kfree(sock->file); | ||
2606 | - sock->file = NULL; | ||
2607 | - } | ||
2608 | - | ||
2609 | + if (sock) | ||
2610 | sock_release(sock); | ||
2611 | - } | ||
2612 | return ret; | ||
2613 | } | ||
2614 | |||
2615 | static int __iscsi_target_login_thread(struct iscsi_np *np) | ||
2616 | { | ||
2617 | u8 buffer[ISCSI_HDR_LEN], iscsi_opcode, zero_tsih = 0; | ||
2618 | - int err, ret = 0, set_sctp_conn_flag, stop; | ||
2619 | + int err, ret = 0, stop; | ||
2620 | struct iscsi_conn *conn = NULL; | ||
2621 | struct iscsi_login *login; | ||
2622 | struct iscsi_portal_group *tpg = NULL; | ||
2623 | @@ -894,7 +872,6 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | ||
2624 | struct sockaddr_in6 sock_in6; | ||
2625 | |||
2626 | flush_signals(current); | ||
2627 | - set_sctp_conn_flag = 0; | ||
2628 | sock = np->np_socket; | ||
2629 | |||
2630 | spin_lock_bh(&np->np_thread_lock); | ||
2631 | @@ -917,35 +894,12 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | ||
2632 | spin_unlock_bh(&np->np_thread_lock); | ||
2633 | goto out; | ||
2634 | } | ||
2635 | - /* | ||
2636 | - * The SCTP stack needs struct socket->file. | ||
2637 | - */ | ||
2638 | - if ((np->np_network_transport == ISCSI_SCTP_TCP) || | ||
2639 | - (np->np_network_transport == ISCSI_SCTP_UDP)) { | ||
2640 | - if (!new_sock->file) { | ||
2641 | - new_sock->file = kzalloc( | ||
2642 | - sizeof(struct file), GFP_KERNEL); | ||
2643 | - if (!new_sock->file) { | ||
2644 | - pr_err("Unable to allocate struct" | ||
2645 | - " file for SCTP\n"); | ||
2646 | - sock_release(new_sock); | ||
2647 | - /* Get another socket */ | ||
2648 | - return 1; | ||
2649 | - } | ||
2650 | - set_sctp_conn_flag = 1; | ||
2651 | - } | ||
2652 | - } | ||
2653 | - | ||
2654 | iscsi_start_login_thread_timer(np); | ||
2655 | |||
2656 | conn = kzalloc(sizeof(struct iscsi_conn), GFP_KERNEL); | ||
2657 | if (!conn) { | ||
2658 | pr_err("Could not allocate memory for" | ||
2659 | " new connection\n"); | ||
2660 | - if (set_sctp_conn_flag) { | ||
2661 | - kfree(new_sock->file); | ||
2662 | - new_sock->file = NULL; | ||
2663 | - } | ||
2664 | sock_release(new_sock); | ||
2665 | /* Get another socket */ | ||
2666 | return 1; | ||
2667 | @@ -955,9 +909,6 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) | ||
2668 | conn->conn_state = TARG_CONN_STATE_FREE; | ||
2669 | conn->sock = new_sock; | ||
2670 | |||
2671 | - if (set_sctp_conn_flag) | ||
2672 | - conn->conn_flags |= CONNFLAG_SCTP_STRUCT_FILE; | ||
2673 | - | ||
2674 | pr_debug("Moving to TARG_CONN_STATE_XPT_UP.\n"); | ||
2675 | conn->conn_state = TARG_CONN_STATE_XPT_UP; | ||
2676 | |||
2677 | @@ -1205,13 +1156,8 @@ old_sess_out: | ||
2678 | iscsi_release_param_list(conn->param_list); | ||
2679 | conn->param_list = NULL; | ||
2680 | } | ||
2681 | - if (conn->sock) { | ||
2682 | - if (conn->conn_flags & CONNFLAG_SCTP_STRUCT_FILE) { | ||
2683 | - kfree(conn->sock->file); | ||
2684 | - conn->sock->file = NULL; | ||
2685 | - } | ||
2686 | + if (conn->sock) | ||
2687 | sock_release(conn->sock); | ||
2688 | - } | ||
2689 | kfree(conn); | ||
2690 | |||
2691 | if (tpg) { | ||
2692 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
2693 | index 443704f..0686d61 100644 | ||
2694 | --- a/drivers/target/target_core_transport.c | ||
2695 | +++ b/drivers/target/target_core_transport.c | ||
2696 | @@ -1976,6 +1976,7 @@ void transport_generic_request_failure(struct se_cmd *cmd) | ||
2697 | case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: | ||
2698 | case TCM_UNKNOWN_MODE_PAGE: | ||
2699 | case TCM_WRITE_PROTECTED: | ||
2700 | + case TCM_ADDRESS_OUT_OF_RANGE: | ||
2701 | case TCM_CHECK_CONDITION_ABORT_CMD: | ||
2702 | case TCM_CHECK_CONDITION_UNIT_ATTENTION: | ||
2703 | case TCM_CHECK_CONDITION_NOT_READY: | ||
2704 | @@ -4656,6 +4657,15 @@ int transport_send_check_condition_and_sense( | ||
2705 | /* WRITE PROTECTED */ | ||
2706 | buffer[offset+SPC_ASC_KEY_OFFSET] = 0x27; | ||
2707 | break; | ||
2708 | + case TCM_ADDRESS_OUT_OF_RANGE: | ||
2709 | + /* CURRENT ERROR */ | ||
2710 | + buffer[offset] = 0x70; | ||
2711 | + buffer[offset+SPC_ADD_SENSE_LEN_OFFSET] = 10; | ||
2712 | + /* ILLEGAL REQUEST */ | ||
2713 | + buffer[offset+SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; | ||
2714 | + /* LOGICAL BLOCK ADDRESS OUT OF RANGE */ | ||
2715 | + buffer[offset+SPC_ASC_KEY_OFFSET] = 0x21; | ||
2716 | + break; | ||
2717 | case TCM_CHECK_CONDITION_UNIT_ATTENTION: | ||
2718 | /* CURRENT ERROR */ | ||
2719 | buffer[offset] = 0x70; | ||
2720 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
2721 | index 4e57772..404413b 100644 | ||
2722 | --- a/drivers/usb/core/devio.c | ||
2723 | +++ b/drivers/usb/core/devio.c | ||
2724 | @@ -1615,10 +1615,14 @@ static int processcompl_compat(struct async *as, void __user * __user *arg) | ||
2725 | void __user *addr = as->userurb; | ||
2726 | unsigned int i; | ||
2727 | |||
2728 | - if (as->userbuffer && urb->actual_length) | ||
2729 | - if (copy_to_user(as->userbuffer, urb->transfer_buffer, | ||
2730 | - urb->actual_length)) | ||
2731 | + if (as->userbuffer && urb->actual_length) { | ||
2732 | + if (urb->number_of_packets > 0) /* Isochronous */ | ||
2733 | + i = urb->transfer_buffer_length; | ||
2734 | + else /* Non-Isoc */ | ||
2735 | + i = urb->actual_length; | ||
2736 | + if (copy_to_user(as->userbuffer, urb->transfer_buffer, i)) | ||
2737 | return -EFAULT; | ||
2738 | + } | ||
2739 | if (put_user(as->status, &userurb->status)) | ||
2740 | return -EFAULT; | ||
2741 | if (put_user(urb->actual_length, &userurb->actual_length)) | ||
2742 | diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c | ||
2743 | index 1fc8f12..347bb05 100644 | ||
2744 | --- a/drivers/usb/early/ehci-dbgp.c | ||
2745 | +++ b/drivers/usb/early/ehci-dbgp.c | ||
2746 | @@ -450,7 +450,7 @@ static int dbgp_ehci_startup(void) | ||
2747 | writel(FLAG_CF, &ehci_regs->configured_flag); | ||
2748 | |||
2749 | /* Wait until the controller is no longer halted */ | ||
2750 | - loop = 10; | ||
2751 | + loop = 1000; | ||
2752 | do { | ||
2753 | status = readl(&ehci_regs->status); | ||
2754 | if (!(status & STS_HALT)) | ||
2755 | diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c | ||
2756 | index 29c854b..4e1f0aa 100644 | ||
2757 | --- a/drivers/usb/gadget/u_ether.c | ||
2758 | +++ b/drivers/usb/gadget/u_ether.c | ||
2759 | @@ -796,12 +796,6 @@ int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]) | ||
2760 | |||
2761 | SET_ETHTOOL_OPS(net, &ops); | ||
2762 | |||
2763 | - /* two kinds of host-initiated state changes: | ||
2764 | - * - iff DATA transfer is active, carrier is "on" | ||
2765 | - * - tx queueing enabled if open *and* carrier is "on" | ||
2766 | - */ | ||
2767 | - netif_carrier_off(net); | ||
2768 | - | ||
2769 | dev->gadget = g; | ||
2770 | SET_NETDEV_DEV(net, &g->dev); | ||
2771 | SET_NETDEV_DEVTYPE(net, &gadget_type); | ||
2772 | @@ -815,6 +809,12 @@ int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]) | ||
2773 | INFO(dev, "HOST MAC %pM\n", dev->host_mac); | ||
2774 | |||
2775 | the_dev = dev; | ||
2776 | + | ||
2777 | + /* two kinds of host-initiated state changes: | ||
2778 | + * - iff DATA transfer is active, carrier is "on" | ||
2779 | + * - tx queueing enabled if open *and* carrier is "on" | ||
2780 | + */ | ||
2781 | + netif_carrier_off(net); | ||
2782 | } | ||
2783 | |||
2784 | return status; | ||
2785 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
2786 | index 49484b3..ae1a4b8 100644 | ||
2787 | --- a/drivers/usb/serial/option.c | ||
2788 | +++ b/drivers/usb/serial/option.c | ||
2789 | @@ -936,6 +936,8 @@ static const struct usb_device_id option_ids[] = { | ||
2790 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | ||
2791 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), | ||
2792 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
2793 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), | ||
2794 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
2795 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), | ||
2796 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
2797 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), | ||
2798 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c | ||
2799 | index 8ec8a6e..f98ba40 100644 | ||
2800 | --- a/drivers/usb/storage/uas.c | ||
2801 | +++ b/drivers/usb/storage/uas.c | ||
2802 | @@ -58,9 +58,6 @@ enum { | ||
2803 | SUBMIT_DATA_OUT_URB = (1 << 5), | ||
2804 | ALLOC_CMD_URB = (1 << 6), | ||
2805 | SUBMIT_CMD_URB = (1 << 7), | ||
2806 | - COMPLETED_DATA_IN = (1 << 8), | ||
2807 | - COMPLETED_DATA_OUT = (1 << 9), | ||
2808 | - DATA_COMPLETES_CMD = (1 << 10), | ||
2809 | }; | ||
2810 | |||
2811 | /* Overrides scsi_pointer */ | ||
2812 | @@ -114,7 +111,6 @@ static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd) | ||
2813 | { | ||
2814 | struct sense_iu *sense_iu = urb->transfer_buffer; | ||
2815 | struct scsi_device *sdev = cmnd->device; | ||
2816 | - struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
2817 | |||
2818 | if (urb->actual_length > 16) { | ||
2819 | unsigned len = be16_to_cpup(&sense_iu->len); | ||
2820 | @@ -132,15 +128,13 @@ static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd) | ||
2821 | } | ||
2822 | |||
2823 | cmnd->result = sense_iu->status; | ||
2824 | - if (!(cmdinfo->state & DATA_COMPLETES_CMD)) | ||
2825 | - cmnd->scsi_done(cmnd); | ||
2826 | + cmnd->scsi_done(cmnd); | ||
2827 | } | ||
2828 | |||
2829 | static void uas_sense_old(struct urb *urb, struct scsi_cmnd *cmnd) | ||
2830 | { | ||
2831 | struct sense_iu_old *sense_iu = urb->transfer_buffer; | ||
2832 | struct scsi_device *sdev = cmnd->device; | ||
2833 | - struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
2834 | |||
2835 | if (urb->actual_length > 8) { | ||
2836 | unsigned len = be16_to_cpup(&sense_iu->len) - 2; | ||
2837 | @@ -158,8 +152,7 @@ static void uas_sense_old(struct urb *urb, struct scsi_cmnd *cmnd) | ||
2838 | } | ||
2839 | |||
2840 | cmnd->result = sense_iu->status; | ||
2841 | - if (!(cmdinfo->state & DATA_COMPLETES_CMD)) | ||
2842 | - cmnd->scsi_done(cmnd); | ||
2843 | + cmnd->scsi_done(cmnd); | ||
2844 | } | ||
2845 | |||
2846 | static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd, | ||
2847 | @@ -184,7 +177,6 @@ static void uas_stat_cmplt(struct urb *urb) | ||
2848 | struct Scsi_Host *shost = urb->context; | ||
2849 | struct uas_dev_info *devinfo = (void *)shost->hostdata[0]; | ||
2850 | struct scsi_cmnd *cmnd; | ||
2851 | - struct uas_cmd_info *cmdinfo; | ||
2852 | u16 tag; | ||
2853 | int ret; | ||
2854 | |||
2855 | @@ -210,32 +202,12 @@ static void uas_stat_cmplt(struct urb *urb) | ||
2856 | dev_err(&urb->dev->dev, "failed submit status urb\n"); | ||
2857 | return; | ||
2858 | } | ||
2859 | - cmdinfo = (void *)&cmnd->SCp; | ||
2860 | |||
2861 | switch (iu->iu_id) { | ||
2862 | case IU_ID_STATUS: | ||
2863 | if (devinfo->cmnd == cmnd) | ||
2864 | devinfo->cmnd = NULL; | ||
2865 | |||
2866 | - if (!(cmdinfo->state & COMPLETED_DATA_IN) && | ||
2867 | - cmdinfo->data_in_urb) { | ||
2868 | - if (devinfo->use_streams) { | ||
2869 | - cmdinfo->state |= DATA_COMPLETES_CMD; | ||
2870 | - usb_unlink_urb(cmdinfo->data_in_urb); | ||
2871 | - } else { | ||
2872 | - usb_free_urb(cmdinfo->data_in_urb); | ||
2873 | - } | ||
2874 | - } | ||
2875 | - if (!(cmdinfo->state & COMPLETED_DATA_OUT) && | ||
2876 | - cmdinfo->data_out_urb) { | ||
2877 | - if (devinfo->use_streams) { | ||
2878 | - cmdinfo->state |= DATA_COMPLETES_CMD; | ||
2879 | - usb_unlink_urb(cmdinfo->data_in_urb); | ||
2880 | - } else { | ||
2881 | - usb_free_urb(cmdinfo->data_out_urb); | ||
2882 | - } | ||
2883 | - } | ||
2884 | - | ||
2885 | if (urb->actual_length < 16) | ||
2886 | devinfo->uas_sense_old = 1; | ||
2887 | if (devinfo->uas_sense_old) | ||
2888 | @@ -264,59 +236,27 @@ static void uas_stat_cmplt(struct urb *urb) | ||
2889 | dev_err(&urb->dev->dev, "failed submit status urb\n"); | ||
2890 | } | ||
2891 | |||
2892 | -static void uas_data_out_cmplt(struct urb *urb) | ||
2893 | -{ | ||
2894 | - struct scsi_cmnd *cmnd = urb->context; | ||
2895 | - struct scsi_data_buffer *sdb = scsi_out(cmnd); | ||
2896 | - struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
2897 | - | ||
2898 | - cmdinfo->state |= COMPLETED_DATA_OUT; | ||
2899 | - | ||
2900 | - sdb->resid = sdb->length - urb->actual_length; | ||
2901 | - usb_free_urb(urb); | ||
2902 | - | ||
2903 | - if (cmdinfo->state & DATA_COMPLETES_CMD) | ||
2904 | - cmnd->scsi_done(cmnd); | ||
2905 | -} | ||
2906 | - | ||
2907 | -static void uas_data_in_cmplt(struct urb *urb) | ||
2908 | +static void uas_data_cmplt(struct urb *urb) | ||
2909 | { | ||
2910 | - struct scsi_cmnd *cmnd = urb->context; | ||
2911 | - struct scsi_data_buffer *sdb = scsi_in(cmnd); | ||
2912 | - struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
2913 | - | ||
2914 | - cmdinfo->state |= COMPLETED_DATA_IN; | ||
2915 | - | ||
2916 | + struct scsi_data_buffer *sdb = urb->context; | ||
2917 | sdb->resid = sdb->length - urb->actual_length; | ||
2918 | usb_free_urb(urb); | ||
2919 | - | ||
2920 | - if (cmdinfo->state & DATA_COMPLETES_CMD) | ||
2921 | - cmnd->scsi_done(cmnd); | ||
2922 | } | ||
2923 | |||
2924 | static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, | ||
2925 | - unsigned int pipe, struct scsi_cmnd *cmnd, | ||
2926 | - enum dma_data_direction dir) | ||
2927 | + unsigned int pipe, u16 stream_id, | ||
2928 | + struct scsi_data_buffer *sdb, | ||
2929 | + enum dma_data_direction dir) | ||
2930 | { | ||
2931 | - struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | ||
2932 | struct usb_device *udev = devinfo->udev; | ||
2933 | struct urb *urb = usb_alloc_urb(0, gfp); | ||
2934 | - struct scsi_data_buffer *sdb; | ||
2935 | - usb_complete_t complete_fn; | ||
2936 | - u16 stream_id = cmdinfo->stream; | ||
2937 | |||
2938 | if (!urb) | ||
2939 | goto out; | ||
2940 | - if (dir == DMA_FROM_DEVICE) { | ||
2941 | - sdb = scsi_in(cmnd); | ||
2942 | - complete_fn = uas_data_in_cmplt; | ||
2943 | - } else { | ||
2944 | - sdb = scsi_out(cmnd); | ||
2945 | - complete_fn = uas_data_out_cmplt; | ||
2946 | - } | ||
2947 | - usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length, | ||
2948 | - complete_fn, cmnd); | ||
2949 | - urb->stream_id = stream_id; | ||
2950 | + usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length, uas_data_cmplt, | ||
2951 | + sdb); | ||
2952 | + if (devinfo->use_streams) | ||
2953 | + urb->stream_id = stream_id; | ||
2954 | urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0; | ||
2955 | urb->sg = sdb->table.sgl; | ||
2956 | out: | ||
2957 | @@ -418,8 +358,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | ||
2958 | |||
2959 | if (cmdinfo->state & ALLOC_DATA_IN_URB) { | ||
2960 | cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, gfp, | ||
2961 | - devinfo->data_in_pipe, cmnd, | ||
2962 | - DMA_FROM_DEVICE); | ||
2963 | + devinfo->data_in_pipe, cmdinfo->stream, | ||
2964 | + scsi_in(cmnd), DMA_FROM_DEVICE); | ||
2965 | if (!cmdinfo->data_in_urb) | ||
2966 | return SCSI_MLQUEUE_DEVICE_BUSY; | ||
2967 | cmdinfo->state &= ~ALLOC_DATA_IN_URB; | ||
2968 | @@ -436,8 +376,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | ||
2969 | |||
2970 | if (cmdinfo->state & ALLOC_DATA_OUT_URB) { | ||
2971 | cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, gfp, | ||
2972 | - devinfo->data_out_pipe, cmnd, | ||
2973 | - DMA_TO_DEVICE); | ||
2974 | + devinfo->data_out_pipe, cmdinfo->stream, | ||
2975 | + scsi_out(cmnd), DMA_TO_DEVICE); | ||
2976 | if (!cmdinfo->data_out_urb) | ||
2977 | return SCSI_MLQUEUE_DEVICE_BUSY; | ||
2978 | cmdinfo->state &= ~ALLOC_DATA_OUT_URB; | ||
2979 | diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c | ||
2980 | index 4270414..58b7d14 100644 | ||
2981 | --- a/fs/btrfs/async-thread.c | ||
2982 | +++ b/fs/btrfs/async-thread.c | ||
2983 | @@ -206,10 +206,17 @@ static noinline void run_ordered_completions(struct btrfs_workers *workers, | ||
2984 | |||
2985 | work->ordered_func(work); | ||
2986 | |||
2987 | - /* now take the lock again and call the freeing code */ | ||
2988 | + /* now take the lock again and drop our item from the list */ | ||
2989 | spin_lock(&workers->order_lock); | ||
2990 | list_del(&work->order_list); | ||
2991 | + spin_unlock(&workers->order_lock); | ||
2992 | + | ||
2993 | + /* | ||
2994 | + * we don't want to call the ordered free functions | ||
2995 | + * with the lock held though | ||
2996 | + */ | ||
2997 | work->ordered_free(work); | ||
2998 | + spin_lock(&workers->order_lock); | ||
2999 | } | ||
3000 | |||
3001 | spin_unlock(&workers->order_lock); | ||
3002 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
3003 | index 87ce8af..65a78e9 100644 | ||
3004 | --- a/fs/cifs/connect.c | ||
3005 | +++ b/fs/cifs/connect.c | ||
3006 | @@ -238,8 +238,8 @@ static const match_table_t cifs_mount_option_tokens = { | ||
3007 | enum { | ||
3008 | Opt_sec_krb5, Opt_sec_krb5i, Opt_sec_krb5p, | ||
3009 | Opt_sec_ntlmsspi, Opt_sec_ntlmssp, | ||
3010 | - Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2i, | ||
3011 | - Opt_sec_nontlm, Opt_sec_lanman, | ||
3012 | + Opt_ntlm, Opt_sec_ntlmi, Opt_sec_ntlmv2, | ||
3013 | + Opt_sec_ntlmv2i, Opt_sec_lanman, | ||
3014 | Opt_sec_none, | ||
3015 | |||
3016 | Opt_sec_err | ||
3017 | @@ -253,8 +253,9 @@ static const match_table_t cifs_secflavor_tokens = { | ||
3018 | { Opt_sec_ntlmssp, "ntlmssp" }, | ||
3019 | { Opt_ntlm, "ntlm" }, | ||
3020 | { Opt_sec_ntlmi, "ntlmi" }, | ||
3021 | + { Opt_sec_ntlmv2, "nontlm" }, | ||
3022 | + { Opt_sec_ntlmv2, "ntlmv2" }, | ||
3023 | { Opt_sec_ntlmv2i, "ntlmv2i" }, | ||
3024 | - { Opt_sec_nontlm, "nontlm" }, | ||
3025 | { Opt_sec_lanman, "lanman" }, | ||
3026 | { Opt_sec_none, "none" }, | ||
3027 | |||
3028 | @@ -1163,7 +1164,7 @@ static int cifs_parse_security_flavors(char *value, | ||
3029 | case Opt_sec_ntlmi: | ||
3030 | vol->secFlg |= CIFSSEC_MAY_NTLM | CIFSSEC_MUST_SIGN; | ||
3031 | break; | ||
3032 | - case Opt_sec_nontlm: | ||
3033 | + case Opt_sec_ntlmv2: | ||
3034 | vol->secFlg |= CIFSSEC_MAY_NTLMV2; | ||
3035 | break; | ||
3036 | case Opt_sec_ntlmv2i: | ||
3037 | diff --git a/fs/exec.c b/fs/exec.c | ||
3038 | index 29e5f84..126e01c 100644 | ||
3039 | --- a/fs/exec.c | ||
3040 | +++ b/fs/exec.c | ||
3041 | @@ -1024,7 +1024,7 @@ static void flush_old_files(struct files_struct * files) | ||
3042 | unsigned long set, i; | ||
3043 | |||
3044 | j++; | ||
3045 | - i = j * __NFDBITS; | ||
3046 | + i = j * BITS_PER_LONG; | ||
3047 | fdt = files_fdtable(files); | ||
3048 | if (i >= fdt->max_fds) | ||
3049 | break; | ||
3050 | diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c | ||
3051 | index 8da837b..df76291 100644 | ||
3052 | --- a/fs/ext4/balloc.c | ||
3053 | +++ b/fs/ext4/balloc.c | ||
3054 | @@ -584,7 +584,8 @@ ext4_fsblk_t ext4_count_free_clusters(struct super_block *sb) | ||
3055 | if (bitmap_bh == NULL) | ||
3056 | continue; | ||
3057 | |||
3058 | - x = ext4_count_free(bitmap_bh, sb->s_blocksize); | ||
3059 | + x = ext4_count_free(bitmap_bh->b_data, | ||
3060 | + EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
3061 | printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n", | ||
3062 | i, ext4_free_group_clusters(sb, gdp), x); | ||
3063 | bitmap_count += x; | ||
3064 | diff --git a/fs/ext4/bitmap.c b/fs/ext4/bitmap.c | ||
3065 | index fa3af81..bbde5d5 100644 | ||
3066 | --- a/fs/ext4/bitmap.c | ||
3067 | +++ b/fs/ext4/bitmap.c | ||
3068 | @@ -11,21 +11,15 @@ | ||
3069 | #include <linux/jbd2.h> | ||
3070 | #include "ext4.h" | ||
3071 | |||
3072 | -#ifdef EXT4FS_DEBUG | ||
3073 | - | ||
3074 | static const int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; | ||
3075 | |||
3076 | -unsigned int ext4_count_free(struct buffer_head *map, unsigned int numchars) | ||
3077 | +unsigned int ext4_count_free(char *bitmap, unsigned int numchars) | ||
3078 | { | ||
3079 | unsigned int i, sum = 0; | ||
3080 | |||
3081 | - if (!map) | ||
3082 | - return 0; | ||
3083 | for (i = 0; i < numchars; i++) | ||
3084 | - sum += nibblemap[map->b_data[i] & 0xf] + | ||
3085 | - nibblemap[(map->b_data[i] >> 4) & 0xf]; | ||
3086 | + sum += nibblemap[bitmap[i] & 0xf] + | ||
3087 | + nibblemap[(bitmap[i] >> 4) & 0xf]; | ||
3088 | return sum; | ||
3089 | } | ||
3090 | |||
3091 | -#endif /* EXT4FS_DEBUG */ | ||
3092 | - | ||
3093 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
3094 | index 0e01e90..47d1c8c 100644 | ||
3095 | --- a/fs/ext4/ext4.h | ||
3096 | +++ b/fs/ext4/ext4.h | ||
3097 | @@ -1140,8 +1140,7 @@ struct ext4_sb_info { | ||
3098 | unsigned long s_desc_per_block; /* Number of group descriptors per block */ | ||
3099 | ext4_group_t s_groups_count; /* Number of groups in the fs */ | ||
3100 | ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */ | ||
3101 | - unsigned long s_overhead_last; /* Last calculated overhead */ | ||
3102 | - unsigned long s_blocks_last; /* Last seen block count */ | ||
3103 | + unsigned long s_overhead; /* # of fs overhead clusters */ | ||
3104 | unsigned int s_cluster_ratio; /* Number of blocks per cluster */ | ||
3105 | unsigned int s_cluster_bits; /* log2 of s_cluster_ratio */ | ||
3106 | loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ | ||
3107 | @@ -1783,7 +1782,7 @@ struct mmpd_data { | ||
3108 | # define NORET_AND noreturn, | ||
3109 | |||
3110 | /* bitmap.c */ | ||
3111 | -extern unsigned int ext4_count_free(struct buffer_head *, unsigned); | ||
3112 | +extern unsigned int ext4_count_free(char *bitmap, unsigned numchars); | ||
3113 | |||
3114 | /* balloc.c */ | ||
3115 | extern unsigned int ext4_block_group(struct super_block *sb, | ||
3116 | @@ -1950,6 +1949,7 @@ extern int ext4_group_extend(struct super_block *sb, | ||
3117 | extern int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count); | ||
3118 | |||
3119 | /* super.c */ | ||
3120 | +extern int ext4_calculate_overhead(struct super_block *sb); | ||
3121 | extern void *ext4_kvmalloc(size_t size, gfp_t flags); | ||
3122 | extern void *ext4_kvzalloc(size_t size, gfp_t flags); | ||
3123 | extern void ext4_kvfree(void *ptr); | ||
3124 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
3125 | index abcdeab..6b7daa4 100644 | ||
3126 | --- a/fs/ext4/extents.c | ||
3127 | +++ b/fs/ext4/extents.c | ||
3128 | @@ -2503,10 +2503,10 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, | ||
3129 | { | ||
3130 | struct super_block *sb = inode->i_sb; | ||
3131 | int depth = ext_depth(inode); | ||
3132 | - struct ext4_ext_path *path; | ||
3133 | + struct ext4_ext_path *path = NULL; | ||
3134 | ext4_fsblk_t partial_cluster = 0; | ||
3135 | handle_t *handle; | ||
3136 | - int i, err; | ||
3137 | + int i = 0, err; | ||
3138 | |||
3139 | ext_debug("truncate since %u to %u\n", start, end); | ||
3140 | |||
3141 | @@ -2539,8 +2539,12 @@ again: | ||
3142 | } | ||
3143 | depth = ext_depth(inode); | ||
3144 | ex = path[depth].p_ext; | ||
3145 | - if (!ex) | ||
3146 | + if (!ex) { | ||
3147 | + ext4_ext_drop_refs(path); | ||
3148 | + kfree(path); | ||
3149 | + path = NULL; | ||
3150 | goto cont; | ||
3151 | + } | ||
3152 | |||
3153 | ee_block = le32_to_cpu(ex->ee_block); | ||
3154 | |||
3155 | @@ -2570,8 +2574,6 @@ again: | ||
3156 | if (err < 0) | ||
3157 | goto out; | ||
3158 | } | ||
3159 | - ext4_ext_drop_refs(path); | ||
3160 | - kfree(path); | ||
3161 | } | ||
3162 | cont: | ||
3163 | |||
3164 | @@ -2580,19 +2582,27 @@ cont: | ||
3165 | * after i_size and walking into the tree depth-wise. | ||
3166 | */ | ||
3167 | depth = ext_depth(inode); | ||
3168 | - path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_NOFS); | ||
3169 | - if (path == NULL) { | ||
3170 | - ext4_journal_stop(handle); | ||
3171 | - return -ENOMEM; | ||
3172 | - } | ||
3173 | - path[0].p_depth = depth; | ||
3174 | - path[0].p_hdr = ext_inode_hdr(inode); | ||
3175 | + if (path) { | ||
3176 | + int k = i = depth; | ||
3177 | + while (--k > 0) | ||
3178 | + path[k].p_block = | ||
3179 | + le16_to_cpu(path[k].p_hdr->eh_entries)+1; | ||
3180 | + } else { | ||
3181 | + path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), | ||
3182 | + GFP_NOFS); | ||
3183 | + if (path == NULL) { | ||
3184 | + ext4_journal_stop(handle); | ||
3185 | + return -ENOMEM; | ||
3186 | + } | ||
3187 | + path[0].p_depth = depth; | ||
3188 | + path[0].p_hdr = ext_inode_hdr(inode); | ||
3189 | |||
3190 | - if (ext4_ext_check(inode, path[0].p_hdr, depth)) { | ||
3191 | - err = -EIO; | ||
3192 | - goto out; | ||
3193 | + if (ext4_ext_check(inode, path[0].p_hdr, depth)) { | ||
3194 | + err = -EIO; | ||
3195 | + goto out; | ||
3196 | + } | ||
3197 | } | ||
3198 | - i = err = 0; | ||
3199 | + err = 0; | ||
3200 | |||
3201 | while (i >= 0 && err == 0) { | ||
3202 | if (i == depth) { | ||
3203 | @@ -2706,8 +2716,10 @@ cont: | ||
3204 | out: | ||
3205 | ext4_ext_drop_refs(path); | ||
3206 | kfree(path); | ||
3207 | - if (err == -EAGAIN) | ||
3208 | + if (err == -EAGAIN) { | ||
3209 | + path = NULL; | ||
3210 | goto again; | ||
3211 | + } | ||
3212 | ext4_journal_stop(handle); | ||
3213 | |||
3214 | return err; | ||
3215 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c | ||
3216 | index 8900f8b..0ee374d 100644 | ||
3217 | --- a/fs/ext4/ialloc.c | ||
3218 | +++ b/fs/ext4/ialloc.c | ||
3219 | @@ -1013,7 +1013,8 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | ||
3220 | if (!bitmap_bh) | ||
3221 | continue; | ||
3222 | |||
3223 | - x = ext4_count_free(bitmap_bh, EXT4_INODES_PER_GROUP(sb) / 8); | ||
3224 | + x = ext4_count_free(bitmap_bh->b_data, | ||
3225 | + EXT4_INODES_PER_GROUP(sb) / 8); | ||
3226 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", | ||
3227 | (unsigned long) i, ext4_free_inodes_count(sb, gdp), x); | ||
3228 | bitmap_count += x; | ||
3229 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
3230 | index c77b0bd..55a654d 100644 | ||
3231 | --- a/fs/ext4/inode.c | ||
3232 | +++ b/fs/ext4/inode.c | ||
3233 | @@ -279,6 +279,15 @@ void ext4_da_update_reserve_space(struct inode *inode, | ||
3234 | used = ei->i_reserved_data_blocks; | ||
3235 | } | ||
3236 | |||
3237 | + if (unlikely(ei->i_allocated_meta_blocks > ei->i_reserved_meta_blocks)) { | ||
3238 | + ext4_msg(inode->i_sb, KERN_NOTICE, "%s: ino %lu, allocated %d " | ||
3239 | + "with only %d reserved metadata blocks\n", __func__, | ||
3240 | + inode->i_ino, ei->i_allocated_meta_blocks, | ||
3241 | + ei->i_reserved_meta_blocks); | ||
3242 | + WARN_ON(1); | ||
3243 | + ei->i_allocated_meta_blocks = ei->i_reserved_meta_blocks; | ||
3244 | + } | ||
3245 | + | ||
3246 | /* Update per-inode reservations */ | ||
3247 | ei->i_reserved_data_blocks -= used; | ||
3248 | ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; | ||
3249 | @@ -1104,6 +1113,17 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | ||
3250 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
3251 | unsigned int md_needed; | ||
3252 | int ret; | ||
3253 | + ext4_lblk_t save_last_lblock; | ||
3254 | + int save_len; | ||
3255 | + | ||
3256 | + /* | ||
3257 | + * We will charge metadata quota at writeout time; this saves | ||
3258 | + * us from metadata over-estimation, though we may go over by | ||
3259 | + * a small amount in the end. Here we just reserve for data. | ||
3260 | + */ | ||
3261 | + ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); | ||
3262 | + if (ret) | ||
3263 | + return ret; | ||
3264 | |||
3265 | /* | ||
3266 | * recalculate the amount of metadata blocks to reserve | ||
3267 | @@ -1112,32 +1132,31 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | ||
3268 | */ | ||
3269 | repeat: | ||
3270 | spin_lock(&ei->i_block_reservation_lock); | ||
3271 | + /* | ||
3272 | + * ext4_calc_metadata_amount() has side effects, which we have | ||
3273 | + * to be prepared undo if we fail to claim space. | ||
3274 | + */ | ||
3275 | + save_len = ei->i_da_metadata_calc_len; | ||
3276 | + save_last_lblock = ei->i_da_metadata_calc_last_lblock; | ||
3277 | md_needed = EXT4_NUM_B2C(sbi, | ||
3278 | ext4_calc_metadata_amount(inode, lblock)); | ||
3279 | trace_ext4_da_reserve_space(inode, md_needed); | ||
3280 | - spin_unlock(&ei->i_block_reservation_lock); | ||
3281 | |||
3282 | /* | ||
3283 | - * We will charge metadata quota at writeout time; this saves | ||
3284 | - * us from metadata over-estimation, though we may go over by | ||
3285 | - * a small amount in the end. Here we just reserve for data. | ||
3286 | - */ | ||
3287 | - ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); | ||
3288 | - if (ret) | ||
3289 | - return ret; | ||
3290 | - /* | ||
3291 | * We do still charge estimated metadata to the sb though; | ||
3292 | * we cannot afford to run out of free blocks. | ||
3293 | */ | ||
3294 | if (ext4_claim_free_clusters(sbi, md_needed + 1, 0)) { | ||
3295 | - dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); | ||
3296 | + ei->i_da_metadata_calc_len = save_len; | ||
3297 | + ei->i_da_metadata_calc_last_lblock = save_last_lblock; | ||
3298 | + spin_unlock(&ei->i_block_reservation_lock); | ||
3299 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { | ||
3300 | yield(); | ||
3301 | goto repeat; | ||
3302 | } | ||
3303 | + dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); | ||
3304 | return -ENOSPC; | ||
3305 | } | ||
3306 | - spin_lock(&ei->i_block_reservation_lock); | ||
3307 | ei->i_reserved_data_blocks++; | ||
3308 | ei->i_reserved_meta_blocks += md_needed; | ||
3309 | spin_unlock(&ei->i_block_reservation_lock); | ||
3310 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c | ||
3311 | index 53589ff..3407a62 100644 | ||
3312 | --- a/fs/ext4/resize.c | ||
3313 | +++ b/fs/ext4/resize.c | ||
3314 | @@ -1141,7 +1141,7 @@ static void ext4_update_super(struct super_block *sb, | ||
3315 | struct ext4_new_group_data *group_data = flex_gd->groups; | ||
3316 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3317 | struct ext4_super_block *es = sbi->s_es; | ||
3318 | - int i; | ||
3319 | + int i, ret; | ||
3320 | |||
3321 | BUG_ON(flex_gd->count == 0 || group_data == NULL); | ||
3322 | /* | ||
3323 | @@ -1216,6 +1216,11 @@ static void ext4_update_super(struct super_block *sb, | ||
3324 | &sbi->s_flex_groups[flex_group].free_inodes); | ||
3325 | } | ||
3326 | |||
3327 | + /* | ||
3328 | + * Update the fs overhead information | ||
3329 | + */ | ||
3330 | + ext4_calculate_overhead(sb); | ||
3331 | + | ||
3332 | if (test_opt(sb, DEBUG)) | ||
3333 | printk(KERN_DEBUG "EXT4-fs: added group %u:" | ||
3334 | "%llu blocks(%llu free %llu reserved)\n", flex_gd->count, | ||
3335 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
3336 | index a68703a..7fe3869 100644 | ||
3337 | --- a/fs/ext4/super.c | ||
3338 | +++ b/fs/ext4/super.c | ||
3339 | @@ -2944,6 +2944,114 @@ static void ext4_destroy_lazyinit_thread(void) | ||
3340 | kthread_stop(ext4_lazyinit_task); | ||
3341 | } | ||
3342 | |||
3343 | +/* | ||
3344 | + * Note: calculating the overhead so we can be compatible with | ||
3345 | + * historical BSD practice is quite difficult in the face of | ||
3346 | + * clusters/bigalloc. This is because multiple metadata blocks from | ||
3347 | + * different block group can end up in the same allocation cluster. | ||
3348 | + * Calculating the exact overhead in the face of clustered allocation | ||
3349 | + * requires either O(all block bitmaps) in memory or O(number of block | ||
3350 | + * groups**2) in time. We will still calculate the superblock for | ||
3351 | + * older file systems --- and if we come across with a bigalloc file | ||
3352 | + * system with zero in s_overhead_clusters the estimate will be close to | ||
3353 | + * correct especially for very large cluster sizes --- but for newer | ||
3354 | + * file systems, it's better to calculate this figure once at mkfs | ||
3355 | + * time, and store it in the superblock. If the superblock value is | ||
3356 | + * present (even for non-bigalloc file systems), we will use it. | ||
3357 | + */ | ||
3358 | +static int count_overhead(struct super_block *sb, ext4_group_t grp, | ||
3359 | + char *buf) | ||
3360 | +{ | ||
3361 | + struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3362 | + struct ext4_group_desc *gdp; | ||
3363 | + ext4_fsblk_t first_block, last_block, b; | ||
3364 | + ext4_group_t i, ngroups = ext4_get_groups_count(sb); | ||
3365 | + int s, j, count = 0; | ||
3366 | + | ||
3367 | + first_block = le32_to_cpu(sbi->s_es->s_first_data_block) + | ||
3368 | + (grp * EXT4_BLOCKS_PER_GROUP(sb)); | ||
3369 | + last_block = first_block + EXT4_BLOCKS_PER_GROUP(sb) - 1; | ||
3370 | + for (i = 0; i < ngroups; i++) { | ||
3371 | + gdp = ext4_get_group_desc(sb, i, NULL); | ||
3372 | + b = ext4_block_bitmap(sb, gdp); | ||
3373 | + if (b >= first_block && b <= last_block) { | ||
3374 | + ext4_set_bit(EXT4_B2C(sbi, b - first_block), buf); | ||
3375 | + count++; | ||
3376 | + } | ||
3377 | + b = ext4_inode_bitmap(sb, gdp); | ||
3378 | + if (b >= first_block && b <= last_block) { | ||
3379 | + ext4_set_bit(EXT4_B2C(sbi, b - first_block), buf); | ||
3380 | + count++; | ||
3381 | + } | ||
3382 | + b = ext4_inode_table(sb, gdp); | ||
3383 | + if (b >= first_block && b + sbi->s_itb_per_group <= last_block) | ||
3384 | + for (j = 0; j < sbi->s_itb_per_group; j++, b++) { | ||
3385 | + int c = EXT4_B2C(sbi, b - first_block); | ||
3386 | + ext4_set_bit(c, buf); | ||
3387 | + count++; | ||
3388 | + } | ||
3389 | + if (i != grp) | ||
3390 | + continue; | ||
3391 | + s = 0; | ||
3392 | + if (ext4_bg_has_super(sb, grp)) { | ||
3393 | + ext4_set_bit(s++, buf); | ||
3394 | + count++; | ||
3395 | + } | ||
3396 | + for (j = ext4_bg_num_gdb(sb, grp); j > 0; j--) { | ||
3397 | + ext4_set_bit(EXT4_B2C(sbi, s++), buf); | ||
3398 | + count++; | ||
3399 | + } | ||
3400 | + } | ||
3401 | + if (!count) | ||
3402 | + return 0; | ||
3403 | + return EXT4_CLUSTERS_PER_GROUP(sb) - | ||
3404 | + ext4_count_free(buf, EXT4_CLUSTERS_PER_GROUP(sb) / 8); | ||
3405 | +} | ||
3406 | + | ||
3407 | +/* | ||
3408 | + * Compute the overhead and stash it in sbi->s_overhead | ||
3409 | + */ | ||
3410 | +int ext4_calculate_overhead(struct super_block *sb) | ||
3411 | +{ | ||
3412 | + struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3413 | + struct ext4_super_block *es = sbi->s_es; | ||
3414 | + ext4_group_t i, ngroups = ext4_get_groups_count(sb); | ||
3415 | + ext4_fsblk_t overhead = 0; | ||
3416 | + char *buf = (char *) get_zeroed_page(GFP_KERNEL); | ||
3417 | + | ||
3418 | + memset(buf, 0, PAGE_SIZE); | ||
3419 | + if (!buf) | ||
3420 | + return -ENOMEM; | ||
3421 | + | ||
3422 | + /* | ||
3423 | + * Compute the overhead (FS structures). This is constant | ||
3424 | + * for a given filesystem unless the number of block groups | ||
3425 | + * changes so we cache the previous value until it does. | ||
3426 | + */ | ||
3427 | + | ||
3428 | + /* | ||
3429 | + * All of the blocks before first_data_block are overhead | ||
3430 | + */ | ||
3431 | + overhead = EXT4_B2C(sbi, le32_to_cpu(es->s_first_data_block)); | ||
3432 | + | ||
3433 | + /* | ||
3434 | + * Add the overhead found in each block group | ||
3435 | + */ | ||
3436 | + for (i = 0; i < ngroups; i++) { | ||
3437 | + int blks; | ||
3438 | + | ||
3439 | + blks = count_overhead(sb, i, buf); | ||
3440 | + overhead += blks; | ||
3441 | + if (blks) | ||
3442 | + memset(buf, 0, PAGE_SIZE); | ||
3443 | + cond_resched(); | ||
3444 | + } | ||
3445 | + sbi->s_overhead = overhead; | ||
3446 | + smp_wmb(); | ||
3447 | + free_page((unsigned long) buf); | ||
3448 | + return 0; | ||
3449 | +} | ||
3450 | + | ||
3451 | static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
3452 | { | ||
3453 | char *orig_data = kstrdup(data, GFP_KERNEL); | ||
3454 | @@ -3559,6 +3667,18 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
3455 | |||
3456 | no_journal: | ||
3457 | /* | ||
3458 | + * Get the # of file system overhead blocks from the | ||
3459 | + * superblock if present. | ||
3460 | + */ | ||
3461 | + if (es->s_overhead_clusters) | ||
3462 | + sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters); | ||
3463 | + else { | ||
3464 | + ret = ext4_calculate_overhead(sb); | ||
3465 | + if (ret) | ||
3466 | + goto failed_mount_wq; | ||
3467 | + } | ||
3468 | + | ||
3469 | + /* | ||
3470 | * The maximum number of concurrent works can be high and | ||
3471 | * concurrency isn't really necessary. Limit it to 1. | ||
3472 | */ | ||
3473 | @@ -4421,67 +4541,21 @@ restore_opts: | ||
3474 | return err; | ||
3475 | } | ||
3476 | |||
3477 | -/* | ||
3478 | - * Note: calculating the overhead so we can be compatible with | ||
3479 | - * historical BSD practice is quite difficult in the face of | ||
3480 | - * clusters/bigalloc. This is because multiple metadata blocks from | ||
3481 | - * different block group can end up in the same allocation cluster. | ||
3482 | - * Calculating the exact overhead in the face of clustered allocation | ||
3483 | - * requires either O(all block bitmaps) in memory or O(number of block | ||
3484 | - * groups**2) in time. We will still calculate the superblock for | ||
3485 | - * older file systems --- and if we come across with a bigalloc file | ||
3486 | - * system with zero in s_overhead_clusters the estimate will be close to | ||
3487 | - * correct especially for very large cluster sizes --- but for newer | ||
3488 | - * file systems, it's better to calculate this figure once at mkfs | ||
3489 | - * time, and store it in the superblock. If the superblock value is | ||
3490 | - * present (even for non-bigalloc file systems), we will use it. | ||
3491 | - */ | ||
3492 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) | ||
3493 | { | ||
3494 | struct super_block *sb = dentry->d_sb; | ||
3495 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3496 | struct ext4_super_block *es = sbi->s_es; | ||
3497 | - struct ext4_group_desc *gdp; | ||
3498 | + ext4_fsblk_t overhead = 0; | ||
3499 | u64 fsid; | ||
3500 | s64 bfree; | ||
3501 | |||
3502 | - if (test_opt(sb, MINIX_DF)) { | ||
3503 | - sbi->s_overhead_last = 0; | ||
3504 | - } else if (es->s_overhead_clusters) { | ||
3505 | - sbi->s_overhead_last = le32_to_cpu(es->s_overhead_clusters); | ||
3506 | - } else if (sbi->s_blocks_last != ext4_blocks_count(es)) { | ||
3507 | - ext4_group_t i, ngroups = ext4_get_groups_count(sb); | ||
3508 | - ext4_fsblk_t overhead = 0; | ||
3509 | - | ||
3510 | - /* | ||
3511 | - * Compute the overhead (FS structures). This is constant | ||
3512 | - * for a given filesystem unless the number of block groups | ||
3513 | - * changes so we cache the previous value until it does. | ||
3514 | - */ | ||
3515 | - | ||
3516 | - /* | ||
3517 | - * All of the blocks before first_data_block are | ||
3518 | - * overhead | ||
3519 | - */ | ||
3520 | - overhead = EXT4_B2C(sbi, le32_to_cpu(es->s_first_data_block)); | ||
3521 | - | ||
3522 | - /* | ||
3523 | - * Add the overhead found in each block group | ||
3524 | - */ | ||
3525 | - for (i = 0; i < ngroups; i++) { | ||
3526 | - gdp = ext4_get_group_desc(sb, i, NULL); | ||
3527 | - overhead += ext4_num_overhead_clusters(sb, i, gdp); | ||
3528 | - cond_resched(); | ||
3529 | - } | ||
3530 | - sbi->s_overhead_last = overhead; | ||
3531 | - smp_wmb(); | ||
3532 | - sbi->s_blocks_last = ext4_blocks_count(es); | ||
3533 | - } | ||
3534 | + if (!test_opt(sb, MINIX_DF)) | ||
3535 | + overhead = sbi->s_overhead; | ||
3536 | |||
3537 | buf->f_type = EXT4_SUPER_MAGIC; | ||
3538 | buf->f_bsize = sb->s_blocksize; | ||
3539 | - buf->f_blocks = (ext4_blocks_count(es) - | ||
3540 | - EXT4_C2B(sbi, sbi->s_overhead_last)); | ||
3541 | + buf->f_blocks = ext4_blocks_count(es) - EXT4_C2B(sbi, sbi->s_overhead); | ||
3542 | bfree = percpu_counter_sum_positive(&sbi->s_freeclusters_counter) - | ||
3543 | percpu_counter_sum_positive(&sbi->s_dirtyclusters_counter); | ||
3544 | /* prevent underflow in case that few free space is available */ | ||
3545 | diff --git a/fs/locks.c b/fs/locks.c | ||
3546 | index 6a64f15..fcc50ab 100644 | ||
3547 | --- a/fs/locks.c | ||
3548 | +++ b/fs/locks.c | ||
3549 | @@ -308,7 +308,7 @@ static int flock_make_lock(struct file *filp, struct file_lock **lock, | ||
3550 | return 0; | ||
3551 | } | ||
3552 | |||
3553 | -static int assign_type(struct file_lock *fl, int type) | ||
3554 | +static int assign_type(struct file_lock *fl, long type) | ||
3555 | { | ||
3556 | switch (type) { | ||
3557 | case F_RDLCK: | ||
3558 | @@ -445,7 +445,7 @@ static const struct lock_manager_operations lease_manager_ops = { | ||
3559 | /* | ||
3560 | * Initialize a lease, use the default lock manager operations | ||
3561 | */ | ||
3562 | -static int lease_init(struct file *filp, int type, struct file_lock *fl) | ||
3563 | +static int lease_init(struct file *filp, long type, struct file_lock *fl) | ||
3564 | { | ||
3565 | if (assign_type(fl, type) != 0) | ||
3566 | return -EINVAL; | ||
3567 | @@ -463,7 +463,7 @@ static int lease_init(struct file *filp, int type, struct file_lock *fl) | ||
3568 | } | ||
3569 | |||
3570 | /* Allocate a file_lock initialised to this type of lease */ | ||
3571 | -static struct file_lock *lease_alloc(struct file *filp, int type) | ||
3572 | +static struct file_lock *lease_alloc(struct file *filp, long type) | ||
3573 | { | ||
3574 | struct file_lock *fl = locks_alloc_lock(); | ||
3575 | int error = -ENOMEM; | ||
3576 | diff --git a/fs/nfs/file.c b/fs/nfs/file.c | ||
3577 | index aa9b709..f0f439d 100644 | ||
3578 | --- a/fs/nfs/file.c | ||
3579 | +++ b/fs/nfs/file.c | ||
3580 | @@ -451,8 +451,11 @@ static int nfs_release_page(struct page *page, gfp_t gfp) | ||
3581 | |||
3582 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); | ||
3583 | |||
3584 | - /* Only do I/O if gfp is a superset of GFP_KERNEL */ | ||
3585 | - if (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL) { | ||
3586 | + /* Only do I/O if gfp is a superset of GFP_KERNEL, and we're not | ||
3587 | + * doing this memory reclaim for a fs-related allocation. | ||
3588 | + */ | ||
3589 | + if (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL && | ||
3590 | + !(current->flags & PF_FSTRANS)) { | ||
3591 | int how = FLUSH_SYNC; | ||
3592 | |||
3593 | /* Don't let kswapd deadlock waiting for OOM RPC calls */ | ||
3594 | diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c | ||
3595 | index 93aa3a4..929ba01 100644 | ||
3596 | --- a/fs/nfs/idmap.c | ||
3597 | +++ b/fs/nfs/idmap.c | ||
3598 | @@ -205,12 +205,18 @@ static int nfs_idmap_init_keyring(void) | ||
3599 | if (ret < 0) | ||
3600 | goto failed_put_key; | ||
3601 | |||
3602 | + ret = register_key_type(&key_type_id_resolver_legacy); | ||
3603 | + if (ret < 0) | ||
3604 | + goto failed_reg_legacy; | ||
3605 | + | ||
3606 | set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags); | ||
3607 | cred->thread_keyring = keyring; | ||
3608 | cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING; | ||
3609 | id_resolver_cache = cred; | ||
3610 | return 0; | ||
3611 | |||
3612 | +failed_reg_legacy: | ||
3613 | + unregister_key_type(&key_type_id_resolver); | ||
3614 | failed_put_key: | ||
3615 | key_put(keyring); | ||
3616 | failed_put_cred: | ||
3617 | @@ -222,6 +228,7 @@ static void nfs_idmap_quit_keyring(void) | ||
3618 | { | ||
3619 | key_revoke(id_resolver_cache->thread_keyring); | ||
3620 | unregister_key_type(&key_type_id_resolver); | ||
3621 | + unregister_key_type(&key_type_id_resolver_legacy); | ||
3622 | put_cred(id_resolver_cache); | ||
3623 | } | ||
3624 | |||
3625 | @@ -385,7 +392,7 @@ static const struct rpc_pipe_ops idmap_upcall_ops = { | ||
3626 | }; | ||
3627 | |||
3628 | static struct key_type key_type_id_resolver_legacy = { | ||
3629 | - .name = "id_resolver", | ||
3630 | + .name = "id_legacy", | ||
3631 | .instantiate = user_instantiate, | ||
3632 | .match = user_match, | ||
3633 | .revoke = user_revoke, | ||
3634 | @@ -658,6 +665,7 @@ static int nfs_idmap_legacy_upcall(struct key_construction *cons, | ||
3635 | if (ret < 0) | ||
3636 | goto out2; | ||
3637 | |||
3638 | + BUG_ON(idmap->idmap_key_cons != NULL); | ||
3639 | idmap->idmap_key_cons = cons; | ||
3640 | |||
3641 | ret = rpc_queue_upcall(idmap->idmap_pipe, msg); | ||
3642 | @@ -671,8 +679,7 @@ out2: | ||
3643 | out1: | ||
3644 | kfree(msg); | ||
3645 | out0: | ||
3646 | - key_revoke(cons->key); | ||
3647 | - key_revoke(cons->authkey); | ||
3648 | + complete_request_key(cons, ret); | ||
3649 | return ret; | ||
3650 | } | ||
3651 | |||
3652 | @@ -706,11 +713,18 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | ||
3653 | { | ||
3654 | struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode); | ||
3655 | struct idmap *idmap = (struct idmap *)rpci->private; | ||
3656 | - struct key_construction *cons = idmap->idmap_key_cons; | ||
3657 | + struct key_construction *cons; | ||
3658 | struct idmap_msg im; | ||
3659 | size_t namelen_in; | ||
3660 | int ret; | ||
3661 | |||
3662 | + /* If instantiation is successful, anyone waiting for key construction | ||
3663 | + * will have been woken up and someone else may now have used | ||
3664 | + * idmap_key_cons - so after this point we may no longer touch it. | ||
3665 | + */ | ||
3666 | + cons = ACCESS_ONCE(idmap->idmap_key_cons); | ||
3667 | + idmap->idmap_key_cons = NULL; | ||
3668 | + | ||
3669 | if (mlen != sizeof(im)) { | ||
3670 | ret = -ENOSPC; | ||
3671 | goto out; | ||
3672 | @@ -723,7 +737,7 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | ||
3673 | |||
3674 | if (!(im.im_status & IDMAP_STATUS_SUCCESS)) { | ||
3675 | ret = mlen; | ||
3676 | - complete_request_key(idmap->idmap_key_cons, -ENOKEY); | ||
3677 | + complete_request_key(cons, -ENOKEY); | ||
3678 | goto out_incomplete; | ||
3679 | } | ||
3680 | |||
3681 | @@ -740,7 +754,7 @@ idmap_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) | ||
3682 | } | ||
3683 | |||
3684 | out: | ||
3685 | - complete_request_key(idmap->idmap_key_cons, ret); | ||
3686 | + complete_request_key(cons, ret); | ||
3687 | out_incomplete: | ||
3688 | return ret; | ||
3689 | } | ||
3690 | diff --git a/fs/nfs/objlayout/objio_osd.c b/fs/nfs/objlayout/objio_osd.c | ||
3691 | index 42ac1bf..1afe74c 100644 | ||
3692 | --- a/fs/nfs/objlayout/objio_osd.c | ||
3693 | +++ b/fs/nfs/objlayout/objio_osd.c | ||
3694 | @@ -487,8 +487,16 @@ static struct page *__r4w_get_page(void *priv, u64 offset, bool *uptodate) | ||
3695 | struct objio_state *objios = priv; | ||
3696 | struct nfs_write_data *wdata = objios->oir.rpcdata; | ||
3697 | pgoff_t index = offset / PAGE_SIZE; | ||
3698 | - struct page *page = find_get_page(wdata->inode->i_mapping, index); | ||
3699 | + struct page *page; | ||
3700 | + loff_t i_size = i_size_read(wdata->inode); | ||
3701 | |||
3702 | + if (offset >= i_size) { | ||
3703 | + *uptodate = true; | ||
3704 | + dprintk("%s: g_zero_page index=0x%lx\n", __func__, index); | ||
3705 | + return ZERO_PAGE(0); | ||
3706 | + } | ||
3707 | + | ||
3708 | + page = find_get_page(wdata->inode->i_mapping, index); | ||
3709 | if (!page) { | ||
3710 | page = find_or_create_page(wdata->inode->i_mapping, | ||
3711 | index, GFP_NOFS); | ||
3712 | @@ -509,8 +517,10 @@ static struct page *__r4w_get_page(void *priv, u64 offset, bool *uptodate) | ||
3713 | |||
3714 | static void __r4w_put_page(void *priv, struct page *page) | ||
3715 | { | ||
3716 | - dprintk("%s: index=0x%lx\n", __func__, page->index); | ||
3717 | - page_cache_release(page); | ||
3718 | + dprintk("%s: index=0x%lx\n", __func__, | ||
3719 | + (page == ZERO_PAGE(0)) ? -1UL : page->index); | ||
3720 | + if (ZERO_PAGE(0) != page) | ||
3721 | + page_cache_release(page); | ||
3722 | return; | ||
3723 | } | ||
3724 | |||
3725 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
3726 | index 74c00bc..283d15e 100644 | ||
3727 | --- a/fs/nfsd/nfs4xdr.c | ||
3728 | +++ b/fs/nfsd/nfs4xdr.c | ||
3729 | @@ -2233,7 +2233,7 @@ out_acl: | ||
3730 | if (bmval0 & FATTR4_WORD0_CASE_INSENSITIVE) { | ||
3731 | if ((buflen -= 4) < 0) | ||
3732 | goto out_resource; | ||
3733 | - WRITE32(1); | ||
3734 | + WRITE32(0); | ||
3735 | } | ||
3736 | if (bmval0 & FATTR4_WORD0_CASE_PRESERVING) { | ||
3737 | if ((buflen -= 4) < 0) | ||
3738 | diff --git a/fs/select.c b/fs/select.c | ||
3739 | index 17d33d0..0baa0a3 100644 | ||
3740 | --- a/fs/select.c | ||
3741 | +++ b/fs/select.c | ||
3742 | @@ -345,8 +345,8 @@ static int max_select_fd(unsigned long n, fd_set_bits *fds) | ||
3743 | struct fdtable *fdt; | ||
3744 | |||
3745 | /* handle last in-complete long-word first */ | ||
3746 | - set = ~(~0UL << (n & (__NFDBITS-1))); | ||
3747 | - n /= __NFDBITS; | ||
3748 | + set = ~(~0UL << (n & (BITS_PER_LONG-1))); | ||
3749 | + n /= BITS_PER_LONG; | ||
3750 | fdt = files_fdtable(current->files); | ||
3751 | open_fds = fdt->open_fds + n; | ||
3752 | max = 0; | ||
3753 | @@ -373,7 +373,7 @@ get_max: | ||
3754 | max++; | ||
3755 | set >>= 1; | ||
3756 | } while (set); | ||
3757 | - max += n * __NFDBITS; | ||
3758 | + max += n * BITS_PER_LONG; | ||
3759 | } | ||
3760 | |||
3761 | return max; | ||
3762 | @@ -435,11 +435,11 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time) | ||
3763 | in = *inp++; out = *outp++; ex = *exp++; | ||
3764 | all_bits = in | out | ex; | ||
3765 | if (all_bits == 0) { | ||
3766 | - i += __NFDBITS; | ||
3767 | + i += BITS_PER_LONG; | ||
3768 | continue; | ||
3769 | } | ||
3770 | |||
3771 | - for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) { | ||
3772 | + for (j = 0; j < BITS_PER_LONG; ++j, ++i, bit <<= 1) { | ||
3773 | int fput_needed; | ||
3774 | if (i >= n) | ||
3775 | break; | ||
3776 | diff --git a/fs/udf/super.c b/fs/udf/super.c | ||
3777 | index 8d86a87..e660ffd 100644 | ||
3778 | --- a/fs/udf/super.c | ||
3779 | +++ b/fs/udf/super.c | ||
3780 | @@ -1283,7 +1283,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | ||
3781 | BUG_ON(ident != TAG_IDENT_LVD); | ||
3782 | lvd = (struct logicalVolDesc *)bh->b_data; | ||
3783 | table_len = le32_to_cpu(lvd->mapTableLength); | ||
3784 | - if (sizeof(*lvd) + table_len > sb->s_blocksize) { | ||
3785 | + if (table_len > sb->s_blocksize - sizeof(*lvd)) { | ||
3786 | udf_err(sb, "error loading logical volume descriptor: " | ||
3787 | "Partition table too long (%u > %lu)\n", table_len, | ||
3788 | sb->s_blocksize - sizeof(*lvd)); | ||
3789 | diff --git a/include/linux/cpu.h b/include/linux/cpu.h | ||
3790 | index ee28844..78ed62f 100644 | ||
3791 | --- a/include/linux/cpu.h | ||
3792 | +++ b/include/linux/cpu.h | ||
3793 | @@ -75,8 +75,9 @@ enum { | ||
3794 | /* migration should happen before other stuff but after perf */ | ||
3795 | CPU_PRI_PERF = 20, | ||
3796 | CPU_PRI_MIGRATION = 10, | ||
3797 | - /* prepare workqueues for other notifiers */ | ||
3798 | - CPU_PRI_WORKQUEUE = 5, | ||
3799 | + /* bring up workqueues before normal notifiers and down after */ | ||
3800 | + CPU_PRI_WORKQUEUE_UP = 5, | ||
3801 | + CPU_PRI_WORKQUEUE_DOWN = -5, | ||
3802 | }; | ||
3803 | |||
3804 | #define CPU_ONLINE 0x0002 /* CPU (unsigned)v is up */ | ||
3805 | diff --git a/include/linux/mm.h b/include/linux/mm.h | ||
3806 | index 74aa71b..441a564 100644 | ||
3807 | --- a/include/linux/mm.h | ||
3808 | +++ b/include/linux/mm.h | ||
3809 | @@ -1595,6 +1595,7 @@ void vmemmap_populate_print_last(void); | ||
3810 | enum mf_flags { | ||
3811 | MF_COUNT_INCREASED = 1 << 0, | ||
3812 | MF_ACTION_REQUIRED = 1 << 1, | ||
3813 | + MF_MUST_KILL = 1 << 2, | ||
3814 | }; | ||
3815 | extern int memory_failure(unsigned long pfn, int trapno, int flags); | ||
3816 | extern void memory_failure_queue(unsigned long pfn, int trapno, int flags); | ||
3817 | diff --git a/include/linux/net.h b/include/linux/net.h | ||
3818 | index be60c7f..95fea14 100644 | ||
3819 | --- a/include/linux/net.h | ||
3820 | +++ b/include/linux/net.h | ||
3821 | @@ -72,6 +72,7 @@ struct net; | ||
3822 | #define SOCK_NOSPACE 2 | ||
3823 | #define SOCK_PASSCRED 3 | ||
3824 | #define SOCK_PASSSEC 4 | ||
3825 | +#define SOCK_EXTERNALLY_ALLOCATED 5 | ||
3826 | |||
3827 | #ifndef ARCH_HAS_SOCKET_TYPES | ||
3828 | /** | ||
3829 | diff --git a/include/linux/posix_types.h b/include/linux/posix_types.h | ||
3830 | index f04c98c..988f76e 100644 | ||
3831 | --- a/include/linux/posix_types.h | ||
3832 | +++ b/include/linux/posix_types.h | ||
3833 | @@ -15,26 +15,14 @@ | ||
3834 | */ | ||
3835 | |||
3836 | /* | ||
3837 | - * Those macros may have been defined in <gnu/types.h>. But we always | ||
3838 | - * use the ones here. | ||
3839 | + * This macro may have been defined in <gnu/types.h>. But we always | ||
3840 | + * use the one here. | ||
3841 | */ | ||
3842 | -#undef __NFDBITS | ||
3843 | -#define __NFDBITS (8 * sizeof(unsigned long)) | ||
3844 | - | ||
3845 | #undef __FD_SETSIZE | ||
3846 | #define __FD_SETSIZE 1024 | ||
3847 | |||
3848 | -#undef __FDSET_LONGS | ||
3849 | -#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS) | ||
3850 | - | ||
3851 | -#undef __FDELT | ||
3852 | -#define __FDELT(d) ((d) / __NFDBITS) | ||
3853 | - | ||
3854 | -#undef __FDMASK | ||
3855 | -#define __FDMASK(d) (1UL << ((d) % __NFDBITS)) | ||
3856 | - | ||
3857 | typedef struct { | ||
3858 | - unsigned long fds_bits [__FDSET_LONGS]; | ||
3859 | + unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))]; | ||
3860 | } __kernel_fd_set; | ||
3861 | |||
3862 | /* Type of a signal handler. */ | ||
3863 | diff --git a/include/linux/time.h b/include/linux/time.h | ||
3864 | index 33a92ea..8da5129 100644 | ||
3865 | --- a/include/linux/time.h | ||
3866 | +++ b/include/linux/time.h | ||
3867 | @@ -258,14 +258,6 @@ static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) | ||
3868 | |||
3869 | #endif /* __KERNEL__ */ | ||
3870 | |||
3871 | -#define NFDBITS __NFDBITS | ||
3872 | - | ||
3873 | -#define FD_SETSIZE __FD_SETSIZE | ||
3874 | -#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp) | ||
3875 | -#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp) | ||
3876 | -#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp) | ||
3877 | -#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp) | ||
3878 | - | ||
3879 | /* | ||
3880 | * Names of the interval timers, and structure | ||
3881 | * defining a timer setting: | ||
3882 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h | ||
3883 | index aaccc5f..3ad5b33 100644 | ||
3884 | --- a/include/target/target_core_base.h | ||
3885 | +++ b/include/target/target_core_base.h | ||
3886 | @@ -229,6 +229,7 @@ enum tcm_sense_reason_table { | ||
3887 | TCM_CHECK_CONDITION_UNIT_ATTENTION = 0x0e, | ||
3888 | TCM_CHECK_CONDITION_NOT_READY = 0x0f, | ||
3889 | TCM_RESERVATION_CONFLICT = 0x10, | ||
3890 | + TCM_ADDRESS_OUT_OF_RANGE = 0x11, | ||
3891 | }; | ||
3892 | |||
3893 | enum target_sc_flags_table { | ||
3894 | diff --git a/kernel/exit.c b/kernel/exit.c | ||
3895 | index 9d81012..bfbd856 100644 | ||
3896 | --- a/kernel/exit.c | ||
3897 | +++ b/kernel/exit.c | ||
3898 | @@ -471,7 +471,7 @@ static void close_files(struct files_struct * files) | ||
3899 | rcu_read_unlock(); | ||
3900 | for (;;) { | ||
3901 | unsigned long set; | ||
3902 | - i = j * __NFDBITS; | ||
3903 | + i = j * BITS_PER_LONG; | ||
3904 | if (i >= fdt->max_fds) | ||
3905 | break; | ||
3906 | set = fdt->open_fds[j++]; | ||
3907 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
3908 | index e2b0fb9..3717e7b 100644 | ||
3909 | --- a/kernel/futex.c | ||
3910 | +++ b/kernel/futex.c | ||
3911 | @@ -2231,11 +2231,11 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb, | ||
3912 | * @uaddr2: the pi futex we will take prior to returning to user-space | ||
3913 | * | ||
3914 | * The caller will wait on uaddr and will be requeued by futex_requeue() to | ||
3915 | - * uaddr2 which must be PI aware. Normal wakeup will wake on uaddr2 and | ||
3916 | - * complete the acquisition of the rt_mutex prior to returning to userspace. | ||
3917 | - * This ensures the rt_mutex maintains an owner when it has waiters; without | ||
3918 | - * one, the pi logic wouldn't know which task to boost/deboost, if there was a | ||
3919 | - * need to. | ||
3920 | + * uaddr2 which must be PI aware and unique from uaddr. Normal wakeup will wake | ||
3921 | + * on uaddr2 and complete the acquisition of the rt_mutex prior to returning to | ||
3922 | + * userspace. This ensures the rt_mutex maintains an owner when it has waiters; | ||
3923 | + * without one, the pi logic would not know which task to boost/deboost, if | ||
3924 | + * there was a need to. | ||
3925 | * | ||
3926 | * We call schedule in futex_wait_queue_me() when we enqueue and return there | ||
3927 | * via the following: | ||
3928 | @@ -2272,6 +2272,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, | ||
3929 | struct futex_q q = futex_q_init; | ||
3930 | int res, ret; | ||
3931 | |||
3932 | + if (uaddr == uaddr2) | ||
3933 | + return -EINVAL; | ||
3934 | + | ||
3935 | if (!bitset) | ||
3936 | return -EINVAL; | ||
3937 | |||
3938 | @@ -2343,7 +2346,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, | ||
3939 | * signal. futex_unlock_pi() will not destroy the lock_ptr nor | ||
3940 | * the pi_state. | ||
3941 | */ | ||
3942 | - WARN_ON(!&q.pi_state); | ||
3943 | + WARN_ON(!q.pi_state); | ||
3944 | pi_mutex = &q.pi_state->pi_mutex; | ||
3945 | ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter, 1); | ||
3946 | debug_rt_mutex_free_waiter(&rt_waiter); | ||
3947 | @@ -2370,7 +2373,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, | ||
3948 | * fault, unlock the rt_mutex and return the fault to userspace. | ||
3949 | */ | ||
3950 | if (ret == -EFAULT) { | ||
3951 | - if (rt_mutex_owner(pi_mutex) == current) | ||
3952 | + if (pi_mutex && rt_mutex_owner(pi_mutex) == current) | ||
3953 | rt_mutex_unlock(pi_mutex); | ||
3954 | } else if (ret == -EINTR) { | ||
3955 | /* | ||
3956 | diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c | ||
3957 | index e09dfbf..52a1817 100644 | ||
3958 | --- a/kernel/power/hibernate.c | ||
3959 | +++ b/kernel/power/hibernate.c | ||
3960 | @@ -352,6 +352,7 @@ int hibernation_snapshot(int platform_mode) | ||
3961 | } | ||
3962 | |||
3963 | suspend_console(); | ||
3964 | + ftrace_stop(); | ||
3965 | pm_restrict_gfp_mask(); | ||
3966 | |||
3967 | error = dpm_suspend(PMSG_FREEZE); | ||
3968 | @@ -377,6 +378,7 @@ int hibernation_snapshot(int platform_mode) | ||
3969 | if (error || !in_suspend) | ||
3970 | pm_restore_gfp_mask(); | ||
3971 | |||
3972 | + ftrace_start(); | ||
3973 | resume_console(); | ||
3974 | dpm_complete(msg); | ||
3975 | |||
3976 | @@ -479,6 +481,7 @@ int hibernation_restore(int platform_mode) | ||
3977 | |||
3978 | pm_prepare_console(); | ||
3979 | suspend_console(); | ||
3980 | + ftrace_stop(); | ||
3981 | pm_restrict_gfp_mask(); | ||
3982 | error = dpm_suspend_start(PMSG_QUIESCE); | ||
3983 | if (!error) { | ||
3984 | @@ -486,6 +489,7 @@ int hibernation_restore(int platform_mode) | ||
3985 | dpm_resume_end(PMSG_RECOVER); | ||
3986 | } | ||
3987 | pm_restore_gfp_mask(); | ||
3988 | + ftrace_start(); | ||
3989 | resume_console(); | ||
3990 | pm_restore_console(); | ||
3991 | return error; | ||
3992 | @@ -512,6 +516,7 @@ int hibernation_platform_enter(void) | ||
3993 | |||
3994 | entering_platform_hibernation = true; | ||
3995 | suspend_console(); | ||
3996 | + ftrace_stop(); | ||
3997 | error = dpm_suspend_start(PMSG_HIBERNATE); | ||
3998 | if (error) { | ||
3999 | if (hibernation_ops->recover) | ||
4000 | @@ -555,6 +560,7 @@ int hibernation_platform_enter(void) | ||
4001 | Resume_devices: | ||
4002 | entering_platform_hibernation = false; | ||
4003 | dpm_resume_end(PMSG_RESTORE); | ||
4004 | + ftrace_start(); | ||
4005 | resume_console(); | ||
4006 | |||
4007 | Close: | ||
4008 | diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c | ||
4009 | index 396d262..c8b7446 100644 | ||
4010 | --- a/kernel/power/suspend.c | ||
4011 | +++ b/kernel/power/suspend.c | ||
4012 | @@ -24,6 +24,7 @@ | ||
4013 | #include <linux/export.h> | ||
4014 | #include <linux/suspend.h> | ||
4015 | #include <linux/syscore_ops.h> | ||
4016 | +#include <linux/ftrace.h> | ||
4017 | #include <trace/events/power.h> | ||
4018 | |||
4019 | #include "power.h" | ||
4020 | @@ -212,6 +213,7 @@ int suspend_devices_and_enter(suspend_state_t state) | ||
4021 | goto Close; | ||
4022 | } | ||
4023 | suspend_console(); | ||
4024 | + ftrace_stop(); | ||
4025 | suspend_test_start(); | ||
4026 | error = dpm_suspend_start(PMSG_SUSPEND); | ||
4027 | if (error) { | ||
4028 | @@ -231,6 +233,7 @@ int suspend_devices_and_enter(suspend_state_t state) | ||
4029 | suspend_test_start(); | ||
4030 | dpm_resume_end(PMSG_RESUME); | ||
4031 | suspend_test_finish("resume devices"); | ||
4032 | + ftrace_start(); | ||
4033 | resume_console(); | ||
4034 | Close: | ||
4035 | if (suspend_ops->end) | ||
4036 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
4037 | index 7da267c..bfe3f8a 100644 | ||
4038 | --- a/kernel/workqueue.c | ||
4039 | +++ b/kernel/workqueue.c | ||
4040 | @@ -3582,6 +3582,41 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, | ||
4041 | return notifier_from_errno(0); | ||
4042 | } | ||
4043 | |||
4044 | +/* | ||
4045 | + * Workqueues should be brought up before normal priority CPU notifiers. | ||
4046 | + * This will be registered high priority CPU notifier. | ||
4047 | + */ | ||
4048 | +static int __devinit workqueue_cpu_up_callback(struct notifier_block *nfb, | ||
4049 | + unsigned long action, | ||
4050 | + void *hcpu) | ||
4051 | +{ | ||
4052 | + switch (action & ~CPU_TASKS_FROZEN) { | ||
4053 | + case CPU_UP_PREPARE: | ||
4054 | + case CPU_UP_CANCELED: | ||
4055 | + case CPU_DOWN_FAILED: | ||
4056 | + case CPU_ONLINE: | ||
4057 | + return workqueue_cpu_callback(nfb, action, hcpu); | ||
4058 | + } | ||
4059 | + return NOTIFY_OK; | ||
4060 | +} | ||
4061 | + | ||
4062 | +/* | ||
4063 | + * Workqueues should be brought down after normal priority CPU notifiers. | ||
4064 | + * This will be registered as low priority CPU notifier. | ||
4065 | + */ | ||
4066 | +static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb, | ||
4067 | + unsigned long action, | ||
4068 | + void *hcpu) | ||
4069 | +{ | ||
4070 | + switch (action & ~CPU_TASKS_FROZEN) { | ||
4071 | + case CPU_DOWN_PREPARE: | ||
4072 | + case CPU_DYING: | ||
4073 | + case CPU_POST_DEAD: | ||
4074 | + return workqueue_cpu_callback(nfb, action, hcpu); | ||
4075 | + } | ||
4076 | + return NOTIFY_OK; | ||
4077 | +} | ||
4078 | + | ||
4079 | #ifdef CONFIG_SMP | ||
4080 | |||
4081 | struct work_for_cpu { | ||
4082 | @@ -3775,7 +3810,8 @@ static int __init init_workqueues(void) | ||
4083 | unsigned int cpu; | ||
4084 | int i; | ||
4085 | |||
4086 | - cpu_notifier(workqueue_cpu_callback, CPU_PRI_WORKQUEUE); | ||
4087 | + cpu_notifier(workqueue_cpu_up_callback, CPU_PRI_WORKQUEUE_UP); | ||
4088 | + cpu_notifier(workqueue_cpu_down_callback, CPU_PRI_WORKQUEUE_DOWN); | ||
4089 | |||
4090 | /* initialize gcwqs */ | ||
4091 | for_each_gcwq_cpu(cpu) { | ||
4092 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c | ||
4093 | index 97cc273..0de20d7 100644 | ||
4094 | --- a/mm/memory-failure.c | ||
4095 | +++ b/mm/memory-failure.c | ||
4096 | @@ -345,14 +345,14 @@ static void add_to_kill(struct task_struct *tsk, struct page *p, | ||
4097 | * Also when FAIL is set do a force kill because something went | ||
4098 | * wrong earlier. | ||
4099 | */ | ||
4100 | -static void kill_procs(struct list_head *to_kill, int doit, int trapno, | ||
4101 | +static void kill_procs(struct list_head *to_kill, int forcekill, int trapno, | ||
4102 | int fail, struct page *page, unsigned long pfn, | ||
4103 | int flags) | ||
4104 | { | ||
4105 | struct to_kill *tk, *next; | ||
4106 | |||
4107 | list_for_each_entry_safe (tk, next, to_kill, nd) { | ||
4108 | - if (doit) { | ||
4109 | + if (forcekill) { | ||
4110 | /* | ||
4111 | * In case something went wrong with munmapping | ||
4112 | * make sure the process doesn't catch the | ||
4113 | @@ -858,7 +858,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | ||
4114 | struct address_space *mapping; | ||
4115 | LIST_HEAD(tokill); | ||
4116 | int ret; | ||
4117 | - int kill = 1; | ||
4118 | + int kill = 1, forcekill; | ||
4119 | struct page *hpage = compound_head(p); | ||
4120 | struct page *ppage; | ||
4121 | |||
4122 | @@ -888,7 +888,7 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | ||
4123 | * be called inside page lock (it's recommended but not enforced). | ||
4124 | */ | ||
4125 | mapping = page_mapping(hpage); | ||
4126 | - if (!PageDirty(hpage) && mapping && | ||
4127 | + if (!(flags & MF_MUST_KILL) && !PageDirty(hpage) && mapping && | ||
4128 | mapping_cap_writeback_dirty(mapping)) { | ||
4129 | if (page_mkclean(hpage)) { | ||
4130 | SetPageDirty(hpage); | ||
4131 | @@ -965,12 +965,14 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | ||
4132 | * Now that the dirty bit has been propagated to the | ||
4133 | * struct page and all unmaps done we can decide if | ||
4134 | * killing is needed or not. Only kill when the page | ||
4135 | - * was dirty, otherwise the tokill list is merely | ||
4136 | + * was dirty or the process is not restartable, | ||
4137 | + * otherwise the tokill list is merely | ||
4138 | * freed. When there was a problem unmapping earlier | ||
4139 | * use a more force-full uncatchable kill to prevent | ||
4140 | * any accesses to the poisoned memory. | ||
4141 | */ | ||
4142 | - kill_procs(&tokill, !!PageDirty(ppage), trapno, | ||
4143 | + forcekill = PageDirty(ppage) || (flags & MF_MUST_KILL); | ||
4144 | + kill_procs(&tokill, forcekill, trapno, | ||
4145 | ret != SWAP_SUCCESS, p, pfn, flags); | ||
4146 | |||
4147 | return ret; | ||
4148 | diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c | ||
4149 | index efea35b..cf4a49c 100644 | ||
4150 | --- a/net/8021q/vlan.c | ||
4151 | +++ b/net/8021q/vlan.c | ||
4152 | @@ -403,6 +403,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | ||
4153 | break; | ||
4154 | |||
4155 | case NETDEV_DOWN: | ||
4156 | + if (dev->features & NETIF_F_HW_VLAN_FILTER) | ||
4157 | + vlan_vid_del(dev, 0); | ||
4158 | + | ||
4159 | /* Put all VLANs for this dev in the down state too. */ | ||
4160 | for (i = 0; i < VLAN_N_VID; i++) { | ||
4161 | vlandev = vlan_group_get_device(grp, i); | ||
4162 | diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c | ||
4163 | index aa6f716..7bf4c21 100644 | ||
4164 | --- a/net/caif/caif_dev.c | ||
4165 | +++ b/net/caif/caif_dev.c | ||
4166 | @@ -562,9 +562,9 @@ static int __init caif_device_init(void) | ||
4167 | |||
4168 | static void __exit caif_device_exit(void) | ||
4169 | { | ||
4170 | - unregister_pernet_subsys(&caif_net_ops); | ||
4171 | unregister_netdevice_notifier(&caif_device_notifier); | ||
4172 | dev_remove_pack(&caif_packet_type); | ||
4173 | + unregister_pernet_subsys(&caif_net_ops); | ||
4174 | } | ||
4175 | |||
4176 | module_init(caif_device_init); | ||
4177 | diff --git a/net/compat.c b/net/compat.c | ||
4178 | index e055708..ae6d67a 100644 | ||
4179 | --- a/net/compat.c | ||
4180 | +++ b/net/compat.c | ||
4181 | @@ -221,6 +221,8 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat | ||
4182 | { | ||
4183 | struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control; | ||
4184 | struct compat_cmsghdr cmhdr; | ||
4185 | + struct compat_timeval ctv; | ||
4186 | + struct compat_timespec cts[3]; | ||
4187 | int cmlen; | ||
4188 | |||
4189 | if (cm == NULL || kmsg->msg_controllen < sizeof(*cm)) { | ||
4190 | @@ -229,8 +231,6 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat | ||
4191 | } | ||
4192 | |||
4193 | if (!COMPAT_USE_64BIT_TIME) { | ||
4194 | - struct compat_timeval ctv; | ||
4195 | - struct compat_timespec cts[3]; | ||
4196 | if (level == SOL_SOCKET && type == SCM_TIMESTAMP) { | ||
4197 | struct timeval *tv = (struct timeval *)data; | ||
4198 | ctv.tv_sec = tv->tv_sec; | ||
4199 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c | ||
4200 | index 90430b7..b8052ba 100644 | ||
4201 | --- a/net/core/rtnetlink.c | ||
4202 | +++ b/net/core/rtnetlink.c | ||
4203 | @@ -671,6 +671,12 @@ static void set_operstate(struct net_device *dev, unsigned char transition) | ||
4204 | } | ||
4205 | } | ||
4206 | |||
4207 | +static unsigned int rtnl_dev_get_flags(const struct net_device *dev) | ||
4208 | +{ | ||
4209 | + return (dev->flags & ~(IFF_PROMISC | IFF_ALLMULTI)) | | ||
4210 | + (dev->gflags & (IFF_PROMISC | IFF_ALLMULTI)); | ||
4211 | +} | ||
4212 | + | ||
4213 | static unsigned int rtnl_dev_combine_flags(const struct net_device *dev, | ||
4214 | const struct ifinfomsg *ifm) | ||
4215 | { | ||
4216 | @@ -679,7 +685,7 @@ static unsigned int rtnl_dev_combine_flags(const struct net_device *dev, | ||
4217 | /* bugwards compatibility: ifi_change == 0 is treated as ~0 */ | ||
4218 | if (ifm->ifi_change) | ||
4219 | flags = (flags & ifm->ifi_change) | | ||
4220 | - (dev->flags & ~ifm->ifi_change); | ||
4221 | + (rtnl_dev_get_flags(dev) & ~ifm->ifi_change); | ||
4222 | |||
4223 | return flags; | ||
4224 | } | ||
4225 | diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c | ||
4226 | index c48adc5..667c1d4 100644 | ||
4227 | --- a/net/ipv4/cipso_ipv4.c | ||
4228 | +++ b/net/ipv4/cipso_ipv4.c | ||
4229 | @@ -1725,8 +1725,10 @@ int cipso_v4_validate(const struct sk_buff *skb, unsigned char **option) | ||
4230 | case CIPSO_V4_TAG_LOCAL: | ||
4231 | /* This is a non-standard tag that we only allow for | ||
4232 | * local connections, so if the incoming interface is | ||
4233 | - * not the loopback device drop the packet. */ | ||
4234 | - if (!(skb->dev->flags & IFF_LOOPBACK)) { | ||
4235 | + * not the loopback device drop the packet. Further, | ||
4236 | + * there is no legitimate reason for setting this from | ||
4237 | + * userspace so reject it if skb is NULL. */ | ||
4238 | + if (skb == NULL || !(skb->dev->flags & IFF_LOOPBACK)) { | ||
4239 | err_offset = opt_iter; | ||
4240 | goto validate_return_locked; | ||
4241 | } | ||
4242 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
4243 | index 6589e11..d6feb1e 100644 | ||
4244 | --- a/net/ipv4/tcp.c | ||
4245 | +++ b/net/ipv4/tcp.c | ||
4246 | @@ -2408,7 +2408,10 @@ static int do_tcp_setsockopt(struct sock *sk, int level, | ||
4247 | /* Cap the max timeout in ms TCP will retry/retrans | ||
4248 | * before giving up and aborting (ETIMEDOUT) a connection. | ||
4249 | */ | ||
4250 | - icsk->icsk_user_timeout = msecs_to_jiffies(val); | ||
4251 | + if (val < 0) | ||
4252 | + err = -EINVAL; | ||
4253 | + else | ||
4254 | + icsk->icsk_user_timeout = msecs_to_jiffies(val); | ||
4255 | break; | ||
4256 | default: | ||
4257 | err = -ENOPROTOOPT; | ||
4258 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c | ||
4259 | index 257b617..56a9c8d 100644 | ||
4260 | --- a/net/ipv4/tcp_input.c | ||
4261 | +++ b/net/ipv4/tcp_input.c | ||
4262 | @@ -5441,7 +5441,9 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb, | ||
4263 | if (tp->copied_seq == tp->rcv_nxt && | ||
4264 | len - tcp_header_len <= tp->ucopy.len) { | ||
4265 | #ifdef CONFIG_NET_DMA | ||
4266 | - if (tcp_dma_try_early_copy(sk, skb, tcp_header_len)) { | ||
4267 | + if (tp->ucopy.task == current && | ||
4268 | + sock_owned_by_user(sk) && | ||
4269 | + tcp_dma_try_early_copy(sk, skb, tcp_header_len)) { | ||
4270 | copied_early = 1; | ||
4271 | eaten = 1; | ||
4272 | } | ||
4273 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c | ||
4274 | index d132b98..25be683 100644 | ||
4275 | --- a/net/mac80211/mlme.c | ||
4276 | +++ b/net/mac80211/mlme.c | ||
4277 | @@ -1813,7 +1813,8 @@ ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, | ||
4278 | if (status_code != WLAN_STATUS_SUCCESS) { | ||
4279 | printk(KERN_DEBUG "%s: %pM denied authentication (status %d)\n", | ||
4280 | sdata->name, mgmt->sa, status_code); | ||
4281 | - goto out; | ||
4282 | + ieee80211_destroy_auth_data(sdata, false); | ||
4283 | + return RX_MGMT_CFG80211_RX_AUTH; | ||
4284 | } | ||
4285 | |||
4286 | switch (ifmgd->auth_data->algorithm) { | ||
4287 | @@ -1835,7 +1836,6 @@ ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, | ||
4288 | } | ||
4289 | |||
4290 | printk(KERN_DEBUG "%s: authenticated\n", sdata->name); | ||
4291 | - out: | ||
4292 | ifmgd->auth_data->done = true; | ||
4293 | ifmgd->auth_data->timeout = jiffies + IEEE80211_AUTH_WAIT_ASSOC; | ||
4294 | run_again(ifmgd, ifmgd->auth_data->timeout); | ||
4295 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c | ||
4296 | index ebd2296..992acaa 100644 | ||
4297 | --- a/net/sched/sch_netem.c | ||
4298 | +++ b/net/sched/sch_netem.c | ||
4299 | @@ -329,29 +329,22 @@ static psched_time_t packet_len_2_sched_time(unsigned int len, struct netem_sche | ||
4300 | return PSCHED_NS2TICKS(ticks); | ||
4301 | } | ||
4302 | |||
4303 | -static int tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | ||
4304 | +static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | ||
4305 | { | ||
4306 | struct sk_buff_head *list = &sch->q; | ||
4307 | psched_time_t tnext = netem_skb_cb(nskb)->time_to_send; | ||
4308 | - struct sk_buff *skb; | ||
4309 | - | ||
4310 | - if (likely(skb_queue_len(list) < sch->limit)) { | ||
4311 | - skb = skb_peek_tail(list); | ||
4312 | - /* Optimize for add at tail */ | ||
4313 | - if (likely(!skb || tnext >= netem_skb_cb(skb)->time_to_send)) | ||
4314 | - return qdisc_enqueue_tail(nskb, sch); | ||
4315 | + struct sk_buff *skb = skb_peek_tail(list); | ||
4316 | |||
4317 | - skb_queue_reverse_walk(list, skb) { | ||
4318 | - if (tnext >= netem_skb_cb(skb)->time_to_send) | ||
4319 | - break; | ||
4320 | - } | ||
4321 | + /* Optimize for add at tail */ | ||
4322 | + if (likely(!skb || tnext >= netem_skb_cb(skb)->time_to_send)) | ||
4323 | + return __skb_queue_tail(list, nskb); | ||
4324 | |||
4325 | - __skb_queue_after(list, skb, nskb); | ||
4326 | - sch->qstats.backlog += qdisc_pkt_len(nskb); | ||
4327 | - return NET_XMIT_SUCCESS; | ||
4328 | + skb_queue_reverse_walk(list, skb) { | ||
4329 | + if (tnext >= netem_skb_cb(skb)->time_to_send) | ||
4330 | + break; | ||
4331 | } | ||
4332 | |||
4333 | - return qdisc_reshape_fail(nskb, sch); | ||
4334 | + __skb_queue_after(list, skb, nskb); | ||
4335 | } | ||
4336 | |||
4337 | /* | ||
4338 | @@ -366,7 +359,6 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
4339 | /* We don't fill cb now as skb_unshare() may invalidate it */ | ||
4340 | struct netem_skb_cb *cb; | ||
4341 | struct sk_buff *skb2; | ||
4342 | - int ret; | ||
4343 | int count = 1; | ||
4344 | |||
4345 | /* Random duplication */ | ||
4346 | @@ -414,6 +406,11 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
4347 | skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8); | ||
4348 | } | ||
4349 | |||
4350 | + if (unlikely(skb_queue_len(&sch->q) >= sch->limit)) | ||
4351 | + return qdisc_reshape_fail(skb, sch); | ||
4352 | + | ||
4353 | + sch->qstats.backlog += qdisc_pkt_len(skb); | ||
4354 | + | ||
4355 | cb = netem_skb_cb(skb); | ||
4356 | if (q->gap == 0 || /* not doing reordering */ | ||
4357 | q->counter < q->gap - 1 || /* inside last reordering gap */ | ||
4358 | @@ -445,7 +442,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
4359 | |||
4360 | cb->time_to_send = now + delay; | ||
4361 | ++q->counter; | ||
4362 | - ret = tfifo_enqueue(skb, sch); | ||
4363 | + tfifo_enqueue(skb, sch); | ||
4364 | } else { | ||
4365 | /* | ||
4366 | * Do re-ordering by putting one out of N packets at the front | ||
4367 | @@ -455,16 +452,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
4368 | q->counter = 0; | ||
4369 | |||
4370 | __skb_queue_head(&sch->q, skb); | ||
4371 | - sch->qstats.backlog += qdisc_pkt_len(skb); | ||
4372 | sch->qstats.requeues++; | ||
4373 | - ret = NET_XMIT_SUCCESS; | ||
4374 | - } | ||
4375 | - | ||
4376 | - if (ret != NET_XMIT_SUCCESS) { | ||
4377 | - if (net_xmit_drop_count(ret)) { | ||
4378 | - sch->qstats.drops++; | ||
4379 | - return ret; | ||
4380 | - } | ||
4381 | } | ||
4382 | |||
4383 | return NET_XMIT_SUCCESS; | ||
4384 | diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c | ||
4385 | index d7eea99..c6a5867 100644 | ||
4386 | --- a/net/sched/sch_sfb.c | ||
4387 | +++ b/net/sched/sch_sfb.c | ||
4388 | @@ -570,6 +570,8 @@ static int sfb_dump(struct Qdisc *sch, struct sk_buff *skb) | ||
4389 | |||
4390 | sch->qstats.backlog = q->qdisc->qstats.backlog; | ||
4391 | opts = nla_nest_start(skb, TCA_OPTIONS); | ||
4392 | + if (opts == NULL) | ||
4393 | + goto nla_put_failure; | ||
4394 | NLA_PUT(skb, TCA_SFB_PARMS, sizeof(opt), &opt); | ||
4395 | return nla_nest_end(skb, opts); | ||
4396 | |||
4397 | diff --git a/net/sctp/input.c b/net/sctp/input.c | ||
4398 | index 80f71af..be772c0 100644 | ||
4399 | --- a/net/sctp/input.c | ||
4400 | +++ b/net/sctp/input.c | ||
4401 | @@ -736,15 +736,12 @@ static void __sctp_unhash_endpoint(struct sctp_endpoint *ep) | ||
4402 | |||
4403 | epb = &ep->base; | ||
4404 | |||
4405 | - if (hlist_unhashed(&epb->node)) | ||
4406 | - return; | ||
4407 | - | ||
4408 | epb->hashent = sctp_ep_hashfn(epb->bind_addr.port); | ||
4409 | |||
4410 | head = &sctp_ep_hashtable[epb->hashent]; | ||
4411 | |||
4412 | sctp_write_lock(&head->lock); | ||
4413 | - __hlist_del(&epb->node); | ||
4414 | + hlist_del_init(&epb->node); | ||
4415 | sctp_write_unlock(&head->lock); | ||
4416 | } | ||
4417 | |||
4418 | @@ -825,7 +822,7 @@ static void __sctp_unhash_established(struct sctp_association *asoc) | ||
4419 | head = &sctp_assoc_hashtable[epb->hashent]; | ||
4420 | |||
4421 | sctp_write_lock(&head->lock); | ||
4422 | - __hlist_del(&epb->node); | ||
4423 | + hlist_del_init(&epb->node); | ||
4424 | sctp_write_unlock(&head->lock); | ||
4425 | } | ||
4426 | |||
4427 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
4428 | index 92ba71d..dba20d6 100644 | ||
4429 | --- a/net/sctp/socket.c | ||
4430 | +++ b/net/sctp/socket.c | ||
4431 | @@ -1231,8 +1231,14 @@ out_free: | ||
4432 | SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p" | ||
4433 | " kaddrs: %p err: %d\n", | ||
4434 | asoc, kaddrs, err); | ||
4435 | - if (asoc) | ||
4436 | + if (asoc) { | ||
4437 | + /* sctp_primitive_ASSOCIATE may have added this association | ||
4438 | + * To the hash table, try to unhash it, just in case, its a noop | ||
4439 | + * if it wasn't hashed so we're safe | ||
4440 | + */ | ||
4441 | + sctp_unhash_established(asoc); | ||
4442 | sctp_association_free(asoc); | ||
4443 | + } | ||
4444 | return err; | ||
4445 | } | ||
4446 | |||
4447 | @@ -1942,8 +1948,10 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | ||
4448 | goto out_unlock; | ||
4449 | |||
4450 | out_free: | ||
4451 | - if (new_asoc) | ||
4452 | + if (new_asoc) { | ||
4453 | + sctp_unhash_established(asoc); | ||
4454 | sctp_association_free(asoc); | ||
4455 | + } | ||
4456 | out_unlock: | ||
4457 | sctp_release_sock(sk); | ||
4458 | |||
4459 | diff --git a/net/socket.c b/net/socket.c | ||
4460 | index 851edcd..573b261 100644 | ||
4461 | --- a/net/socket.c | ||
4462 | +++ b/net/socket.c | ||
4463 | @@ -522,6 +522,9 @@ void sock_release(struct socket *sock) | ||
4464 | if (rcu_dereference_protected(sock->wq, 1)->fasync_list) | ||
4465 | printk(KERN_ERR "sock_release: fasync list not empty!\n"); | ||
4466 | |||
4467 | + if (test_bit(SOCK_EXTERNALLY_ALLOCATED, &sock->flags)) | ||
4468 | + return; | ||
4469 | + | ||
4470 | percpu_sub(sockets_in_use, 1); | ||
4471 | if (!sock->file) { | ||
4472 | iput(SOCK_INODE(sock)); | ||
4473 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c | ||
4474 | index 994cfea..eda32ae 100644 | ||
4475 | --- a/net/sunrpc/sched.c | ||
4476 | +++ b/net/sunrpc/sched.c | ||
4477 | @@ -790,7 +790,9 @@ void rpc_execute(struct rpc_task *task) | ||
4478 | |||
4479 | static void rpc_async_schedule(struct work_struct *work) | ||
4480 | { | ||
4481 | + current->flags |= PF_FSTRANS; | ||
4482 | __rpc_execute(container_of(work, struct rpc_task, u.tk_work)); | ||
4483 | + current->flags &= ~PF_FSTRANS; | ||
4484 | } | ||
4485 | |||
4486 | /** | ||
4487 | diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c | ||
4488 | index b446e10..06cdbff 100644 | ||
4489 | --- a/net/sunrpc/xprtrdma/transport.c | ||
4490 | +++ b/net/sunrpc/xprtrdma/transport.c | ||
4491 | @@ -200,6 +200,7 @@ xprt_rdma_connect_worker(struct work_struct *work) | ||
4492 | int rc = 0; | ||
4493 | |||
4494 | if (!xprt->shutdown) { | ||
4495 | + current->flags |= PF_FSTRANS; | ||
4496 | xprt_clear_connected(xprt); | ||
4497 | |||
4498 | dprintk("RPC: %s: %sconnect\n", __func__, | ||
4499 | @@ -212,10 +213,10 @@ xprt_rdma_connect_worker(struct work_struct *work) | ||
4500 | |||
4501 | out: | ||
4502 | xprt_wake_pending_tasks(xprt, rc); | ||
4503 | - | ||
4504 | out_clear: | ||
4505 | dprintk("RPC: %s: exit\n", __func__); | ||
4506 | xprt_clear_connecting(xprt); | ||
4507 | + current->flags &= ~PF_FSTRANS; | ||
4508 | } | ||
4509 | |||
4510 | /* | ||
4511 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c | ||
4512 | index 890b03f..b88c6bf 100644 | ||
4513 | --- a/net/sunrpc/xprtsock.c | ||
4514 | +++ b/net/sunrpc/xprtsock.c | ||
4515 | @@ -1895,6 +1895,8 @@ static void xs_local_setup_socket(struct work_struct *work) | ||
4516 | if (xprt->shutdown) | ||
4517 | goto out; | ||
4518 | |||
4519 | + current->flags |= PF_FSTRANS; | ||
4520 | + | ||
4521 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); | ||
4522 | status = __sock_create(xprt->xprt_net, AF_LOCAL, | ||
4523 | SOCK_STREAM, 0, &sock, 1); | ||
4524 | @@ -1928,6 +1930,7 @@ static void xs_local_setup_socket(struct work_struct *work) | ||
4525 | out: | ||
4526 | xprt_clear_connecting(xprt); | ||
4527 | xprt_wake_pending_tasks(xprt, status); | ||
4528 | + current->flags &= ~PF_FSTRANS; | ||
4529 | } | ||
4530 | |||
4531 | static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | ||
4532 | @@ -1970,6 +1973,8 @@ static void xs_udp_setup_socket(struct work_struct *work) | ||
4533 | if (xprt->shutdown) | ||
4534 | goto out; | ||
4535 | |||
4536 | + current->flags |= PF_FSTRANS; | ||
4537 | + | ||
4538 | /* Start by resetting any existing state */ | ||
4539 | xs_reset_transport(transport); | ||
4540 | sock = xs_create_sock(xprt, transport, | ||
4541 | @@ -1988,6 +1993,7 @@ static void xs_udp_setup_socket(struct work_struct *work) | ||
4542 | out: | ||
4543 | xprt_clear_connecting(xprt); | ||
4544 | xprt_wake_pending_tasks(xprt, status); | ||
4545 | + current->flags &= ~PF_FSTRANS; | ||
4546 | } | ||
4547 | |||
4548 | /* | ||
4549 | @@ -2113,6 +2119,8 @@ static void xs_tcp_setup_socket(struct work_struct *work) | ||
4550 | if (xprt->shutdown) | ||
4551 | goto out; | ||
4552 | |||
4553 | + current->flags |= PF_FSTRANS; | ||
4554 | + | ||
4555 | if (!sock) { | ||
4556 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); | ||
4557 | sock = xs_create_sock(xprt, transport, | ||
4558 | @@ -2162,6 +2170,7 @@ static void xs_tcp_setup_socket(struct work_struct *work) | ||
4559 | case -EINPROGRESS: | ||
4560 | case -EALREADY: | ||
4561 | xprt_clear_connecting(xprt); | ||
4562 | + current->flags &= ~PF_FSTRANS; | ||
4563 | return; | ||
4564 | case -EINVAL: | ||
4565 | /* Happens, for instance, if the user specified a link | ||
4566 | @@ -2174,6 +2183,7 @@ out_eagain: | ||
4567 | out: | ||
4568 | xprt_clear_connecting(xprt); | ||
4569 | xprt_wake_pending_tasks(xprt, status); | ||
4570 | + current->flags &= ~PF_FSTRANS; | ||
4571 | } | ||
4572 | |||
4573 | /** | ||
4574 | diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c | ||
4575 | index 788a12c..2ab7850 100644 | ||
4576 | --- a/net/wanrouter/wanmain.c | ||
4577 | +++ b/net/wanrouter/wanmain.c | ||
4578 | @@ -602,36 +602,31 @@ static int wanrouter_device_new_if(struct wan_device *wandev, | ||
4579 | * successfully, add it to the interface list. | ||
4580 | */ | ||
4581 | |||
4582 | - if (dev->name == NULL) { | ||
4583 | - err = -EINVAL; | ||
4584 | - } else { | ||
4585 | +#ifdef WANDEBUG | ||
4586 | + printk(KERN_INFO "%s: registering interface %s...\n", | ||
4587 | + wanrouter_modname, dev->name); | ||
4588 | +#endif | ||
4589 | |||
4590 | - #ifdef WANDEBUG | ||
4591 | - printk(KERN_INFO "%s: registering interface %s...\n", | ||
4592 | - wanrouter_modname, dev->name); | ||
4593 | - #endif | ||
4594 | - | ||
4595 | - err = register_netdev(dev); | ||
4596 | - if (!err) { | ||
4597 | - struct net_device *slave = NULL; | ||
4598 | - unsigned long smp_flags=0; | ||
4599 | - | ||
4600 | - lock_adapter_irq(&wandev->lock, &smp_flags); | ||
4601 | - | ||
4602 | - if (wandev->dev == NULL) { | ||
4603 | - wandev->dev = dev; | ||
4604 | - } else { | ||
4605 | - for (slave=wandev->dev; | ||
4606 | - DEV_TO_SLAVE(slave); | ||
4607 | - slave = DEV_TO_SLAVE(slave)) | ||
4608 | - DEV_TO_SLAVE(slave) = dev; | ||
4609 | - } | ||
4610 | - ++wandev->ndev; | ||
4611 | - | ||
4612 | - unlock_adapter_irq(&wandev->lock, &smp_flags); | ||
4613 | - err = 0; /* done !!! */ | ||
4614 | - goto out; | ||
4615 | + err = register_netdev(dev); | ||
4616 | + if (!err) { | ||
4617 | + struct net_device *slave = NULL; | ||
4618 | + unsigned long smp_flags=0; | ||
4619 | + | ||
4620 | + lock_adapter_irq(&wandev->lock, &smp_flags); | ||
4621 | + | ||
4622 | + if (wandev->dev == NULL) { | ||
4623 | + wandev->dev = dev; | ||
4624 | + } else { | ||
4625 | + for (slave=wandev->dev; | ||
4626 | + DEV_TO_SLAVE(slave); | ||
4627 | + slave = DEV_TO_SLAVE(slave)) | ||
4628 | + DEV_TO_SLAVE(slave) = dev; | ||
4629 | } | ||
4630 | + ++wandev->ndev; | ||
4631 | + | ||
4632 | + unlock_adapter_irq(&wandev->lock, &smp_flags); | ||
4633 | + err = 0; /* done !!! */ | ||
4634 | + goto out; | ||
4635 | } | ||
4636 | if (wandev->del_if) | ||
4637 | wandev->del_if(wandev, dev); | ||
4638 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c | ||
4639 | index d85b793..5626222 100644 | ||
4640 | --- a/security/selinux/hooks.c | ||
4641 | +++ b/security/selinux/hooks.c | ||
4642 | @@ -2162,7 +2162,7 @@ static inline void flush_unauthorized_files(const struct cred *cred, | ||
4643 | int fd; | ||
4644 | |||
4645 | j++; | ||
4646 | - i = j * __NFDBITS; | ||
4647 | + i = j * BITS_PER_LONG; | ||
4648 | fdt = files_fdtable(files); | ||
4649 | if (i >= fdt->max_fds) | ||
4650 | break; | ||
4651 | diff --git a/sound/drivers/mpu401/mpu401_uart.c b/sound/drivers/mpu401/mpu401_uart.c | ||
4652 | index 1cff331..4608c2c 100644 | ||
4653 | --- a/sound/drivers/mpu401/mpu401_uart.c | ||
4654 | +++ b/sound/drivers/mpu401/mpu401_uart.c | ||
4655 | @@ -554,6 +554,7 @@ int snd_mpu401_uart_new(struct snd_card *card, int device, | ||
4656 | spin_lock_init(&mpu->output_lock); | ||
4657 | spin_lock_init(&mpu->timer_lock); | ||
4658 | mpu->hardware = hardware; | ||
4659 | + mpu->irq = -1; | ||
4660 | if (! (info_flags & MPU401_INFO_INTEGRATED)) { | ||
4661 | int res_size = hardware == MPU401_HW_PC98II ? 4 : 2; | ||
4662 | mpu->res = request_region(port, res_size, "MPU401 UART"); | ||
4663 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
4664 | index 83f345f..d1b805a 100644 | ||
4665 | --- a/sound/pci/hda/patch_hdmi.c | ||
4666 | +++ b/sound/pci/hda/patch_hdmi.c | ||
4667 | @@ -876,7 +876,6 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | ||
4668 | struct hdmi_spec_per_pin *per_pin; | ||
4669 | struct hdmi_eld *eld; | ||
4670 | struct hdmi_spec_per_cvt *per_cvt = NULL; | ||
4671 | - int pinctl; | ||
4672 | |||
4673 | /* Validate hinfo */ | ||
4674 | pin_idx = hinfo_to_pin_index(spec, hinfo); | ||
4675 | @@ -912,11 +911,6 @@ static int hdmi_pcm_open(struct hda_pcm_stream *hinfo, | ||
4676 | snd_hda_codec_write(codec, per_pin->pin_nid, 0, | ||
4677 | AC_VERB_SET_CONNECT_SEL, | ||
4678 | mux_idx); | ||
4679 | - pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, | ||
4680 | - AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
4681 | - snd_hda_codec_write(codec, per_pin->pin_nid, 0, | ||
4682 | - AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
4683 | - pinctl | PIN_OUT); | ||
4684 | snd_hda_spdif_ctls_assign(codec, pin_idx, per_cvt->cvt_nid); | ||
4685 | |||
4686 | /* Initially set the converter's capabilities */ | ||
4687 | @@ -1153,11 +1147,17 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, | ||
4688 | struct hdmi_spec *spec = codec->spec; | ||
4689 | int pin_idx = hinfo_to_pin_index(spec, hinfo); | ||
4690 | hda_nid_t pin_nid = spec->pins[pin_idx].pin_nid; | ||
4691 | + int pinctl; | ||
4692 | |||
4693 | hdmi_set_channel_count(codec, cvt_nid, substream->runtime->channels); | ||
4694 | |||
4695 | hdmi_setup_audio_infoframe(codec, pin_idx, substream); | ||
4696 | |||
4697 | + pinctl = snd_hda_codec_read(codec, pin_nid, 0, | ||
4698 | + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); | ||
4699 | + snd_hda_codec_write(codec, pin_nid, 0, | ||
4700 | + AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl | PIN_OUT); | ||
4701 | + | ||
4702 | return hdmi_setup_stream(codec, cvt_nid, pin_nid, stream_tag, format); | ||
4703 | } | ||
4704 | |||
4705 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
4706 | index c43264f..62e1627 100644 | ||
4707 | --- a/sound/pci/hda/patch_realtek.c | ||
4708 | +++ b/sound/pci/hda/patch_realtek.c | ||
4709 | @@ -5858,6 +5858,15 @@ static int alc269_resume(struct hda_codec *codec) | ||
4710 | } | ||
4711 | #endif /* CONFIG_PM */ | ||
4712 | |||
4713 | +static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec, | ||
4714 | + const struct alc_fixup *fix, int action) | ||
4715 | +{ | ||
4716 | + struct alc_spec *spec = codec->spec; | ||
4717 | + | ||
4718 | + if (action == ALC_FIXUP_ACT_PRE_PROBE) | ||
4719 | + spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; | ||
4720 | +} | ||
4721 | + | ||
4722 | static void alc269_fixup_hweq(struct hda_codec *codec, | ||
4723 | const struct alc_fixup *fix, int action) | ||
4724 | { | ||
4725 | @@ -5984,6 +5993,8 @@ enum { | ||
4726 | ALC269VB_FIXUP_AMIC, | ||
4727 | ALC269VB_FIXUP_DMIC, | ||
4728 | ALC269_FIXUP_MIC2_MUTE_LED, | ||
4729 | + ALC269_FIXUP_LENOVO_DOCK, | ||
4730 | + ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT, | ||
4731 | }; | ||
4732 | |||
4733 | static const struct alc_fixup alc269_fixups[] = { | ||
4734 | @@ -6108,6 +6119,20 @@ static const struct alc_fixup alc269_fixups[] = { | ||
4735 | .type = ALC_FIXUP_FUNC, | ||
4736 | .v.func = alc269_fixup_mic2_mute, | ||
4737 | }, | ||
4738 | + [ALC269_FIXUP_LENOVO_DOCK] = { | ||
4739 | + .type = ALC_FIXUP_PINS, | ||
4740 | + .v.pins = (const struct alc_pincfg[]) { | ||
4741 | + { 0x19, 0x23a11040 }, /* dock mic */ | ||
4742 | + { 0x1b, 0x2121103f }, /* dock headphone */ | ||
4743 | + { } | ||
4744 | + }, | ||
4745 | + .chained = true, | ||
4746 | + .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT | ||
4747 | + }, | ||
4748 | + [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = { | ||
4749 | + .type = ALC_FIXUP_FUNC, | ||
4750 | + .v.func = alc269_fixup_pincfg_no_hp_to_lineout, | ||
4751 | + }, | ||
4752 | }; | ||
4753 | |||
4754 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
4755 | @@ -6131,6 +6156,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
4756 | SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), | ||
4757 | SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE), | ||
4758 | SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE), | ||
4759 | + SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK), | ||
4760 | + SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), | ||
4761 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_QUANTA_MUTE), | ||
4762 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Lenovo Ideapd", ALC269_FIXUP_PCM_44K), | ||
4763 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), | ||
4764 | @@ -6189,6 +6216,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
4765 | static const struct alc_model_fixup alc269_fixup_models[] = { | ||
4766 | {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"}, | ||
4767 | {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"}, | ||
4768 | + {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"}, | ||
4769 | {} | ||
4770 | }; | ||
4771 | |||
4772 | @@ -6977,6 +7005,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { | ||
4773 | { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 }, | ||
4774 | { .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 }, | ||
4775 | { .id = 0x10ec0280, .name = "ALC280", .patch = patch_alc269 }, | ||
4776 | + { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, | ||
4777 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", | ||
4778 | .patch = patch_alc861 }, | ||
4779 | { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, | ||
4780 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c | ||
4781 | index 7494fbc..fd53312 100644 | ||
4782 | --- a/sound/pci/hda/patch_sigmatel.c | ||
4783 | +++ b/sound/pci/hda/patch_sigmatel.c | ||
4784 | @@ -100,6 +100,8 @@ enum { | ||
4785 | STAC_92HD83XXX_HP_cNB11_INTQUAD, | ||
4786 | STAC_HP_DV7_4000, | ||
4787 | STAC_HP_ZEPHYR, | ||
4788 | + STAC_92HD83XXX_HP_LED, | ||
4789 | + STAC_92HD83XXX_HP_INV_LED, | ||
4790 | STAC_92HD83XXX_MODELS | ||
4791 | }; | ||
4792 | |||
4793 | @@ -1672,6 +1674,8 @@ static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | ||
4794 | [STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad", | ||
4795 | [STAC_HP_DV7_4000] = "hp-dv7-4000", | ||
4796 | [STAC_HP_ZEPHYR] = "hp-zephyr", | ||
4797 | + [STAC_92HD83XXX_HP_LED] = "hp-led", | ||
4798 | + [STAC_92HD83XXX_HP_INV_LED] = "hp-inv-led", | ||
4799 | }; | ||
4800 | |||
4801 | static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { | ||
4802 | @@ -1726,6 +1730,8 @@ static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { | ||
4803 | "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD), | ||
4804 | SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3561, | ||
4805 | "HP", STAC_HP_ZEPHYR), | ||
4806 | + SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3660, | ||
4807 | + "HP Mini", STAC_92HD83XXX_HP_LED), | ||
4808 | {} /* terminator */ | ||
4809 | }; | ||
4810 | |||
4811 | @@ -4431,7 +4437,13 @@ static int stac92xx_init(struct hda_codec *codec) | ||
4812 | snd_hda_jack_report_sync(codec); | ||
4813 | |||
4814 | /* sync mute LED */ | ||
4815 | - snd_hda_sync_vmaster_hook(&spec->vmaster_mute); | ||
4816 | + if (spec->gpio_led) { | ||
4817 | + if (spec->vmaster_mute.hook) | ||
4818 | + snd_hda_sync_vmaster_hook(&spec->vmaster_mute); | ||
4819 | + else /* the very first init call doesn't have vmaster yet */ | ||
4820 | + stac92xx_update_led_status(codec, false); | ||
4821 | + } | ||
4822 | + | ||
4823 | if (spec->dac_list) | ||
4824 | stac92xx_power_down(codec); | ||
4825 | return 0; | ||
4826 | @@ -5528,6 +5540,7 @@ static void stac92hd8x_fill_auto_spec(struct hda_codec *codec) | ||
4827 | static int patch_stac92hd83xxx(struct hda_codec *codec) | ||
4828 | { | ||
4829 | struct sigmatel_spec *spec; | ||
4830 | + int default_polarity = -1; /* no default cfg */ | ||
4831 | int err; | ||
4832 | |||
4833 | spec = kzalloc(sizeof(*spec), GFP_KERNEL); | ||
4834 | @@ -5576,9 +5589,15 @@ again: | ||
4835 | case STAC_HP_ZEPHYR: | ||
4836 | spec->init = stac92hd83xxx_hp_zephyr_init; | ||
4837 | break; | ||
4838 | + case STAC_92HD83XXX_HP_LED: | ||
4839 | + default_polarity = 0; | ||
4840 | + break; | ||
4841 | + case STAC_92HD83XXX_HP_INV_LED: | ||
4842 | + default_polarity = 1; | ||
4843 | + break; | ||
4844 | } | ||
4845 | |||
4846 | - if (find_mute_led_cfg(codec, -1/*no default cfg*/)) | ||
4847 | + if (find_mute_led_cfg(codec, default_polarity)) | ||
4848 | snd_printd("mute LED gpio %d polarity %d\n", | ||
4849 | spec->gpio_led, | ||
4850 | spec->gpio_led_polarity); | ||
4851 | diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c | ||
4852 | index 06214fd..3998d09b 100644 | ||
4853 | --- a/sound/pci/hda/patch_via.c | ||
4854 | +++ b/sound/pci/hda/patch_via.c | ||
4855 | @@ -3233,7 +3233,7 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec) | ||
4856 | { | ||
4857 | struct via_spec *spec = codec->spec; | ||
4858 | int imux_is_smixer; | ||
4859 | - unsigned int parm; | ||
4860 | + unsigned int parm, parm2; | ||
4861 | /* MUX6 (1eh) = stereo mixer */ | ||
4862 | imux_is_smixer = | ||
4863 | snd_hda_codec_read(codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5; | ||
4864 | @@ -3256,7 +3256,7 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec) | ||
4865 | parm = AC_PWRST_D3; | ||
4866 | set_pin_power_state(codec, 0x27, &parm); | ||
4867 | update_power_state(codec, 0x1a, parm); | ||
4868 | - update_power_state(codec, 0xb, parm); | ||
4869 | + parm2 = parm; /* for pin 0x0b */ | ||
4870 | |||
4871 | /* PW2 (26h), AOW2 (ah) */ | ||
4872 | parm = AC_PWRST_D3; | ||
4873 | @@ -3271,6 +3271,9 @@ static void set_widgets_power_state_vt1718S(struct hda_codec *codec) | ||
4874 | if (!spec->hp_independent_mode) /* check for redirected HP */ | ||
4875 | set_pin_power_state(codec, 0x28, &parm); | ||
4876 | update_power_state(codec, 0x8, parm); | ||
4877 | + if (!spec->hp_independent_mode && parm2 != AC_PWRST_D3) | ||
4878 | + parm = parm2; | ||
4879 | + update_power_state(codec, 0xb, parm); | ||
4880 | /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ | ||
4881 | update_power_state(codec, 0x21, imux_is_smixer ? AC_PWRST_D0 : parm); | ||
4882 | |||
4883 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c | ||
4884 | index 15d467f..96f6f9f 100644 | ||
4885 | --- a/sound/soc/codecs/wm8962.c | ||
4886 | +++ b/sound/soc/codecs/wm8962.c | ||
4887 | @@ -2488,6 +2488,9 @@ static int wm8962_set_bias_level(struct snd_soc_codec *codec, | ||
4888 | /* VMID 2*250k */ | ||
4889 | snd_soc_update_bits(codec, WM8962_PWR_MGMT_1, | ||
4890 | WM8962_VMID_SEL_MASK, 0x100); | ||
4891 | + | ||
4892 | + if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) | ||
4893 | + msleep(100); | ||
4894 | break; | ||
4895 | |||
4896 | case SND_SOC_BIAS_OFF: | ||
4897 | @@ -3710,6 +3713,9 @@ static int wm8962_runtime_resume(struct device *dev) | ||
4898 | } | ||
4899 | |||
4900 | regcache_cache_only(wm8962->regmap, false); | ||
4901 | + | ||
4902 | + wm8962_reset(wm8962); | ||
4903 | + | ||
4904 | regcache_sync(wm8962->regmap); | ||
4905 | |||
4906 | regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, | ||
4907 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c | ||
4908 | index f351b93..4c471a5 100644 | ||
4909 | --- a/sound/soc/codecs/wm8994.c | ||
4910 | +++ b/sound/soc/codecs/wm8994.c | ||
4911 | @@ -2695,7 +2695,7 @@ static int wm8994_hw_params(struct snd_pcm_substream *substream, | ||
4912 | return -EINVAL; | ||
4913 | } | ||
4914 | |||
4915 | - bclk_rate = params_rate(params) * 2; | ||
4916 | + bclk_rate = params_rate(params) * 4; | ||
4917 | switch (params_format(params)) { | ||
4918 | case SNDRV_PCM_FORMAT_S16_LE: | ||
4919 | bclk_rate *= 16; | ||
4920 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c | ||
4921 | index 1bb6d4a..c41efe0 100644 | ||
4922 | --- a/sound/soc/soc-dapm.c | ||
4923 | +++ b/sound/soc/soc-dapm.c | ||
4924 | @@ -1442,7 +1442,15 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event) | ||
4925 | } | ||
4926 | |||
4927 | list_for_each_entry(w, &card->widgets, list) { | ||
4928 | - list_del_init(&w->dirty); | ||
4929 | + switch (w->id) { | ||
4930 | + case snd_soc_dapm_pre: | ||
4931 | + case snd_soc_dapm_post: | ||
4932 | + /* These widgets always need to be powered */ | ||
4933 | + break; | ||
4934 | + default: | ||
4935 | + list_del_init(&w->dirty); | ||
4936 | + break; | ||
4937 | + } | ||
4938 | |||
4939 | if (w->power) { | ||
4940 | d = w->dapm; | ||
4941 | diff --git a/sound/usb/clock.c b/sound/usb/clock.c | ||
4942 | index 379baad..5e634a2 100644 | ||
4943 | --- a/sound/usb/clock.c | ||
4944 | +++ b/sound/usb/clock.c | ||
4945 | @@ -111,7 +111,8 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, int source_id) | ||
4946 | return 0; | ||
4947 | |||
4948 | /* If a clock source can't tell us whether it's valid, we assume it is */ | ||
4949 | - if (!uac2_control_is_readable(cs_desc->bmControls, UAC2_CS_CONTROL_CLOCK_VALID)) | ||
4950 | + if (!uac2_control_is_readable(cs_desc->bmControls, | ||
4951 | + UAC2_CS_CONTROL_CLOCK_VALID - 1)) | ||
4952 | return 1; | ||
4953 | |||
4954 | err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, |