struct delayed_work     echo; /* echo ping workqueue job */
        char    *smallbuf;      /* pointer to current "small" buffer */
        char    *bigbuf;        /* pointer to current "big" buffer */
+       /* Total size of this PDU. Only valid from cifs_demultiplex_thread */
+       unsigned int pdu_size;
        unsigned int total_read; /* total amount of data read in this pass */
 #ifdef CONFIG_CIFS_FSCACHE
        struct fscache_cookie   *fscache; /* client index cache cookie */
 
        unsigned int data_offset, data_len;
        struct cifs_readdata *rdata = mid->callback_data;
        char *buf = server->smallbuf;
-       unsigned int buflen = get_rfc1002_length(buf) +
+       unsigned int buflen = server->pdu_size +
                server->vals->header_preamble_size;
        bool use_rdma_mr = false;
 
 
 {
        int length;
        char *buf = server->smallbuf;
-       unsigned int pdu_length = get_rfc1002_length(buf);
+       unsigned int pdu_length = server->pdu_size;
 
        /* make sure this will fit in a large buffer */
        if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server) -
                 * so we can now interpret the length field.
                 */
                pdu_length = get_rfc1002_length(buf);
+               server->pdu_size = pdu_length;
 
                cifs_dbg(FYI, "RFC1002 header 0x%x\n", pdu_length);
                if (!is_smb_response(server, buf[0]))
 
        unsigned int npages;
        struct page **pages;
        unsigned int len;
-       unsigned int buflen = get_rfc1002_length(buf) + server->vals->header_preamble_size;
+       unsigned int buflen = server->pdu_size + server->vals->header_preamble_size;
        int rc;
        int i = 0;
 
 {
        int length;
        char *buf = server->smallbuf;
-       unsigned int pdu_length = get_rfc1002_length(buf);
+       unsigned int pdu_length = server->pdu_size;
        unsigned int buf_size;
        struct mid_q_entry *mid_entry;
 
 smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
 {
        char *buf = server->smallbuf;
-       unsigned int pdu_length = get_rfc1002_length(buf);
+       unsigned int pdu_length = server->pdu_size;
        struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
        unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
 
 {
        char *buf = server->large_buf ? server->bigbuf : server->smallbuf;
 
-       return handle_read_data(server, mid, buf, get_rfc1002_length(buf) +
+       return handle_read_data(server, mid, buf, server->pdu_size +
                                server->vals->header_preamble_size,
                                NULL, 0, 0);
 }