struct TCP_Server_Info *server; /* server corresponding to this mid */
        __u64 mid;              /* multiplex id */
        __u16 credits;          /* number of credits consumed by this mid */
+       __u16 credits_received; /* number of credits from the response */
        __u32 pid;              /* process id */
        __u32 sequence_number;  /* for CIFS signing */
        unsigned long when_alloc;  /* when mid was created */
 
        spin_unlock(&GlobalMid_Lock);
 }
 
+static unsigned int
+smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
+{
+       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
+
+       /*
+        * SMB1 does not use credits.
+        */
+       if (server->vals->header_preamble_size)
+               return 0;
+
+       return le16_to_cpu(shdr->CreditRequest);
+}
+
 static void
 handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
           char *buf, int malformed)
        if (server->ops->check_trans2 &&
            server->ops->check_trans2(mid, server, buf, malformed))
                return;
+       mid->credits_received = smb2_get_credits_from_hdr(buf, server);
        mid->resp_buf = buf;
        mid->large_buf = server->large_buf;
        /* Was previous buf put in mpx struct for multi-rsp? */
 
 static unsigned int
 smb2_get_credits(struct mid_q_entry *mid)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)mid->resp_buf;
-
-       if (mid->mid_state == MID_RESPONSE_RECEIVED
-           || mid->mid_state == MID_RESPONSE_MALFORMED)
-               return le16_to_cpu(shdr->CreditRequest);
-
-       return 0;
+       return mid->credits_received;
 }
 
 static int