diff options
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 778454750a6c..3647170e9a16 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -479,14 +479,14 @@ static int bad_syscall(int n, struct pt_regs *regs) | |||
479 | return regs->ARM_r0; | 479 | return regs->ARM_r0; |
480 | } | 480 | } |
481 | 481 | ||
482 | static inline void | 482 | static inline int |
483 | do_cache_op(unsigned long start, unsigned long end, int flags) | 483 | do_cache_op(unsigned long start, unsigned long end, int flags) |
484 | { | 484 | { |
485 | struct mm_struct *mm = current->active_mm; | 485 | struct mm_struct *mm = current->active_mm; |
486 | struct vm_area_struct *vma; | 486 | struct vm_area_struct *vma; |
487 | 487 | ||
488 | if (end < start || flags) | 488 | if (end < start || flags) |
489 | return; | 489 | return -EINVAL; |
490 | 490 | ||
491 | down_read(&mm->mmap_sem); | 491 | down_read(&mm->mmap_sem); |
492 | vma = find_vma(mm, start); | 492 | vma = find_vma(mm, start); |
@@ -496,9 +496,11 @@ do_cache_op(unsigned long start, unsigned long end, int flags) | |||
496 | if (end > vma->vm_end) | 496 | if (end > vma->vm_end) |
497 | end = vma->vm_end; | 497 | end = vma->vm_end; |
498 | 498 | ||
499 | flush_cache_user_range(vma, start, end); | 499 | up_read(&mm->mmap_sem); |
500 | return flush_cache_user_range(start, end); | ||
500 | } | 501 | } |
501 | up_read(&mm->mmap_sem); | 502 | up_read(&mm->mmap_sem); |
503 | return -EINVAL; | ||
502 | } | 504 | } |
503 | 505 | ||
504 | /* | 506 | /* |
@@ -544,8 +546,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs) | |||
544 | * the specified region). | 546 | * the specified region). |
545 | */ | 547 | */ |
546 | case NR(cacheflush): | 548 | case NR(cacheflush): |
547 | do_cache_op(regs->ARM_r0, regs->ARM_r1, regs->ARM_r2); | 549 | return do_cache_op(regs->ARM_r0, regs->ARM_r1, regs->ARM_r2); |
548 | return 0; | ||
549 | 550 | ||
550 | case NR(usr26): | 551 | case NR(usr26): |
551 | if (!(elf_hwcap & HWCAP_26BIT)) | 552 | if (!(elf_hwcap & HWCAP_26BIT)) |