static struct mid_q_entry *
 find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
-             int *malformed, bool is_large_buf, bool *is_multi_rsp,
-             char **bigbuf)
+             int malformed, bool is_large_buf, char **bigbuf)
 {
        struct mid_q_entry *mid = NULL;
 
        if (!mid)
                return mid;
 
-       if (*malformed == 0 && check2ndT2(buf) > 0) {
-               /* We have a multipart transact2 resp */
-               *is_multi_rsp = true;
+       if (malformed == 0 && check2ndT2(buf) > 0) {
+               mid->multiRsp = true;
                if (mid->resp_buf) {
                        /* merge response - fix up 1st*/
-                       *malformed = coalesce_t2(buf, mid->resp_buf);
-                       if (*malformed > 0) {
-                               *malformed = 0;
-                               mid->multiRsp = true;
-                               return NULL;
-                       }
+                       malformed = coalesce_t2(buf, mid->resp_buf);
+                       if (malformed > 0)
+                               return mid;
+
                        /* All parts received or packet is malformed. */
                        mid->multiEnd = true;
                        goto multi_t2_fnd;
        mid->resp_buf = buf;
        mid->largeBuf = is_large_buf;
 multi_t2_fnd:
-       dequeue_mid(mid, *malformed);
+       dequeue_mid(mid, malformed);
        return mid;
 }
 
        struct task_struct *task_to_wake = NULL;
        struct mid_q_entry *mid_entry;
        bool isLargeBuf = false;
-       bool isMultiRsp = false;
 
        current->flags |= PF_MEMALLOC;
        cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
                        continue;
 
                isLargeBuf = false;
-               isMultiRsp = false;
                smb_buffer = (struct smb_hdr *)smallbuf;
                buf = smallbuf;
                pdu_length = 4; /* enough to get RFC1001 header */
 
                server->lstrp = jiffies;
 
-               mid_entry = find_cifs_mid(server, smb_buffer, &length,
-                                         isLargeBuf, &isMultiRsp, &bigbuf);
+               mid_entry = find_cifs_mid(server, smb_buffer, length,
+                                         isLargeBuf, &bigbuf);
                if (mid_entry != NULL) {
-                       mid_entry->callback(mid_entry);
+                       if (mid_entry->multiRsp && !mid_entry->multiEnd)
+                               continue;
+
                        /* Was previous buf put in mpx struct for multi-rsp? */
-                       if (!isMultiRsp) {
+                       if (!mid_entry->multiRsp) {
                                /* smb buffer will be freed by user thread */
                                if (isLargeBuf)
                                        bigbuf = NULL;
                                else
                                        smallbuf = NULL;
                        }
+                       mid_entry->callback(mid_entry);
                } else if (length != 0) {
                        /* response sanity checks failed */
                        continue;
-               } else if (!is_valid_oplock_break(smb_buffer, server) &&
-                          !isMultiRsp) {
+               } else if (!is_valid_oplock_break(smb_buffer, server)) {
                        cERROR(1, "No task to wake, unknown frame received! "
                                   "NumMids %d", atomic_read(&midCount));
                        cifs_dump_mem("Received Data is: ", buf,