Contents of /trunk/kernel26-alx/patches-2.6.37/0105-2.6.37.6-all-fixes.patch
Parent Directory | Revision Log
Revision 1311 -
(show annotations)
(download)
Tue Apr 12 14:29:09 2011 UTC (13 years, 5 months ago) by niro
Original Path: trunk/kernel26-alx/patches-2.6.37-r1/0105-2.6.37.6-all-fixes.patch
File size: 69251 byte(s)
Tue Apr 12 14:29:09 2011 UTC (13 years, 5 months ago) by niro
Original Path: trunk/kernel26-alx/patches-2.6.37-r1/0105-2.6.37.6-all-fixes.patch
File size: 69251 byte(s)
kernel 2.6.37-alx-r1
1 | diff --git a/arch/sh/kernel/ptrace_32.c b/arch/sh/kernel/ptrace_32.c |
2 | index 90a15d2..2130ca6 100644 |
3 | --- a/arch/sh/kernel/ptrace_32.c |
4 | +++ b/arch/sh/kernel/ptrace_32.c |
5 | @@ -101,6 +101,8 @@ static int set_single_step(struct task_struct *tsk, unsigned long addr) |
6 | |
7 | attr = bp->attr; |
8 | attr.bp_addr = addr; |
9 | + /* reenable breakpoint */ |
10 | + attr.disabled = false; |
11 | err = modify_user_hw_breakpoint(bp, &attr); |
12 | if (unlikely(err)) |
13 | return err; |
14 | @@ -392,6 +394,9 @@ long arch_ptrace(struct task_struct *child, long request, |
15 | tmp = 0; |
16 | } else { |
17 | unsigned long index; |
18 | + ret = init_fpu(child); |
19 | + if (ret) |
20 | + break; |
21 | index = addr - offsetof(struct user, fpu); |
22 | tmp = ((unsigned long *)child->thread.xstate) |
23 | [index >> 2]; |
24 | @@ -423,6 +428,9 @@ long arch_ptrace(struct task_struct *child, long request, |
25 | else if (addr >= offsetof(struct user, fpu) && |
26 | addr < offsetof(struct user, u_fpvalid)) { |
27 | unsigned long index; |
28 | + ret = init_fpu(child); |
29 | + if (ret) |
30 | + break; |
31 | index = addr - offsetof(struct user, fpu); |
32 | set_stopped_child_used_math(child); |
33 | ((unsigned long *)child->thread.xstate) |
34 | diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c |
35 | index 4436eac..c8f9764 100644 |
36 | --- a/arch/sh/kernel/ptrace_64.c |
37 | +++ b/arch/sh/kernel/ptrace_64.c |
38 | @@ -403,6 +403,9 @@ long arch_ptrace(struct task_struct *child, long request, |
39 | else if ((addr >= offsetof(struct user, fpu)) && |
40 | (addr < offsetof(struct user, u_fpvalid))) { |
41 | unsigned long index; |
42 | + ret = init_fpu(child); |
43 | + if (ret) |
44 | + break; |
45 | index = addr - offsetof(struct user, fpu); |
46 | tmp = get_fpu_long(child, index); |
47 | } else if (addr == offsetof(struct user, u_fpvalid)) { |
48 | @@ -442,6 +445,9 @@ long arch_ptrace(struct task_struct *child, long request, |
49 | else if ((addr >= offsetof(struct user, fpu)) && |
50 | (addr < offsetof(struct user, u_fpvalid))) { |
51 | unsigned long index; |
52 | + ret = init_fpu(child); |
53 | + if (ret) |
54 | + break; |
55 | index = addr - offsetof(struct user, fpu); |
56 | ret = put_fpu_long(child, index, data); |
57 | } |
58 | diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h |
59 | index 6b89f5e..0a6c5ef 100644 |
60 | --- a/arch/x86/include/asm/msr-index.h |
61 | +++ b/arch/x86/include/asm/msr-index.h |
62 | @@ -36,6 +36,11 @@ |
63 | #define MSR_IA32_PERFCTR1 0x000000c2 |
64 | #define MSR_FSB_FREQ 0x000000cd |
65 | |
66 | +#define MSR_NHM_SNB_PKG_CST_CFG_CTL 0x000000e2 |
67 | +#define NHM_C3_AUTO_DEMOTE (1UL << 25) |
68 | +#define NHM_C1_AUTO_DEMOTE (1UL << 26) |
69 | +#define ATM_LNC_C6_AUTO_DEMOTE (1UL << 25) |
70 | + |
71 | #define MSR_MTRRcap 0x000000fe |
72 | #define MSR_IA32_BBL_CR_CTL 0x00000119 |
73 | |
74 | diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c |
75 | index 2d2673c..5655c22 100644 |
76 | --- a/arch/x86/kernel/head64.c |
77 | +++ b/arch/x86/kernel/head64.c |
78 | @@ -77,9 +77,6 @@ void __init x86_64_start_kernel(char * real_mode_data) |
79 | /* Make NULL pointers segfault */ |
80 | zap_identity_mappings(); |
81 | |
82 | - /* Cleanup the over mapped high alias */ |
83 | - cleanup_highmap(); |
84 | - |
85 | max_pfn_mapped = KERNEL_IMAGE_SIZE >> PAGE_SHIFT; |
86 | |
87 | for (i = 0; i < NUM_EXCEPTION_VECTORS; i++) { |
88 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c |
89 | index a0f52af..1d9b98e 100644 |
90 | --- a/arch/x86/kernel/setup.c |
91 | +++ b/arch/x86/kernel/setup.c |
92 | @@ -297,6 +297,9 @@ static void __init init_gbpages(void) |
93 | static inline void init_gbpages(void) |
94 | { |
95 | } |
96 | +static void __init cleanup_highmap(void) |
97 | +{ |
98 | +} |
99 | #endif |
100 | |
101 | static void __init reserve_brk(void) |
102 | @@ -922,6 +925,8 @@ void __init setup_arch(char **cmdline_p) |
103 | */ |
104 | reserve_brk(); |
105 | |
106 | + cleanup_highmap(); |
107 | + |
108 | memblock.current_limit = get_max_mapped(); |
109 | memblock_x86_fill(); |
110 | |
111 | diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c |
112 | index c0e28a1..0398a73 100644 |
113 | --- a/arch/x86/mm/init.c |
114 | +++ b/arch/x86/mm/init.c |
115 | @@ -279,25 +279,6 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, |
116 | load_cr3(swapper_pg_dir); |
117 | #endif |
118 | |
119 | -#ifdef CONFIG_X86_64 |
120 | - if (!after_bootmem && !start) { |
121 | - pud_t *pud; |
122 | - pmd_t *pmd; |
123 | - |
124 | - mmu_cr4_features = read_cr4(); |
125 | - |
126 | - /* |
127 | - * _brk_end cannot change anymore, but it and _end may be |
128 | - * located on different 2M pages. cleanup_highmap(), however, |
129 | - * can only consider _end when it runs, so destroy any |
130 | - * mappings beyond _brk_end here. |
131 | - */ |
132 | - pud = pud_offset(pgd_offset_k(_brk_end), _brk_end); |
133 | - pmd = pmd_offset(pud, _brk_end - 1); |
134 | - while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1)) |
135 | - pmd_clear(pmd); |
136 | - } |
137 | -#endif |
138 | __flush_tlb_all(); |
139 | |
140 | if (!after_bootmem && e820_table_end > e820_table_start) |
141 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c |
142 | index c14a542..68f9921 100644 |
143 | --- a/arch/x86/mm/init_64.c |
144 | +++ b/arch/x86/mm/init_64.c |
145 | @@ -51,6 +51,7 @@ |
146 | #include <asm/numa.h> |
147 | #include <asm/cacheflush.h> |
148 | #include <asm/init.h> |
149 | +#include <asm/setup.h> |
150 | |
151 | static int __init parse_direct_gbpages_off(char *arg) |
152 | { |
153 | @@ -293,18 +294,18 @@ void __init init_extra_mapping_uc(unsigned long phys, unsigned long size) |
154 | * to the compile time generated pmds. This results in invalid pmds up |
155 | * to the point where we hit the physaddr 0 mapping. |
156 | * |
157 | - * We limit the mappings to the region from _text to _end. _end is |
158 | - * rounded up to the 2MB boundary. This catches the invalid pmds as |
159 | + * We limit the mappings to the region from _text to _brk_end. _brk_end |
160 | + * is rounded up to the 2MB boundary. This catches the invalid pmds as |
161 | * well, as they are located before _text: |
162 | */ |
163 | void __init cleanup_highmap(void) |
164 | { |
165 | unsigned long vaddr = __START_KERNEL_map; |
166 | - unsigned long end = roundup((unsigned long)_end, PMD_SIZE) - 1; |
167 | + unsigned long vaddr_end = __START_KERNEL_map + (max_pfn_mapped << PAGE_SHIFT); |
168 | + unsigned long end = roundup((unsigned long)_brk_end, PMD_SIZE) - 1; |
169 | pmd_t *pmd = level2_kernel_pgt; |
170 | - pmd_t *last_pmd = pmd + PTRS_PER_PMD; |
171 | |
172 | - for (; pmd < last_pmd; pmd++, vaddr += PMD_SIZE) { |
173 | + for (; vaddr + PMD_SIZE - 1 < vaddr_end; pmd++, vaddr += PMD_SIZE) { |
174 | if (pmd_none(*pmd)) |
175 | continue; |
176 | if (vaddr < (unsigned long) _text || vaddr > end) |
177 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
178 | index 9ea0dc6..7abdb0c 100644 |
179 | --- a/arch/x86/xen/mmu.c |
180 | +++ b/arch/x86/xen/mmu.c |
181 | @@ -2027,9 +2027,6 @@ static __init void xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) |
182 | for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { |
183 | pte_t pte; |
184 | |
185 | - if (pfn > max_pfn_mapped) |
186 | - max_pfn_mapped = pfn; |
187 | - |
188 | if (!pte_none(pte_page[pteidx])) |
189 | continue; |
190 | |
191 | @@ -2087,6 +2084,12 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, |
192 | pud_t *l3; |
193 | pmd_t *l2; |
194 | |
195 | + /* max_pfn_mapped is the last pfn mapped in the initial memory |
196 | + * mappings. Considering that on Xen after the kernel mappings we |
197 | + * have the mappings of some pages that don't exist in pfn space, we |
198 | + * set max_pfn_mapped to the last real pfn mapped. */ |
199 | + max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); |
200 | + |
201 | /* Zap identity mapping */ |
202 | init_level4_pgt[0] = __pgd(0); |
203 | |
204 | @@ -2191,9 +2194,7 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, |
205 | initial_kernel_pmd = |
206 | extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); |
207 | |
208 | - max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) + |
209 | - xen_start_info->nr_pt_frames * PAGE_SIZE + |
210 | - 512*1024); |
211 | + max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); |
212 | |
213 | kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); |
214 | memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); |
215 | diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c |
216 | index 69ad529..ea5ac2d 100644 |
217 | --- a/drivers/firmware/dcdbas.c |
218 | +++ b/drivers/firmware/dcdbas.c |
219 | @@ -268,8 +268,10 @@ int dcdbas_smi_request(struct smi_cmd *smi_cmd) |
220 | } |
221 | |
222 | /* generate SMI */ |
223 | + /* inb to force posted write through and make SMI happen now */ |
224 | asm volatile ( |
225 | - "outb %b0,%w1" |
226 | + "outb %b0,%w1\n" |
227 | + "inb %w1" |
228 | : /* no output args */ |
229 | : "a" (smi_cmd->command_code), |
230 | "d" (smi_cmd->command_address), |
231 | diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c |
232 | index 2baa670..97b2985 100644 |
233 | --- a/drivers/gpu/drm/drm_crtc.c |
234 | +++ b/drivers/gpu/drm/drm_crtc.c |
235 | @@ -1073,6 +1073,9 @@ int drm_mode_getresources(struct drm_device *dev, void *data, |
236 | uint32_t __user *encoder_id; |
237 | struct drm_mode_group *mode_group; |
238 | |
239 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
240 | + return -EINVAL; |
241 | + |
242 | mutex_lock(&dev->mode_config.mutex); |
243 | |
244 | /* |
245 | @@ -1244,6 +1247,9 @@ int drm_mode_getcrtc(struct drm_device *dev, |
246 | struct drm_mode_object *obj; |
247 | int ret = 0; |
248 | |
249 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
250 | + return -EINVAL; |
251 | + |
252 | mutex_lock(&dev->mode_config.mutex); |
253 | |
254 | obj = drm_mode_object_find(dev, crtc_resp->crtc_id, |
255 | @@ -1312,6 +1318,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, |
256 | uint64_t __user *prop_values; |
257 | uint32_t __user *encoder_ptr; |
258 | |
259 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
260 | + return -EINVAL; |
261 | + |
262 | memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); |
263 | |
264 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); |
265 | @@ -1431,6 +1440,9 @@ int drm_mode_getencoder(struct drm_device *dev, void *data, |
266 | struct drm_encoder *encoder; |
267 | int ret = 0; |
268 | |
269 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
270 | + return -EINVAL; |
271 | + |
272 | mutex_lock(&dev->mode_config.mutex); |
273 | obj = drm_mode_object_find(dev, enc_resp->encoder_id, |
274 | DRM_MODE_OBJECT_ENCODER); |
275 | @@ -1486,6 +1498,9 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, |
276 | int ret = 0; |
277 | int i; |
278 | |
279 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
280 | + return -EINVAL; |
281 | + |
282 | mutex_lock(&dev->mode_config.mutex); |
283 | obj = drm_mode_object_find(dev, crtc_req->crtc_id, |
284 | DRM_MODE_OBJECT_CRTC); |
285 | @@ -1603,6 +1618,9 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, |
286 | struct drm_crtc *crtc; |
287 | int ret = 0; |
288 | |
289 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
290 | + return -EINVAL; |
291 | + |
292 | if (!req->flags) { |
293 | DRM_ERROR("no operation set\n"); |
294 | return -EINVAL; |
295 | @@ -1667,6 +1685,9 @@ int drm_mode_addfb(struct drm_device *dev, |
296 | struct drm_framebuffer *fb; |
297 | int ret = 0; |
298 | |
299 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
300 | + return -EINVAL; |
301 | + |
302 | if ((config->min_width > r->width) || (r->width > config->max_width)) { |
303 | DRM_ERROR("mode new framebuffer width not within limits\n"); |
304 | return -EINVAL; |
305 | @@ -1724,6 +1745,9 @@ int drm_mode_rmfb(struct drm_device *dev, |
306 | int ret = 0; |
307 | int found = 0; |
308 | |
309 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
310 | + return -EINVAL; |
311 | + |
312 | mutex_lock(&dev->mode_config.mutex); |
313 | obj = drm_mode_object_find(dev, *id, DRM_MODE_OBJECT_FB); |
314 | /* TODO check that we realy get a framebuffer back. */ |
315 | @@ -1780,6 +1804,9 @@ int drm_mode_getfb(struct drm_device *dev, |
316 | struct drm_framebuffer *fb; |
317 | int ret = 0; |
318 | |
319 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
320 | + return -EINVAL; |
321 | + |
322 | mutex_lock(&dev->mode_config.mutex); |
323 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); |
324 | if (!obj) { |
325 | @@ -1813,6 +1840,9 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, |
326 | int num_clips; |
327 | int ret = 0; |
328 | |
329 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
330 | + return -EINVAL; |
331 | + |
332 | mutex_lock(&dev->mode_config.mutex); |
333 | obj = drm_mode_object_find(dev, r->fb_id, DRM_MODE_OBJECT_FB); |
334 | if (!obj) { |
335 | @@ -1996,6 +2026,9 @@ int drm_mode_attachmode_ioctl(struct drm_device *dev, |
336 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; |
337 | int ret = 0; |
338 | |
339 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
340 | + return -EINVAL; |
341 | + |
342 | mutex_lock(&dev->mode_config.mutex); |
343 | |
344 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
345 | @@ -2042,6 +2075,9 @@ int drm_mode_detachmode_ioctl(struct drm_device *dev, |
346 | struct drm_mode_modeinfo *umode = &mode_cmd->mode; |
347 | int ret = 0; |
348 | |
349 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
350 | + return -EINVAL; |
351 | + |
352 | mutex_lock(&dev->mode_config.mutex); |
353 | |
354 | obj = drm_mode_object_find(dev, mode_cmd->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
355 | @@ -2211,6 +2247,9 @@ int drm_mode_getproperty_ioctl(struct drm_device *dev, |
356 | uint64_t __user *values_ptr; |
357 | uint32_t __user *blob_length_ptr; |
358 | |
359 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
360 | + return -EINVAL; |
361 | + |
362 | mutex_lock(&dev->mode_config.mutex); |
363 | obj = drm_mode_object_find(dev, out_resp->prop_id, DRM_MODE_OBJECT_PROPERTY); |
364 | if (!obj) { |
365 | @@ -2333,6 +2372,9 @@ int drm_mode_getblob_ioctl(struct drm_device *dev, |
366 | int ret = 0; |
367 | void *blob_ptr; |
368 | |
369 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
370 | + return -EINVAL; |
371 | + |
372 | mutex_lock(&dev->mode_config.mutex); |
373 | obj = drm_mode_object_find(dev, out_resp->blob_id, DRM_MODE_OBJECT_BLOB); |
374 | if (!obj) { |
375 | @@ -2393,6 +2435,9 @@ int drm_mode_connector_property_set_ioctl(struct drm_device *dev, |
376 | int ret = -EINVAL; |
377 | int i; |
378 | |
379 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
380 | + return -EINVAL; |
381 | + |
382 | mutex_lock(&dev->mode_config.mutex); |
383 | |
384 | obj = drm_mode_object_find(dev, out_resp->connector_id, DRM_MODE_OBJECT_CONNECTOR); |
385 | @@ -2509,6 +2554,9 @@ int drm_mode_gamma_set_ioctl(struct drm_device *dev, |
386 | int size; |
387 | int ret = 0; |
388 | |
389 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
390 | + return -EINVAL; |
391 | + |
392 | mutex_lock(&dev->mode_config.mutex); |
393 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
394 | if (!obj) { |
395 | @@ -2560,6 +2608,9 @@ int drm_mode_gamma_get_ioctl(struct drm_device *dev, |
396 | int size; |
397 | int ret = 0; |
398 | |
399 | + if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
400 | + return -EINVAL; |
401 | + |
402 | mutex_lock(&dev->mode_config.mutex); |
403 | obj = drm_mode_object_find(dev, crtc_lut->crtc_id, DRM_MODE_OBJECT_CRTC); |
404 | if (!obj) { |
405 | diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c |
406 | index ea1c4b0..c3c78ee 100644 |
407 | --- a/drivers/gpu/drm/drm_gem.c |
408 | +++ b/drivers/gpu/drm/drm_gem.c |
409 | @@ -498,11 +498,12 @@ EXPORT_SYMBOL(drm_gem_vm_open); |
410 | void drm_gem_vm_close(struct vm_area_struct *vma) |
411 | { |
412 | struct drm_gem_object *obj = vma->vm_private_data; |
413 | + struct drm_device *dev = obj->dev; |
414 | |
415 | - mutex_lock(&obj->dev->struct_mutex); |
416 | + mutex_lock(&dev->struct_mutex); |
417 | drm_vm_close_locked(vma); |
418 | drm_gem_object_unreference(obj); |
419 | - mutex_unlock(&obj->dev->struct_mutex); |
420 | + mutex_unlock(&dev->struct_mutex); |
421 | } |
422 | EXPORT_SYMBOL(drm_gem_vm_close); |
423 | |
424 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
425 | index 275ec6e..ecbe73d 100644 |
426 | --- a/drivers/gpu/drm/i915/i915_gem.c |
427 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
428 | @@ -1748,8 +1748,10 @@ i915_gem_request_remove_from_client(struct drm_i915_gem_request *request) |
429 | return; |
430 | |
431 | spin_lock(&file_priv->mm.lock); |
432 | - list_del(&request->client_list); |
433 | - request->file_priv = NULL; |
434 | + if (request->file_priv) { |
435 | + list_del(&request->client_list); |
436 | + request->file_priv = NULL; |
437 | + } |
438 | spin_unlock(&file_priv->mm.lock); |
439 | } |
440 | |
441 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
442 | index ee14b8a..41262f4 100644 |
443 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
444 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
445 | @@ -921,7 +921,11 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode |
446 | /* adjust pixel clock as needed */ |
447 | adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss); |
448 | |
449 | - if (ASIC_IS_AVIVO(rdev)) |
450 | + if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) |
451 | + /* TV seems to prefer the legacy algo on some boards */ |
452 | + radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, |
453 | + &ref_div, &post_div); |
454 | + else if (ASIC_IS_AVIVO(rdev)) |
455 | radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, |
456 | &ref_div, &post_div); |
457 | else |
458 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c |
459 | index 57bee7e..2bf9982 100644 |
460 | --- a/drivers/gpu/drm/radeon/radeon_combios.c |
461 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c |
462 | @@ -448,7 +448,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev, |
463 | |
464 | bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) |
465 | { |
466 | - int edid_info; |
467 | + int edid_info, size; |
468 | struct edid *edid; |
469 | unsigned char *raw; |
470 | edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE); |
471 | @@ -456,11 +456,12 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) |
472 | return false; |
473 | |
474 | raw = rdev->bios + edid_info; |
475 | - edid = kmalloc(EDID_LENGTH * (raw[0x7e] + 1), GFP_KERNEL); |
476 | + size = EDID_LENGTH * (raw[0x7e] + 1); |
477 | + edid = kmalloc(size, GFP_KERNEL); |
478 | if (edid == NULL) |
479 | return false; |
480 | |
481 | - memcpy((unsigned char *)edid, raw, EDID_LENGTH * (raw[0x7e] + 1)); |
482 | + memcpy((unsigned char *)edid, raw, size); |
483 | |
484 | if (!drm_edid_is_valid(edid)) { |
485 | kfree(edid); |
486 | @@ -468,14 +469,24 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) |
487 | } |
488 | |
489 | rdev->mode_info.bios_hardcoded_edid = edid; |
490 | + rdev->mode_info.bios_hardcoded_edid_size = size; |
491 | return true; |
492 | } |
493 | |
494 | struct edid * |
495 | radeon_combios_get_hardcoded_edid(struct radeon_device *rdev) |
496 | { |
497 | - if (rdev->mode_info.bios_hardcoded_edid) |
498 | - return rdev->mode_info.bios_hardcoded_edid; |
499 | + struct edid *edid; |
500 | + |
501 | + if (rdev->mode_info.bios_hardcoded_edid) { |
502 | + edid = kmalloc(rdev->mode_info.bios_hardcoded_edid_size, GFP_KERNEL); |
503 | + if (edid) { |
504 | + memcpy((unsigned char *)edid, |
505 | + (unsigned char *)rdev->mode_info.bios_hardcoded_edid, |
506 | + rdev->mode_info.bios_hardcoded_edid_size); |
507 | + return edid; |
508 | + } |
509 | + } |
510 | return NULL; |
511 | } |
512 | |
513 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c |
514 | index 8afaf7a..2cc2a68 100644 |
515 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c |
516 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
517 | @@ -626,6 +626,8 @@ static int radeon_vga_mode_valid(struct drm_connector *connector, |
518 | static enum drm_connector_status |
519 | radeon_vga_detect(struct drm_connector *connector, bool force) |
520 | { |
521 | + struct drm_device *dev = connector->dev; |
522 | + struct radeon_device *rdev = dev->dev_private; |
523 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
524 | struct drm_encoder *encoder; |
525 | struct drm_encoder_helper_funcs *encoder_funcs; |
526 | @@ -676,6 +678,17 @@ radeon_vga_detect(struct drm_connector *connector, bool force) |
527 | |
528 | if (ret == connector_status_connected) |
529 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); |
530 | + |
531 | + /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the |
532 | + * vbios to deal with KVMs. If we have one and are not able to detect a monitor |
533 | + * by other means, assume the CRT is connected and use that EDID. |
534 | + */ |
535 | + if ((!rdev->is_atom_bios) && |
536 | + (ret == connector_status_disconnected) && |
537 | + rdev->mode_info.bios_hardcoded_edid_size) { |
538 | + ret = connector_status_connected; |
539 | + } |
540 | + |
541 | radeon_connector_update_scratch_regs(connector, ret); |
542 | return ret; |
543 | } |
544 | @@ -787,6 +800,8 @@ static int radeon_dvi_get_modes(struct drm_connector *connector) |
545 | static enum drm_connector_status |
546 | radeon_dvi_detect(struct drm_connector *connector, bool force) |
547 | { |
548 | + struct drm_device *dev = connector->dev; |
549 | + struct radeon_device *rdev = dev->dev_private; |
550 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
551 | struct drm_encoder *encoder = NULL; |
552 | struct drm_encoder_helper_funcs *encoder_funcs; |
553 | @@ -826,8 +841,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) |
554 | * you don't really know what's connected to which port as both are digital. |
555 | */ |
556 | if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { |
557 | - struct drm_device *dev = connector->dev; |
558 | - struct radeon_device *rdev = dev->dev_private; |
559 | struct drm_connector *list_connector; |
560 | struct radeon_connector *list_radeon_connector; |
561 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { |
562 | @@ -892,6 +905,19 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) |
563 | ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true); |
564 | } |
565 | |
566 | + /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the |
567 | + * vbios to deal with KVMs. If we have one and are not able to detect a monitor |
568 | + * by other means, assume the DFP is connected and use that EDID. In most |
569 | + * cases the DVI port is actually a virtual KVM port connected to the service |
570 | + * processor. |
571 | + */ |
572 | + if ((!rdev->is_atom_bios) && |
573 | + (ret == connector_status_disconnected) && |
574 | + rdev->mode_info.bios_hardcoded_edid_size) { |
575 | + radeon_connector->use_digital = true; |
576 | + ret = connector_status_connected; |
577 | + } |
578 | + |
579 | out: |
580 | /* updated in get modes as well since we need to know if it's analog or digital */ |
581 | radeon_connector_update_scratch_regs(connector, ret); |
582 | diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h |
583 | index 2615e51..76614a7 100644 |
584 | --- a/drivers/gpu/drm/radeon/radeon_mode.h |
585 | +++ b/drivers/gpu/drm/radeon/radeon_mode.h |
586 | @@ -239,6 +239,7 @@ struct radeon_mode_info { |
587 | struct drm_property *underscan_vborder_property; |
588 | /* hardcoded DFP edid from BIOS */ |
589 | struct edid *bios_hardcoded_edid; |
590 | + int bios_hardcoded_edid_size; |
591 | |
592 | /* pointer to fbdev info structure */ |
593 | struct radeon_fbdev *rfbdev; |
594 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c |
595 | index a1e141e..d3d6ee1 100644 |
596 | --- a/drivers/idle/intel_idle.c |
597 | +++ b/drivers/idle/intel_idle.c |
598 | @@ -62,6 +62,7 @@ |
599 | #include <linux/notifier.h> |
600 | #include <linux/cpu.h> |
601 | #include <asm/mwait.h> |
602 | +#include <asm/msr.h> |
603 | |
604 | #define INTEL_IDLE_VERSION "0.4" |
605 | #define PREFIX "intel_idle: " |
606 | @@ -85,6 +86,12 @@ static int intel_idle(struct cpuidle_device *dev, struct cpuidle_state *state); |
607 | static struct cpuidle_state *cpuidle_state_table; |
608 | |
609 | /* |
610 | + * Hardware C-state auto-demotion may not always be optimal. |
611 | + * Indicate which enable bits to clear here. |
612 | + */ |
613 | +static unsigned long long auto_demotion_disable_flags; |
614 | + |
615 | +/* |
616 | * States are indexed by the cstate number, |
617 | * which is also the index into the MWAIT hint array. |
618 | * Thus C0 is a dummy. |
619 | @@ -276,6 +283,15 @@ static struct notifier_block setup_broadcast_notifier = { |
620 | .notifier_call = setup_broadcast_cpuhp_notify, |
621 | }; |
622 | |
623 | +static void auto_demotion_disable(void *dummy) |
624 | +{ |
625 | + unsigned long long msr_bits; |
626 | + |
627 | + rdmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); |
628 | + msr_bits &= ~auto_demotion_disable_flags; |
629 | + wrmsrl(MSR_NHM_SNB_PKG_CST_CFG_CTL, msr_bits); |
630 | +} |
631 | + |
632 | /* |
633 | * intel_idle_probe() |
634 | */ |
635 | @@ -319,11 +335,17 @@ static int intel_idle_probe(void) |
636 | case 0x25: /* Westmere */ |
637 | case 0x2C: /* Westmere */ |
638 | cpuidle_state_table = nehalem_cstates; |
639 | + auto_demotion_disable_flags = |
640 | + (NHM_C1_AUTO_DEMOTE | NHM_C3_AUTO_DEMOTE); |
641 | break; |
642 | |
643 | case 0x1C: /* 28 - Atom Processor */ |
644 | + cpuidle_state_table = atom_cstates; |
645 | + break; |
646 | + |
647 | case 0x26: /* 38 - Lincroft Atom Processor */ |
648 | cpuidle_state_table = atom_cstates; |
649 | + auto_demotion_disable_flags = ATM_LNC_C6_AUTO_DEMOTE; |
650 | break; |
651 | |
652 | case 0x2A: /* SNB */ |
653 | @@ -431,6 +453,8 @@ static int intel_idle_cpuidle_devices_init(void) |
654 | return -EIO; |
655 | } |
656 | } |
657 | + if (auto_demotion_disable_flags) |
658 | + smp_call_function(auto_demotion_disable, NULL, 1); |
659 | |
660 | return 0; |
661 | } |
662 | diff --git a/drivers/input/xen-kbdfront.c b/drivers/input/xen-kbdfront.c |
663 | index e0c024d..4ec0a98 100644 |
664 | --- a/drivers/input/xen-kbdfront.c |
665 | +++ b/drivers/input/xen-kbdfront.c |
666 | @@ -109,7 +109,7 @@ static irqreturn_t input_handler(int rq, void *dev_id) |
667 | static int __devinit xenkbd_probe(struct xenbus_device *dev, |
668 | const struct xenbus_device_id *id) |
669 | { |
670 | - int ret, i; |
671 | + int ret, i, abs; |
672 | struct xenkbd_info *info; |
673 | struct input_dev *kbd, *ptr; |
674 | |
675 | @@ -127,6 +127,11 @@ static int __devinit xenkbd_probe(struct xenbus_device *dev, |
676 | if (!info->page) |
677 | goto error_nomem; |
678 | |
679 | + if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-abs-pointer", "%d", &abs) < 0) |
680 | + abs = 0; |
681 | + if (abs) |
682 | + xenbus_printf(XBT_NIL, dev->nodename, "request-abs-pointer", "1"); |
683 | + |
684 | /* keyboard */ |
685 | kbd = input_allocate_device(); |
686 | if (!kbd) |
687 | @@ -136,11 +141,12 @@ static int __devinit xenkbd_probe(struct xenbus_device *dev, |
688 | kbd->id.bustype = BUS_PCI; |
689 | kbd->id.vendor = 0x5853; |
690 | kbd->id.product = 0xffff; |
691 | - kbd->evbit[0] = BIT(EV_KEY); |
692 | + |
693 | + __set_bit(EV_KEY, kbd->evbit); |
694 | for (i = KEY_ESC; i < KEY_UNKNOWN; i++) |
695 | - set_bit(i, kbd->keybit); |
696 | + __set_bit(i, kbd->keybit); |
697 | for (i = KEY_OK; i < KEY_MAX; i++) |
698 | - set_bit(i, kbd->keybit); |
699 | + __set_bit(i, kbd->keybit); |
700 | |
701 | ret = input_register_device(kbd); |
702 | if (ret) { |
703 | @@ -159,12 +165,20 @@ static int __devinit xenkbd_probe(struct xenbus_device *dev, |
704 | ptr->id.bustype = BUS_PCI; |
705 | ptr->id.vendor = 0x5853; |
706 | ptr->id.product = 0xfffe; |
707 | - ptr->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS); |
708 | + |
709 | + if (abs) { |
710 | + __set_bit(EV_ABS, ptr->evbit); |
711 | + input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0); |
712 | + input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0); |
713 | + } else { |
714 | + input_set_capability(ptr, EV_REL, REL_X); |
715 | + input_set_capability(ptr, EV_REL, REL_Y); |
716 | + } |
717 | + input_set_capability(ptr, EV_REL, REL_WHEEL); |
718 | + |
719 | + __set_bit(EV_KEY, ptr->evbit); |
720 | for (i = BTN_LEFT; i <= BTN_TASK; i++) |
721 | - set_bit(i, ptr->keybit); |
722 | - ptr->relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL); |
723 | - input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0); |
724 | - input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0); |
725 | + __set_bit(i, ptr->keybit); |
726 | |
727 | ret = input_register_device(ptr); |
728 | if (ret) { |
729 | @@ -271,7 +285,7 @@ static void xenkbd_backend_changed(struct xenbus_device *dev, |
730 | enum xenbus_state backend_state) |
731 | { |
732 | struct xenkbd_info *info = dev_get_drvdata(&dev->dev); |
733 | - int ret, val; |
734 | + int val; |
735 | |
736 | switch (backend_state) { |
737 | case XenbusStateInitialising: |
738 | @@ -284,17 +298,6 @@ static void xenkbd_backend_changed(struct xenbus_device *dev, |
739 | |
740 | case XenbusStateInitWait: |
741 | InitWait: |
742 | - ret = xenbus_scanf(XBT_NIL, info->xbdev->otherend, |
743 | - "feature-abs-pointer", "%d", &val); |
744 | - if (ret < 0) |
745 | - val = 0; |
746 | - if (val) { |
747 | - ret = xenbus_printf(XBT_NIL, info->xbdev->nodename, |
748 | - "request-abs-pointer", "1"); |
749 | - if (ret) |
750 | - printk(KERN_WARNING |
751 | - "xenkbd: can't request abs-pointer"); |
752 | - } |
753 | xenbus_switch_state(dev, XenbusStateConnected); |
754 | break; |
755 | |
756 | diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c |
757 | index a1e9dfb..6459b8c 100644 |
758 | --- a/drivers/media/video/uvc/uvc_driver.c |
759 | +++ b/drivers/media/video/uvc/uvc_driver.c |
760 | @@ -1264,6 +1264,14 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain, |
761 | |
762 | break; |
763 | |
764 | + case UVC_OTT_VENDOR_SPECIFIC: |
765 | + case UVC_OTT_DISPLAY: |
766 | + case UVC_OTT_MEDIA_TRANSPORT_OUTPUT: |
767 | + if (uvc_trace_param & UVC_TRACE_PROBE) |
768 | + printk(" OT %d", entity->id); |
769 | + |
770 | + break; |
771 | + |
772 | case UVC_TT_STREAMING: |
773 | if (UVC_ENTITY_IS_ITERM(entity)) { |
774 | if (uvc_trace_param & UVC_TRACE_PROBE) |
775 | diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c |
776 | index 5673d67..545c029 100644 |
777 | --- a/drivers/media/video/uvc/uvc_video.c |
778 | +++ b/drivers/media/video/uvc/uvc_video.c |
779 | @@ -89,15 +89,19 @@ int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, |
780 | static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, |
781 | struct uvc_streaming_control *ctrl) |
782 | { |
783 | - struct uvc_format *format; |
784 | + struct uvc_format *format = NULL; |
785 | struct uvc_frame *frame = NULL; |
786 | unsigned int i; |
787 | |
788 | - if (ctrl->bFormatIndex <= 0 || |
789 | - ctrl->bFormatIndex > stream->nformats) |
790 | - return; |
791 | + for (i = 0; i < stream->nformats; ++i) { |
792 | + if (stream->format[i].index == ctrl->bFormatIndex) { |
793 | + format = &stream->format[i]; |
794 | + break; |
795 | + } |
796 | + } |
797 | |
798 | - format = &stream->format[ctrl->bFormatIndex - 1]; |
799 | + if (format == NULL) |
800 | + return; |
801 | |
802 | for (i = 0; i < format->nframes; ++i) { |
803 | if (format->frame[i].bFrameIndex == ctrl->bFrameIndex) { |
804 | diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c |
805 | index cb23aa2..e610cfe 100644 |
806 | --- a/drivers/pci/hotplug/acpiphp_glue.c |
807 | +++ b/drivers/pci/hotplug/acpiphp_glue.c |
808 | @@ -212,6 +212,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) |
809 | |
810 | pdev = pci_get_slot(pbus, PCI_DEVFN(device, function)); |
811 | if (pdev) { |
812 | + pdev->current_state = PCI_D0; |
813 | slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON); |
814 | pci_dev_put(pdev); |
815 | } |
816 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
817 | index 4ab49d4..30bb8d0 100644 |
818 | --- a/drivers/usb/class/cdc-acm.c |
819 | +++ b/drivers/usb/class/cdc-acm.c |
820 | @@ -297,6 +297,8 @@ static void acm_ctrl_irq(struct urb *urb) |
821 | if (!ACM_READY(acm)) |
822 | goto exit; |
823 | |
824 | + usb_mark_last_busy(acm->dev); |
825 | + |
826 | data = (unsigned char *)(dr + 1); |
827 | switch (dr->bNotificationType) { |
828 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: |
829 | @@ -336,7 +338,6 @@ static void acm_ctrl_irq(struct urb *urb) |
830 | break; |
831 | } |
832 | exit: |
833 | - usb_mark_last_busy(acm->dev); |
834 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
835 | if (retval) |
836 | dev_err(&urb->dev->dev, "%s - usb_submit_urb failed with " |
837 | @@ -533,6 +534,8 @@ static void acm_softint(struct work_struct *work) |
838 | if (!ACM_READY(acm)) |
839 | return; |
840 | tty = tty_port_tty_get(&acm->port); |
841 | + if (!tty) |
842 | + return; |
843 | tty_wakeup(tty); |
844 | tty_kref_put(tty); |
845 | } |
846 | @@ -646,8 +649,10 @@ static void acm_port_down(struct acm *acm) |
847 | usb_kill_urb(acm->ctrlurb); |
848 | for (i = 0; i < ACM_NW; i++) |
849 | usb_kill_urb(acm->wb[i].urb); |
850 | + tasklet_disable(&acm->urb_task); |
851 | for (i = 0; i < nr; i++) |
852 | usb_kill_urb(acm->ru[i].urb); |
853 | + tasklet_enable(&acm->urb_task); |
854 | acm->control->needs_remote_wakeup = 0; |
855 | usb_autopm_put_interface(acm->control); |
856 | } |
857 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c |
858 | index 6ee4451..d0cd8b6 100644 |
859 | --- a/drivers/usb/class/cdc-wdm.c |
860 | +++ b/drivers/usb/class/cdc-wdm.c |
861 | @@ -281,7 +281,7 @@ static void cleanup(struct wdm_device *desc) |
862 | desc->sbuf, |
863 | desc->validity->transfer_dma); |
864 | usb_free_coherent(interface_to_usbdev(desc->intf), |
865 | - desc->wMaxCommand, |
866 | + desc->bMaxPacketSize0, |
867 | desc->inbuf, |
868 | desc->response->transfer_dma); |
869 | kfree(desc->orq); |
870 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
871 | index a7131ad..37518df 100644 |
872 | --- a/drivers/usb/core/devio.c |
873 | +++ b/drivers/usb/core/devio.c |
874 | @@ -802,7 +802,7 @@ static int proc_control(struct dev_state *ps, void __user *arg) |
875 | tbuf, ctrl.wLength, tmo); |
876 | usb_lock_device(dev); |
877 | snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE, |
878 | - tbuf, i); |
879 | + tbuf, max(i, 0)); |
880 | if ((i > 0) && ctrl.wLength) { |
881 | if (copy_to_user(ctrl.data, tbuf, i)) { |
882 | free_page((unsigned long)tbuf); |
883 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c |
884 | index 233c288..5add8b5 100644 |
885 | --- a/drivers/usb/host/ehci-q.c |
886 | +++ b/drivers/usb/host/ehci-q.c |
887 | @@ -315,7 +315,6 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) |
888 | int stopped; |
889 | unsigned count = 0; |
890 | u8 state; |
891 | - const __le32 halt = HALT_BIT(ehci); |
892 | struct ehci_qh_hw *hw = qh->hw; |
893 | |
894 | if (unlikely (list_empty (&qh->qtd_list))) |
895 | @@ -422,7 +421,6 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) |
896 | && !(qtd->hw_alt_next |
897 | & EHCI_LIST_END(ehci))) { |
898 | stopped = 1; |
899 | - goto halt; |
900 | } |
901 | |
902 | /* stop scanning when we reach qtds the hc is using */ |
903 | @@ -456,16 +454,6 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) |
904 | */ |
905 | ehci_clear_tt_buffer(ehci, qh, urb, token); |
906 | } |
907 | - |
908 | - /* force halt for unlinked or blocked qh, so we'll |
909 | - * patch the qh later and so that completions can't |
910 | - * activate it while we "know" it's stopped. |
911 | - */ |
912 | - if ((halt & hw->hw_token) == 0) { |
913 | -halt: |
914 | - hw->hw_token |= halt; |
915 | - wmb (); |
916 | - } |
917 | } |
918 | |
919 | /* unless we already know the urb's status, collect qtd status |
920 | diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c |
921 | index 4ff2158..9727daa 100644 |
922 | --- a/drivers/usb/misc/uss720.c |
923 | +++ b/drivers/usb/misc/uss720.c |
924 | @@ -177,12 +177,11 @@ static struct uss720_async_request *submit_async_request(struct parport_uss720_p |
925 | spin_lock_irqsave(&priv->asynclock, flags); |
926 | list_add_tail(&rq->asynclist, &priv->asynclist); |
927 | spin_unlock_irqrestore(&priv->asynclock, flags); |
928 | + kref_get(&rq->ref_count); |
929 | ret = usb_submit_urb(rq->urb, mem_flags); |
930 | - if (!ret) { |
931 | - kref_get(&rq->ref_count); |
932 | + if (!ret) |
933 | return rq; |
934 | - } |
935 | - kref_put(&rq->ref_count, destroy_async); |
936 | + destroy_async(&rq->ref_count); |
937 | err("submit_async_request submit_urb failed with %d", ret); |
938 | return NULL; |
939 | } |
940 | diff --git a/drivers/video/console/tileblit.c b/drivers/video/console/tileblit.c |
941 | index 0056a41..15e8e1a 100644 |
942 | --- a/drivers/video/console/tileblit.c |
943 | +++ b/drivers/video/console/tileblit.c |
944 | @@ -83,7 +83,7 @@ static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode, |
945 | int softback_lines, int fg, int bg) |
946 | { |
947 | struct fb_tilecursor cursor; |
948 | - int use_sw = (vc->vc_cursor_type & 0x01); |
949 | + int use_sw = (vc->vc_cursor_type & 0x10); |
950 | |
951 | cursor.sx = vc->vc_x; |
952 | cursor.sy = vc->vc_y; |
953 | diff --git a/fs/aio.c b/fs/aio.c |
954 | index 8c8f6c5..72b3eef 100644 |
955 | --- a/fs/aio.c |
956 | +++ b/fs/aio.c |
957 | @@ -512,7 +512,7 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req) |
958 | ctx->reqs_active--; |
959 | |
960 | if (unlikely(!ctx->reqs_active && ctx->dead)) |
961 | - wake_up(&ctx->wait); |
962 | + wake_up_all(&ctx->wait); |
963 | } |
964 | |
965 | static void aio_fput_routine(struct work_struct *data) |
966 | @@ -1233,7 +1233,7 @@ static void io_destroy(struct kioctx *ioctx) |
967 | * by other CPUs at this point. Right now, we rely on the |
968 | * locking done by the above calls to ensure this consistency. |
969 | */ |
970 | - wake_up(&ioctx->wait); |
971 | + wake_up_all(&ioctx->wait); |
972 | put_ioctx(ioctx); /* once for the lookup */ |
973 | } |
974 | |
975 | diff --git a/fs/dcache.c b/fs/dcache.c |
976 | index 23702a9..119d489 100644 |
977 | --- a/fs/dcache.c |
978 | +++ b/fs/dcache.c |
979 | @@ -1201,9 +1201,12 @@ struct dentry *d_obtain_alias(struct inode *inode) |
980 | spin_unlock(&tmp->d_lock); |
981 | |
982 | spin_unlock(&dcache_lock); |
983 | + security_d_instantiate(tmp, inode); |
984 | return tmp; |
985 | |
986 | out_iput: |
987 | + if (res && !IS_ERR(res)) |
988 | + security_d_instantiate(res, inode); |
989 | iput(inode); |
990 | return res; |
991 | } |
992 | diff --git a/fs/ext3/super.c b/fs/ext3/super.c |
993 | index acf8695..1dc91dd 100644 |
994 | --- a/fs/ext3/super.c |
995 | +++ b/fs/ext3/super.c |
996 | @@ -1440,6 +1440,13 @@ static void ext3_orphan_cleanup (struct super_block * sb, |
997 | return; |
998 | } |
999 | |
1000 | + /* Check if feature set allows readwrite operations */ |
1001 | + if (EXT3_HAS_RO_COMPAT_FEATURE(sb, ~EXT3_FEATURE_RO_COMPAT_SUPP)) { |
1002 | + ext3_msg(sb, KERN_INFO, "Skipping orphan cleanup due to " |
1003 | + "unknown ROCOMPAT features"); |
1004 | + return; |
1005 | + } |
1006 | + |
1007 | if (EXT3_SB(sb)->s_mount_state & EXT3_ERROR_FS) { |
1008 | if (es->s_last_orphan) |
1009 | jbd_debug(1, "Errors on filesystem, " |
1010 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
1011 | index 851eac3..288f7de 100644 |
1012 | --- a/fs/ext4/super.c |
1013 | +++ b/fs/ext4/super.c |
1014 | @@ -75,6 +75,7 @@ static void ext4_write_super(struct super_block *sb); |
1015 | static int ext4_freeze(struct super_block *sb); |
1016 | static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags, |
1017 | const char *dev_name, void *data); |
1018 | +static int ext4_feature_set_ok(struct super_block *sb, int readonly); |
1019 | static void ext4_destroy_lazyinit_thread(void); |
1020 | static void ext4_unregister_li_request(struct super_block *sb); |
1021 | static void ext4_clear_request_list(void); |
1022 | @@ -2107,6 +2108,13 @@ static void ext4_orphan_cleanup(struct super_block *sb, |
1023 | return; |
1024 | } |
1025 | |
1026 | + /* Check if feature set would not allow a r/w mount */ |
1027 | + if (!ext4_feature_set_ok(sb, 0)) { |
1028 | + ext4_msg(sb, KERN_INFO, "Skipping orphan cleanup due to " |
1029 | + "unknown ROCOMPAT features"); |
1030 | + return; |
1031 | + } |
1032 | + |
1033 | if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) { |
1034 | if (es->s_last_orphan) |
1035 | jbd_debug(1, "Errors on filesystem, " |
1036 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c |
1037 | index 10d648e..76ffb14 100644 |
1038 | --- a/fs/nfs/write.c |
1039 | +++ b/fs/nfs/write.c |
1040 | @@ -1214,13 +1214,17 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data) |
1041 | #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) |
1042 | static int nfs_commit_set_lock(struct nfs_inode *nfsi, int may_wait) |
1043 | { |
1044 | + int ret; |
1045 | + |
1046 | if (!test_and_set_bit(NFS_INO_COMMIT, &nfsi->flags)) |
1047 | return 1; |
1048 | - if (may_wait && !out_of_line_wait_on_bit_lock(&nfsi->flags, |
1049 | - NFS_INO_COMMIT, nfs_wait_bit_killable, |
1050 | - TASK_KILLABLE)) |
1051 | - return 1; |
1052 | - return 0; |
1053 | + if (!may_wait) |
1054 | + return 0; |
1055 | + ret = out_of_line_wait_on_bit_lock(&nfsi->flags, |
1056 | + NFS_INO_COMMIT, |
1057 | + nfs_wait_bit_killable, |
1058 | + TASK_KILLABLE); |
1059 | + return (ret < 0) ? ret : 1; |
1060 | } |
1061 | |
1062 | static void nfs_commit_clear_lock(struct nfs_inode *nfsi) |
1063 | @@ -1394,9 +1398,10 @@ int nfs_commit_inode(struct inode *inode, int how) |
1064 | { |
1065 | LIST_HEAD(head); |
1066 | int may_wait = how & FLUSH_SYNC; |
1067 | - int res = 0; |
1068 | + int res; |
1069 | |
1070 | - if (!nfs_commit_set_lock(NFS_I(inode), may_wait)) |
1071 | + res = nfs_commit_set_lock(NFS_I(inode), may_wait); |
1072 | + if (res <= 0) |
1073 | goto out_mark_dirty; |
1074 | spin_lock(&inode->i_lock); |
1075 | res = nfs_scan_commit(inode, &head, 0, 0); |
1076 | @@ -1405,12 +1410,14 @@ int nfs_commit_inode(struct inode *inode, int how) |
1077 | int error = nfs_commit_list(inode, &head, how); |
1078 | if (error < 0) |
1079 | return error; |
1080 | - if (may_wait) |
1081 | - wait_on_bit(&NFS_I(inode)->flags, NFS_INO_COMMIT, |
1082 | - nfs_wait_bit_killable, |
1083 | - TASK_KILLABLE); |
1084 | - else |
1085 | + if (!may_wait) |
1086 | goto out_mark_dirty; |
1087 | + error = wait_on_bit(&NFS_I(inode)->flags, |
1088 | + NFS_INO_COMMIT, |
1089 | + nfs_wait_bit_killable, |
1090 | + TASK_KILLABLE); |
1091 | + if (error < 0) |
1092 | + return error; |
1093 | } else |
1094 | nfs_commit_clear_lock(NFS_I(inode)); |
1095 | return res; |
1096 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
1097 | index 0cdfd02..ba16492 100644 |
1098 | --- a/fs/nfsd/nfs4proc.c |
1099 | +++ b/fs/nfsd/nfs4proc.c |
1100 | @@ -954,8 +954,8 @@ typedef __be32(*nfsd4op_func)(struct svc_rqst *, struct nfsd4_compound_state *, |
1101 | void *); |
1102 | enum nfsd4_op_flags { |
1103 | ALLOWED_WITHOUT_FH = 1 << 0, /* No current filehandle required */ |
1104 | - ALLOWED_ON_ABSENT_FS = 2 << 0, /* ops processed on absent fs */ |
1105 | - ALLOWED_AS_FIRST_OP = 3 << 0, /* ops reqired first in compound */ |
1106 | + ALLOWED_ON_ABSENT_FS = 1 << 1, /* ops processed on absent fs */ |
1107 | + ALLOWED_AS_FIRST_OP = 1 << 2, /* ops reqired first in compound */ |
1108 | }; |
1109 | |
1110 | struct nfsd4_operation { |
1111 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
1112 | index 116cab9..b517814 100644 |
1113 | --- a/fs/nfsd/nfs4state.c |
1114 | +++ b/fs/nfsd/nfs4state.c |
1115 | @@ -327,64 +327,6 @@ static struct list_head unconf_id_hashtbl[CLIENT_HASH_SIZE]; |
1116 | static struct list_head client_lru; |
1117 | static struct list_head close_lru; |
1118 | |
1119 | -static void unhash_generic_stateid(struct nfs4_stateid *stp) |
1120 | -{ |
1121 | - list_del(&stp->st_hash); |
1122 | - list_del(&stp->st_perfile); |
1123 | - list_del(&stp->st_perstateowner); |
1124 | -} |
1125 | - |
1126 | -static void free_generic_stateid(struct nfs4_stateid *stp) |
1127 | -{ |
1128 | - put_nfs4_file(stp->st_file); |
1129 | - kmem_cache_free(stateid_slab, stp); |
1130 | -} |
1131 | - |
1132 | -static void release_lock_stateid(struct nfs4_stateid *stp) |
1133 | -{ |
1134 | - struct file *file; |
1135 | - |
1136 | - unhash_generic_stateid(stp); |
1137 | - file = find_any_file(stp->st_file); |
1138 | - if (file) |
1139 | - locks_remove_posix(file, (fl_owner_t)stp->st_stateowner); |
1140 | - free_generic_stateid(stp); |
1141 | -} |
1142 | - |
1143 | -static void unhash_lockowner(struct nfs4_stateowner *sop) |
1144 | -{ |
1145 | - struct nfs4_stateid *stp; |
1146 | - |
1147 | - list_del(&sop->so_idhash); |
1148 | - list_del(&sop->so_strhash); |
1149 | - list_del(&sop->so_perstateid); |
1150 | - while (!list_empty(&sop->so_stateids)) { |
1151 | - stp = list_first_entry(&sop->so_stateids, |
1152 | - struct nfs4_stateid, st_perstateowner); |
1153 | - release_lock_stateid(stp); |
1154 | - } |
1155 | -} |
1156 | - |
1157 | -static void release_lockowner(struct nfs4_stateowner *sop) |
1158 | -{ |
1159 | - unhash_lockowner(sop); |
1160 | - nfs4_put_stateowner(sop); |
1161 | -} |
1162 | - |
1163 | -static void |
1164 | -release_stateid_lockowners(struct nfs4_stateid *open_stp) |
1165 | -{ |
1166 | - struct nfs4_stateowner *lock_sop; |
1167 | - |
1168 | - while (!list_empty(&open_stp->st_lockowners)) { |
1169 | - lock_sop = list_entry(open_stp->st_lockowners.next, |
1170 | - struct nfs4_stateowner, so_perstateid); |
1171 | - /* list_del(&open_stp->st_lockowners); */ |
1172 | - BUG_ON(lock_sop->so_is_open_owner); |
1173 | - release_lockowner(lock_sop); |
1174 | - } |
1175 | -} |
1176 | - |
1177 | /* |
1178 | * We store the NONE, READ, WRITE, and BOTH bits separately in the |
1179 | * st_{access,deny}_bmap field of the stateid, in order to track not |
1180 | @@ -457,13 +399,71 @@ static int nfs4_access_bmap_to_omode(struct nfs4_stateid *stp) |
1181 | return nfs4_access_to_omode(access); |
1182 | } |
1183 | |
1184 | -static void release_open_stateid(struct nfs4_stateid *stp) |
1185 | +static void unhash_generic_stateid(struct nfs4_stateid *stp) |
1186 | +{ |
1187 | + list_del(&stp->st_hash); |
1188 | + list_del(&stp->st_perfile); |
1189 | + list_del(&stp->st_perstateowner); |
1190 | +} |
1191 | + |
1192 | +static void free_generic_stateid(struct nfs4_stateid *stp) |
1193 | { |
1194 | int oflag = nfs4_access_bmap_to_omode(stp); |
1195 | |
1196 | + nfs4_file_put_access(stp->st_file, oflag); |
1197 | + put_nfs4_file(stp->st_file); |
1198 | + kmem_cache_free(stateid_slab, stp); |
1199 | +} |
1200 | + |
1201 | +static void release_lock_stateid(struct nfs4_stateid *stp) |
1202 | +{ |
1203 | + struct file *file; |
1204 | + |
1205 | + unhash_generic_stateid(stp); |
1206 | + file = find_any_file(stp->st_file); |
1207 | + if (file) |
1208 | + locks_remove_posix(file, (fl_owner_t)stp->st_stateowner); |
1209 | + free_generic_stateid(stp); |
1210 | +} |
1211 | + |
1212 | +static void unhash_lockowner(struct nfs4_stateowner *sop) |
1213 | +{ |
1214 | + struct nfs4_stateid *stp; |
1215 | + |
1216 | + list_del(&sop->so_idhash); |
1217 | + list_del(&sop->so_strhash); |
1218 | + list_del(&sop->so_perstateid); |
1219 | + while (!list_empty(&sop->so_stateids)) { |
1220 | + stp = list_first_entry(&sop->so_stateids, |
1221 | + struct nfs4_stateid, st_perstateowner); |
1222 | + release_lock_stateid(stp); |
1223 | + } |
1224 | +} |
1225 | + |
1226 | +static void release_lockowner(struct nfs4_stateowner *sop) |
1227 | +{ |
1228 | + unhash_lockowner(sop); |
1229 | + nfs4_put_stateowner(sop); |
1230 | +} |
1231 | + |
1232 | +static void |
1233 | +release_stateid_lockowners(struct nfs4_stateid *open_stp) |
1234 | +{ |
1235 | + struct nfs4_stateowner *lock_sop; |
1236 | + |
1237 | + while (!list_empty(&open_stp->st_lockowners)) { |
1238 | + lock_sop = list_entry(open_stp->st_lockowners.next, |
1239 | + struct nfs4_stateowner, so_perstateid); |
1240 | + /* list_del(&open_stp->st_lockowners); */ |
1241 | + BUG_ON(lock_sop->so_is_open_owner); |
1242 | + release_lockowner(lock_sop); |
1243 | + } |
1244 | +} |
1245 | + |
1246 | +static void release_open_stateid(struct nfs4_stateid *stp) |
1247 | +{ |
1248 | unhash_generic_stateid(stp); |
1249 | release_stateid_lockowners(stp); |
1250 | - nfs4_file_put_access(stp->st_file, oflag); |
1251 | free_generic_stateid(stp); |
1252 | } |
1253 | |
1254 | @@ -3661,6 +3661,7 @@ alloc_init_lock_stateid(struct nfs4_stateowner *sop, struct nfs4_file *fp, struc |
1255 | stp->st_stateid.si_stateownerid = sop->so_id; |
1256 | stp->st_stateid.si_fileid = fp->fi_id; |
1257 | stp->st_stateid.si_generation = 0; |
1258 | + stp->st_access_bmap = 0; |
1259 | stp->st_deny_bmap = open_stp->st_deny_bmap; |
1260 | stp->st_openstp = open_stp; |
1261 | |
1262 | @@ -3675,6 +3676,17 @@ check_lock_length(u64 offset, u64 length) |
1263 | LOFF_OVERFLOW(offset, length))); |
1264 | } |
1265 | |
1266 | +static void get_lock_access(struct nfs4_stateid *lock_stp, u32 access) |
1267 | +{ |
1268 | + struct nfs4_file *fp = lock_stp->st_file; |
1269 | + int oflag = nfs4_access_to_omode(access); |
1270 | + |
1271 | + if (test_bit(access, &lock_stp->st_access_bmap)) |
1272 | + return; |
1273 | + nfs4_file_get_access(fp, oflag); |
1274 | + __set_bit(access, &lock_stp->st_access_bmap); |
1275 | +} |
1276 | + |
1277 | /* |
1278 | * LOCK operation |
1279 | */ |
1280 | @@ -3691,7 +3703,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
1281 | struct file_lock conflock; |
1282 | __be32 status = 0; |
1283 | unsigned int strhashval; |
1284 | - unsigned int cmd; |
1285 | int err; |
1286 | |
1287 | dprintk("NFSD: nfsd4_lock: start=%Ld length=%Ld\n", |
1288 | @@ -3773,22 +3784,18 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
1289 | switch (lock->lk_type) { |
1290 | case NFS4_READ_LT: |
1291 | case NFS4_READW_LT: |
1292 | - if (find_readable_file(lock_stp->st_file)) { |
1293 | - nfs4_get_vfs_file(rqstp, fp, &cstate->current_fh, NFS4_SHARE_ACCESS_READ); |
1294 | - filp = find_readable_file(lock_stp->st_file); |
1295 | - } |
1296 | + filp = find_readable_file(lock_stp->st_file); |
1297 | + if (filp) |
1298 | + get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ); |
1299 | file_lock.fl_type = F_RDLCK; |
1300 | - cmd = F_SETLK; |
1301 | - break; |
1302 | + break; |
1303 | case NFS4_WRITE_LT: |
1304 | case NFS4_WRITEW_LT: |
1305 | - if (find_writeable_file(lock_stp->st_file)) { |
1306 | - nfs4_get_vfs_file(rqstp, fp, &cstate->current_fh, NFS4_SHARE_ACCESS_WRITE); |
1307 | - filp = find_writeable_file(lock_stp->st_file); |
1308 | - } |
1309 | + filp = find_writeable_file(lock_stp->st_file); |
1310 | + if (filp) |
1311 | + get_lock_access(lock_stp, NFS4_SHARE_ACCESS_WRITE); |
1312 | file_lock.fl_type = F_WRLCK; |
1313 | - cmd = F_SETLK; |
1314 | - break; |
1315 | + break; |
1316 | default: |
1317 | status = nfserr_inval; |
1318 | goto out; |
1319 | @@ -3812,7 +3819,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, |
1320 | * Note: locks.c uses the BKL to protect the inode's lock list. |
1321 | */ |
1322 | |
1323 | - err = vfs_lock_file(filp, cmd, &file_lock, &conflock); |
1324 | + err = vfs_lock_file(filp, F_SETLK, &file_lock, &conflock); |
1325 | switch (-err) { |
1326 | case 0: /* success! */ |
1327 | update_stateid(&lock_stp->st_stateid); |
1328 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
1329 | index 5cf8fa3..883fc4d 100644 |
1330 | --- a/fs/nfsd/nfs4xdr.c |
1331 | +++ b/fs/nfsd/nfs4xdr.c |
1332 | @@ -1107,7 +1107,7 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, |
1333 | |
1334 | u32 dummy; |
1335 | char *machine_name; |
1336 | - int i, j; |
1337 | + int i; |
1338 | int nr_secflavs; |
1339 | |
1340 | READ_BUF(16); |
1341 | @@ -1180,8 +1180,6 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, |
1342 | READ_BUF(4); |
1343 | READ32(dummy); |
1344 | READ_BUF(dummy * 4); |
1345 | - for (j = 0; j < dummy; ++j) |
1346 | - READ32(dummy); |
1347 | break; |
1348 | case RPC_AUTH_GSS: |
1349 | dprintk("RPC_AUTH_GSS callback secflavor " |
1350 | @@ -1197,7 +1195,6 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, |
1351 | READ_BUF(4); |
1352 | READ32(dummy); |
1353 | READ_BUF(dummy); |
1354 | - p += XDR_QUADLEN(dummy); |
1355 | break; |
1356 | default: |
1357 | dprintk("Illegal callback secflavor\n"); |
1358 | diff --git a/fs/proc/array.c b/fs/proc/array.c |
1359 | index 3d88fe1..9e5f430 100644 |
1360 | --- a/fs/proc/array.c |
1361 | +++ b/fs/proc/array.c |
1362 | @@ -489,8 +489,8 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, |
1363 | vsize, |
1364 | mm ? get_mm_rss(mm) : 0, |
1365 | rsslim, |
1366 | - mm ? mm->start_code : 0, |
1367 | - mm ? mm->end_code : 0, |
1368 | + mm ? (permitted ? mm->start_code : 1) : 0, |
1369 | + mm ? (permitted ? mm->end_code : 1) : 0, |
1370 | (permitted && mm) ? mm->start_stack : 0, |
1371 | esp, |
1372 | eip, |
1373 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c |
1374 | index c126c83..ec93041 100644 |
1375 | --- a/fs/proc/task_mmu.c |
1376 | +++ b/fs/proc/task_mmu.c |
1377 | @@ -248,8 +248,8 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma) |
1378 | const char *name = arch_vma_name(vma); |
1379 | if (!name) { |
1380 | if (mm) { |
1381 | - if (vma->vm_start <= mm->start_brk && |
1382 | - vma->vm_end >= mm->brk) { |
1383 | + if (vma->vm_start <= mm->brk && |
1384 | + vma->vm_end >= mm->start_brk) { |
1385 | name = "[heap]"; |
1386 | } else if (vma->vm_start <= mm->start_stack && |
1387 | vma->vm_end >= mm->start_stack) { |
1388 | diff --git a/fs/super.c b/fs/super.c |
1389 | index ca69615..302356f 100644 |
1390 | --- a/fs/super.c |
1391 | +++ b/fs/super.c |
1392 | @@ -70,6 +70,7 @@ static struct super_block *alloc_super(struct file_system_type *type) |
1393 | #else |
1394 | INIT_LIST_HEAD(&s->s_files); |
1395 | #endif |
1396 | + s->s_bdi = &default_backing_dev_info; |
1397 | INIT_LIST_HEAD(&s->s_instances); |
1398 | INIT_HLIST_HEAD(&s->s_anon); |
1399 | INIT_LIST_HEAD(&s->s_inodes); |
1400 | @@ -996,6 +997,7 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void |
1401 | } |
1402 | BUG_ON(!mnt->mnt_sb); |
1403 | WARN_ON(!mnt->mnt_sb->s_bdi); |
1404 | + WARN_ON(mnt->mnt_sb->s_bdi == &default_backing_dev_info); |
1405 | mnt->mnt_sb->s_flags |= MS_BORN; |
1406 | |
1407 | error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata); |
1408 | diff --git a/fs/sync.c b/fs/sync.c |
1409 | index ba76b96..412dc89 100644 |
1410 | --- a/fs/sync.c |
1411 | +++ b/fs/sync.c |
1412 | @@ -33,7 +33,7 @@ static int __sync_filesystem(struct super_block *sb, int wait) |
1413 | * This should be safe, as we require bdi backing to actually |
1414 | * write out data in the first place |
1415 | */ |
1416 | - if (!sb->s_bdi || sb->s_bdi == &noop_backing_dev_info) |
1417 | + if (sb->s_bdi == &noop_backing_dev_info) |
1418 | return 0; |
1419 | |
1420 | if (sb->s_qcop && sb->s_qcop->quota_sync) |
1421 | @@ -79,7 +79,7 @@ EXPORT_SYMBOL_GPL(sync_filesystem); |
1422 | |
1423 | static void sync_one_sb(struct super_block *sb, void *arg) |
1424 | { |
1425 | - if (!(sb->s_flags & MS_RDONLY) && sb->s_bdi) |
1426 | + if (!(sb->s_flags & MS_RDONLY)) |
1427 | __sync_filesystem(sb, *(int *)arg); |
1428 | } |
1429 | /* |
1430 | diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h |
1431 | index 6628a50..9ebb1b8 100644 |
1432 | --- a/include/linux/ethtool.h |
1433 | +++ b/include/linux/ethtool.h |
1434 | @@ -13,6 +13,9 @@ |
1435 | #ifndef _LINUX_ETHTOOL_H |
1436 | #define _LINUX_ETHTOOL_H |
1437 | |
1438 | +#ifdef __KERNEL__ |
1439 | +#include <linux/compat.h> |
1440 | +#endif |
1441 | #include <linux/types.h> |
1442 | #include <linux/if_ether.h> |
1443 | |
1444 | @@ -449,6 +452,37 @@ struct ethtool_rxnfc { |
1445 | __u32 rule_locs[0]; |
1446 | }; |
1447 | |
1448 | +#ifdef __KERNEL__ |
1449 | +#ifdef CONFIG_COMPAT |
1450 | + |
1451 | +struct compat_ethtool_rx_flow_spec { |
1452 | + u32 flow_type; |
1453 | + union { |
1454 | + struct ethtool_tcpip4_spec tcp_ip4_spec; |
1455 | + struct ethtool_tcpip4_spec udp_ip4_spec; |
1456 | + struct ethtool_tcpip4_spec sctp_ip4_spec; |
1457 | + struct ethtool_ah_espip4_spec ah_ip4_spec; |
1458 | + struct ethtool_ah_espip4_spec esp_ip4_spec; |
1459 | + struct ethtool_usrip4_spec usr_ip4_spec; |
1460 | + struct ethhdr ether_spec; |
1461 | + u8 hdata[72]; |
1462 | + } h_u, m_u; |
1463 | + compat_u64 ring_cookie; |
1464 | + u32 location; |
1465 | +}; |
1466 | + |
1467 | +struct compat_ethtool_rxnfc { |
1468 | + u32 cmd; |
1469 | + u32 flow_type; |
1470 | + compat_u64 data; |
1471 | + struct compat_ethtool_rx_flow_spec fs; |
1472 | + u32 rule_cnt; |
1473 | + u32 rule_locs[0]; |
1474 | +}; |
1475 | + |
1476 | +#endif /* CONFIG_COMPAT */ |
1477 | +#endif /* __KERNEL__ */ |
1478 | + |
1479 | /** |
1480 | * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection |
1481 | * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR |
1482 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c |
1483 | index 66a416b..a328a75 100644 |
1484 | --- a/kernel/cgroup.c |
1485 | +++ b/kernel/cgroup.c |
1486 | @@ -1791,10 +1791,8 @@ int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk) |
1487 | |
1488 | /* Update the css_set linked lists if we're using them */ |
1489 | write_lock(&css_set_lock); |
1490 | - if (!list_empty(&tsk->cg_list)) { |
1491 | - list_del(&tsk->cg_list); |
1492 | - list_add(&tsk->cg_list, &newcg->tasks); |
1493 | - } |
1494 | + if (!list_empty(&tsk->cg_list)) |
1495 | + list_move(&tsk->cg_list, &newcg->tasks); |
1496 | write_unlock(&css_set_lock); |
1497 | |
1498 | for_each_subsys(root, ss) { |
1499 | @@ -3630,12 +3628,12 @@ again: |
1500 | spin_lock(&release_list_lock); |
1501 | set_bit(CGRP_REMOVED, &cgrp->flags); |
1502 | if (!list_empty(&cgrp->release_list)) |
1503 | - list_del(&cgrp->release_list); |
1504 | + list_del_init(&cgrp->release_list); |
1505 | spin_unlock(&release_list_lock); |
1506 | |
1507 | cgroup_lock_hierarchy(cgrp->root); |
1508 | /* delete this cgroup from parent->children */ |
1509 | - list_del(&cgrp->sibling); |
1510 | + list_del_init(&cgrp->sibling); |
1511 | cgroup_unlock_hierarchy(cgrp->root); |
1512 | |
1513 | spin_lock(&cgrp->dentry->d_lock); |
1514 | @@ -3856,7 +3854,7 @@ void cgroup_unload_subsys(struct cgroup_subsys *ss) |
1515 | subsys[ss->subsys_id] = NULL; |
1516 | |
1517 | /* remove subsystem from rootnode's list of subsystems */ |
1518 | - list_del(&ss->sibling); |
1519 | + list_del_init(&ss->sibling); |
1520 | |
1521 | /* |
1522 | * disentangle the css from all css_sets attached to the dummytop. as |
1523 | @@ -4230,7 +4228,7 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks) |
1524 | if (!list_empty(&tsk->cg_list)) { |
1525 | write_lock(&css_set_lock); |
1526 | if (!list_empty(&tsk->cg_list)) |
1527 | - list_del(&tsk->cg_list); |
1528 | + list_del_init(&tsk->cg_list); |
1529 | write_unlock(&css_set_lock); |
1530 | } |
1531 | |
1532 | diff --git a/kernel/perf_event.c b/kernel/perf_event.c |
1533 | index ee489d0..a176dfb 100644 |
1534 | --- a/kernel/perf_event.c |
1535 | +++ b/kernel/perf_event.c |
1536 | @@ -5863,17 +5863,20 @@ __perf_event_exit_task(struct perf_event *child_event, |
1537 | struct perf_event_context *child_ctx, |
1538 | struct task_struct *child) |
1539 | { |
1540 | - struct perf_event *parent_event; |
1541 | + if (child_event->parent) { |
1542 | + raw_spin_lock_irq(&child_ctx->lock); |
1543 | + perf_group_detach(child_event); |
1544 | + raw_spin_unlock_irq(&child_ctx->lock); |
1545 | + } |
1546 | |
1547 | perf_event_remove_from_context(child_event); |
1548 | |
1549 | - parent_event = child_event->parent; |
1550 | /* |
1551 | - * It can happen that parent exits first, and has events |
1552 | + * It can happen that the parent exits first, and has events |
1553 | * that are still around due to the child reference. These |
1554 | - * events need to be zapped - but otherwise linger. |
1555 | + * events need to be zapped. |
1556 | */ |
1557 | - if (parent_event) { |
1558 | + if (child_event->parent) { |
1559 | sync_child_event(child_event, child); |
1560 | free_event(child_event); |
1561 | } |
1562 | diff --git a/kernel/signal.c b/kernel/signal.c |
1563 | index 4e3cff1..3175186 100644 |
1564 | --- a/kernel/signal.c |
1565 | +++ b/kernel/signal.c |
1566 | @@ -2421,9 +2421,13 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig, |
1567 | return -EFAULT; |
1568 | |
1569 | /* Not even root can pretend to send signals from the kernel. |
1570 | - Nor can they impersonate a kill(), which adds source info. */ |
1571 | - if (info.si_code >= 0) |
1572 | + * Nor can they impersonate a kill()/tgkill(), which adds source info. |
1573 | + */ |
1574 | + if (info.si_code != SI_QUEUE) { |
1575 | + /* We used to allow any < 0 si_code */ |
1576 | + WARN_ON_ONCE(info.si_code < 0); |
1577 | return -EPERM; |
1578 | + } |
1579 | info.si_signo = sig; |
1580 | |
1581 | /* POSIX.1b doesn't mention process groups. */ |
1582 | @@ -2437,9 +2441,13 @@ long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info) |
1583 | return -EINVAL; |
1584 | |
1585 | /* Not even root can pretend to send signals from the kernel. |
1586 | - Nor can they impersonate a kill(), which adds source info. */ |
1587 | - if (info->si_code >= 0) |
1588 | + * Nor can they impersonate a kill()/tgkill(), which adds source info. |
1589 | + */ |
1590 | + if (info->si_code != SI_QUEUE) { |
1591 | + /* We used to allow any < 0 si_code */ |
1592 | + WARN_ON_ONCE(info->si_code < 0); |
1593 | return -EPERM; |
1594 | + } |
1595 | info->si_signo = sig; |
1596 | |
1597 | return do_send_specific(tgid, pid, sig, info); |
1598 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
1599 | index 4e17828..b44b1b0 100644 |
1600 | --- a/kernel/sysctl.c |
1601 | +++ b/kernel/sysctl.c |
1602 | @@ -168,6 +168,11 @@ static int proc_taint(struct ctl_table *table, int write, |
1603 | void __user *buffer, size_t *lenp, loff_t *ppos); |
1604 | #endif |
1605 | |
1606 | +#ifdef CONFIG_PRINTK |
1607 | +static int proc_dmesg_restrict(struct ctl_table *table, int write, |
1608 | + void __user *buffer, size_t *lenp, loff_t *ppos); |
1609 | +#endif |
1610 | + |
1611 | #ifdef CONFIG_MAGIC_SYSRQ |
1612 | /* Note: sysrq code uses it's own private copy */ |
1613 | static int __sysrq_enabled = SYSRQ_DEFAULT_ENABLE; |
1614 | @@ -1469,7 +1474,7 @@ static struct ctl_table fs_table[] = { |
1615 | .data = &suid_dumpable, |
1616 | .maxlen = sizeof(int), |
1617 | .mode = 0644, |
1618 | - .proc_handler = proc_dointvec_minmax, |
1619 | + .proc_handler = proc_dmesg_restrict, |
1620 | .extra1 = &zero, |
1621 | .extra2 = &two, |
1622 | }, |
1623 | @@ -2400,6 +2405,17 @@ static int proc_taint(struct ctl_table *table, int write, |
1624 | return err; |
1625 | } |
1626 | |
1627 | +#ifdef CONFIG_PRINTK |
1628 | +static int proc_dmesg_restrict(struct ctl_table *table, int write, |
1629 | + void __user *buffer, size_t *lenp, loff_t *ppos) |
1630 | +{ |
1631 | + if (write && !capable(CAP_SYS_ADMIN)) |
1632 | + return -EPERM; |
1633 | + |
1634 | + return proc_dointvec_minmax(table, write, buffer, lenp, ppos); |
1635 | +} |
1636 | +#endif |
1637 | + |
1638 | struct do_proc_dointvec_minmax_conv_param { |
1639 | int *min; |
1640 | int *max; |
1641 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c |
1642 | index 027100d..8e4ed88 100644 |
1643 | --- a/mm/backing-dev.c |
1644 | +++ b/mm/backing-dev.c |
1645 | @@ -604,7 +604,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) |
1646 | spin_lock(&sb_lock); |
1647 | list_for_each_entry(sb, &super_blocks, s_list) { |
1648 | if (sb->s_bdi == bdi) |
1649 | - sb->s_bdi = NULL; |
1650 | + sb->s_bdi = &default_backing_dev_info; |
1651 | } |
1652 | spin_unlock(&sb_lock); |
1653 | } |
1654 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c |
1655 | index 7dcca55..33b5861 100644 |
1656 | --- a/mm/oom_kill.c |
1657 | +++ b/mm/oom_kill.c |
1658 | @@ -31,6 +31,7 @@ |
1659 | #include <linux/memcontrol.h> |
1660 | #include <linux/mempolicy.h> |
1661 | #include <linux/security.h> |
1662 | +#include <linux/ptrace.h> |
1663 | |
1664 | int sysctl_panic_on_oom; |
1665 | int sysctl_oom_kill_allocating_task; |
1666 | @@ -292,13 +293,15 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
1667 | unsigned long totalpages, struct mem_cgroup *mem, |
1668 | const nodemask_t *nodemask) |
1669 | { |
1670 | - struct task_struct *p; |
1671 | + struct task_struct *g, *p; |
1672 | struct task_struct *chosen = NULL; |
1673 | *ppoints = 0; |
1674 | |
1675 | - for_each_process(p) { |
1676 | + do_each_thread(g, p) { |
1677 | unsigned int points; |
1678 | |
1679 | + if (!p->mm) |
1680 | + continue; |
1681 | if (oom_unkillable_task(p, mem, nodemask)) |
1682 | continue; |
1683 | |
1684 | @@ -314,22 +317,29 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
1685 | if (test_tsk_thread_flag(p, TIF_MEMDIE)) |
1686 | return ERR_PTR(-1UL); |
1687 | |
1688 | - /* |
1689 | - * This is in the process of releasing memory so wait for it |
1690 | - * to finish before killing some other task by mistake. |
1691 | - * |
1692 | - * However, if p is the current task, we allow the 'kill' to |
1693 | - * go ahead if it is exiting: this will simply set TIF_MEMDIE, |
1694 | - * which will allow it to gain access to memory reserves in |
1695 | - * the process of exiting and releasing its resources. |
1696 | - * Otherwise we could get an easy OOM deadlock. |
1697 | - */ |
1698 | - if (thread_group_empty(p) && (p->flags & PF_EXITING) && p->mm) { |
1699 | - if (p != current) |
1700 | - return ERR_PTR(-1UL); |
1701 | - |
1702 | - chosen = p; |
1703 | - *ppoints = 1000; |
1704 | + if (p->flags & PF_EXITING) { |
1705 | + /* |
1706 | + * If p is the current task and is in the process of |
1707 | + * releasing memory, we allow the "kill" to set |
1708 | + * TIF_MEMDIE, which will allow it to gain access to |
1709 | + * memory reserves. Otherwise, it may stall forever. |
1710 | + * |
1711 | + * The loop isn't broken here, however, in case other |
1712 | + * threads are found to have already been oom killed. |
1713 | + */ |
1714 | + if (p == current) { |
1715 | + chosen = p; |
1716 | + *ppoints = 1000; |
1717 | + } else { |
1718 | + /* |
1719 | + * If this task is not being ptraced on exit, |
1720 | + * then wait for it to finish before killing |
1721 | + * some other task unnecessarily. |
1722 | + */ |
1723 | + if (!(task_ptrace(p->group_leader) & |
1724 | + PT_TRACE_EXIT)) |
1725 | + return ERR_PTR(-1UL); |
1726 | + } |
1727 | } |
1728 | |
1729 | points = oom_badness(p, mem, nodemask, totalpages); |
1730 | @@ -337,7 +347,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
1731 | chosen = p; |
1732 | *ppoints = points; |
1733 | } |
1734 | - } |
1735 | + } while_each_thread(g, p); |
1736 | |
1737 | return chosen; |
1738 | } |
1739 | @@ -491,6 +501,8 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
1740 | list_for_each_entry(child, &t->children, sibling) { |
1741 | unsigned int child_points; |
1742 | |
1743 | + if (child->mm == p->mm) |
1744 | + continue; |
1745 | /* |
1746 | * oom_badness() returns 0 if the thread is unkillable |
1747 | */ |
1748 | diff --git a/mm/shmem.c b/mm/shmem.c |
1749 | index 47fdeeb..76e971c 100644 |
1750 | --- a/mm/shmem.c |
1751 | +++ b/mm/shmem.c |
1752 | @@ -2784,5 +2784,6 @@ int shmem_zero_setup(struct vm_area_struct *vma) |
1753 | fput(vma->vm_file); |
1754 | vma->vm_file = file; |
1755 | vma->vm_ops = &shmem_vm_ops; |
1756 | + vma->vm_flags |= VM_CAN_NONLINEAR; |
1757 | return 0; |
1758 | } |
1759 | diff --git a/mm/slab.c b/mm/slab.c |
1760 | index b1e40da..e548c91 100644 |
1761 | --- a/mm/slab.c |
1762 | +++ b/mm/slab.c |
1763 | @@ -2288,8 +2288,8 @@ kmem_cache_create (const char *name, size_t size, size_t align, |
1764 | if (ralign < align) { |
1765 | ralign = align; |
1766 | } |
1767 | - /* disable debug if not aligning with REDZONE_ALIGN */ |
1768 | - if (ralign & (__alignof__(unsigned long long) - 1)) |
1769 | + /* disable debug if necessary */ |
1770 | + if (ralign > __alignof__(unsigned long long)) |
1771 | flags &= ~(SLAB_RED_ZONE | SLAB_STORE_USER); |
1772 | /* |
1773 | * 4) Store it. |
1774 | @@ -2315,8 +2315,8 @@ kmem_cache_create (const char *name, size_t size, size_t align, |
1775 | */ |
1776 | if (flags & SLAB_RED_ZONE) { |
1777 | /* add space for red zone words */ |
1778 | - cachep->obj_offset += align; |
1779 | - size += align + sizeof(unsigned long long); |
1780 | + cachep->obj_offset += sizeof(unsigned long long); |
1781 | + size += 2 * sizeof(unsigned long long); |
1782 | } |
1783 | if (flags & SLAB_STORE_USER) { |
1784 | /* user store requires one word storage behind the end of |
1785 | diff --git a/mm/swapfile.c b/mm/swapfile.c |
1786 | index 67ddaaf..5cd34e6 100644 |
1787 | --- a/mm/swapfile.c |
1788 | +++ b/mm/swapfile.c |
1789 | @@ -2146,8 +2146,13 @@ bad_swap_2: |
1790 | p->flags = 0; |
1791 | spin_unlock(&swap_lock); |
1792 | vfree(swap_map); |
1793 | - if (swap_file) |
1794 | + if (swap_file) { |
1795 | + if (did_down) { |
1796 | + mutex_unlock(&inode->i_mutex); |
1797 | + did_down = 0; |
1798 | + } |
1799 | filp_close(swap_file, NULL); |
1800 | + } |
1801 | out: |
1802 | if (page && !IS_ERR(page)) { |
1803 | kunmap(page); |
1804 | diff --git a/net/socket.c b/net/socket.c |
1805 | index 088fb3f..01ca953 100644 |
1806 | --- a/net/socket.c |
1807 | +++ b/net/socket.c |
1808 | @@ -2566,23 +2566,123 @@ static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32) |
1809 | |
1810 | static int ethtool_ioctl(struct net *net, struct compat_ifreq __user *ifr32) |
1811 | { |
1812 | + struct compat_ethtool_rxnfc __user *compat_rxnfc; |
1813 | + bool convert_in = false, convert_out = false; |
1814 | + size_t buf_size = ALIGN(sizeof(struct ifreq), 8); |
1815 | + struct ethtool_rxnfc __user *rxnfc; |
1816 | struct ifreq __user *ifr; |
1817 | + u32 rule_cnt = 0, actual_rule_cnt; |
1818 | + u32 ethcmd; |
1819 | u32 data; |
1820 | - void __user *datap; |
1821 | + int ret; |
1822 | + |
1823 | + if (get_user(data, &ifr32->ifr_ifru.ifru_data)) |
1824 | + return -EFAULT; |
1825 | |
1826 | - ifr = compat_alloc_user_space(sizeof(*ifr)); |
1827 | + compat_rxnfc = compat_ptr(data); |
1828 | |
1829 | - if (copy_in_user(&ifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ)) |
1830 | + if (get_user(ethcmd, &compat_rxnfc->cmd)) |
1831 | return -EFAULT; |
1832 | |
1833 | - if (get_user(data, &ifr32->ifr_ifru.ifru_data)) |
1834 | + /* Most ethtool structures are defined without padding. |
1835 | + * Unfortunately struct ethtool_rxnfc is an exception. |
1836 | + */ |
1837 | + switch (ethcmd) { |
1838 | + default: |
1839 | + break; |
1840 | + case ETHTOOL_GRXCLSRLALL: |
1841 | + /* Buffer size is variable */ |
1842 | + if (get_user(rule_cnt, &compat_rxnfc->rule_cnt)) |
1843 | + return -EFAULT; |
1844 | + if (rule_cnt > KMALLOC_MAX_SIZE / sizeof(u32)) |
1845 | + return -ENOMEM; |
1846 | + buf_size += rule_cnt * sizeof(u32); |
1847 | + /* fall through */ |
1848 | + case ETHTOOL_GRXRINGS: |
1849 | + case ETHTOOL_GRXCLSRLCNT: |
1850 | + case ETHTOOL_GRXCLSRULE: |
1851 | + convert_out = true; |
1852 | + /* fall through */ |
1853 | + case ETHTOOL_SRXCLSRLDEL: |
1854 | + case ETHTOOL_SRXCLSRLINS: |
1855 | + buf_size += sizeof(struct ethtool_rxnfc); |
1856 | + convert_in = true; |
1857 | + break; |
1858 | + } |
1859 | + |
1860 | + ifr = compat_alloc_user_space(buf_size); |
1861 | + rxnfc = (void *)ifr + ALIGN(sizeof(struct ifreq), 8); |
1862 | + |
1863 | + if (copy_in_user(&ifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ)) |
1864 | return -EFAULT; |
1865 | |
1866 | - datap = compat_ptr(data); |
1867 | - if (put_user(datap, &ifr->ifr_ifru.ifru_data)) |
1868 | + if (put_user(convert_in ? rxnfc : compat_ptr(data), |
1869 | + &ifr->ifr_ifru.ifru_data)) |
1870 | return -EFAULT; |
1871 | |
1872 | - return dev_ioctl(net, SIOCETHTOOL, ifr); |
1873 | + if (convert_in) { |
1874 | + /* We expect there to be holes between fs.m_u and |
1875 | + * fs.ring_cookie and at the end of fs, but nowhere else. |
1876 | + */ |
1877 | + BUILD_BUG_ON(offsetof(struct compat_ethtool_rxnfc, fs.m_u) + |
1878 | + sizeof(compat_rxnfc->fs.m_u) != |
1879 | + offsetof(struct ethtool_rxnfc, fs.m_u) + |
1880 | + sizeof(rxnfc->fs.m_u)); |
1881 | + BUILD_BUG_ON( |
1882 | + offsetof(struct compat_ethtool_rxnfc, fs.location) - |
1883 | + offsetof(struct compat_ethtool_rxnfc, fs.ring_cookie) != |
1884 | + offsetof(struct ethtool_rxnfc, fs.location) - |
1885 | + offsetof(struct ethtool_rxnfc, fs.ring_cookie)); |
1886 | + |
1887 | + if (copy_in_user(rxnfc, compat_rxnfc, |
1888 | + (void *)(&rxnfc->fs.m_u + 1) - |
1889 | + (void *)rxnfc) || |
1890 | + copy_in_user(&rxnfc->fs.ring_cookie, |
1891 | + &compat_rxnfc->fs.ring_cookie, |
1892 | + (void *)(&rxnfc->fs.location + 1) - |
1893 | + (void *)&rxnfc->fs.ring_cookie) || |
1894 | + copy_in_user(&rxnfc->rule_cnt, &compat_rxnfc->rule_cnt, |
1895 | + sizeof(rxnfc->rule_cnt))) |
1896 | + return -EFAULT; |
1897 | + } |
1898 | + |
1899 | + ret = dev_ioctl(net, SIOCETHTOOL, ifr); |
1900 | + if (ret) |
1901 | + return ret; |
1902 | + |
1903 | + if (convert_out) { |
1904 | + if (copy_in_user(compat_rxnfc, rxnfc, |
1905 | + (const void *)(&rxnfc->fs.m_u + 1) - |
1906 | + (const void *)rxnfc) || |
1907 | + copy_in_user(&compat_rxnfc->fs.ring_cookie, |
1908 | + &rxnfc->fs.ring_cookie, |
1909 | + (const void *)(&rxnfc->fs.location + 1) - |
1910 | + (const void *)&rxnfc->fs.ring_cookie) || |
1911 | + copy_in_user(&compat_rxnfc->rule_cnt, &rxnfc->rule_cnt, |
1912 | + sizeof(rxnfc->rule_cnt))) |
1913 | + return -EFAULT; |
1914 | + |
1915 | + if (ethcmd == ETHTOOL_GRXCLSRLALL) { |
1916 | + /* As an optimisation, we only copy the actual |
1917 | + * number of rules that the underlying |
1918 | + * function returned. Since Mallory might |
1919 | + * change the rule count in user memory, we |
1920 | + * check that it is less than the rule count |
1921 | + * originally given (as the user buffer size), |
1922 | + * which has been range-checked. |
1923 | + */ |
1924 | + if (get_user(actual_rule_cnt, &rxnfc->rule_cnt)) |
1925 | + return -EFAULT; |
1926 | + if (actual_rule_cnt < rule_cnt) |
1927 | + rule_cnt = actual_rule_cnt; |
1928 | + if (copy_in_user(&compat_rxnfc->rule_locs[0], |
1929 | + &rxnfc->rule_locs[0], |
1930 | + rule_cnt * sizeof(u32))) |
1931 | + return -EFAULT; |
1932 | + } |
1933 | + } |
1934 | + |
1935 | + return 0; |
1936 | } |
1937 | |
1938 | static int compat_siocwandev(struct net *net, struct compat_ifreq __user *uifr32) |
1939 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
1940 | index 3ad452b..2e88619 100644 |
1941 | --- a/net/sunrpc/xprtsock.c |
1942 | +++ b/net/sunrpc/xprtsock.c |
1943 | @@ -710,6 +710,8 @@ static void xs_reset_transport(struct sock_xprt *transport) |
1944 | if (sk == NULL) |
1945 | return; |
1946 | |
1947 | + transport->srcport = 0; |
1948 | + |
1949 | write_lock_bh(&sk->sk_callback_lock); |
1950 | transport->inet = NULL; |
1951 | transport->sock = NULL; |
1952 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
1953 | index 797a16c..228d6fb 100644 |
1954 | --- a/sound/pci/hda/patch_sigmatel.c |
1955 | +++ b/sound/pci/hda/patch_sigmatel.c |
1956 | @@ -94,6 +94,7 @@ enum { |
1957 | STAC_92HD83XXX_REF, |
1958 | STAC_92HD83XXX_PWR_REF, |
1959 | STAC_DELL_S14, |
1960 | + STAC_DELL_E5520M, |
1961 | STAC_92HD83XXX_HP, |
1962 | STAC_HP_DV7_4000, |
1963 | STAC_92HD83XXX_MODELS |
1964 | @@ -1649,6 +1650,13 @@ static unsigned int dell_s14_pin_configs[10] = { |
1965 | 0x40f000f0, 0x40f000f0, |
1966 | }; |
1967 | |
1968 | +/* Switch int mic from 0x20 to 0x11 */ |
1969 | +static unsigned int dell_e5520m_pin_configs[10] = { |
1970 | + 0x04a11020, 0x0421101f, 0x400000f0, 0x90170110, |
1971 | + 0x23011050, 0x23a1102e, 0x400000f3, 0xd5a30130, |
1972 | + 0x400000f0, 0x40f000f0, |
1973 | +}; |
1974 | + |
1975 | static unsigned int hp_dv7_4000_pin_configs[10] = { |
1976 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, |
1977 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, |
1978 | @@ -1659,6 +1667,7 @@ static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { |
1979 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, |
1980 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, |
1981 | [STAC_DELL_S14] = dell_s14_pin_configs, |
1982 | + [STAC_DELL_E5520M] = dell_e5520m_pin_configs, |
1983 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, |
1984 | }; |
1985 | |
1986 | @@ -1667,6 +1676,7 @@ static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { |
1987 | [STAC_92HD83XXX_REF] = "ref", |
1988 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", |
1989 | [STAC_DELL_S14] = "dell-s14", |
1990 | + [STAC_DELL_E5520M] = "dell-e5520m", |
1991 | [STAC_92HD83XXX_HP] = "hp", |
1992 | [STAC_HP_DV7_4000] = "hp-dv7-4000", |
1993 | }; |
1994 | @@ -1679,6 +1689,14 @@ static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { |
1995 | "DFI LanParty", STAC_92HD83XXX_REF), |
1996 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, |
1997 | "unknown Dell", STAC_DELL_S14), |
1998 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x049a, |
1999 | + "Dell E5520", STAC_DELL_E5520M), |
2000 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x049b, |
2001 | + "Dell E5420", STAC_DELL_E5520M), |
2002 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x04eb, |
2003 | + "Dell E5420m", STAC_DELL_E5520M), |
2004 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x04ec, |
2005 | + "Dell E5520m", STAC_DELL_E5520M), |
2006 | SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, |
2007 | "HP", STAC_92HD83XXX_HP), |
2008 | {} /* terminator */ |
2009 | diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c |
2010 | index e1b775d..d45ba2d 100644 |
2011 | --- a/sound/pci/hda/patch_via.c |
2012 | +++ b/sound/pci/hda/patch_via.c |
2013 | @@ -159,6 +159,7 @@ struct via_spec { |
2014 | #endif |
2015 | }; |
2016 | |
2017 | +static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec); |
2018 | static struct via_spec * via_new_spec(struct hda_codec *codec) |
2019 | { |
2020 | struct via_spec *spec; |
2021 | @@ -169,6 +170,10 @@ static struct via_spec * via_new_spec(struct hda_codec *codec) |
2022 | |
2023 | codec->spec = spec; |
2024 | spec->codec = codec; |
2025 | + spec->codec_type = get_codec_type(codec); |
2026 | + /* VT1708BCE & VT1708S are almost same */ |
2027 | + if (spec->codec_type == VT1708BCE) |
2028 | + spec->codec_type = VT1708S; |
2029 | return spec; |
2030 | } |
2031 | |
2032 | @@ -1102,6 +1107,7 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol, |
2033 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
2034 | struct via_spec *spec = codec->spec; |
2035 | unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); |
2036 | + int ret; |
2037 | |
2038 | if (!spec->mux_nids[adc_idx]) |
2039 | return -EINVAL; |
2040 | @@ -1110,12 +1116,14 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol, |
2041 | AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0) |
2042 | snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, |
2043 | AC_VERB_SET_POWER_STATE, AC_PWRST_D0); |
2044 | - /* update jack power state */ |
2045 | - set_jack_power_state(codec); |
2046 | |
2047 | - return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, |
2048 | + ret = snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, |
2049 | spec->mux_nids[adc_idx], |
2050 | &spec->cur_mux[adc_idx]); |
2051 | + /* update jack power state */ |
2052 | + set_jack_power_state(codec); |
2053 | + |
2054 | + return ret; |
2055 | } |
2056 | |
2057 | static int via_independent_hp_info(struct snd_kcontrol *kcontrol, |
2058 | @@ -1189,8 +1197,16 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol, |
2059 | /* Get Independent Mode index of headphone pin widget */ |
2060 | spec->hp_independent_mode = spec->hp_independent_mode_index == pinsel |
2061 | ? 1 : 0; |
2062 | - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, pinsel); |
2063 | + if (spec->codec_type == VT1718S) |
2064 | + snd_hda_codec_write(codec, nid, 0, |
2065 | + AC_VERB_SET_CONNECT_SEL, pinsel ? 2 : 0); |
2066 | + else |
2067 | + snd_hda_codec_write(codec, nid, 0, |
2068 | + AC_VERB_SET_CONNECT_SEL, pinsel); |
2069 | |
2070 | + if (spec->codec_type == VT1812) |
2071 | + snd_hda_codec_write(codec, 0x35, 0, |
2072 | + AC_VERB_SET_CONNECT_SEL, pinsel); |
2073 | if (spec->multiout.hp_nid && spec->multiout.hp_nid |
2074 | != spec->multiout.dac_nids[HDA_FRONT]) |
2075 | snd_hda_codec_setup_stream(codec, spec->multiout.hp_nid, |
2076 | @@ -1209,6 +1225,8 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol, |
2077 | activate_ctl(codec, "Headphone Playback Switch", |
2078 | spec->hp_independent_mode); |
2079 | } |
2080 | + /* update jack power state */ |
2081 | + set_jack_power_state(codec); |
2082 | return 0; |
2083 | } |
2084 | |
2085 | @@ -1249,9 +1267,12 @@ static int via_hp_build(struct hda_codec *codec) |
2086 | break; |
2087 | } |
2088 | |
2089 | - nums = snd_hda_get_connections(codec, nid, conn, HDA_MAX_CONNECTIONS); |
2090 | - if (nums <= 1) |
2091 | - return 0; |
2092 | + if (spec->codec_type != VT1708) { |
2093 | + nums = snd_hda_get_connections(codec, nid, |
2094 | + conn, HDA_MAX_CONNECTIONS); |
2095 | + if (nums <= 1) |
2096 | + return 0; |
2097 | + } |
2098 | |
2099 | knew = via_clone_control(spec, &via_hp_mixer[0]); |
2100 | if (knew == NULL) |
2101 | @@ -1311,6 +1332,11 @@ static void mute_aa_path(struct hda_codec *codec, int mute) |
2102 | start_idx = 2; |
2103 | end_idx = 4; |
2104 | break; |
2105 | + case VT1718S: |
2106 | + nid_mixer = 0x21; |
2107 | + start_idx = 1; |
2108 | + end_idx = 3; |
2109 | + break; |
2110 | default: |
2111 | return; |
2112 | } |
2113 | @@ -2186,10 +2212,6 @@ static int via_init(struct hda_codec *codec) |
2114 | for (i = 0; i < spec->num_iverbs; i++) |
2115 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
2116 | |
2117 | - spec->codec_type = get_codec_type(codec); |
2118 | - if (spec->codec_type == VT1708BCE) |
2119 | - spec->codec_type = VT1708S; /* VT1708BCE & VT1708S are almost |
2120 | - same */ |
2121 | /* Lydia Add for EAPD enable */ |
2122 | if (!spec->dig_in_nid) { /* No Digital In connection */ |
2123 | if (spec->dig_in_pin) { |
2124 | @@ -2437,7 +2459,14 @@ static int vt_auto_create_analog_input_ctls(struct hda_codec *codec, |
2125 | else |
2126 | type_idx = 0; |
2127 | label = hda_get_autocfg_input_label(codec, cfg, i); |
2128 | - err = via_new_analog_input(spec, label, type_idx, idx, cap_nid); |
2129 | + if (spec->codec_type == VT1708S || |
2130 | + spec->codec_type == VT1702 || |
2131 | + spec->codec_type == VT1716S) |
2132 | + err = via_new_analog_input(spec, label, type_idx, |
2133 | + idx+1, cap_nid); |
2134 | + else |
2135 | + err = via_new_analog_input(spec, label, type_idx, |
2136 | + idx, cap_nid); |
2137 | if (err < 0) |
2138 | return err; |
2139 | snd_hda_add_imux_item(imux, label, idx, NULL); |