cregit-Linux how code gets into the kernel

Release 4.14 fs/fs_struct.c

Directory: fs
#include <linux/export.h>
#include <linux/sched/signal.h>
#include <linux/sched/task.h>
#include <linux/fs.h>
#include <linux/path.h>
#include <linux/slab.h>
#include <linux/fs_struct.h>
#include "internal.h"

/*
 * Replace the fs->{rootmnt,root} with {mnt,dentry}. Put the old values.
 * It can block.
 */

void set_fs_root(struct fs_struct *fs, const struct path *path) { struct path old_root; path_get(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(&old_root); }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro6478.05%466.67%
Nicholas Piggin1821.95%233.33%
Total82100.00%6100.00%

/* * Replace the fs->{pwdmnt,pwd} with {mnt,dentry}. Put the old values. * It can block. */
void set_fs_pwd(struct fs_struct *fs, const struct path *path) { struct path old_pwd; path_get(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(&old_pwd); }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro6478.05%466.67%
Nicholas Piggin1821.95%233.33%
Total82100.00%6100.00%


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; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro57100.00%1100.00%
Total57100.00%1100.00%


void chroot_fs_refs(const struct path *old_root, const 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(new_root); } spin_unlock(&fs->lock); } task_unlock(p); } while_each_thread(g, p); read_unlock(&tasklist_lock); while (count--) path_put(old_root); }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro16192.53%466.67%
Nicholas Piggin137.47%233.33%
Total174100.00%6100.00%


void free_fs_struct(struct fs_struct *fs) { path_put(&fs->root); path_put(&fs->pwd); kmem_cache_free(fs_cachep, fs); }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro33100.00%3100.00%
Total33100.00%3100.00%


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); } }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro7597.40%266.67%
Nicholas Piggin22.60%133.33%
Total77100.00%3100.00%


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(&fs->root); fs->pwd = old->pwd; path_get(&fs->pwd); spin_unlock(&old->lock); } return fs; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro7462.71%342.86%
Nicholas Piggin4336.44%342.86%
Miklos Szeredi10.85%114.29%
Total118100.00%7100.00%


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; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro8897.78%266.67%
Nicholas Piggin22.22%133.33%
Total90100.00%3100.00%

EXPORT_SYMBOL_GPL(unshare_fs_struct);
int current_umask(void) { return current->fs->umask; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro14100.00%1100.00%
Total14100.00%1100.00%

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(init_fs.seq), .umask = 0022, };

Overall Contributors

PersonTokensPropCommitsCommitProp
Al Viro68785.88%850.00%
Nicholas Piggin10212.75%318.75%
John Stultz50.62%16.25%
Ingo Molnar40.50%212.50%
Paul Gortmaker10.12%16.25%
Miklos Szeredi10.12%16.25%
Total800100.00%16100.00%
Directory: fs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.