ipmi: Free receive messages when in an oops
authorCorey Minyard <cminyard@mvista.com>
Fri, 16 Aug 2019 21:13:42 +0000 (16:13 -0500)
committerCorey Minyard <cminyard@mvista.com>
Fri, 16 Aug 2019 21:18:18 +0000 (16:18 -0500)
If the driver handles a response in an oops, it was just ignoring
the message.  However, the IPMI watchdog timer was counting on the
free happening to know when panic-time messages were complete.  So
free it in all cases.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
drivers/char/ipmi/ipmi_msghandler.c

index 6707659..3548ace 100644 (file)
@@ -904,12 +904,14 @@ static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
                        rv = -EINVAL;
                }
                ipmi_free_recv_msg(msg);
-       } else if (!oops_in_progress) {
+       } else if (oops_in_progress) {
                /*
                 * If we are running in the panic context, calling the
                 * receive handler doesn't much meaning and has a deadlock
                 * risk.  At this moment, simply skip it in that case.
                 */
+               ipmi_free_recv_msg(msg);
+       } else {
                int index;
                struct ipmi_user *user = acquire_ipmi_user(msg->user, &index);
 
@@ -2220,7 +2222,8 @@ static int i_ipmi_request(struct ipmi_user     *user,
        else {
                smi_msg = ipmi_alloc_smi_msg();
                if (smi_msg == NULL) {
-                       ipmi_free_recv_msg(recv_msg);
+                       if (!supplied_recv)
+                               ipmi_free_recv_msg(recv_msg);
                        rv = -ENOMEM;
                        goto out;
                }