diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-02-22 22:04:41 +0000 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-02-22 22:04:41 +0000 | 
| commit | 61b80086a525c8a6081257ae40da5dee2bcaee16 (patch) | |
| tree | 675da35e4c03be3a5ca17bf6430e5b51dfed6296 /mm/process_vm_access.c | |
| parent | a5f17d1f4c2831b9b9bf8b1a537cdbac995d6e13 (diff) | |
| parent | 230f984662d7e0e4a9597c665fd4f53130666e7d (diff) | |
Merge branch 'entry-macro-cleanup' of git://sources.calxeda.com/kernel/linux into for-armsoc
Diffstat (limited to 'mm/process_vm_access.c')
| -rw-r--r-- | mm/process_vm_access.c | 23 | 
1 files changed, 9 insertions, 14 deletions
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c index e920aa3ce104..c20ff48994c2 100644 --- a/mm/process_vm_access.c +++ b/mm/process_vm_access.c @@ -298,23 +298,18 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,  		goto free_proc_pages;  	} -	task_lock(task); -	if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) { -		task_unlock(task); -		rc = -EPERM; -		goto put_task_struct; -	} -	mm = task->mm; - -	if (!mm || (task->flags & PF_KTHREAD)) { -		task_unlock(task); -		rc = -EINVAL; +	mm = mm_access(task, PTRACE_MODE_ATTACH); +	if (!mm || IS_ERR(mm)) { +		rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH; +		/* +		 * Explicitly map EACCES to EPERM as EPERM is a more a +		 * appropriate error code for process_vw_readv/writev +		 */ +		if (rc == -EACCES) +			rc = -EPERM;  		goto put_task_struct;  	} -	atomic_inc(&mm->mm_users); -	task_unlock(task); -  	for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) {  		rc = process_vm_rw_single_vec(  			(unsigned long)rvec[i].iov_base, rvec[i].iov_len,  | 
