提交 f66c6e6a 编写于 作者: L Linus Torvalds

Merge tag 'for-linus-4.7-2' of git://git.code.sf.net/p/openipmi/linux-ipmi

Pull ipmi bugfix from Corey Minyard:
 "Fix a fairly significant ipmi list bug

  This bug could cause lists to be corrupted"

* tag 'for-linus-4.7-2' of git://git.code.sf.net/p/openipmi/linux-ipmi:
  ipmi: Remove smi_msg from waiting_rcv_msgs list before handle_one_recv_msg()
...@@ -3820,6 +3820,7 @@ static void handle_new_recv_msgs(ipmi_smi_t intf) ...@@ -3820,6 +3820,7 @@ static void handle_new_recv_msgs(ipmi_smi_t intf)
while (!list_empty(&intf->waiting_rcv_msgs)) { while (!list_empty(&intf->waiting_rcv_msgs)) {
smi_msg = list_entry(intf->waiting_rcv_msgs.next, smi_msg = list_entry(intf->waiting_rcv_msgs.next,
struct ipmi_smi_msg, link); struct ipmi_smi_msg, link);
list_del(&smi_msg->link);
if (!run_to_completion) if (!run_to_completion)
spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock, spin_unlock_irqrestore(&intf->waiting_rcv_msgs_lock,
flags); flags);
...@@ -3829,11 +3830,14 @@ static void handle_new_recv_msgs(ipmi_smi_t intf) ...@@ -3829,11 +3830,14 @@ static void handle_new_recv_msgs(ipmi_smi_t intf)
if (rv > 0) { if (rv > 0) {
/* /*
* To preserve message order, quit if we * To preserve message order, quit if we
* can't handle a message. * can't handle a message. Add the message
* back at the head, this is safe because this
* tasklet is the only thing that pulls the
* messages.
*/ */
list_add(&smi_msg->link, &intf->waiting_rcv_msgs);
break; break;
} else { } else {
list_del(&smi_msg->link);
if (rv == 0) if (rv == 0)
/* Message handled */ /* Message handled */
ipmi_free_smi_msg(smi_msg); ipmi_free_smi_msg(smi_msg);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册