diff options
| -rw-r--r-- | ipc/mqueue.c | 10 | ||||
| -rw-r--r-- | ipc/msgutil.c | 6 |
2 files changed, 14 insertions, 2 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index ba44164ea1f9..6f93bda7e408 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
| @@ -430,7 +430,8 @@ static void mqueue_evict_inode(struct inode *inode) | |||
| 430 | struct user_struct *user; | 430 | struct user_struct *user; |
| 431 | unsigned long mq_bytes, mq_treesize; | 431 | unsigned long mq_bytes, mq_treesize; |
| 432 | struct ipc_namespace *ipc_ns; | 432 | struct ipc_namespace *ipc_ns; |
| 433 | struct msg_msg *msg; | 433 | struct msg_msg *msg, *nmsg; |
| 434 | LIST_HEAD(tmp_msg); | ||
| 434 | 435 | ||
| 435 | clear_inode(inode); | 436 | clear_inode(inode); |
| 436 | 437 | ||
| @@ -441,10 +442,15 @@ static void mqueue_evict_inode(struct inode *inode) | |||
| 441 | info = MQUEUE_I(inode); | 442 | info = MQUEUE_I(inode); |
| 442 | spin_lock(&info->lock); | 443 | spin_lock(&info->lock); |
| 443 | while ((msg = msg_get(info)) != NULL) | 444 | while ((msg = msg_get(info)) != NULL) |
| 444 | free_msg(msg); | 445 | list_add_tail(&msg->m_list, &tmp_msg); |
| 445 | kfree(info->node_cache); | 446 | kfree(info->node_cache); |
| 446 | spin_unlock(&info->lock); | 447 | spin_unlock(&info->lock); |
| 447 | 448 | ||
| 449 | list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) { | ||
| 450 | list_del(&msg->m_list); | ||
| 451 | free_msg(msg); | ||
| 452 | } | ||
| 453 | |||
| 448 | /* Total amount of bytes accounted for the mqueue */ | 454 | /* Total amount of bytes accounted for the mqueue */ |
| 449 | mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + | 455 | mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + |
| 450 | min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * | 456 | min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * |
diff --git a/ipc/msgutil.c b/ipc/msgutil.c index 84598025a6ad..e65593742e2b 100644 --- a/ipc/msgutil.c +++ b/ipc/msgutil.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/utsname.h> | 18 | #include <linux/utsname.h> |
| 19 | #include <linux/proc_ns.h> | 19 | #include <linux/proc_ns.h> |
| 20 | #include <linux/uaccess.h> | 20 | #include <linux/uaccess.h> |
| 21 | #include <linux/sched.h> | ||
| 21 | 22 | ||
| 22 | #include "util.h" | 23 | #include "util.h" |
| 23 | 24 | ||
| @@ -64,6 +65,9 @@ static struct msg_msg *alloc_msg(size_t len) | |||
| 64 | pseg = &msg->next; | 65 | pseg = &msg->next; |
| 65 | while (len > 0) { | 66 | while (len > 0) { |
| 66 | struct msg_msgseg *seg; | 67 | struct msg_msgseg *seg; |
| 68 | |||
| 69 | cond_resched(); | ||
| 70 | |||
| 67 | alen = min(len, DATALEN_SEG); | 71 | alen = min(len, DATALEN_SEG); |
| 68 | seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT); | 72 | seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT); |
| 69 | if (seg == NULL) | 73 | if (seg == NULL) |
| @@ -176,6 +180,8 @@ void free_msg(struct msg_msg *msg) | |||
| 176 | kfree(msg); | 180 | kfree(msg); |
| 177 | while (seg != NULL) { | 181 | while (seg != NULL) { |
| 178 | struct msg_msgseg *tmp = seg->next; | 182 | struct msg_msgseg *tmp = seg->next; |
| 183 | |||
| 184 | cond_resched(); | ||
| 179 | kfree(seg); | 185 | kfree(seg); |
| 180 | seg = tmp; | 186 | seg = tmp; |
| 181 | } | 187 | } |
