|
@@ -391,7 +391,8 @@ static void mqueue_evict_inode(struct inode *inode)
|
|
|
struct user_struct *user;
|
|
struct user_struct *user;
|
|
|
unsigned long mq_bytes, mq_treesize;
|
|
unsigned long mq_bytes, mq_treesize;
|
|
|
struct ipc_namespace *ipc_ns;
|
|
struct ipc_namespace *ipc_ns;
|
|
|
- struct msg_msg *msg;
|
|
|
|
|
|
|
+ struct msg_msg *msg, *nmsg;
|
|
|
|
|
+ LIST_HEAD(tmp_msg);
|
|
|
|
|
|
|
|
clear_inode(inode);
|
|
clear_inode(inode);
|
|
|
|
|
|
|
@@ -402,10 +403,15 @@ static void mqueue_evict_inode(struct inode *inode)
|
|
|
info = MQUEUE_I(inode);
|
|
info = MQUEUE_I(inode);
|
|
|
spin_lock(&info->lock);
|
|
spin_lock(&info->lock);
|
|
|
while ((msg = msg_get(info)) != NULL)
|
|
while ((msg = msg_get(info)) != NULL)
|
|
|
- free_msg(msg);
|
|
|
|
|
|
|
+ list_add_tail(&msg->m_list, &tmp_msg);
|
|
|
kfree(info->node_cache);
|
|
kfree(info->node_cache);
|
|
|
spin_unlock(&info->lock);
|
|
spin_unlock(&info->lock);
|
|
|
|
|
|
|
|
|
|
+ list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) {
|
|
|
|
|
+ list_del(&msg->m_list);
|
|
|
|
|
+ free_msg(msg);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/* Total amount of bytes accounted for the mqueue */
|
|
/* Total amount of bytes accounted for the mqueue */
|
|
|
mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
|
|
mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
|
|
|
min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
|
|
min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
|