}
 
 static int
-read_from_socket(struct TCP_Server_Info *server,
-                struct kvec *iov, unsigned int to_read,
-                unsigned int *ptotal_read, bool is_header_read)
+read_from_socket(struct TCP_Server_Info *server, char *buf,
+                unsigned int to_read)
 {
-       int length, rc = 0;
-       unsigned int total_read;
+       int length = 0;
+       int total_read;
        struct msghdr smb_msg;
-       char *buf = iov->iov_base;
+       struct kvec iov;
 
        smb_msg.msg_control = NULL;
        smb_msg.msg_controllen = 0;
 
-       for (total_read = 0; total_read < to_read; total_read += length) {
+       for (total_read = 0; to_read; total_read += length, to_read -= length) {
                if (server_unresponsive(server)) {
-                       rc = 1;
+                       total_read = -EAGAIN;
                        break;
                }
 
-               length = kernel_recvmsg(server->ssocket, &smb_msg, iov, 1,
-                                       to_read - total_read, 0);
+               iov.iov_base = buf + total_read;
+               iov.iov_len = to_read;
+               length = kernel_recvmsg(server->ssocket, &smb_msg, &iov, 1,
+                                       to_read, 0);
                if (server->tcpStatus == CifsExiting) {
-                       /* then will exit */
-                       rc = 2;
+                       total_read = -ESHUTDOWN;
                        break;
                } else if (server->tcpStatus == CifsNeedReconnect) {
                        cifs_reconnect(server);
-                       /* Reconnect wakes up rspns q */
-                       /* Now we will reread sock */
-                       rc = 1;
+                       total_read = -EAGAIN;
                        break;
                } else if (length == -ERESTARTSYS ||
                           length == -EAGAIN ||
                         */
                        usleep_range(1000, 2000);
                        length = 0;
-                       if (!is_header_read)
-                               continue;
-                       /* Special handling for header read */
-                       if (total_read) {
-                               iov->iov_base = (to_read - total_read) +
-                                               buf;
-                               iov->iov_len = to_read - total_read;
-                               rc = 3;
-                       } else
-                               rc = 1;
-                       break;
+                       continue;
                } else if (length <= 0) {
-                       cERROR(1, "Received no data, expecting %d",
-                              to_read - total_read);
+                       cFYI(1, "Received no data or error: expecting %d "
+                               "got %d", to_read, length);
                        cifs_reconnect(server);
-                       rc = 1;
+                       total_read = -EAGAIN;
                        break;
                }
        }
-
-       *ptotal_read = total_read;
-       return rc;
+       return total_read;
 }
 
 static bool
        unsigned int pdu_length, total_read;
        char *buf = NULL, *bigbuf = NULL, *smallbuf = NULL;
        struct smb_hdr *smb_buffer = NULL;
-       struct kvec iov;
        struct task_struct *task_to_wake = NULL;
        struct mid_q_entry *mid_entry;
        bool isLargeBuf = false;
        bool isMultiRsp = false;
-       int rc;
 
        current->flags |= PF_MEMALLOC;
        cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
                isMultiRsp = false;
                smb_buffer = (struct smb_hdr *)smallbuf;
                buf = smallbuf;
-               iov.iov_base = buf;
-               iov.iov_len = 4;
                pdu_length = 4; /* enough to get RFC1001 header */
 
-incomplete_rcv:
-               rc = read_from_socket(server, &iov, pdu_length,
-                                     &total_read, true /* header read */);
-               if (rc == 3)
-                       goto incomplete_rcv;
-               else if (rc == 2)
-                       break;
-               else if (rc == 1)
+               length = read_from_socket(server, buf, pdu_length);
+               if (length < 0)
                        continue;
+               total_read = length;
 
                /*
                 * The right amount was read from socket - 4 bytes,
                        buf = bigbuf;
                }
 
-               iov.iov_base = 4 + buf;
-               iov.iov_len = pdu_length;
-               rc = read_from_socket(server, &iov, pdu_length,
-                                     &total_read, false);
-               if (rc == 2)
-                       break;
-               else if (rc == 1)
+               length = read_from_socket(server, buf + 4, pdu_length);
+               if (length < 0)
                        continue;
-
-               total_read += 4; /* account for rfc1002 hdr */
+               total_read += length;
 
                dump_smb(smb_buffer, total_read);