diff options
Diffstat (limited to 'ANDROID_3.4.5/fs/fs_struct.c')
-rw-r--r-- | ANDROID_3.4.5/fs/fs_struct.c | 202 |
1 files changed, 0 insertions, 202 deletions
diff --git a/ANDROID_3.4.5/fs/fs_struct.c b/ANDROID_3.4.5/fs/fs_struct.c deleted file mode 100644 index e159e682..00000000 --- a/ANDROID_3.4.5/fs/fs_struct.c +++ /dev/null @@ -1,202 +0,0 @@ -#include <linux/export.h> -#include <linux/sched.h> -#include <linux/fs.h> -#include <linux/path.h> -#include <linux/slab.h> -#include <linux/fs_struct.h> -#include "internal.h" - -static inline void path_get_longterm(struct path *path) -{ - path_get(path); - mnt_make_longterm(path->mnt); -} - -static inline void path_put_longterm(struct path *path) -{ - mnt_make_shortterm(path->mnt); - path_put(path); -} - -/* - * Replace the fs->{rootmnt,root} with {mnt,dentry}. Put the old values. - * It can block. - */ -void set_fs_root(struct fs_struct *fs, struct path *path) -{ - struct path old_root; - - path_get_longterm(path); - spin_lock(&fs->lock); - write_seqcount_begin(&fs->seq); - old_root = fs->root; - fs->root = *path; - write_seqcount_end(&fs->seq); - spin_unlock(&fs->lock); - if (old_root.dentry) - path_put_longterm(&old_root); -} - -/* - * Replace the fs->{pwdmnt,pwd} with {mnt,dentry}. Put the old values. - * It can block. - */ -void set_fs_pwd(struct fs_struct *fs, struct path *path) -{ - struct path old_pwd; - - path_get_longterm(path); - spin_lock(&fs->lock); - write_seqcount_begin(&fs->seq); - old_pwd = fs->pwd; - fs->pwd = *path; - write_seqcount_end(&fs->seq); - spin_unlock(&fs->lock); - - if (old_pwd.dentry) - path_put_longterm(&old_pwd); -} - -static inline int replace_path(struct path *p, const struct path *old, const struct path *new) -{ - if (likely(p->dentry != old->dentry || p->mnt != old->mnt)) - return 0; - *p = *new; - return 1; -} - -void chroot_fs_refs(struct path *old_root, struct path *new_root) -{ - struct task_struct *g, *p; - struct fs_struct *fs; - int count = 0; - - read_lock(&tasklist_lock); - do_each_thread(g, p) { - task_lock(p); - fs = p->fs; - if (fs) { - int hits = 0; - spin_lock(&fs->lock); - write_seqcount_begin(&fs->seq); - hits += replace_path(&fs->root, old_root, new_root); - hits += replace_path(&fs->pwd, old_root, new_root); - write_seqcount_end(&fs->seq); - while (hits--) { - count++; - path_get_longterm(new_root); - } - spin_unlock(&fs->lock); - } - task_unlock(p); - } while_each_thread(g, p); - read_unlock(&tasklist_lock); - while (count--) - path_put_longterm(old_root); -} - -void free_fs_struct(struct fs_struct *fs) -{ - path_put_longterm(&fs->root); - path_put_longterm(&fs->pwd); - kmem_cache_free(fs_cachep, fs); -} - -void exit_fs(struct task_struct *tsk) -{ - struct fs_struct *fs = tsk->fs; - - if (fs) { - int kill; - task_lock(tsk); - spin_lock(&fs->lock); - tsk->fs = NULL; - kill = !--fs->users; - spin_unlock(&fs->lock); - task_unlock(tsk); - if (kill) - free_fs_struct(fs); - } -} - -struct fs_struct *copy_fs_struct(struct fs_struct *old) -{ - struct fs_struct *fs = kmem_cache_alloc(fs_cachep, GFP_KERNEL); - /* We don't need to lock fs - think why ;-) */ - if (fs) { - fs->users = 1; - fs->in_exec = 0; - spin_lock_init(&fs->lock); - seqcount_init(&fs->seq); - fs->umask = old->umask; - - spin_lock(&old->lock); - fs->root = old->root; - path_get_longterm(&fs->root); - fs->pwd = old->pwd; - path_get_longterm(&fs->pwd); - spin_unlock(&old->lock); - } - return fs; -} - -int unshare_fs_struct(void) -{ - struct fs_struct *fs = current->fs; - struct fs_struct *new_fs = copy_fs_struct(fs); - int kill; - - if (!new_fs) - return -ENOMEM; - - task_lock(current); - spin_lock(&fs->lock); - kill = !--fs->users; - current->fs = new_fs; - spin_unlock(&fs->lock); - task_unlock(current); - - if (kill) - free_fs_struct(fs); - - return 0; -} -EXPORT_SYMBOL_GPL(unshare_fs_struct); - -int current_umask(void) -{ - return current->fs->umask; -} -EXPORT_SYMBOL(current_umask); - -/* to be mentioned only in INIT_TASK */ -struct fs_struct init_fs = { - .users = 1, - .lock = __SPIN_LOCK_UNLOCKED(init_fs.lock), - .seq = SEQCNT_ZERO, - .umask = 0022, -}; - -void daemonize_fs_struct(void) -{ - struct fs_struct *fs = current->fs; - - if (fs) { - int kill; - - task_lock(current); - - spin_lock(&init_fs.lock); - init_fs.users++; - spin_unlock(&init_fs.lock); - - spin_lock(&fs->lock); - current->fs = &init_fs; - kill = !--fs->users; - spin_unlock(&fs->lock); - - task_unlock(current); - if (kill) - free_fs_struct(fs); - } -} |