cifs: add pdu_size to the TCP_Server_Info structure
authorRonnie Sahlberg <lsahlber@redhat.com>
Mon, 9 Apr 2018 08:06:26 +0000 (18:06 +1000)
committerSteve French <smfrench@gmail.com>
Thu, 12 Apr 2018 22:06:33 +0000 (17:06 -0500)
and get rid of some get_rfc1002_length() in smb2

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <smfrench@gmail.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
fs/cifs/cifsglob.h
fs/cifs/cifssmb.c
fs/cifs/connect.c
fs/cifs/smb2ops.c

index 56fee0330afc95656493df047649ea6dd51f2481..5c1568ccd67d575839543cd8e8a06b41631855df 100644 (file)
@@ -665,6 +665,8 @@ struct TCP_Server_Info {
        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 */
index abdc93d4fee82c0509b5783d4d8ecca08095891b..890b3a40c79ca5309feb1ff86ae66037fb7433fd 100644 (file)
@@ -1456,7 +1456,7 @@ cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid)
        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;
 
index 4e0808f4019592e67b162605bef296263949036d..48012a0addf1ca1fd99f3d9bda0011ffb7d4dd9f 100644 (file)
@@ -772,7 +772,7 @@ standard_receive3(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 {
        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) -
@@ -881,6 +881,7 @@ cifs_demultiplex_thread(void *p)
                 * 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]))
index 968b1d43a1ea5a792fef2a0c1e429534e92213b0..def84fed3571d57fff4cb01873967eee53e16d25 100644 (file)
@@ -2550,7 +2550,7 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
        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;
 
@@ -2624,7 +2624,7 @@ receive_encrypted_standard(struct TCP_Server_Info *server,
 {
        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;
 
@@ -2668,7 +2668,7 @@ static int
 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);
 
@@ -2699,7 +2699,7 @@ smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 {
        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);
 }