提交 f05ed3f1 编写于 作者: A Alexey Dobriyan 提交者: Linus Torvalds

proc: don't do dummy rcu_read_lock/rcu_read_unlock on error path

rcu_read_lock()/rcu_read_unlock() is nop for TINY_RCU, but is not a nop
for, say, PREEMPT_RCU.

proc_fill_cache() is called without RCU lock, there is no need to
lock/unlock on error path, simply jump out of the loop.
Signed-off-by: NAlexey Dobriyan <adobriyan@gmail.com>
Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 2344bec7
...@@ -1928,21 +1928,22 @@ static int proc_readfd_common(struct file * filp, void * dirent, ...@@ -1928,21 +1928,22 @@ static int proc_readfd_common(struct file * filp, void * dirent,
fd++, filp->f_pos++) { fd++, filp->f_pos++) {
char name[PROC_NUMBUF]; char name[PROC_NUMBUF];
int len; int len;
int rv;
if (!fcheck_files(files, fd)) if (!fcheck_files(files, fd))
continue; continue;
rcu_read_unlock(); rcu_read_unlock();
len = snprintf(name, sizeof(name), "%d", fd); len = snprintf(name, sizeof(name), "%d", fd);
if (proc_fill_cache(filp, dirent, filldir, rv = proc_fill_cache(filp, dirent, filldir,
name, len, instantiate, name, len, instantiate, p,
p, &fd) < 0) { &fd);
rcu_read_lock(); if (rv < 0)
break; goto out_fd_loop;
}
rcu_read_lock(); rcu_read_lock();
} }
rcu_read_unlock(); rcu_read_unlock();
out_fd_loop:
put_files_struct(files); put_files_struct(files);
} }
out: out:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册