1#ifndef __IPC_NAMESPACE_H__ 2#define __IPC_NAMESPACE_H__ 3 4#include <linux/err.h> 5#include <linux/idr.h> 6#include <linux/rwsem.h> 7#include <linux/notifier.h> 8#include <linux/nsproxy.h> 9 10/* 11 * ipc namespace events 12 */ 13#define IPCNS_MEMCHANGED 0x00000001 /* Notify lowmem size changed */ 14#define IPCNS_CREATED 0x00000002 /* Notify new ipc namespace created */ 15#define IPCNS_REMOVED 0x00000003 /* Notify ipc namespace removed */ 16 17#define IPCNS_CALLBACK_PRI 0 18 19struct user_namespace; 20 21struct ipc_ids { 22 int in_use; 23 unsigned short seq; 24 unsigned short seq_max; 25 struct rw_semaphore rw_mutex; 26 struct idr ipcs_idr; 27}; 28 29struct ipc_namespace { 30 atomic_t count; 31 struct ipc_ids ids[3]; 32 33 int sem_ctls[4]; 34 int used_sems; 35 36 int msg_ctlmax; 37 int msg_ctlmnb; 38 int msg_ctlmni; 39 atomic_t msg_bytes; 40 atomic_t msg_hdrs; 41 int auto_msgmni; 42 43 size_t shm_ctlmax; 44 size_t shm_ctlall; 45 int shm_ctlmni; 46 int shm_tot; 47 /* 48 * Defines whether IPC_RMID is forced for _all_ shm segments regardless 49 * of shmctl() 50 */ 51 int shm_rmid_forced; 52 53 struct notifier_block ipcns_nb; 54 55 /* The kern_mount of the mqueuefs sb. We take a ref on it */ 56 struct vfsmount *mq_mnt; 57 58 /* # queues in this ns, protected by mq_lock */ 59 unsigned int mq_queues_count; 60 61 /* next fields are set through sysctl */ 62 unsigned int mq_queues_max; /* initialized to DFLT_QUEUESMAX */ 63 unsigned int mq_msg_max; /* initialized to DFLT_MSGMAX */ 64 unsigned int mq_msgsize_max; /* initialized to DFLT_MSGSIZEMAX */ 65 unsigned int mq_msg_default; 66 unsigned int mq_msgsize_default; 67 68 /* user_ns which owns the ipc ns */ 69 struct user_namespace *user_ns; 70}; 71 72extern struct ipc_namespace init_ipc_ns; 73extern atomic_t nr_ipc_ns; 74 75extern spinlock_t mq_lock; 76 77#ifdef CONFIG_SYSVIPC 78extern int register_ipcns_notifier(struct ipc_namespace *); 79extern int cond_register_ipcns_notifier(struct ipc_namespace *); 80extern void unregister_ipcns_notifier(struct ipc_namespace *); 81extern int ipcns_notify(unsigned long); 82extern void shm_destroy_orphaned(struct ipc_namespace *ns); 83#else /* CONFIG_SYSVIPC */ 84static inline int register_ipcns_notifier(struct ipc_namespace *ns) 85{ return 0; } 86static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns) 87{ return 0; } 88static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { } 89static inline int ipcns_notify(unsigned long l) { return 0; } 90static inline void shm_destroy_orphaned(struct ipc_namespace *ns) {} 91#endif /* CONFIG_SYSVIPC */ 92 93#ifdef CONFIG_POSIX_MQUEUE 94extern int mq_init_ns(struct ipc_namespace *ns); 95/* 96 * POSIX Message Queue default values: 97 * 98 * MIN_*: Lowest value an admin can set the maximum unprivileged limit to 99 * DFLT_*MAX: Default values for the maximum unprivileged limits 100 * DFLT_{MSG,MSGSIZE}: Default values used when the user doesn't supply 101 * an attribute to the open call and the queue must be created 102 * HARD_*: Highest value the maximums can be set to. These are enforced 103 * on CAP_SYS_RESOURCE apps as well making them inviolate (so make them 104 * suitably high) 105 * 106 * POSIX Requirements: 107 * Per app minimum openable message queues - 8. This does not map well 108 * to the fact that we limit the number of queues on a per namespace 109 * basis instead of a per app basis. So, make the default high enough 110 * that no given app should have a hard time opening 8 queues. 111 * Minimum maximum for HARD_MSGMAX - 32767. I bumped this to 65536. 112 * Minimum maximum for HARD_MSGSIZEMAX - POSIX is silent on this. However, 113 * we have run into a situation where running applications in the wild 114 * require this to be at least 5MB, and preferably 10MB, so I set the 115 * value to 16MB in hopes that this user is the worst of the bunch and 116 * the new maximum will handle anyone else. I may have to revisit this 117 * in the future. 118 */ 119#define MIN_QUEUESMAX 1 120#define DFLT_QUEUESMAX 256 121#define HARD_QUEUESMAX 1024 122#define MIN_MSGMAX 1 123#define DFLT_MSG 10U 124#define DFLT_MSGMAX 10 125#define HARD_MSGMAX 65536 126#define MIN_MSGSIZEMAX 128 127#define DFLT_MSGSIZE 8192U 128#define DFLT_MSGSIZEMAX 8192 129#define HARD_MSGSIZEMAX (16*1024*1024) 130#else 131static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; } 132#endif 133 134#if defined(CONFIG_IPC_NS) 135extern struct ipc_namespace *copy_ipcs(unsigned long flags, 136 struct task_struct *tsk); 137static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) 138{ 139 if (ns) 140 atomic_inc(&ns->count); 141 return ns; 142} 143 144extern void put_ipc_ns(struct ipc_namespace *ns); 145#else 146static inline struct ipc_namespace *copy_ipcs(unsigned long flags, 147 struct task_struct *tsk) 148{ 149 if (flags & CLONE_NEWIPC) 150 return ERR_PTR(-EINVAL); 151 152 return tsk->nsproxy->ipc_ns; 153} 154 155static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns) 156{ 157 return ns; 158} 159 160static inline void put_ipc_ns(struct ipc_namespace *ns) 161{ 162} 163#endif 164 165#ifdef CONFIG_POSIX_MQUEUE_SYSCTL 166 167struct ctl_table_header; 168extern struct ctl_table_header *mq_register_sysctl_table(void); 169 170#else /* CONFIG_POSIX_MQUEUE_SYSCTL */ 171 172static inline struct ctl_table_header *mq_register_sysctl_table(void) 173{ 174 return NULL; 175} 176 177#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */ 178#endif 179