#include <linux/ipc.h>
#include <linux/msg.h>
#include <linux/ipc_namespace.h>
#include <linux/rcupdate.h>
#include <linux/nsproxy.h>
#include <linux/slab.h>
#include <linux/cred.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/user_namespace.h>
#include <linux/proc_ns.h>
#include <linux/sched/task.h>
#include "util.h"
static void free_ipc(struct work_struct *unused);
static DECLARE_WORK(free_ipc_work, free_ipc);
static struct ucounts *inc_ipc_namespaces(struct user_namespace *ns)
{ … }
static void dec_ipc_namespaces(struct ucounts *ucounts)
{ … }
static struct ipc_namespace *create_ipc_ns(struct user_namespace *user_ns,
struct ipc_namespace *old_ns)
{ … }
struct ipc_namespace *copy_ipcs(unsigned long flags,
struct user_namespace *user_ns, struct ipc_namespace *ns)
{ … }
void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
void (*free)(struct ipc_namespace *, struct kern_ipc_perm *))
{ … }
static void free_ipc_ns(struct ipc_namespace *ns)
{ … }
static LLIST_HEAD(free_ipc_list);
static void free_ipc(struct work_struct *unused)
{ … }
void put_ipc_ns(struct ipc_namespace *ns)
{ … }
static inline struct ipc_namespace *to_ipc_ns(struct ns_common *ns)
{ … }
static struct ns_common *ipcns_get(struct task_struct *task)
{ … }
static void ipcns_put(struct ns_common *ns)
{ … }
static int ipcns_install(struct nsset *nsset, struct ns_common *new)
{ … }
static struct user_namespace *ipcns_owner(struct ns_common *ns)
{ … }
const struct proc_ns_operations ipcns_operations = …;