diff options
Diffstat (limited to 'fs/proc/task_mmu.c')
| -rw-r--r-- | fs/proc/task_mmu.c | 23 | 
1 files changed, 11 insertions, 12 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 636f1a1fdf8..7c708a418ac 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -121,14 +121,14 @@ static void *m_start(struct seq_file *m, loff_t *pos)  	priv->task = get_pid_task(priv->pid, PIDTYPE_PID);  	if (!priv->task) -		return NULL; +		return ERR_PTR(-ESRCH);  	mm = mm_for_maps(priv->task); -	if (!mm) -		return NULL; +	if (!mm || IS_ERR(mm)) +		return mm;  	down_read(&mm->mmap_sem); -	tail_vma = get_gate_vma(priv->task); +	tail_vma = get_gate_vma(priv->task->mm);  	priv->tail_vma = tail_vma;  	/* Start with last addr hint */ @@ -279,7 +279,8 @@ static int show_map(struct seq_file *m, void *v)  	show_map_vma(m, vma);  	if (m->count < m->size)  /* vma is copied successfully */ -		m->version = (vma != get_gate_vma(task))? vma->vm_start: 0; +		m->version = (vma != get_gate_vma(task->mm)) +			? vma->vm_start : 0;  	return 0;  } @@ -468,7 +469,8 @@ static int show_smap(struct seq_file *m, void *v)  			(unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0);  	if (m->count < m->size)  /* vma is copied successfully */ -		m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0; +		m->version = (vma != get_gate_vma(task->mm)) +			? vma->vm_start : 0;  	return 0;  } @@ -764,8 +766,9 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,  	if (!task)  		goto out; -	ret = -EACCES; -	if (!ptrace_may_access(task, PTRACE_MODE_READ)) +	mm = mm_for_maps(task); +	ret = PTR_ERR(mm); +	if (!mm || IS_ERR(mm))  		goto out_task;  	ret = -EINVAL; @@ -778,10 +781,6 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,  	if (!count)  		goto out_task; -	mm = get_task_mm(task); -	if (!mm) -		goto out_task; -  	pm.len = PM_ENTRY_BYTES * (PAGEMAP_WALK_SIZE >> PAGE_SHIFT);  	pm.buffer = kmalloc(pm.len, GFP_TEMPORARY);  	ret = -ENOMEM;  |