nsproxy.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _LINUX_NSPROXY_H
  3. #define _LINUX_NSPROXY_H
  4. #include <linux/spinlock.h>
  5. #include <linux/sched.h>
  6. struct mnt_namespace;
  7. struct uts_namespace;
  8. struct ipc_namespace;
  9. struct pid_namespace;
  10. struct cgroup_namespace;
  11. struct fs_struct;
  12. /*
  13. * A structure to contain pointers to all per-process
  14. * namespaces - fs (mount), uts, network, sysvipc, etc.
  15. *
  16. * The pid namespace is an exception -- it's accessed using
  17. * task_active_pid_ns. The pid namespace here is the
  18. * namespace that children will use.
  19. *
  20. * 'count' is the number of tasks holding a reference.
  21. * The count for each namespace, then, will be the number
  22. * of nsproxies pointing to it, not the number of tasks.
  23. *
  24. * The nsproxy is shared by tasks which share all namespaces.
  25. * As soon as a single namespace is cloned or unshared, the
  26. * nsproxy is copied.
  27. */
  28. struct nsproxy {
  29. atomic_t count;
  30. struct uts_namespace *uts_ns;
  31. struct ipc_namespace *ipc_ns;
  32. struct mnt_namespace *mnt_ns;
  33. struct pid_namespace *pid_ns_for_children;
  34. struct net *net_ns;
  35. struct time_namespace *time_ns;
  36. struct time_namespace *time_ns_for_children;
  37. struct cgroup_namespace *cgroup_ns;
  38. };
  39. extern struct nsproxy init_nsproxy;
  40. /*
  41. * A structure to encompass all bits needed to install
  42. * a partial or complete new set of namespaces.
  43. *
  44. * If a new user namespace is requested cred will
  45. * point to a modifiable set of credentials. If a pointer
  46. * to a modifiable set is needed nsset_cred() must be
  47. * used and tested.
  48. */
  49. struct nsset {
  50. unsigned flags;
  51. struct nsproxy *nsproxy;
  52. struct fs_struct *fs;
  53. const struct cred *cred;
  54. };
  55. static inline struct cred *nsset_cred(struct nsset *set)
  56. {
  57. if (set->flags & CLONE_NEWUSER)
  58. return (struct cred *)set->cred;
  59. return NULL;
  60. }
  61. /*
  62. * the namespaces access rules are:
  63. *
  64. * 1. only current task is allowed to change tsk->nsproxy pointer or
  65. * any pointer on the nsproxy itself. Current must hold the task_lock
  66. * when changing tsk->nsproxy.
  67. *
  68. * 2. when accessing (i.e. reading) current task's namespaces - no
  69. * precautions should be taken - just dereference the pointers
  70. *
  71. * 3. the access to other task namespaces is performed like this
  72. * task_lock(task);
  73. * nsproxy = task->nsproxy;
  74. * if (nsproxy != NULL) {
  75. * / *
  76. * * work with the namespaces here
  77. * * e.g. get the reference on one of them
  78. * * /
  79. * } / *
  80. * * NULL task->nsproxy means that this task is
  81. * * almost dead (zombie)
  82. * * /
  83. * task_unlock(task);
  84. *
  85. */
  86. int copy_namespaces(unsigned long flags, struct task_struct *tsk);
  87. void exit_task_namespaces(struct task_struct *tsk);
  88. void switch_task_namespaces(struct task_struct *tsk, struct nsproxy *new);
  89. void free_nsproxy(struct nsproxy *ns);
  90. int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **,
  91. struct cred *, struct fs_struct *);
  92. int __init nsproxy_cache_init(void);
  93. static inline void put_nsproxy(struct nsproxy *ns)
  94. {
  95. if (atomic_dec_and_test(&ns->count)) {
  96. free_nsproxy(ns);
  97. }
  98. }
  99. static inline void get_nsproxy(struct nsproxy *ns)
  100. {
  101. atomic_inc(&ns->count);
  102. }
  103. #endif