diff options
Diffstat (limited to 'include/linux/utsname.h')
-rw-r--r-- | include/linux/utsname.h | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/include/linux/utsname.h b/include/linux/utsname.h index 13e1da0c538d2..a4555fe3754cd 100644 --- a/include/linux/utsname.h +++ b/include/linux/utsname.h @@ -30,7 +30,65 @@ struct new_utsname { char domainname[65]; }; -extern struct new_utsname system_utsname; +#ifdef __KERNEL__ -extern struct rw_semaphore uts_sem; +#include <linux/sched.h> +#include <linux/kref.h> +#include <linux/nsproxy.h> +#include <asm/atomic.h> + +struct uts_namespace { + struct kref kref; + struct new_utsname name; +}; +extern struct uts_namespace init_uts_ns; + +static inline void get_uts_ns(struct uts_namespace *ns) +{ + kref_get(&ns->kref); +} + +#ifdef CONFIG_UTS_NS +extern int unshare_utsname(unsigned long unshare_flags, + struct uts_namespace **new_uts); +extern int copy_utsname(int flags, struct task_struct *tsk); +extern void free_uts_ns(struct kref *kref); + +static inline void put_uts_ns(struct uts_namespace *ns) +{ + kref_put(&ns->kref, free_uts_ns); +} +#else +static inline int unshare_utsname(unsigned long unshare_flags, + struct uts_namespace **new_uts) +{ + if (unshare_flags & CLONE_NEWUTS) + return -EINVAL; + + return 0; +} + +static inline int copy_utsname(int flags, struct task_struct *tsk) +{ + return 0; +} +static inline void put_uts_ns(struct uts_namespace *ns) +{ +} #endif + +static inline struct new_utsname *utsname(void) +{ + return ¤t->nsproxy->uts_ns->name; +} + +static inline struct new_utsname *init_utsname(void) +{ + return &init_uts_ns.name; +} + +extern struct rw_semaphore uts_sem; + +#endif /* __KERNEL__ */ + +#endif /* _LINUX_UTSNAME_H */ |