LCOV - code coverage report
Current view: top level - include/linux - nsproxy.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 1 100.0 %
Date: 2017-01-25 Functions: 0 0 -

          Line data    Source code
       1             : #ifndef _LINUX_NSPROXY_H
       2             : #define _LINUX_NSPROXY_H
       3             : 
       4             : #include <linux/spinlock.h>
       5             : #include <linux/sched.h>
       6             : 
       7             : struct mnt_namespace;
       8             : struct uts_namespace;
       9             : struct ipc_namespace;
      10             : struct pid_namespace;
      11             : struct fs_struct;
      12             : 
      13             : /*
      14             :  * A structure to contain pointers to all per-process
      15             :  * namespaces - fs (mount), uts, network, sysvipc, etc.
      16             :  *
      17             :  * 'count' is the number of tasks holding a reference.
      18             :  * The count for each namespace, then, will be the number
      19             :  * of nsproxies pointing to it, not the number of tasks.
      20             :  *
      21             :  * The nsproxy is shared by tasks which share all namespaces.
      22             :  * As soon as a single namespace is cloned or unshared, the
      23             :  * nsproxy is copied.
      24             :  */
      25             : struct nsproxy {
      26             :         atomic_t count;
      27             :         struct uts_namespace *uts_ns;
      28             :         struct ipc_namespace *ipc_ns;
      29             :         struct mnt_namespace *mnt_ns;
      30             :         struct pid_namespace *pid_ns;
      31             :         struct net           *net_ns;
      32             : };
      33             : extern struct nsproxy init_nsproxy;
      34             : 
      35             : /*
      36             :  * the namespaces access rules are:
      37             :  *
      38             :  *  1. only current task is allowed to change tsk->nsproxy pointer or
      39             :  *     any pointer on the nsproxy itself
      40             :  *
      41             :  *  2. when accessing (i.e. reading) current task's namespaces - no
      42             :  *     precautions should be taken - just dereference the pointers
      43             :  *
      44             :  *  3. the access to other task namespaces is performed like this
      45             :  *     rcu_read_lock();
      46             :  *     nsproxy = task_nsproxy(tsk);
      47             :  *     if (nsproxy != NULL) {
      48             :  *             / *
      49             :  *               * work with the namespaces here
      50             :  *               * e.g. get the reference on one of them
      51             :  *               * /
      52             :  *     } / *
      53             :  *         * NULL task_nsproxy() means that this task is
      54             :  *         * almost dead (zombie)
      55             :  *         * /
      56             :  *     rcu_read_unlock();
      57             :  *
      58             :  */
      59             : 
      60             : static inline struct nsproxy *task_nsproxy(struct task_struct *tsk)
      61             : {
      62             :         return rcu_dereference(tsk->nsproxy);
      63             : }
      64             : 
      65             : int copy_namespaces(unsigned long flags, struct task_struct *tsk);
      66             : void exit_task_namespaces(struct task_struct *tsk);
      67             : void switch_task_namespaces(struct task_struct *tsk, struct nsproxy *new);
      68             : void free_nsproxy(struct nsproxy *ns);
      69             : int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **,
      70             :         struct fs_struct *);
      71             : 
      72             : static inline void put_nsproxy(struct nsproxy *ns)
      73             : {
      74             :         if (atomic_dec_and_test(&ns->count)) {
      75             :                 free_nsproxy(ns);
      76             :         }
      77             : }
      78             : 
      79             : static inline void get_nsproxy(struct nsproxy *ns)
      80             : {
      81             :         atomic_inc(&ns->count);
      82             : }
      83             : 
      84             : #ifdef CONFIG_CGROUP_NS
      85             : int ns_cgroup_clone(struct task_struct *tsk, struct pid *pid);
      86             : #else
      87             : static inline int ns_cgroup_clone(struct task_struct *tsk, struct pid *pid)
      88             : {
      89             :         return 0;
      90             : }
      91           1 : #endif
      92             : 
      93             : #endif

Generated by: LCOV version 1.10