Annotation of /trunk/kernel26-magellan-server/patches-2.6.25-r4/0105-2.6.25.6-all-fixes.patch
Parent Directory | Revision Log
Revision 665 -
(hide annotations)
(download)
Wed Jul 30 14:06:06 2008 UTC (16 years, 1 month ago) by niro
File size: 63706 byte(s)
Wed Jul 30 14:06:06 2008 UTC (16 years, 1 month ago) by niro
File size: 63706 byte(s)
-2.6.25-magellan-r4; updated to linux-2.6.25.10
1 | niro | 665 | diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c |
2 | index be35ffa..1457aa0 100644 | ||
3 | --- a/arch/powerpc/kernel/smp.c | ||
4 | +++ b/arch/powerpc/kernel/smp.c | ||
5 | @@ -386,6 +386,8 @@ static void __init smp_create_idle(unsigned int cpu) | ||
6 | panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); | ||
7 | #ifdef CONFIG_PPC64 | ||
8 | paca[cpu].__current = p; | ||
9 | + paca[cpu].kstack = (unsigned long) task_thread_info(p) | ||
10 | + + THREAD_SIZE - STACK_FRAME_OVERHEAD; | ||
11 | #endif | ||
12 | current_set[cpu] = task_thread_info(p); | ||
13 | task_thread_info(p)->cpu = cpu; | ||
14 | diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c | ||
15 | index 906daed..a9626d6 100644 | ||
16 | --- a/arch/powerpc/mm/slb.c | ||
17 | +++ b/arch/powerpc/mm/slb.c | ||
18 | @@ -44,13 +44,13 @@ static void slb_allocate(unsigned long ea) | ||
19 | slb_allocate_realmode(ea); | ||
20 | } | ||
21 | |||
22 | +#define slb_esid_mask(ssize) \ | ||
23 | + (((ssize) == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T) | ||
24 | + | ||
25 | static inline unsigned long mk_esid_data(unsigned long ea, int ssize, | ||
26 | unsigned long slot) | ||
27 | { | ||
28 | - unsigned long mask; | ||
29 | - | ||
30 | - mask = (ssize == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T; | ||
31 | - return (ea & mask) | SLB_ESID_V | slot; | ||
32 | + return (ea & slb_esid_mask(ssize)) | SLB_ESID_V | slot; | ||
33 | } | ||
34 | |||
35 | #define slb_vsid_shift(ssize) \ | ||
36 | @@ -301,11 +301,16 @@ void slb_initialize(void) | ||
37 | |||
38 | create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1); | ||
39 | |||
40 | + /* For the boot cpu, we're running on the stack in init_thread_union, | ||
41 | + * which is in the first segment of the linear mapping, and also | ||
42 | + * get_paca()->kstack hasn't been initialized yet. | ||
43 | + * For secondary cpus, we need to bolt the kernel stack entry now. | ||
44 | + */ | ||
45 | slb_shadow_clear(2); | ||
46 | + if (raw_smp_processor_id() != boot_cpuid && | ||
47 | + (get_paca()->kstack & slb_esid_mask(mmu_kernel_ssize)) > PAGE_OFFSET) | ||
48 | + create_shadowed_slbe(get_paca()->kstack, | ||
49 | + mmu_kernel_ssize, lflags, 2); | ||
50 | |||
51 | - /* We don't bolt the stack for the time being - we're in boot, | ||
52 | - * so the stack is in the bolted segment. By the time it goes | ||
53 | - * elsewhere, we'll call _switch() which will bolt in the new | ||
54 | - * one. */ | ||
55 | asm volatile("isync":::"memory"); | ||
56 | } | ||
57 | diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c | ||
58 | index d8d03e0..9629434 100644 | ||
59 | --- a/arch/x86/kernel/apic_64.c | ||
60 | +++ b/arch/x86/kernel/apic_64.c | ||
61 | @@ -524,7 +524,7 @@ int setup_profiling_timer(unsigned int multiplier) | ||
62 | */ | ||
63 | void clear_local_APIC(void) | ||
64 | { | ||
65 | - int maxlvt = lapic_get_maxlvt(); | ||
66 | + int maxlvt; | ||
67 | u32 v; | ||
68 | |||
69 | /* APIC hasn't been mapped yet */ | ||
70 | diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | ||
71 | index a962dcb..404ff26 100644 | ||
72 | --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | ||
73 | +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | ||
74 | @@ -339,6 +339,7 @@ static unsigned int get_cur_freq_on_cpu(unsigned int cpu) | ||
75 | { | ||
76 | struct acpi_cpufreq_data *data = per_cpu(drv_data, cpu); | ||
77 | unsigned int freq; | ||
78 | + unsigned int cached_freq; | ||
79 | |||
80 | dprintk("get_cur_freq_on_cpu (%d)\n", cpu); | ||
81 | |||
82 | @@ -347,7 +348,16 @@ static unsigned int get_cur_freq_on_cpu(unsigned int cpu) | ||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | + cached_freq = data->freq_table[data->acpi_data->state].frequency; | ||
87 | freq = extract_freq(get_cur_val(cpumask_of_cpu(cpu)), data); | ||
88 | + if (freq != cached_freq) { | ||
89 | + /* | ||
90 | + * The dreaded BIOS frequency change behind our back. | ||
91 | + * Force set the frequency on next target call. | ||
92 | + */ | ||
93 | + data->resume = 1; | ||
94 | + } | ||
95 | + | ||
96 | dprintk("cur freq = %u\n", freq); | ||
97 | |||
98 | return freq; | ||
99 | diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c | ||
100 | index cef054b..89bb5ee 100644 | ||
101 | --- a/arch/x86/kernel/irq_32.c | ||
102 | +++ b/arch/x86/kernel/irq_32.c | ||
103 | @@ -134,7 +134,7 @@ unsigned int do_IRQ(struct pt_regs *regs) | ||
104 | : "=a" (arg1), "=d" (arg2), "=b" (bx) | ||
105 | : "0" (irq), "1" (desc), "2" (isp), | ||
106 | "D" (desc->handle_irq) | ||
107 | - : "memory", "cc" | ||
108 | + : "memory", "cc", "ecx" | ||
109 | ); | ||
110 | } else | ||
111 | #endif | ||
112 | diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c | ||
113 | index 43930e7..c8890b8 100644 | ||
114 | --- a/arch/x86/kernel/process_32.c | ||
115 | +++ b/arch/x86/kernel/process_32.c | ||
116 | @@ -710,8 +710,11 @@ struct task_struct * __switch_to(struct task_struct *prev_p, struct task_struct | ||
117 | /* If the task has used fpu the last 5 timeslices, just do a full | ||
118 | * restore of the math state immediately to avoid the trap; the | ||
119 | * chances of needing FPU soon are obviously high now | ||
120 | + * | ||
121 | + * tsk_used_math() checks prevent calling math_state_restore(), | ||
122 | + * which can sleep in the case of !tsk_used_math() | ||
123 | */ | ||
124 | - if (next_p->fpu_counter > 5) | ||
125 | + if (tsk_used_math(next_p) && next_p->fpu_counter > 5) | ||
126 | math_state_restore(); | ||
127 | |||
128 | /* | ||
129 | diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c | ||
130 | index 46c4c54..1316f1c 100644 | ||
131 | --- a/arch/x86/kernel/process_64.c | ||
132 | +++ b/arch/x86/kernel/process_64.c | ||
133 | @@ -696,8 +696,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | ||
134 | /* If the task has used fpu the last 5 timeslices, just do a full | ||
135 | * restore of the math state immediately to avoid the trap; the | ||
136 | * chances of needing FPU soon are obviously high now | ||
137 | + * | ||
138 | + * tsk_used_math() checks prevent calling math_state_restore(), | ||
139 | + * which can sleep in the case of !tsk_used_math() | ||
140 | */ | ||
141 | - if (next_p->fpu_counter>5) | ||
142 | + if (tsk_used_math(next_p) && next_p->fpu_counter > 5) | ||
143 | math_state_restore(); | ||
144 | return prev_p; | ||
145 | } | ||
146 | diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c | ||
147 | index eb92ccb..9003e0b 100644 | ||
148 | --- a/arch/x86/kernel/ptrace.c | ||
149 | +++ b/arch/x86/kernel/ptrace.c | ||
150 | @@ -1382,6 +1382,9 @@ static const struct user_regset_view user_x86_64_view = { | ||
151 | #define genregs32_get genregs_get | ||
152 | #define genregs32_set genregs_set | ||
153 | |||
154 | +#define user_i387_ia32_struct user_i387_struct | ||
155 | +#define user32_fxsr_struct user_fxsr_struct | ||
156 | + | ||
157 | #endif /* CONFIG_X86_64 */ | ||
158 | |||
159 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION | ||
160 | @@ -1394,13 +1397,13 @@ static const struct user_regset x86_32_regsets[] = { | ||
161 | }, | ||
162 | [REGSET_FP] = { | ||
163 | .core_note_type = NT_PRFPREG, | ||
164 | - .n = sizeof(struct user_i387_struct) / sizeof(u32), | ||
165 | + .n = sizeof(struct user_i387_ia32_struct) / sizeof(u32), | ||
166 | .size = sizeof(u32), .align = sizeof(u32), | ||
167 | .active = fpregs_active, .get = fpregs_get, .set = fpregs_set | ||
168 | }, | ||
169 | [REGSET_XFP] = { | ||
170 | .core_note_type = NT_PRXFPREG, | ||
171 | - .n = sizeof(struct user_i387_struct) / sizeof(u32), | ||
172 | + .n = sizeof(struct user32_fxsr_struct) / sizeof(u32), | ||
173 | .size = sizeof(u32), .align = sizeof(u32), | ||
174 | .active = xfpregs_active, .get = xfpregs_get, .set = xfpregs_set | ||
175 | }, | ||
176 | diff --git a/arch/x86/kernel/tsc_32.c b/arch/x86/kernel/tsc_32.c | ||
177 | index c2241e0..01e4f8b 100644 | ||
178 | --- a/arch/x86/kernel/tsc_32.c | ||
179 | +++ b/arch/x86/kernel/tsc_32.c | ||
180 | @@ -14,7 +14,7 @@ | ||
181 | |||
182 | #include "mach_timer.h" | ||
183 | |||
184 | -static int tsc_enabled; | ||
185 | +static int tsc_disabled; | ||
186 | |||
187 | /* | ||
188 | * On some systems the TSC frequency does not | ||
189 | @@ -28,8 +28,8 @@ EXPORT_SYMBOL_GPL(tsc_khz); | ||
190 | static int __init tsc_setup(char *str) | ||
191 | { | ||
192 | printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, " | ||
193 | - "cannot disable TSC completely.\n"); | ||
194 | - mark_tsc_unstable("user disabled TSC"); | ||
195 | + "cannot disable TSC completely.\n"); | ||
196 | + tsc_disabled = 1; | ||
197 | return 1; | ||
198 | } | ||
199 | #else | ||
200 | @@ -121,7 +121,7 @@ unsigned long long native_sched_clock(void) | ||
201 | * very important for it to be as fast as the platform | ||
202 | * can achive it. ) | ||
203 | */ | ||
204 | - if (unlikely(!tsc_enabled && !tsc_unstable)) | ||
205 | + if (unlikely(tsc_disabled)) | ||
206 | /* No locking but a rare wrong value is not a big deal: */ | ||
207 | return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ); | ||
208 | |||
209 | @@ -310,7 +310,6 @@ void mark_tsc_unstable(char *reason) | ||
210 | { | ||
211 | if (!tsc_unstable) { | ||
212 | tsc_unstable = 1; | ||
213 | - tsc_enabled = 0; | ||
214 | printk("Marking TSC unstable due to: %s.\n", reason); | ||
215 | /* Can be called before registration */ | ||
216 | if (clocksource_tsc.mult) | ||
217 | @@ -324,7 +323,7 @@ EXPORT_SYMBOL_GPL(mark_tsc_unstable); | ||
218 | static int __init dmi_mark_tsc_unstable(const struct dmi_system_id *d) | ||
219 | { | ||
220 | printk(KERN_NOTICE "%s detected: marking TSC unstable.\n", | ||
221 | - d->ident); | ||
222 | + d->ident); | ||
223 | tsc_unstable = 1; | ||
224 | return 0; | ||
225 | } | ||
226 | @@ -391,14 +390,24 @@ void __init tsc_init(void) | ||
227 | { | ||
228 | int cpu; | ||
229 | |||
230 | - if (!cpu_has_tsc) | ||
231 | - goto out_no_tsc; | ||
232 | + if (!cpu_has_tsc || tsc_disabled) { | ||
233 | + /* Disable the TSC in case of !cpu_has_tsc */ | ||
234 | + tsc_disabled = 1; | ||
235 | + return; | ||
236 | + } | ||
237 | |||
238 | cpu_khz = calculate_cpu_khz(); | ||
239 | tsc_khz = cpu_khz; | ||
240 | |||
241 | - if (!cpu_khz) | ||
242 | - goto out_no_tsc; | ||
243 | + if (!cpu_khz) { | ||
244 | + mark_tsc_unstable("could not calculate TSC khz"); | ||
245 | + /* | ||
246 | + * We need to disable the TSC completely in this case | ||
247 | + * to prevent sched_clock() from using it. | ||
248 | + */ | ||
249 | + tsc_disabled = 1; | ||
250 | + return; | ||
251 | + } | ||
252 | |||
253 | printk("Detected %lu.%03lu MHz processor.\n", | ||
254 | (unsigned long)cpu_khz / 1000, | ||
255 | @@ -427,13 +436,6 @@ void __init tsc_init(void) | ||
256 | if (check_tsc_unstable()) { | ||
257 | clocksource_tsc.rating = 0; | ||
258 | clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS; | ||
259 | - } else | ||
260 | - tsc_enabled = 1; | ||
261 | - | ||
262 | + } | ||
263 | clocksource_register(&clocksource_tsc); | ||
264 | - | ||
265 | - return; | ||
266 | - | ||
267 | -out_no_tsc: | ||
268 | - setup_clear_cpu_cap(X86_FEATURE_TSC); | ||
269 | } | ||
270 | diff --git a/arch/x86/kernel/tsc_64.c b/arch/x86/kernel/tsc_64.c | ||
271 | index d3bebaa..5153afc 100644 | ||
272 | --- a/arch/x86/kernel/tsc_64.c | ||
273 | +++ b/arch/x86/kernel/tsc_64.c | ||
274 | @@ -227,14 +227,14 @@ void __init tsc_calibrate(void) | ||
275 | /* hpet or pmtimer available ? */ | ||
276 | if (!hpet && !pm1 && !pm2) { | ||
277 | printk(KERN_INFO "TSC calibrated against PIT\n"); | ||
278 | - return; | ||
279 | + goto out; | ||
280 | } | ||
281 | |||
282 | /* Check, whether the sampling was disturbed by an SMI */ | ||
283 | if (tsc1 == ULONG_MAX || tsc2 == ULONG_MAX) { | ||
284 | printk(KERN_WARNING "TSC calibration disturbed by SMI, " | ||
285 | "using PIT calibration result\n"); | ||
286 | - return; | ||
287 | + goto out; | ||
288 | } | ||
289 | |||
290 | tsc2 = (tsc2 - tsc1) * 1000000L; | ||
291 | @@ -255,6 +255,7 @@ void __init tsc_calibrate(void) | ||
292 | |||
293 | tsc_khz = tsc2 / tsc1; | ||
294 | |||
295 | +out: | ||
296 | for_each_possible_cpu(cpu) | ||
297 | set_cyc2ns_scale(tsc_khz, cpu); | ||
298 | } | ||
299 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c | ||
300 | index a02a14f..b2c5231 100644 | ||
301 | --- a/arch/x86/mm/init_64.c | ||
302 | +++ b/arch/x86/mm/init_64.c | ||
303 | @@ -192,7 +192,7 @@ void __init cleanup_highmap(void) | ||
304 | pmd_t *last_pmd = pmd + PTRS_PER_PMD; | ||
305 | |||
306 | for (; pmd < last_pmd; pmd++, vaddr += PMD_SIZE) { | ||
307 | - if (!pmd_present(*pmd)) | ||
308 | + if (pmd_none(*pmd)) | ||
309 | continue; | ||
310 | if (vaddr < (unsigned long) _text || vaddr > end) | ||
311 | set_pmd(pmd, __pmd(0)); | ||
312 | diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c | ||
313 | index 05356ce..c7e2a44 100644 | ||
314 | --- a/arch/x86/pci/common.c | ||
315 | +++ b/arch/x86/pci/common.c | ||
316 | @@ -130,19 +130,6 @@ static void __devinit pcibios_fixup_ghosts(struct pci_bus *b) | ||
317 | } | ||
318 | } | ||
319 | |||
320 | -static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | ||
321 | -{ | ||
322 | - struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE]; | ||
323 | - | ||
324 | - if (rom_r->parent) | ||
325 | - return; | ||
326 | - if (rom_r->start) | ||
327 | - /* we deal with BIOS assigned ROM later */ | ||
328 | - return; | ||
329 | - if (!(pci_probe & PCI_ASSIGN_ROMS)) | ||
330 | - rom_r->start = rom_r->end = rom_r->flags = 0; | ||
331 | -} | ||
332 | - | ||
333 | /* | ||
334 | * Called after each bus is probed, but before its children | ||
335 | * are examined. | ||
336 | @@ -150,12 +137,8 @@ static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) | ||
337 | |||
338 | void __devinit pcibios_fixup_bus(struct pci_bus *b) | ||
339 | { | ||
340 | - struct pci_dev *dev; | ||
341 | - | ||
342 | pcibios_fixup_ghosts(b); | ||
343 | pci_read_bridge_bases(b); | ||
344 | - list_for_each_entry(dev, &b->devices, bus_list) | ||
345 | - pcibios_fixup_device_resources(dev); | ||
346 | } | ||
347 | |||
348 | /* | ||
349 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
350 | index be95fdb..92da864 100644 | ||
351 | --- a/drivers/ata/libata-core.c | ||
352 | +++ b/drivers/ata/libata-core.c | ||
353 | @@ -3947,6 +3947,7 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline) | ||
354 | struct ata_port *ap = link->ap; | ||
355 | struct ata_eh_context *ehc = &link->eh_context; | ||
356 | const unsigned long *timing = sata_ehc_deb_timing(ehc); | ||
357 | + u32 sstatus; | ||
358 | int rc; | ||
359 | |||
360 | /* handle link resume */ | ||
361 | @@ -3960,6 +3961,17 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline) | ||
362 | if (ap->flags & ATA_FLAG_PMP) | ||
363 | ehc->i.action |= ATA_EH_HARDRESET; | ||
364 | |||
365 | + /* if link powersave is on, force hardreset */ | ||
366 | + if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) { | ||
367 | + u8 ipm = sstatus >> 8; | ||
368 | + | ||
369 | + if (ipm == 2 || ipm == 6) { | ||
370 | + ata_link_printk(link, KERN_INFO, "link in powersave " | ||
371 | + "mode (ipm=%d), forcing hardreset\n", ipm); | ||
372 | + ehc->i.action |= ATA_EH_HARDRESET; | ||
373 | + } | ||
374 | + } | ||
375 | + | ||
376 | /* if we're about to do hardreset, nothing more to do */ | ||
377 | if (ehc->i.action & ATA_EH_HARDRESET) | ||
378 | return 0; | ||
379 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c | ||
380 | index 35a26a3..99aa5f5 100644 | ||
381 | --- a/drivers/cpufreq/cpufreq.c | ||
382 | +++ b/drivers/cpufreq/cpufreq.c | ||
383 | @@ -607,7 +607,7 @@ static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, | ||
384 | unsigned int freq = 0; | ||
385 | unsigned int ret; | ||
386 | |||
387 | - if (!policy->governor->store_setspeed) | ||
388 | + if (!policy->governor || !policy->governor->store_setspeed) | ||
389 | return -EINVAL; | ||
390 | |||
391 | ret = sscanf(buf, "%u", &freq); | ||
392 | @@ -621,7 +621,7 @@ static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, | ||
393 | |||
394 | static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf) | ||
395 | { | ||
396 | - if (!policy->governor->show_setspeed) | ||
397 | + if (!policy->governor || !policy->governor->show_setspeed) | ||
398 | return sprintf(buf, "<unsupported>\n"); | ||
399 | |||
400 | return policy->governor->show_setspeed(policy, buf); | ||
401 | diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c | ||
402 | index c3eb3f1..452b94d 100644 | ||
403 | --- a/drivers/hid/hid-input.c | ||
404 | +++ b/drivers/hid/hid-input.c | ||
405 | @@ -218,8 +218,9 @@ int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, | ||
406 | } | ||
407 | } | ||
408 | |||
409 | - if (test_bit(usage->code, hid->pb_pressed_numlock) || | ||
410 | - test_bit(LED_NUML, input->led)) { | ||
411 | + if (hid->quirks & HID_QUIRK_APPLE_NUMLOCK_EMULATION && ( | ||
412 | + test_bit(usage->code, hid->pb_pressed_numlock) || | ||
413 | + test_bit(LED_NUML, input->led))) { | ||
414 | trans = find_translation(powerbook_numlock_keys, usage->code); | ||
415 | |||
416 | if (trans) { | ||
417 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
418 | index e29a057..7fbe08c 100644 | ||
419 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
420 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
421 | @@ -613,28 +613,28 @@ static const struct hid_blacklist { | ||
422 | |||
423 | { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | ||
424 | |||
425 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
426 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
427 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
428 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD}, | ||
429 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
430 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
431 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD}, | ||
432 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
433 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
434 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD}, | ||
435 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
436 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
437 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
438 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
439 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD}, | ||
440 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
441 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
442 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD}, | ||
443 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
444 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
445 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD}, | ||
446 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
447 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI, HID_QUIRK_APPLE_HAS_FN }, | ||
448 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | ||
449 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS, HID_QUIRK_APPLE_HAS_FN }, | ||
450 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
451 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
452 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
453 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_HAS_FN }, | ||
454 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | ||
455 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_HAS_FN }, | ||
456 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
457 | - { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
458 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
459 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
460 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
461 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | ||
462 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | ||
463 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | ||
464 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
465 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | ||
466 | |||
467 | { USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS }, | ||
468 | { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS }, | ||
469 | diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c | ||
470 | index 3dac920..43c9f8d 100644 | ||
471 | --- a/drivers/i2c/busses/i2c-nforce2.c | ||
472 | +++ b/drivers/i2c/busses/i2c-nforce2.c | ||
473 | @@ -50,6 +50,7 @@ | ||
474 | #include <linux/init.h> | ||
475 | #include <linux/i2c.h> | ||
476 | #include <linux/delay.h> | ||
477 | +#include <linux/dmi.h> | ||
478 | #include <asm/io.h> | ||
479 | |||
480 | MODULE_LICENSE("GPL"); | ||
481 | @@ -109,6 +110,18 @@ struct nforce2_smbus { | ||
482 | /* Misc definitions */ | ||
483 | #define MAX_TIMEOUT 100 | ||
484 | |||
485 | +/* We disable the second SMBus channel on these boards */ | ||
486 | +static struct dmi_system_id __devinitdata nforce2_dmi_blacklist2[] = { | ||
487 | + { | ||
488 | + .ident = "DFI Lanparty NF4 Expert", | ||
489 | + .matches = { | ||
490 | + DMI_MATCH(DMI_BOARD_VENDOR, "DFI Corp,LTD"), | ||
491 | + DMI_MATCH(DMI_BOARD_NAME, "LP UT NF4 Expert"), | ||
492 | + }, | ||
493 | + }, | ||
494 | + { } | ||
495 | +}; | ||
496 | + | ||
497 | static struct pci_driver nforce2_driver; | ||
498 | |||
499 | static void nforce2_abort(struct i2c_adapter *adap) | ||
500 | @@ -367,10 +380,17 @@ static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_ | ||
501 | smbuses[0].base = 0; /* to have a check value */ | ||
502 | } | ||
503 | /* SMBus adapter 2 */ | ||
504 | - res2 = nforce2_probe_smb(dev, 5, NFORCE_PCI_SMB2, &smbuses[1], "SMB2"); | ||
505 | - if (res2 < 0) { | ||
506 | - dev_err(&dev->dev, "Error probing SMB2.\n"); | ||
507 | - smbuses[1].base = 0; /* to have a check value */ | ||
508 | + if (dmi_check_system(nforce2_dmi_blacklist2)) { | ||
509 | + dev_err(&dev->dev, "Disabling SMB2 for safety reasons.\n"); | ||
510 | + res2 = -EPERM; | ||
511 | + smbuses[1].base = 0; | ||
512 | + } else { | ||
513 | + res2 = nforce2_probe_smb(dev, 5, NFORCE_PCI_SMB2, &smbuses[1], | ||
514 | + "SMB2"); | ||
515 | + if (res2 < 0) { | ||
516 | + dev_err(&dev->dev, "Error probing SMB2.\n"); | ||
517 | + smbuses[1].base = 0; /* to have a check value */ | ||
518 | + } | ||
519 | } | ||
520 | if ((res1 < 0) && (res2 < 0)) { | ||
521 | /* we did not find even one of the SMBuses, so we give up */ | ||
522 | diff --git a/drivers/i2c/chips/max6875.c b/drivers/i2c/chips/max6875.c | ||
523 | index fb7ea56..cf507b3 100644 | ||
524 | --- a/drivers/i2c/chips/max6875.c | ||
525 | +++ b/drivers/i2c/chips/max6875.c | ||
526 | @@ -207,9 +207,6 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind) | ||
527 | fake_client->flags = 0; | ||
528 | strlcpy(fake_client->name, "max6875 subclient", I2C_NAME_SIZE); | ||
529 | |||
530 | - /* Prevent 24RF08 corruption (in case of user error) */ | ||
531 | - i2c_smbus_write_quick(real_client, 0); | ||
532 | - | ||
533 | if ((err = i2c_attach_client(real_client)) != 0) | ||
534 | goto exit_kfree2; | ||
535 | |||
536 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | ||
537 | index 31a53c5..ae7e6e7 100644 | ||
538 | --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | ||
539 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | ||
540 | @@ -194,7 +194,13 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | ||
541 | /* Set the cached Q_Key before we attach if it's the broadcast group */ | ||
542 | if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, | ||
543 | sizeof (union ib_gid))) { | ||
544 | + spin_lock_irq(&priv->lock); | ||
545 | + if (!priv->broadcast) { | ||
546 | + spin_unlock_irq(&priv->lock); | ||
547 | + return -EAGAIN; | ||
548 | + } | ||
549 | priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey); | ||
550 | + spin_unlock_irq(&priv->lock); | ||
551 | priv->tx_wr.wr.ud.remote_qkey = priv->qkey; | ||
552 | } | ||
553 | |||
554 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
555 | index 9f6d228..ba34990 100644 | ||
556 | --- a/drivers/md/md.c | ||
557 | +++ b/drivers/md/md.c | ||
558 | @@ -274,6 +274,7 @@ static mddev_t * mddev_find(dev_t unit) | ||
559 | atomic_set(&new->active, 1); | ||
560 | spin_lock_init(&new->write_lock); | ||
561 | init_waitqueue_head(&new->sb_wait); | ||
562 | + init_waitqueue_head(&new->recovery_wait); | ||
563 | new->reshape_position = MaxSector; | ||
564 | new->resync_max = MaxSector; | ||
565 | |||
566 | @@ -5559,7 +5560,6 @@ void md_do_sync(mddev_t *mddev) | ||
567 | window/2,(unsigned long long) max_sectors/2); | ||
568 | |||
569 | atomic_set(&mddev->recovery_active, 0); | ||
570 | - init_waitqueue_head(&mddev->recovery_wait); | ||
571 | last_check = 0; | ||
572 | |||
573 | if (j>2) { | ||
574 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c | ||
575 | index 18a1379..705fe47 100644 | ||
576 | --- a/drivers/md/raid5.c | ||
577 | +++ b/drivers/md/raid5.c | ||
578 | @@ -1984,6 +1984,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh, | ||
579 | * have quiesced. | ||
580 | */ | ||
581 | if ((s->uptodate == disks - 1) && | ||
582 | + (s->failed && disk_idx == s->failed_num) && | ||
583 | !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) { | ||
584 | set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); | ||
585 | set_bit(R5_Wantcompute, &dev->flags); | ||
586 | @@ -2069,7 +2070,9 @@ static void handle_issuing_new_read_requests6(struct stripe_head *sh, | ||
587 | /* we would like to get this block, possibly | ||
588 | * by computing it, but we might not be able to | ||
589 | */ | ||
590 | - if (s->uptodate == disks-1) { | ||
591 | + if ((s->uptodate == disks - 1) && | ||
592 | + (s->failed && (i == r6s->failed_num[0] || | ||
593 | + i == r6s->failed_num[1]))) { | ||
594 | pr_debug("Computing stripe %llu block %d\n", | ||
595 | (unsigned long long)sh->sector, i); | ||
596 | compute_block_1(sh, i, 0); | ||
597 | @@ -2618,6 +2621,7 @@ static void handle_stripe5(struct stripe_head *sh) | ||
598 | struct stripe_head_state s; | ||
599 | struct r5dev *dev; | ||
600 | unsigned long pending = 0; | ||
601 | + int prexor; | ||
602 | |||
603 | memset(&s, 0, sizeof(s)); | ||
604 | pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d " | ||
605 | @@ -2737,9 +2741,11 @@ static void handle_stripe5(struct stripe_head *sh) | ||
606 | /* leave prexor set until postxor is done, allows us to distinguish | ||
607 | * a rmw from a rcw during biodrain | ||
608 | */ | ||
609 | + prexor = 0; | ||
610 | if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) && | ||
611 | test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) { | ||
612 | |||
613 | + prexor = 1; | ||
614 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete); | ||
615 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack); | ||
616 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending); | ||
617 | @@ -2773,6 +2779,8 @@ static void handle_stripe5(struct stripe_head *sh) | ||
618 | if (!test_and_set_bit( | ||
619 | STRIPE_OP_IO, &sh->ops.pending)) | ||
620 | sh->ops.count++; | ||
621 | + if (prexor) | ||
622 | + continue; | ||
623 | if (!test_bit(R5_Insync, &dev->flags) || | ||
624 | (i == sh->pd_idx && s.failed == 0)) | ||
625 | set_bit(STRIPE_INSYNC, &sh->state); | ||
626 | diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c | ||
627 | index 129b8b3..68be4e1 100644 | ||
628 | --- a/drivers/net/atl1/atl1_main.c | ||
629 | +++ b/drivers/net/atl1/atl1_main.c | ||
630 | @@ -1334,6 +1334,7 @@ rrd_ok: | ||
631 | /* Good Receive */ | ||
632 | pci_unmap_page(adapter->pdev, buffer_info->dma, | ||
633 | buffer_info->length, PCI_DMA_FROMDEVICE); | ||
634 | + buffer_info->dma = 0; | ||
635 | skb = buffer_info->skb; | ||
636 | length = le16_to_cpu(rrd->xsz.xsum_sz.pkt_size); | ||
637 | |||
638 | diff --git a/drivers/net/ps3_gelic_wireless.c b/drivers/net/ps3_gelic_wireless.c | ||
639 | index c16de51..42daf85 100644 | ||
640 | --- a/drivers/net/ps3_gelic_wireless.c | ||
641 | +++ b/drivers/net/ps3_gelic_wireless.c | ||
642 | @@ -2474,6 +2474,8 @@ static void gelic_wl_free(struct gelic_wl_info *wl) | ||
643 | |||
644 | pr_debug("%s: <-\n", __func__); | ||
645 | |||
646 | + free_page((unsigned long)wl->buf); | ||
647 | + | ||
648 | pr_debug("%s: destroy queues\n", __func__); | ||
649 | destroy_workqueue(wl->eurus_cmd_queue); | ||
650 | destroy_workqueue(wl->event_queue); | ||
651 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
652 | index 0147ea3..d8160fa 100644 | ||
653 | --- a/drivers/usb/class/cdc-acm.c | ||
654 | +++ b/drivers/usb/class/cdc-acm.c | ||
655 | @@ -1242,6 +1242,9 @@ static struct usb_device_id acm_ids[] = { | ||
656 | { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */ | ||
657 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
658 | }, | ||
659 | + { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */ | ||
660 | + .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
661 | + }, | ||
662 | |||
663 | /* control interfaces with various AT-command sets */ | ||
664 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | ||
665 | diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c | ||
666 | index 611bc9f..d05375d 100644 | ||
667 | --- a/drivers/usb/host/ohci-omap.c | ||
668 | +++ b/drivers/usb/host/ohci-omap.c | ||
669 | @@ -511,7 +511,8 @@ static int ohci_omap_suspend(struct platform_device *dev, pm_message_t message) | ||
670 | |||
671 | static int ohci_omap_resume(struct platform_device *dev) | ||
672 | { | ||
673 | - struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(dev)); | ||
674 | + struct usb_hcd *hcd = platform_get_drvdata(dev); | ||
675 | + struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
676 | |||
677 | if (time_before(jiffies, ohci->next_statechange)) | ||
678 | msleep(5); | ||
679 | diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c | ||
680 | index c852f03..dd1a067 100644 | ||
681 | --- a/drivers/usb/host/ohci-sm501.c | ||
682 | +++ b/drivers/usb/host/ohci-sm501.c | ||
683 | @@ -231,7 +231,8 @@ static int ohci_sm501_suspend(struct platform_device *pdev, pm_message_t msg) | ||
684 | static int ohci_sm501_resume(struct platform_device *pdev) | ||
685 | { | ||
686 | struct device *dev = &pdev->dev; | ||
687 | - struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(pdev)); | ||
688 | + struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
689 | + struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
690 | |||
691 | if (time_before(jiffies, ohci->next_statechange)) | ||
692 | msleep(5); | ||
693 | diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c | ||
694 | index c730d20..7eb5f30 100644 | ||
695 | --- a/drivers/usb/misc/ldusb.c | ||
696 | +++ b/drivers/usb/misc/ldusb.c | ||
697 | @@ -63,9 +63,6 @@ | ||
698 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | ||
699 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 | ||
700 | |||
701 | -#define USB_VENDOR_ID_MICROCHIP 0x04d8 | ||
702 | -#define USB_DEVICE_ID_PICDEM 0x000c | ||
703 | - | ||
704 | #ifdef CONFIG_USB_DYNAMIC_MINORS | ||
705 | #define USB_LD_MINOR_BASE 0 | ||
706 | #else | ||
707 | @@ -92,7 +89,6 @@ static struct usb_device_id ld_usb_table [] = { | ||
708 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, | ||
709 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, | ||
710 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, | ||
711 | - { USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICDEM) }, | ||
712 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, | ||
713 | { } /* Terminating entry */ | ||
714 | }; | ||
715 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
716 | index 3abb3c8..af2bd47 100644 | ||
717 | --- a/drivers/usb/serial/ftdi_sio.c | ||
718 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
719 | @@ -366,6 +366,7 @@ static struct usb_device_id id_table_combined [] = { | ||
720 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
721 | { USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID), | ||
722 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
723 | + { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, | ||
724 | { }, /* Optional parameter entry */ | ||
725 | { } /* Terminating entry */ | ||
726 | }; | ||
727 | diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h | ||
728 | index 6da539e..0e1c569 100644 | ||
729 | --- a/drivers/usb/serial/ftdi_sio.h | ||
730 | +++ b/drivers/usb/serial/ftdi_sio.h | ||
731 | @@ -581,6 +581,12 @@ | ||
732 | #define FIC_NEO1973_DEBUG_PID 0x5118 | ||
733 | |||
734 | /* | ||
735 | + * RATOC REX-USB60F | ||
736 | + */ | ||
737 | +#define RATOC_VENDOR_ID 0x0584 | ||
738 | +#define RATOC_PRODUCT_ID_USB60F 0xb020 | ||
739 | + | ||
740 | +/* | ||
741 | * BmRequestType: 1100 0000b | ||
742 | * bRequest: FTDI_E2_READ | ||
743 | * wValue: 0 | ||
744 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
745 | index d101025..4d7f357 100644 | ||
746 | --- a/drivers/usb/serial/option.c | ||
747 | +++ b/drivers/usb/serial/option.c | ||
748 | @@ -154,8 +154,6 @@ static int option_send_setup(struct usb_serial_port *port); | ||
749 | #define NOVATELWIRELESS_PRODUCT_MC727 0x4100 | ||
750 | #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 | ||
751 | |||
752 | -#define NOVATELWIRELESS_PRODUCT_U727 0x5010 | ||
753 | - | ||
754 | /* FUTURE NOVATEL PRODUCTS */ | ||
755 | #define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000 | ||
756 | #define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000 | ||
757 | @@ -195,6 +193,9 @@ static int option_send_setup(struct usb_serial_port *port); | ||
758 | |||
759 | #define MAXON_VENDOR_ID 0x16d8 | ||
760 | |||
761 | +#define TELIT_VENDOR_ID 0x1bc7 | ||
762 | +#define TELIT_PRODUCT_UC864E 0x1003 | ||
763 | + | ||
764 | static struct usb_device_id option_ids[] = { | ||
765 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | ||
766 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | ||
767 | @@ -269,7 +270,6 @@ static struct usb_device_id option_ids[] = { | ||
768 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ | ||
769 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ | ||
770 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ | ||
771 | - { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel U727 */ | ||
772 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */ | ||
773 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */ | ||
774 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */ | ||
775 | @@ -293,6 +293,7 @@ static struct usb_device_id option_ids[] = { | ||
776 | { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ | ||
777 | { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ | ||
778 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ | ||
779 | + { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ | ||
780 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, | ||
781 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | ||
782 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | ||
783 | @@ -301,6 +302,8 @@ static struct usb_device_id option_ids[] = { | ||
784 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | ||
785 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | ||
786 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ | ||
787 | + { USB_DEVICE(0x19d2, 0x0001) }, /* Telstra NextG CDMA */ | ||
788 | + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | ||
789 | { } /* Terminating entry */ | ||
790 | }; | ||
791 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
792 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c | ||
793 | index 2af7785..4c1a70a 100644 | ||
794 | --- a/drivers/usb/serial/pl2303.c | ||
795 | +++ b/drivers/usb/serial/pl2303.c | ||
796 | @@ -66,7 +66,6 @@ static struct usb_device_id id_table [] = { | ||
797 | { USB_DEVICE(ITEGNO_VENDOR_ID, ITEGNO_PRODUCT_ID_2080) }, | ||
798 | { USB_DEVICE(MA620_VENDOR_ID, MA620_PRODUCT_ID) }, | ||
799 | { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID) }, | ||
800 | - { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, | ||
801 | { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) }, | ||
802 | { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) }, | ||
803 | { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) }, | ||
804 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h | ||
805 | index 10cf872..3bdefe0 100644 | ||
806 | --- a/drivers/usb/serial/pl2303.h | ||
807 | +++ b/drivers/usb/serial/pl2303.h | ||
808 | @@ -36,7 +36,6 @@ | ||
809 | |||
810 | #define RATOC_VENDOR_ID 0x0584 | ||
811 | #define RATOC_PRODUCT_ID 0xb000 | ||
812 | -#define RATOC_PRODUCT_ID_USB60F 0xb020 | ||
813 | |||
814 | #define TRIPP_VENDOR_ID 0x2478 | ||
815 | #define TRIPP_PRODUCT_ID 0x2008 | ||
816 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h | ||
817 | index 9125207..f1d14c9 100644 | ||
818 | --- a/drivers/usb/storage/unusual_devs.h | ||
819 | +++ b/drivers/usb/storage/unusual_devs.h | ||
820 | @@ -1285,6 +1285,16 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101, | ||
821 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
822 | US_FL_IGNORE_DEVICE ), | ||
823 | |||
824 | +/* Reported by F. Aben <f.aben@option.com> | ||
825 | + * This device (wrongly) has a vendor-specific device descriptor. | ||
826 | + * The entry is needed so usb-storage can bind to it's mass-storage | ||
827 | + * interface as an interface driver */ | ||
828 | +UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000, | ||
829 | + "Option", | ||
830 | + "GI 0401 SD-Card", | ||
831 | + US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
832 | + 0 ), | ||
833 | + | ||
834 | #ifdef CONFIG_USB_STORAGE_ISD200 | ||
835 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, | ||
836 | "ATI", | ||
837 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
838 | index bc673c8..e1031b9 100644 | ||
839 | --- a/fs/cifs/inode.c | ||
840 | +++ b/fs/cifs/inode.c | ||
841 | @@ -161,12 +161,14 @@ static void cifs_unix_info_to_inode(struct inode *inode, | ||
842 | spin_unlock(&inode->i_lock); | ||
843 | } | ||
844 | |||
845 | -static const unsigned char *cifs_get_search_path(struct cifsTconInfo *pTcon, | ||
846 | - const char *search_path) | ||
847 | +static const unsigned char *cifs_get_search_path(struct cifs_sb_info *cifs_sb, | ||
848 | + const char *search_path) | ||
849 | { | ||
850 | int tree_len; | ||
851 | int path_len; | ||
852 | + int i; | ||
853 | char *tmp_path; | ||
854 | + struct cifsTconInfo *pTcon = cifs_sb->tcon; | ||
855 | |||
856 | if (!(pTcon->Flags & SMB_SHARE_IS_IN_DFS)) | ||
857 | return search_path; | ||
858 | @@ -180,6 +182,11 @@ static const unsigned char *cifs_get_search_path(struct cifsTconInfo *pTcon, | ||
859 | return search_path; | ||
860 | |||
861 | strncpy(tmp_path, pTcon->treeName, tree_len); | ||
862 | + if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) | ||
863 | + for (i = 0; i < tree_len; i++) { | ||
864 | + if (tmp_path[i] == '\\') | ||
865 | + tmp_path[i] = '/'; | ||
866 | + } | ||
867 | strncpy(tmp_path+tree_len, search_path, path_len); | ||
868 | tmp_path[tree_len+path_len] = 0; | ||
869 | return tmp_path; | ||
870 | @@ -199,7 +206,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | ||
871 | pTcon = cifs_sb->tcon; | ||
872 | cFYI(1, ("Getting info on %s", search_path)); | ||
873 | |||
874 | - full_path = cifs_get_search_path(pTcon, search_path); | ||
875 | + full_path = cifs_get_search_path(cifs_sb, search_path); | ||
876 | |||
877 | try_again_CIFSSMBUnixQPathInfo: | ||
878 | /* could have done a find first instead but this returns more info */ | ||
879 | @@ -402,7 +409,7 @@ int cifs_get_inode_info(struct inode **pinode, | ||
880 | return -ENOMEM; | ||
881 | pfindData = (FILE_ALL_INFO *)buf; | ||
882 | |||
883 | - full_path = cifs_get_search_path(pTcon, search_path); | ||
884 | + full_path = cifs_get_search_path(cifs_sb, search_path); | ||
885 | |||
886 | try_again_CIFSSMBQPathInfo: | ||
887 | /* could do find first instead but this returns more info */ | ||
888 | diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h | ||
889 | index 5007f78..7c607af 100644 | ||
890 | --- a/fs/ecryptfs/ecryptfs_kernel.h | ||
891 | +++ b/fs/ecryptfs/ecryptfs_kernel.h | ||
892 | @@ -626,8 +626,6 @@ int ecryptfs_get_tfm_and_mutex_for_cipher_name(struct crypto_blkcipher **tfm, | ||
893 | int ecryptfs_keyring_auth_tok_for_sig(struct key **auth_tok_key, | ||
894 | struct ecryptfs_auth_tok **auth_tok, | ||
895 | char *sig); | ||
896 | -int ecryptfs_write_zeros(struct file *file, pgoff_t index, int start, | ||
897 | - int num_zeros); | ||
898 | int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, | ||
899 | loff_t offset, size_t size); | ||
900 | int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | ||
901 | diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c | ||
902 | index 0c49286..7cafdbc 100644 | ||
903 | --- a/fs/ecryptfs/read_write.c | ||
904 | +++ b/fs/ecryptfs/read_write.c | ||
905 | @@ -157,20 +157,6 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | ||
906 | ecryptfs_page_idx, rc); | ||
907 | goto out; | ||
908 | } | ||
909 | - if (start_offset_in_page) { | ||
910 | - /* Read in the page from the lower | ||
911 | - * into the eCryptfs inode page cache, | ||
912 | - * decrypting */ | ||
913 | - rc = ecryptfs_decrypt_page(ecryptfs_page); | ||
914 | - if (rc) { | ||
915 | - printk(KERN_ERR "%s: Error decrypting " | ||
916 | - "page; rc = [%d]\n", | ||
917 | - __FUNCTION__, rc); | ||
918 | - ClearPageUptodate(ecryptfs_page); | ||
919 | - page_cache_release(ecryptfs_page); | ||
920 | - goto out; | ||
921 | - } | ||
922 | - } | ||
923 | ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0); | ||
924 | |||
925 | /* | ||
926 | @@ -349,14 +335,6 @@ int ecryptfs_read(char *data, loff_t offset, size_t size, | ||
927 | ecryptfs_page_idx, rc); | ||
928 | goto out; | ||
929 | } | ||
930 | - rc = ecryptfs_decrypt_page(ecryptfs_page); | ||
931 | - if (rc) { | ||
932 | - printk(KERN_ERR "%s: Error decrypting " | ||
933 | - "page; rc = [%d]\n", __FUNCTION__, rc); | ||
934 | - ClearPageUptodate(ecryptfs_page); | ||
935 | - page_cache_release(ecryptfs_page); | ||
936 | - goto out; | ||
937 | - } | ||
938 | ecryptfs_page_virt = kmap_atomic(ecryptfs_page, KM_USER0); | ||
939 | memcpy((data + data_offset), | ||
940 | ((char *)ecryptfs_page_virt + start_offset_in_page), | ||
941 | diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c | ||
942 | index 4285654..84119af 100644 | ||
943 | --- a/fs/ext3/xattr.c | ||
944 | +++ b/fs/ext3/xattr.c | ||
945 | @@ -1000,6 +1000,11 @@ ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, | ||
946 | i.value = NULL; | ||
947 | error = ext3_xattr_block_set(handle, inode, &i, &bs); | ||
948 | } else if (error == -ENOSPC) { | ||
949 | + if (EXT3_I(inode)->i_file_acl && !bs.s.base) { | ||
950 | + error = ext3_xattr_block_find(inode, &i, &bs); | ||
951 | + if (error) | ||
952 | + goto cleanup; | ||
953 | + } | ||
954 | error = ext3_xattr_block_set(handle, inode, &i, &bs); | ||
955 | if (error) | ||
956 | goto cleanup; | ||
957 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c | ||
958 | index e9054c1..70d856b 100644 | ||
959 | --- a/fs/ext4/xattr.c | ||
960 | +++ b/fs/ext4/xattr.c | ||
961 | @@ -1011,6 +1011,11 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, | ||
962 | i.value = NULL; | ||
963 | error = ext4_xattr_block_set(handle, inode, &i, &bs); | ||
964 | } else if (error == -ENOSPC) { | ||
965 | + if (EXT4_I(inode)->i_file_acl && !bs.s.base) { | ||
966 | + error = ext4_xattr_block_find(inode, &i, &bs); | ||
967 | + if (error) | ||
968 | + goto cleanup; | ||
969 | + } | ||
970 | error = ext4_xattr_block_set(handle, inode, &i, &bs); | ||
971 | if (error) | ||
972 | goto cleanup; | ||
973 | diff --git a/fs/proc/array.c b/fs/proc/array.c | ||
974 | index 07d6c48..6b1c67a 100644 | ||
975 | --- a/fs/proc/array.c | ||
976 | +++ b/fs/proc/array.c | ||
977 | @@ -287,7 +287,7 @@ static void render_cap_t(struct seq_file *m, const char *header, | ||
978 | seq_printf(m, "%s", header); | ||
979 | CAP_FOR_EACH_U32(__capi) { | ||
980 | seq_printf(m, "%08x", | ||
981 | - a->cap[(_LINUX_CAPABILITY_U32S-1) - __capi]); | ||
982 | + a->cap[(_KERNEL_CAPABILITY_U32S-1) - __capi]); | ||
983 | } | ||
984 | seq_printf(m, "\n"); | ||
985 | } | ||
986 | diff --git a/fs/proc/base.c b/fs/proc/base.c | ||
987 | index 81d7d14..d6f21bd 100644 | ||
988 | --- a/fs/proc/base.c | ||
989 | +++ b/fs/proc/base.c | ||
990 | @@ -126,6 +126,25 @@ struct pid_entry { | ||
991 | NULL, &proc_single_file_operations, \ | ||
992 | { .proc_show = &proc_##OTYPE } ) | ||
993 | |||
994 | +/* | ||
995 | + * Count the number of hardlinks for the pid_entry table, excluding the . | ||
996 | + * and .. links. | ||
997 | + */ | ||
998 | +static unsigned int pid_entry_count_dirs(const struct pid_entry *entries, | ||
999 | + unsigned int n) | ||
1000 | +{ | ||
1001 | + unsigned int i; | ||
1002 | + unsigned int count; | ||
1003 | + | ||
1004 | + count = 0; | ||
1005 | + for (i = 0; i < n; ++i) { | ||
1006 | + if (S_ISDIR(entries[i].mode)) | ||
1007 | + ++count; | ||
1008 | + } | ||
1009 | + | ||
1010 | + return count; | ||
1011 | +} | ||
1012 | + | ||
1013 | int maps_protect; | ||
1014 | EXPORT_SYMBOL(maps_protect); | ||
1015 | |||
1016 | @@ -2483,10 +2502,9 @@ static struct dentry *proc_pid_instantiate(struct inode *dir, | ||
1017 | inode->i_op = &proc_tgid_base_inode_operations; | ||
1018 | inode->i_fop = &proc_tgid_base_operations; | ||
1019 | inode->i_flags|=S_IMMUTABLE; | ||
1020 | - inode->i_nlink = 5; | ||
1021 | -#ifdef CONFIG_SECURITY | ||
1022 | - inode->i_nlink += 1; | ||
1023 | -#endif | ||
1024 | + | ||
1025 | + inode->i_nlink = 2 + pid_entry_count_dirs(tgid_base_stuff, | ||
1026 | + ARRAY_SIZE(tgid_base_stuff)); | ||
1027 | |||
1028 | dentry->d_op = &pid_dentry_operations; | ||
1029 | |||
1030 | @@ -2713,10 +2731,9 @@ static struct dentry *proc_task_instantiate(struct inode *dir, | ||
1031 | inode->i_op = &proc_tid_base_inode_operations; | ||
1032 | inode->i_fop = &proc_tid_base_operations; | ||
1033 | inode->i_flags|=S_IMMUTABLE; | ||
1034 | - inode->i_nlink = 4; | ||
1035 | -#ifdef CONFIG_SECURITY | ||
1036 | - inode->i_nlink += 1; | ||
1037 | -#endif | ||
1038 | + | ||
1039 | + inode->i_nlink = 2 + pid_entry_count_dirs(tid_base_stuff, | ||
1040 | + ARRAY_SIZE(tid_base_stuff)); | ||
1041 | |||
1042 | dentry->d_op = &pid_dentry_operations; | ||
1043 | |||
1044 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c | ||
1045 | index 9dfb5ff..dca9b46 100644 | ||
1046 | --- a/fs/proc/task_mmu.c | ||
1047 | +++ b/fs/proc/task_mmu.c | ||
1048 | @@ -524,7 +524,7 @@ const struct file_operations proc_clear_refs_operations = { | ||
1049 | }; | ||
1050 | |||
1051 | struct pagemapread { | ||
1052 | - char __user *out, *end; | ||
1053 | + u64 __user *out, *end; | ||
1054 | }; | ||
1055 | |||
1056 | #define PM_ENTRY_BYTES sizeof(u64) | ||
1057 | @@ -547,21 +547,11 @@ struct pagemapread { | ||
1058 | static int add_to_pagemap(unsigned long addr, u64 pfn, | ||
1059 | struct pagemapread *pm) | ||
1060 | { | ||
1061 | - /* | ||
1062 | - * Make sure there's room in the buffer for an | ||
1063 | - * entire entry. Otherwise, only copy part of | ||
1064 | - * the pfn. | ||
1065 | - */ | ||
1066 | - if (pm->out + PM_ENTRY_BYTES >= pm->end) { | ||
1067 | - if (copy_to_user(pm->out, &pfn, pm->end - pm->out)) | ||
1068 | - return -EFAULT; | ||
1069 | - pm->out = pm->end; | ||
1070 | - return PM_END_OF_BUFFER; | ||
1071 | - } | ||
1072 | - | ||
1073 | if (put_user(pfn, pm->out)) | ||
1074 | return -EFAULT; | ||
1075 | - pm->out += PM_ENTRY_BYTES; | ||
1076 | + pm->out++; | ||
1077 | + if (pm->out >= pm->end) | ||
1078 | + return PM_END_OF_BUFFER; | ||
1079 | return 0; | ||
1080 | } | ||
1081 | |||
1082 | @@ -662,7 +652,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | ||
1083 | |||
1084 | ret = -EINVAL; | ||
1085 | /* file position must be aligned */ | ||
1086 | - if (*ppos % PM_ENTRY_BYTES) | ||
1087 | + if ((*ppos % PM_ENTRY_BYTES) || (count % PM_ENTRY_BYTES)) | ||
1088 | goto out_task; | ||
1089 | |||
1090 | ret = 0; | ||
1091 | @@ -692,8 +682,8 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | ||
1092 | goto out_pages; | ||
1093 | } | ||
1094 | |||
1095 | - pm.out = buf; | ||
1096 | - pm.end = buf + count; | ||
1097 | + pm.out = (u64 *)buf; | ||
1098 | + pm.end = (u64 *)(buf + count); | ||
1099 | |||
1100 | if (!ptrace_may_attach(task)) { | ||
1101 | ret = -EIO; | ||
1102 | @@ -718,9 +708,9 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | ||
1103 | if (ret == PM_END_OF_BUFFER) | ||
1104 | ret = 0; | ||
1105 | /* don't need mmap_sem for these, but this looks cleaner */ | ||
1106 | - *ppos += pm.out - buf; | ||
1107 | + *ppos += (char *)pm.out - buf; | ||
1108 | if (!ret) | ||
1109 | - ret = pm.out - buf; | ||
1110 | + ret = (char *)pm.out - buf; | ||
1111 | } | ||
1112 | |||
1113 | out_pages: | ||
1114 | diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c | ||
1115 | index e347bfd..9831c90 100644 | ||
1116 | --- a/fs/xfs/linux-2.6/xfs_buf.c | ||
1117 | +++ b/fs/xfs/linux-2.6/xfs_buf.c | ||
1118 | @@ -387,6 +387,8 @@ _xfs_buf_lookup_pages( | ||
1119 | if (unlikely(page == NULL)) { | ||
1120 | if (flags & XBF_READ_AHEAD) { | ||
1121 | bp->b_page_count = i; | ||
1122 | + for (i = 0; i < bp->b_page_count; i++) | ||
1123 | + unlock_page(bp->b_pages[i]); | ||
1124 | return -ENOMEM; | ||
1125 | } | ||
1126 | |||
1127 | @@ -416,17 +418,24 @@ _xfs_buf_lookup_pages( | ||
1128 | ASSERT(!PagePrivate(page)); | ||
1129 | if (!PageUptodate(page)) { | ||
1130 | page_count--; | ||
1131 | - if (blocksize < PAGE_CACHE_SIZE && !PagePrivate(page)) { | ||
1132 | + if (blocksize >= PAGE_CACHE_SIZE) { | ||
1133 | + if (flags & XBF_READ) | ||
1134 | + bp->b_flags |= _XBF_PAGE_LOCKED; | ||
1135 | + } else if (!PagePrivate(page)) { | ||
1136 | if (test_page_region(page, offset, nbytes)) | ||
1137 | page_count++; | ||
1138 | } | ||
1139 | } | ||
1140 | |||
1141 | - unlock_page(page); | ||
1142 | bp->b_pages[i] = page; | ||
1143 | offset = 0; | ||
1144 | } | ||
1145 | |||
1146 | + if (!(bp->b_flags & _XBF_PAGE_LOCKED)) { | ||
1147 | + for (i = 0; i < bp->b_page_count; i++) | ||
1148 | + unlock_page(bp->b_pages[i]); | ||
1149 | + } | ||
1150 | + | ||
1151 | if (page_count == bp->b_page_count) | ||
1152 | bp->b_flags |= XBF_DONE; | ||
1153 | |||
1154 | @@ -746,6 +755,7 @@ xfs_buf_associate_memory( | ||
1155 | bp->b_count_desired = len; | ||
1156 | bp->b_buffer_length = buflen; | ||
1157 | bp->b_flags |= XBF_MAPPED; | ||
1158 | + bp->b_flags &= ~_XBF_PAGE_LOCKED; | ||
1159 | |||
1160 | return 0; | ||
1161 | } | ||
1162 | @@ -1093,8 +1103,10 @@ _xfs_buf_ioend( | ||
1163 | xfs_buf_t *bp, | ||
1164 | int schedule) | ||
1165 | { | ||
1166 | - if (atomic_dec_and_test(&bp->b_io_remaining) == 1) | ||
1167 | + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { | ||
1168 | + bp->b_flags &= ~_XBF_PAGE_LOCKED; | ||
1169 | xfs_buf_ioend(bp, schedule); | ||
1170 | + } | ||
1171 | } | ||
1172 | |||
1173 | STATIC void | ||
1174 | @@ -1125,6 +1137,9 @@ xfs_buf_bio_end_io( | ||
1175 | |||
1176 | if (--bvec >= bio->bi_io_vec) | ||
1177 | prefetchw(&bvec->bv_page->flags); | ||
1178 | + | ||
1179 | + if (bp->b_flags & _XBF_PAGE_LOCKED) | ||
1180 | + unlock_page(page); | ||
1181 | } while (bvec >= bio->bi_io_vec); | ||
1182 | |||
1183 | _xfs_buf_ioend(bp, 1); | ||
1184 | @@ -1163,7 +1178,8 @@ _xfs_buf_ioapply( | ||
1185 | * filesystem block size is not smaller than the page size. | ||
1186 | */ | ||
1187 | if ((bp->b_buffer_length < PAGE_CACHE_SIZE) && | ||
1188 | - (bp->b_flags & XBF_READ) && | ||
1189 | + ((bp->b_flags & (XBF_READ|_XBF_PAGE_LOCKED)) == | ||
1190 | + (XBF_READ|_XBF_PAGE_LOCKED)) && | ||
1191 | (blocksize >= PAGE_CACHE_SIZE)) { | ||
1192 | bio = bio_alloc(GFP_NOIO, 1); | ||
1193 | |||
1194 | diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h | ||
1195 | index a3d207d..441f7c3 100644 | ||
1196 | --- a/fs/xfs/linux-2.6/xfs_buf.h | ||
1197 | +++ b/fs/xfs/linux-2.6/xfs_buf.h | ||
1198 | @@ -66,6 +66,25 @@ typedef enum { | ||
1199 | _XBF_PAGES = (1 << 18), /* backed by refcounted pages */ | ||
1200 | _XBF_RUN_QUEUES = (1 << 19),/* run block device task queue */ | ||
1201 | _XBF_DELWRI_Q = (1 << 21), /* buffer on delwri queue */ | ||
1202 | + | ||
1203 | + /* | ||
1204 | + * Special flag for supporting metadata blocks smaller than a FSB. | ||
1205 | + * | ||
1206 | + * In this case we can have multiple xfs_buf_t on a single page and | ||
1207 | + * need to lock out concurrent xfs_buf_t readers as they only | ||
1208 | + * serialise access to the buffer. | ||
1209 | + * | ||
1210 | + * If the FSB size >= PAGE_CACHE_SIZE case, we have no serialisation | ||
1211 | + * between reads of the page. Hence we can have one thread read the | ||
1212 | + * page and modify it, but then race with another thread that thinks | ||
1213 | + * the page is not up-to-date and hence reads it again. | ||
1214 | + * | ||
1215 | + * The result is that the first modifcation to the page is lost. | ||
1216 | + * This sort of AGF/AGI reading race can happen when unlinking inodes | ||
1217 | + * that require truncation and results in the AGI unlinked list | ||
1218 | + * modifications being lost. | ||
1219 | + */ | ||
1220 | + _XBF_PAGE_LOCKED = (1 << 22), | ||
1221 | } xfs_buf_flags_t; | ||
1222 | |||
1223 | typedef enum { | ||
1224 | diff --git a/include/asm-x86/tlbflush.h b/include/asm-x86/tlbflush.h | ||
1225 | index 3998709..b7a6a08 100644 | ||
1226 | --- a/include/asm-x86/tlbflush.h | ||
1227 | +++ b/include/asm-x86/tlbflush.h | ||
1228 | @@ -22,12 +22,23 @@ static inline void __native_flush_tlb(void) | ||
1229 | |||
1230 | static inline void __native_flush_tlb_global(void) | ||
1231 | { | ||
1232 | - unsigned long cr4 = read_cr4(); | ||
1233 | + unsigned long flags; | ||
1234 | + unsigned long cr4; | ||
1235 | |||
1236 | + /* | ||
1237 | + * Read-modify-write to CR4 - protect it from preemption and | ||
1238 | + * from interrupts. (Use the raw variant because this code can | ||
1239 | + * be called from deep inside debugging code.) | ||
1240 | + */ | ||
1241 | + raw_local_irq_save(flags); | ||
1242 | + | ||
1243 | + cr4 = read_cr4(); | ||
1244 | /* clear PGE */ | ||
1245 | write_cr4(cr4 & ~X86_CR4_PGE); | ||
1246 | /* write old PGE again and flush TLBs */ | ||
1247 | write_cr4(cr4); | ||
1248 | + | ||
1249 | + raw_local_irq_restore(flags); | ||
1250 | } | ||
1251 | |||
1252 | static inline void __native_flush_tlb_single(unsigned long addr) | ||
1253 | diff --git a/include/linux/capability.h b/include/linux/capability.h | ||
1254 | index 7d50ff6..bb8d915 100644 | ||
1255 | --- a/include/linux/capability.h | ||
1256 | +++ b/include/linux/capability.h | ||
1257 | @@ -31,11 +31,11 @@ struct task_struct; | ||
1258 | #define _LINUX_CAPABILITY_VERSION_1 0x19980330 | ||
1259 | #define _LINUX_CAPABILITY_U32S_1 1 | ||
1260 | |||
1261 | -#define _LINUX_CAPABILITY_VERSION_2 0x20071026 | ||
1262 | +#define _LINUX_CAPABILITY_VERSION_2 0x20071026 /* deprecated - use v3 */ | ||
1263 | #define _LINUX_CAPABILITY_U32S_2 2 | ||
1264 | |||
1265 | -#define _LINUX_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_2 | ||
1266 | -#define _LINUX_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_2 | ||
1267 | +#define _LINUX_CAPABILITY_VERSION_3 0x20080522 | ||
1268 | +#define _LINUX_CAPABILITY_U32S_3 2 | ||
1269 | |||
1270 | typedef struct __user_cap_header_struct { | ||
1271 | __u32 version; | ||
1272 | @@ -77,10 +77,23 @@ struct vfs_cap_data { | ||
1273 | } data[VFS_CAP_U32]; | ||
1274 | }; | ||
1275 | |||
1276 | -#ifdef __KERNEL__ | ||
1277 | +#ifndef __KERNEL__ | ||
1278 | + | ||
1279 | +/* | ||
1280 | + * Backwardly compatible definition for source code - trapped in a | ||
1281 | + * 32-bit world. If you find you need this, please consider using | ||
1282 | + * libcap to untrap yourself... | ||
1283 | + */ | ||
1284 | +#define _LINUX_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_1 | ||
1285 | +#define _LINUX_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_1 | ||
1286 | + | ||
1287 | +#else | ||
1288 | + | ||
1289 | +#define _KERNEL_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_3 | ||
1290 | +#define _KERNEL_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_3 | ||
1291 | |||
1292 | typedef struct kernel_cap_struct { | ||
1293 | - __u32 cap[_LINUX_CAPABILITY_U32S]; | ||
1294 | + __u32 cap[_KERNEL_CAPABILITY_U32S]; | ||
1295 | } kernel_cap_t; | ||
1296 | |||
1297 | #define _USER_CAP_HEADER_SIZE (sizeof(struct __user_cap_header_struct)) | ||
1298 | @@ -350,7 +363,7 @@ typedef struct kernel_cap_struct { | ||
1299 | */ | ||
1300 | |||
1301 | #define CAP_FOR_EACH_U32(__capi) \ | ||
1302 | - for (__capi = 0; __capi < _LINUX_CAPABILITY_U32S; ++__capi) | ||
1303 | + for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi) | ||
1304 | |||
1305 | # define CAP_FS_MASK_B0 (CAP_TO_MASK(CAP_CHOWN) \ | ||
1306 | | CAP_TO_MASK(CAP_DAC_OVERRIDE) \ | ||
1307 | @@ -360,7 +373,7 @@ typedef struct kernel_cap_struct { | ||
1308 | |||
1309 | # define CAP_FS_MASK_B1 (CAP_TO_MASK(CAP_MAC_OVERRIDE)) | ||
1310 | |||
1311 | -#if _LINUX_CAPABILITY_U32S != 2 | ||
1312 | +#if _KERNEL_CAPABILITY_U32S != 2 | ||
1313 | # error Fix up hand-coded capability macro initializers | ||
1314 | #else /* HAND-CODED capability initializers */ | ||
1315 | |||
1316 | @@ -371,7 +384,7 @@ typedef struct kernel_cap_struct { | ||
1317 | # define CAP_NFSD_SET {{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \ | ||
1318 | CAP_FS_MASK_B1 } } | ||
1319 | |||
1320 | -#endif /* _LINUX_CAPABILITY_U32S != 2 */ | ||
1321 | +#endif /* _KERNEL_CAPABILITY_U32S != 2 */ | ||
1322 | |||
1323 | #define CAP_INIT_INH_SET CAP_EMPTY_SET | ||
1324 | |||
1325 | diff --git a/include/linux/hid.h b/include/linux/hid.h | ||
1326 | index 74ff575..02e70b7 100644 | ||
1327 | --- a/include/linux/hid.h | ||
1328 | +++ b/include/linux/hid.h | ||
1329 | @@ -284,6 +284,7 @@ struct hid_item { | ||
1330 | #define HID_QUIRK_2WHEEL_MOUSE_HACK_B8 0x02000000 | ||
1331 | #define HID_QUIRK_HWHEEL_WHEEL_INVERT 0x04000000 | ||
1332 | #define HID_QUIRK_MICROSOFT_KEYS 0x08000000 | ||
1333 | +#define HID_QUIRK_APPLE_NUMLOCK_EMULATION 0x10000000 | ||
1334 | |||
1335 | /* | ||
1336 | * Separate quirks for runtime report descriptor fixup | ||
1337 | diff --git a/include/linux/types.h b/include/linux/types.h | ||
1338 | index 9dc2346..d4a9ce6 100644 | ||
1339 | --- a/include/linux/types.h | ||
1340 | +++ b/include/linux/types.h | ||
1341 | @@ -197,8 +197,6 @@ typedef u64 resource_size_t; | ||
1342 | typedef u32 resource_size_t; | ||
1343 | #endif | ||
1344 | |||
1345 | -#endif /* __KERNEL__ */ | ||
1346 | - | ||
1347 | struct ustat { | ||
1348 | __kernel_daddr_t f_tfree; | ||
1349 | __kernel_ino_t f_tinode; | ||
1350 | @@ -206,4 +204,6 @@ struct ustat { | ||
1351 | char f_fpack[6]; | ||
1352 | }; | ||
1353 | |||
1354 | +#endif /* __KERNEL__ */ | ||
1355 | + | ||
1356 | #endif /* _LINUX_TYPES_H */ | ||
1357 | diff --git a/kernel/capability.c b/kernel/capability.c | ||
1358 | index 39e8193..cfbe442 100644 | ||
1359 | --- a/kernel/capability.c | ||
1360 | +++ b/kernel/capability.c | ||
1361 | @@ -53,6 +53,69 @@ static void warn_legacy_capability_use(void) | ||
1362 | } | ||
1363 | |||
1364 | /* | ||
1365 | + * Version 2 capabilities worked fine, but the linux/capability.h file | ||
1366 | + * that accompanied their introduction encouraged their use without | ||
1367 | + * the necessary user-space source code changes. As such, we have | ||
1368 | + * created a version 3 with equivalent functionality to version 2, but | ||
1369 | + * with a header change to protect legacy source code from using | ||
1370 | + * version 2 when it wanted to use version 1. If your system has code | ||
1371 | + * that trips the following warning, it is using version 2 specific | ||
1372 | + * capabilities and may be doing so insecurely. | ||
1373 | + * | ||
1374 | + * The remedy is to either upgrade your version of libcap (to 2.10+, | ||
1375 | + * if the application is linked against it), or recompile your | ||
1376 | + * application with modern kernel headers and this warning will go | ||
1377 | + * away. | ||
1378 | + */ | ||
1379 | + | ||
1380 | +static void warn_deprecated_v2(void) | ||
1381 | +{ | ||
1382 | + static int warned; | ||
1383 | + | ||
1384 | + if (!warned) { | ||
1385 | + char name[sizeof(current->comm)]; | ||
1386 | + | ||
1387 | + printk(KERN_INFO "warning: `%s' uses deprecated v2" | ||
1388 | + " capabilities in a way that may be insecure.\n", | ||
1389 | + get_task_comm(name, current)); | ||
1390 | + warned = 1; | ||
1391 | + } | ||
1392 | +} | ||
1393 | + | ||
1394 | +/* | ||
1395 | + * Version check. Return the number of u32s in each capability flag | ||
1396 | + * array, or a negative value on error. | ||
1397 | + */ | ||
1398 | +static int cap_validate_magic(cap_user_header_t header, unsigned *tocopy) | ||
1399 | +{ | ||
1400 | + __u32 version; | ||
1401 | + | ||
1402 | + if (get_user(version, &header->version)) | ||
1403 | + return -EFAULT; | ||
1404 | + | ||
1405 | + switch (version) { | ||
1406 | + case _LINUX_CAPABILITY_VERSION_1: | ||
1407 | + warn_legacy_capability_use(); | ||
1408 | + *tocopy = _LINUX_CAPABILITY_U32S_1; | ||
1409 | + break; | ||
1410 | + case _LINUX_CAPABILITY_VERSION_2: | ||
1411 | + warn_deprecated_v2(); | ||
1412 | + /* | ||
1413 | + * fall through - v3 is otherwise equivalent to v2. | ||
1414 | + */ | ||
1415 | + case _LINUX_CAPABILITY_VERSION_3: | ||
1416 | + *tocopy = _LINUX_CAPABILITY_U32S_3; | ||
1417 | + break; | ||
1418 | + default: | ||
1419 | + if (put_user((u32)_KERNEL_CAPABILITY_VERSION, &header->version)) | ||
1420 | + return -EFAULT; | ||
1421 | + return -EINVAL; | ||
1422 | + } | ||
1423 | + | ||
1424 | + return 0; | ||
1425 | +} | ||
1426 | + | ||
1427 | +/* | ||
1428 | * For sys_getproccap() and sys_setproccap(), any of the three | ||
1429 | * capability set pointers may be NULL -- indicating that that set is | ||
1430 | * uninteresting and/or not to be changed. | ||
1431 | @@ -71,27 +134,13 @@ asmlinkage long sys_capget(cap_user_header_t header, cap_user_data_t dataptr) | ||
1432 | { | ||
1433 | int ret = 0; | ||
1434 | pid_t pid; | ||
1435 | - __u32 version; | ||
1436 | struct task_struct *target; | ||
1437 | unsigned tocopy; | ||
1438 | kernel_cap_t pE, pI, pP; | ||
1439 | |||
1440 | - if (get_user(version, &header->version)) | ||
1441 | - return -EFAULT; | ||
1442 | - | ||
1443 | - switch (version) { | ||
1444 | - case _LINUX_CAPABILITY_VERSION_1: | ||
1445 | - warn_legacy_capability_use(); | ||
1446 | - tocopy = _LINUX_CAPABILITY_U32S_1; | ||
1447 | - break; | ||
1448 | - case _LINUX_CAPABILITY_VERSION_2: | ||
1449 | - tocopy = _LINUX_CAPABILITY_U32S_2; | ||
1450 | - break; | ||
1451 | - default: | ||
1452 | - if (put_user(_LINUX_CAPABILITY_VERSION, &header->version)) | ||
1453 | - return -EFAULT; | ||
1454 | - return -EINVAL; | ||
1455 | - } | ||
1456 | + ret = cap_validate_magic(header, &tocopy); | ||
1457 | + if (ret != 0) | ||
1458 | + return ret; | ||
1459 | |||
1460 | if (get_user(pid, &header->pid)) | ||
1461 | return -EFAULT; | ||
1462 | @@ -118,7 +167,7 @@ out: | ||
1463 | spin_unlock(&task_capability_lock); | ||
1464 | |||
1465 | if (!ret) { | ||
1466 | - struct __user_cap_data_struct kdata[_LINUX_CAPABILITY_U32S]; | ||
1467 | + struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S]; | ||
1468 | unsigned i; | ||
1469 | |||
1470 | for (i = 0; i < tocopy; i++) { | ||
1471 | @@ -128,7 +177,7 @@ out: | ||
1472 | } | ||
1473 | |||
1474 | /* | ||
1475 | - * Note, in the case, tocopy < _LINUX_CAPABILITY_U32S, | ||
1476 | + * Note, in the case, tocopy < _KERNEL_CAPABILITY_U32S, | ||
1477 | * we silently drop the upper capabilities here. This | ||
1478 | * has the effect of making older libcap | ||
1479 | * implementations implicitly drop upper capability | ||
1480 | @@ -240,30 +289,16 @@ static inline int cap_set_all(kernel_cap_t *effective, | ||
1481 | */ | ||
1482 | asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) | ||
1483 | { | ||
1484 | - struct __user_cap_data_struct kdata[_LINUX_CAPABILITY_U32S]; | ||
1485 | + struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S]; | ||
1486 | unsigned i, tocopy; | ||
1487 | kernel_cap_t inheritable, permitted, effective; | ||
1488 | - __u32 version; | ||
1489 | struct task_struct *target; | ||
1490 | int ret; | ||
1491 | pid_t pid; | ||
1492 | |||
1493 | - if (get_user(version, &header->version)) | ||
1494 | - return -EFAULT; | ||
1495 | - | ||
1496 | - switch (version) { | ||
1497 | - case _LINUX_CAPABILITY_VERSION_1: | ||
1498 | - warn_legacy_capability_use(); | ||
1499 | - tocopy = _LINUX_CAPABILITY_U32S_1; | ||
1500 | - break; | ||
1501 | - case _LINUX_CAPABILITY_VERSION_2: | ||
1502 | - tocopy = _LINUX_CAPABILITY_U32S_2; | ||
1503 | - break; | ||
1504 | - default: | ||
1505 | - if (put_user(_LINUX_CAPABILITY_VERSION, &header->version)) | ||
1506 | - return -EFAULT; | ||
1507 | - return -EINVAL; | ||
1508 | - } | ||
1509 | + ret = cap_validate_magic(header, &tocopy); | ||
1510 | + if (ret != 0) | ||
1511 | + return ret; | ||
1512 | |||
1513 | if (get_user(pid, &header->pid)) | ||
1514 | return -EFAULT; | ||
1515 | @@ -281,7 +316,7 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) | ||
1516 | permitted.cap[i] = kdata[i].permitted; | ||
1517 | inheritable.cap[i] = kdata[i].inheritable; | ||
1518 | } | ||
1519 | - while (i < _LINUX_CAPABILITY_U32S) { | ||
1520 | + while (i < _KERNEL_CAPABILITY_U32S) { | ||
1521 | effective.cap[i] = 0; | ||
1522 | permitted.cap[i] = 0; | ||
1523 | inheritable.cap[i] = 0; | ||
1524 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
1525 | index 6d8de05..4484139 100644 | ||
1526 | --- a/kernel/cgroup.c | ||
1527 | +++ b/kernel/cgroup.c | ||
1528 | @@ -2808,7 +2808,7 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys) | ||
1529 | cg = tsk->cgroups; | ||
1530 | parent = task_cgroup(tsk, subsys->subsys_id); | ||
1531 | |||
1532 | - snprintf(nodename, MAX_CGROUP_TYPE_NAMELEN, "node_%d", tsk->pid); | ||
1533 | + snprintf(nodename, MAX_CGROUP_TYPE_NAMELEN, "%d", tsk->pid); | ||
1534 | |||
1535 | /* Pin the hierarchy */ | ||
1536 | atomic_inc(&parent->root->sb->s_active); | ||
1537 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c | ||
1538 | index 7469c50..4d1e8c7 100644 | ||
1539 | --- a/mm/memory_hotplug.c | ||
1540 | +++ b/mm/memory_hotplug.c | ||
1541 | @@ -58,23 +58,59 @@ static void release_memory_resource(struct resource *res) | ||
1542 | return; | ||
1543 | } | ||
1544 | |||
1545 | - | ||
1546 | #ifdef CONFIG_MEMORY_HOTPLUG_SPARSE | ||
1547 | +static void grow_zone_span(struct zone *zone, unsigned long start_pfn, | ||
1548 | + unsigned long end_pfn) | ||
1549 | +{ | ||
1550 | + unsigned long old_zone_end_pfn; | ||
1551 | + | ||
1552 | + zone_span_writelock(zone); | ||
1553 | + | ||
1554 | + old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages; | ||
1555 | + if (start_pfn < zone->zone_start_pfn) | ||
1556 | + zone->zone_start_pfn = start_pfn; | ||
1557 | + | ||
1558 | + zone->spanned_pages = max(old_zone_end_pfn, end_pfn) - | ||
1559 | + zone->zone_start_pfn; | ||
1560 | + | ||
1561 | + zone_span_writeunlock(zone); | ||
1562 | +} | ||
1563 | + | ||
1564 | +static void grow_pgdat_span(struct pglist_data *pgdat, unsigned long start_pfn, | ||
1565 | + unsigned long end_pfn) | ||
1566 | +{ | ||
1567 | + unsigned long old_pgdat_end_pfn = | ||
1568 | + pgdat->node_start_pfn + pgdat->node_spanned_pages; | ||
1569 | + | ||
1570 | + if (start_pfn < pgdat->node_start_pfn) | ||
1571 | + pgdat->node_start_pfn = start_pfn; | ||
1572 | + | ||
1573 | + pgdat->node_spanned_pages = max(old_pgdat_end_pfn, end_pfn) - | ||
1574 | + pgdat->node_start_pfn; | ||
1575 | +} | ||
1576 | + | ||
1577 | static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) | ||
1578 | { | ||
1579 | struct pglist_data *pgdat = zone->zone_pgdat; | ||
1580 | int nr_pages = PAGES_PER_SECTION; | ||
1581 | int nid = pgdat->node_id; | ||
1582 | int zone_type; | ||
1583 | + unsigned long flags; | ||
1584 | |||
1585 | zone_type = zone - pgdat->node_zones; | ||
1586 | if (!zone->wait_table) { | ||
1587 | - int ret = 0; | ||
1588 | + int ret; | ||
1589 | + | ||
1590 | ret = init_currently_empty_zone(zone, phys_start_pfn, | ||
1591 | nr_pages, MEMMAP_HOTPLUG); | ||
1592 | - if (ret < 0) | ||
1593 | + if (ret) | ||
1594 | return ret; | ||
1595 | } | ||
1596 | + pgdat_resize_lock(zone->zone_pgdat, &flags); | ||
1597 | + grow_zone_span(zone, phys_start_pfn, phys_start_pfn + nr_pages); | ||
1598 | + grow_pgdat_span(zone->zone_pgdat, phys_start_pfn, | ||
1599 | + phys_start_pfn + nr_pages); | ||
1600 | + pgdat_resize_unlock(zone->zone_pgdat, &flags); | ||
1601 | memmap_init_zone(nr_pages, nid, zone_type, | ||
1602 | phys_start_pfn, MEMMAP_HOTPLUG); | ||
1603 | return 0; | ||
1604 | @@ -134,36 +170,6 @@ int __add_pages(struct zone *zone, unsigned long phys_start_pfn, | ||
1605 | } | ||
1606 | EXPORT_SYMBOL_GPL(__add_pages); | ||
1607 | |||
1608 | -static void grow_zone_span(struct zone *zone, | ||
1609 | - unsigned long start_pfn, unsigned long end_pfn) | ||
1610 | -{ | ||
1611 | - unsigned long old_zone_end_pfn; | ||
1612 | - | ||
1613 | - zone_span_writelock(zone); | ||
1614 | - | ||
1615 | - old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages; | ||
1616 | - if (start_pfn < zone->zone_start_pfn) | ||
1617 | - zone->zone_start_pfn = start_pfn; | ||
1618 | - | ||
1619 | - zone->spanned_pages = max(old_zone_end_pfn, end_pfn) - | ||
1620 | - zone->zone_start_pfn; | ||
1621 | - | ||
1622 | - zone_span_writeunlock(zone); | ||
1623 | -} | ||
1624 | - | ||
1625 | -static void grow_pgdat_span(struct pglist_data *pgdat, | ||
1626 | - unsigned long start_pfn, unsigned long end_pfn) | ||
1627 | -{ | ||
1628 | - unsigned long old_pgdat_end_pfn = | ||
1629 | - pgdat->node_start_pfn + pgdat->node_spanned_pages; | ||
1630 | - | ||
1631 | - if (start_pfn < pgdat->node_start_pfn) | ||
1632 | - pgdat->node_start_pfn = start_pfn; | ||
1633 | - | ||
1634 | - pgdat->node_spanned_pages = max(old_pgdat_end_pfn, end_pfn) - | ||
1635 | - pgdat->node_start_pfn; | ||
1636 | -} | ||
1637 | - | ||
1638 | static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages, | ||
1639 | void *arg) | ||
1640 | { | ||
1641 | @@ -183,7 +189,6 @@ static int online_pages_range(unsigned long start_pfn, unsigned long nr_pages, | ||
1642 | |||
1643 | int online_pages(unsigned long pfn, unsigned long nr_pages) | ||
1644 | { | ||
1645 | - unsigned long flags; | ||
1646 | unsigned long onlined_pages = 0; | ||
1647 | struct zone *zone; | ||
1648 | int need_zonelists_rebuild = 0; | ||
1649 | @@ -211,11 +216,6 @@ int online_pages(unsigned long pfn, unsigned long nr_pages) | ||
1650 | * memory_block->state_sem. | ||
1651 | */ | ||
1652 | zone = page_zone(pfn_to_page(pfn)); | ||
1653 | - pgdat_resize_lock(zone->zone_pgdat, &flags); | ||
1654 | - grow_zone_span(zone, pfn, pfn + nr_pages); | ||
1655 | - grow_pgdat_span(zone->zone_pgdat, pfn, pfn + nr_pages); | ||
1656 | - pgdat_resize_unlock(zone->zone_pgdat, &flags); | ||
1657 | - | ||
1658 | /* | ||
1659 | * If this zone is not populated, then it is not in zonelist. | ||
1660 | * This means the page allocator ignores this zone. | ||
1661 | diff --git a/mm/mmap.c b/mm/mmap.c | ||
1662 | index a32d28c..96bdd73 100644 | ||
1663 | --- a/mm/mmap.c | ||
1664 | +++ b/mm/mmap.c | ||
1665 | @@ -242,10 +242,16 @@ asmlinkage unsigned long sys_brk(unsigned long brk) | ||
1666 | unsigned long rlim, retval; | ||
1667 | unsigned long newbrk, oldbrk; | ||
1668 | struct mm_struct *mm = current->mm; | ||
1669 | + unsigned long min_brk; | ||
1670 | |||
1671 | down_write(&mm->mmap_sem); | ||
1672 | |||
1673 | - if (brk < mm->start_brk) | ||
1674 | +#ifdef CONFIG_COMPAT_BRK | ||
1675 | + min_brk = mm->end_code; | ||
1676 | +#else | ||
1677 | + min_brk = mm->start_brk; | ||
1678 | +#endif | ||
1679 | + if (brk < min_brk) | ||
1680 | goto out; | ||
1681 | |||
1682 | /* | ||
1683 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
1684 | index 55443c2..f7082af 100644 | ||
1685 | --- a/mm/page_alloc.c | ||
1686 | +++ b/mm/page_alloc.c | ||
1687 | @@ -2837,8 +2837,6 @@ __meminit int init_currently_empty_zone(struct zone *zone, | ||
1688 | |||
1689 | zone->zone_start_pfn = zone_start_pfn; | ||
1690 | |||
1691 | - memmap_init(size, pgdat->node_id, zone_idx(zone), zone_start_pfn); | ||
1692 | - | ||
1693 | zone_init_free_lists(zone); | ||
1694 | |||
1695 | return 0; | ||
1696 | @@ -3408,6 +3406,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat, | ||
1697 | ret = init_currently_empty_zone(zone, zone_start_pfn, | ||
1698 | size, MEMMAP_EARLY); | ||
1699 | BUG_ON(ret); | ||
1700 | + memmap_init(size, nid, j, zone_start_pfn); | ||
1701 | zone_start_pfn += size; | ||
1702 | } | ||
1703 | } | ||
1704 | diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
1705 | index 24c0d03..b8a917b 100644 | ||
1706 | --- a/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
1707 | +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
1708 | @@ -209,7 +209,9 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst) | ||
1709 | arg.dst = dst; | ||
1710 | hash = ip6qhashfn(id, src, dst); | ||
1711 | |||
1712 | + local_bh_disable(); | ||
1713 | q = inet_frag_find(&nf_init_frags, &nf_frags, &arg, hash); | ||
1714 | + local_bh_enable(); | ||
1715 | if (q == NULL) | ||
1716 | goto oom; | ||
1717 | |||
1718 | @@ -638,10 +640,10 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | ||
1719 | goto ret_orig; | ||
1720 | } | ||
1721 | |||
1722 | - spin_lock(&fq->q.lock); | ||
1723 | + spin_lock_bh(&fq->q.lock); | ||
1724 | |||
1725 | if (nf_ct_frag6_queue(fq, clone, fhdr, nhoff) < 0) { | ||
1726 | - spin_unlock(&fq->q.lock); | ||
1727 | + spin_unlock_bh(&fq->q.lock); | ||
1728 | pr_debug("Can't insert skb to queue\n"); | ||
1729 | fq_put(fq); | ||
1730 | goto ret_orig; | ||
1731 | @@ -652,7 +654,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb) | ||
1732 | if (ret_skb == NULL) | ||
1733 | pr_debug("Can't reassemble fragmented packets\n"); | ||
1734 | } | ||
1735 | - spin_unlock(&fq->q.lock); | ||
1736 | + spin_unlock_bh(&fq->q.lock); | ||
1737 | |||
1738 | fq_put(fq); | ||
1739 | return ret_skb; | ||
1740 | diff --git a/net/netfilter/nf_conntrack_expect.c b/net/netfilter/nf_conntrack_expect.c | ||
1741 | index 684ec9c..d15d70f 100644 | ||
1742 | --- a/net/netfilter/nf_conntrack_expect.c | ||
1743 | +++ b/net/netfilter/nf_conntrack_expect.c | ||
1744 | @@ -550,10 +550,10 @@ int __init nf_conntrack_expect_init(void) | ||
1745 | return 0; | ||
1746 | |||
1747 | err3: | ||
1748 | + kmem_cache_destroy(nf_ct_expect_cachep); | ||
1749 | +err2: | ||
1750 | nf_ct_free_hashtable(nf_ct_expect_hash, nf_ct_expect_vmalloc, | ||
1751 | nf_ct_expect_hsize); | ||
1752 | -err2: | ||
1753 | - kmem_cache_destroy(nf_ct_expect_cachep); | ||
1754 | err1: | ||
1755 | return err; | ||
1756 | } | ||
1757 | diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c | ||
1758 | index 3b01119..1692338 100644 | ||
1759 | --- a/net/netfilter/xt_connlimit.c | ||
1760 | +++ b/net/netfilter/xt_connlimit.c | ||
1761 | @@ -75,7 +75,8 @@ static inline bool already_closed(const struct nf_conn *conn) | ||
1762 | u_int16_t proto = conn->tuplehash[0].tuple.dst.protonum; | ||
1763 | |||
1764 | if (proto == IPPROTO_TCP) | ||
1765 | - return conn->proto.tcp.state == TCP_CONNTRACK_TIME_WAIT; | ||
1766 | + return conn->proto.tcp.state == TCP_CONNTRACK_TIME_WAIT || | ||
1767 | + conn->proto.tcp.state == TCP_CONNTRACK_CLOSE; | ||
1768 | else | ||
1769 | return 0; | ||
1770 | } | ||
1771 | diff --git a/net/netfilter/xt_iprange.c b/net/netfilter/xt_iprange.c | ||
1772 | index 500528d..c63e933 100644 | ||
1773 | --- a/net/netfilter/xt_iprange.c | ||
1774 | +++ b/net/netfilter/xt_iprange.c | ||
1775 | @@ -179,3 +179,5 @@ module_exit(iprange_mt_exit); | ||
1776 | MODULE_LICENSE("GPL"); | ||
1777 | MODULE_AUTHOR("Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>, Jan Engelhardt <jengelh@computergmbh.de>"); | ||
1778 | MODULE_DESCRIPTION("Xtables: arbitrary IPv4 range matching"); | ||
1779 | +MODULE_ALIAS("ipt_iprange"); | ||
1780 | +MODULE_ALIAS("ip6t_iprange"); | ||
1781 | diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c | ||
1782 | index 732ba27..62d77ff 100644 | ||
1783 | --- a/security/smack/smack_lsm.c | ||
1784 | +++ b/security/smack/smack_lsm.c | ||
1785 | @@ -1865,6 +1865,18 @@ static void smack_d_instantiate(struct dentry *opt_dentry, struct inode *inode) | ||
1786 | final = sbsp->smk_default; | ||
1787 | |||
1788 | /* | ||
1789 | + * If this is the root inode the superblock | ||
1790 | + * may be in the process of initialization. | ||
1791 | + * If that is the case use the root value out | ||
1792 | + * of the superblock. | ||
1793 | + */ | ||
1794 | + if (opt_dentry->d_parent == opt_dentry) { | ||
1795 | + isp->smk_inode = sbsp->smk_root; | ||
1796 | + isp->smk_flags |= SMK_INODE_INSTANT; | ||
1797 | + goto unlockandout; | ||
1798 | + } | ||
1799 | + | ||
1800 | + /* | ||
1801 | * This is pretty hackish. | ||
1802 | * Casey says that we shouldn't have to do | ||
1803 | * file system specific code, but it does help |