Contents of /trunk/kernel-mcore/patches-3.0-r2/0100-3.0.1-all-fixes.patch
Parent Directory | Revision Log
Revision 1560 -
(show annotations)
(download)
Thu Nov 10 14:21:33 2011 UTC (12 years, 10 months ago) by niro
File size: 123352 byte(s)
Thu Nov 10 14:21:33 2011 UTC (12 years, 10 months ago) by niro
File size: 123352 byte(s)
3.0-mcore-r2, updated to linux-3.0.8
1 | diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c |
2 | index 818e74e..f20d1b5 100644 |
3 | --- a/arch/alpha/kernel/time.c |
4 | +++ b/arch/alpha/kernel/time.c |
5 | @@ -91,7 +91,7 @@ DEFINE_PER_CPU(u8, irq_work_pending); |
6 | #define test_irq_work_pending() __get_cpu_var(irq_work_pending) |
7 | #define clear_irq_work_pending() __get_cpu_var(irq_work_pending) = 0 |
8 | |
9 | -void set_irq_work_pending(void) |
10 | +void arch_irq_work_raise(void) |
11 | { |
12 | set_irq_work_pending_flag(); |
13 | } |
14 | diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c |
15 | index b2248e7..8a03487 100644 |
16 | --- a/arch/arm/mach-pxa/cm-x300.c |
17 | +++ b/arch/arm/mach-pxa/cm-x300.c |
18 | @@ -161,10 +161,10 @@ static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = { |
19 | GPIO99_GPIO, /* Ethernet IRQ */ |
20 | |
21 | /* RTC GPIOs */ |
22 | - GPIO95_GPIO, /* RTC CS */ |
23 | - GPIO96_GPIO, /* RTC WR */ |
24 | - GPIO97_GPIO, /* RTC RD */ |
25 | - GPIO98_GPIO, /* RTC IO */ |
26 | + GPIO95_GPIO | MFP_LPM_DRIVE_HIGH, /* RTC CS */ |
27 | + GPIO96_GPIO | MFP_LPM_DRIVE_HIGH, /* RTC WR */ |
28 | + GPIO97_GPIO | MFP_LPM_DRIVE_HIGH, /* RTC RD */ |
29 | + GPIO98_GPIO, /* RTC IO */ |
30 | |
31 | /* Standard I2C */ |
32 | GPIO21_I2C_SCL, |
33 | diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c |
34 | index 4e6ee94..cc6a9d5 100644 |
35 | --- a/arch/powerpc/kernel/crash.c |
36 | +++ b/arch/powerpc/kernel/crash.c |
37 | @@ -242,12 +242,8 @@ static void crash_kexec_wait_realmode(int cpu) |
38 | |
39 | while (paca[i].kexec_state < KEXEC_STATE_REAL_MODE) { |
40 | barrier(); |
41 | - if (!cpu_possible(i)) { |
42 | + if (!cpu_possible(i) || !cpu_online(i) || (msecs <= 0)) |
43 | break; |
44 | - } |
45 | - if (!cpu_online(i)) { |
46 | - break; |
47 | - } |
48 | msecs--; |
49 | mdelay(1); |
50 | } |
51 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c |
52 | index f33acfd..03b29a6 100644 |
53 | --- a/arch/powerpc/kernel/time.c |
54 | +++ b/arch/powerpc/kernel/time.c |
55 | @@ -544,7 +544,7 @@ DEFINE_PER_CPU(u8, irq_work_pending); |
56 | |
57 | #endif /* 32 vs 64 bit */ |
58 | |
59 | -void set_irq_work_pending(void) |
60 | +void arch_irq_work_raise(void) |
61 | { |
62 | preempt_disable(); |
63 | set_irq_work_pending_flag(); |
64 | diff --git a/arch/powerpc/platforms/pseries/hvconsole.c b/arch/powerpc/platforms/pseries/hvconsole.c |
65 | index 3f6a89b..041e87c 100644 |
66 | --- a/arch/powerpc/platforms/pseries/hvconsole.c |
67 | +++ b/arch/powerpc/platforms/pseries/hvconsole.c |
68 | @@ -73,7 +73,7 @@ int hvc_put_chars(uint32_t vtermno, const char *buf, int count) |
69 | if (ret == H_SUCCESS) |
70 | return count; |
71 | if (ret == H_BUSY) |
72 | - return 0; |
73 | + return -EAGAIN; |
74 | return -EIO; |
75 | } |
76 | |
77 | diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h |
78 | index 485b4f1..23a9d89 100644 |
79 | --- a/arch/x86/include/asm/msr-index.h |
80 | +++ b/arch/x86/include/asm/msr-index.h |
81 | @@ -259,6 +259,9 @@ |
82 | #define MSR_IA32_TEMPERATURE_TARGET 0x000001a2 |
83 | |
84 | #define MSR_IA32_ENERGY_PERF_BIAS 0x000001b0 |
85 | +#define ENERGY_PERF_BIAS_PERFORMANCE 0 |
86 | +#define ENERGY_PERF_BIAS_NORMAL 6 |
87 | +#define ENERGY_PERF_BIAS_POWERSWAVE 15 |
88 | |
89 | #define MSR_IA32_PACKAGE_THERM_STATUS 0x000001b1 |
90 | |
91 | diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c |
92 | index 1edf5ba..da0d779 100644 |
93 | --- a/arch/x86/kernel/cpu/intel.c |
94 | +++ b/arch/x86/kernel/cpu/intel.c |
95 | @@ -456,6 +456,24 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) |
96 | |
97 | if (cpu_has(c, X86_FEATURE_VMX)) |
98 | detect_vmx_virtcap(c); |
99 | + |
100 | + /* |
101 | + * Initialize MSR_IA32_ENERGY_PERF_BIAS if BIOS did not. |
102 | + * x86_energy_perf_policy(8) is available to change it at run-time |
103 | + */ |
104 | + if (cpu_has(c, X86_FEATURE_EPB)) { |
105 | + u64 epb; |
106 | + |
107 | + rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb); |
108 | + if ((epb & 0xF) == 0) { |
109 | + printk_once(KERN_WARNING, "x86: updated energy_perf_bias" |
110 | + " to 'normal' from 'performance'\n" |
111 | + "You can view and update epb via utility," |
112 | + " such as x86_energy_perf_policy(8)\n"); |
113 | + epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL; |
114 | + wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb); |
115 | + } |
116 | + } |
117 | } |
118 | |
119 | #ifdef CONFIG_X86_32 |
120 | diff --git a/arch/x86/kernel/relocate_kernel_32.S b/arch/x86/kernel/relocate_kernel_32.S |
121 | index 4123553..36818f8 100644 |
122 | --- a/arch/x86/kernel/relocate_kernel_32.S |
123 | +++ b/arch/x86/kernel/relocate_kernel_32.S |
124 | @@ -97,6 +97,8 @@ relocate_kernel: |
125 | ret |
126 | |
127 | identity_mapped: |
128 | + /* set return address to 0 if not preserving context */ |
129 | + pushl $0 |
130 | /* store the start address on the stack */ |
131 | pushl %edx |
132 | |
133 | diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S |
134 | index 4de8f5b..7a6f3b3 100644 |
135 | --- a/arch/x86/kernel/relocate_kernel_64.S |
136 | +++ b/arch/x86/kernel/relocate_kernel_64.S |
137 | @@ -100,6 +100,8 @@ relocate_kernel: |
138 | ret |
139 | |
140 | identity_mapped: |
141 | + /* set return address to 0 if not preserving context */ |
142 | + pushq $0 |
143 | /* store the start address on the stack */ |
144 | pushq %rdx |
145 | |
146 | diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c |
147 | index a5b64ab..32f78eb 100644 |
148 | --- a/arch/x86/oprofile/backtrace.c |
149 | +++ b/arch/x86/oprofile/backtrace.c |
150 | @@ -11,10 +11,12 @@ |
151 | #include <linux/oprofile.h> |
152 | #include <linux/sched.h> |
153 | #include <linux/mm.h> |
154 | +#include <linux/compat.h> |
155 | +#include <linux/highmem.h> |
156 | + |
157 | #include <asm/ptrace.h> |
158 | #include <asm/uaccess.h> |
159 | #include <asm/stacktrace.h> |
160 | -#include <linux/compat.h> |
161 | |
162 | static int backtrace_stack(void *data, char *name) |
163 | { |
164 | @@ -36,17 +38,53 @@ static struct stacktrace_ops backtrace_ops = { |
165 | .walk_stack = print_context_stack, |
166 | }; |
167 | |
168 | +/* from arch/x86/kernel/cpu/perf_event.c: */ |
169 | + |
170 | +/* |
171 | + * best effort, GUP based copy_from_user() that assumes IRQ or NMI context |
172 | + */ |
173 | +static unsigned long |
174 | +copy_from_user_nmi(void *to, const void __user *from, unsigned long n) |
175 | +{ |
176 | + unsigned long offset, addr = (unsigned long)from; |
177 | + unsigned long size, len = 0; |
178 | + struct page *page; |
179 | + void *map; |
180 | + int ret; |
181 | + |
182 | + do { |
183 | + ret = __get_user_pages_fast(addr, 1, 0, &page); |
184 | + if (!ret) |
185 | + break; |
186 | + |
187 | + offset = addr & (PAGE_SIZE - 1); |
188 | + size = min(PAGE_SIZE - offset, n - len); |
189 | + |
190 | + map = kmap_atomic(page); |
191 | + memcpy(to, map+offset, size); |
192 | + kunmap_atomic(map); |
193 | + put_page(page); |
194 | + |
195 | + len += size; |
196 | + to += size; |
197 | + addr += size; |
198 | + |
199 | + } while (len < n); |
200 | + |
201 | + return len; |
202 | +} |
203 | + |
204 | #ifdef CONFIG_COMPAT |
205 | static struct stack_frame_ia32 * |
206 | dump_user_backtrace_32(struct stack_frame_ia32 *head) |
207 | { |
208 | + /* Also check accessibility of one struct frame_head beyond: */ |
209 | struct stack_frame_ia32 bufhead[2]; |
210 | struct stack_frame_ia32 *fp; |
211 | + unsigned long bytes; |
212 | |
213 | - /* Also check accessibility of one struct frame_head beyond */ |
214 | - if (!access_ok(VERIFY_READ, head, sizeof(bufhead))) |
215 | - return NULL; |
216 | - if (__copy_from_user_inatomic(bufhead, head, sizeof(bufhead))) |
217 | + bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); |
218 | + if (bytes != sizeof(bufhead)) |
219 | return NULL; |
220 | |
221 | fp = (struct stack_frame_ia32 *) compat_ptr(bufhead[0].next_frame); |
222 | @@ -87,12 +125,12 @@ x86_backtrace_32(struct pt_regs * const regs, unsigned int depth) |
223 | |
224 | static struct stack_frame *dump_user_backtrace(struct stack_frame *head) |
225 | { |
226 | + /* Also check accessibility of one struct frame_head beyond: */ |
227 | struct stack_frame bufhead[2]; |
228 | + unsigned long bytes; |
229 | |
230 | - /* Also check accessibility of one struct stack_frame beyond */ |
231 | - if (!access_ok(VERIFY_READ, head, sizeof(bufhead))) |
232 | - return NULL; |
233 | - if (__copy_from_user_inatomic(bufhead, head, sizeof(bufhead))) |
234 | + bytes = copy_from_user_nmi(bufhead, head, sizeof(bufhead)); |
235 | + if (bytes != sizeof(bufhead)) |
236 | return NULL; |
237 | |
238 | oprofile_add_trace(bufhead[0].return_address); |
239 | diff --git a/arch/xtensa/kernel/ptrace.c b/arch/xtensa/kernel/ptrace.c |
240 | index c72c947..a0d042a 100644 |
241 | --- a/arch/xtensa/kernel/ptrace.c |
242 | +++ b/arch/xtensa/kernel/ptrace.c |
243 | @@ -147,6 +147,9 @@ int ptrace_setxregs(struct task_struct *child, void __user *uregs) |
244 | elf_xtregs_t *xtregs = uregs; |
245 | int ret = 0; |
246 | |
247 | + if (!access_ok(VERIFY_READ, uregs, sizeof(elf_xtregs_t))) |
248 | + return -EFAULT; |
249 | + |
250 | #if XTENSA_HAVE_COPROCESSORS |
251 | /* Flush all coprocessors before we overwrite them. */ |
252 | coprocessor_flush_all(ti); |
253 | diff --git a/block/blk-core.c b/block/blk-core.c |
254 | index d2f8f40..1d49e1c 100644 |
255 | --- a/block/blk-core.c |
256 | +++ b/block/blk-core.c |
257 | @@ -839,6 +839,9 @@ struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask) |
258 | { |
259 | struct request *rq; |
260 | |
261 | + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) |
262 | + return NULL; |
263 | + |
264 | BUG_ON(rw != READ && rw != WRITE); |
265 | |
266 | spin_lock_irq(q->queue_lock); |
267 | diff --git a/block/blk-exec.c b/block/blk-exec.c |
268 | index 8a0e7ec..a1ebceb 100644 |
269 | --- a/block/blk-exec.c |
270 | +++ b/block/blk-exec.c |
271 | @@ -50,6 +50,13 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk, |
272 | { |
273 | int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK; |
274 | |
275 | + if (unlikely(test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))) { |
276 | + rq->errors = -ENXIO; |
277 | + if (rq->end_io) |
278 | + rq->end_io(rq, rq->errors); |
279 | + return; |
280 | + } |
281 | + |
282 | rq->rq_disk = bd_disk; |
283 | rq->end_io = done; |
284 | WARN_ON(irqs_disabled()); |
285 | diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h |
286 | index 16b4d58..c049548 100644 |
287 | --- a/drivers/block/cciss.h |
288 | +++ b/drivers/block/cciss.h |
289 | @@ -223,7 +223,7 @@ static void SA5_submit_command( ctlr_info_t *h, CommandList_struct *c) |
290 | h->ctlr, c->busaddr); |
291 | #endif /* CCISS_DEBUG */ |
292 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); |
293 | - readl(h->vaddr + SA5_REQUEST_PORT_OFFSET); |
294 | + readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); |
295 | h->commands_outstanding++; |
296 | if ( h->commands_outstanding > h->max_outstanding) |
297 | h->max_outstanding = h->commands_outstanding; |
298 | diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c |
299 | index b1c1177..e6ad3bb 100644 |
300 | --- a/drivers/firewire/core-cdev.c |
301 | +++ b/drivers/firewire/core-cdev.c |
302 | @@ -253,14 +253,11 @@ static int fw_device_op_open(struct inode *inode, struct file *file) |
303 | init_waitqueue_head(&client->wait); |
304 | init_waitqueue_head(&client->tx_flush_wait); |
305 | INIT_LIST_HEAD(&client->phy_receiver_link); |
306 | + INIT_LIST_HEAD(&client->link); |
307 | kref_init(&client->kref); |
308 | |
309 | file->private_data = client; |
310 | |
311 | - mutex_lock(&device->client_list_mutex); |
312 | - list_add_tail(&client->link, &device->client_list); |
313 | - mutex_unlock(&device->client_list_mutex); |
314 | - |
315 | return nonseekable_open(inode, file); |
316 | } |
317 | |
318 | @@ -451,15 +448,20 @@ static int ioctl_get_info(struct client *client, union ioctl_arg *arg) |
319 | if (ret != 0) |
320 | return -EFAULT; |
321 | |
322 | + mutex_lock(&client->device->client_list_mutex); |
323 | + |
324 | client->bus_reset_closure = a->bus_reset_closure; |
325 | if (a->bus_reset != 0) { |
326 | fill_bus_reset_event(&bus_reset, client); |
327 | - if (copy_to_user(u64_to_uptr(a->bus_reset), |
328 | - &bus_reset, sizeof(bus_reset))) |
329 | - return -EFAULT; |
330 | + ret = copy_to_user(u64_to_uptr(a->bus_reset), |
331 | + &bus_reset, sizeof(bus_reset)); |
332 | } |
333 | + if (ret == 0 && list_empty(&client->link)) |
334 | + list_add_tail(&client->link, &client->device->client_list); |
335 | |
336 | - return 0; |
337 | + mutex_unlock(&client->device->client_list_mutex); |
338 | + |
339 | + return ret ? -EFAULT : 0; |
340 | } |
341 | |
342 | static int add_client_resource(struct client *client, |
343 | @@ -1583,7 +1585,7 @@ static int dispatch_ioctl(struct client *client, |
344 | if (_IOC_TYPE(cmd) != '#' || |
345 | _IOC_NR(cmd) >= ARRAY_SIZE(ioctl_handlers) || |
346 | _IOC_SIZE(cmd) > sizeof(buffer)) |
347 | - return -EINVAL; |
348 | + return -ENOTTY; |
349 | |
350 | if (_IOC_DIR(cmd) == _IOC_READ) |
351 | memset(&buffer, 0, _IOC_SIZE(cmd)); |
352 | diff --git a/drivers/firmware/sigma.c b/drivers/firmware/sigma.c |
353 | index c19cd2c..f10fc52 100644 |
354 | --- a/drivers/firmware/sigma.c |
355 | +++ b/drivers/firmware/sigma.c |
356 | @@ -11,6 +11,7 @@ |
357 | #include <linux/firmware.h> |
358 | #include <linux/kernel.h> |
359 | #include <linux/i2c.h> |
360 | +#include <linux/module.h> |
361 | #include <linux/sigma.h> |
362 | |
363 | /* Return: 0==OK, <0==error, =1 ==no more actions */ |
364 | @@ -113,3 +114,5 @@ int process_sigma_firmware(struct i2c_client *client, const char *name) |
365 | return ret; |
366 | } |
367 | EXPORT_SYMBOL(process_sigma_firmware); |
368 | + |
369 | +MODULE_LICENSE("GPL"); |
370 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c |
371 | index 8c0f9e3..645b84b 100644 |
372 | --- a/drivers/gpu/drm/radeon/atombios_dp.c |
373 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c |
374 | @@ -627,6 +627,7 @@ struct radeon_dp_link_train_info { |
375 | u8 train_set[4]; |
376 | u8 link_status[DP_LINK_STATUS_SIZE]; |
377 | u8 tries; |
378 | + bool use_dpencoder; |
379 | }; |
380 | |
381 | static void radeon_dp_update_vs_emph(struct radeon_dp_link_train_info *dp_info) |
382 | @@ -646,7 +647,7 @@ static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp) |
383 | int rtp = 0; |
384 | |
385 | /* set training pattern on the source */ |
386 | - if (ASIC_IS_DCE4(dp_info->rdev)) { |
387 | + if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) { |
388 | switch (tp) { |
389 | case DP_TRAINING_PATTERN_1: |
390 | rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1; |
391 | @@ -706,7 +707,7 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) |
392 | radeon_write_dpcd_reg(dp_info->radeon_connector, DP_LINK_BW_SET, tmp); |
393 | |
394 | /* start training on the source */ |
395 | - if (ASIC_IS_DCE4(dp_info->rdev)) |
396 | + if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) |
397 | atombios_dig_encoder_setup(dp_info->encoder, |
398 | ATOM_ENCODER_CMD_DP_LINK_TRAINING_START, 0); |
399 | else |
400 | @@ -731,7 +732,7 @@ static int radeon_dp_link_train_finish(struct radeon_dp_link_train_info *dp_info |
401 | DP_TRAINING_PATTERN_DISABLE); |
402 | |
403 | /* disable the training pattern on the source */ |
404 | - if (ASIC_IS_DCE4(dp_info->rdev)) |
405 | + if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) |
406 | atombios_dig_encoder_setup(dp_info->encoder, |
407 | ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE, 0); |
408 | else |
409 | @@ -869,7 +870,8 @@ void radeon_dp_link_train(struct drm_encoder *encoder, |
410 | struct radeon_connector *radeon_connector; |
411 | struct radeon_connector_atom_dig *dig_connector; |
412 | struct radeon_dp_link_train_info dp_info; |
413 | - u8 tmp; |
414 | + int index; |
415 | + u8 tmp, frev, crev; |
416 | |
417 | if (!radeon_encoder->enc_priv) |
418 | return; |
419 | @@ -884,6 +886,18 @@ void radeon_dp_link_train(struct drm_encoder *encoder, |
420 | (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_eDP)) |
421 | return; |
422 | |
423 | + /* DPEncoderService newer than 1.1 can't program properly the |
424 | + * training pattern. When facing such version use the |
425 | + * DIGXEncoderControl (X== 1 | 2) |
426 | + */ |
427 | + dp_info.use_dpencoder = true; |
428 | + index = GetIndexIntoMasterTable(COMMAND, DPEncoderService); |
429 | + if (atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) { |
430 | + if (crev > 1) { |
431 | + dp_info.use_dpencoder = false; |
432 | + } |
433 | + } |
434 | + |
435 | dp_info.enc_id = 0; |
436 | if (dig->dig_encoder) |
437 | dp_info.enc_id |= ATOM_DP_CONFIG_DIG2_ENCODER; |
438 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c |
439 | index e459467..a74217c 100644 |
440 | --- a/drivers/gpu/drm/radeon/radeon_combios.c |
441 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c |
442 | @@ -779,7 +779,8 @@ void radeon_combios_i2c_init(struct radeon_device *rdev) |
443 | } |
444 | } |
445 | } |
446 | - } else if (rdev->family >= CHIP_R200) { |
447 | + } else if ((rdev->family == CHIP_R200) || |
448 | + (rdev->family >= CHIP_R300)) { |
449 | /* 0x68 */ |
450 | i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); |
451 | rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); |
452 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c |
453 | index aaa19dc..6fabe89 100644 |
454 | --- a/drivers/gpu/drm/radeon/radeon_pm.c |
455 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c |
456 | @@ -594,6 +594,9 @@ int radeon_pm_init(struct radeon_device *rdev) |
457 | if (rdev->pm.default_vddc) |
458 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
459 | SET_VOLTAGE_TYPE_ASIC_VDDC); |
460 | + if (rdev->pm.default_vddci) |
461 | + radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, |
462 | + SET_VOLTAGE_TYPE_ASIC_VDDCI); |
463 | if (rdev->pm.default_sclk) |
464 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
465 | if (rdev->pm.default_mclk) |
466 | diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c |
467 | index ee165fd..7d5109b 100644 |
468 | --- a/drivers/infiniband/ulp/srp/ib_srp.c |
469 | +++ b/drivers/infiniband/ulp/srp/ib_srp.c |
470 | @@ -2127,6 +2127,8 @@ static ssize_t srp_create_target(struct device *dev, |
471 | return -ENOMEM; |
472 | |
473 | target_host->transportt = ib_srp_transport_template; |
474 | + target_host->max_channel = 0; |
475 | + target_host->max_id = 1; |
476 | target_host->max_lun = SRP_MAX_LUN; |
477 | target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb; |
478 | |
479 | diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c |
480 | index 2067288..ad2eba4 100644 |
481 | --- a/drivers/md/dm-io.c |
482 | +++ b/drivers/md/dm-io.c |
483 | @@ -38,6 +38,8 @@ struct io { |
484 | struct dm_io_client *client; |
485 | io_notify_fn callback; |
486 | void *context; |
487 | + void *vma_invalidate_address; |
488 | + unsigned long vma_invalidate_size; |
489 | } __attribute__((aligned(DM_IO_MAX_REGIONS))); |
490 | |
491 | static struct kmem_cache *_dm_io_cache; |
492 | @@ -116,6 +118,10 @@ static void dec_count(struct io *io, unsigned int region, int error) |
493 | set_bit(region, &io->error_bits); |
494 | |
495 | if (atomic_dec_and_test(&io->count)) { |
496 | + if (io->vma_invalidate_size) |
497 | + invalidate_kernel_vmap_range(io->vma_invalidate_address, |
498 | + io->vma_invalidate_size); |
499 | + |
500 | if (io->sleeper) |
501 | wake_up_process(io->sleeper); |
502 | |
503 | @@ -159,6 +165,9 @@ struct dpages { |
504 | |
505 | unsigned context_u; |
506 | void *context_ptr; |
507 | + |
508 | + void *vma_invalidate_address; |
509 | + unsigned long vma_invalidate_size; |
510 | }; |
511 | |
512 | /* |
513 | @@ -377,6 +386,9 @@ static int sync_io(struct dm_io_client *client, unsigned int num_regions, |
514 | io->sleeper = current; |
515 | io->client = client; |
516 | |
517 | + io->vma_invalidate_address = dp->vma_invalidate_address; |
518 | + io->vma_invalidate_size = dp->vma_invalidate_size; |
519 | + |
520 | dispatch_io(rw, num_regions, where, dp, io, 1); |
521 | |
522 | while (1) { |
523 | @@ -415,13 +427,21 @@ static int async_io(struct dm_io_client *client, unsigned int num_regions, |
524 | io->callback = fn; |
525 | io->context = context; |
526 | |
527 | + io->vma_invalidate_address = dp->vma_invalidate_address; |
528 | + io->vma_invalidate_size = dp->vma_invalidate_size; |
529 | + |
530 | dispatch_io(rw, num_regions, where, dp, io, 0); |
531 | return 0; |
532 | } |
533 | |
534 | -static int dp_init(struct dm_io_request *io_req, struct dpages *dp) |
535 | +static int dp_init(struct dm_io_request *io_req, struct dpages *dp, |
536 | + unsigned long size) |
537 | { |
538 | /* Set up dpages based on memory type */ |
539 | + |
540 | + dp->vma_invalidate_address = NULL; |
541 | + dp->vma_invalidate_size = 0; |
542 | + |
543 | switch (io_req->mem.type) { |
544 | case DM_IO_PAGE_LIST: |
545 | list_dp_init(dp, io_req->mem.ptr.pl, io_req->mem.offset); |
546 | @@ -432,6 +452,11 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp) |
547 | break; |
548 | |
549 | case DM_IO_VMA: |
550 | + flush_kernel_vmap_range(io_req->mem.ptr.vma, size); |
551 | + if ((io_req->bi_rw & RW_MASK) == READ) { |
552 | + dp->vma_invalidate_address = io_req->mem.ptr.vma; |
553 | + dp->vma_invalidate_size = size; |
554 | + } |
555 | vm_dp_init(dp, io_req->mem.ptr.vma); |
556 | break; |
557 | |
558 | @@ -460,7 +485,7 @@ int dm_io(struct dm_io_request *io_req, unsigned num_regions, |
559 | int r; |
560 | struct dpages dp; |
561 | |
562 | - r = dp_init(io_req, &dp); |
563 | + r = dp_init(io_req, &dp, (unsigned long)where->count << SECTOR_SHIFT); |
564 | if (r) |
565 | return r; |
566 | |
567 | diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c |
568 | index aa4e570..209991b 100644 |
569 | --- a/drivers/md/dm-mpath.c |
570 | +++ b/drivers/md/dm-mpath.c |
571 | @@ -807,6 +807,11 @@ static int parse_features(struct arg_set *as, struct multipath *m) |
572 | if (!argc) |
573 | return 0; |
574 | |
575 | + if (argc > as->argc) { |
576 | + ti->error = "not enough arguments for features"; |
577 | + return -EINVAL; |
578 | + } |
579 | + |
580 | do { |
581 | param_name = shift(as); |
582 | argc--; |
583 | diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c |
584 | index 135c2f1..e4ecadf 100644 |
585 | --- a/drivers/md/dm-snap-persistent.c |
586 | +++ b/drivers/md/dm-snap-persistent.c |
587 | @@ -753,7 +753,7 @@ static int persistent_commit_merge(struct dm_exception_store *store, |
588 | for (i = 0; i < nr_merged; i++) |
589 | clear_exception(ps, ps->current_committed - 1 - i); |
590 | |
591 | - r = area_io(ps, WRITE); |
592 | + r = area_io(ps, WRITE_FLUSH_FUA); |
593 | if (r < 0) |
594 | return r; |
595 | |
596 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
597 | index 0cf68b4..41abc6d 100644 |
598 | --- a/drivers/md/dm.c |
599 | +++ b/drivers/md/dm.c |
600 | @@ -37,6 +37,8 @@ static const char *_name = DM_NAME; |
601 | static unsigned int major = 0; |
602 | static unsigned int _major = 0; |
603 | |
604 | +static DEFINE_IDR(_minor_idr); |
605 | + |
606 | static DEFINE_SPINLOCK(_minor_lock); |
607 | /* |
608 | * For bio-based dm. |
609 | @@ -313,6 +315,12 @@ static void __exit dm_exit(void) |
610 | |
611 | while (i--) |
612 | _exits[i](); |
613 | + |
614 | + /* |
615 | + * Should be empty by this point. |
616 | + */ |
617 | + idr_remove_all(&_minor_idr); |
618 | + idr_destroy(&_minor_idr); |
619 | } |
620 | |
621 | /* |
622 | @@ -1705,8 +1713,6 @@ static int dm_any_congested(void *congested_data, int bdi_bits) |
623 | /*----------------------------------------------------------------- |
624 | * An IDR is used to keep track of allocated minor numbers. |
625 | *---------------------------------------------------------------*/ |
626 | -static DEFINE_IDR(_minor_idr); |
627 | - |
628 | static void free_minor(int minor) |
629 | { |
630 | spin_lock(&_minor_lock); |
631 | diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig |
632 | index 4e349cd..3546474 100644 |
633 | --- a/drivers/misc/Kconfig |
634 | +++ b/drivers/misc/Kconfig |
635 | @@ -245,8 +245,7 @@ config SGI_XP |
636 | |
637 | config CS5535_MFGPT |
638 | tristate "CS5535/CS5536 Geode Multi-Function General Purpose Timer (MFGPT) support" |
639 | - depends on PCI |
640 | - depends on X86 |
641 | + depends on PCI && X86 && MFD_CS5535 |
642 | default n |
643 | help |
644 | This driver provides access to MFGPT functionality for other |
645 | diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c |
646 | index a19967d..ba31abe 100644 |
647 | --- a/drivers/mmc/host/sdhci-esdhc-imx.c |
648 | +++ b/drivers/mmc/host/sdhci-esdhc-imx.c |
649 | @@ -74,7 +74,7 @@ static u32 esdhc_readl_le(struct sdhci_host *host, int reg) |
650 | if (boarddata && gpio_is_valid(boarddata->cd_gpio) |
651 | && gpio_get_value(boarddata->cd_gpio)) |
652 | /* no card, if a valid gpio says so... */ |
653 | - val &= SDHCI_CARD_PRESENT; |
654 | + val &= ~SDHCI_CARD_PRESENT; |
655 | else |
656 | /* ... in all other cases assume card is present */ |
657 | val |= SDHCI_CARD_PRESENT; |
658 | diff --git a/drivers/net/jme.c b/drivers/net/jme.c |
659 | index b5b174a..1973814 100644 |
660 | --- a/drivers/net/jme.c |
661 | +++ b/drivers/net/jme.c |
662 | @@ -753,20 +753,28 @@ jme_make_new_rx_buf(struct jme_adapter *jme, int i) |
663 | struct jme_ring *rxring = &(jme->rxring[0]); |
664 | struct jme_buffer_info *rxbi = rxring->bufinf + i; |
665 | struct sk_buff *skb; |
666 | + dma_addr_t mapping; |
667 | |
668 | skb = netdev_alloc_skb(jme->dev, |
669 | jme->dev->mtu + RX_EXTRA_LEN); |
670 | if (unlikely(!skb)) |
671 | return -ENOMEM; |
672 | |
673 | + mapping = pci_map_page(jme->pdev, virt_to_page(skb->data), |
674 | + offset_in_page(skb->data), skb_tailroom(skb), |
675 | + PCI_DMA_FROMDEVICE); |
676 | + if (unlikely(pci_dma_mapping_error(jme->pdev, mapping))) { |
677 | + dev_kfree_skb(skb); |
678 | + return -ENOMEM; |
679 | + } |
680 | + |
681 | + if (likely(rxbi->mapping)) |
682 | + pci_unmap_page(jme->pdev, rxbi->mapping, |
683 | + rxbi->len, PCI_DMA_FROMDEVICE); |
684 | + |
685 | rxbi->skb = skb; |
686 | rxbi->len = skb_tailroom(skb); |
687 | - rxbi->mapping = pci_map_page(jme->pdev, |
688 | - virt_to_page(skb->data), |
689 | - offset_in_page(skb->data), |
690 | - rxbi->len, |
691 | - PCI_DMA_FROMDEVICE); |
692 | - |
693 | + rxbi->mapping = mapping; |
694 | return 0; |
695 | } |
696 | |
697 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c |
698 | index 10d71f7..1f99249 100644 |
699 | --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c |
700 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c |
701 | @@ -629,8 +629,7 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs, |
702 | rxs->rs_status |= ATH9K_RXERR_DECRYPT; |
703 | else if (rxsp->status11 & AR_MichaelErr) |
704 | rxs->rs_status |= ATH9K_RXERR_MIC; |
705 | - |
706 | - if (rxsp->status11 & AR_KeyMiss) |
707 | + else if (rxsp->status11 & AR_KeyMiss) |
708 | rxs->rs_status |= ATH9K_RXERR_DECRYPT; |
709 | } |
710 | |
711 | diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c |
712 | index c2091f1..b6b523a 100644 |
713 | --- a/drivers/net/wireless/ath/ath9k/mac.c |
714 | +++ b/drivers/net/wireless/ath/ath9k/mac.c |
715 | @@ -645,8 +645,7 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, |
716 | rs->rs_status |= ATH9K_RXERR_DECRYPT; |
717 | else if (ads.ds_rxstatus8 & AR_MichaelErr) |
718 | rs->rs_status |= ATH9K_RXERR_MIC; |
719 | - |
720 | - if (ads.ds_rxstatus8 & AR_KeyMiss) |
721 | + else if (ads.ds_rxstatus8 & AR_KeyMiss) |
722 | rs->rs_status |= ATH9K_RXERR_DECRYPT; |
723 | } |
724 | |
725 | diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c |
726 | index cc4a54f..55cd3e1 100644 |
727 | --- a/drivers/net/wireless/rt2x00/rt2800pci.c |
728 | +++ b/drivers/net/wireless/rt2x00/rt2800pci.c |
729 | @@ -1158,6 +1158,7 @@ static DEFINE_PCI_DEVICE_TABLE(rt2800pci_device_table) = { |
730 | #endif |
731 | #ifdef CONFIG_RT2800PCI_RT53XX |
732 | { PCI_DEVICE(0x1814, 0x5390) }, |
733 | + { PCI_DEVICE(0x1814, 0x539f) }, |
734 | #endif |
735 | { 0, } |
736 | }; |
737 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c |
738 | index c7576ec..3bee79e 100644 |
739 | --- a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c |
740 | +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.c |
741 | @@ -104,7 +104,7 @@ void rtl92cu_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, |
742 | tx_agc[RF90_PATH_A] = 0x10101010; |
743 | tx_agc[RF90_PATH_B] = 0x10101010; |
744 | } else if (rtlpriv->dm.dynamic_txhighpower_lvl == |
745 | - TXHIGHPWRLEVEL_LEVEL1) { |
746 | + TXHIGHPWRLEVEL_LEVEL2) { |
747 | tx_agc[RF90_PATH_A] = 0x00000000; |
748 | tx_agc[RF90_PATH_B] = 0x00000000; |
749 | } else{ |
750 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
751 | index 692671b..d549bbc 100644 |
752 | --- a/drivers/pci/pci.c |
753 | +++ b/drivers/pci/pci.c |
754 | @@ -1905,7 +1905,7 @@ void pci_enable_ari(struct pci_dev *dev) |
755 | { |
756 | int pos; |
757 | u32 cap; |
758 | - u16 ctrl; |
759 | + u16 flags, ctrl; |
760 | struct pci_dev *bridge; |
761 | |
762 | if (!pci_is_pcie(dev) || dev->devfn) |
763 | @@ -1923,6 +1923,11 @@ void pci_enable_ari(struct pci_dev *dev) |
764 | if (!pos) |
765 | return; |
766 | |
767 | + /* ARI is a PCIe v2 feature */ |
768 | + pci_read_config_word(bridge, pos + PCI_EXP_FLAGS, &flags); |
769 | + if ((flags & PCI_EXP_FLAGS_VERS) < 2) |
770 | + return; |
771 | + |
772 | pci_read_config_dword(bridge, pos + PCI_EXP_DEVCAP2, &cap); |
773 | if (!(cap & PCI_EXP_DEVCAP2_ARI)) |
774 | return; |
775 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
776 | index 02145e9..1196f61 100644 |
777 | --- a/drivers/pci/quirks.c |
778 | +++ b/drivers/pci/quirks.c |
779 | @@ -2758,6 +2758,29 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev) |
780 | |
781 | dev_notice(&dev->dev, "proprietary Ricoh MMC controller disabled (via firewire function)\n"); |
782 | dev_notice(&dev->dev, "MMC cards are now supported by standard SDHCI controller\n"); |
783 | + |
784 | + /* |
785 | + * RICOH 0xe823 SD/MMC card reader fails to recognize |
786 | + * certain types of SD/MMC cards. Lowering the SD base |
787 | + * clock frequency from 200Mhz to 50Mhz fixes this issue. |
788 | + * |
789 | + * 0x150 - SD2.0 mode enable for changing base clock |
790 | + * frequency to 50Mhz |
791 | + * 0xe1 - Base clock frequency |
792 | + * 0x32 - 50Mhz new clock frequency |
793 | + * 0xf9 - Key register for 0x150 |
794 | + * 0xfc - key register for 0xe1 |
795 | + */ |
796 | + if (dev->device == PCI_DEVICE_ID_RICOH_R5CE823) { |
797 | + pci_write_config_byte(dev, 0xf9, 0xfc); |
798 | + pci_write_config_byte(dev, 0x150, 0x10); |
799 | + pci_write_config_byte(dev, 0xf9, 0x00); |
800 | + pci_write_config_byte(dev, 0xfc, 0x01); |
801 | + pci_write_config_byte(dev, 0xe1, 0x32); |
802 | + pci_write_config_byte(dev, 0xfc, 0x00); |
803 | + |
804 | + dev_notice(&dev->dev, "MMC controller base frequency changed to 50Mhz.\n"); |
805 | + } |
806 | } |
807 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
808 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832); |
809 | diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c |
810 | index df68618..3195dbd 100644 |
811 | --- a/drivers/rtc/interface.c |
812 | +++ b/drivers/rtc/interface.c |
813 | @@ -636,6 +636,29 @@ void rtc_irq_unregister(struct rtc_device *rtc, struct rtc_task *task) |
814 | } |
815 | EXPORT_SYMBOL_GPL(rtc_irq_unregister); |
816 | |
817 | +static int rtc_update_hrtimer(struct rtc_device *rtc, int enabled) |
818 | +{ |
819 | + /* |
820 | + * We unconditionally cancel the timer here, because otherwise |
821 | + * we could run into BUG_ON(timer->state != HRTIMER_STATE_CALLBACK); |
822 | + * when we manage to start the timer before the callback |
823 | + * returns HRTIMER_RESTART. |
824 | + * |
825 | + * We cannot use hrtimer_cancel() here as a running callback |
826 | + * could be blocked on rtc->irq_task_lock and hrtimer_cancel() |
827 | + * would spin forever. |
828 | + */ |
829 | + if (hrtimer_try_to_cancel(&rtc->pie_timer) < 0) |
830 | + return -1; |
831 | + |
832 | + if (enabled) { |
833 | + ktime_t period = ktime_set(0, NSEC_PER_SEC / rtc->irq_freq); |
834 | + |
835 | + hrtimer_start(&rtc->pie_timer, period, HRTIMER_MODE_REL); |
836 | + } |
837 | + return 0; |
838 | +} |
839 | + |
840 | /** |
841 | * rtc_irq_set_state - enable/disable 2^N Hz periodic IRQs |
842 | * @rtc: the rtc device |
843 | @@ -651,21 +674,21 @@ int rtc_irq_set_state(struct rtc_device *rtc, struct rtc_task *task, int enabled |
844 | int err = 0; |
845 | unsigned long flags; |
846 | |
847 | +retry: |
848 | spin_lock_irqsave(&rtc->irq_task_lock, flags); |
849 | if (rtc->irq_task != NULL && task == NULL) |
850 | err = -EBUSY; |
851 | if (rtc->irq_task != task) |
852 | err = -EACCES; |
853 | - |
854 | - if (enabled) { |
855 | - ktime_t period = ktime_set(0, NSEC_PER_SEC/rtc->irq_freq); |
856 | - hrtimer_start(&rtc->pie_timer, period, HRTIMER_MODE_REL); |
857 | - } else { |
858 | - hrtimer_cancel(&rtc->pie_timer); |
859 | + if (!err) { |
860 | + if (rtc_update_hrtimer(rtc, enabled) < 0) { |
861 | + spin_unlock_irqrestore(&rtc->irq_task_lock, flags); |
862 | + cpu_relax(); |
863 | + goto retry; |
864 | + } |
865 | + rtc->pie_enabled = enabled; |
866 | } |
867 | - rtc->pie_enabled = enabled; |
868 | spin_unlock_irqrestore(&rtc->irq_task_lock, flags); |
869 | - |
870 | return err; |
871 | } |
872 | EXPORT_SYMBOL_GPL(rtc_irq_set_state); |
873 | @@ -685,22 +708,20 @@ int rtc_irq_set_freq(struct rtc_device *rtc, struct rtc_task *task, int freq) |
874 | int err = 0; |
875 | unsigned long flags; |
876 | |
877 | - if (freq <= 0) |
878 | + if (freq <= 0 || freq > 5000) |
879 | return -EINVAL; |
880 | - |
881 | +retry: |
882 | spin_lock_irqsave(&rtc->irq_task_lock, flags); |
883 | if (rtc->irq_task != NULL && task == NULL) |
884 | err = -EBUSY; |
885 | if (rtc->irq_task != task) |
886 | err = -EACCES; |
887 | - if (err == 0) { |
888 | + if (!err) { |
889 | rtc->irq_freq = freq; |
890 | - if (rtc->pie_enabled) { |
891 | - ktime_t period; |
892 | - hrtimer_cancel(&rtc->pie_timer); |
893 | - period = ktime_set(0, NSEC_PER_SEC/rtc->irq_freq); |
894 | - hrtimer_start(&rtc->pie_timer, period, |
895 | - HRTIMER_MODE_REL); |
896 | + if (rtc->pie_enabled && rtc_update_hrtimer(rtc, 1) < 0) { |
897 | + spin_unlock_irqrestore(&rtc->irq_task_lock, flags); |
898 | + cpu_relax(); |
899 | + goto retry; |
900 | } |
901 | } |
902 | spin_unlock_irqrestore(&rtc->irq_task_lock, flags); |
903 | diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c |
904 | index 2fc31aa..75259fe 100644 |
905 | --- a/drivers/rtc/rtc-tegra.c |
906 | +++ b/drivers/rtc/rtc-tegra.c |
907 | @@ -343,7 +343,7 @@ static int __devinit tegra_rtc_probe(struct platform_device *pdev) |
908 | |
909 | /* set context info. */ |
910 | info->pdev = pdev; |
911 | - info->tegra_rtc_lock = __SPIN_LOCK_UNLOCKED(info->tegra_rtc_lock); |
912 | + spin_lock_init(&info->tegra_rtc_lock); |
913 | |
914 | platform_set_drvdata(pdev, info); |
915 | |
916 | diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h |
917 | index 6d8dcd4..7f53cea 100644 |
918 | --- a/drivers/scsi/hpsa.h |
919 | +++ b/drivers/scsi/hpsa.h |
920 | @@ -214,7 +214,7 @@ static void SA5_submit_command(struct ctlr_info *h, |
921 | dev_dbg(&h->pdev->dev, "Sending %x, tag = %x\n", c->busaddr, |
922 | c->Header.Tag.lower); |
923 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); |
924 | - (void) readl(h->vaddr + SA5_REQUEST_PORT_OFFSET); |
925 | + (void) readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); |
926 | h->commands_outstanding++; |
927 | if (h->commands_outstanding > h->max_outstanding) |
928 | h->max_outstanding = h->commands_outstanding; |
929 | diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c |
930 | index 874e29d..f84084b 100644 |
931 | --- a/drivers/scsi/libsas/sas_expander.c |
932 | +++ b/drivers/scsi/libsas/sas_expander.c |
933 | @@ -849,6 +849,9 @@ static struct domain_device *sas_ex_discover_expander( |
934 | |
935 | res = sas_discover_expander(child); |
936 | if (res) { |
937 | + spin_lock_irq(&parent->port->dev_list_lock); |
938 | + list_del(&child->dev_list_node); |
939 | + spin_unlock_irq(&parent->port->dev_list_lock); |
940 | kfree(child); |
941 | return NULL; |
942 | } |
943 | diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c |
944 | index fca6a89..d079f9a 100644 |
945 | --- a/drivers/scsi/pmcraid.c |
946 | +++ b/drivers/scsi/pmcraid.c |
947 | @@ -3871,6 +3871,9 @@ static long pmcraid_ioctl_passthrough( |
948 | pmcraid_err("couldn't build passthrough ioadls\n"); |
949 | goto out_free_buffer; |
950 | } |
951 | + } else if (request_size < 0) { |
952 | + rc = -EINVAL; |
953 | + goto out_free_buffer; |
954 | } |
955 | |
956 | /* If data is being written into the device, copy the data from user |
957 | diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c |
958 | index 82e9e5c..cf8dfab 100644 |
959 | --- a/drivers/scsi/scsi_devinfo.c |
960 | +++ b/drivers/scsi/scsi_devinfo.c |
961 | @@ -197,6 +197,7 @@ static struct { |
962 | {"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, |
963 | {"IBM", "2105", NULL, BLIST_RETRY_HWERROR}, |
964 | {"iomega", "jaz 1GB", "J.86", BLIST_NOTQ | BLIST_NOLUN}, |
965 | + {"IOMEGA", "ZIP", NULL, BLIST_NOTQ | BLIST_NOLUN}, |
966 | {"IOMEGA", "Io20S *F", NULL, BLIST_KEY}, |
967 | {"INSITE", "Floptical F*8I", NULL, BLIST_KEY}, |
968 | {"INSITE", "I325VM", NULL, BLIST_KEY}, |
969 | @@ -243,6 +244,7 @@ static struct { |
970 | {"Tornado-", "F4", "*", BLIST_NOREPORTLUN}, |
971 | {"TOSHIBA", "CDROM", NULL, BLIST_ISROM}, |
972 | {"TOSHIBA", "CD-ROM", NULL, BLIST_ISROM}, |
973 | + {"Traxdata", "CDR4120", NULL, BLIST_NOLUN}, /* locks up */ |
974 | {"USB2.0", "SMARTMEDIA/XD", NULL, BLIST_FORCELUN | BLIST_INQUIRY_36}, |
975 | {"WangDAT", "Model 2600", "01.7", BLIST_SELECT_NO_ATN}, |
976 | {"WangDAT", "Model 3200", "02.2", BLIST_SELECT_NO_ATN}, |
977 | diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c |
978 | index ec1803a..28d9c9d 100644 |
979 | --- a/drivers/scsi/scsi_lib.c |
980 | +++ b/drivers/scsi/scsi_lib.c |
981 | @@ -213,6 +213,8 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, |
982 | int ret = DRIVER_ERROR << 24; |
983 | |
984 | req = blk_get_request(sdev->request_queue, write, __GFP_WAIT); |
985 | + if (!req) |
986 | + return ret; |
987 | |
988 | if (bufflen && blk_rq_map_kern(sdev->request_queue, req, |
989 | buffer, bufflen, __GFP_WAIT)) |
990 | diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c |
991 | index eb7a3e8..eba183c 100644 |
992 | --- a/drivers/scsi/ses.c |
993 | +++ b/drivers/scsi/ses.c |
994 | @@ -160,6 +160,10 @@ static unsigned char *ses_get_page2_descriptor(struct enclosure_device *edev, |
995 | return NULL; |
996 | } |
997 | |
998 | +/* For device slot and array device slot elements, byte 3 bit 6 |
999 | + * is "fault sensed" while byte 3 bit 5 is "fault reqstd". As this |
1000 | + * code stands these bits are shifted 4 positions right so in |
1001 | + * sysfs they will appear as bits 2 and 1 respectively. Strange. */ |
1002 | static void ses_get_fault(struct enclosure_device *edev, |
1003 | struct enclosure_component *ecomp) |
1004 | { |
1005 | @@ -181,7 +185,7 @@ static int ses_set_fault(struct enclosure_device *edev, |
1006 | /* zero is disabled */ |
1007 | break; |
1008 | case ENCLOSURE_SETTING_ENABLED: |
1009 | - desc[2] = 0x02; |
1010 | + desc[3] = 0x20; |
1011 | break; |
1012 | default: |
1013 | /* SES doesn't do the SGPIO blink settings */ |
1014 | diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c |
1015 | index 4778e27..5fc97d2 100644 |
1016 | --- a/drivers/scsi/sr.c |
1017 | +++ b/drivers/scsi/sr.c |
1018 | @@ -221,14 +221,33 @@ static unsigned int sr_check_events(struct cdrom_device_info *cdi, |
1019 | return 0; |
1020 | |
1021 | events = sr_get_events(cd->device); |
1022 | + cd->get_event_changed |= events & DISK_EVENT_MEDIA_CHANGE; |
1023 | + |
1024 | + /* |
1025 | + * If earlier GET_EVENT_STATUS_NOTIFICATION and TUR did not agree |
1026 | + * for several times in a row. We rely on TUR only for this likely |
1027 | + * broken device, to prevent generating incorrect media changed |
1028 | + * events for every open(). |
1029 | + */ |
1030 | + if (cd->ignore_get_event) { |
1031 | + events &= ~DISK_EVENT_MEDIA_CHANGE; |
1032 | + goto do_tur; |
1033 | + } |
1034 | + |
1035 | /* |
1036 | * GET_EVENT_STATUS_NOTIFICATION is enough unless MEDIA_CHANGE |
1037 | * is being cleared. Note that there are devices which hang |
1038 | * if asked to execute TUR repeatedly. |
1039 | */ |
1040 | - if (!(clearing & DISK_EVENT_MEDIA_CHANGE)) |
1041 | - goto skip_tur; |
1042 | + if (cd->device->changed) { |
1043 | + events |= DISK_EVENT_MEDIA_CHANGE; |
1044 | + cd->device->changed = 0; |
1045 | + cd->tur_changed = true; |
1046 | + } |
1047 | |
1048 | + if (!(clearing & DISK_EVENT_MEDIA_CHANGE)) |
1049 | + return events; |
1050 | +do_tur: |
1051 | /* let's see whether the media is there with TUR */ |
1052 | last_present = cd->media_present; |
1053 | ret = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr); |
1054 | @@ -242,12 +261,31 @@ static unsigned int sr_check_events(struct cdrom_device_info *cdi, |
1055 | (scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a); |
1056 | |
1057 | if (last_present != cd->media_present) |
1058 | - events |= DISK_EVENT_MEDIA_CHANGE; |
1059 | -skip_tur: |
1060 | + cd->device->changed = 1; |
1061 | + |
1062 | if (cd->device->changed) { |
1063 | events |= DISK_EVENT_MEDIA_CHANGE; |
1064 | cd->device->changed = 0; |
1065 | + cd->tur_changed = true; |
1066 | + } |
1067 | + |
1068 | + if (cd->ignore_get_event) |
1069 | + return events; |
1070 | + |
1071 | + /* check whether GET_EVENT is reporting spurious MEDIA_CHANGE */ |
1072 | + if (!cd->tur_changed) { |
1073 | + if (cd->get_event_changed) { |
1074 | + if (cd->tur_mismatch++ > 8) { |
1075 | + sdev_printk(KERN_WARNING, cd->device, |
1076 | + "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n"); |
1077 | + cd->ignore_get_event = true; |
1078 | + } |
1079 | + } else { |
1080 | + cd->tur_mismatch = 0; |
1081 | + } |
1082 | } |
1083 | + cd->tur_changed = false; |
1084 | + cd->get_event_changed = false; |
1085 | |
1086 | return events; |
1087 | } |
1088 | diff --git a/drivers/scsi/sr.h b/drivers/scsi/sr.h |
1089 | index e036f1d..37c8f6b 100644 |
1090 | --- a/drivers/scsi/sr.h |
1091 | +++ b/drivers/scsi/sr.h |
1092 | @@ -41,6 +41,13 @@ typedef struct scsi_cd { |
1093 | unsigned readcd_known:1; /* drive supports READ_CD (0xbe) */ |
1094 | unsigned readcd_cdda:1; /* reading audio data using READ_CD */ |
1095 | unsigned media_present:1; /* media is present */ |
1096 | + |
1097 | + /* GET_EVENT spurious event handling, blk layer guarantees exclusion */ |
1098 | + int tur_mismatch; /* nr of get_event TUR mismatches */ |
1099 | + bool tur_changed:1; /* changed according to TUR */ |
1100 | + bool get_event_changed:1; /* changed according to GET_EVENT */ |
1101 | + bool ignore_get_event:1; /* GET_EVENT is unreliable, use TUR */ |
1102 | + |
1103 | struct cdrom_device_info cdi; |
1104 | /* We hold gendisk and scsi_device references on probe and use |
1105 | * the refs on this kref to decide when to release them */ |
1106 | diff --git a/drivers/staging/ath6kl/os/linux/ar6000_drv.c b/drivers/staging/ath6kl/os/linux/ar6000_drv.c |
1107 | index 48dd9e3..aa97efc 100644 |
1108 | --- a/drivers/staging/ath6kl/os/linux/ar6000_drv.c |
1109 | +++ b/drivers/staging/ath6kl/os/linux/ar6000_drv.c |
1110 | @@ -954,9 +954,13 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1111 | const char *filename; |
1112 | const struct firmware *fw_entry; |
1113 | u32 fw_entry_size; |
1114 | + u8 **buf; |
1115 | + size_t *buf_len; |
1116 | |
1117 | switch (file) { |
1118 | case AR6K_OTP_FILE: |
1119 | + buf = &ar->fw_otp; |
1120 | + buf_len = &ar->fw_otp_len; |
1121 | if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { |
1122 | filename = AR6003_REV1_OTP_FILE; |
1123 | } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { |
1124 | @@ -970,6 +974,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1125 | break; |
1126 | |
1127 | case AR6K_FIRMWARE_FILE: |
1128 | + buf = &ar->fw; |
1129 | + buf_len = &ar->fw_len; |
1130 | if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { |
1131 | filename = AR6003_REV1_FIRMWARE_FILE; |
1132 | } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { |
1133 | @@ -1028,6 +1034,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1134 | break; |
1135 | |
1136 | case AR6K_PATCH_FILE: |
1137 | + buf = &ar->fw_patch; |
1138 | + buf_len = &ar->fw_patch_len; |
1139 | if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { |
1140 | filename = AR6003_REV1_PATCH_FILE; |
1141 | } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { |
1142 | @@ -1041,6 +1049,8 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1143 | break; |
1144 | |
1145 | case AR6K_BOARD_DATA_FILE: |
1146 | + buf = &ar->fw_data; |
1147 | + buf_len = &ar->fw_data_len; |
1148 | if (ar->arVersion.target_ver == AR6003_REV1_VERSION) { |
1149 | filename = AR6003_REV1_BOARD_DATA_FILE; |
1150 | } else if (ar->arVersion.target_ver == AR6003_REV2_VERSION) { |
1151 | @@ -1057,23 +1067,29 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1152 | AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unknown file type: %d\n", file)); |
1153 | return A_ERROR; |
1154 | } |
1155 | - if ((A_REQUEST_FIRMWARE(&fw_entry, filename, ((struct device *)ar->osDevInfo.pOSDevice))) != 0) |
1156 | - { |
1157 | - AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to get %s\n", filename)); |
1158 | - return A_ENOENT; |
1159 | + |
1160 | + if (*buf == NULL) { |
1161 | + if ((A_REQUEST_FIRMWARE(&fw_entry, filename, ((struct device *)ar->osDevInfo.pOSDevice))) != 0) { |
1162 | + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to get %s\n", filename)); |
1163 | + return A_ENOENT; |
1164 | + } |
1165 | + |
1166 | + *buf = kmemdup(fw_entry->data, fw_entry->size, GFP_KERNEL); |
1167 | + *buf_len = fw_entry->size; |
1168 | + A_RELEASE_FIRMWARE(fw_entry); |
1169 | } |
1170 | |
1171 | #ifdef SOFTMAC_FILE_USED |
1172 | - if (file==AR6K_BOARD_DATA_FILE && fw_entry->data) { |
1173 | - ar6000_softmac_update(ar, (u8 *)fw_entry->data, fw_entry->size); |
1174 | + if (file==AR6K_BOARD_DATA_FILE && *buf_len) { |
1175 | + ar6000_softmac_update(ar, *buf, *buf_len); |
1176 | } |
1177 | #endif |
1178 | |
1179 | |
1180 | - fw_entry_size = fw_entry->size; |
1181 | + fw_entry_size = *buf_len; |
1182 | |
1183 | /* Load extended board data for AR6003 */ |
1184 | - if ((file==AR6K_BOARD_DATA_FILE) && (fw_entry->data)) { |
1185 | + if ((file==AR6K_BOARD_DATA_FILE) && *buf) { |
1186 | u32 board_ext_address; |
1187 | u32 board_ext_data_size; |
1188 | u32 board_data_size; |
1189 | @@ -1089,14 +1105,13 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1190 | AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("Board extended Data download address: 0x%x\n", board_ext_address)); |
1191 | |
1192 | /* check whether the target has allocated memory for extended board data and file contains extended board data */ |
1193 | - if ((board_ext_address) && (fw_entry->size == (board_data_size + board_ext_data_size))) { |
1194 | + if ((board_ext_address) && (*buf_len == (board_data_size + board_ext_data_size))) { |
1195 | u32 param; |
1196 | |
1197 | - status = BMIWriteMemory(ar->arHifDevice, board_ext_address, (u8 *)(fw_entry->data + board_data_size), board_ext_data_size); |
1198 | + status = BMIWriteMemory(ar->arHifDevice, board_ext_address, (u8 *)(*buf + board_data_size), board_ext_data_size); |
1199 | |
1200 | if (status) { |
1201 | AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __LINE__)); |
1202 | - A_RELEASE_FIRMWARE(fw_entry); |
1203 | return A_ERROR; |
1204 | } |
1205 | |
1206 | @@ -1110,17 +1125,16 @@ ar6000_transfer_bin_file(struct ar6_softc *ar, AR6K_BIN_FILE file, u32 address, |
1207 | } |
1208 | |
1209 | if (compressed) { |
1210 | - status = BMIFastDownload(ar->arHifDevice, address, (u8 *)fw_entry->data, fw_entry_size); |
1211 | + status = BMIFastDownload(ar->arHifDevice, address, *buf, fw_entry_size); |
1212 | } else { |
1213 | - status = BMIWriteMemory(ar->arHifDevice, address, (u8 *)fw_entry->data, fw_entry_size); |
1214 | + status = BMIWriteMemory(ar->arHifDevice, address, *buf, fw_entry_size); |
1215 | } |
1216 | |
1217 | if (status) { |
1218 | AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI operation failed: %d\n", __LINE__)); |
1219 | - A_RELEASE_FIRMWARE(fw_entry); |
1220 | return A_ERROR; |
1221 | } |
1222 | - A_RELEASE_FIRMWARE(fw_entry); |
1223 | + |
1224 | return 0; |
1225 | } |
1226 | |
1227 | @@ -2088,6 +2102,11 @@ ar6000_destroy(struct net_device *dev, unsigned int unregister) |
1228 | ar6000_remove_ap_interface(); |
1229 | #endif /*CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT */ |
1230 | |
1231 | + kfree(ar->fw_otp); |
1232 | + kfree(ar->fw); |
1233 | + kfree(ar->fw_patch); |
1234 | + kfree(ar->fw_data); |
1235 | + |
1236 | AR_DEBUG_PRINTF(ATH_DEBUG_INFO,("-ar6000_destroy \n")); |
1237 | } |
1238 | |
1239 | diff --git a/drivers/staging/ath6kl/os/linux/cfg80211.c b/drivers/staging/ath6kl/os/linux/cfg80211.c |
1240 | index d3a774d..32e3197 100644 |
1241 | --- a/drivers/staging/ath6kl/os/linux/cfg80211.c |
1242 | +++ b/drivers/staging/ath6kl/os/linux/cfg80211.c |
1243 | @@ -867,26 +867,31 @@ ar6k_cfg80211_scanComplete_event(struct ar6_softc *ar, int status) |
1244 | |
1245 | AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: status %d\n", __func__, status)); |
1246 | |
1247 | - if(ar->scan_request) |
1248 | - { |
1249 | - /* Translate data to cfg80211 mgmt format */ |
1250 | - if (ar->arWmi) |
1251 | - wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy); |
1252 | + if (!ar->scan_request) |
1253 | + return; |
1254 | + |
1255 | + if ((status == A_ECANCELED) || (status == A_EBUSY)) { |
1256 | + cfg80211_scan_done(ar->scan_request, true); |
1257 | + goto out; |
1258 | + } |
1259 | + |
1260 | + /* Translate data to cfg80211 mgmt format */ |
1261 | + wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy); |
1262 | |
1263 | - cfg80211_scan_done(ar->scan_request, |
1264 | - ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : false); |
1265 | + cfg80211_scan_done(ar->scan_request, false); |
1266 | |
1267 | - if(ar->scan_request->n_ssids && |
1268 | - ar->scan_request->ssids[0].ssid_len) { |
1269 | + if(ar->scan_request->n_ssids && |
1270 | + ar->scan_request->ssids[0].ssid_len) { |
1271 | u8 i; |
1272 | |
1273 | for (i = 0; i < ar->scan_request->n_ssids; i++) { |
1274 | - wmi_probedSsid_cmd(ar->arWmi, i+1, DISABLE_SSID_FLAG, |
1275 | - 0, NULL); |
1276 | + wmi_probedSsid_cmd(ar->arWmi, i+1, DISABLE_SSID_FLAG, |
1277 | + 0, NULL); |
1278 | } |
1279 | - } |
1280 | - ar->scan_request = NULL; |
1281 | } |
1282 | + |
1283 | +out: |
1284 | + ar->scan_request = NULL; |
1285 | } |
1286 | |
1287 | static int |
1288 | diff --git a/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h b/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h |
1289 | index 22453b0..2911ea0 100644 |
1290 | --- a/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h |
1291 | +++ b/drivers/staging/ath6kl/os/linux/include/ar6000_drv.h |
1292 | @@ -651,6 +651,15 @@ struct ar6_softc { |
1293 | void *arApDev; |
1294 | #endif |
1295 | u8 arAutoAuthStage; |
1296 | + |
1297 | + u8 *fw_otp; |
1298 | + size_t fw_otp_len; |
1299 | + u8 *fw; |
1300 | + size_t fw_len; |
1301 | + u8 *fw_patch; |
1302 | + size_t fw_patch_len; |
1303 | + u8 *fw_data; |
1304 | + size_t fw_data_len; |
1305 | }; |
1306 | |
1307 | #ifdef CONFIG_AP_VIRTUAL_ADAPTER_SUPPORT |
1308 | diff --git a/drivers/staging/brcm80211/brcmsmac/wl_mac80211.c b/drivers/staging/brcm80211/brcmsmac/wl_mac80211.c |
1309 | index 6c6236c..aa0d127 100644 |
1310 | --- a/drivers/staging/brcm80211/brcmsmac/wl_mac80211.c |
1311 | +++ b/drivers/staging/brcm80211/brcmsmac/wl_mac80211.c |
1312 | @@ -449,11 +449,6 @@ wl_ops_bss_info_changed(struct ieee80211_hw *hw, |
1313 | wiphy_err(wiphy, "%s: qos enabled: %s (implement)\n", __func__, |
1314 | info->qos ? "true" : "false"); |
1315 | } |
1316 | - if (changed & BSS_CHANGED_IDLE) { |
1317 | - /* Idle changed for this BSS/interface */ |
1318 | - wiphy_err(wiphy, "%s: BSS idle: %s (implement)\n", __func__, |
1319 | - info->idle ? "true" : "false"); |
1320 | - } |
1321 | return; |
1322 | } |
1323 | |
1324 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c |
1325 | index e7e72b8..c20694e 100644 |
1326 | --- a/drivers/staging/comedi/comedi_fops.c |
1327 | +++ b/drivers/staging/comedi/comedi_fops.c |
1328 | @@ -383,8 +383,8 @@ static int do_devinfo_ioctl(struct comedi_device *dev, |
1329 | /* fill devinfo structure */ |
1330 | devinfo.version_code = COMEDI_VERSION_CODE; |
1331 | devinfo.n_subdevs = dev->n_subdevices; |
1332 | - memcpy(devinfo.driver_name, dev->driver->driver_name, COMEDI_NAMELEN); |
1333 | - memcpy(devinfo.board_name, dev->board_name, COMEDI_NAMELEN); |
1334 | + strlcpy(devinfo.driver_name, dev->driver->driver_name, COMEDI_NAMELEN); |
1335 | + strlcpy(devinfo.board_name, dev->board_name, COMEDI_NAMELEN); |
1336 | |
1337 | if (read_subdev) |
1338 | devinfo.read_subdevice = read_subdev - dev->subdevices; |
1339 | diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c |
1340 | index f655e59..d971bab 100644 |
1341 | --- a/drivers/staging/hv/channel.c |
1342 | +++ b/drivers/staging/hv/channel.c |
1343 | @@ -212,7 +212,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, |
1344 | if (ret != 0) |
1345 | goto Cleanup; |
1346 | |
1347 | - t = wait_for_completion_timeout(&openInfo->waitevent, HZ); |
1348 | + t = wait_for_completion_timeout(&openInfo->waitevent, 5*HZ); |
1349 | if (t == 0) { |
1350 | err = -ETIMEDOUT; |
1351 | goto errorout; |
1352 | diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c |
1353 | index 957d61e..e2e7d05 100644 |
1354 | --- a/drivers/staging/hv/channel_mgmt.c |
1355 | +++ b/drivers/staging/hv/channel_mgmt.c |
1356 | @@ -773,7 +773,7 @@ int vmbus_request_offers(void) |
1357 | goto cleanup; |
1358 | } |
1359 | |
1360 | - t = wait_for_completion_timeout(&msginfo->waitevent, HZ); |
1361 | + t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ); |
1362 | if (t == 0) { |
1363 | ret = -ETIMEDOUT; |
1364 | goto cleanup; |
1365 | diff --git a/drivers/staging/hv/connection.c b/drivers/staging/hv/connection.c |
1366 | index 37bbf77..91c65ad 100644 |
1367 | --- a/drivers/staging/hv/connection.c |
1368 | +++ b/drivers/staging/hv/connection.c |
1369 | @@ -135,7 +135,7 @@ int vmbus_connect(void) |
1370 | } |
1371 | |
1372 | /* Wait for the connection response */ |
1373 | - t = wait_for_completion_timeout(&msginfo->waitevent, HZ); |
1374 | + t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ); |
1375 | if (t == 0) { |
1376 | spin_lock_irqsave(&vmbus_connection.channelmsg_lock, |
1377 | flags); |
1378 | diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c |
1379 | index 41cbb26..4742b68 100644 |
1380 | --- a/drivers/staging/hv/netvsc.c |
1381 | +++ b/drivers/staging/hv/netvsc.c |
1382 | @@ -270,7 +270,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) |
1383 | goto cleanup; |
1384 | } |
1385 | |
1386 | - t = wait_for_completion_timeout(&net_device->channel_init_wait, HZ); |
1387 | + t = wait_for_completion_timeout(&net_device->channel_init_wait, 5*HZ); |
1388 | BUG_ON(t == 0); |
1389 | |
1390 | |
1391 | @@ -513,7 +513,7 @@ static int netvsc_connect_vsp(struct hv_device *device) |
1392 | if (ret != 0) |
1393 | goto cleanup; |
1394 | |
1395 | - t = wait_for_completion_timeout(&net_device->channel_init_wait, HZ); |
1396 | + t = wait_for_completion_timeout(&net_device->channel_init_wait, 5*HZ); |
1397 | |
1398 | if (t == 0) { |
1399 | ret = -ETIMEDOUT; |
1400 | diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c |
1401 | index 60ebdb1..b47ebb3 100644 |
1402 | --- a/drivers/staging/hv/rndis_filter.c |
1403 | +++ b/drivers/staging/hv/rndis_filter.c |
1404 | @@ -467,7 +467,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid, |
1405 | if (ret != 0) |
1406 | goto Cleanup; |
1407 | |
1408 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1409 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1410 | if (t == 0) { |
1411 | ret = -ETIMEDOUT; |
1412 | goto Cleanup; |
1413 | @@ -543,7 +543,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, |
1414 | if (ret != 0) |
1415 | goto Cleanup; |
1416 | |
1417 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1418 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1419 | |
1420 | if (t == 0) { |
1421 | ret = -1; |
1422 | @@ -600,7 +600,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) |
1423 | } |
1424 | |
1425 | |
1426 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1427 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1428 | |
1429 | if (t == 0) { |
1430 | ret = -ETIMEDOUT; |
1431 | diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c |
1432 | index 06cd327..3029786 100644 |
1433 | --- a/drivers/staging/hv/storvsc.c |
1434 | +++ b/drivers/staging/hv/storvsc.c |
1435 | @@ -135,7 +135,7 @@ static int storvsc_channel_init(struct hv_device *device) |
1436 | if (ret != 0) |
1437 | goto cleanup; |
1438 | |
1439 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1440 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1441 | if (t == 0) { |
1442 | ret = -ETIMEDOUT; |
1443 | goto cleanup; |
1444 | @@ -163,7 +163,7 @@ static int storvsc_channel_init(struct hv_device *device) |
1445 | if (ret != 0) |
1446 | goto cleanup; |
1447 | |
1448 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1449 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1450 | if (t == 0) { |
1451 | ret = -ETIMEDOUT; |
1452 | goto cleanup; |
1453 | @@ -192,7 +192,7 @@ static int storvsc_channel_init(struct hv_device *device) |
1454 | if (ret != 0) |
1455 | goto cleanup; |
1456 | |
1457 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1458 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1459 | if (t == 0) { |
1460 | ret = -ETIMEDOUT; |
1461 | goto cleanup; |
1462 | @@ -222,7 +222,7 @@ static int storvsc_channel_init(struct hv_device *device) |
1463 | if (ret != 0) |
1464 | goto cleanup; |
1465 | |
1466 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1467 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1468 | if (t == 0) { |
1469 | ret = -ETIMEDOUT; |
1470 | goto cleanup; |
1471 | diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c |
1472 | index 942cc5f..cb4a25b 100644 |
1473 | --- a/drivers/staging/hv/storvsc_drv.c |
1474 | +++ b/drivers/staging/hv/storvsc_drv.c |
1475 | @@ -393,7 +393,7 @@ static int storvsc_host_reset(struct hv_device *device) |
1476 | if (ret != 0) |
1477 | goto cleanup; |
1478 | |
1479 | - t = wait_for_completion_timeout(&request->wait_event, HZ); |
1480 | + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); |
1481 | if (t == 0) { |
1482 | ret = -ETIMEDOUT; |
1483 | goto cleanup; |
1484 | diff --git a/drivers/staging/rtl8192e/r8192E_core.c b/drivers/staging/rtl8192e/r8192E_core.c |
1485 | index 58d800f..cd98f89 100644 |
1486 | --- a/drivers/staging/rtl8192e/r8192E_core.c |
1487 | +++ b/drivers/staging/rtl8192e/r8192E_core.c |
1488 | @@ -4532,6 +4532,7 @@ static int __devinit rtl8192_pci_probe(struct pci_dev *pdev, |
1489 | u8 unit = 0; |
1490 | int ret = -ENODEV; |
1491 | unsigned long pmem_start, pmem_len, pmem_flags; |
1492 | + u8 revisionid; |
1493 | |
1494 | RT_TRACE(COMP_INIT,"Configuring chip resources\n"); |
1495 | |
1496 | @@ -4592,6 +4593,11 @@ static int __devinit rtl8192_pci_probe(struct pci_dev *pdev, |
1497 | pci_write_config_byte(pdev, 0x41, 0x00); |
1498 | |
1499 | |
1500 | + pci_read_config_byte(pdev, 0x08, &revisionid); |
1501 | + /* If the revisionid is 0x10, the device uses rtl8192se. */ |
1502 | + if (pdev->device == 0x8192 && revisionid == 0x10) |
1503 | + goto fail1; |
1504 | + |
1505 | pci_read_config_byte(pdev, 0x05, &unit); |
1506 | pci_write_config_byte(pdev, 0x05, unit & (~0x04)); |
1507 | |
1508 | diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c |
1509 | index a76e8fa..76d7485 100644 |
1510 | --- a/drivers/staging/usbip/vhci_hcd.c |
1511 | +++ b/drivers/staging/usbip/vhci_hcd.c |
1512 | @@ -846,9 +846,9 @@ static void vhci_shutdown_connection(struct usbip_device *ud) |
1513 | } |
1514 | |
1515 | /* kill threads related to this sdev, if v.c. exists */ |
1516 | - if (vdev->ud.tcp_rx) |
1517 | + if (vdev->ud.tcp_rx && !task_is_dead(vdev->ud.tcp_rx)) |
1518 | kthread_stop(vdev->ud.tcp_rx); |
1519 | - if (vdev->ud.tcp_tx) |
1520 | + if (vdev->ud.tcp_tx && !task_is_dead(vdev->ud.tcp_tx)) |
1521 | kthread_stop(vdev->ud.tcp_tx); |
1522 | |
1523 | pr_info("stop threads\n"); |
1524 | diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c |
1525 | index e9cba13..aa84555 100644 |
1526 | --- a/drivers/tty/hvc/hvc_console.c |
1527 | +++ b/drivers/tty/hvc/hvc_console.c |
1528 | @@ -163,8 +163,10 @@ static void hvc_console_print(struct console *co, const char *b, |
1529 | } else { |
1530 | r = cons_ops[index]->put_chars(vtermnos[index], c, i); |
1531 | if (r <= 0) { |
1532 | - /* throw away chars on error */ |
1533 | - i = 0; |
1534 | + /* throw away characters on error |
1535 | + * but spin in case of -EAGAIN */ |
1536 | + if (r != -EAGAIN) |
1537 | + i = 0; |
1538 | } else if (r > 0) { |
1539 | i -= r; |
1540 | if (i > 0) |
1541 | @@ -448,7 +450,7 @@ static int hvc_push(struct hvc_struct *hp) |
1542 | |
1543 | n = hp->ops->put_chars(hp->vtermno, hp->outbuf, hp->n_outbuf); |
1544 | if (n <= 0) { |
1545 | - if (n == 0) { |
1546 | + if (n == 0 || n == -EAGAIN) { |
1547 | hp->do_wakeup = 1; |
1548 | return 0; |
1549 | } |
1550 | diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c |
1551 | index 19b4ae0..c0d34ad 100644 |
1552 | --- a/drivers/tty/n_gsm.c |
1553 | +++ b/drivers/tty/n_gsm.c |
1554 | @@ -1823,10 +1823,6 @@ static void gsm0_receive(struct gsm_mux *gsm, unsigned char c) |
1555 | break; |
1556 | case GSM_FCS: /* FCS follows the packet */ |
1557 | gsm->received_fcs = c; |
1558 | - if (c == GSM0_SOF) { |
1559 | - gsm->state = GSM_SEARCH; |
1560 | - break; |
1561 | - } |
1562 | gsm_queue(gsm); |
1563 | gsm->state = GSM_SSOF; |
1564 | break; |
1565 | diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c |
1566 | index b4129f5..d32b5bb 100644 |
1567 | --- a/drivers/tty/serial/8250.c |
1568 | +++ b/drivers/tty/serial/8250.c |
1569 | @@ -1107,7 +1107,7 @@ static void autoconfig_16550a(struct uart_8250_port *up) |
1570 | */ |
1571 | DEBUG_AUTOCONF("Xscale "); |
1572 | up->port.type = PORT_XSCALE; |
1573 | - up->capabilities |= UART_CAP_UUE; |
1574 | + up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE; |
1575 | return; |
1576 | } |
1577 | } else { |
1578 | diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig |
1579 | index 636144c..b3692e6 100644 |
1580 | --- a/drivers/tty/serial/Kconfig |
1581 | +++ b/drivers/tty/serial/Kconfig |
1582 | @@ -1419,7 +1419,7 @@ config SERIAL_SC26XX |
1583 | |
1584 | config SERIAL_SC26XX_CONSOLE |
1585 | bool "Console on SC2681/SC2692 serial port" |
1586 | - depends on SERIAL_SC26XX |
1587 | + depends on SERIAL_SC26XX=y |
1588 | select SERIAL_CORE_CONSOLE |
1589 | help |
1590 | Support for Console on SC2681/SC2692 serial ports. |
1591 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
1592 | index f8030ee..9ff9abc 100644 |
1593 | --- a/drivers/usb/host/ehci-hcd.c |
1594 | +++ b/drivers/usb/host/ehci-hcd.c |
1595 | @@ -94,7 +94,8 @@ static const char hcd_name [] = "ehci_hcd"; |
1596 | #define EHCI_IAA_MSECS 10 /* arbitrary */ |
1597 | #define EHCI_IO_JIFFIES (HZ/10) /* io watchdog > irq_thresh */ |
1598 | #define EHCI_ASYNC_JIFFIES (HZ/20) /* async idle timeout */ |
1599 | -#define EHCI_SHRINK_FRAMES 5 /* async qh unlink delay */ |
1600 | +#define EHCI_SHRINK_JIFFIES (DIV_ROUND_UP(HZ, 200) + 1) |
1601 | + /* 200-ms async qh unlink delay */ |
1602 | |
1603 | /* Initial IRQ latency: faster than hw default */ |
1604 | static int log2_irq_thresh = 0; // 0 to 6 |
1605 | @@ -152,10 +153,7 @@ timer_action(struct ehci_hcd *ehci, enum ehci_timer_action action) |
1606 | break; |
1607 | /* case TIMER_ASYNC_SHRINK: */ |
1608 | default: |
1609 | - /* add a jiffie since we synch against the |
1610 | - * 8 KHz uframe counter. |
1611 | - */ |
1612 | - t = DIV_ROUND_UP(EHCI_SHRINK_FRAMES * HZ, 1000) + 1; |
1613 | + t = EHCI_SHRINK_JIFFIES; |
1614 | break; |
1615 | } |
1616 | mod_timer(&ehci->watchdog, t + jiffies); |
1617 | diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c |
1618 | index ea6184b..88cfb8f 100644 |
1619 | --- a/drivers/usb/host/ehci-hub.c |
1620 | +++ b/drivers/usb/host/ehci-hub.c |
1621 | @@ -891,10 +891,11 @@ static int ehci_hub_control ( |
1622 | * power switching; they're allowed to just limit the |
1623 | * current. khubd will turn the power back on. |
1624 | */ |
1625 | - if (HCS_PPC (ehci->hcs_params)){ |
1626 | + if ((temp & PORT_OC) && HCS_PPC(ehci->hcs_params)) { |
1627 | ehci_writel(ehci, |
1628 | temp & ~(PORT_RWC_BITS | PORT_POWER), |
1629 | status_reg); |
1630 | + temp = ehci_readl(ehci, status_reg); |
1631 | } |
1632 | } |
1633 | |
1634 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c |
1635 | index 5d6bc62..0917e3a 100644 |
1636 | --- a/drivers/usb/host/ehci-q.c |
1637 | +++ b/drivers/usb/host/ehci-q.c |
1638 | @@ -103,7 +103,7 @@ qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd) |
1639 | if (!(hw->hw_info1 & cpu_to_hc32(ehci, 1 << 14))) { |
1640 | unsigned is_out, epnum; |
1641 | |
1642 | - is_out = !(qtd->hw_token & cpu_to_hc32(ehci, 1 << 8)); |
1643 | + is_out = qh->is_out; |
1644 | epnum = (hc32_to_cpup(ehci, &hw->hw_info1) >> 8) & 0x0f; |
1645 | if (unlikely (!usb_gettoggle (qh->dev, epnum, is_out))) { |
1646 | hw->hw_token &= ~cpu_to_hc32(ehci, QTD_TOGGLE); |
1647 | @@ -946,6 +946,7 @@ done: |
1648 | hw = qh->hw; |
1649 | hw->hw_info1 = cpu_to_hc32(ehci, info1); |
1650 | hw->hw_info2 = cpu_to_hc32(ehci, info2); |
1651 | + qh->is_out = !is_input; |
1652 | usb_settoggle (urb->dev, usb_pipeendpoint (urb->pipe), !is_input, 1); |
1653 | qh_refresh (ehci, qh); |
1654 | return qh; |
1655 | @@ -1231,6 +1232,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) |
1656 | |
1657 | prev->hw->hw_next = qh->hw->hw_next; |
1658 | prev->qh_next = qh->qh_next; |
1659 | + if (ehci->qh_scan_next == qh) |
1660 | + ehci->qh_scan_next = qh->qh_next.qh; |
1661 | wmb (); |
1662 | |
1663 | /* If the controller isn't running, we don't have to wait for it */ |
1664 | @@ -1256,53 +1259,49 @@ static void scan_async (struct ehci_hcd *ehci) |
1665 | struct ehci_qh *qh; |
1666 | enum ehci_timer_action action = TIMER_IO_WATCHDOG; |
1667 | |
1668 | - ehci->stamp = ehci_readl(ehci, &ehci->regs->frame_index); |
1669 | timer_action_done (ehci, TIMER_ASYNC_SHRINK); |
1670 | -rescan: |
1671 | stopped = !HC_IS_RUNNING(ehci_to_hcd(ehci)->state); |
1672 | - qh = ehci->async->qh_next.qh; |
1673 | - if (likely (qh != NULL)) { |
1674 | - do { |
1675 | - /* clean any finished work for this qh */ |
1676 | - if (!list_empty(&qh->qtd_list) && (stopped || |
1677 | - qh->stamp != ehci->stamp)) { |
1678 | - int temp; |
1679 | - |
1680 | - /* unlinks could happen here; completion |
1681 | - * reporting drops the lock. rescan using |
1682 | - * the latest schedule, but don't rescan |
1683 | - * qhs we already finished (no looping) |
1684 | - * unless the controller is stopped. |
1685 | - */ |
1686 | - qh = qh_get (qh); |
1687 | - qh->stamp = ehci->stamp; |
1688 | - temp = qh_completions (ehci, qh); |
1689 | - if (qh->needs_rescan) |
1690 | - unlink_async(ehci, qh); |
1691 | - qh_put (qh); |
1692 | - if (temp != 0) { |
1693 | - goto rescan; |
1694 | - } |
1695 | - } |
1696 | |
1697 | - /* unlink idle entries, reducing DMA usage as well |
1698 | - * as HCD schedule-scanning costs. delay for any qh |
1699 | - * we just scanned, there's a not-unusual case that it |
1700 | - * doesn't stay idle for long. |
1701 | - * (plus, avoids some kind of re-activation race.) |
1702 | + ehci->qh_scan_next = ehci->async->qh_next.qh; |
1703 | + while (ehci->qh_scan_next) { |
1704 | + qh = ehci->qh_scan_next; |
1705 | + ehci->qh_scan_next = qh->qh_next.qh; |
1706 | + rescan: |
1707 | + /* clean any finished work for this qh */ |
1708 | + if (!list_empty(&qh->qtd_list)) { |
1709 | + int temp; |
1710 | + |
1711 | + /* |
1712 | + * Unlinks could happen here; completion reporting |
1713 | + * drops the lock. That's why ehci->qh_scan_next |
1714 | + * always holds the next qh to scan; if the next qh |
1715 | + * gets unlinked then ehci->qh_scan_next is adjusted |
1716 | + * in start_unlink_async(). |
1717 | */ |
1718 | - if (list_empty(&qh->qtd_list) |
1719 | - && qh->qh_state == QH_STATE_LINKED) { |
1720 | - if (!ehci->reclaim && (stopped || |
1721 | - ((ehci->stamp - qh->stamp) & 0x1fff) |
1722 | - >= EHCI_SHRINK_FRAMES * 8)) |
1723 | - start_unlink_async(ehci, qh); |
1724 | - else |
1725 | - action = TIMER_ASYNC_SHRINK; |
1726 | - } |
1727 | + qh = qh_get(qh); |
1728 | + temp = qh_completions(ehci, qh); |
1729 | + if (qh->needs_rescan) |
1730 | + unlink_async(ehci, qh); |
1731 | + qh->unlink_time = jiffies + EHCI_SHRINK_JIFFIES; |
1732 | + qh_put(qh); |
1733 | + if (temp != 0) |
1734 | + goto rescan; |
1735 | + } |
1736 | |
1737 | - qh = qh->qh_next.qh; |
1738 | - } while (qh); |
1739 | + /* unlink idle entries, reducing DMA usage as well |
1740 | + * as HCD schedule-scanning costs. delay for any qh |
1741 | + * we just scanned, there's a not-unusual case that it |
1742 | + * doesn't stay idle for long. |
1743 | + * (plus, avoids some kind of re-activation race.) |
1744 | + */ |
1745 | + if (list_empty(&qh->qtd_list) |
1746 | + && qh->qh_state == QH_STATE_LINKED) { |
1747 | + if (!ehci->reclaim && (stopped || |
1748 | + time_after_eq(jiffies, qh->unlink_time))) |
1749 | + start_unlink_async(ehci, qh); |
1750 | + else |
1751 | + action = TIMER_ASYNC_SHRINK; |
1752 | + } |
1753 | } |
1754 | if (action == TIMER_ASYNC_SHRINK) |
1755 | timer_action (ehci, TIMER_ASYNC_SHRINK); |
1756 | diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h |
1757 | index bd6ff48..989e0a8 100644 |
1758 | --- a/drivers/usb/host/ehci.h |
1759 | +++ b/drivers/usb/host/ehci.h |
1760 | @@ -75,6 +75,7 @@ struct ehci_hcd { /* one per controller */ |
1761 | struct ehci_qh *async; |
1762 | struct ehci_qh *dummy; /* For AMD quirk use */ |
1763 | struct ehci_qh *reclaim; |
1764 | + struct ehci_qh *qh_scan_next; |
1765 | unsigned scanning : 1; |
1766 | |
1767 | /* periodic schedule support */ |
1768 | @@ -117,7 +118,6 @@ struct ehci_hcd { /* one per controller */ |
1769 | struct timer_list iaa_watchdog; |
1770 | struct timer_list watchdog; |
1771 | unsigned long actions; |
1772 | - unsigned stamp; |
1773 | unsigned periodic_stamp; |
1774 | unsigned random_frame; |
1775 | unsigned long next_statechange; |
1776 | @@ -343,6 +343,7 @@ struct ehci_qh { |
1777 | struct ehci_qh *reclaim; /* next to reclaim */ |
1778 | |
1779 | struct ehci_hcd *ehci; |
1780 | + unsigned long unlink_time; |
1781 | |
1782 | /* |
1783 | * Do NOT use atomic operations for QH refcounting. On some CPUs |
1784 | @@ -374,6 +375,7 @@ struct ehci_qh { |
1785 | #define NO_FRAME ((unsigned short)~0) /* pick new start */ |
1786 | |
1787 | struct usb_device *dev; /* access to TT */ |
1788 | + unsigned is_out:1; /* bulk or intr OUT */ |
1789 | unsigned clearing_tt:1; /* Clear-TT-Buf in progress */ |
1790 | }; |
1791 | |
1792 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c |
1793 | index fd93061..04b90ad 100644 |
1794 | --- a/drivers/usb/host/pci-quirks.c |
1795 | +++ b/drivers/usb/host/pci-quirks.c |
1796 | @@ -35,6 +35,8 @@ |
1797 | #define OHCI_INTRSTATUS 0x0c |
1798 | #define OHCI_INTRENABLE 0x10 |
1799 | #define OHCI_INTRDISABLE 0x14 |
1800 | +#define OHCI_FMINTERVAL 0x34 |
1801 | +#define OHCI_HCR (1 << 0) /* host controller reset */ |
1802 | #define OHCI_OCR (1 << 3) /* ownership change request */ |
1803 | #define OHCI_CTRL_RWC (1 << 9) /* remote wakeup connected */ |
1804 | #define OHCI_CTRL_IR (1 << 8) /* interrupt routing */ |
1805 | @@ -497,6 +499,32 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) |
1806 | |
1807 | /* reset controller, preserving RWC (and possibly IR) */ |
1808 | writel(control & OHCI_CTRL_MASK, base + OHCI_CONTROL); |
1809 | + readl(base + OHCI_CONTROL); |
1810 | + |
1811 | + /* Some NVIDIA controllers stop working if kept in RESET for too long */ |
1812 | + if (pdev->vendor == PCI_VENDOR_ID_NVIDIA) { |
1813 | + u32 fminterval; |
1814 | + int cnt; |
1815 | + |
1816 | + /* drive reset for at least 50 ms (7.1.7.5) */ |
1817 | + msleep(50); |
1818 | + |
1819 | + /* software reset of the controller, preserving HcFmInterval */ |
1820 | + fminterval = readl(base + OHCI_FMINTERVAL); |
1821 | + writel(OHCI_HCR, base + OHCI_CMDSTATUS); |
1822 | + |
1823 | + /* reset requires max 10 us delay */ |
1824 | + for (cnt = 30; cnt > 0; --cnt) { /* ... allow extra time */ |
1825 | + if ((readl(base + OHCI_CMDSTATUS) & OHCI_HCR) == 0) |
1826 | + break; |
1827 | + udelay(1); |
1828 | + } |
1829 | + writel(fminterval, base + OHCI_FMINTERVAL); |
1830 | + |
1831 | + /* Now we're in the SUSPEND state with all devices reset |
1832 | + * and wakeups and interrupts disabled |
1833 | + */ |
1834 | + } |
1835 | |
1836 | /* |
1837 | * disable interrupts |
1838 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c |
1839 | index c71b037..dce7182 100644 |
1840 | --- a/drivers/usb/musb/musb_core.c |
1841 | +++ b/drivers/usb/musb/musb_core.c |
1842 | @@ -2329,6 +2329,7 @@ static void musb_restore_context(struct musb *musb) |
1843 | musb->context.index_regs[i].rxhubport); |
1844 | } |
1845 | } |
1846 | + musb_writeb(musb_base, MUSB_INDEX, musb->context.index); |
1847 | } |
1848 | |
1849 | static int musb_suspend(struct device *dev) |
1850 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
1851 | index 30461fc..0c20831 100644 |
1852 | --- a/drivers/usb/serial/pl2303.c |
1853 | +++ b/drivers/usb/serial/pl2303.c |
1854 | @@ -91,6 +91,7 @@ static const struct usb_device_id id_table[] = { |
1855 | { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, |
1856 | { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, |
1857 | { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) }, |
1858 | + { USB_DEVICE(WINCHIPHEAD_VENDOR_ID, WINCHIPHEAD_USBSER_PRODUCT_ID) }, |
1859 | { } /* Terminating entry */ |
1860 | }; |
1861 | |
1862 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
1863 | index 1b025f7..ca0d237 100644 |
1864 | --- a/drivers/usb/serial/pl2303.h |
1865 | +++ b/drivers/usb/serial/pl2303.h |
1866 | @@ -144,3 +144,7 @@ |
1867 | /* ADLINK ND-6530 RS232,RS485 and RS422 adapter */ |
1868 | #define ADLINK_VENDOR_ID 0x0b63 |
1869 | #define ADLINK_ND6530_PRODUCT_ID 0x6530 |
1870 | + |
1871 | +/* WinChipHead USB->RS 232 adapter */ |
1872 | +#define WINCHIPHEAD_VENDOR_ID 0x4348 |
1873 | +#define WINCHIPHEAD_USBSER_PRODUCT_ID 0x5523 |
1874 | diff --git a/drivers/watchdog/shwdt.c b/drivers/watchdog/shwdt.c |
1875 | index db84f23..a267dc0 100644 |
1876 | --- a/drivers/watchdog/shwdt.c |
1877 | +++ b/drivers/watchdog/shwdt.c |
1878 | @@ -64,7 +64,7 @@ |
1879 | * misses its deadline, the kernel timer will allow the WDT to overflow. |
1880 | */ |
1881 | static int clock_division_ratio = WTCSR_CKS_4096; |
1882 | -#define next_ping_period(cks) msecs_to_jiffies(cks - 4) |
1883 | +#define next_ping_period(cks) (jiffies + msecs_to_jiffies(cks - 4)) |
1884 | |
1885 | static const struct watchdog_info sh_wdt_info; |
1886 | static struct platform_device *sh_wdt_dev; |
1887 | diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c |
1888 | index fa8c21d..d8d26f3 100644 |
1889 | --- a/fs/cifs/dir.c |
1890 | +++ b/fs/cifs/dir.c |
1891 | @@ -641,7 +641,7 @@ lookup_out: |
1892 | static int |
1893 | cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd) |
1894 | { |
1895 | - if (nd->flags & LOOKUP_RCU) |
1896 | + if (nd && (nd->flags & LOOKUP_RCU)) |
1897 | return -ECHILD; |
1898 | |
1899 | if (direntry->d_inode) { |
1900 | diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c |
1901 | index 7349ade..4a4fad7 100644 |
1902 | --- a/fs/ecryptfs/inode.c |
1903 | +++ b/fs/ecryptfs/inode.c |
1904 | @@ -69,6 +69,7 @@ static int ecryptfs_inode_set(struct inode *inode, void *opaque) |
1905 | inode->i_ino = lower_inode->i_ino; |
1906 | inode->i_version++; |
1907 | inode->i_mapping->a_ops = &ecryptfs_aops; |
1908 | + inode->i_mapping->backing_dev_info = inode->i_sb->s_bdi; |
1909 | |
1910 | if (S_ISLNK(inode->i_mode)) |
1911 | inode->i_op = &ecryptfs_symlink_iops; |
1912 | diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c |
1913 | index 27a7fef..89dc18e 100644 |
1914 | --- a/fs/ecryptfs/keystore.c |
1915 | +++ b/fs/ecryptfs/keystore.c |
1916 | @@ -1868,11 +1868,6 @@ int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat, |
1917 | * just one will be sufficient to decrypt to get the FEK. */ |
1918 | find_next_matching_auth_tok: |
1919 | found_auth_tok = 0; |
1920 | - if (auth_tok_key) { |
1921 | - up_write(&(auth_tok_key->sem)); |
1922 | - key_put(auth_tok_key); |
1923 | - auth_tok_key = NULL; |
1924 | - } |
1925 | list_for_each_entry(auth_tok_list_item, &auth_tok_list, list) { |
1926 | candidate_auth_tok = &auth_tok_list_item->auth_tok; |
1927 | if (unlikely(ecryptfs_verbosity > 0)) { |
1928 | @@ -1909,14 +1904,22 @@ found_matching_auth_tok: |
1929 | memcpy(&(candidate_auth_tok->token.private_key), |
1930 | &(matching_auth_tok->token.private_key), |
1931 | sizeof(struct ecryptfs_private_key)); |
1932 | + up_write(&(auth_tok_key->sem)); |
1933 | + key_put(auth_tok_key); |
1934 | rc = decrypt_pki_encrypted_session_key(candidate_auth_tok, |
1935 | crypt_stat); |
1936 | } else if (candidate_auth_tok->token_type == ECRYPTFS_PASSWORD) { |
1937 | memcpy(&(candidate_auth_tok->token.password), |
1938 | &(matching_auth_tok->token.password), |
1939 | sizeof(struct ecryptfs_password)); |
1940 | + up_write(&(auth_tok_key->sem)); |
1941 | + key_put(auth_tok_key); |
1942 | rc = decrypt_passphrase_encrypted_session_key( |
1943 | candidate_auth_tok, crypt_stat); |
1944 | + } else { |
1945 | + up_write(&(auth_tok_key->sem)); |
1946 | + key_put(auth_tok_key); |
1947 | + rc = -EINVAL; |
1948 | } |
1949 | if (rc) { |
1950 | struct ecryptfs_auth_tok_list_item *auth_tok_list_item_tmp; |
1951 | @@ -1956,15 +1959,12 @@ found_matching_auth_tok: |
1952 | out_wipe_list: |
1953 | wipe_auth_tok_list(&auth_tok_list); |
1954 | out: |
1955 | - if (auth_tok_key) { |
1956 | - up_write(&(auth_tok_key->sem)); |
1957 | - key_put(auth_tok_key); |
1958 | - } |
1959 | return rc; |
1960 | } |
1961 | |
1962 | static int |
1963 | -pki_encrypt_session_key(struct ecryptfs_auth_tok *auth_tok, |
1964 | +pki_encrypt_session_key(struct key *auth_tok_key, |
1965 | + struct ecryptfs_auth_tok *auth_tok, |
1966 | struct ecryptfs_crypt_stat *crypt_stat, |
1967 | struct ecryptfs_key_record *key_rec) |
1968 | { |
1969 | @@ -1979,6 +1979,8 @@ pki_encrypt_session_key(struct ecryptfs_auth_tok *auth_tok, |
1970 | crypt_stat->cipher, |
1971 | crypt_stat->key_size), |
1972 | crypt_stat, &payload, &payload_len); |
1973 | + up_write(&(auth_tok_key->sem)); |
1974 | + key_put(auth_tok_key); |
1975 | if (rc) { |
1976 | ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet\n"); |
1977 | goto out; |
1978 | @@ -2008,6 +2010,8 @@ out: |
1979 | * write_tag_1_packet - Write an RFC2440-compatible tag 1 (public key) packet |
1980 | * @dest: Buffer into which to write the packet |
1981 | * @remaining_bytes: Maximum number of bytes that can be writtn |
1982 | + * @auth_tok_key: The authentication token key to unlock and put when done with |
1983 | + * @auth_tok |
1984 | * @auth_tok: The authentication token used for generating the tag 1 packet |
1985 | * @crypt_stat: The cryptographic context |
1986 | * @key_rec: The key record struct for the tag 1 packet |
1987 | @@ -2018,7 +2022,7 @@ out: |
1988 | */ |
1989 | static int |
1990 | write_tag_1_packet(char *dest, size_t *remaining_bytes, |
1991 | - struct ecryptfs_auth_tok *auth_tok, |
1992 | + struct key *auth_tok_key, struct ecryptfs_auth_tok *auth_tok, |
1993 | struct ecryptfs_crypt_stat *crypt_stat, |
1994 | struct ecryptfs_key_record *key_rec, size_t *packet_size) |
1995 | { |
1996 | @@ -2039,12 +2043,15 @@ write_tag_1_packet(char *dest, size_t *remaining_bytes, |
1997 | memcpy(key_rec->enc_key, |
1998 | auth_tok->session_key.encrypted_key, |
1999 | auth_tok->session_key.encrypted_key_size); |
2000 | + up_write(&(auth_tok_key->sem)); |
2001 | + key_put(auth_tok_key); |
2002 | goto encrypted_session_key_set; |
2003 | } |
2004 | if (auth_tok->session_key.encrypted_key_size == 0) |
2005 | auth_tok->session_key.encrypted_key_size = |
2006 | auth_tok->token.private_key.key_size; |
2007 | - rc = pki_encrypt_session_key(auth_tok, crypt_stat, key_rec); |
2008 | + rc = pki_encrypt_session_key(auth_tok_key, auth_tok, crypt_stat, |
2009 | + key_rec); |
2010 | if (rc) { |
2011 | printk(KERN_ERR "Failed to encrypt session key via a key " |
2012 | "module; rc = [%d]\n", rc); |
2013 | @@ -2421,6 +2428,8 @@ ecryptfs_generate_key_packet_set(char *dest_base, |
2014 | &max, auth_tok, |
2015 | crypt_stat, key_rec, |
2016 | &written); |
2017 | + up_write(&(auth_tok_key->sem)); |
2018 | + key_put(auth_tok_key); |
2019 | if (rc) { |
2020 | ecryptfs_printk(KERN_WARNING, "Error " |
2021 | "writing tag 3 packet\n"); |
2022 | @@ -2438,8 +2447,8 @@ ecryptfs_generate_key_packet_set(char *dest_base, |
2023 | } |
2024 | (*len) += written; |
2025 | } else if (auth_tok->token_type == ECRYPTFS_PRIVATE_KEY) { |
2026 | - rc = write_tag_1_packet(dest_base + (*len), |
2027 | - &max, auth_tok, |
2028 | + rc = write_tag_1_packet(dest_base + (*len), &max, |
2029 | + auth_tok_key, auth_tok, |
2030 | crypt_stat, key_rec, &written); |
2031 | if (rc) { |
2032 | ecryptfs_printk(KERN_WARNING, "Error " |
2033 | @@ -2448,14 +2457,13 @@ ecryptfs_generate_key_packet_set(char *dest_base, |
2034 | } |
2035 | (*len) += written; |
2036 | } else { |
2037 | + up_write(&(auth_tok_key->sem)); |
2038 | + key_put(auth_tok_key); |
2039 | ecryptfs_printk(KERN_WARNING, "Unsupported " |
2040 | "authentication token type\n"); |
2041 | rc = -EINVAL; |
2042 | goto out_free; |
2043 | } |
2044 | - up_write(&(auth_tok_key->sem)); |
2045 | - key_put(auth_tok_key); |
2046 | - auth_tok_key = NULL; |
2047 | } |
2048 | if (likely(max > 0)) { |
2049 | dest_base[(*len)] = 0x00; |
2050 | @@ -2468,11 +2476,6 @@ out_free: |
2051 | out: |
2052 | if (rc) |
2053 | (*len) = 0; |
2054 | - if (auth_tok_key) { |
2055 | - up_write(&(auth_tok_key->sem)); |
2056 | - key_put(auth_tok_key); |
2057 | - } |
2058 | - |
2059 | mutex_unlock(&crypt_stat->keysig_list_mutex); |
2060 | return rc; |
2061 | } |
2062 | diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c |
2063 | index 32e6cc2..d565759 100644 |
2064 | --- a/fs/ext3/xattr.c |
2065 | +++ b/fs/ext3/xattr.c |
2066 | @@ -803,8 +803,16 @@ inserted: |
2067 | /* We need to allocate a new block */ |
2068 | ext3_fsblk_t goal = ext3_group_first_block_no(sb, |
2069 | EXT3_I(inode)->i_block_group); |
2070 | - ext3_fsblk_t block = ext3_new_block(handle, inode, |
2071 | - goal, &error); |
2072 | + ext3_fsblk_t block; |
2073 | + |
2074 | + /* |
2075 | + * Protect us agaist concurrent allocations to the |
2076 | + * same inode from ext3_..._writepage(). Reservation |
2077 | + * code does not expect racing allocations. |
2078 | + */ |
2079 | + mutex_lock(&EXT3_I(inode)->truncate_mutex); |
2080 | + block = ext3_new_block(handle, inode, goal, &error); |
2081 | + mutex_unlock(&EXT3_I(inode)->truncate_mutex); |
2082 | if (error) |
2083 | goto cleanup; |
2084 | ea_idebug(inode, "creating block %d", block); |
2085 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h |
2086 | index 1921392..354619a 100644 |
2087 | --- a/fs/ext4/ext4.h |
2088 | +++ b/fs/ext4/ext4.h |
2089 | @@ -526,6 +526,7 @@ struct ext4_new_group_data { |
2090 | #define EXT4_FREE_BLOCKS_METADATA 0x0001 |
2091 | #define EXT4_FREE_BLOCKS_FORGET 0x0002 |
2092 | #define EXT4_FREE_BLOCKS_VALIDATED 0x0004 |
2093 | +#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE 0x0008 |
2094 | |
2095 | /* |
2096 | * ioctl commands |
2097 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c |
2098 | index f815cc8..f3aacb3 100644 |
2099 | --- a/fs/ext4/extents.c |
2100 | +++ b/fs/ext4/extents.c |
2101 | @@ -3596,17 +3596,18 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, |
2102 | } |
2103 | |
2104 | err = check_eofblocks_fl(handle, inode, map->m_lblk, path, ar.len); |
2105 | - if (err) |
2106 | - goto out2; |
2107 | - |
2108 | - err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); |
2109 | + if (!err) |
2110 | + err = ext4_ext_insert_extent(handle, inode, path, |
2111 | + &newex, flags); |
2112 | if (err) { |
2113 | + int fb_flags = flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE ? |
2114 | + EXT4_FREE_BLOCKS_NO_QUOT_UPDATE : 0; |
2115 | /* free data blocks we just allocated */ |
2116 | /* not a good idea to call discard here directly, |
2117 | * but otherwise we'd need to call it every free() */ |
2118 | ext4_discard_preallocations(inode); |
2119 | ext4_free_blocks(handle, inode, NULL, ext4_ext_pblock(&newex), |
2120 | - ext4_ext_get_actual_len(&newex), 0); |
2121 | + ext4_ext_get_actual_len(&newex), fb_flags); |
2122 | goto out2; |
2123 | } |
2124 | |
2125 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c |
2126 | index 6ed859d..0f1be7f 100644 |
2127 | --- a/fs/ext4/mballoc.c |
2128 | +++ b/fs/ext4/mballoc.c |
2129 | @@ -4637,7 +4637,7 @@ do_more: |
2130 | } |
2131 | ext4_mark_super_dirty(sb); |
2132 | error_return: |
2133 | - if (freed) |
2134 | + if (freed && !(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE)) |
2135 | dquot_free_block(inode, freed); |
2136 | brelse(bitmap_bh); |
2137 | ext4_std_error(sb, err); |
2138 | diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c |
2139 | index 2a77071..fa780e6 100644 |
2140 | --- a/fs/gfs2/ops_fstype.c |
2141 | +++ b/fs/gfs2/ops_fstype.c |
2142 | @@ -1018,13 +1018,13 @@ hostdata_error: |
2143 | fsname++; |
2144 | if (lm->lm_mount == NULL) { |
2145 | fs_info(sdp, "Now mounting FS...\n"); |
2146 | - complete(&sdp->sd_locking_init); |
2147 | + complete_all(&sdp->sd_locking_init); |
2148 | return 0; |
2149 | } |
2150 | ret = lm->lm_mount(sdp, fsname); |
2151 | if (ret == 0) |
2152 | fs_info(sdp, "Joined cluster. Now mounting FS...\n"); |
2153 | - complete(&sdp->sd_locking_init); |
2154 | + complete_all(&sdp->sd_locking_init); |
2155 | return ret; |
2156 | } |
2157 | |
2158 | diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c |
2159 | index dd25c2a..321a66b 100644 |
2160 | --- a/fs/nfs/delegation.c |
2161 | +++ b/fs/nfs/delegation.c |
2162 | @@ -398,12 +398,11 @@ int nfs_inode_return_delegation(struct inode *inode) |
2163 | return err; |
2164 | } |
2165 | |
2166 | -static void nfs_mark_return_delegation(struct nfs_delegation *delegation) |
2167 | +static void nfs_mark_return_delegation(struct nfs_server *server, |
2168 | + struct nfs_delegation *delegation) |
2169 | { |
2170 | - struct nfs_client *clp = NFS_SERVER(delegation->inode)->nfs_client; |
2171 | - |
2172 | set_bit(NFS_DELEGATION_RETURN, &delegation->flags); |
2173 | - set_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state); |
2174 | + set_bit(NFS4CLNT_DELEGRETURN, &server->nfs_client->cl_state); |
2175 | } |
2176 | |
2177 | /** |
2178 | @@ -441,7 +440,7 @@ static void nfs_mark_return_all_delegation_types(struct nfs_server *server, |
2179 | if ((delegation->type == (FMODE_READ|FMODE_WRITE)) && !(flags & FMODE_WRITE)) |
2180 | continue; |
2181 | if (delegation->type & flags) |
2182 | - nfs_mark_return_delegation(delegation); |
2183 | + nfs_mark_return_delegation(server, delegation); |
2184 | } |
2185 | } |
2186 | |
2187 | @@ -508,7 +507,7 @@ static void nfs_mark_return_unreferenced_delegations(struct nfs_server *server) |
2188 | list_for_each_entry_rcu(delegation, &server->delegations, super_list) { |
2189 | if (test_and_clear_bit(NFS_DELEGATION_REFERENCED, &delegation->flags)) |
2190 | continue; |
2191 | - nfs_mark_return_delegation(delegation); |
2192 | + nfs_mark_return_delegation(server, delegation); |
2193 | } |
2194 | } |
2195 | |
2196 | @@ -539,7 +538,8 @@ void nfs_expire_unreferenced_delegations(struct nfs_client *clp) |
2197 | int nfs_async_inode_return_delegation(struct inode *inode, |
2198 | const nfs4_stateid *stateid) |
2199 | { |
2200 | - struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; |
2201 | + struct nfs_server *server = NFS_SERVER(inode); |
2202 | + struct nfs_client *clp = server->nfs_client; |
2203 | struct nfs_delegation *delegation; |
2204 | |
2205 | rcu_read_lock(); |
2206 | @@ -549,7 +549,7 @@ int nfs_async_inode_return_delegation(struct inode *inode, |
2207 | rcu_read_unlock(); |
2208 | return -ENOENT; |
2209 | } |
2210 | - nfs_mark_return_delegation(delegation); |
2211 | + nfs_mark_return_delegation(server, delegation); |
2212 | rcu_read_unlock(); |
2213 | |
2214 | nfs_delegation_run_state_manager(clp); |
2215 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
2216 | index ededdbd..f91c62d 100644 |
2217 | --- a/fs/nfs/dir.c |
2218 | +++ b/fs/nfs/dir.c |
2219 | @@ -134,18 +134,19 @@ const struct inode_operations nfs4_dir_inode_operations = { |
2220 | |
2221 | #endif /* CONFIG_NFS_V4 */ |
2222 | |
2223 | -static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct rpc_cred *cred) |
2224 | +static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, struct rpc_cred *cred) |
2225 | { |
2226 | struct nfs_open_dir_context *ctx; |
2227 | ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); |
2228 | if (ctx != NULL) { |
2229 | ctx->duped = 0; |
2230 | + ctx->attr_gencount = NFS_I(dir)->attr_gencount; |
2231 | ctx->dir_cookie = 0; |
2232 | ctx->dup_cookie = 0; |
2233 | ctx->cred = get_rpccred(cred); |
2234 | - } else |
2235 | - ctx = ERR_PTR(-ENOMEM); |
2236 | - return ctx; |
2237 | + return ctx; |
2238 | + } |
2239 | + return ERR_PTR(-ENOMEM); |
2240 | } |
2241 | |
2242 | static void put_nfs_open_dir_context(struct nfs_open_dir_context *ctx) |
2243 | @@ -173,7 +174,7 @@ nfs_opendir(struct inode *inode, struct file *filp) |
2244 | cred = rpc_lookup_cred(); |
2245 | if (IS_ERR(cred)) |
2246 | return PTR_ERR(cred); |
2247 | - ctx = alloc_nfs_open_dir_context(cred); |
2248 | + ctx = alloc_nfs_open_dir_context(inode, cred); |
2249 | if (IS_ERR(ctx)) { |
2250 | res = PTR_ERR(ctx); |
2251 | goto out; |
2252 | @@ -323,7 +324,6 @@ int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descri |
2253 | { |
2254 | loff_t diff = desc->file->f_pos - desc->current_index; |
2255 | unsigned int index; |
2256 | - struct nfs_open_dir_context *ctx = desc->file->private_data; |
2257 | |
2258 | if (diff < 0) |
2259 | goto out_eof; |
2260 | @@ -336,7 +336,6 @@ int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descri |
2261 | index = (unsigned int)diff; |
2262 | *desc->dir_cookie = array->array[index].cookie; |
2263 | desc->cache_entry_index = index; |
2264 | - ctx->duped = 0; |
2265 | return 0; |
2266 | out_eof: |
2267 | desc->eof = 1; |
2268 | @@ -349,14 +348,33 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des |
2269 | int i; |
2270 | loff_t new_pos; |
2271 | int status = -EAGAIN; |
2272 | - struct nfs_open_dir_context *ctx = desc->file->private_data; |
2273 | |
2274 | for (i = 0; i < array->size; i++) { |
2275 | if (array->array[i].cookie == *desc->dir_cookie) { |
2276 | + struct nfs_inode *nfsi = NFS_I(desc->file->f_path.dentry->d_inode); |
2277 | + struct nfs_open_dir_context *ctx = desc->file->private_data; |
2278 | + |
2279 | new_pos = desc->current_index + i; |
2280 | - if (new_pos < desc->file->f_pos) { |
2281 | + if (ctx->attr_gencount != nfsi->attr_gencount |
2282 | + || (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))) { |
2283 | + ctx->duped = 0; |
2284 | + ctx->attr_gencount = nfsi->attr_gencount; |
2285 | + } else if (new_pos < desc->file->f_pos) { |
2286 | + if (ctx->duped > 0 |
2287 | + && ctx->dup_cookie == *desc->dir_cookie) { |
2288 | + if (printk_ratelimit()) { |
2289 | + pr_notice("NFS: directory %s/%s contains a readdir loop." |
2290 | + "Please contact your server vendor. " |
2291 | + "Offending cookie: %llu\n", |
2292 | + desc->file->f_dentry->d_parent->d_name.name, |
2293 | + desc->file->f_dentry->d_name.name, |
2294 | + *desc->dir_cookie); |
2295 | + } |
2296 | + status = -ELOOP; |
2297 | + goto out; |
2298 | + } |
2299 | ctx->dup_cookie = *desc->dir_cookie; |
2300 | - ctx->duped = 1; |
2301 | + ctx->duped = -1; |
2302 | } |
2303 | desc->file->f_pos = new_pos; |
2304 | desc->cache_entry_index = i; |
2305 | @@ -368,6 +386,7 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des |
2306 | if (*desc->dir_cookie == array->last_cookie) |
2307 | desc->eof = 1; |
2308 | } |
2309 | +out: |
2310 | return status; |
2311 | } |
2312 | |
2313 | @@ -740,19 +759,6 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, |
2314 | struct nfs_cache_array *array = NULL; |
2315 | struct nfs_open_dir_context *ctx = file->private_data; |
2316 | |
2317 | - if (ctx->duped != 0 && ctx->dup_cookie == *desc->dir_cookie) { |
2318 | - if (printk_ratelimit()) { |
2319 | - pr_notice("NFS: directory %s/%s contains a readdir loop. " |
2320 | - "Please contact your server vendor. " |
2321 | - "Offending cookie: %llu\n", |
2322 | - file->f_dentry->d_parent->d_name.name, |
2323 | - file->f_dentry->d_name.name, |
2324 | - *desc->dir_cookie); |
2325 | - } |
2326 | - res = -ELOOP; |
2327 | - goto out; |
2328 | - } |
2329 | - |
2330 | array = nfs_readdir_get_array(desc->page); |
2331 | if (IS_ERR(array)) { |
2332 | res = PTR_ERR(array); |
2333 | @@ -774,6 +780,8 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, |
2334 | *desc->dir_cookie = array->array[i+1].cookie; |
2335 | else |
2336 | *desc->dir_cookie = array->last_cookie; |
2337 | + if (ctx->duped != 0) |
2338 | + ctx->duped = 1; |
2339 | } |
2340 | if (array->eof_index >= 0) |
2341 | desc->eof = 1; |
2342 | @@ -805,6 +813,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, |
2343 | struct page *page = NULL; |
2344 | int status; |
2345 | struct inode *inode = desc->file->f_path.dentry->d_inode; |
2346 | + struct nfs_open_dir_context *ctx = desc->file->private_data; |
2347 | |
2348 | dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n", |
2349 | (unsigned long long)*desc->dir_cookie); |
2350 | @@ -818,6 +827,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, |
2351 | desc->page_index = 0; |
2352 | desc->last_cookie = *desc->dir_cookie; |
2353 | desc->page = page; |
2354 | + ctx->duped = 0; |
2355 | |
2356 | status = nfs_readdir_xdr_to_array(desc, page, inode); |
2357 | if (status < 0) |
2358 | diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c |
2359 | index f9d03ab..614c4d2 100644 |
2360 | --- a/fs/nfs/nfs4filelayout.c |
2361 | +++ b/fs/nfs/nfs4filelayout.c |
2362 | @@ -170,7 +170,7 @@ filelayout_set_layoutcommit(struct nfs_write_data *wdata) |
2363 | |
2364 | pnfs_set_layoutcommit(wdata); |
2365 | dprintk("%s ionde %lu pls_end_pos %lu\n", __func__, wdata->inode->i_ino, |
2366 | - (unsigned long) wdata->lseg->pls_end_pos); |
2367 | + (unsigned long) NFS_I(wdata->inode)->layout->plh_lwb); |
2368 | } |
2369 | |
2370 | /* |
2371 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
2372 | index 5879b23..92cfd2e 100644 |
2373 | --- a/fs/nfs/nfs4proc.c |
2374 | +++ b/fs/nfs/nfs4proc.c |
2375 | @@ -5850,9 +5850,15 @@ nfs4_layoutcommit_done(struct rpc_task *task, void *calldata) |
2376 | static void nfs4_layoutcommit_release(void *calldata) |
2377 | { |
2378 | struct nfs4_layoutcommit_data *data = calldata; |
2379 | + struct pnfs_layout_segment *lseg, *tmp; |
2380 | |
2381 | /* Matched by references in pnfs_set_layoutcommit */ |
2382 | - put_lseg(data->lseg); |
2383 | + list_for_each_entry_safe(lseg, tmp, &data->lseg_list, pls_lc_list) { |
2384 | + list_del_init(&lseg->pls_lc_list); |
2385 | + if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, |
2386 | + &lseg->pls_flags)) |
2387 | + put_lseg(lseg); |
2388 | + } |
2389 | put_rpccred(data->cred); |
2390 | kfree(data); |
2391 | } |
2392 | diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c |
2393 | index e6e8f3b..fc97fd5 100644 |
2394 | --- a/fs/nfs/nfs4xdr.c |
2395 | +++ b/fs/nfs/nfs4xdr.c |
2396 | @@ -1888,7 +1888,7 @@ encode_layoutcommit(struct xdr_stream *xdr, |
2397 | *p++ = cpu_to_be32(OP_LAYOUTCOMMIT); |
2398 | /* Only whole file layouts */ |
2399 | p = xdr_encode_hyper(p, 0); /* offset */ |
2400 | - p = xdr_encode_hyper(p, NFS4_MAX_UINT64); /* length */ |
2401 | + p = xdr_encode_hyper(p, args->lastbytewritten + 1); /* length */ |
2402 | *p++ = cpu_to_be32(0); /* reclaim */ |
2403 | p = xdr_encode_opaque_fixed(p, args->stateid.data, NFS4_STATEID_SIZE); |
2404 | *p++ = cpu_to_be32(1); /* newoffset = TRUE */ |
2405 | diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c |
2406 | index 29c0ca7..a726c0a 100644 |
2407 | --- a/fs/nfs/pnfs.c |
2408 | +++ b/fs/nfs/pnfs.c |
2409 | @@ -189,6 +189,7 @@ static void |
2410 | pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo) |
2411 | { |
2412 | struct pnfs_layoutdriver_type *ld = NFS_SERVER(lo->plh_inode)->pnfs_curr_ld; |
2413 | + put_rpccred(lo->plh_lc_cred); |
2414 | return ld->alloc_layout_hdr ? ld->free_layout_hdr(lo) : kfree(lo); |
2415 | } |
2416 | |
2417 | @@ -223,6 +224,7 @@ static void |
2418 | init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg) |
2419 | { |
2420 | INIT_LIST_HEAD(&lseg->pls_list); |
2421 | + INIT_LIST_HEAD(&lseg->pls_lc_list); |
2422 | atomic_set(&lseg->pls_refcount, 1); |
2423 | smp_mb(); |
2424 | set_bit(NFS_LSEG_VALID, &lseg->pls_flags); |
2425 | @@ -805,7 +807,9 @@ out: |
2426 | } |
2427 | |
2428 | static struct pnfs_layout_hdr * |
2429 | -alloc_init_layout_hdr(struct inode *ino, gfp_t gfp_flags) |
2430 | +alloc_init_layout_hdr(struct inode *ino, |
2431 | + struct nfs_open_context *ctx, |
2432 | + gfp_t gfp_flags) |
2433 | { |
2434 | struct pnfs_layout_hdr *lo; |
2435 | |
2436 | @@ -817,11 +821,14 @@ alloc_init_layout_hdr(struct inode *ino, gfp_t gfp_flags) |
2437 | INIT_LIST_HEAD(&lo->plh_segs); |
2438 | INIT_LIST_HEAD(&lo->plh_bulk_recall); |
2439 | lo->plh_inode = ino; |
2440 | + lo->plh_lc_cred = get_rpccred(ctx->state->owner->so_cred); |
2441 | return lo; |
2442 | } |
2443 | |
2444 | static struct pnfs_layout_hdr * |
2445 | -pnfs_find_alloc_layout(struct inode *ino, gfp_t gfp_flags) |
2446 | +pnfs_find_alloc_layout(struct inode *ino, |
2447 | + struct nfs_open_context *ctx, |
2448 | + gfp_t gfp_flags) |
2449 | { |
2450 | struct nfs_inode *nfsi = NFS_I(ino); |
2451 | struct pnfs_layout_hdr *new = NULL; |
2452 | @@ -836,7 +843,7 @@ pnfs_find_alloc_layout(struct inode *ino, gfp_t gfp_flags) |
2453 | return nfsi->layout; |
2454 | } |
2455 | spin_unlock(&ino->i_lock); |
2456 | - new = alloc_init_layout_hdr(ino, gfp_flags); |
2457 | + new = alloc_init_layout_hdr(ino, ctx, gfp_flags); |
2458 | spin_lock(&ino->i_lock); |
2459 | |
2460 | if (likely(nfsi->layout == NULL)) /* Won the race? */ |
2461 | @@ -928,7 +935,7 @@ pnfs_update_layout(struct inode *ino, |
2462 | if (!pnfs_enabled_sb(NFS_SERVER(ino))) |
2463 | return NULL; |
2464 | spin_lock(&ino->i_lock); |
2465 | - lo = pnfs_find_alloc_layout(ino, gfp_flags); |
2466 | + lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); |
2467 | if (lo == NULL) { |
2468 | dprintk("%s ERROR: can't get pnfs_layout_hdr\n", __func__); |
2469 | goto out_unlock; |
2470 | @@ -1195,16 +1202,17 @@ pnfs_try_to_read_data(struct nfs_read_data *rdata, |
2471 | } |
2472 | |
2473 | /* |
2474 | - * Currently there is only one (whole file) write lseg. |
2475 | + * There can be multiple RW segments. |
2476 | */ |
2477 | -static struct pnfs_layout_segment *pnfs_list_write_lseg(struct inode *inode) |
2478 | +static void pnfs_list_write_lseg(struct inode *inode, struct list_head *listp) |
2479 | { |
2480 | - struct pnfs_layout_segment *lseg, *rv = NULL; |
2481 | + struct pnfs_layout_segment *lseg; |
2482 | |
2483 | - list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) |
2484 | - if (lseg->pls_range.iomode == IOMODE_RW) |
2485 | - rv = lseg; |
2486 | - return rv; |
2487 | + list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) { |
2488 | + if (lseg->pls_range.iomode == IOMODE_RW && |
2489 | + test_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) |
2490 | + list_add(&lseg->pls_lc_list, listp); |
2491 | + } |
2492 | } |
2493 | |
2494 | void |
2495 | @@ -1216,17 +1224,19 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata) |
2496 | |
2497 | spin_lock(&nfsi->vfs_inode.i_lock); |
2498 | if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) { |
2499 | - /* references matched in nfs4_layoutcommit_release */ |
2500 | - get_lseg(wdata->lseg); |
2501 | - wdata->lseg->pls_lc_cred = |
2502 | - get_rpccred(wdata->args.context->state->owner->so_cred); |
2503 | mark_as_dirty = true; |
2504 | dprintk("%s: Set layoutcommit for inode %lu ", |
2505 | __func__, wdata->inode->i_ino); |
2506 | } |
2507 | - if (end_pos > wdata->lseg->pls_end_pos) |
2508 | - wdata->lseg->pls_end_pos = end_pos; |
2509 | + if (!test_and_set_bit(NFS_LSEG_LAYOUTCOMMIT, &wdata->lseg->pls_flags)) { |
2510 | + /* references matched in nfs4_layoutcommit_release */ |
2511 | + get_lseg(wdata->lseg); |
2512 | + } |
2513 | + if (end_pos > nfsi->layout->plh_lwb) |
2514 | + nfsi->layout->plh_lwb = end_pos; |
2515 | spin_unlock(&nfsi->vfs_inode.i_lock); |
2516 | + dprintk("%s: lseg %p end_pos %llu\n", |
2517 | + __func__, wdata->lseg, nfsi->layout->plh_lwb); |
2518 | |
2519 | /* if pnfs_layoutcommit_inode() runs between inode locks, the next one |
2520 | * will be a noop because NFS_INO_LAYOUTCOMMIT will not be set */ |
2521 | @@ -1248,8 +1258,6 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync) |
2522 | { |
2523 | struct nfs4_layoutcommit_data *data; |
2524 | struct nfs_inode *nfsi = NFS_I(inode); |
2525 | - struct pnfs_layout_segment *lseg; |
2526 | - struct rpc_cred *cred; |
2527 | loff_t end_pos; |
2528 | int status = 0; |
2529 | |
2530 | @@ -1266,30 +1274,25 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync) |
2531 | goto out; |
2532 | } |
2533 | |
2534 | + INIT_LIST_HEAD(&data->lseg_list); |
2535 | spin_lock(&inode->i_lock); |
2536 | if (!test_and_clear_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) { |
2537 | spin_unlock(&inode->i_lock); |
2538 | kfree(data); |
2539 | goto out; |
2540 | } |
2541 | - /* |
2542 | - * Currently only one (whole file) write lseg which is referenced |
2543 | - * in pnfs_set_layoutcommit and will be found. |
2544 | - */ |
2545 | - lseg = pnfs_list_write_lseg(inode); |
2546 | |
2547 | - end_pos = lseg->pls_end_pos; |
2548 | - cred = lseg->pls_lc_cred; |
2549 | - lseg->pls_end_pos = 0; |
2550 | - lseg->pls_lc_cred = NULL; |
2551 | + pnfs_list_write_lseg(inode, &data->lseg_list); |
2552 | + |
2553 | + end_pos = nfsi->layout->plh_lwb; |
2554 | + nfsi->layout->plh_lwb = 0; |
2555 | |
2556 | memcpy(&data->args.stateid.data, nfsi->layout->plh_stateid.data, |
2557 | sizeof(nfsi->layout->plh_stateid.data)); |
2558 | spin_unlock(&inode->i_lock); |
2559 | |
2560 | data->args.inode = inode; |
2561 | - data->lseg = lseg; |
2562 | - data->cred = cred; |
2563 | + data->cred = get_rpccred(nfsi->layout->plh_lc_cred); |
2564 | nfs_fattr_init(&data->fattr); |
2565 | data->args.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask; |
2566 | data->res.fattr = &data->fattr; |
2567 | diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h |
2568 | index 96bf4e6..9d147d9 100644 |
2569 | --- a/fs/nfs/pnfs.h |
2570 | +++ b/fs/nfs/pnfs.h |
2571 | @@ -36,16 +36,16 @@ |
2572 | enum { |
2573 | NFS_LSEG_VALID = 0, /* cleared when lseg is recalled/returned */ |
2574 | NFS_LSEG_ROC, /* roc bit received from server */ |
2575 | + NFS_LSEG_LAYOUTCOMMIT, /* layoutcommit bit set for layoutcommit */ |
2576 | }; |
2577 | |
2578 | struct pnfs_layout_segment { |
2579 | struct list_head pls_list; |
2580 | + struct list_head pls_lc_list; |
2581 | struct pnfs_layout_range pls_range; |
2582 | atomic_t pls_refcount; |
2583 | unsigned long pls_flags; |
2584 | struct pnfs_layout_hdr *pls_layout; |
2585 | - struct rpc_cred *pls_lc_cred; /* LAYOUTCOMMIT credential */ |
2586 | - loff_t pls_end_pos; /* LAYOUTCOMMIT write end */ |
2587 | }; |
2588 | |
2589 | enum pnfs_try_status { |
2590 | @@ -124,6 +124,8 @@ struct pnfs_layout_hdr { |
2591 | unsigned long plh_block_lgets; /* block LAYOUTGET if >0 */ |
2592 | u32 plh_barrier; /* ignore lower seqids */ |
2593 | unsigned long plh_flags; |
2594 | + loff_t plh_lwb; /* last write byte for layoutcommit */ |
2595 | + struct rpc_cred *plh_lc_cred; /* layoutcommit cred */ |
2596 | struct inode *plh_inode; |
2597 | }; |
2598 | |
2599 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
2600 | index e98f3c2..3b8ad35 100644 |
2601 | --- a/fs/nfsd/nfs4state.c |
2602 | +++ b/fs/nfsd/nfs4state.c |
2603 | @@ -381,14 +381,6 @@ static int nfs4_access_to_omode(u32 access) |
2604 | BUG(); |
2605 | } |
2606 | |
2607 | -static int nfs4_access_bmap_to_omode(struct nfs4_stateid *stp) |
2608 | -{ |
2609 | - unsigned int access; |
2610 | - |
2611 | - set_access(&access, stp->st_access_bmap); |
2612 | - return nfs4_access_to_omode(access); |
2613 | -} |
2614 | - |
2615 | static void unhash_generic_stateid(struct nfs4_stateid *stp) |
2616 | { |
2617 | list_del(&stp->st_hash); |
2618 | @@ -398,11 +390,14 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp) |
2619 | |
2620 | static void free_generic_stateid(struct nfs4_stateid *stp) |
2621 | { |
2622 | - int oflag; |
2623 | + int i; |
2624 | |
2625 | if (stp->st_access_bmap) { |
2626 | - oflag = nfs4_access_bmap_to_omode(stp); |
2627 | - nfs4_file_put_access(stp->st_file, oflag); |
2628 | + for (i = 1; i < 4; i++) { |
2629 | + if (test_bit(i, &stp->st_access_bmap)) |
2630 | + nfs4_file_put_access(stp->st_file, |
2631 | + nfs4_access_to_omode(i)); |
2632 | + } |
2633 | } |
2634 | put_nfs4_file(stp->st_file); |
2635 | kmem_cache_free(stateid_slab, stp); |
2636 | @@ -2337,15 +2332,6 @@ out: |
2637 | return ret; |
2638 | } |
2639 | |
2640 | -static inline void |
2641 | -nfs4_file_downgrade(struct nfs4_file *fp, unsigned int share_access) |
2642 | -{ |
2643 | - if (share_access & NFS4_SHARE_ACCESS_WRITE) |
2644 | - nfs4_file_put_access(fp, O_WRONLY); |
2645 | - if (share_access & NFS4_SHARE_ACCESS_READ) |
2646 | - nfs4_file_put_access(fp, O_RDONLY); |
2647 | -} |
2648 | - |
2649 | static void nfsd_break_one_deleg(struct nfs4_delegation *dp) |
2650 | { |
2651 | /* We're assuming the state code never drops its reference |
2652 | @@ -2556,12 +2542,18 @@ static inline int nfs4_access_to_access(u32 nfs4_access) |
2653 | return flags; |
2654 | } |
2655 | |
2656 | -static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file |
2657 | -*fp, struct svc_fh *cur_fh, u32 nfs4_access) |
2658 | +static __be32 nfs4_get_vfs_file(struct svc_rqst *rqstp, struct nfs4_file *fp, |
2659 | + struct svc_fh *cur_fh, struct nfsd4_open *open) |
2660 | { |
2661 | __be32 status; |
2662 | - int oflag = nfs4_access_to_omode(nfs4_access); |
2663 | - int access = nfs4_access_to_access(nfs4_access); |
2664 | + int oflag = nfs4_access_to_omode(open->op_share_access); |
2665 | + int access = nfs4_access_to_access(open->op_share_access); |
2666 | + |
2667 | + /* CLAIM_DELEGATE_CUR is used in response to a broken lease; |
2668 | + * allowing it to break the lease and return EAGAIN leaves the |
2669 | + * client unable to make progress in returning the delegation */ |
2670 | + if (open->op_claim_type == NFS4_OPEN_CLAIM_DELEGATE_CUR) |
2671 | + access |= NFSD_MAY_NOT_BREAK_LEASE; |
2672 | |
2673 | if (!fp->fi_fds[oflag]) { |
2674 | status = nfsd_open(rqstp, cur_fh, S_IFREG, access, |
2675 | @@ -2586,7 +2578,7 @@ nfs4_new_open(struct svc_rqst *rqstp, struct nfs4_stateid **stpp, |
2676 | if (stp == NULL) |
2677 | return nfserr_resource; |
2678 | |
2679 | - status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open->op_share_access); |
2680 | + status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open); |
2681 | if (status) { |
2682 | kmem_cache_free(stateid_slab, stp); |
2683 | return status; |
2684 | @@ -2619,14 +2611,14 @@ nfs4_upgrade_open(struct svc_rqst *rqstp, struct nfs4_file *fp, struct svc_fh *c |
2685 | |
2686 | new_access = !test_bit(op_share_access, &stp->st_access_bmap); |
2687 | if (new_access) { |
2688 | - status = nfs4_get_vfs_file(rqstp, fp, cur_fh, op_share_access); |
2689 | + status = nfs4_get_vfs_file(rqstp, fp, cur_fh, open); |
2690 | if (status) |
2691 | return status; |
2692 | } |
2693 | status = nfsd4_truncate(rqstp, cur_fh, open); |
2694 | if (status) { |
2695 | if (new_access) { |
2696 | - int oflag = nfs4_access_to_omode(new_access); |
2697 | + int oflag = nfs4_access_to_omode(op_share_access); |
2698 | nfs4_file_put_access(fp, oflag); |
2699 | } |
2700 | return status; |
2701 | @@ -3384,18 +3376,15 @@ out: |
2702 | return status; |
2703 | } |
2704 | |
2705 | - |
2706 | -/* |
2707 | - * unset all bits in union bitmap (bmap) that |
2708 | - * do not exist in share (from successful OPEN_DOWNGRADE) |
2709 | - */ |
2710 | -static void |
2711 | -reset_union_bmap_access(unsigned long access, unsigned long *bmap) |
2712 | +static inline void nfs4_file_downgrade(struct nfs4_stateid *stp, unsigned int to_access) |
2713 | { |
2714 | int i; |
2715 | + |
2716 | for (i = 1; i < 4; i++) { |
2717 | - if ((i & access) != i) |
2718 | - __clear_bit(i, bmap); |
2719 | + if (test_bit(i, &stp->st_access_bmap) && !(i & to_access)) { |
2720 | + nfs4_file_put_access(stp->st_file, i); |
2721 | + __clear_bit(i, &stp->st_access_bmap); |
2722 | + } |
2723 | } |
2724 | } |
2725 | |
2726 | @@ -3416,7 +3405,6 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp, |
2727 | { |
2728 | __be32 status; |
2729 | struct nfs4_stateid *stp; |
2730 | - unsigned int share_access; |
2731 | |
2732 | dprintk("NFSD: nfsd4_open_downgrade on file %.*s\n", |
2733 | (int)cstate->current_fh.fh_dentry->d_name.len, |
2734 | @@ -3445,10 +3433,8 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp, |
2735 | stp->st_deny_bmap, od->od_share_deny); |
2736 | goto out; |
2737 | } |
2738 | - set_access(&share_access, stp->st_access_bmap); |
2739 | - nfs4_file_downgrade(stp->st_file, share_access & ~od->od_share_access); |
2740 | + nfs4_file_downgrade(stp, od->od_share_access); |
2741 | |
2742 | - reset_union_bmap_access(od->od_share_access, &stp->st_access_bmap); |
2743 | reset_union_bmap_deny(od->od_share_deny, &stp->st_deny_bmap); |
2744 | |
2745 | update_stateid(&stp->st_stateid); |
2746 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
2747 | index fc5bc27..5bff4c6 100644 |
2748 | --- a/fs/proc/base.c |
2749 | +++ b/fs/proc/base.c |
2750 | @@ -2707,9 +2707,16 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) |
2751 | { |
2752 | struct task_io_accounting acct = task->ioac; |
2753 | unsigned long flags; |
2754 | + int result; |
2755 | |
2756 | - if (!ptrace_may_access(task, PTRACE_MODE_READ)) |
2757 | - return -EACCES; |
2758 | + result = mutex_lock_killable(&task->signal->cred_guard_mutex); |
2759 | + if (result) |
2760 | + return result; |
2761 | + |
2762 | + if (!ptrace_may_access(task, PTRACE_MODE_READ)) { |
2763 | + result = -EACCES; |
2764 | + goto out_unlock; |
2765 | + } |
2766 | |
2767 | if (whole && lock_task_sighand(task, &flags)) { |
2768 | struct task_struct *t = task; |
2769 | @@ -2720,7 +2727,7 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) |
2770 | |
2771 | unlock_task_sighand(task, &flags); |
2772 | } |
2773 | - return sprintf(buffer, |
2774 | + result = sprintf(buffer, |
2775 | "rchar: %llu\n" |
2776 | "wchar: %llu\n" |
2777 | "syscr: %llu\n" |
2778 | @@ -2735,6 +2742,9 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) |
2779 | (unsigned long long)acct.read_bytes, |
2780 | (unsigned long long)acct.write_bytes, |
2781 | (unsigned long long)acct.cancelled_write_bytes); |
2782 | +out_unlock: |
2783 | + mutex_unlock(&task->signal->cred_guard_mutex); |
2784 | + return result; |
2785 | } |
2786 | |
2787 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) |
2788 | diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h |
2789 | index 4ff0988..55814aa 100644 |
2790 | --- a/include/linux/firewire-cdev.h |
2791 | +++ b/include/linux/firewire-cdev.h |
2792 | @@ -475,6 +475,9 @@ union fw_cdev_event { |
2793 | * of the bus. This does not cause a bus reset to happen. |
2794 | * @bus_reset_closure: Value of &closure in this and subsequent bus reset events |
2795 | * @card: The index of the card this device belongs to |
2796 | + * |
2797 | + * As a side effect, reception of %FW_CDEV_EVENT_BUS_RESET events to be read(2) |
2798 | + * is started by this ioctl. |
2799 | */ |
2800 | struct fw_cdev_get_info { |
2801 | __u32 version; |
2802 | diff --git a/include/linux/mm.h b/include/linux/mm.h |
2803 | index 9670f71..1036614 100644 |
2804 | --- a/include/linux/mm.h |
2805 | +++ b/include/linux/mm.h |
2806 | @@ -985,6 +985,8 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, |
2807 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
2808 | struct page **pages); |
2809 | struct page *get_dump_page(unsigned long addr); |
2810 | +extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, |
2811 | + unsigned long address, unsigned int fault_flags); |
2812 | |
2813 | extern int try_to_release_page(struct page * page, gfp_t gfp_mask); |
2814 | extern void do_invalidatepage(struct page *page, unsigned long offset); |
2815 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h |
2816 | index 9e19477..33b5968 100644 |
2817 | --- a/include/linux/netdevice.h |
2818 | +++ b/include/linux/netdevice.h |
2819 | @@ -1688,9 +1688,12 @@ static inline int skb_gro_header_hard(struct sk_buff *skb, unsigned int hlen) |
2820 | static inline void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen, |
2821 | unsigned int offset) |
2822 | { |
2823 | + if (!pskb_may_pull(skb, hlen)) |
2824 | + return NULL; |
2825 | + |
2826 | NAPI_GRO_CB(skb)->frag0 = NULL; |
2827 | NAPI_GRO_CB(skb)->frag0_len = 0; |
2828 | - return pskb_may_pull(skb, hlen) ? skb->data + offset : NULL; |
2829 | + return skb->data + offset; |
2830 | } |
2831 | |
2832 | static inline void *skb_gro_mac_header(struct sk_buff *skb) |
2833 | diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h |
2834 | index 1b93b9c..b522370 100644 |
2835 | --- a/include/linux/nfs_fs.h |
2836 | +++ b/include/linux/nfs_fs.h |
2837 | @@ -99,9 +99,10 @@ struct nfs_open_context { |
2838 | |
2839 | struct nfs_open_dir_context { |
2840 | struct rpc_cred *cred; |
2841 | + unsigned long attr_gencount; |
2842 | __u64 dir_cookie; |
2843 | __u64 dup_cookie; |
2844 | - int duped; |
2845 | + signed char duped; |
2846 | }; |
2847 | |
2848 | /* |
2849 | diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h |
2850 | index 00848d8..be2eba7 100644 |
2851 | --- a/include/linux/nfs_xdr.h |
2852 | +++ b/include/linux/nfs_xdr.h |
2853 | @@ -262,7 +262,7 @@ struct nfs4_layoutcommit_res { |
2854 | struct nfs4_layoutcommit_data { |
2855 | struct rpc_task task; |
2856 | struct nfs_fattr fattr; |
2857 | - struct pnfs_layout_segment *lseg; |
2858 | + struct list_head lseg_list; |
2859 | struct rpc_cred *cred; |
2860 | struct nfs4_layoutcommit_args args; |
2861 | struct nfs4_layoutcommit_res res; |
2862 | diff --git a/ipc/sem.c b/ipc/sem.c |
2863 | index 34193ed..e68a8f5 100644 |
2864 | --- a/ipc/sem.c |
2865 | +++ b/ipc/sem.c |
2866 | @@ -1456,15 +1456,24 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, |
2867 | } |
2868 | |
2869 | sma = sem_lock(ns, semid); |
2870 | + |
2871 | + /* |
2872 | + * Wait until it's guaranteed that no wakeup_sem_queue_do() is ongoing. |
2873 | + */ |
2874 | + error = get_queue_result(&queue); |
2875 | + |
2876 | + /* |
2877 | + * Array removed? If yes, leave without sem_unlock(). |
2878 | + */ |
2879 | if (IS_ERR(sma)) { |
2880 | error = -EIDRM; |
2881 | goto out_free; |
2882 | } |
2883 | |
2884 | - error = get_queue_result(&queue); |
2885 | |
2886 | /* |
2887 | - * If queue.status != -EINTR we are woken up by another process |
2888 | + * If queue.status != -EINTR we are woken up by another process. |
2889 | + * Leave without unlink_queue(), but with sem_unlock(). |
2890 | */ |
2891 | |
2892 | if (error != -EINTR) { |
2893 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
2894 | index 9efe710..32a6151 100644 |
2895 | --- a/kernel/events/core.c |
2896 | +++ b/kernel/events/core.c |
2897 | @@ -5016,11 +5016,8 @@ static int __perf_event_overflow(struct perf_event *event, int nmi, |
2898 | if (events && atomic_dec_and_test(&event->event_limit)) { |
2899 | ret = 1; |
2900 | event->pending_kill = POLL_HUP; |
2901 | - if (nmi) { |
2902 | - event->pending_disable = 1; |
2903 | - irq_work_queue(&event->pending); |
2904 | - } else |
2905 | - perf_event_disable(event); |
2906 | + event->pending_disable = 1; |
2907 | + irq_work_queue(&event->pending); |
2908 | } |
2909 | |
2910 | if (event->overflow_handler) |
2911 | diff --git a/kernel/futex.c b/kernel/futex.c |
2912 | index fe28dc2..7a0a4ed 100644 |
2913 | --- a/kernel/futex.c |
2914 | +++ b/kernel/futex.c |
2915 | @@ -355,8 +355,8 @@ static int fault_in_user_writeable(u32 __user *uaddr) |
2916 | int ret; |
2917 | |
2918 | down_read(&mm->mmap_sem); |
2919 | - ret = get_user_pages(current, mm, (unsigned long)uaddr, |
2920 | - 1, 1, 0, NULL, NULL); |
2921 | + ret = fixup_user_fault(current, mm, (unsigned long)uaddr, |
2922 | + FAULT_FLAG_WRITE); |
2923 | up_read(&mm->mmap_sem); |
2924 | |
2925 | return ret < 0 ? ret : 0; |
2926 | diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h |
2927 | index 229f859..f807407 100644 |
2928 | --- a/kernel/trace/trace.h |
2929 | +++ b/kernel/trace/trace.h |
2930 | @@ -677,6 +677,7 @@ struct event_subsystem { |
2931 | struct dentry *entry; |
2932 | struct event_filter *filter; |
2933 | int nr_events; |
2934 | + int ref_count; |
2935 | }; |
2936 | |
2937 | #define FILTER_PRED_INVALID ((unsigned short)-1) |
2938 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
2939 | index 686ec39..3e2a7c9 100644 |
2940 | --- a/kernel/trace/trace_events.c |
2941 | +++ b/kernel/trace/trace_events.c |
2942 | @@ -244,6 +244,35 @@ static void ftrace_clear_events(void) |
2943 | mutex_unlock(&event_mutex); |
2944 | } |
2945 | |
2946 | +static void __put_system(struct event_subsystem *system) |
2947 | +{ |
2948 | + struct event_filter *filter = system->filter; |
2949 | + |
2950 | + WARN_ON_ONCE(system->ref_count == 0); |
2951 | + if (--system->ref_count) |
2952 | + return; |
2953 | + |
2954 | + if (filter) { |
2955 | + kfree(filter->filter_string); |
2956 | + kfree(filter); |
2957 | + } |
2958 | + kfree(system->name); |
2959 | + kfree(system); |
2960 | +} |
2961 | + |
2962 | +static void __get_system(struct event_subsystem *system) |
2963 | +{ |
2964 | + WARN_ON_ONCE(system->ref_count == 0); |
2965 | + system->ref_count++; |
2966 | +} |
2967 | + |
2968 | +static void put_system(struct event_subsystem *system) |
2969 | +{ |
2970 | + mutex_lock(&event_mutex); |
2971 | + __put_system(system); |
2972 | + mutex_unlock(&event_mutex); |
2973 | +} |
2974 | + |
2975 | /* |
2976 | * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events. |
2977 | */ |
2978 | @@ -528,7 +557,7 @@ system_enable_read(struct file *filp, char __user *ubuf, size_t cnt, |
2979 | loff_t *ppos) |
2980 | { |
2981 | const char set_to_char[4] = { '?', '0', '1', 'X' }; |
2982 | - const char *system = filp->private_data; |
2983 | + struct event_subsystem *system = filp->private_data; |
2984 | struct ftrace_event_call *call; |
2985 | char buf[2]; |
2986 | int set = 0; |
2987 | @@ -539,7 +568,7 @@ system_enable_read(struct file *filp, char __user *ubuf, size_t cnt, |
2988 | if (!call->name || !call->class || !call->class->reg) |
2989 | continue; |
2990 | |
2991 | - if (system && strcmp(call->class->system, system) != 0) |
2992 | + if (system && strcmp(call->class->system, system->name) != 0) |
2993 | continue; |
2994 | |
2995 | /* |
2996 | @@ -569,7 +598,8 @@ static ssize_t |
2997 | system_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, |
2998 | loff_t *ppos) |
2999 | { |
3000 | - const char *system = filp->private_data; |
3001 | + struct event_subsystem *system = filp->private_data; |
3002 | + const char *name = NULL; |
3003 | unsigned long val; |
3004 | char buf[64]; |
3005 | ssize_t ret; |
3006 | @@ -593,7 +623,14 @@ system_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, |
3007 | if (val != 0 && val != 1) |
3008 | return -EINVAL; |
3009 | |
3010 | - ret = __ftrace_set_clr_event(NULL, system, NULL, val); |
3011 | + /* |
3012 | + * Opening of "enable" adds a ref count to system, |
3013 | + * so the name is safe to use. |
3014 | + */ |
3015 | + if (system) |
3016 | + name = system->name; |
3017 | + |
3018 | + ret = __ftrace_set_clr_event(NULL, name, NULL, val); |
3019 | if (ret) |
3020 | goto out; |
3021 | |
3022 | @@ -826,6 +863,52 @@ event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, |
3023 | return cnt; |
3024 | } |
3025 | |
3026 | +static LIST_HEAD(event_subsystems); |
3027 | + |
3028 | +static int subsystem_open(struct inode *inode, struct file *filp) |
3029 | +{ |
3030 | + struct event_subsystem *system = NULL; |
3031 | + int ret; |
3032 | + |
3033 | + if (!inode->i_private) |
3034 | + goto skip_search; |
3035 | + |
3036 | + /* Make sure the system still exists */ |
3037 | + mutex_lock(&event_mutex); |
3038 | + list_for_each_entry(system, &event_subsystems, list) { |
3039 | + if (system == inode->i_private) { |
3040 | + /* Don't open systems with no events */ |
3041 | + if (!system->nr_events) { |
3042 | + system = NULL; |
3043 | + break; |
3044 | + } |
3045 | + __get_system(system); |
3046 | + break; |
3047 | + } |
3048 | + } |
3049 | + mutex_unlock(&event_mutex); |
3050 | + |
3051 | + if (system != inode->i_private) |
3052 | + return -ENODEV; |
3053 | + |
3054 | + skip_search: |
3055 | + ret = tracing_open_generic(inode, filp); |
3056 | + if (ret < 0 && system) |
3057 | + put_system(system); |
3058 | + |
3059 | + return ret; |
3060 | +} |
3061 | + |
3062 | +static int subsystem_release(struct inode *inode, struct file *file) |
3063 | +{ |
3064 | + struct event_subsystem *system = inode->i_private; |
3065 | + |
3066 | + if (system) |
3067 | + put_system(system); |
3068 | + |
3069 | + return 0; |
3070 | +} |
3071 | + |
3072 | static ssize_t |
3073 | subsystem_filter_read(struct file *filp, char __user *ubuf, size_t cnt, |
3074 | loff_t *ppos) |
3075 | @@ -963,17 +1046,19 @@ static const struct file_operations ftrace_event_filter_fops = { |
3076 | }; |
3077 | |
3078 | static const struct file_operations ftrace_subsystem_filter_fops = { |
3079 | - .open = tracing_open_generic, |
3080 | + .open = subsystem_open, |
3081 | .read = subsystem_filter_read, |
3082 | .write = subsystem_filter_write, |
3083 | .llseek = default_llseek, |
3084 | + .release = subsystem_release, |
3085 | }; |
3086 | |
3087 | static const struct file_operations ftrace_system_enable_fops = { |
3088 | - .open = tracing_open_generic, |
3089 | + .open = subsystem_open, |
3090 | .read = system_enable_read, |
3091 | .write = system_enable_write, |
3092 | .llseek = default_llseek, |
3093 | + .release = subsystem_release, |
3094 | }; |
3095 | |
3096 | static const struct file_operations ftrace_show_header_fops = { |
3097 | @@ -1002,8 +1087,6 @@ static struct dentry *event_trace_events_dir(void) |
3098 | return d_events; |
3099 | } |
3100 | |
3101 | -static LIST_HEAD(event_subsystems); |
3102 | - |
3103 | static struct dentry * |
3104 | event_subsystem_dir(const char *name, struct dentry *d_events) |
3105 | { |
3106 | @@ -1013,6 +1096,7 @@ event_subsystem_dir(const char *name, struct dentry *d_events) |
3107 | /* First see if we did not already create this dir */ |
3108 | list_for_each_entry(system, &event_subsystems, list) { |
3109 | if (strcmp(system->name, name) == 0) { |
3110 | + __get_system(system); |
3111 | system->nr_events++; |
3112 | return system->entry; |
3113 | } |
3114 | @@ -1035,6 +1119,7 @@ event_subsystem_dir(const char *name, struct dentry *d_events) |
3115 | } |
3116 | |
3117 | system->nr_events = 1; |
3118 | + system->ref_count = 1; |
3119 | system->name = kstrdup(name, GFP_KERNEL); |
3120 | if (!system->name) { |
3121 | debugfs_remove(system->entry); |
3122 | @@ -1062,8 +1147,7 @@ event_subsystem_dir(const char *name, struct dentry *d_events) |
3123 | "'%s/filter' entry\n", name); |
3124 | } |
3125 | |
3126 | - trace_create_file("enable", 0644, system->entry, |
3127 | - (void *)system->name, |
3128 | + trace_create_file("enable", 0644, system->entry, system, |
3129 | &ftrace_system_enable_fops); |
3130 | |
3131 | return system->entry; |
3132 | @@ -1184,16 +1268,9 @@ static void remove_subsystem_dir(const char *name) |
3133 | list_for_each_entry(system, &event_subsystems, list) { |
3134 | if (strcmp(system->name, name) == 0) { |
3135 | if (!--system->nr_events) { |
3136 | - struct event_filter *filter = system->filter; |
3137 | - |
3138 | debugfs_remove_recursive(system->entry); |
3139 | list_del(&system->list); |
3140 | - if (filter) { |
3141 | - kfree(filter->filter_string); |
3142 | - kfree(filter); |
3143 | - } |
3144 | - kfree(system->name); |
3145 | - kfree(system); |
3146 | + __put_system(system); |
3147 | } |
3148 | break; |
3149 | } |
3150 | diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c |
3151 | index 8008ddc..256764e 100644 |
3152 | --- a/kernel/trace/trace_events_filter.c |
3153 | +++ b/kernel/trace/trace_events_filter.c |
3154 | @@ -1886,6 +1886,12 @@ int apply_subsystem_event_filter(struct event_subsystem *system, |
3155 | |
3156 | mutex_lock(&event_mutex); |
3157 | |
3158 | + /* Make sure the system still has events */ |
3159 | + if (!system->nr_events) { |
3160 | + err = -ENODEV; |
3161 | + goto out_unlock; |
3162 | + } |
3163 | + |
3164 | if (!strcmp(strstrip(filter_string), "0")) { |
3165 | filter_free_subsystem_preds(system); |
3166 | remove_filter_string(system->filter); |
3167 | diff --git a/lib/xz/xz_private.h b/lib/xz/xz_private.h |
3168 | index a65633e..482b90f 100644 |
3169 | --- a/lib/xz/xz_private.h |
3170 | +++ b/lib/xz/xz_private.h |
3171 | @@ -12,7 +12,7 @@ |
3172 | |
3173 | #ifdef __KERNEL__ |
3174 | # include <linux/xz.h> |
3175 | -# include <asm/byteorder.h> |
3176 | +# include <linux/kernel.h> |
3177 | # include <asm/unaligned.h> |
3178 | /* XZ_PREBOOT may be defined only via decompress_unxz.c. */ |
3179 | # ifndef XZ_PREBOOT |
3180 | diff --git a/mm/backing-dev.c b/mm/backing-dev.c |
3181 | index f032e6e..e56fe35 100644 |
3182 | --- a/mm/backing-dev.c |
3183 | +++ b/mm/backing-dev.c |
3184 | @@ -606,6 +606,7 @@ static void bdi_prune_sb(struct backing_dev_info *bdi) |
3185 | void bdi_unregister(struct backing_dev_info *bdi) |
3186 | { |
3187 | if (bdi->dev) { |
3188 | + bdi_set_min_ratio(bdi, 0); |
3189 | trace_writeback_bdi_unregister(bdi); |
3190 | bdi_prune_sb(bdi); |
3191 | del_timer_sync(&bdi->wb.wakeup_timer); |
3192 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
3193 | index e013b8e..59ac5d6 100644 |
3194 | --- a/mm/memcontrol.c |
3195 | +++ b/mm/memcontrol.c |
3196 | @@ -1730,7 +1730,7 @@ static int mem_cgroup_hierarchical_reclaim(struct mem_cgroup *root_mem, |
3197 | excess = res_counter_soft_limit_excess(&root_mem->res) >> PAGE_SHIFT; |
3198 | |
3199 | /* If memsw_is_minimum==1, swap-out is of-no-use. */ |
3200 | - if (!check_soft && root_mem->memsw_is_minimum) |
3201 | + if (!check_soft && !shrink && root_mem->memsw_is_minimum) |
3202 | noswap = true; |
3203 | |
3204 | while (1) { |
3205 | diff --git a/mm/memory.c b/mm/memory.c |
3206 | index 9b8a01d..d961e19 100644 |
3207 | --- a/mm/memory.c |
3208 | +++ b/mm/memory.c |
3209 | @@ -1816,7 +1816,63 @@ next_page: |
3210 | } |
3211 | EXPORT_SYMBOL(__get_user_pages); |
3212 | |
3213 | -/** |
3214 | +/* |
3215 | + * fixup_user_fault() - manually resolve a user page fault |
3216 | + * @tsk: the task_struct to use for page fault accounting, or |
3217 | + * NULL if faults are not to be recorded. |
3218 | + * @mm: mm_struct of target mm |
3219 | + * @address: user address |
3220 | + * @fault_flags:flags to pass down to handle_mm_fault() |
3221 | + * |
3222 | + * This is meant to be called in the specific scenario where for locking reasons |
3223 | + * we try to access user memory in atomic context (within a pagefault_disable() |
3224 | + * section), this returns -EFAULT, and we want to resolve the user fault before |
3225 | + * trying again. |
3226 | + * |
3227 | + * Typically this is meant to be used by the futex code. |
3228 | + * |
3229 | + * The main difference with get_user_pages() is that this function will |
3230 | + * unconditionally call handle_mm_fault() which will in turn perform all the |
3231 | + * necessary SW fixup of the dirty and young bits in the PTE, while |
3232 | + * handle_mm_fault() only guarantees to update these in the struct page. |
3233 | + * |
3234 | + * This is important for some architectures where those bits also gate the |
3235 | + * access permission to the page because they are maintained in software. On |
3236 | + * such architectures, gup() will not be enough to make a subsequent access |
3237 | + * succeed. |
3238 | + * |
3239 | + * This should be called with the mm_sem held for read. |
3240 | + */ |
3241 | +int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, |
3242 | + unsigned long address, unsigned int fault_flags) |
3243 | +{ |
3244 | + struct vm_area_struct *vma; |
3245 | + int ret; |
3246 | + |
3247 | + vma = find_extend_vma(mm, address); |
3248 | + if (!vma || address < vma->vm_start) |
3249 | + return -EFAULT; |
3250 | + |
3251 | + ret = handle_mm_fault(mm, vma, address, fault_flags); |
3252 | + if (ret & VM_FAULT_ERROR) { |
3253 | + if (ret & VM_FAULT_OOM) |
3254 | + return -ENOMEM; |
3255 | + if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) |
3256 | + return -EHWPOISON; |
3257 | + if (ret & VM_FAULT_SIGBUS) |
3258 | + return -EFAULT; |
3259 | + BUG(); |
3260 | + } |
3261 | + if (tsk) { |
3262 | + if (ret & VM_FAULT_MAJOR) |
3263 | + tsk->maj_flt++; |
3264 | + else |
3265 | + tsk->min_flt++; |
3266 | + } |
3267 | + return 0; |
3268 | +} |
3269 | + |
3270 | +/* |
3271 | * get_user_pages() - pin user pages in memory |
3272 | * @tsk: the task_struct to use for page fault accounting, or |
3273 | * NULL if faults are not to be recorded. |
3274 | diff --git a/mm/oom_kill.c b/mm/oom_kill.c |
3275 | index e4b0991..8093fc7 100644 |
3276 | --- a/mm/oom_kill.c |
3277 | +++ b/mm/oom_kill.c |
3278 | @@ -303,7 +303,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
3279 | do_each_thread(g, p) { |
3280 | unsigned int points; |
3281 | |
3282 | - if (!p->mm) |
3283 | + if (p->exit_state) |
3284 | continue; |
3285 | if (oom_unkillable_task(p, mem, nodemask)) |
3286 | continue; |
3287 | @@ -319,6 +319,8 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, |
3288 | */ |
3289 | if (test_tsk_thread_flag(p, TIF_MEMDIE)) |
3290 | return ERR_PTR(-1UL); |
3291 | + if (!p->mm) |
3292 | + continue; |
3293 | |
3294 | if (p->flags & PF_EXITING) { |
3295 | /* |
3296 | diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h |
3297 | index 54578f2..78cc364 100644 |
3298 | --- a/net/bridge/br_private.h |
3299 | +++ b/net/bridge/br_private.h |
3300 | @@ -124,6 +124,7 @@ struct net_bridge_port |
3301 | bridge_id designated_bridge; |
3302 | u32 path_cost; |
3303 | u32 designated_cost; |
3304 | + unsigned long designated_age; |
3305 | |
3306 | struct timer_list forward_delay_timer; |
3307 | struct timer_list hold_timer; |
3308 | diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c |
3309 | index bb4383e..fcff622 100644 |
3310 | --- a/net/bridge/br_stp.c |
3311 | +++ b/net/bridge/br_stp.c |
3312 | @@ -164,8 +164,7 @@ void br_transmit_config(struct net_bridge_port *p) |
3313 | else { |
3314 | struct net_bridge_port *root |
3315 | = br_get_port(br, br->root_port); |
3316 | - bpdu.message_age = br->max_age |
3317 | - - (root->message_age_timer.expires - jiffies) |
3318 | + bpdu.message_age = (jiffies - root->designated_age) |
3319 | + MESSAGE_AGE_INCR; |
3320 | } |
3321 | bpdu.max_age = br->max_age; |
3322 | @@ -189,6 +188,7 @@ static inline void br_record_config_information(struct net_bridge_port *p, |
3323 | p->designated_cost = bpdu->root_path_cost; |
3324 | p->designated_bridge = bpdu->bridge_id; |
3325 | p->designated_port = bpdu->port_id; |
3326 | + p->designated_age = jiffies + bpdu->message_age; |
3327 | |
3328 | mod_timer(&p->message_age_timer, jiffies |
3329 | + (p->br->max_age - bpdu->message_age)); |
3330 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c |
3331 | index fd14116..4fb7704 100644 |
3332 | --- a/net/core/ethtool.c |
3333 | +++ b/net/core/ethtool.c |
3334 | @@ -1227,7 +1227,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) |
3335 | regs.len = reglen; |
3336 | |
3337 | regbuf = vzalloc(reglen); |
3338 | - if (!regbuf) |
3339 | + if (reglen && !regbuf) |
3340 | return -ENOMEM; |
3341 | |
3342 | ops->get_regs(dev, ®s, regbuf); |
3343 | @@ -1236,7 +1236,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) |
3344 | if (copy_to_user(useraddr, ®s, sizeof(regs))) |
3345 | goto out; |
3346 | useraddr += offsetof(struct ethtool_regs, data); |
3347 | - if (copy_to_user(useraddr, regbuf, regs.len)) |
3348 | + if (regbuf && copy_to_user(useraddr, regbuf, regs.len)) |
3349 | goto out; |
3350 | ret = 0; |
3351 | |
3352 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
3353 | index d595265..7a334fd 100644 |
3354 | --- a/net/mac80211/mlme.c |
3355 | +++ b/net/mac80211/mlme.c |
3356 | @@ -2200,6 +2200,9 @@ void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) |
3357 | { |
3358 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
3359 | |
3360 | + if (!ifmgd->associated) |
3361 | + return; |
3362 | + |
3363 | if (test_and_clear_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running)) |
3364 | add_timer(&ifmgd->timer); |
3365 | if (test_and_clear_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running)) |
3366 | diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c |
3367 | index ab86b79..bd31208 100644 |
3368 | --- a/net/sunrpc/svc_xprt.c |
3369 | +++ b/net/sunrpc/svc_xprt.c |
3370 | @@ -902,12 +902,13 @@ void svc_delete_xprt(struct svc_xprt *xprt) |
3371 | if (!test_and_set_bit(XPT_DETACHED, &xprt->xpt_flags)) |
3372 | list_del_init(&xprt->xpt_list); |
3373 | /* |
3374 | - * We used to delete the transport from whichever list |
3375 | - * it's sk_xprt.xpt_ready node was on, but we don't actually |
3376 | - * need to. This is because the only time we're called |
3377 | - * while still attached to a queue, the queue itself |
3378 | - * is about to be destroyed (in svc_destroy). |
3379 | + * The only time we're called while xpt_ready is still on a list |
3380 | + * is while the list itself is about to be destroyed (in |
3381 | + * svc_destroy). BUT svc_xprt_enqueue could still be attempting |
3382 | + * to add new entries to the sp_sockets list, so we can't leave |
3383 | + * a freed xprt on it. |
3384 | */ |
3385 | + list_del_init(&xprt->xpt_ready); |
3386 | if (test_bit(XPT_TEMP, &xprt->xpt_flags)) |
3387 | serv->sv_tmpcnt--; |
3388 | spin_unlock_bh(&serv->sv_lock); |
3389 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c |
3390 | index 1ad0f39..4453eb7 100644 |
3391 | --- a/net/wireless/reg.c |
3392 | +++ b/net/wireless/reg.c |
3393 | @@ -1125,12 +1125,13 @@ void wiphy_update_regulatory(struct wiphy *wiphy, |
3394 | enum ieee80211_band band; |
3395 | |
3396 | if (ignore_reg_update(wiphy, initiator)) |
3397 | - goto out; |
3398 | + return; |
3399 | + |
3400 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { |
3401 | if (wiphy->bands[band]) |
3402 | handle_band(wiphy, band, initiator); |
3403 | } |
3404 | -out: |
3405 | + |
3406 | reg_process_beacons(wiphy); |
3407 | reg_process_ht_flags(wiphy); |
3408 | if (wiphy->reg_notifier) |
3409 | diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c |
3410 | index c825c6e..78adc43 100644 |
3411 | --- a/security/apparmor/domain.c |
3412 | +++ b/security/apparmor/domain.c |
3413 | @@ -73,7 +73,6 @@ static int may_change_ptraced_domain(struct task_struct *task, |
3414 | cred = get_task_cred(tracer); |
3415 | tracerp = aa_cred_profile(cred); |
3416 | } |
3417 | - rcu_read_unlock(); |
3418 | |
3419 | /* not ptraced */ |
3420 | if (!tracer || unconfined(tracerp)) |
3421 | @@ -82,6 +81,7 @@ static int may_change_ptraced_domain(struct task_struct *task, |
3422 | error = aa_may_ptrace(tracer, tracerp, to_profile, PTRACE_MODE_ATTACH); |
3423 | |
3424 | out: |
3425 | + rcu_read_unlock(); |
3426 | if (cred) |
3427 | put_cred(cred); |
3428 | |
3429 | diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c |
3430 | index 3d2fd14..3783202 100644 |
3431 | --- a/security/apparmor/lsm.c |
3432 | +++ b/security/apparmor/lsm.c |
3433 | @@ -127,7 +127,7 @@ static int apparmor_capget(struct task_struct *target, kernel_cap_t *effective, |
3434 | *inheritable = cred->cap_inheritable; |
3435 | *permitted = cred->cap_permitted; |
3436 | |
3437 | - if (!unconfined(profile)) { |
3438 | + if (!unconfined(profile) && !COMPLAIN_MODE(profile)) { |
3439 | *effective = cap_intersect(*effective, profile->caps.allow); |
3440 | *permitted = cap_intersect(*permitted, profile->caps.allow); |
3441 | } |
3442 | diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c |
3443 | index 5fb2e28..91cdf94 100644 |
3444 | --- a/sound/core/pcm_compat.c |
3445 | +++ b/sound/core/pcm_compat.c |
3446 | @@ -342,7 +342,7 @@ static int snd_pcm_ioctl_xfern_compat(struct snd_pcm_substream *substream, |
3447 | kfree(bufs); |
3448 | return -EFAULT; |
3449 | } |
3450 | - bufs[ch] = compat_ptr(ptr); |
3451 | + bufs[i] = compat_ptr(ptr); |
3452 | bufptr++; |
3453 | } |
3454 | if (dir == SNDRV_PCM_STREAM_PLAYBACK) |
3455 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3456 | index b48fb43..524ff26 100644 |
3457 | --- a/sound/pci/hda/patch_realtek.c |
3458 | +++ b/sound/pci/hda/patch_realtek.c |
3459 | @@ -1578,13 +1578,15 @@ static void alc_init_auto_hp(struct hda_codec *codec) |
3460 | if (present == 3) |
3461 | spec->automute_hp_lo = 1; /* both HP and LO automute */ |
3462 | |
3463 | - if (!cfg->speaker_pins[0]) { |
3464 | + if (!cfg->speaker_pins[0] && |
3465 | + cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { |
3466 | memcpy(cfg->speaker_pins, cfg->line_out_pins, |
3467 | sizeof(cfg->speaker_pins)); |
3468 | cfg->speaker_outs = cfg->line_outs; |
3469 | } |
3470 | |
3471 | - if (!cfg->hp_pins[0]) { |
3472 | + if (!cfg->hp_pins[0] && |
3473 | + cfg->line_out_type == AUTO_PIN_HP_OUT) { |
3474 | memcpy(cfg->hp_pins, cfg->line_out_pins, |
3475 | sizeof(cfg->hp_pins)); |
3476 | cfg->hp_outs = cfg->line_outs; |
3477 | @@ -1603,6 +1605,7 @@ static void alc_init_auto_hp(struct hda_codec *codec) |
3478 | spec->automute_mode = ALC_AUTOMUTE_PIN; |
3479 | } |
3480 | if (spec->automute && cfg->line_out_pins[0] && |
3481 | + cfg->speaker_pins[0] && |
3482 | cfg->line_out_pins[0] != cfg->hp_pins[0] && |
3483 | cfg->line_out_pins[0] != cfg->speaker_pins[0]) { |
3484 | for (i = 0; i < cfg->line_outs; i++) { |
3485 | diff --git a/sound/pci/oxygen/xonar_pcm179x.c b/sound/pci/oxygen/xonar_pcm179x.c |
3486 | index 54cad38..32d096c 100644 |
3487 | --- a/sound/pci/oxygen/xonar_pcm179x.c |
3488 | +++ b/sound/pci/oxygen/xonar_pcm179x.c |
3489 | @@ -327,8 +327,10 @@ static void pcm1796_init(struct oxygen *chip) |
3490 | { |
3491 | struct xonar_pcm179x *data = chip->model_data; |
3492 | |
3493 | - data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = PCM1796_MUTE | |
3494 | + data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = |
3495 | PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD; |
3496 | + if (!data->broken_i2c) |
3497 | + data->pcm1796_regs[0][18 - PCM1796_REG_BASE] |= PCM1796_MUTE; |
3498 | data->pcm1796_regs[0][19 - PCM1796_REG_BASE] = |
3499 | PCM1796_FLT_SHARP | PCM1796_ATS_1; |
3500 | data->pcm1796_regs[0][20 - PCM1796_REG_BASE] = |
3501 | @@ -1123,6 +1125,7 @@ int __devinit get_xonar_pcm179x_model(struct oxygen *chip, |
3502 | chip->model.control_filter = xonar_st_h6_control_filter; |
3503 | chip->model.dac_channels_pcm = 8; |
3504 | chip->model.dac_channels_mixer = 8; |
3505 | + chip->model.dac_volume_min = 255; |
3506 | chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128); |
3507 | break; |
3508 | } |
3509 | diff --git a/sound/soc/davinci/davinci-vcif.c b/sound/soc/davinci/davinci-vcif.c |
3510 | index 9259f1f..1f11525 100644 |
3511 | --- a/sound/soc/davinci/davinci-vcif.c |
3512 | +++ b/sound/soc/davinci/davinci-vcif.c |
3513 | @@ -62,9 +62,9 @@ static void davinci_vcif_start(struct snd_pcm_substream *substream) |
3514 | w = readl(davinci_vc->base + DAVINCI_VC_CTRL); |
3515 | |
3516 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
3517 | - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTDAC, 1); |
3518 | + MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTDAC, 0); |
3519 | else |
3520 | - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTADC, 1); |
3521 | + MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTADC, 0); |
3522 | |
3523 | writel(w, davinci_vc->base + DAVINCI_VC_CTRL); |
3524 | } |
3525 | @@ -80,9 +80,9 @@ static void davinci_vcif_stop(struct snd_pcm_substream *substream) |
3526 | /* Reset transmitter/receiver and sample rate/frame sync generators */ |
3527 | w = readl(davinci_vc->base + DAVINCI_VC_CTRL); |
3528 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
3529 | - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTDAC, 0); |
3530 | + MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTDAC, 1); |
3531 | else |
3532 | - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTADC, 0); |
3533 | + MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTADC, 1); |
3534 | |
3535 | writel(w, davinci_vc->base + DAVINCI_VC_CTRL); |
3536 | } |
3537 | @@ -159,6 +159,7 @@ static int davinci_vcif_trigger(struct snd_pcm_substream *substream, int cmd, |
3538 | case SNDRV_PCM_TRIGGER_RESUME: |
3539 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
3540 | davinci_vcif_start(substream); |
3541 | + break; |
3542 | case SNDRV_PCM_TRIGGER_STOP: |
3543 | case SNDRV_PCM_TRIGGER_SUSPEND: |
3544 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
3545 | diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c |
3546 | index b194be0..59abd84 100644 |
3547 | --- a/sound/soc/soc-core.c |
3548 | +++ b/sound/soc/soc-core.c |
3549 | @@ -1124,6 +1124,7 @@ int snd_soc_suspend(struct device *dev) |
3550 | case SND_SOC_BIAS_OFF: |
3551 | codec->driver->suspend(codec, PMSG_SUSPEND); |
3552 | codec->suspended = 1; |
3553 | + codec->cache_sync = 1; |
3554 | break; |
3555 | default: |
3556 | dev_dbg(codec->dev, "CODEC is on over suspend\n"); |
3557 | diff --git a/tools/perf/Makefile b/tools/perf/Makefile |
3558 | index 940257b..c168366 100644 |
3559 | --- a/tools/perf/Makefile |
3560 | +++ b/tools/perf/Makefile |
3561 | @@ -52,7 +52,10 @@ ifeq ($(ARCH),i386) |
3562 | endif |
3563 | ifeq ($(ARCH),x86_64) |
3564 | ARCH := x86 |
3565 | - IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -xc - | tail -n 1) |
3566 | + IS_X86_64 := 0 |
3567 | + ifeq (, $(findstring m32,$(EXTRA_CFLAGS))) |
3568 | + IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -xc - | tail -n 1) |
3569 | + endif |
3570 | ifeq (${IS_X86_64}, 1) |
3571 | RAW_ARCH := x86_64 |
3572 | ARCH_CFLAGS := -DARCH_X86_64 |
3573 | diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c |
3574 | index afb0849..cb2959a 100644 |
3575 | --- a/tools/perf/util/header.c |
3576 | +++ b/tools/perf/util/header.c |
3577 | @@ -877,9 +877,12 @@ int perf_session__read_header(struct perf_session *session, int fd) |
3578 | struct perf_evsel *evsel; |
3579 | off_t tmp; |
3580 | |
3581 | - if (perf_header__getbuffer64(header, fd, &f_attr, sizeof(f_attr))) |
3582 | + if (readn(fd, &f_attr, sizeof(f_attr)) <= 0) |
3583 | goto out_errno; |
3584 | |
3585 | + if (header->needs_swap) |
3586 | + perf_event__attr_swap(&f_attr.attr); |
3587 | + |
3588 | tmp = lseek(fd, 0, SEEK_CUR); |
3589 | evsel = perf_evsel__new(&f_attr.attr, i); |
3590 | |
3591 | diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c |
3592 | index f5a8fbd..2dbf0ab 100644 |
3593 | --- a/tools/perf/util/session.c |
3594 | +++ b/tools/perf/util/session.c |
3595 | @@ -407,20 +407,26 @@ static void perf_event__read_swap(union perf_event *event) |
3596 | event->read.id = bswap_64(event->read.id); |
3597 | } |
3598 | |
3599 | -static void perf_event__attr_swap(union perf_event *event) |
3600 | +/* exported for swapping attributes in file header */ |
3601 | +void perf_event__attr_swap(struct perf_event_attr *attr) |
3602 | +{ |
3603 | + attr->type = bswap_32(attr->type); |
3604 | + attr->size = bswap_32(attr->size); |
3605 | + attr->config = bswap_64(attr->config); |
3606 | + attr->sample_period = bswap_64(attr->sample_period); |
3607 | + attr->sample_type = bswap_64(attr->sample_type); |
3608 | + attr->read_format = bswap_64(attr->read_format); |
3609 | + attr->wakeup_events = bswap_32(attr->wakeup_events); |
3610 | + attr->bp_type = bswap_32(attr->bp_type); |
3611 | + attr->bp_addr = bswap_64(attr->bp_addr); |
3612 | + attr->bp_len = bswap_64(attr->bp_len); |
3613 | +} |
3614 | + |
3615 | +static void perf_event__hdr_attr_swap(union perf_event *event) |
3616 | { |
3617 | size_t size; |
3618 | |
3619 | - event->attr.attr.type = bswap_32(event->attr.attr.type); |
3620 | - event->attr.attr.size = bswap_32(event->attr.attr.size); |
3621 | - event->attr.attr.config = bswap_64(event->attr.attr.config); |
3622 | - event->attr.attr.sample_period = bswap_64(event->attr.attr.sample_period); |
3623 | - event->attr.attr.sample_type = bswap_64(event->attr.attr.sample_type); |
3624 | - event->attr.attr.read_format = bswap_64(event->attr.attr.read_format); |
3625 | - event->attr.attr.wakeup_events = bswap_32(event->attr.attr.wakeup_events); |
3626 | - event->attr.attr.bp_type = bswap_32(event->attr.attr.bp_type); |
3627 | - event->attr.attr.bp_addr = bswap_64(event->attr.attr.bp_addr); |
3628 | - event->attr.attr.bp_len = bswap_64(event->attr.attr.bp_len); |
3629 | + perf_event__attr_swap(&event->attr.attr); |
3630 | |
3631 | size = event->header.size; |
3632 | size -= (void *)&event->attr.id - (void *)event; |
3633 | @@ -448,7 +454,7 @@ static perf_event__swap_op perf_event__swap_ops[] = { |
3634 | [PERF_RECORD_LOST] = perf_event__all64_swap, |
3635 | [PERF_RECORD_READ] = perf_event__read_swap, |
3636 | [PERF_RECORD_SAMPLE] = perf_event__all64_swap, |
3637 | - [PERF_RECORD_HEADER_ATTR] = perf_event__attr_swap, |
3638 | + [PERF_RECORD_HEADER_ATTR] = perf_event__hdr_attr_swap, |
3639 | [PERF_RECORD_HEADER_EVENT_TYPE] = perf_event__event_type_swap, |
3640 | [PERF_RECORD_HEADER_TRACING_DATA] = perf_event__tracing_data_swap, |
3641 | [PERF_RECORD_HEADER_BUILD_ID] = NULL, |
3642 | diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h |
3643 | index 66d4e14..b84c003 100644 |
3644 | --- a/tools/perf/util/session.h |
3645 | +++ b/tools/perf/util/session.h |
3646 | @@ -112,6 +112,7 @@ int perf_session__set_kallsyms_ref_reloc_sym(struct map **maps, |
3647 | u64 addr); |
3648 | |
3649 | void mem_bswap_64(void *src, int byte_size); |
3650 | +void perf_event__attr_swap(struct perf_event_attr *attr); |
3651 | |
3652 | int perf_session__create_kernel_maps(struct perf_session *self); |
3653 |