Annotation of /trunk/kernel-lts/patches-3.4/0143-3.4.44-all-fixes.patch
Parent Directory | Revision Log
Revision 2203 -
(hide annotations)
(download)
Thu Jun 13 10:38:14 2013 UTC (11 years, 3 months ago) by niro
File size: 57581 byte(s)
Thu Jun 13 10:38:14 2013 UTC (11 years, 3 months ago) by niro
File size: 57581 byte(s)
-linux-3.4.44
1 | niro | 2203 | diff --git a/arch/arm/configs/at91sam9g45_defconfig b/arch/arm/configs/at91sam9g45_defconfig |
2 | index 606d48f..8aab786 100644 | ||
3 | --- a/arch/arm/configs/at91sam9g45_defconfig | ||
4 | +++ b/arch/arm/configs/at91sam9g45_defconfig | ||
5 | @@ -173,7 +173,6 @@ CONFIG_MMC=y | ||
6 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
7 | CONFIG_SDIO_UART=m | ||
8 | CONFIG_MMC_ATMELMCI=y | ||
9 | -CONFIG_MMC_ATMELMCI_DMA=y | ||
10 | CONFIG_LEDS_ATMEL_PWM=y | ||
11 | CONFIG_LEDS_GPIO=y | ||
12 | CONFIG_LEDS_TRIGGER_TIMER=y | ||
13 | diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h | ||
14 | index 41dc31f..cc5e50f 100644 | ||
15 | --- a/arch/arm/include/asm/pgtable.h | ||
16 | +++ b/arch/arm/include/asm/pgtable.h | ||
17 | @@ -61,6 +61,15 @@ extern void __pgd_error(const char *file, int line, pgd_t); | ||
18 | #define FIRST_USER_ADDRESS PAGE_SIZE | ||
19 | |||
20 | /* | ||
21 | + * Use TASK_SIZE as the ceiling argument for free_pgtables() and | ||
22 | + * free_pgd_range() to avoid freeing the modules pmd when LPAE is enabled (pmd | ||
23 | + * page shared between user and kernel). | ||
24 | + */ | ||
25 | +#ifdef CONFIG_ARM_LPAE | ||
26 | +#define USER_PGTABLES_CEILING TASK_SIZE | ||
27 | +#endif | ||
28 | + | ||
29 | +/* | ||
30 | * The pgprot_* and protection_map entries will be fixed up in runtime | ||
31 | * to include the cachable and bufferable bits based on memory policy, | ||
32 | * as well as any architecture dependent bits like global/ASID and SMP | ||
33 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c | ||
34 | index 55293a7..5db5174 100644 | ||
35 | --- a/arch/arm/mach-at91/setup.c | ||
36 | +++ b/arch/arm/mach-at91/setup.c | ||
37 | @@ -326,7 +326,7 @@ static void at91_dt_rstc(void) | ||
38 | |||
39 | of_id = of_match_node(rstc_ids, np); | ||
40 | if (!of_id) | ||
41 | - panic("AT91: rtsc no restart function availlable\n"); | ||
42 | + panic("AT91: rtsc no restart function available\n"); | ||
43 | |||
44 | arm_pm_restart = of_id->data; | ||
45 | |||
46 | diff --git a/arch/avr32/configs/favr-32_defconfig b/arch/avr32/configs/favr-32_defconfig | ||
47 | index 19973b0..59e4cc9 100644 | ||
48 | --- a/arch/avr32/configs/favr-32_defconfig | ||
49 | +++ b/arch/avr32/configs/favr-32_defconfig | ||
50 | @@ -122,7 +122,6 @@ CONFIG_USB_G_SERIAL=m | ||
51 | CONFIG_USB_CDC_COMPOSITE=m | ||
52 | CONFIG_MMC=y | ||
53 | CONFIG_MMC_ATMELMCI=y | ||
54 | -CONFIG_MMC_ATMELMCI_DMA=y | ||
55 | CONFIG_NEW_LEDS=y | ||
56 | CONFIG_LEDS_CLASS=y | ||
57 | CONFIG_LEDS_ATMEL_PWM=m | ||
58 | diff --git a/arch/avr32/configs/merisc_defconfig b/arch/avr32/configs/merisc_defconfig | ||
59 | index 3befab9..65de443 100644 | ||
60 | --- a/arch/avr32/configs/merisc_defconfig | ||
61 | +++ b/arch/avr32/configs/merisc_defconfig | ||
62 | @@ -102,7 +102,6 @@ CONFIG_FRAMEBUFFER_CONSOLE=y | ||
63 | CONFIG_LOGO=y | ||
64 | CONFIG_MMC=y | ||
65 | CONFIG_MMC_ATMELMCI=y | ||
66 | -CONFIG_MMC_ATMELMCI_DMA=y | ||
67 | CONFIG_NEW_LEDS=y | ||
68 | CONFIG_LEDS_CLASS=y | ||
69 | CONFIG_LEDS_ATMEL_PWM=y | ||
70 | diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h | ||
71 | index d2bf1fd..76acbcd 100644 | ||
72 | --- a/arch/ia64/include/asm/futex.h | ||
73 | +++ b/arch/ia64/include/asm/futex.h | ||
74 | @@ -106,16 +106,15 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
75 | return -EFAULT; | ||
76 | |||
77 | { | ||
78 | - register unsigned long r8 __asm ("r8"); | ||
79 | + register unsigned long r8 __asm ("r8") = 0; | ||
80 | unsigned long prev; | ||
81 | __asm__ __volatile__( | ||
82 | " mf;; \n" | ||
83 | - " mov %0=r0 \n" | ||
84 | " mov ar.ccv=%4;; \n" | ||
85 | "[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n" | ||
86 | " .xdata4 \"__ex_table\", 1b-., 2f-. \n" | ||
87 | "[2:]" | ||
88 | - : "=r" (r8), "=r" (prev) | ||
89 | + : "+r" (r8), "=&r" (prev) | ||
90 | : "r" (uaddr), "r" (newval), | ||
91 | "rO" ((long) (unsigned) oldval) | ||
92 | : "memory"); | ||
93 | diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h | ||
94 | index 43f96ab..8c70961 100644 | ||
95 | --- a/arch/ia64/include/asm/mca.h | ||
96 | +++ b/arch/ia64/include/asm/mca.h | ||
97 | @@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS]; | ||
98 | extern int cpe_vector; | ||
99 | extern int ia64_cpe_irq; | ||
100 | extern void ia64_mca_init(void); | ||
101 | +extern void ia64_mca_irq_init(void); | ||
102 | extern void ia64_mca_cpu_init(void *); | ||
103 | extern void ia64_os_mca_dispatch(void); | ||
104 | extern void ia64_os_mca_dispatch_end(void); | ||
105 | diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c | ||
106 | index ad69606..f2c41828 100644 | ||
107 | --- a/arch/ia64/kernel/irq.c | ||
108 | +++ b/arch/ia64/kernel/irq.c | ||
109 | @@ -23,6 +23,8 @@ | ||
110 | #include <linux/interrupt.h> | ||
111 | #include <linux/kernel_stat.h> | ||
112 | |||
113 | +#include <asm/mca.h> | ||
114 | + | ||
115 | /* | ||
116 | * 'what should we do if we get a hw irq event on an illegal vector'. | ||
117 | * each architecture has to answer this themselves. | ||
118 | @@ -83,6 +85,12 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask) | ||
119 | |||
120 | #endif /* CONFIG_SMP */ | ||
121 | |||
122 | +int __init arch_early_irq_init(void) | ||
123 | +{ | ||
124 | + ia64_mca_irq_init(); | ||
125 | + return 0; | ||
126 | +} | ||
127 | + | ||
128 | #ifdef CONFIG_HOTPLUG_CPU | ||
129 | unsigned int vectors_in_migration[NR_IRQS]; | ||
130 | |||
131 | diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c | ||
132 | index 65bf9cd..d7396db 100644 | ||
133 | --- a/arch/ia64/kernel/mca.c | ||
134 | +++ b/arch/ia64/kernel/mca.c | ||
135 | @@ -2074,22 +2074,16 @@ ia64_mca_init(void) | ||
136 | printk(KERN_INFO "MCA related initialization done\n"); | ||
137 | } | ||
138 | |||
139 | + | ||
140 | /* | ||
141 | - * ia64_mca_late_init | ||
142 | - * | ||
143 | - * Opportunity to setup things that require initialization later | ||
144 | - * than ia64_mca_init. Setup a timer to poll for CPEs if the | ||
145 | - * platform doesn't support an interrupt driven mechanism. | ||
146 | - * | ||
147 | - * Inputs : None | ||
148 | - * Outputs : Status | ||
149 | + * These pieces cannot be done in ia64_mca_init() because it is called before | ||
150 | + * early_irq_init() which would wipe out our percpu irq registrations. But we | ||
151 | + * cannot leave them until ia64_mca_late_init() because by then all the other | ||
152 | + * processors have been brought online and have set their own CMC vectors to | ||
153 | + * point at a non-existant action. Called from arch_early_irq_init(). | ||
154 | */ | ||
155 | -static int __init | ||
156 | -ia64_mca_late_init(void) | ||
157 | +void __init ia64_mca_irq_init(void) | ||
158 | { | ||
159 | - if (!mca_init) | ||
160 | - return 0; | ||
161 | - | ||
162 | /* | ||
163 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | ||
164 | * per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). | ||
165 | @@ -2108,6 +2102,23 @@ ia64_mca_late_init(void) | ||
166 | /* Setup the CPEI/P handler */ | ||
167 | register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction); | ||
168 | #endif | ||
169 | +} | ||
170 | + | ||
171 | +/* | ||
172 | + * ia64_mca_late_init | ||
173 | + * | ||
174 | + * Opportunity to setup things that require initialization later | ||
175 | + * than ia64_mca_init. Setup a timer to poll for CPEs if the | ||
176 | + * platform doesn't support an interrupt driven mechanism. | ||
177 | + * | ||
178 | + * Inputs : None | ||
179 | + * Outputs : Status | ||
180 | + */ | ||
181 | +static int __init | ||
182 | +ia64_mca_late_init(void) | ||
183 | +{ | ||
184 | + if (!mca_init) | ||
185 | + return 0; | ||
186 | |||
187 | register_hotcpu_notifier(&mca_cpu_notifier); | ||
188 | |||
189 | diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c | ||
190 | index 4332f7e..a7869f8 100644 | ||
191 | --- a/arch/ia64/kvm/vtlb.c | ||
192 | +++ b/arch/ia64/kvm/vtlb.c | ||
193 | @@ -256,7 +256,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte) | ||
194 | "srlz.d;;" | ||
195 | "ssm psr.i;;" | ||
196 | "srlz.d;;" | ||
197 | - : "=r"(ret) : "r"(iha), "r"(pte):"memory"); | ||
198 | + : "=&r"(ret) : "r"(iha), "r"(pte) : "memory"); | ||
199 | |||
200 | return ret; | ||
201 | } | ||
202 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S | ||
203 | index 9e07bd0..1a3607b 100644 | ||
204 | --- a/arch/powerpc/kernel/head_64.S | ||
205 | +++ b/arch/powerpc/kernel/head_64.S | ||
206 | @@ -489,6 +489,7 @@ _GLOBAL(copy_and_flush) | ||
207 | sync | ||
208 | addi r5,r5,8 | ||
209 | addi r6,r6,8 | ||
210 | + isync | ||
211 | blr | ||
212 | |||
213 | .align 8 | ||
214 | diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c | ||
215 | index 1d75c92..ad697f8 100644 | ||
216 | --- a/arch/powerpc/platforms/cell/spufs/inode.c | ||
217 | +++ b/arch/powerpc/platforms/cell/spufs/inode.c | ||
218 | @@ -99,6 +99,7 @@ spufs_new_inode(struct super_block *sb, umode_t mode) | ||
219 | if (!inode) | ||
220 | goto out; | ||
221 | |||
222 | + inode->i_ino = get_next_ino(); | ||
223 | inode->i_mode = mode; | ||
224 | inode->i_uid = current_fsuid(); | ||
225 | inode->i_gid = current_fsgid(); | ||
226 | diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c | ||
227 | index 3dafc60..a14a835 100644 | ||
228 | --- a/arch/x86/kernel/irq.c | ||
229 | +++ b/arch/x86/kernel/irq.c | ||
230 | @@ -165,10 +165,6 @@ u64 arch_irq_stat_cpu(unsigned int cpu) | ||
231 | u64 arch_irq_stat(void) | ||
232 | { | ||
233 | u64 sum = atomic_read(&irq_err_count); | ||
234 | - | ||
235 | -#ifdef CONFIG_X86_IO_APIC | ||
236 | - sum += atomic_read(&irq_mis_count); | ||
237 | -#endif | ||
238 | return sum; | ||
239 | } | ||
240 | |||
241 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c | ||
242 | index 8375622..8c45818 100644 | ||
243 | --- a/arch/x86/kvm/emulate.c | ||
244 | +++ b/arch/x86/kvm/emulate.c | ||
245 | @@ -3737,6 +3737,10 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op, | ||
246 | break; | ||
247 | case OpMem8: | ||
248 | ctxt->memop.bytes = 1; | ||
249 | + if (ctxt->memop.type == OP_REG) { | ||
250 | + ctxt->memop.addr.reg = decode_register(ctxt, ctxt->modrm_rm, 1); | ||
251 | + fetch_register_operand(&ctxt->memop); | ||
252 | + } | ||
253 | goto mem_common; | ||
254 | case OpMem16: | ||
255 | ctxt->memop.bytes = 2; | ||
256 | diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c | ||
257 | index 194dbcd..2992678 100644 | ||
258 | --- a/arch/x86/xen/enlighten.c | ||
259 | +++ b/arch/x86/xen/enlighten.c | ||
260 | @@ -1515,8 +1515,11 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self, | ||
261 | switch (action) { | ||
262 | case CPU_UP_PREPARE: | ||
263 | xen_vcpu_setup(cpu); | ||
264 | - if (xen_have_vector_callback) | ||
265 | + if (xen_have_vector_callback) { | ||
266 | xen_init_lock_cpu(cpu); | ||
267 | + if (xen_feature(XENFEAT_hvm_safe_pvclock)) | ||
268 | + xen_setup_timer(cpu); | ||
269 | + } | ||
270 | break; | ||
271 | default: | ||
272 | break; | ||
273 | diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c | ||
274 | index 0296a95..054cc01 100644 | ||
275 | --- a/arch/x86/xen/time.c | ||
276 | +++ b/arch/x86/xen/time.c | ||
277 | @@ -497,7 +497,11 @@ static void xen_hvm_setup_cpu_clockevents(void) | ||
278 | { | ||
279 | int cpu = smp_processor_id(); | ||
280 | xen_setup_runstate_info(cpu); | ||
281 | - xen_setup_timer(cpu); | ||
282 | + /* | ||
283 | + * xen_setup_timer(cpu) - snprintf is bad in atomic context. Hence | ||
284 | + * doing it xen_hvm_cpu_notify (which gets called by smp_init during | ||
285 | + * early bootup and also during CPU hotplug events). | ||
286 | + */ | ||
287 | xen_setup_cpu_clockevents(); | ||
288 | } | ||
289 | |||
290 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c | ||
291 | index 7aff631..5b0f075 100644 | ||
292 | --- a/drivers/acpi/pci_root.c | ||
293 | +++ b/drivers/acpi/pci_root.c | ||
294 | @@ -247,8 +247,8 @@ static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, | ||
295 | *control &= OSC_PCI_CONTROL_MASKS; | ||
296 | capbuf[OSC_CONTROL_TYPE] = *control | root->osc_control_set; | ||
297 | } else { | ||
298 | - /* Run _OSC query for all possible controls. */ | ||
299 | - capbuf[OSC_CONTROL_TYPE] = OSC_PCI_CONTROL_MASKS; | ||
300 | + /* Run _OSC query only with existing controls. */ | ||
301 | + capbuf[OSC_CONTROL_TYPE] = root->osc_control_set; | ||
302 | } | ||
303 | |||
304 | status = acpi_pci_run_osc(root->device->handle, capbuf, &result); | ||
305 | diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c | ||
306 | index 2bded76..d70106e 100644 | ||
307 | --- a/drivers/i2c/busses/i2c-xiic.c | ||
308 | +++ b/drivers/i2c/busses/i2c-xiic.c | ||
309 | @@ -311,10 +311,8 @@ static void xiic_fill_tx_fifo(struct xiic_i2c *i2c) | ||
310 | /* last message in transfer -> STOP */ | ||
311 | data |= XIIC_TX_DYN_STOP_MASK; | ||
312 | dev_dbg(i2c->adap.dev.parent, "%s TX STOP\n", __func__); | ||
313 | - | ||
314 | - xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data); | ||
315 | - } else | ||
316 | - xiic_setreg8(i2c, XIIC_DTR_REG_OFFSET, data); | ||
317 | + } | ||
318 | + xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data); | ||
319 | } | ||
320 | } | ||
321 | |||
322 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
323 | index e0930bb..7b45b5e 100644 | ||
324 | --- a/drivers/md/md.c | ||
325 | +++ b/drivers/md/md.c | ||
326 | @@ -1587,8 +1587,8 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ | ||
327 | sector, count, 1) == 0) | ||
328 | return -EINVAL; | ||
329 | } | ||
330 | - } else if (sb->bblog_offset == 0) | ||
331 | - rdev->badblocks.shift = -1; | ||
332 | + } else if (sb->bblog_offset != 0) | ||
333 | + rdev->badblocks.shift = 0; | ||
334 | |||
335 | if (!refdev) { | ||
336 | ret = 1; | ||
337 | @@ -3107,7 +3107,7 @@ int md_rdev_init(struct md_rdev *rdev) | ||
338 | * be used - I wonder if that matters | ||
339 | */ | ||
340 | rdev->badblocks.count = 0; | ||
341 | - rdev->badblocks.shift = 0; | ||
342 | + rdev->badblocks.shift = -1; /* disabled until explicitly enabled */ | ||
343 | rdev->badblocks.page = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
344 | seqlock_init(&rdev->badblocks.lock); | ||
345 | if (rdev->badblocks.page == NULL) | ||
346 | @@ -3179,9 +3179,6 @@ static struct md_rdev *md_import_device(dev_t newdev, int super_format, int supe | ||
347 | goto abort_free; | ||
348 | } | ||
349 | } | ||
350 | - if (super_format == -1) | ||
351 | - /* hot-add for 0.90, or non-persistent: so no badblocks */ | ||
352 | - rdev->badblocks.shift = -1; | ||
353 | |||
354 | return rdev; | ||
355 | |||
356 | diff --git a/drivers/mfd/adp5520.c b/drivers/mfd/adp5520.c | ||
357 | index 8d816cc..105f820 100644 | ||
358 | --- a/drivers/mfd/adp5520.c | ||
359 | +++ b/drivers/mfd/adp5520.c | ||
360 | @@ -36,6 +36,7 @@ struct adp5520_chip { | ||
361 | struct blocking_notifier_head notifier_list; | ||
362 | int irq; | ||
363 | unsigned long id; | ||
364 | + uint8_t mode; | ||
365 | }; | ||
366 | |||
367 | static int __adp5520_read(struct i2c_client *client, | ||
368 | @@ -326,7 +327,10 @@ static int adp5520_suspend(struct device *dev) | ||
369 | struct i2c_client *client = to_i2c_client(dev); | ||
370 | struct adp5520_chip *chip = dev_get_drvdata(&client->dev); | ||
371 | |||
372 | - adp5520_clr_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); | ||
373 | + adp5520_read(chip->dev, ADP5520_MODE_STATUS, &chip->mode); | ||
374 | + /* All other bits are W1C */ | ||
375 | + chip->mode &= ADP5520_BL_EN | ADP5520_DIM_EN | ADP5520_nSTNBY; | ||
376 | + adp5520_write(chip->dev, ADP5520_MODE_STATUS, 0); | ||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | @@ -335,7 +339,7 @@ static int adp5520_resume(struct device *dev) | ||
381 | struct i2c_client *client = to_i2c_client(dev); | ||
382 | struct adp5520_chip *chip = dev_get_drvdata(&client->dev); | ||
383 | |||
384 | - adp5520_set_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); | ||
385 | + adp5520_write(chip->dev, ADP5520_MODE_STATUS, chip->mode); | ||
386 | return 0; | ||
387 | } | ||
388 | #endif | ||
389 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c | ||
390 | index 54df5ad..5352cd7 100644 | ||
391 | --- a/drivers/mmc/core/mmc.c | ||
392 | +++ b/drivers/mmc/core/mmc.c | ||
393 | @@ -385,13 +385,13 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) | ||
394 | ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]; | ||
395 | card->ext_csd.raw_trim_mult = | ||
396 | ext_csd[EXT_CSD_TRIM_MULT]; | ||
397 | + card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; | ||
398 | if (card->ext_csd.rev >= 4) { | ||
399 | /* | ||
400 | * Enhanced area feature support -- check whether the eMMC | ||
401 | * card has the Enhanced area enabled. If so, export enhanced | ||
402 | * area offset and size to user by adding sysfs interface. | ||
403 | */ | ||
404 | - card->ext_csd.raw_partition_support = ext_csd[EXT_CSD_PARTITION_SUPPORT]; | ||
405 | if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && | ||
406 | (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) { | ||
407 | hc_erase_grp_sz = | ||
408 | diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig | ||
409 | index 2bc06e7..dbdd907 100644 | ||
410 | --- a/drivers/mmc/host/Kconfig | ||
411 | +++ b/drivers/mmc/host/Kconfig | ||
412 | @@ -297,16 +297,6 @@ config MMC_ATMELMCI | ||
413 | |||
414 | endchoice | ||
415 | |||
416 | -config MMC_ATMELMCI_DMA | ||
417 | - bool "Atmel MCI DMA support" | ||
418 | - depends on MMC_ATMELMCI && (AVR32 || ARCH_AT91SAM9G45) && DMA_ENGINE | ||
419 | - help | ||
420 | - Say Y here to have the Atmel MCI driver use a DMA engine to | ||
421 | - do data transfers and thus increase the throughput and | ||
422 | - reduce the CPU utilization. | ||
423 | - | ||
424 | - If unsure, say N. | ||
425 | - | ||
426 | config MMC_IMX | ||
427 | tristate "Motorola i.MX Multimedia Card Interface support" | ||
428 | depends on ARCH_MX1 | ||
429 | diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c | ||
430 | index e94476b..2a822d9 100644 | ||
431 | --- a/drivers/mmc/host/atmel-mci.c | ||
432 | +++ b/drivers/mmc/host/atmel-mci.c | ||
433 | @@ -165,6 +165,7 @@ struct atmel_mci { | ||
434 | void __iomem *regs; | ||
435 | |||
436 | struct scatterlist *sg; | ||
437 | + unsigned int sg_len; | ||
438 | unsigned int pio_offset; | ||
439 | |||
440 | struct atmel_mci_slot *cur_slot; | ||
441 | @@ -754,6 +755,7 @@ static u32 atmci_prepare_data(struct atmel_mci *host, struct mmc_data *data) | ||
442 | data->error = -EINPROGRESS; | ||
443 | |||
444 | host->sg = data->sg; | ||
445 | + host->sg_len = data->sg_len; | ||
446 | host->data = data; | ||
447 | host->data_chan = NULL; | ||
448 | |||
449 | @@ -1592,7 +1594,8 @@ static void atmci_read_data_pio(struct atmel_mci *host) | ||
450 | if (offset == sg->length) { | ||
451 | flush_dcache_page(sg_page(sg)); | ||
452 | host->sg = sg = sg_next(sg); | ||
453 | - if (!sg) | ||
454 | + host->sg_len--; | ||
455 | + if (!sg || !host->sg_len) | ||
456 | goto done; | ||
457 | |||
458 | offset = 0; | ||
459 | @@ -1605,7 +1608,8 @@ static void atmci_read_data_pio(struct atmel_mci *host) | ||
460 | |||
461 | flush_dcache_page(sg_page(sg)); | ||
462 | host->sg = sg = sg_next(sg); | ||
463 | - if (!sg) | ||
464 | + host->sg_len--; | ||
465 | + if (!sg || !host->sg_len) | ||
466 | goto done; | ||
467 | |||
468 | offset = 4 - remaining; | ||
469 | @@ -1659,7 +1663,8 @@ static void atmci_write_data_pio(struct atmel_mci *host) | ||
470 | nbytes += 4; | ||
471 | if (offset == sg->length) { | ||
472 | host->sg = sg = sg_next(sg); | ||
473 | - if (!sg) | ||
474 | + host->sg_len--; | ||
475 | + if (!sg || !host->sg_len) | ||
476 | goto done; | ||
477 | |||
478 | offset = 0; | ||
479 | @@ -1673,7 +1678,8 @@ static void atmci_write_data_pio(struct atmel_mci *host) | ||
480 | nbytes += remaining; | ||
481 | |||
482 | host->sg = sg = sg_next(sg); | ||
483 | - if (!sg) { | ||
484 | + host->sg_len--; | ||
485 | + if (!sg || !host->sg_len) { | ||
486 | atmci_writel(host, ATMCI_TDR, value); | ||
487 | goto done; | ||
488 | } | ||
489 | @@ -2190,10 +2196,8 @@ static int __exit atmci_remove(struct platform_device *pdev) | ||
490 | atmci_readl(host, ATMCI_SR); | ||
491 | clk_disable(host->mck); | ||
492 | |||
493 | -#ifdef CONFIG_MMC_ATMELMCI_DMA | ||
494 | if (host->dma.chan) | ||
495 | dma_release_channel(host->dma.chan); | ||
496 | -#endif | ||
497 | |||
498 | free_irq(platform_get_irq(pdev, 0), host); | ||
499 | iounmap(host->regs); | ||
500 | diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c | ||
501 | index 5fd620b..ca2748a 100644 | ||
502 | --- a/drivers/net/ethernet/freescale/gianfar_ptp.c | ||
503 | +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c | ||
504 | @@ -127,7 +127,6 @@ struct gianfar_ptp_registers { | ||
505 | |||
506 | #define DRIVER "gianfar_ptp" | ||
507 | #define DEFAULT_CKSEL 1 | ||
508 | -#define N_ALARM 1 /* first alarm is used internally to reset fipers */ | ||
509 | #define N_EXT_TS 2 | ||
510 | #define REG_SIZE sizeof(struct gianfar_ptp_registers) | ||
511 | |||
512 | @@ -410,7 +409,7 @@ static struct ptp_clock_info ptp_gianfar_caps = { | ||
513 | .owner = THIS_MODULE, | ||
514 | .name = "gianfar clock", | ||
515 | .max_adj = 512000, | ||
516 | - .n_alarm = N_ALARM, | ||
517 | + .n_alarm = 0, | ||
518 | .n_ext_ts = N_EXT_TS, | ||
519 | .n_per_out = 0, | ||
520 | .pps = 1, | ||
521 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
522 | index 6d1f6c5..8f95545 100644 | ||
523 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
524 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
525 | @@ -2263,6 +2263,16 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data) | ||
526 | * with the write to EICR. | ||
527 | */ | ||
528 | eicr = IXGBE_READ_REG(hw, IXGBE_EICS); | ||
529 | + | ||
530 | + /* The lower 16bits of the EICR register are for the queue interrupts | ||
531 | + * which should be masked here in order to not accidently clear them if | ||
532 | + * the bits are high when ixgbe_msix_other is called. There is a race | ||
533 | + * condition otherwise which results in possible performance loss | ||
534 | + * especially if the ixgbe_msix_other interrupt is triggering | ||
535 | + * consistently (as it would when PPS is turned on for the X540 device) | ||
536 | + */ | ||
537 | + eicr &= 0xFFFF0000; | ||
538 | + | ||
539 | IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); | ||
540 | |||
541 | if (eicr & IXGBE_EICR_LSC) | ||
542 | diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c | ||
543 | index 9abb8f5..59e946a 100644 | ||
544 | --- a/drivers/net/wireless/mwifiex/pcie.c | ||
545 | +++ b/drivers/net/wireless/mwifiex/pcie.c | ||
546 | @@ -1828,9 +1828,9 @@ static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter) | ||
547 | if (pdev) { | ||
548 | pci_iounmap(pdev, card->pci_mmap); | ||
549 | pci_iounmap(pdev, card->pci_mmap1); | ||
550 | - | ||
551 | - pci_release_regions(pdev); | ||
552 | pci_disable_device(pdev); | ||
553 | + pci_release_region(pdev, 2); | ||
554 | + pci_release_region(pdev, 0); | ||
555 | pci_set_drvdata(pdev, NULL); | ||
556 | } | ||
557 | } | ||
558 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c | ||
559 | index 111569c..d08c0d8 100644 | ||
560 | --- a/drivers/pci/pci.c | ||
561 | +++ b/drivers/pci/pci.c | ||
562 | @@ -673,15 +673,11 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) | ||
563 | error = platform_pci_set_power_state(dev, state); | ||
564 | if (!error) | ||
565 | pci_update_current_state(dev, state); | ||
566 | - /* Fall back to PCI_D0 if native PM is not supported */ | ||
567 | - if (!dev->pm_cap) | ||
568 | - dev->current_state = PCI_D0; | ||
569 | - } else { | ||
570 | + } else | ||
571 | error = -ENODEV; | ||
572 | - /* Fall back to PCI_D0 if native PM is not supported */ | ||
573 | - if (!dev->pm_cap) | ||
574 | - dev->current_state = PCI_D0; | ||
575 | - } | ||
576 | + | ||
577 | + if (error && !dev->pm_cap) /* Fall back to PCI_D0 */ | ||
578 | + dev->current_state = PCI_D0; | ||
579 | |||
580 | return error; | ||
581 | } | ||
582 | diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c | ||
583 | index 7d5f56e..5f8844c 100644 | ||
584 | --- a/drivers/rtc/rtc-cmos.c | ||
585 | +++ b/drivers/rtc/rtc-cmos.c | ||
586 | @@ -805,9 +805,8 @@ static int cmos_suspend(struct device *dev) | ||
587 | mask = RTC_IRQMASK; | ||
588 | tmp &= ~mask; | ||
589 | CMOS_WRITE(tmp, RTC_CONTROL); | ||
590 | + hpet_mask_rtc_irq_bit(mask); | ||
591 | |||
592 | - /* shut down hpet emulation - we don't need it for alarm */ | ||
593 | - hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE); | ||
594 | cmos_checkintr(cmos, tmp); | ||
595 | } | ||
596 | spin_unlock_irq(&rtc_lock); | ||
597 | @@ -872,6 +871,7 @@ static int cmos_resume(struct device *dev) | ||
598 | rtc_update_irq(cmos->rtc, 1, mask); | ||
599 | tmp &= ~RTC_AIE; | ||
600 | hpet_mask_rtc_irq_bit(RTC_AIE); | ||
601 | + hpet_rtc_timer_init(); | ||
602 | } while (mask & RTC_AIE); | ||
603 | spin_unlock_irq(&rtc_lock); | ||
604 | } | ||
605 | diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c | ||
606 | index 231a1d8..e73b219 100644 | ||
607 | --- a/drivers/s390/char/sclp_cmd.c | ||
608 | +++ b/drivers/s390/char/sclp_cmd.c | ||
609 | @@ -509,6 +509,8 @@ static void __init sclp_add_standby_memory(void) | ||
610 | add_memory_merged(0); | ||
611 | } | ||
612 | |||
613 | +#define MEM_SCT_SIZE (1UL << SECTION_SIZE_BITS) | ||
614 | + | ||
615 | static void __init insert_increment(u16 rn, int standby, int assigned) | ||
616 | { | ||
617 | struct memory_increment *incr, *new_incr; | ||
618 | @@ -521,7 +523,7 @@ static void __init insert_increment(u16 rn, int standby, int assigned) | ||
619 | new_incr->rn = rn; | ||
620 | new_incr->standby = standby; | ||
621 | if (!standby) | ||
622 | - new_incr->usecount = 1; | ||
623 | + new_incr->usecount = rzm > MEM_SCT_SIZE ? rzm/MEM_SCT_SIZE : 1; | ||
624 | last_rn = 0; | ||
625 | prev = &sclp_mem_list; | ||
626 | list_for_each_entry(incr, &sclp_mem_list, list) { | ||
627 | diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c | ||
628 | index 636c539..cf9a191 100644 | ||
629 | --- a/drivers/tty/pty.c | ||
630 | +++ b/drivers/tty/pty.c | ||
631 | @@ -607,6 +607,9 @@ static int ptmx_open(struct inode *inode, struct file *filp) | ||
632 | |||
633 | nonseekable_open(inode, filp); | ||
634 | |||
635 | + /* We refuse fsnotify events on ptmx, since it's a shared resource */ | ||
636 | + filp->f_mode |= FMODE_NONOTIFY; | ||
637 | + | ||
638 | retval = tty_alloc_file(filp); | ||
639 | if (retval) | ||
640 | return retval; | ||
641 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c | ||
642 | index 246b823..4185cc5 100644 | ||
643 | --- a/drivers/tty/serial/serial_core.c | ||
644 | +++ b/drivers/tty/serial/serial_core.c | ||
645 | @@ -1877,6 +1877,8 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) | ||
646 | mutex_unlock(&port->mutex); | ||
647 | return 0; | ||
648 | } | ||
649 | + put_device(tty_dev); | ||
650 | + | ||
651 | if (console_suspend_enabled || !uart_console(uport)) | ||
652 | uport->suspended = 1; | ||
653 | |||
654 | @@ -1942,9 +1944,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) | ||
655 | disable_irq_wake(uport->irq); | ||
656 | uport->irq_wake = 0; | ||
657 | } | ||
658 | + put_device(tty_dev); | ||
659 | mutex_unlock(&port->mutex); | ||
660 | return 0; | ||
661 | } | ||
662 | + put_device(tty_dev); | ||
663 | uport->suspended = 0; | ||
664 | |||
665 | /* | ||
666 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c | ||
667 | index bf9f987..b28d635 100644 | ||
668 | --- a/drivers/tty/tty_io.c | ||
669 | +++ b/drivers/tty/tty_io.c | ||
670 | @@ -938,10 +938,10 @@ void start_tty(struct tty_struct *tty) | ||
671 | |||
672 | EXPORT_SYMBOL(start_tty); | ||
673 | |||
674 | +/* We limit tty time update visibility to every 8 seconds or so. */ | ||
675 | static void tty_update_time(struct timespec *time) | ||
676 | { | ||
677 | - unsigned long sec = get_seconds(); | ||
678 | - sec -= sec % 60; | ||
679 | + unsigned long sec = get_seconds() & ~7; | ||
680 | if ((long)(sec - time->tv_sec) > 0) | ||
681 | time->tv_sec = sec; | ||
682 | } | ||
683 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
684 | index 404413b..336b82d 100644 | ||
685 | --- a/drivers/usb/core/devio.c | ||
686 | +++ b/drivers/usb/core/devio.c | ||
687 | @@ -681,6 +681,8 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, | ||
688 | index &= 0xff; | ||
689 | switch (requesttype & USB_RECIP_MASK) { | ||
690 | case USB_RECIP_ENDPOINT: | ||
691 | + if ((index & ~USB_DIR_IN) == 0) | ||
692 | + return 0; | ||
693 | ret = findintfep(ps->dev, index); | ||
694 | if (ret >= 0) | ||
695 | ret = checkintf(ps, ret); | ||
696 | diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c | ||
697 | index ac0d75a..9f7003e 100644 | ||
698 | --- a/drivers/usb/misc/appledisplay.c | ||
699 | +++ b/drivers/usb/misc/appledisplay.c | ||
700 | @@ -63,6 +63,7 @@ static const struct usb_device_id appledisplay_table[] = { | ||
701 | { APPLEDISPLAY_DEVICE(0x9219) }, | ||
702 | { APPLEDISPLAY_DEVICE(0x921c) }, | ||
703 | { APPLEDISPLAY_DEVICE(0x921d) }, | ||
704 | + { APPLEDISPLAY_DEVICE(0x9236) }, | ||
705 | |||
706 | /* Terminating entry */ | ||
707 | { } | ||
708 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
709 | index 07a4fb0..e5ccafc 100644 | ||
710 | --- a/drivers/usb/serial/ftdi_sio.c | ||
711 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
712 | @@ -197,6 +197,7 @@ static struct usb_device_id id_table_combined [] = { | ||
713 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) }, | ||
714 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) }, | ||
715 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) }, | ||
716 | + { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) }, | ||
717 | { USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) }, | ||
718 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | ||
719 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | ||
720 | @@ -878,7 +879,9 @@ static struct usb_device_id id_table_combined [] = { | ||
721 | { USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) }, | ||
722 | { USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID), | ||
723 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
724 | - { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), | ||
725 | + { USB_DEVICE(ST_VID, ST_STMCLT_2232_PID), | ||
726 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
727 | + { USB_DEVICE(ST_VID, ST_STMCLT_4232_PID), | ||
728 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, | ||
729 | { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, | ||
730 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
731 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
732 | index e79861e..9852827 100644 | ||
733 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
734 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
735 | @@ -74,6 +74,7 @@ | ||
736 | #define FTDI_OPENDCC_THROTTLE_PID 0xBFDA | ||
737 | #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB | ||
738 | #define FTDI_OPENDCC_GBM_PID 0xBFDC | ||
739 | +#define FTDI_OPENDCC_GBM_BOOST_PID 0xBFDD | ||
740 | |||
741 | /* NZR SEM 16+ USB (http://www.nzr.de) */ | ||
742 | #define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ | ||
743 | @@ -1150,7 +1151,8 @@ | ||
744 | * STMicroelectonics | ||
745 | */ | ||
746 | #define ST_VID 0x0483 | ||
747 | -#define ST_STMCLT1030_PID 0x3747 /* ST Micro Connect Lite STMCLT1030 */ | ||
748 | +#define ST_STMCLT_2232_PID 0x3746 | ||
749 | +#define ST_STMCLT_4232_PID 0x3747 | ||
750 | |||
751 | /* | ||
752 | * Papouch products (http://www.papouch.com/) | ||
753 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
754 | index 78c4774..16efe0a 100644 | ||
755 | --- a/drivers/usb/serial/option.c | ||
756 | +++ b/drivers/usb/serial/option.c | ||
757 | @@ -347,6 +347,7 @@ static void option_instat_callback(struct urb *urb); | ||
758 | /* Olivetti products */ | ||
759 | #define OLIVETTI_VENDOR_ID 0x0b3c | ||
760 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 | ||
761 | +#define OLIVETTI_PRODUCT_OLICARD145 0xc003 | ||
762 | |||
763 | /* Celot products */ | ||
764 | #define CELOT_VENDOR_ID 0x211f | ||
765 | @@ -1273,6 +1274,7 @@ static const struct usb_device_id option_ids[] = { | ||
766 | { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, | ||
767 | |||
768 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, | ||
769 | + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD145) }, | ||
770 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | ||
771 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ | ||
772 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | ||
773 | @@ -1350,6 +1352,12 @@ static const struct usb_device_id option_ids[] = { | ||
774 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), | ||
775 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
776 | { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, | ||
777 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x02, 0x01) }, /* D-Link DWM-156 (variant) */ | ||
778 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d01, 0xff, 0x00, 0x00) }, /* D-Link DWM-156 (variant) */ | ||
779 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x02, 0x01) }, | ||
780 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) }, | ||
781 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) }, | ||
782 | + { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) }, | ||
783 | { } /* Terminating entry */ | ||
784 | }; | ||
785 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
786 | diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c | ||
787 | index 5fe451d..c1f6751 100644 | ||
788 | --- a/drivers/usb/storage/cypress_atacb.c | ||
789 | +++ b/drivers/usb/storage/cypress_atacb.c | ||
790 | @@ -248,14 +248,26 @@ static int cypress_probe(struct usb_interface *intf, | ||
791 | { | ||
792 | struct us_data *us; | ||
793 | int result; | ||
794 | + struct usb_device *device; | ||
795 | |||
796 | result = usb_stor_probe1(&us, intf, id, | ||
797 | (id - cypress_usb_ids) + cypress_unusual_dev_list); | ||
798 | if (result) | ||
799 | return result; | ||
800 | |||
801 | - us->protocol_name = "Transparent SCSI with Cypress ATACB"; | ||
802 | - us->proto_handler = cypress_atacb_passthrough; | ||
803 | + /* Among CY7C68300 chips, the A revision does not support Cypress ATACB | ||
804 | + * Filter out this revision from EEPROM default descriptor values | ||
805 | + */ | ||
806 | + device = interface_to_usbdev(intf); | ||
807 | + if (device->descriptor.iManufacturer != 0x38 || | ||
808 | + device->descriptor.iProduct != 0x4e || | ||
809 | + device->descriptor.iSerialNumber != 0x64) { | ||
810 | + us->protocol_name = "Transparent SCSI with Cypress ATACB"; | ||
811 | + us->proto_handler = cypress_atacb_passthrough; | ||
812 | + } else { | ||
813 | + us->protocol_name = "Transparent SCSI"; | ||
814 | + us->proto_handler = usb_stor_transparent_scsi_command; | ||
815 | + } | ||
816 | |||
817 | result = usb_stor_probe2(us); | ||
818 | return result; | ||
819 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c | ||
820 | index 18ded2d..a01317c 100644 | ||
821 | --- a/drivers/video/console/fbcon.c | ||
822 | +++ b/drivers/video/console/fbcon.c | ||
823 | @@ -1228,6 +1228,8 @@ static void fbcon_deinit(struct vc_data *vc) | ||
824 | finished: | ||
825 | |||
826 | fbcon_free_font(p, free_font); | ||
827 | + if (free_font) | ||
828 | + vc->vc_font.data = NULL; | ||
829 | |||
830 | if (!con_is_bound(&fb_con)) | ||
831 | fbcon_exit(); | ||
832 | diff --git a/fs/dcache.c b/fs/dcache.c | ||
833 | index f104945..e498de2 100644 | ||
834 | --- a/fs/dcache.c | ||
835 | +++ b/fs/dcache.c | ||
836 | @@ -1238,8 +1238,10 @@ void shrink_dcache_parent(struct dentry * parent) | ||
837 | LIST_HEAD(dispose); | ||
838 | int found; | ||
839 | |||
840 | - while ((found = select_parent(parent, &dispose)) != 0) | ||
841 | + while ((found = select_parent(parent, &dispose)) != 0) { | ||
842 | shrink_dentry_list(&dispose); | ||
843 | + cond_resched(); | ||
844 | + } | ||
845 | } | ||
846 | EXPORT_SYMBOL(shrink_dcache_parent); | ||
847 | |||
848 | diff --git a/fs/exec.c b/fs/exec.c | ||
849 | index e3a7e36d..2b7f5ff 100644 | ||
850 | --- a/fs/exec.c | ||
851 | +++ b/fs/exec.c | ||
852 | @@ -627,7 +627,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | ||
853 | * when the old and new regions overlap clear from new_end. | ||
854 | */ | ||
855 | free_pgd_range(&tlb, new_end, old_end, new_end, | ||
856 | - vma->vm_next ? vma->vm_next->vm_start : 0); | ||
857 | + vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); | ||
858 | } else { | ||
859 | /* | ||
860 | * otherwise, clean from old_start; this is done to not touch | ||
861 | @@ -636,7 +636,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, unsigned long shift) | ||
862 | * for the others its just a little faster. | ||
863 | */ | ||
864 | free_pgd_range(&tlb, old_start, old_end, new_end, | ||
865 | - vma->vm_next ? vma->vm_next->vm_start : 0); | ||
866 | + vma->vm_next ? vma->vm_next->vm_start : USER_PGTABLES_CEILING); | ||
867 | } | ||
868 | tlb_finish_mmu(&tlb, new_end, old_end); | ||
869 | |||
870 | diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig | ||
871 | index 9ed1bb1..5459168 100644 | ||
872 | --- a/fs/ext4/Kconfig | ||
873 | +++ b/fs/ext4/Kconfig | ||
874 | @@ -82,4 +82,5 @@ config EXT4_DEBUG | ||
875 | Enables run-time debugging support for the ext4 filesystem. | ||
876 | |||
877 | If you select Y here, then you will be able to turn on debugging | ||
878 | - with a command such as "echo 1 > /sys/kernel/debug/ext4/mballoc-debug" | ||
879 | + with a command such as: | ||
880 | + echo 1 > /sys/module/ext4/parameters/mballoc_debug | ||
881 | diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h | ||
882 | index 83b20fc..6b23a96 100644 | ||
883 | --- a/fs/ext4/ext4_jbd2.h | ||
884 | +++ b/fs/ext4/ext4_jbd2.h | ||
885 | @@ -164,16 +164,20 @@ static inline void ext4_journal_callback_add(handle_t *handle, | ||
886 | * ext4_journal_callback_del: delete a registered callback | ||
887 | * @handle: active journal transaction handle on which callback was registered | ||
888 | * @jce: registered journal callback entry to unregister | ||
889 | + * Return true if object was sucessfully removed | ||
890 | */ | ||
891 | -static inline void ext4_journal_callback_del(handle_t *handle, | ||
892 | +static inline bool ext4_journal_callback_try_del(handle_t *handle, | ||
893 | struct ext4_journal_cb_entry *jce) | ||
894 | { | ||
895 | + bool deleted; | ||
896 | struct ext4_sb_info *sbi = | ||
897 | EXT4_SB(handle->h_transaction->t_journal->j_private); | ||
898 | |||
899 | spin_lock(&sbi->s_md_lock); | ||
900 | + deleted = !list_empty(&jce->jce_list); | ||
901 | list_del_init(&jce->jce_list); | ||
902 | spin_unlock(&sbi->s_md_lock); | ||
903 | + return deleted; | ||
904 | } | ||
905 | |||
906 | int | ||
907 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c | ||
908 | index 6c32dd8..ec970cb 100644 | ||
909 | --- a/fs/ext4/mballoc.c | ||
910 | +++ b/fs/ext4/mballoc.c | ||
911 | @@ -4436,11 +4436,11 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, | ||
912 | node = rb_prev(new_node); | ||
913 | if (node) { | ||
914 | entry = rb_entry(node, struct ext4_free_data, efd_node); | ||
915 | - if (can_merge(entry, new_entry)) { | ||
916 | + if (can_merge(entry, new_entry) && | ||
917 | + ext4_journal_callback_try_del(handle, &entry->efd_jce)) { | ||
918 | new_entry->efd_start_cluster = entry->efd_start_cluster; | ||
919 | new_entry->efd_count += entry->efd_count; | ||
920 | rb_erase(node, &(db->bb_free_root)); | ||
921 | - ext4_journal_callback_del(handle, &entry->efd_jce); | ||
922 | kmem_cache_free(ext4_free_data_cachep, entry); | ||
923 | } | ||
924 | } | ||
925 | @@ -4448,10 +4448,10 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, | ||
926 | node = rb_next(new_node); | ||
927 | if (node) { | ||
928 | entry = rb_entry(node, struct ext4_free_data, efd_node); | ||
929 | - if (can_merge(new_entry, entry)) { | ||
930 | + if (can_merge(new_entry, entry) && | ||
931 | + ext4_journal_callback_try_del(handle, &entry->efd_jce)) { | ||
932 | new_entry->efd_count += entry->efd_count; | ||
933 | rb_erase(node, &(db->bb_free_root)); | ||
934 | - ext4_journal_callback_del(handle, &entry->efd_jce); | ||
935 | kmem_cache_free(ext4_free_data_cachep, entry); | ||
936 | } | ||
937 | } | ||
938 | diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c | ||
939 | index 3fc0e8b..9202b22 100644 | ||
940 | --- a/fs/ext4/resize.c | ||
941 | +++ b/fs/ext4/resize.c | ||
942 | @@ -1202,6 +1202,8 @@ static void ext4_update_super(struct super_block *sb, | ||
943 | |||
944 | /* Update the global fs size fields */ | ||
945 | sbi->s_groups_count += flex_gd->count; | ||
946 | + sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count, | ||
947 | + (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); | ||
948 | |||
949 | /* Update the reserved block counts only once the new group is | ||
950 | * active. */ | ||
951 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
952 | index 88bb68d..b93de81 100644 | ||
953 | --- a/fs/ext4/super.c | ||
954 | +++ b/fs/ext4/super.c | ||
955 | @@ -437,10 +437,13 @@ static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn) | ||
956 | struct super_block *sb = journal->j_private; | ||
957 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
958 | int error = is_journal_aborted(journal); | ||
959 | - struct ext4_journal_cb_entry *jce, *tmp; | ||
960 | + struct ext4_journal_cb_entry *jce; | ||
961 | |||
962 | + BUG_ON(txn->t_state == T_FINISHED); | ||
963 | spin_lock(&sbi->s_md_lock); | ||
964 | - list_for_each_entry_safe(jce, tmp, &txn->t_private_list, jce_list) { | ||
965 | + while (!list_empty(&txn->t_private_list)) { | ||
966 | + jce = list_entry(txn->t_private_list.next, | ||
967 | + struct ext4_journal_cb_entry, jce_list); | ||
968 | list_del_init(&jce->jce_list); | ||
969 | spin_unlock(&sbi->s_md_lock); | ||
970 | jce->jce_func(sb, jce, error); | ||
971 | diff --git a/fs/fscache/stats.c b/fs/fscache/stats.c | ||
972 | index 4765190..73c0bd7 100644 | ||
973 | --- a/fs/fscache/stats.c | ||
974 | +++ b/fs/fscache/stats.c | ||
975 | @@ -276,5 +276,5 @@ const struct file_operations fscache_stats_fops = { | ||
976 | .open = fscache_stats_open, | ||
977 | .read = seq_read, | ||
978 | .llseek = seq_lseek, | ||
979 | - .release = seq_release, | ||
980 | + .release = single_release, | ||
981 | }; | ||
982 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c | ||
983 | index 840f70f..a0dcbd62 100644 | ||
984 | --- a/fs/jbd2/commit.c | ||
985 | +++ b/fs/jbd2/commit.c | ||
986 | @@ -325,7 +325,7 @@ void jbd2_journal_commit_transaction(journal_t *journal) | ||
987 | int space_left = 0; | ||
988 | int first_tag = 0; | ||
989 | int tag_flag; | ||
990 | - int i, to_free = 0; | ||
991 | + int i; | ||
992 | int tag_bytes = journal_tag_bytes(journal); | ||
993 | struct buffer_head *cbh = NULL; /* For transactional checksums */ | ||
994 | __u32 crc32_sum = ~0; | ||
995 | @@ -1044,7 +1044,7 @@ restart_loop: | ||
996 | journal->j_stats.run.rs_blocks_logged += stats.run.rs_blocks_logged; | ||
997 | spin_unlock(&journal->j_history_lock); | ||
998 | |||
999 | - commit_transaction->t_state = T_FINISHED; | ||
1000 | + commit_transaction->t_state = T_COMMIT_CALLBACK; | ||
1001 | J_ASSERT(commit_transaction == journal->j_committing_transaction); | ||
1002 | journal->j_commit_sequence = commit_transaction->t_tid; | ||
1003 | journal->j_committing_transaction = NULL; | ||
1004 | @@ -1059,38 +1059,44 @@ restart_loop: | ||
1005 | journal->j_average_commit_time*3) / 4; | ||
1006 | else | ||
1007 | journal->j_average_commit_time = commit_time; | ||
1008 | + | ||
1009 | write_unlock(&journal->j_state_lock); | ||
1010 | |||
1011 | - if (commit_transaction->t_checkpoint_list == NULL && | ||
1012 | - commit_transaction->t_checkpoint_io_list == NULL) { | ||
1013 | - __jbd2_journal_drop_transaction(journal, commit_transaction); | ||
1014 | - to_free = 1; | ||
1015 | + if (journal->j_checkpoint_transactions == NULL) { | ||
1016 | + journal->j_checkpoint_transactions = commit_transaction; | ||
1017 | + commit_transaction->t_cpnext = commit_transaction; | ||
1018 | + commit_transaction->t_cpprev = commit_transaction; | ||
1019 | } else { | ||
1020 | - if (journal->j_checkpoint_transactions == NULL) { | ||
1021 | - journal->j_checkpoint_transactions = commit_transaction; | ||
1022 | - commit_transaction->t_cpnext = commit_transaction; | ||
1023 | - commit_transaction->t_cpprev = commit_transaction; | ||
1024 | - } else { | ||
1025 | - commit_transaction->t_cpnext = | ||
1026 | - journal->j_checkpoint_transactions; | ||
1027 | - commit_transaction->t_cpprev = | ||
1028 | - commit_transaction->t_cpnext->t_cpprev; | ||
1029 | - commit_transaction->t_cpnext->t_cpprev = | ||
1030 | - commit_transaction; | ||
1031 | - commit_transaction->t_cpprev->t_cpnext = | ||
1032 | + commit_transaction->t_cpnext = | ||
1033 | + journal->j_checkpoint_transactions; | ||
1034 | + commit_transaction->t_cpprev = | ||
1035 | + commit_transaction->t_cpnext->t_cpprev; | ||
1036 | + commit_transaction->t_cpnext->t_cpprev = | ||
1037 | + commit_transaction; | ||
1038 | + commit_transaction->t_cpprev->t_cpnext = | ||
1039 | commit_transaction; | ||
1040 | - } | ||
1041 | } | ||
1042 | spin_unlock(&journal->j_list_lock); | ||
1043 | - | ||
1044 | + /* Drop all spin_locks because commit_callback may be block. | ||
1045 | + * __journal_remove_checkpoint() can not destroy transaction | ||
1046 | + * under us because it is not marked as T_FINISHED yet */ | ||
1047 | if (journal->j_commit_callback) | ||
1048 | journal->j_commit_callback(journal, commit_transaction); | ||
1049 | |||
1050 | trace_jbd2_end_commit(journal, commit_transaction); | ||
1051 | jbd_debug(1, "JBD2: commit %d complete, head %d\n", | ||
1052 | journal->j_commit_sequence, journal->j_tail_sequence); | ||
1053 | - if (to_free) | ||
1054 | - jbd2_journal_free_transaction(commit_transaction); | ||
1055 | |||
1056 | + write_lock(&journal->j_state_lock); | ||
1057 | + spin_lock(&journal->j_list_lock); | ||
1058 | + commit_transaction->t_state = T_FINISHED; | ||
1059 | + /* Recheck checkpoint lists after j_list_lock was dropped */ | ||
1060 | + if (commit_transaction->t_checkpoint_list == NULL && | ||
1061 | + commit_transaction->t_checkpoint_io_list == NULL) { | ||
1062 | + __jbd2_journal_drop_transaction(journal, commit_transaction); | ||
1063 | + jbd2_journal_free_transaction(commit_transaction); | ||
1064 | + } | ||
1065 | + spin_unlock(&journal->j_list_lock); | ||
1066 | + write_unlock(&journal->j_state_lock); | ||
1067 | wake_up(&journal->j_wait_done_commit); | ||
1068 | } | ||
1069 | diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c | ||
1070 | index ca0a080..193f04c 100644 | ||
1071 | --- a/fs/lockd/clntlock.c | ||
1072 | +++ b/fs/lockd/clntlock.c | ||
1073 | @@ -144,6 +144,9 @@ int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout) | ||
1074 | timeout); | ||
1075 | if (ret < 0) | ||
1076 | return -ERESTARTSYS; | ||
1077 | + /* Reset the lock status after a server reboot so we resend */ | ||
1078 | + if (block->b_status == nlm_lck_denied_grace_period) | ||
1079 | + block->b_status = nlm_lck_blocked; | ||
1080 | req->a_res.status = block->b_status; | ||
1081 | return 0; | ||
1082 | } | ||
1083 | diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c | ||
1084 | index a3a0987..8392cb8 100644 | ||
1085 | --- a/fs/lockd/clntproc.c | ||
1086 | +++ b/fs/lockd/clntproc.c | ||
1087 | @@ -551,9 +551,6 @@ again: | ||
1088 | status = nlmclnt_block(block, req, NLMCLNT_POLL_TIMEOUT); | ||
1089 | if (status < 0) | ||
1090 | break; | ||
1091 | - /* Resend the blocking lock request after a server reboot */ | ||
1092 | - if (resp->status == nlm_lck_denied_grace_period) | ||
1093 | - continue; | ||
1094 | if (resp->status != nlm_lck_blocked) | ||
1095 | break; | ||
1096 | } | ||
1097 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
1098 | index 3035187..04f449c 100644 | ||
1099 | --- a/fs/nfs/nfs4proc.c | ||
1100 | +++ b/fs/nfs/nfs4proc.c | ||
1101 | @@ -1362,6 +1362,12 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | ||
1102 | case -ENOMEM: | ||
1103 | err = 0; | ||
1104 | goto out; | ||
1105 | + case -NFS4ERR_DELAY: | ||
1106 | + case -NFS4ERR_GRACE: | ||
1107 | + set_bit(NFS_DELEGATED_STATE, &state->flags); | ||
1108 | + ssleep(1); | ||
1109 | + err = -EAGAIN; | ||
1110 | + goto out; | ||
1111 | } | ||
1112 | err = nfs4_handle_exception(server, err, &exception); | ||
1113 | } while (exception.retry); | ||
1114 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c | ||
1115 | index abd785e..f90b197 100644 | ||
1116 | --- a/fs/nfsd/nfs4state.c | ||
1117 | +++ b/fs/nfsd/nfs4state.c | ||
1118 | @@ -213,13 +213,7 @@ static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag) | ||
1119 | { | ||
1120 | if (atomic_dec_and_test(&fp->fi_access[oflag])) { | ||
1121 | nfs4_file_put_fd(fp, oflag); | ||
1122 | - /* | ||
1123 | - * It's also safe to get rid of the RDWR open *if* | ||
1124 | - * we no longer have need of the other kind of access | ||
1125 | - * or if we already have the other kind of open: | ||
1126 | - */ | ||
1127 | - if (fp->fi_fds[1-oflag] | ||
1128 | - || atomic_read(&fp->fi_access[1 - oflag]) == 0) | ||
1129 | + if (atomic_read(&fp->fi_access[1 - oflag]) == 0) | ||
1130 | nfs4_file_put_fd(fp, O_RDWR); | ||
1131 | } | ||
1132 | } | ||
1133 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
1134 | index ace6745..1798846 100644 | ||
1135 | --- a/fs/nfsd/nfs4xdr.c | ||
1136 | +++ b/fs/nfsd/nfs4xdr.c | ||
1137 | @@ -343,10 +343,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | ||
1138 | all 32 bits of 'nseconds'. */ | ||
1139 | READ_BUF(12); | ||
1140 | len += 12; | ||
1141 | - READ32(dummy32); | ||
1142 | - if (dummy32) | ||
1143 | - return nfserr_inval; | ||
1144 | - READ32(iattr->ia_atime.tv_sec); | ||
1145 | + READ64(iattr->ia_atime.tv_sec); | ||
1146 | READ32(iattr->ia_atime.tv_nsec); | ||
1147 | if (iattr->ia_atime.tv_nsec >= (u32)1000000000) | ||
1148 | return nfserr_inval; | ||
1149 | @@ -369,10 +366,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, | ||
1150 | all 32 bits of 'nseconds'. */ | ||
1151 | READ_BUF(12); | ||
1152 | len += 12; | ||
1153 | - READ32(dummy32); | ||
1154 | - if (dummy32) | ||
1155 | - return nfserr_inval; | ||
1156 | - READ32(iattr->ia_mtime.tv_sec); | ||
1157 | + READ64(iattr->ia_mtime.tv_sec); | ||
1158 | READ32(iattr->ia_mtime.tv_nsec); | ||
1159 | if (iattr->ia_mtime.tv_nsec >= (u32)1000000000) | ||
1160 | return nfserr_inval; | ||
1161 | @@ -2371,8 +2365,7 @@ out_acl: | ||
1162 | if (bmval1 & FATTR4_WORD1_TIME_ACCESS) { | ||
1163 | if ((buflen -= 12) < 0) | ||
1164 | goto out_resource; | ||
1165 | - WRITE32(0); | ||
1166 | - WRITE32(stat.atime.tv_sec); | ||
1167 | + WRITE64((s64)stat.atime.tv_sec); | ||
1168 | WRITE32(stat.atime.tv_nsec); | ||
1169 | } | ||
1170 | if (bmval1 & FATTR4_WORD1_TIME_DELTA) { | ||
1171 | @@ -2385,15 +2378,13 @@ out_acl: | ||
1172 | if (bmval1 & FATTR4_WORD1_TIME_METADATA) { | ||
1173 | if ((buflen -= 12) < 0) | ||
1174 | goto out_resource; | ||
1175 | - WRITE32(0); | ||
1176 | - WRITE32(stat.ctime.tv_sec); | ||
1177 | + WRITE64((s64)stat.ctime.tv_sec); | ||
1178 | WRITE32(stat.ctime.tv_nsec); | ||
1179 | } | ||
1180 | if (bmval1 & FATTR4_WORD1_TIME_MODIFY) { | ||
1181 | if ((buflen -= 12) < 0) | ||
1182 | goto out_resource; | ||
1183 | - WRITE32(0); | ||
1184 | - WRITE32(stat.mtime.tv_sec); | ||
1185 | + WRITE64((s64)stat.mtime.tv_sec); | ||
1186 | WRITE32(stat.mtime.tv_nsec); | ||
1187 | } | ||
1188 | if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { | ||
1189 | diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c | ||
1190 | index 45024ef..9a5f07d 100644 | ||
1191 | --- a/fs/sysfs/dir.c | ||
1192 | +++ b/fs/sysfs/dir.c | ||
1193 | @@ -994,6 +994,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) | ||
1194 | enum kobj_ns_type type; | ||
1195 | const void *ns; | ||
1196 | ino_t ino; | ||
1197 | + loff_t off; | ||
1198 | |||
1199 | type = sysfs_ns_type(parent_sd); | ||
1200 | ns = sysfs_info(dentry->d_sb)->ns[type]; | ||
1201 | @@ -1016,6 +1017,7 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) | ||
1202 | return 0; | ||
1203 | } | ||
1204 | mutex_lock(&sysfs_mutex); | ||
1205 | + off = filp->f_pos; | ||
1206 | for (pos = sysfs_dir_pos(ns, parent_sd, filp->f_pos, pos); | ||
1207 | pos; | ||
1208 | pos = sysfs_dir_next_pos(ns, parent_sd, filp->f_pos, pos)) { | ||
1209 | @@ -1027,19 +1029,24 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) | ||
1210 | len = strlen(name); | ||
1211 | ino = pos->s_ino; | ||
1212 | type = dt_type(pos); | ||
1213 | - filp->f_pos = pos->s_hash; | ||
1214 | + off = filp->f_pos = pos->s_hash; | ||
1215 | filp->private_data = sysfs_get(pos); | ||
1216 | |||
1217 | mutex_unlock(&sysfs_mutex); | ||
1218 | - ret = filldir(dirent, name, len, filp->f_pos, ino, type); | ||
1219 | + ret = filldir(dirent, name, len, off, ino, type); | ||
1220 | mutex_lock(&sysfs_mutex); | ||
1221 | if (ret < 0) | ||
1222 | break; | ||
1223 | } | ||
1224 | mutex_unlock(&sysfs_mutex); | ||
1225 | - if ((filp->f_pos > 1) && !pos) { /* EOF */ | ||
1226 | - filp->f_pos = INT_MAX; | ||
1227 | + | ||
1228 | + /* don't reference last entry if its refcount is dropped */ | ||
1229 | + if (!pos) { | ||
1230 | filp->private_data = NULL; | ||
1231 | + | ||
1232 | + /* EOF and not changed as 0 or 1 in read/write path */ | ||
1233 | + if (off == filp->f_pos && off > 1) | ||
1234 | + filp->f_pos = INT_MAX; | ||
1235 | } | ||
1236 | return 0; | ||
1237 | } | ||
1238 | diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h | ||
1239 | index c7ec2cd..9a6eb25 100644 | ||
1240 | --- a/include/asm-generic/pgtable.h | ||
1241 | +++ b/include/asm-generic/pgtable.h | ||
1242 | @@ -7,6 +7,16 @@ | ||
1243 | #include <linux/mm_types.h> | ||
1244 | #include <linux/bug.h> | ||
1245 | |||
1246 | +/* | ||
1247 | + * On almost all architectures and configurations, 0 can be used as the | ||
1248 | + * upper ceiling to free_pgtables(): on many architectures it has the same | ||
1249 | + * effect as using TASK_SIZE. However, there is one configuration which | ||
1250 | + * must impose a more careful limit, to avoid freeing kernel pgtables. | ||
1251 | + */ | ||
1252 | +#ifndef USER_PGTABLES_CEILING | ||
1253 | +#define USER_PGTABLES_CEILING 0UL | ||
1254 | +#endif | ||
1255 | + | ||
1256 | #ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS | ||
1257 | extern int ptep_set_access_flags(struct vm_area_struct *vma, | ||
1258 | unsigned long address, pte_t *ptep, | ||
1259 | diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h | ||
1260 | index 8a297a5..497c6cc 100644 | ||
1261 | --- a/include/linux/ipc_namespace.h | ||
1262 | +++ b/include/linux/ipc_namespace.h | ||
1263 | @@ -42,8 +42,8 @@ struct ipc_namespace { | ||
1264 | |||
1265 | size_t shm_ctlmax; | ||
1266 | size_t shm_ctlall; | ||
1267 | + unsigned long shm_tot; | ||
1268 | int shm_ctlmni; | ||
1269 | - int shm_tot; | ||
1270 | /* | ||
1271 | * Defines whether IPC_RMID is forced for _all_ shm segments regardless | ||
1272 | * of shmctl() | ||
1273 | diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h | ||
1274 | index 2ed66ef..dd6444f 100644 | ||
1275 | --- a/include/linux/jbd2.h | ||
1276 | +++ b/include/linux/jbd2.h | ||
1277 | @@ -470,6 +470,7 @@ struct transaction_s | ||
1278 | T_COMMIT, | ||
1279 | T_COMMIT_DFLUSH, | ||
1280 | T_COMMIT_JFLUSH, | ||
1281 | + T_COMMIT_CALLBACK, | ||
1282 | T_FINISHED | ||
1283 | } t_state; | ||
1284 | |||
1285 | diff --git a/ipc/shm.c b/ipc/shm.c | ||
1286 | index 406c5b2..85d81b4 100644 | ||
1287 | --- a/ipc/shm.c | ||
1288 | +++ b/ipc/shm.c | ||
1289 | @@ -450,7 +450,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params) | ||
1290 | size_t size = params->u.size; | ||
1291 | int error; | ||
1292 | struct shmid_kernel *shp; | ||
1293 | - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; | ||
1294 | + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
1295 | struct file * file; | ||
1296 | char name[13]; | ||
1297 | int id; | ||
1298 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
1299 | index a4c47d1b..4eb1ed3 100644 | ||
1300 | --- a/kernel/cgroup.c | ||
1301 | +++ b/kernel/cgroup.c | ||
1302 | @@ -2020,7 +2020,7 @@ static int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader) | ||
1303 | if (!group) | ||
1304 | return -ENOMEM; | ||
1305 | /* pre-allocate to guarantee space while iterating in rcu read-side. */ | ||
1306 | - retval = flex_array_prealloc(group, 0, group_size - 1, GFP_KERNEL); | ||
1307 | + retval = flex_array_prealloc(group, 0, group_size, GFP_KERNEL); | ||
1308 | if (retval) | ||
1309 | goto out_free_group_list; | ||
1310 | |||
1311 | diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c | ||
1312 | index e4cee8d..60f7e32 100644 | ||
1313 | --- a/kernel/hrtimer.c | ||
1314 | +++ b/kernel/hrtimer.c | ||
1315 | @@ -298,6 +298,10 @@ ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec) | ||
1316 | } else { | ||
1317 | unsigned long rem = do_div(nsec, NSEC_PER_SEC); | ||
1318 | |||
1319 | + /* Make sure nsec fits into long */ | ||
1320 | + if (unlikely(nsec > KTIME_SEC_MAX)) | ||
1321 | + return (ktime_t){ .tv64 = KTIME_MAX }; | ||
1322 | + | ||
1323 | tmp = ktime_set((long)nsec, rem); | ||
1324 | } | ||
1325 | |||
1326 | @@ -1308,6 +1312,8 @@ retry: | ||
1327 | |||
1328 | expires = ktime_sub(hrtimer_get_expires(timer), | ||
1329 | base->offset); | ||
1330 | + if (expires.tv64 < 0) | ||
1331 | + expires.tv64 = KTIME_MAX; | ||
1332 | if (expires.tv64 < expires_next.tv64) | ||
1333 | expires_next = expires; | ||
1334 | break; | ||
1335 | diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c | ||
1336 | index a13987a..239a323 100644 | ||
1337 | --- a/kernel/time/tick-broadcast.c | ||
1338 | +++ b/kernel/time/tick-broadcast.c | ||
1339 | @@ -66,6 +66,8 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc) | ||
1340 | */ | ||
1341 | int tick_check_broadcast_device(struct clock_event_device *dev) | ||
1342 | { | ||
1343 | + struct clock_event_device *cur = tick_broadcast_device.evtdev; | ||
1344 | + | ||
1345 | if ((dev->features & CLOCK_EVT_FEAT_DUMMY) || | ||
1346 | (tick_broadcast_device.evtdev && | ||
1347 | tick_broadcast_device.evtdev->rating >= dev->rating) || | ||
1348 | @@ -73,6 +75,8 @@ int tick_check_broadcast_device(struct clock_event_device *dev) | ||
1349 | return 0; | ||
1350 | |||
1351 | clockevents_exchange_device(tick_broadcast_device.evtdev, dev); | ||
1352 | + if (cur) | ||
1353 | + cur->event_handler = clockevents_handle_noop; | ||
1354 | tick_broadcast_device.evtdev = dev; | ||
1355 | if (!cpumask_empty(tick_get_broadcast_mask())) | ||
1356 | tick_broadcast_start_periodic(dev); | ||
1357 | diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c | ||
1358 | index da6c9ec..ead79bc 100644 | ||
1359 | --- a/kernel/time/tick-common.c | ||
1360 | +++ b/kernel/time/tick-common.c | ||
1361 | @@ -323,6 +323,7 @@ static void tick_shutdown(unsigned int *cpup) | ||
1362 | */ | ||
1363 | dev->mode = CLOCK_EVT_MODE_UNUSED; | ||
1364 | clockevents_exchange_device(dev, NULL); | ||
1365 | + dev->event_handler = clockevents_handle_noop; | ||
1366 | td->evtdev = NULL; | ||
1367 | } | ||
1368 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); | ||
1369 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
1370 | index a3c1dd9..c962d31 100644 | ||
1371 | --- a/kernel/trace/ftrace.c | ||
1372 | +++ b/kernel/trace/ftrace.c | ||
1373 | @@ -624,7 +624,7 @@ int ftrace_profile_pages_init(struct ftrace_profile_stat *stat) | ||
1374 | |||
1375 | pages = DIV_ROUND_UP(functions, PROFILES_PER_PAGE); | ||
1376 | |||
1377 | - for (i = 0; i < pages; i++) { | ||
1378 | + for (i = 1; i < pages; i++) { | ||
1379 | pg->next = (void *)get_zeroed_page(GFP_KERNEL); | ||
1380 | if (!pg->next) | ||
1381 | goto out_free; | ||
1382 | @@ -3611,7 +3611,8 @@ out: | ||
1383 | if (fail) | ||
1384 | return -EINVAL; | ||
1385 | |||
1386 | - ftrace_graph_filter_enabled = 1; | ||
1387 | + ftrace_graph_filter_enabled = !!(*idx); | ||
1388 | + | ||
1389 | return 0; | ||
1390 | } | ||
1391 | |||
1392 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
1393 | index 8beda39..b29ebd3 100644 | ||
1394 | --- a/kernel/trace/trace.c | ||
1395 | +++ b/kernel/trace/trace.c | ||
1396 | @@ -4717,6 +4717,8 @@ static __init int tracer_init_debugfs(void) | ||
1397 | trace_access_lock_init(); | ||
1398 | |||
1399 | d_tracer = tracing_init_dentry(); | ||
1400 | + if (!d_tracer) | ||
1401 | + return 0; | ||
1402 | |||
1403 | trace_create_file("tracing_enabled", 0644, d_tracer, | ||
1404 | &global_trace, &tracing_ctrl_fops); | ||
1405 | diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c | ||
1406 | index d4545f4..c70f6bf 100644 | ||
1407 | --- a/kernel/trace/trace_stack.c | ||
1408 | +++ b/kernel/trace/trace_stack.c | ||
1409 | @@ -20,13 +20,24 @@ | ||
1410 | |||
1411 | #define STACK_TRACE_ENTRIES 500 | ||
1412 | |||
1413 | +#ifdef CC_USING_FENTRY | ||
1414 | +# define fentry 1 | ||
1415 | +#else | ||
1416 | +# define fentry 0 | ||
1417 | +#endif | ||
1418 | + | ||
1419 | static unsigned long stack_dump_trace[STACK_TRACE_ENTRIES+1] = | ||
1420 | { [0 ... (STACK_TRACE_ENTRIES)] = ULONG_MAX }; | ||
1421 | static unsigned stack_dump_index[STACK_TRACE_ENTRIES]; | ||
1422 | |||
1423 | +/* | ||
1424 | + * Reserve one entry for the passed in ip. This will allow | ||
1425 | + * us to remove most or all of the stack size overhead | ||
1426 | + * added by the stack tracer itself. | ||
1427 | + */ | ||
1428 | static struct stack_trace max_stack_trace = { | ||
1429 | - .max_entries = STACK_TRACE_ENTRIES, | ||
1430 | - .entries = stack_dump_trace, | ||
1431 | + .max_entries = STACK_TRACE_ENTRIES - 1, | ||
1432 | + .entries = &stack_dump_trace[1], | ||
1433 | }; | ||
1434 | |||
1435 | static unsigned long max_stack_size; | ||
1436 | @@ -40,25 +51,34 @@ static DEFINE_MUTEX(stack_sysctl_mutex); | ||
1437 | int stack_tracer_enabled; | ||
1438 | static int last_stack_tracer_enabled; | ||
1439 | |||
1440 | -static inline void check_stack(void) | ||
1441 | +static inline void | ||
1442 | +check_stack(unsigned long ip, unsigned long *stack) | ||
1443 | { | ||
1444 | unsigned long this_size, flags; | ||
1445 | unsigned long *p, *top, *start; | ||
1446 | + static int tracer_frame; | ||
1447 | + int frame_size = ACCESS_ONCE(tracer_frame); | ||
1448 | int i; | ||
1449 | |||
1450 | - this_size = ((unsigned long)&this_size) & (THREAD_SIZE-1); | ||
1451 | + this_size = ((unsigned long)stack) & (THREAD_SIZE-1); | ||
1452 | this_size = THREAD_SIZE - this_size; | ||
1453 | + /* Remove the frame of the tracer */ | ||
1454 | + this_size -= frame_size; | ||
1455 | |||
1456 | if (this_size <= max_stack_size) | ||
1457 | return; | ||
1458 | |||
1459 | /* we do not handle interrupt stacks yet */ | ||
1460 | - if (!object_is_on_stack(&this_size)) | ||
1461 | + if (!object_is_on_stack(stack)) | ||
1462 | return; | ||
1463 | |||
1464 | local_irq_save(flags); | ||
1465 | arch_spin_lock(&max_stack_lock); | ||
1466 | |||
1467 | + /* In case another CPU set the tracer_frame on us */ | ||
1468 | + if (unlikely(!frame_size)) | ||
1469 | + this_size -= tracer_frame; | ||
1470 | + | ||
1471 | /* a race could have already updated it */ | ||
1472 | if (this_size <= max_stack_size) | ||
1473 | goto out; | ||
1474 | @@ -71,10 +91,18 @@ static inline void check_stack(void) | ||
1475 | save_stack_trace(&max_stack_trace); | ||
1476 | |||
1477 | /* | ||
1478 | + * Add the passed in ip from the function tracer. | ||
1479 | + * Searching for this on the stack will skip over | ||
1480 | + * most of the overhead from the stack tracer itself. | ||
1481 | + */ | ||
1482 | + stack_dump_trace[0] = ip; | ||
1483 | + max_stack_trace.nr_entries++; | ||
1484 | + | ||
1485 | + /* | ||
1486 | * Now find where in the stack these are. | ||
1487 | */ | ||
1488 | i = 0; | ||
1489 | - start = &this_size; | ||
1490 | + start = stack; | ||
1491 | top = (unsigned long *) | ||
1492 | (((unsigned long)start & ~(THREAD_SIZE-1)) + THREAD_SIZE); | ||
1493 | |||
1494 | @@ -98,6 +126,18 @@ static inline void check_stack(void) | ||
1495 | found = 1; | ||
1496 | /* Start the search from here */ | ||
1497 | start = p + 1; | ||
1498 | + /* | ||
1499 | + * We do not want to show the overhead | ||
1500 | + * of the stack tracer stack in the | ||
1501 | + * max stack. If we haven't figured | ||
1502 | + * out what that is, then figure it out | ||
1503 | + * now. | ||
1504 | + */ | ||
1505 | + if (unlikely(!tracer_frame) && i == 1) { | ||
1506 | + tracer_frame = (p - stack) * | ||
1507 | + sizeof(unsigned long); | ||
1508 | + max_stack_size -= tracer_frame; | ||
1509 | + } | ||
1510 | } | ||
1511 | } | ||
1512 | |||
1513 | @@ -113,6 +153,7 @@ static inline void check_stack(void) | ||
1514 | static void | ||
1515 | stack_trace_call(unsigned long ip, unsigned long parent_ip) | ||
1516 | { | ||
1517 | + unsigned long stack; | ||
1518 | int cpu; | ||
1519 | |||
1520 | if (unlikely(!ftrace_enabled || stack_trace_disabled)) | ||
1521 | @@ -125,7 +166,26 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip) | ||
1522 | if (per_cpu(trace_active, cpu)++ != 0) | ||
1523 | goto out; | ||
1524 | |||
1525 | - check_stack(); | ||
1526 | + /* | ||
1527 | + * When fentry is used, the traced function does not get | ||
1528 | + * its stack frame set up, and we lose the parent. | ||
1529 | + * The ip is pretty useless because the function tracer | ||
1530 | + * was called before that function set up its stack frame. | ||
1531 | + * In this case, we use the parent ip. | ||
1532 | + * | ||
1533 | + * By adding the return address of either the parent ip | ||
1534 | + * or the current ip we can disregard most of the stack usage | ||
1535 | + * caused by the stack tracer itself. | ||
1536 | + * | ||
1537 | + * The function tracer always reports the address of where the | ||
1538 | + * mcount call was, but the stack will hold the return address. | ||
1539 | + */ | ||
1540 | + if (fentry) | ||
1541 | + ip = parent_ip; | ||
1542 | + else | ||
1543 | + ip += MCOUNT_INSN_SIZE; | ||
1544 | + | ||
1545 | + check_stack(ip, &stack); | ||
1546 | |||
1547 | out: | ||
1548 | per_cpu(trace_active, cpu)--; | ||
1549 | @@ -373,6 +433,8 @@ static __init int stack_trace_init(void) | ||
1550 | struct dentry *d_tracer; | ||
1551 | |||
1552 | d_tracer = tracing_init_dentry(); | ||
1553 | + if (!d_tracer) | ||
1554 | + return 0; | ||
1555 | |||
1556 | trace_create_file("stack_max_size", 0644, d_tracer, | ||
1557 | &max_stack_size, &stack_max_size_fops); | ||
1558 | diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c | ||
1559 | index 96cffb2..847f88a 100644 | ||
1560 | --- a/kernel/trace/trace_stat.c | ||
1561 | +++ b/kernel/trace/trace_stat.c | ||
1562 | @@ -307,6 +307,8 @@ static int tracing_stat_init(void) | ||
1563 | struct dentry *d_tracing; | ||
1564 | |||
1565 | d_tracing = tracing_init_dentry(); | ||
1566 | + if (!d_tracing) | ||
1567 | + return 0; | ||
1568 | |||
1569 | stat_dir = debugfs_create_dir("trace_stat", d_tracing); | ||
1570 | if (!stat_dir) | ||
1571 | diff --git a/mm/mmap.c b/mm/mmap.c | ||
1572 | index 2add0a1..3635d47 100644 | ||
1573 | --- a/mm/mmap.c | ||
1574 | +++ b/mm/mmap.c | ||
1575 | @@ -1920,7 +1920,7 @@ static void unmap_region(struct mm_struct *mm, | ||
1576 | unmap_vmas(&tlb, vma, start, end, &nr_accounted, NULL); | ||
1577 | vm_unacct_memory(nr_accounted); | ||
1578 | free_pgtables(&tlb, vma, prev ? prev->vm_end : FIRST_USER_ADDRESS, | ||
1579 | - next ? next->vm_start : 0); | ||
1580 | + next ? next->vm_start : USER_PGTABLES_CEILING); | ||
1581 | tlb_finish_mmu(&tlb, start, end); | ||
1582 | } | ||
1583 | |||
1584 | @@ -2308,7 +2308,7 @@ void exit_mmap(struct mm_struct *mm) | ||
1585 | unmap_vmas(&tlb, vma, 0, -1, &nr_accounted, NULL); | ||
1586 | vm_unacct_memory(nr_accounted); | ||
1587 | |||
1588 | - free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0); | ||
1589 | + free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, USER_PGTABLES_CEILING); | ||
1590 | tlb_finish_mmu(&tlb, 0, -1); | ||
1591 | |||
1592 | /* | ||
1593 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c | ||
1594 | index 4dc8347..796a0ee 100644 | ||
1595 | --- a/net/wireless/reg.c | ||
1596 | +++ b/net/wireless/reg.c | ||
1597 | @@ -862,7 +862,7 @@ static void handle_channel(struct wiphy *wiphy, | ||
1598 | return; | ||
1599 | |||
1600 | REG_DBG_PRINT("Disabling freq %d MHz\n", chan->center_freq); | ||
1601 | - chan->flags = IEEE80211_CHAN_DISABLED; | ||
1602 | + chan->flags |= IEEE80211_CHAN_DISABLED; | ||
1603 | return; | ||
1604 | } | ||
1605 | |||
1606 | diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c | ||
1607 | index af7324b..4790568 100644 | ||
1608 | --- a/sound/soc/codecs/max98088.c | ||
1609 | +++ b/sound/soc/codecs/max98088.c | ||
1610 | @@ -2006,7 +2006,7 @@ static int max98088_probe(struct snd_soc_codec *codec) | ||
1611 | ret); | ||
1612 | goto err_access; | ||
1613 | } | ||
1614 | - dev_info(codec->dev, "revision %c\n", ret + 'A'); | ||
1615 | + dev_info(codec->dev, "revision %c\n", ret - 0x40 + 'A'); | ||
1616 | |||
1617 | snd_soc_write(codec, M98088_REG_51_PWR_SYS, M98088_PWRSV); | ||
1618 | |||
1619 | diff --git a/sound/usb/card.c b/sound/usb/card.c | ||
1620 | index 388460d..b41730d 100644 | ||
1621 | --- a/sound/usb/card.c | ||
1622 | +++ b/sound/usb/card.c | ||
1623 | @@ -611,7 +611,9 @@ int snd_usb_autoresume(struct snd_usb_audio *chip) | ||
1624 | int err = -ENODEV; | ||
1625 | |||
1626 | down_read(&chip->shutdown_rwsem); | ||
1627 | - if (!chip->shutdown && !chip->probing) | ||
1628 | + if (chip->probing) | ||
1629 | + err = 0; | ||
1630 | + else if (!chip->shutdown) | ||
1631 | err = usb_autopm_get_interface(chip->pm_intf); | ||
1632 | up_read(&chip->shutdown_rwsem); | ||
1633 | |||
1634 | diff --git a/sound/usb/midi.c b/sound/usb/midi.c | ||
1635 | index 34b9bb7..e5fee18 100644 | ||
1636 | --- a/sound/usb/midi.c | ||
1637 | +++ b/sound/usb/midi.c | ||
1638 | @@ -126,7 +126,6 @@ struct snd_usb_midi { | ||
1639 | struct snd_usb_midi_in_endpoint *in; | ||
1640 | } endpoints[MIDI_MAX_ENDPOINTS]; | ||
1641 | unsigned long input_triggered; | ||
1642 | - bool autopm_reference; | ||
1643 | unsigned int opened[2]; | ||
1644 | unsigned char disconnected; | ||
1645 | unsigned char input_running; | ||
1646 | @@ -1040,7 +1039,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, | ||
1647 | { | ||
1648 | struct snd_usb_midi* umidi = substream->rmidi->private_data; | ||
1649 | struct snd_kcontrol *ctl; | ||
1650 | - int err; | ||
1651 | |||
1652 | down_read(&umidi->disc_rwsem); | ||
1653 | if (umidi->disconnected) { | ||
1654 | @@ -1051,13 +1049,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, | ||
1655 | mutex_lock(&umidi->mutex); | ||
1656 | if (open) { | ||
1657 | if (!umidi->opened[0] && !umidi->opened[1]) { | ||
1658 | - err = usb_autopm_get_interface(umidi->iface); | ||
1659 | - umidi->autopm_reference = err >= 0; | ||
1660 | - if (err < 0 && err != -EACCES) { | ||
1661 | - mutex_unlock(&umidi->mutex); | ||
1662 | - up_read(&umidi->disc_rwsem); | ||
1663 | - return -EIO; | ||
1664 | - } | ||
1665 | if (umidi->roland_load_ctl) { | ||
1666 | ctl = umidi->roland_load_ctl; | ||
1667 | ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE; | ||
1668 | @@ -1080,8 +1071,6 @@ static int substream_open(struct snd_rawmidi_substream *substream, int dir, | ||
1669 | snd_ctl_notify(umidi->card, | ||
1670 | SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); | ||
1671 | } | ||
1672 | - if (umidi->autopm_reference) | ||
1673 | - usb_autopm_put_interface(umidi->iface); | ||
1674 | } | ||
1675 | } | ||
1676 | mutex_unlock(&umidi->mutex); | ||
1677 | @@ -2256,6 +2245,8 @@ int snd_usbmidi_create(struct snd_card *card, | ||
1678 | return err; | ||
1679 | } | ||
1680 | |||
1681 | + usb_autopm_get_interface_no_resume(umidi->iface); | ||
1682 | + | ||
1683 | list_add_tail(&umidi->list, midi_list); | ||
1684 | return 0; | ||
1685 | } | ||
1686 | diff --git a/sound/usb/stream.c b/sound/usb/stream.c | ||
1687 | index 5ff8010..33a335b 100644 | ||
1688 | --- a/sound/usb/stream.c | ||
1689 | +++ b/sound/usb/stream.c | ||
1690 | @@ -168,6 +168,14 @@ static int parse_uac_endpoint_attributes(struct snd_usb_audio *chip, | ||
1691 | if (!csep && altsd->bNumEndpoints >= 2) | ||
1692 | csep = snd_usb_find_desc(alts->endpoint[1].extra, alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT); | ||
1693 | |||
1694 | + /* | ||
1695 | + * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra | ||
1696 | + * bytes after the first endpoint, go search the entire interface. | ||
1697 | + * Some devices have it directly *before* the standard endpoint. | ||
1698 | + */ | ||
1699 | + if (!csep) | ||
1700 | + csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, USB_DT_CS_ENDPOINT); | ||
1701 | + | ||
1702 | if (!csep || csep->bLength < 7 || | ||
1703 | csep->bDescriptorSubtype != UAC_EP_GENERAL) { | ||
1704 | snd_printk(KERN_WARNING "%d:%u:%d : no or invalid" |