diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-18 18:56:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-18 18:56:25 -0400 |
commit | 73f1f5dd3ee3ec6e20768d831d9759b0330fad0e (patch) | |
tree | 22f8498c47467f468dce6c3bca0eb1f3a0c9ade0 /fs/proc | |
parent | 30a08bf2d31d275c6fc71dd1811342777e95c831 (diff) | |
parent | 93c2d656c7120e29de8df5bc17bb2a97664104e9 (diff) |
Merge branch 'akpm' (Andrew's patch-bomb)
Merge misc fixes from Andrew Morton.
* emailed from Andrew Morton <akpm@linux-foundation.org>: (4 patches)
frv: delete incorrect task prototypes causing compile fail
slub: missing test for partial pages flush work in flush_all()
fs, proc: fix ABBA deadlock in case of execution attempt of map_files/ entries
drivers/rtc/rtc-pl031.c: configure correct wday for 2000-01-01
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/base.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 7d6ad98631f2..57b8159f26f3 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -2162,16 +2162,16 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, | |||
2162 | goto out; | 2162 | goto out; |
2163 | 2163 | ||
2164 | result = ERR_PTR(-EACCES); | 2164 | result = ERR_PTR(-EACCES); |
2165 | if (lock_trace(task)) | 2165 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) |
2166 | goto out_put_task; | 2166 | goto out_put_task; |
2167 | 2167 | ||
2168 | result = ERR_PTR(-ENOENT); | 2168 | result = ERR_PTR(-ENOENT); |
2169 | if (dname_to_vma_addr(dentry, &vm_start, &vm_end)) | 2169 | if (dname_to_vma_addr(dentry, &vm_start, &vm_end)) |
2170 | goto out_unlock; | 2170 | goto out_put_task; |
2171 | 2171 | ||
2172 | mm = get_task_mm(task); | 2172 | mm = get_task_mm(task); |
2173 | if (!mm) | 2173 | if (!mm) |
2174 | goto out_unlock; | 2174 | goto out_put_task; |
2175 | 2175 | ||
2176 | down_read(&mm->mmap_sem); | 2176 | down_read(&mm->mmap_sem); |
2177 | vma = find_exact_vma(mm, vm_start, vm_end); | 2177 | vma = find_exact_vma(mm, vm_start, vm_end); |
@@ -2183,8 +2183,6 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, | |||
2183 | out_no_vma: | 2183 | out_no_vma: |
2184 | up_read(&mm->mmap_sem); | 2184 | up_read(&mm->mmap_sem); |
2185 | mmput(mm); | 2185 | mmput(mm); |
2186 | out_unlock: | ||
2187 | unlock_trace(task); | ||
2188 | out_put_task: | 2186 | out_put_task: |
2189 | put_task_struct(task); | 2187 | put_task_struct(task); |
2190 | out: | 2188 | out: |
@@ -2218,7 +2216,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
2218 | goto out; | 2216 | goto out; |
2219 | 2217 | ||
2220 | ret = -EACCES; | 2218 | ret = -EACCES; |
2221 | if (lock_trace(task)) | 2219 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) |
2222 | goto out_put_task; | 2220 | goto out_put_task; |
2223 | 2221 | ||
2224 | ret = 0; | 2222 | ret = 0; |
@@ -2226,12 +2224,12 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
2226 | case 0: | 2224 | case 0: |
2227 | ino = inode->i_ino; | 2225 | ino = inode->i_ino; |
2228 | if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0) | 2226 | if (filldir(dirent, ".", 1, 0, ino, DT_DIR) < 0) |
2229 | goto out_unlock; | 2227 | goto out_put_task; |
2230 | filp->f_pos++; | 2228 | filp->f_pos++; |
2231 | case 1: | 2229 | case 1: |
2232 | ino = parent_ino(dentry); | 2230 | ino = parent_ino(dentry); |
2233 | if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0) | 2231 | if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0) |
2234 | goto out_unlock; | 2232 | goto out_put_task; |
2235 | filp->f_pos++; | 2233 | filp->f_pos++; |
2236 | default: | 2234 | default: |
2237 | { | 2235 | { |
@@ -2242,7 +2240,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
2242 | 2240 | ||
2243 | mm = get_task_mm(task); | 2241 | mm = get_task_mm(task); |
2244 | if (!mm) | 2242 | if (!mm) |
2245 | goto out_unlock; | 2243 | goto out_put_task; |
2246 | down_read(&mm->mmap_sem); | 2244 | down_read(&mm->mmap_sem); |
2247 | 2245 | ||
2248 | nr_files = 0; | 2246 | nr_files = 0; |
@@ -2272,7 +2270,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
2272 | flex_array_free(fa); | 2270 | flex_array_free(fa); |
2273 | up_read(&mm->mmap_sem); | 2271 | up_read(&mm->mmap_sem); |
2274 | mmput(mm); | 2272 | mmput(mm); |
2275 | goto out_unlock; | 2273 | goto out_put_task; |
2276 | } | 2274 | } |
2277 | for (i = 0, vma = mm->mmap, pos = 2; vma; | 2275 | for (i = 0, vma = mm->mmap, pos = 2; vma; |
2278 | vma = vma->vm_next) { | 2276 | vma = vma->vm_next) { |
@@ -2317,8 +2315,6 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
2317 | } | 2315 | } |
2318 | } | 2316 | } |
2319 | 2317 | ||
2320 | out_unlock: | ||
2321 | unlock_trace(task); | ||
2322 | out_put_task: | 2318 | out_put_task: |
2323 | put_task_struct(task); | 2319 | put_task_struct(task); |
2324 | out: | 2320 | out: |