diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2010-02-22 20:04:52 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-02-25 04:34:48 -0500 |
commit | 7dc52157982ab771f40e3c0b7dc55b954c3c2d19 (patch) | |
tree | a41e39174d9535f0c678eb36249ceee4a1775d6b /fs | |
parent | 497f0ab39cd25bed317b29482c147c967f7ecd1f (diff) |
vfs: Apply lockdep-based checking to rcu_dereference() uses
Add lockdep-ified RCU primitives to alloc_fd(), files_fdtable()
and fcheck_files().
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
LKML-Reference: <1266887105-1528-8-git-send-email-paulmck@linux.vnet.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/file.c | 2 | ||||
-rw-r--r-- | fs/proc/array.c | 2 | ||||
-rw-r--r-- | fs/proc/base.c | 6 |
3 files changed, 8 insertions, 2 deletions
@@ -478,7 +478,7 @@ repeat: | |||
478 | error = fd; | 478 | error = fd; |
479 | #if 1 | 479 | #if 1 |
480 | /* Sanity check */ | 480 | /* Sanity check */ |
481 | if (rcu_dereference(fdt->fd[fd]) != NULL) { | 481 | if (rcu_dereference_raw(fdt->fd[fd]) != NULL) { |
482 | printk(KERN_WARNING "alloc_fd: slot %d not NULL!\n", fd); | 482 | printk(KERN_WARNING "alloc_fd: slot %d not NULL!\n", fd); |
483 | rcu_assign_pointer(fdt->fd[fd], NULL); | 483 | rcu_assign_pointer(fdt->fd[fd], NULL); |
484 | } | 484 | } |
diff --git a/fs/proc/array.c b/fs/proc/array.c index 13b5d0708175..18e20feee251 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -270,7 +270,9 @@ static inline void task_sig(struct seq_file *m, struct task_struct *p) | |||
270 | blocked = p->blocked; | 270 | blocked = p->blocked; |
271 | collect_sigign_sigcatch(p, &ignored, &caught); | 271 | collect_sigign_sigcatch(p, &ignored, &caught); |
272 | num_threads = atomic_read(&p->signal->count); | 272 | num_threads = atomic_read(&p->signal->count); |
273 | rcu_read_lock(); /* FIXME: is this correct? */ | ||
273 | qsize = atomic_read(&__task_cred(p)->user->sigpending); | 274 | qsize = atomic_read(&__task_cred(p)->user->sigpending); |
275 | rcu_read_unlock(); | ||
274 | qlim = p->signal->rlim[RLIMIT_SIGPENDING].rlim_cur; | 276 | qlim = p->signal->rlim[RLIMIT_SIGPENDING].rlim_cur; |
275 | unlock_task_sighand(p, &flags); | 277 | unlock_task_sighand(p, &flags); |
276 | } | 278 | } |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 58324c299165..623e2ffb5d2b 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1095,8 +1095,12 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf, | |||
1095 | if (!capable(CAP_AUDIT_CONTROL)) | 1095 | if (!capable(CAP_AUDIT_CONTROL)) |
1096 | return -EPERM; | 1096 | return -EPERM; |
1097 | 1097 | ||
1098 | if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) | 1098 | rcu_read_lock(); |
1099 | if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) { | ||
1100 | rcu_read_unlock(); | ||
1099 | return -EPERM; | 1101 | return -EPERM; |
1102 | } | ||
1103 | rcu_read_unlock(); | ||
1100 | 1104 | ||
1101 | if (count >= PAGE_SIZE) | 1105 | if (count >= PAGE_SIZE) |
1102 | count = PAGE_SIZE - 1; | 1106 | count = PAGE_SIZE - 1; |