Contents of /trunk/kernel-lts/patches-3.4/0140-3.4.41-all-fixes.patch
Parent Directory | Revision Log
Revision 2200 -
(show annotations)
(download)
Thu Jun 13 10:35:01 2013 UTC (11 years, 3 months ago) by niro
File size: 18220 byte(s)
Thu Jun 13 10:35:01 2013 UTC (11 years, 3 months ago) by niro
File size: 18220 byte(s)
-linux-3.4.41
1 | diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h |
2 | index aa0f913..25e9734 100644 |
3 | --- a/arch/x86/include/asm/paravirt.h |
4 | +++ b/arch/x86/include/asm/paravirt.h |
5 | @@ -741,7 +741,10 @@ static inline void arch_leave_lazy_mmu_mode(void) |
6 | PVOP_VCALL0(pv_mmu_ops.lazy_mode.leave); |
7 | } |
8 | |
9 | -void arch_flush_lazy_mmu_mode(void); |
10 | +static inline void arch_flush_lazy_mmu_mode(void) |
11 | +{ |
12 | + PVOP_VCALL0(pv_mmu_ops.lazy_mode.flush); |
13 | +} |
14 | |
15 | static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, |
16 | phys_addr_t phys, pgprot_t flags) |
17 | diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h |
18 | index 8e8b9a4..faf2c04 100644 |
19 | --- a/arch/x86/include/asm/paravirt_types.h |
20 | +++ b/arch/x86/include/asm/paravirt_types.h |
21 | @@ -91,6 +91,7 @@ struct pv_lazy_ops { |
22 | /* Set deferred update mode, used for batching operations. */ |
23 | void (*enter)(void); |
24 | void (*leave)(void); |
25 | + void (*flush)(void); |
26 | }; |
27 | |
28 | struct pv_time_ops { |
29 | @@ -680,6 +681,7 @@ void paravirt_end_context_switch(struct task_struct *next); |
30 | |
31 | void paravirt_enter_lazy_mmu(void); |
32 | void paravirt_leave_lazy_mmu(void); |
33 | +void paravirt_flush_lazy_mmu(void); |
34 | |
35 | void _paravirt_nop(void); |
36 | u32 _paravirt_ident_32(u32); |
37 | diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c |
38 | index ab13760..128323e 100644 |
39 | --- a/arch/x86/kernel/paravirt.c |
40 | +++ b/arch/x86/kernel/paravirt.c |
41 | @@ -263,6 +263,18 @@ void paravirt_leave_lazy_mmu(void) |
42 | leave_lazy(PARAVIRT_LAZY_MMU); |
43 | } |
44 | |
45 | +void paravirt_flush_lazy_mmu(void) |
46 | +{ |
47 | + preempt_disable(); |
48 | + |
49 | + if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { |
50 | + arch_leave_lazy_mmu_mode(); |
51 | + arch_enter_lazy_mmu_mode(); |
52 | + } |
53 | + |
54 | + preempt_enable(); |
55 | +} |
56 | + |
57 | void paravirt_start_context_switch(struct task_struct *prev) |
58 | { |
59 | BUG_ON(preemptible()); |
60 | @@ -292,18 +304,6 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void) |
61 | return percpu_read(paravirt_lazy_mode); |
62 | } |
63 | |
64 | -void arch_flush_lazy_mmu_mode(void) |
65 | -{ |
66 | - preempt_disable(); |
67 | - |
68 | - if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) { |
69 | - arch_leave_lazy_mmu_mode(); |
70 | - arch_enter_lazy_mmu_mode(); |
71 | - } |
72 | - |
73 | - preempt_enable(); |
74 | -} |
75 | - |
76 | struct pv_info pv_info = { |
77 | .name = "bare hardware", |
78 | .paravirt_enabled = 0, |
79 | @@ -477,6 +477,7 @@ struct pv_mmu_ops pv_mmu_ops = { |
80 | .lazy_mode = { |
81 | .enter = paravirt_nop, |
82 | .leave = paravirt_nop, |
83 | + .flush = paravirt_nop, |
84 | }, |
85 | |
86 | .set_fixmap = native_set_fixmap, |
87 | diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c |
88 | index 642d880..53272bd 100644 |
89 | --- a/arch/x86/lguest/boot.c |
90 | +++ b/arch/x86/lguest/boot.c |
91 | @@ -1333,6 +1333,7 @@ __init void lguest_init(void) |
92 | pv_mmu_ops.read_cr3 = lguest_read_cr3; |
93 | pv_mmu_ops.lazy_mode.enter = paravirt_enter_lazy_mmu; |
94 | pv_mmu_ops.lazy_mode.leave = lguest_leave_lazy_mmu_mode; |
95 | + pv_mmu_ops.lazy_mode.flush = paravirt_flush_lazy_mmu; |
96 | pv_mmu_ops.pte_update = lguest_pte_update; |
97 | pv_mmu_ops.pte_update_defer = lguest_pte_update; |
98 | |
99 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c |
100 | index e922e01..4a0a2e8 100644 |
101 | --- a/arch/x86/mm/fault.c |
102 | +++ b/arch/x86/mm/fault.c |
103 | @@ -377,10 +377,12 @@ static noinline __kprobes int vmalloc_fault(unsigned long address) |
104 | if (pgd_none(*pgd_ref)) |
105 | return -1; |
106 | |
107 | - if (pgd_none(*pgd)) |
108 | + if (pgd_none(*pgd)) { |
109 | set_pgd(pgd, *pgd_ref); |
110 | - else |
111 | + arch_flush_lazy_mmu_mode(); |
112 | + } else { |
113 | BUG_ON(pgd_page_vaddr(*pgd) != pgd_page_vaddr(*pgd_ref)); |
114 | + } |
115 | |
116 | /* |
117 | * Below here mismatches are bugs because these lower tables |
118 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
119 | index 5cb8e27..cf7fe36 100644 |
120 | --- a/arch/x86/xen/mmu.c |
121 | +++ b/arch/x86/xen/mmu.c |
122 | @@ -2076,6 +2076,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = { |
123 | .lazy_mode = { |
124 | .enter = paravirt_enter_lazy_mmu, |
125 | .leave = xen_leave_lazy_mmu, |
126 | + .flush = paravirt_flush_lazy_mmu, |
127 | }, |
128 | |
129 | .set_fixmap = xen_set_fixmap, |
130 | diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c |
131 | index a135c61..99a7855 100644 |
132 | --- a/drivers/gpu/drm/i915/i915_gem_gtt.c |
133 | +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c |
134 | @@ -72,7 +72,7 @@ int i915_gem_init_aliasing_ppgtt(struct drm_device *dev) |
135 | /* ppgtt PDEs reside in the global gtt pagetable, which has 512*1024 |
136 | * entries. For aliasing ppgtt support we just steal them at the end for |
137 | * now. */ |
138 | - first_pd_entry_in_global_pt = 512*1024 - I915_PPGTT_PD_ENTRIES; |
139 | + first_pd_entry_in_global_pt = dev_priv->mm.gtt->gtt_total_entries - I915_PPGTT_PD_ENTRIES; |
140 | |
141 | ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL); |
142 | if (!ppgtt) |
143 | diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c |
144 | index 3234224..b8e6463 100644 |
145 | --- a/drivers/gpu/drm/udl/udl_connector.c |
146 | +++ b/drivers/gpu/drm/udl/udl_connector.c |
147 | @@ -61,6 +61,10 @@ static int udl_get_modes(struct drm_connector *connector) |
148 | int ret; |
149 | |
150 | edid = (struct edid *)udl_get_edid(udl); |
151 | + if (!edid) { |
152 | + drm_mode_connector_update_edid_property(connector, NULL); |
153 | + return 0; |
154 | + } |
155 | |
156 | connector->display_info.raw_edid = (char *)edid; |
157 | |
158 | diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c |
159 | index f2f482b..76afcb4 100644 |
160 | --- a/drivers/mtd/mtdchar.c |
161 | +++ b/drivers/mtd/mtdchar.c |
162 | @@ -1123,6 +1123,33 @@ static unsigned long mtdchar_get_unmapped_area(struct file *file, |
163 | } |
164 | #endif |
165 | |
166 | +static inline unsigned long get_vm_size(struct vm_area_struct *vma) |
167 | +{ |
168 | + return vma->vm_end - vma->vm_start; |
169 | +} |
170 | + |
171 | +static inline resource_size_t get_vm_offset(struct vm_area_struct *vma) |
172 | +{ |
173 | + return (resource_size_t) vma->vm_pgoff << PAGE_SHIFT; |
174 | +} |
175 | + |
176 | +/* |
177 | + * Set a new vm offset. |
178 | + * |
179 | + * Verify that the incoming offset really works as a page offset, |
180 | + * and that the offset and size fit in a resource_size_t. |
181 | + */ |
182 | +static inline int set_vm_offset(struct vm_area_struct *vma, resource_size_t off) |
183 | +{ |
184 | + pgoff_t pgoff = off >> PAGE_SHIFT; |
185 | + if (off != (resource_size_t) pgoff << PAGE_SHIFT) |
186 | + return -EINVAL; |
187 | + if (off + get_vm_size(vma) - 1 < off) |
188 | + return -EINVAL; |
189 | + vma->vm_pgoff = pgoff; |
190 | + return 0; |
191 | +} |
192 | + |
193 | /* |
194 | * set up a mapping for shared memory segments |
195 | */ |
196 | @@ -1132,20 +1159,33 @@ static int mtdchar_mmap(struct file *file, struct vm_area_struct *vma) |
197 | struct mtd_file_info *mfi = file->private_data; |
198 | struct mtd_info *mtd = mfi->mtd; |
199 | struct map_info *map = mtd->priv; |
200 | - unsigned long start; |
201 | - unsigned long off; |
202 | - u32 len; |
203 | - |
204 | - if (mtd->type == MTD_RAM || mtd->type == MTD_ROM) { |
205 | - off = vma->vm_pgoff << PAGE_SHIFT; |
206 | + resource_size_t start, off; |
207 | + unsigned long len, vma_len; |
208 | + |
209 | + /* This is broken because it assumes the MTD device is map-based |
210 | + and that mtd->priv is a valid struct map_info. It should be |
211 | + replaced with something that uses the mtd_get_unmapped_area() |
212 | + operation properly. */ |
213 | + if (0 /*mtd->type == MTD_RAM || mtd->type == MTD_ROM*/) { |
214 | + off = get_vm_offset(vma); |
215 | start = map->phys; |
216 | len = PAGE_ALIGN((start & ~PAGE_MASK) + map->size); |
217 | start &= PAGE_MASK; |
218 | - if ((vma->vm_end - vma->vm_start + off) > len) |
219 | + vma_len = get_vm_size(vma); |
220 | + |
221 | + /* Overflow in off+len? */ |
222 | + if (vma_len + off < off) |
223 | + return -EINVAL; |
224 | + /* Does it fit in the mapping? */ |
225 | + if (vma_len + off > len) |
226 | return -EINVAL; |
227 | |
228 | off += start; |
229 | - vma->vm_pgoff = off >> PAGE_SHIFT; |
230 | + /* Did that overflow? */ |
231 | + if (off < start) |
232 | + return -EINVAL; |
233 | + if (set_vm_offset(vma, off) < 0) |
234 | + return -EINVAL; |
235 | vma->vm_flags |= VM_IO | VM_RESERVED; |
236 | |
237 | #ifdef pgprot_noncached |
238 | diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c |
239 | index df49ce2..978af21 100644 |
240 | --- a/drivers/net/ethernet/realtek/r8169.c |
241 | +++ b/drivers/net/ethernet/realtek/r8169.c |
242 | @@ -3483,6 +3483,30 @@ static void __devinit rtl_init_mdio_ops(struct rtl8169_private *tp) |
243 | } |
244 | } |
245 | |
246 | +static void rtl_speed_down(struct rtl8169_private *tp) |
247 | +{ |
248 | + u32 adv; |
249 | + int lpa; |
250 | + |
251 | + rtl_writephy(tp, 0x1f, 0x0000); |
252 | + lpa = rtl_readphy(tp, MII_LPA); |
253 | + |
254 | + if (lpa & (LPA_10HALF | LPA_10FULL)) |
255 | + adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full; |
256 | + else if (lpa & (LPA_100HALF | LPA_100FULL)) |
257 | + adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | |
258 | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; |
259 | + else |
260 | + adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | |
261 | + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | |
262 | + (tp->mii.supports_gmii ? |
263 | + ADVERTISED_1000baseT_Half | |
264 | + ADVERTISED_1000baseT_Full : 0); |
265 | + |
266 | + rtl8169_set_speed(tp->dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL, |
267 | + adv); |
268 | +} |
269 | + |
270 | static void rtl_wol_suspend_quirk(struct rtl8169_private *tp) |
271 | { |
272 | void __iomem *ioaddr = tp->mmio_addr; |
273 | @@ -3508,9 +3532,7 @@ static bool rtl_wol_pll_power_down(struct rtl8169_private *tp) |
274 | if (!(__rtl8169_get_wol(tp) & WAKE_ANY)) |
275 | return false; |
276 | |
277 | - rtl_writephy(tp, 0x1f, 0x0000); |
278 | - rtl_writephy(tp, MII_BMCR, 0x0000); |
279 | - |
280 | + rtl_speed_down(tp); |
281 | rtl_wol_suspend_quirk(tp); |
282 | |
283 | return true; |
284 | diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c |
285 | index 101b28e..58e6183 100644 |
286 | --- a/drivers/scsi/libsas/sas_expander.c |
287 | +++ b/drivers/scsi/libsas/sas_expander.c |
288 | @@ -235,6 +235,17 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp) |
289 | linkrate = phy->linkrate; |
290 | memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE); |
291 | |
292 | + /* Handle vacant phy - rest of dr data is not valid so skip it */ |
293 | + if (phy->phy_state == PHY_VACANT) { |
294 | + memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE); |
295 | + phy->attached_dev_type = NO_DEVICE; |
296 | + if (!test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) { |
297 | + phy->phy_id = phy_id; |
298 | + goto skip; |
299 | + } else |
300 | + goto out; |
301 | + } |
302 | + |
303 | phy->attached_dev_type = to_dev_type(dr); |
304 | if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) |
305 | goto out; |
306 | @@ -272,6 +283,7 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp) |
307 | phy->phy->maximum_linkrate = dr->pmax_linkrate; |
308 | phy->phy->negotiated_linkrate = phy->linkrate; |
309 | |
310 | + skip: |
311 | if (new_phy) |
312 | if (sas_phy_add(phy->phy)) { |
313 | sas_phy_free(phy->phy); |
314 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c |
315 | index f30e124..aa3c106 100644 |
316 | --- a/drivers/target/target_core_alua.c |
317 | +++ b/drivers/target/target_core_alua.c |
318 | @@ -392,6 +392,7 @@ static inline int core_alua_state_standby( |
319 | case REPORT_LUNS: |
320 | case RECEIVE_DIAGNOSTIC: |
321 | case SEND_DIAGNOSTIC: |
322 | + return 0; |
323 | case MAINTENANCE_IN: |
324 | switch (cdb[1]) { |
325 | case MI_REPORT_TARGET_PGS: |
326 | @@ -434,6 +435,7 @@ static inline int core_alua_state_unavailable( |
327 | switch (cdb[0]) { |
328 | case INQUIRY: |
329 | case REPORT_LUNS: |
330 | + return 0; |
331 | case MAINTENANCE_IN: |
332 | switch (cdb[1]) { |
333 | case MI_REPORT_TARGET_PGS: |
334 | @@ -474,6 +476,7 @@ static inline int core_alua_state_transition( |
335 | switch (cdb[0]) { |
336 | case INQUIRY: |
337 | case REPORT_LUNS: |
338 | + return 0; |
339 | case MAINTENANCE_IN: |
340 | switch (cdb[1]) { |
341 | case MI_REPORT_TARGET_PGS: |
342 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
343 | index f771e9f..9cc574c 100644 |
344 | --- a/fs/cifs/connect.c |
345 | +++ b/fs/cifs/connect.c |
346 | @@ -1576,14 +1576,24 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, |
347 | } |
348 | break; |
349 | case Opt_blank_pass: |
350 | - vol->password = NULL; |
351 | - break; |
352 | - case Opt_pass: |
353 | /* passwords have to be handled differently |
354 | * to allow the character used for deliminator |
355 | * to be passed within them |
356 | */ |
357 | |
358 | + /* |
359 | + * Check if this is a case where the password |
360 | + * starts with a delimiter |
361 | + */ |
362 | + tmp_end = strchr(data, '='); |
363 | + tmp_end++; |
364 | + if (!(tmp_end < end && tmp_end[1] == delim)) { |
365 | + /* No it is not. Set the password to NULL */ |
366 | + vol->password = NULL; |
367 | + break; |
368 | + } |
369 | + /* Yes it is. Drop down to Opt_pass below.*/ |
370 | + case Opt_pass: |
371 | /* Obtain the value string */ |
372 | value = strchr(data, '='); |
373 | value++; |
374 | diff --git a/fs/inode.c b/fs/inode.c |
375 | index 9f4f5fe..8de457e 100644 |
376 | --- a/fs/inode.c |
377 | +++ b/fs/inode.c |
378 | @@ -705,7 +705,7 @@ void prune_icache_sb(struct super_block *sb, int nr_to_scan) |
379 | * inode to the back of the list so we don't spin on it. |
380 | */ |
381 | if (!spin_trylock(&inode->i_lock)) { |
382 | - list_move_tail(&inode->i_lru, &sb->s_inode_lru); |
383 | + list_move(&inode->i_lru, &sb->s_inode_lru); |
384 | continue; |
385 | } |
386 | |
387 | diff --git a/include/linux/kref.h b/include/linux/kref.h |
388 | index 9c07dce..fd2a616 100644 |
389 | --- a/include/linux/kref.h |
390 | +++ b/include/linux/kref.h |
391 | @@ -93,4 +93,25 @@ static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref) |
392 | { |
393 | return kref_sub(kref, 1, release); |
394 | } |
395 | + |
396 | +/** |
397 | + * kref_get_unless_zero - Increment refcount for object unless it is zero. |
398 | + * @kref: object. |
399 | + * |
400 | + * Return non-zero if the increment succeeded. Otherwise return 0. |
401 | + * |
402 | + * This function is intended to simplify locking around refcounting for |
403 | + * objects that can be looked up from a lookup structure, and which are |
404 | + * removed from that lookup structure in the object destructor. |
405 | + * Operations on such objects require at least a read lock around |
406 | + * lookup + kref_get, and a write lock around kref_put + remove from lookup |
407 | + * structure. Furthermore, RCU implementations become extremely tricky. |
408 | + * With a lookup followed by a kref_get_unless_zero *with return value check* |
409 | + * locking in the kref_put path can be deferred to the actual removal from |
410 | + * the lookup structure and RCU lookups become trivial. |
411 | + */ |
412 | +static inline int __must_check kref_get_unless_zero(struct kref *kref) |
413 | +{ |
414 | + return atomic_add_unless(&kref->refcount, 1, 0); |
415 | +} |
416 | #endif /* _KREF_H_ */ |
417 | diff --git a/kernel/sched/clock.c b/kernel/sched/clock.c |
418 | index c685e31..c3ae144 100644 |
419 | --- a/kernel/sched/clock.c |
420 | +++ b/kernel/sched/clock.c |
421 | @@ -176,10 +176,36 @@ static u64 sched_clock_remote(struct sched_clock_data *scd) |
422 | u64 this_clock, remote_clock; |
423 | u64 *ptr, old_val, val; |
424 | |
425 | +#if BITS_PER_LONG != 64 |
426 | +again: |
427 | + /* |
428 | + * Careful here: The local and the remote clock values need to |
429 | + * be read out atomic as we need to compare the values and |
430 | + * then update either the local or the remote side. So the |
431 | + * cmpxchg64 below only protects one readout. |
432 | + * |
433 | + * We must reread via sched_clock_local() in the retry case on |
434 | + * 32bit as an NMI could use sched_clock_local() via the |
435 | + * tracer and hit between the readout of |
436 | + * the low32bit and the high 32bit portion. |
437 | + */ |
438 | + this_clock = sched_clock_local(my_scd); |
439 | + /* |
440 | + * We must enforce atomic readout on 32bit, otherwise the |
441 | + * update on the remote cpu can hit inbetween the readout of |
442 | + * the low32bit and the high 32bit portion. |
443 | + */ |
444 | + remote_clock = cmpxchg64(&scd->clock, 0, 0); |
445 | +#else |
446 | + /* |
447 | + * On 64bit the read of [my]scd->clock is atomic versus the |
448 | + * update, so we can avoid the above 32bit dance. |
449 | + */ |
450 | sched_clock_local(my_scd); |
451 | again: |
452 | this_clock = my_scd->clock; |
453 | remote_clock = scd->clock; |
454 | +#endif |
455 | |
456 | /* |
457 | * Use the opportunity that we have both locks |
458 | diff --git a/kernel/sys.c b/kernel/sys.c |
459 | index b0003db..6a74b83 100644 |
460 | --- a/kernel/sys.c |
461 | +++ b/kernel/sys.c |
462 | @@ -320,7 +320,6 @@ void kernel_restart_prepare(char *cmd) |
463 | system_state = SYSTEM_RESTART; |
464 | usermodehelper_disable(); |
465 | device_shutdown(); |
466 | - syscore_shutdown(); |
467 | } |
468 | |
469 | /** |
470 | @@ -366,6 +365,7 @@ void kernel_restart(char *cmd) |
471 | { |
472 | kernel_restart_prepare(cmd); |
473 | disable_nonboot_cpus(); |
474 | + syscore_shutdown(); |
475 | if (!cmd) |
476 | printk(KERN_EMERG "Restarting system.\n"); |
477 | else |
478 | @@ -391,6 +391,7 @@ static void kernel_shutdown_prepare(enum system_states state) |
479 | void kernel_halt(void) |
480 | { |
481 | kernel_shutdown_prepare(SYSTEM_HALT); |
482 | + disable_nonboot_cpus(); |
483 | syscore_shutdown(); |
484 | printk(KERN_EMERG "System halted.\n"); |
485 | kmsg_dump(KMSG_DUMP_HALT); |
486 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
487 | index e539dfa..a3c1dd9 100644 |
488 | --- a/kernel/trace/ftrace.c |
489 | +++ b/kernel/trace/ftrace.c |
490 | @@ -642,7 +642,6 @@ int ftrace_profile_pages_init(struct ftrace_profile_stat *stat) |
491 | free_page(tmp); |
492 | } |
493 | |
494 | - free_page((unsigned long)stat->pages); |
495 | stat->pages = NULL; |
496 | stat->start = NULL; |
497 | |
498 | diff --git a/lib/kobject.c b/lib/kobject.c |
499 | index aeefa8b..d90c692 100644 |
500 | --- a/lib/kobject.c |
501 | +++ b/lib/kobject.c |
502 | @@ -531,6 +531,13 @@ struct kobject *kobject_get(struct kobject *kobj) |
503 | return kobj; |
504 | } |
505 | |
506 | +static struct kobject *kobject_get_unless_zero(struct kobject *kobj) |
507 | +{ |
508 | + if (!kref_get_unless_zero(&kobj->kref)) |
509 | + kobj = NULL; |
510 | + return kobj; |
511 | +} |
512 | + |
513 | /* |
514 | * kobject_cleanup - free kobject resources. |
515 | * @kobj: object to cleanup |
516 | @@ -753,7 +760,7 @@ struct kobject *kset_find_obj(struct kset *kset, const char *name) |
517 | |
518 | list_for_each_entry(k, &kset->list, entry) { |
519 | if (kobject_name(k) && !strcmp(kobject_name(k), name)) { |
520 | - ret = kobject_get(k); |
521 | + ret = kobject_get_unless_zero(k); |
522 | break; |
523 | } |
524 | } |
525 | diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c |
526 | index c91fb2f..77758542 100644 |
527 | --- a/sound/soc/codecs/wm8903.c |
528 | +++ b/sound/soc/codecs/wm8903.c |
529 | @@ -1082,6 +1082,8 @@ static const struct snd_soc_dapm_route wm8903_intercon[] = { |
530 | { "ROP", NULL, "Right Speaker PGA" }, |
531 | { "RON", NULL, "Right Speaker PGA" }, |
532 | |
533 | + { "Charge Pump", NULL, "CLK_DSP" }, |
534 | + |
535 | { "Left Headphone Output PGA", NULL, "Charge Pump" }, |
536 | { "Right Headphone Output PGA", NULL, "Charge Pump" }, |
537 | { "Left Line Output PGA", NULL, "Charge Pump" }, |
538 | diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c |
539 | index 38a607a..fb95069 100644 |
540 | --- a/sound/usb/mixer_quirks.c |
541 | +++ b/sound/usb/mixer_quirks.c |
542 | @@ -396,7 +396,7 @@ static int snd_nativeinstruments_control_get(struct snd_kcontrol *kcontrol, |
543 | else |
544 | ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), bRequest, |
545 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, |
546 | - 0, cpu_to_le16(wIndex), |
547 | + 0, wIndex, |
548 | &tmp, sizeof(tmp), 1000); |
549 | up_read(&mixer->chip->shutdown_rwsem); |
550 | |
551 | @@ -427,7 +427,7 @@ static int snd_nativeinstruments_control_put(struct snd_kcontrol *kcontrol, |
552 | else |
553 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), bRequest, |
554 | USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, |
555 | - cpu_to_le16(wValue), cpu_to_le16(wIndex), |
556 | + wValue, wIndex, |
557 | NULL, 0, 1000); |
558 | up_read(&mixer->chip->shutdown_rwsem); |
559 | |
560 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c |
561 | index c46171a..b7fa802 100644 |
562 | --- a/sound/usb/quirks.c |
563 | +++ b/sound/usb/quirks.c |
564 | @@ -486,7 +486,7 @@ static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev) |
565 | { |
566 | int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
567 | 0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
568 | - cpu_to_le16(1), 0, NULL, 0, 1000); |
569 | + 1, 0, NULL, 0, 1000); |
570 | |
571 | if (ret < 0) |
572 | return ret; |