diff options
Diffstat (limited to 'ipc/msg.c')
-rw-r--r-- | ipc/msg.c | 18 |
1 files changed, 10 insertions, 8 deletions
@@ -28,6 +28,8 @@ | |||
28 | #include <linux/syscalls.h> | 28 | #include <linux/syscalls.h> |
29 | #include <linux/audit.h> | 29 | #include <linux/audit.h> |
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/mutex.h> | ||
32 | |||
31 | #include <asm/current.h> | 33 | #include <asm/current.h> |
32 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
33 | #include "util.h" | 35 | #include "util.h" |
@@ -179,8 +181,8 @@ static void expunge_all(struct msg_queue* msq, int res) | |||
179 | * removes the message queue from message queue ID | 181 | * removes the message queue from message queue ID |
180 | * array, and cleans up all the messages associated with this queue. | 182 | * array, and cleans up all the messages associated with this queue. |
181 | * | 183 | * |
182 | * msg_ids.sem and the spinlock for this message queue is hold | 184 | * msg_ids.mutex and the spinlock for this message queue is hold |
183 | * before freeque() is called. msg_ids.sem remains locked on exit. | 185 | * before freeque() is called. msg_ids.mutex remains locked on exit. |
184 | */ | 186 | */ |
185 | static void freeque (struct msg_queue *msq, int id) | 187 | static void freeque (struct msg_queue *msq, int id) |
186 | { | 188 | { |
@@ -208,7 +210,7 @@ asmlinkage long sys_msgget (key_t key, int msgflg) | |||
208 | int id, ret = -EPERM; | 210 | int id, ret = -EPERM; |
209 | struct msg_queue *msq; | 211 | struct msg_queue *msq; |
210 | 212 | ||
211 | down(&msg_ids.sem); | 213 | mutex_lock(&msg_ids.mutex); |
212 | if (key == IPC_PRIVATE) | 214 | if (key == IPC_PRIVATE) |
213 | ret = newque(key, msgflg); | 215 | ret = newque(key, msgflg); |
214 | else if ((id = ipc_findkey(&msg_ids, key)) == -1) { /* key not used */ | 216 | else if ((id = ipc_findkey(&msg_ids, key)) == -1) { /* key not used */ |
@@ -231,7 +233,7 @@ asmlinkage long sys_msgget (key_t key, int msgflg) | |||
231 | } | 233 | } |
232 | msg_unlock(msq); | 234 | msg_unlock(msq); |
233 | } | 235 | } |
234 | up(&msg_ids.sem); | 236 | mutex_unlock(&msg_ids.mutex); |
235 | return ret; | 237 | return ret; |
236 | } | 238 | } |
237 | 239 | ||
@@ -361,7 +363,7 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
361 | msginfo.msgmnb = msg_ctlmnb; | 363 | msginfo.msgmnb = msg_ctlmnb; |
362 | msginfo.msgssz = MSGSSZ; | 364 | msginfo.msgssz = MSGSSZ; |
363 | msginfo.msgseg = MSGSEG; | 365 | msginfo.msgseg = MSGSEG; |
364 | down(&msg_ids.sem); | 366 | mutex_lock(&msg_ids.mutex); |
365 | if (cmd == MSG_INFO) { | 367 | if (cmd == MSG_INFO) { |
366 | msginfo.msgpool = msg_ids.in_use; | 368 | msginfo.msgpool = msg_ids.in_use; |
367 | msginfo.msgmap = atomic_read(&msg_hdrs); | 369 | msginfo.msgmap = atomic_read(&msg_hdrs); |
@@ -372,7 +374,7 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
372 | msginfo.msgtql = MSGTQL; | 374 | msginfo.msgtql = MSGTQL; |
373 | } | 375 | } |
374 | max_id = msg_ids.max_id; | 376 | max_id = msg_ids.max_id; |
375 | up(&msg_ids.sem); | 377 | mutex_unlock(&msg_ids.mutex); |
376 | if (copy_to_user (buf, &msginfo, sizeof(struct msginfo))) | 378 | if (copy_to_user (buf, &msginfo, sizeof(struct msginfo))) |
377 | return -EFAULT; | 379 | return -EFAULT; |
378 | return (max_id < 0) ? 0: max_id; | 380 | return (max_id < 0) ? 0: max_id; |
@@ -435,7 +437,7 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
435 | return -EINVAL; | 437 | return -EINVAL; |
436 | } | 438 | } |
437 | 439 | ||
438 | down(&msg_ids.sem); | 440 | mutex_lock(&msg_ids.mutex); |
439 | msq = msg_lock(msqid); | 441 | msq = msg_lock(msqid); |
440 | err=-EINVAL; | 442 | err=-EINVAL; |
441 | if (msq == NULL) | 443 | if (msq == NULL) |
@@ -489,7 +491,7 @@ asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf) | |||
489 | } | 491 | } |
490 | err = 0; | 492 | err = 0; |
491 | out_up: | 493 | out_up: |
492 | up(&msg_ids.sem); | 494 | mutex_unlock(&msg_ids.mutex); |
493 | return err; | 495 | return err; |
494 | out_unlock_up: | 496 | out_unlock_up: |
495 | msg_unlock(msq); | 497 | msg_unlock(msq); |