diff options
author | Michal Simek <monstr@monstr.eu> | 2010-05-20 04:56:29 -0400 |
---|---|---|
committer | Michal Simek <monstr@monstr.eu> | 2010-08-02 04:44:03 -0400 |
commit | 8d7ec6ee59e78140bf01c7d0d009ea39ab6b3b59 (patch) | |
tree | c5b0e2bc0729f0a2de57069f212a519201c0f309 /arch/microblaze/include | |
parent | 9fe6206f400646a2322096b56c59891d530e8d51 (diff) |
microblaze: Fix __copy_to/from_user_inatomic macros
__copy_to/from_user_inatomic should call __copy_to/from_user
because there is not necessary to check access because of kernel function.
might_sleep in copy_to/from_user macros is causing problems
in debug sessions too (CONFIG_DEBUG_SPINLOCK_SLEEP).
BUG: sleeping function called from invalid context at
.../arch/microblaze/include/asm/uaccess.h:388
in_atomic(): 1, irqs_disabled(): 0, pid: 1, name: swapper
1 lock held by swapper/1:
#0: (&p->cred_guard_mutex){......}, at: [<c00d4b90>] prepare_bprm_creds+0x2c/0x88
Kernel Stack:
...
Call Trace:
[<c0006bd4>] microblaze_unwind+0x7c/0x94
[<c0006684>] show_stack+0xf4/0x190
[<c0006730>] dump_stack+0x10/0x30
[<c00103a0>] __might_sleep+0x12c/0x160
[<c0090de4>] file_read_actor+0x1d8/0x2a8
[<c0091568>] generic_file_aio_read+0x6b4/0xa64
[<c00cd778>] do_sync_read+0xac/0x110
[<c00ce254>] vfs_read+0xc8/0x160
[<c00d585c>] kernel_read+0x38/0x64
[<c00d5984>] prepare_binprm+0xfc/0x130
[<c00d6430>] do_execve+0x228/0x370
[<c000614c>] microblaze_execve+0x58/0xa4
caused by file_read_actor (mm/filemap.c) which calls
__copy_to_user_inatomic.
Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/include')
-rw-r--r-- | arch/microblaze/include/asm/uaccess.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index 26460d15b338..d840f4a2d3c9 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h | |||
@@ -359,7 +359,7 @@ extern long __user_bad(void); | |||
359 | __copy_tofrom_user((__force void __user *)(to), \ | 359 | __copy_tofrom_user((__force void __user *)(to), \ |
360 | (void __user *)(from), (n)) | 360 | (void __user *)(from), (n)) |
361 | #define __copy_from_user_inatomic(to, from, n) \ | 361 | #define __copy_from_user_inatomic(to, from, n) \ |
362 | copy_from_user((to), (from), (n)) | 362 | __copy_from_user((to), (from), (n)) |
363 | 363 | ||
364 | static inline long copy_from_user(void *to, | 364 | static inline long copy_from_user(void *to, |
365 | const void __user *from, unsigned long n) | 365 | const void __user *from, unsigned long n) |
@@ -373,7 +373,7 @@ static inline long copy_from_user(void *to, | |||
373 | #define __copy_to_user(to, from, n) \ | 373 | #define __copy_to_user(to, from, n) \ |
374 | __copy_tofrom_user((void __user *)(to), \ | 374 | __copy_tofrom_user((void __user *)(to), \ |
375 | (__force const void __user *)(from), (n)) | 375 | (__force const void __user *)(from), (n)) |
376 | #define __copy_to_user_inatomic(to, from, n) copy_to_user((to), (from), (n)) | 376 | #define __copy_to_user_inatomic(to, from, n) __copy_to_user((to), (from), (n)) |
377 | 377 | ||
378 | static inline long copy_to_user(void __user *to, | 378 | static inline long copy_to_user(void __user *to, |
379 | const void *from, unsigned long n) | 379 | const void *from, unsigned long n) |