diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2009-03-30 07:20:30 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-03-31 23:00:26 -0400 |
commit | 498052bba55ecaff58db6a1436b0e25bfd75a7ff (patch) | |
tree | bd3644ac60737e3733995a203acebd70cfd1b21b /fs/proc | |
parent | 3e93cd671813e204c258f1e6c797959920cf7772 (diff) |
New locking/refcounting for fs_struct
* all changes of current->fs are done under task_lock and write_lock of
old fs->lock
* refcount is not atomic anymore (same protection)
* its decrements are done when removing reference from current; at the
same time we decide whether to free it.
* put_fs_struct() is gone
* new field - ->in_exec. Set by check_unsafe_exec() if we are trying to do
execve() and only subthreads share fs_struct. Cleared when finishing exec
(success and failure alike). Makes CLONE_FS fail with -EAGAIN if set.
* check_unsafe_exec() may fail with -EAGAIN if another execve() from subthread
is in progress.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/task_nommu.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 343ea1216bc8..6ca01052c5bc 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c | |||
@@ -49,7 +49,7 @@ void task_mem(struct seq_file *m, struct mm_struct *mm) | |||
49 | else | 49 | else |
50 | bytes += kobjsize(mm); | 50 | bytes += kobjsize(mm); |
51 | 51 | ||
52 | if (current->fs && atomic_read(¤t->fs->count) > 1) | 52 | if (current->fs && current->fs->users > 1) |
53 | sbytes += kobjsize(current->fs); | 53 | sbytes += kobjsize(current->fs); |
54 | else | 54 | else |
55 | bytes += kobjsize(current->fs); | 55 | bytes += kobjsize(current->fs); |