diff options
Diffstat (limited to 'ipc/sem.c')
-rw-r--r-- | ipc/sem.c | 26 |
1 files changed, 4 insertions, 22 deletions
@@ -87,14 +87,12 @@ | |||
87 | #include <asm/uaccess.h> | 87 | #include <asm/uaccess.h> |
88 | #include "util.h" | 88 | #include "util.h" |
89 | 89 | ||
90 | #define sem_ids(ns) (*((ns)->ids[IPC_SEM_IDS])) | 90 | #define sem_ids(ns) ((ns)->ids[IPC_SEM_IDS]) |
91 | 91 | ||
92 | #define sem_unlock(sma) ipc_unlock(&(sma)->sem_perm) | 92 | #define sem_unlock(sma) ipc_unlock(&(sma)->sem_perm) |
93 | #define sem_checkid(sma, semid) ipc_checkid(&sma->sem_perm, semid) | 93 | #define sem_checkid(sma, semid) ipc_checkid(&sma->sem_perm, semid) |
94 | #define sem_buildid(id, seq) ipc_buildid(id, seq) | 94 | #define sem_buildid(id, seq) ipc_buildid(id, seq) |
95 | 95 | ||
96 | static struct ipc_ids init_sem_ids; | ||
97 | |||
98 | static int newary(struct ipc_namespace *, struct ipc_params *); | 96 | static int newary(struct ipc_namespace *, struct ipc_params *); |
99 | static void freeary(struct ipc_namespace *, struct sem_array *); | 97 | static void freeary(struct ipc_namespace *, struct sem_array *); |
100 | #ifdef CONFIG_PROC_FS | 98 | #ifdef CONFIG_PROC_FS |
@@ -118,30 +116,17 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it); | |||
118 | #define sc_semopm sem_ctls[2] | 116 | #define sc_semopm sem_ctls[2] |
119 | #define sc_semmni sem_ctls[3] | 117 | #define sc_semmni sem_ctls[3] |
120 | 118 | ||
121 | static void __sem_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids) | 119 | void sem_init_ns(struct ipc_namespace *ns) |
122 | { | 120 | { |
123 | ns->ids[IPC_SEM_IDS] = ids; | ||
124 | ns->sc_semmsl = SEMMSL; | 121 | ns->sc_semmsl = SEMMSL; |
125 | ns->sc_semmns = SEMMNS; | 122 | ns->sc_semmns = SEMMNS; |
126 | ns->sc_semopm = SEMOPM; | 123 | ns->sc_semopm = SEMOPM; |
127 | ns->sc_semmni = SEMMNI; | 124 | ns->sc_semmni = SEMMNI; |
128 | ns->used_sems = 0; | 125 | ns->used_sems = 0; |
129 | ipc_init_ids(ids); | 126 | ipc_init_ids(&ns->ids[IPC_SEM_IDS]); |
130 | } | 127 | } |
131 | 128 | ||
132 | #ifdef CONFIG_IPC_NS | 129 | #ifdef CONFIG_IPC_NS |
133 | int sem_init_ns(struct ipc_namespace *ns) | ||
134 | { | ||
135 | struct ipc_ids *ids; | ||
136 | |||
137 | ids = kmalloc(sizeof(struct ipc_ids), GFP_KERNEL); | ||
138 | if (ids == NULL) | ||
139 | return -ENOMEM; | ||
140 | |||
141 | __sem_init_ns(ns, ids); | ||
142 | return 0; | ||
143 | } | ||
144 | |||
145 | void sem_exit_ns(struct ipc_namespace *ns) | 130 | void sem_exit_ns(struct ipc_namespace *ns) |
146 | { | 131 | { |
147 | struct sem_array *sma; | 132 | struct sem_array *sma; |
@@ -163,15 +148,12 @@ void sem_exit_ns(struct ipc_namespace *ns) | |||
163 | total++; | 148 | total++; |
164 | } | 149 | } |
165 | up_write(&sem_ids(ns).rw_mutex); | 150 | up_write(&sem_ids(ns).rw_mutex); |
166 | |||
167 | kfree(ns->ids[IPC_SEM_IDS]); | ||
168 | ns->ids[IPC_SEM_IDS] = NULL; | ||
169 | } | 151 | } |
170 | #endif | 152 | #endif |
171 | 153 | ||
172 | void __init sem_init (void) | 154 | void __init sem_init (void) |
173 | { | 155 | { |
174 | __sem_init_ns(&init_ipc_ns, &init_sem_ids); | 156 | sem_init_ns(&init_ipc_ns); |
175 | ipc_init_proc_interface("sysvipc/sem", | 157 | ipc_init_proc_interface("sysvipc/sem", |
176 | " key semid perms nsems uid gid cuid cgid otime ctime\n", | 158 | " key semid perms nsems uid gid cuid cgid otime ctime\n", |
177 | IPC_SEM_IDS, sysvipc_sem_proc_show); | 159 | IPC_SEM_IDS, sysvipc_sem_proc_show); |