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 /include/linux | |
| 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 'include/linux')
| -rw-r--r-- | include/linux/fs_struct.h | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index 298cef1c0793..78a05bfcd8eb 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h | |||
| @@ -4,12 +4,10 @@ | |||
| 4 | #include <linux/path.h> | 4 | #include <linux/path.h> |
| 5 | 5 | ||
| 6 | struct fs_struct { | 6 | struct fs_struct { |
| 7 | atomic_t count; /* This usage count is used by check_unsafe_exec() for | 7 | int users; |
| 8 | * security checking purposes - therefore it may not be | ||
| 9 | * incremented, except by clone(CLONE_FS). | ||
| 10 | */ | ||
| 11 | rwlock_t lock; | 8 | rwlock_t lock; |
| 12 | int umask; | 9 | int umask; |
| 10 | int in_exec; | ||
| 13 | struct path root, pwd; | 11 | struct path root, pwd; |
| 14 | }; | 12 | }; |
| 15 | 13 | ||
| @@ -19,7 +17,7 @@ extern void exit_fs(struct task_struct *); | |||
| 19 | extern void set_fs_root(struct fs_struct *, struct path *); | 17 | extern void set_fs_root(struct fs_struct *, struct path *); |
| 20 | extern void set_fs_pwd(struct fs_struct *, struct path *); | 18 | extern void set_fs_pwd(struct fs_struct *, struct path *); |
| 21 | extern struct fs_struct *copy_fs_struct(struct fs_struct *); | 19 | extern struct fs_struct *copy_fs_struct(struct fs_struct *); |
| 22 | extern void put_fs_struct(struct fs_struct *); | 20 | extern void free_fs_struct(struct fs_struct *); |
| 23 | extern void daemonize_fs_struct(void); | 21 | extern void daemonize_fs_struct(void); |
| 24 | extern int unshare_fs_struct(void); | 22 | extern int unshare_fs_struct(void); |
| 25 | 23 | ||
