Re: [PATCH 07/15] cifs: remove header_preamble_size where it is always 0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



merged the first 7 in the series into for-next

On Thu, May 31, 2018 at 7:53 PM, Ronnie Sahlberg <lsahlber@xxxxxxxxxx> wrote:
> Since header_preamble_size is 0 for SMB2+ we can remove it in those
> code paths that are only invoked from SMB2.
>
> Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx>
> ---
>  fs/cifs/smb2misc.c | 28 ++++++++++++----------------
>  fs/cifs/smb2ops.c  | 44 ++++++++++++++++++--------------------------
>  fs/cifs/smb2pdu.c  | 44 ++++++++++++++++++--------------------------
>  3 files changed, 48 insertions(+), 68 deletions(-)
>
> diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c
> index 86ab37dfc749..4a142d0419e2 100644
> --- a/fs/cifs/smb2misc.c
> +++ b/fs/cifs/smb2misc.c
> @@ -95,8 +95,7 @@ static const __le16 smb2_rsp_struct_sizes[NUMBER_OF_SMB2_COMMANDS] = {
>
>  #ifdef CONFIG_CIFS_SMB311
>  static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
> -                             __u32 non_ctxlen,
> -                               size_t hdr_preamble_size)
> +                             __u32 non_ctxlen)
>  {
>         __u16 neg_count;
>         __u32 nc_offset, size_of_pad_before_neg_ctxts;
> @@ -110,12 +109,11 @@ static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
>
>         /* Make sure that negotiate contexts start after gss security blob */
>         nc_offset = le32_to_cpu(pneg_rsp->NegotiateContextOffset);
> -       if (nc_offset < non_ctxlen - hdr_preamble_size /* RFC1001 len */) {
> +       if (nc_offset < non_ctxlen) {
>                 printk_once(KERN_WARNING "invalid negotiate context offset\n");
>                 return 0;
>         }
> -       size_of_pad_before_neg_ctxts = nc_offset -
> -                                       (non_ctxlen - hdr_preamble_size);
> +       size_of_pad_before_neg_ctxts = nc_offset - non_ctxlen;
>
>         /* Verify that at least minimal negotiate contexts fit within frame */
>         if (len < nc_offset + (neg_count * sizeof(struct smb2_neg_context))) {
> @@ -134,7 +132,7 @@ static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
>  int
>  smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
>  {
> -       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)(buf + srvr->vals->header_preamble_size);
> +       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
>         struct smb2_sync_pdu *pdu = (struct smb2_sync_pdu *)shdr;
>         __u64 mid;
>         __u32 clc_len;  /* calculated length */
> @@ -183,8 +181,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
>                 }
>                 return 1;
>         }
> -       if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE -
> -           srvr->vals->header_preamble_size) {
> +       if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE) {
>                 cifs_dbg(VFS, "SMB length greater than maximum, mid=%llu\n",
>                          mid);
>                 return 1;
> @@ -227,8 +224,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
>
>  #ifdef CONFIG_CIFS_SMB311
>         if (shdr->Command == SMB2_NEGOTIATE)
> -               clc_len += get_neg_ctxt_len(shdr, len, clc_len,
> -                                           srvr->vals->header_preamble_size);
> +               clc_len += get_neg_ctxt_len(shdr, len, clc_len);
>  #endif /* SMB311 */
>         if (len != clc_len) {
>                 cifs_dbg(FYI, "Calculated size %u length %u mismatch mid %llu\n",
> @@ -253,7 +249,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
>                  */
>                 if (clc_len < len) {
>                         printk_once(KERN_WARNING
> -                               "SMB2 server sent bad RFC1001 len %d not %u\n",
> +                               "SMB2 server sent bad RFC1001 len %d not %d\n",
>                                 len, clc_len);
>                         return 0;
>                 }
> @@ -401,7 +397,7 @@ smb2_calc_size(void *buf, struct TCP_Server_Info *srvr)
>         int offset; /* the offset from the beginning of SMB to data area */
>         int data_length; /* the length of the variable length data area */
>         /* Structure Size has already been checked to make sure it is 64 */
> -       int len = srvr->vals->header_preamble_size + le16_to_cpu(shdr->StructureSize);
> +       int len = le16_to_cpu(shdr->StructureSize);
>
>         /*
>          * StructureSize2, ie length of fixed parameter area has already
> @@ -422,12 +418,12 @@ smb2_calc_size(void *buf, struct TCP_Server_Info *srvr)
>                  * for some commands, typically those with odd StructureSize,
>                  * so we must add one to the calculation.
>                  */
> -               if (offset + srvr->vals->header_preamble_size + 1 < len) {
> -                       cifs_dbg(VFS, "data area offset %zu overlaps SMB2 header %d\n",
> -                                offset + srvr->vals->header_preamble_size + 1, len);
> +               if (offset + 1 < len) {
> +                       cifs_dbg(VFS, "data area offset %d overlaps SMB2 header %d\n",
> +                                offset + 1, len);
>                         data_length = 0;
>                 } else {
> -                       len = srvr->vals->header_preamble_size + offset + data_length;
> +                       len = offset + data_length;
>                 }
>         }
>  calc_size_exit:
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 156a2fb2b2fc..d3b9c2f316bc 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -1520,8 +1520,6 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
>         unsigned int sub_offset;
>         unsigned int print_len;
>         unsigned int print_offset;
> -       struct cifs_ses *ses = tcon->ses;
> -       struct TCP_Server_Info *server = ses->server;
>
>         cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
>
> @@ -1545,7 +1543,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
>
>         err_buf = err_iov.iov_base;
>         if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct smb2_symlink_err_rsp) ||
> -           err_iov.iov_len + server->vals->header_preamble_size < SMB2_SYMLINK_STRUCT_SIZE) {
> +           err_iov.iov_len < SMB2_SYMLINK_STRUCT_SIZE) {
>                 kfree(utf16_path);
>                 return -ENOENT;
>         }
> @@ -1558,14 +1556,13 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
>         print_len = le16_to_cpu(symlink->PrintNameLength);
>         print_offset = le16_to_cpu(symlink->PrintNameOffset);
>
> -       if (err_iov.iov_len + server->vals->header_preamble_size <
> -                       SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
> +       if (err_iov.iov_len < SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
>                 kfree(utf16_path);
>                 return -ENOENT;
>         }
>
> -       if (err_iov.iov_len + server->vals->header_preamble_size <
> -                       SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
> +       if (err_iov.iov_len <
> +           SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
>                 kfree(utf16_path);
>                 return -ENOENT;
>         }
> @@ -2232,7 +2229,7 @@ crypt_message(struct TCP_Server_Info *server, struct smb_rqst *rqst, int enc)
>  {
>         struct smb2_transform_hdr *tr_hdr =
>                         (struct smb2_transform_hdr *)rqst->rq_iov[0].iov_base;
> -       unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20 - server->vals->header_preamble_size;
> +       unsigned int assoc_data_len = sizeof(struct smb2_transform_hdr) - 20;
>         int rc = 0;
>         struct scatterlist *sg;
>         u8 sign[SMB2_SIGNATURE_SIZE] = {};
> @@ -2458,7 +2455,7 @@ decrypt_raw_data(struct TCP_Server_Info *server, char *buf,
>         if (rc)
>                 return rc;
>
> -       memmove(buf + server->vals->header_preamble_size, iov[2].iov_base, buf_data_size);
> +       memmove(buf, iov[2].iov_base, buf_data_size);
>
>         server->total_read = buf_data_size + page_data_size;
>
> @@ -2564,7 +2561,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
>                 return 0;
>         }
>
> -       data_offset = server->ops->read_data_offset(buf) + server->vals->header_preamble_size;
> +       data_offset = server->ops->read_data_offset(buf);
>  #ifdef CONFIG_CIFS_SMB_DIRECT
>         use_rdma_mr = rdata->mr;
>  #endif
> @@ -2660,12 +2657,11 @@ 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 = server->pdu_size + server->vals->header_preamble_size;
> +       unsigned int buflen = server->pdu_size;
>         int rc;
>         int i = 0;
>
> -       len = min_t(unsigned int, buflen, server->vals->read_rsp_size -
> -               server->vals->header_preamble_size +
> +       len = min_t(unsigned int, buflen, server->vals->read_rsp_size +
>                 sizeof(struct smb2_transform_hdr)) - HEADER_SIZE(server) + 1;
>
>         rc = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1, len);
> @@ -2673,8 +2669,7 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
>                 return rc;
>         server->total_read += rc;
>
> -       len = le32_to_cpu(tr_hdr->OriginalMessageSize) +
> -               server->vals->header_preamble_size -
> +       len = le32_to_cpu(tr_hdr->OriginalMessageSize) -
>                 server->vals->read_rsp_size;
>         npages = DIV_ROUND_UP(len, PAGE_SIZE);
>
> @@ -2701,8 +2696,7 @@ receive_encrypted_read(struct TCP_Server_Info *server, struct mid_q_entry **mid)
>         if (rc)
>                 goto free_pages;
>
> -       rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size -
> -                             server->vals->header_preamble_size,
> +       rc = decrypt_raw_data(server, buf, server->vals->read_rsp_size,
>                               pages, npages, len);
>         if (rc)
>                 goto free_pages;
> @@ -2739,7 +2733,7 @@ receive_encrypted_standard(struct TCP_Server_Info *server,
>         struct mid_q_entry *mid_entry;
>
>         /* switch to large buffer if too big for a small one */
> -       if (pdu_length + server->vals->header_preamble_size > MAX_CIFS_SMALL_BUFFER_SIZE) {
> +       if (pdu_length > MAX_CIFS_SMALL_BUFFER_SIZE) {
>                 server->large_buf = true;
>                 memcpy(server->bigbuf, buf, server->total_read);
>                 buf = server->bigbuf;
> @@ -2747,13 +2741,12 @@ receive_encrypted_standard(struct TCP_Server_Info *server,
>
>         /* now read the rest */
>         length = cifs_read_from_socket(server, buf + HEADER_SIZE(server) - 1,
> -                               pdu_length - HEADER_SIZE(server) + 1 +
> -                               server->vals->header_preamble_size);
> +                               pdu_length - HEADER_SIZE(server) + 1);
>         if (length < 0)
>                 return length;
>         server->total_read += length;
>
> -       buf_size = pdu_length + server->vals->header_preamble_size - sizeof(struct smb2_transform_hdr);
> +       buf_size = pdu_length - sizeof(struct smb2_transform_hdr);
>         length = decrypt_raw_data(server, buf, buf_size, NULL, 0, 0);
>         if (length)
>                 return length;
> @@ -2782,7 +2775,7 @@ smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
>         struct smb2_transform_hdr *tr_hdr = (struct smb2_transform_hdr *)buf;
>         unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
>
> -       if (pdu_length + server->vals->header_preamble_size < sizeof(struct smb2_transform_hdr) +
> +       if (pdu_length < sizeof(struct smb2_transform_hdr) +
>                                                 sizeof(struct smb2_sync_hdr)) {
>                 cifs_dbg(VFS, "Transform message is too small (%u)\n",
>                          pdu_length);
> @@ -2791,14 +2784,14 @@ smb3_receive_transform(struct TCP_Server_Info *server, struct mid_q_entry **mid)
>                 return -ECONNABORTED;
>         }
>
> -       if (pdu_length + server->vals->header_preamble_size < orig_len + sizeof(struct smb2_transform_hdr)) {
> +       if (pdu_length < orig_len + sizeof(struct smb2_transform_hdr)) {
>                 cifs_dbg(VFS, "Transform message is broken\n");
>                 cifs_reconnect(server);
>                 wake_up(&server->response_q);
>                 return -ECONNABORTED;
>         }
>
> -       if (pdu_length + server->vals->header_preamble_size > CIFSMaxBufSize + MAX_HEADER_SIZE(server))
> +       if (pdu_length > CIFSMaxBufSize + MAX_HEADER_SIZE(server))
>                 return receive_encrypted_read(server, mid);
>
>         return receive_encrypted_standard(server, mid);
> @@ -2809,8 +2802,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, server->pdu_size +
> -                               server->vals->header_preamble_size,
> +       return handle_read_data(server, mid, buf, server->pdu_size,
>                                 NULL, 0, 0);
>  }
>
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index 633a314f4748..2082ac5b80c8 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -491,8 +491,7 @@ static int smb311_decode_neg_context(struct smb2_negotiate_rsp *rsp,
>                 if (len_of_ctxts < sizeof(struct smb2_neg_context))
>                         break;
>
> -               pctx = (struct smb2_neg_context *)(offset +
> -                       server->vals->header_preamble_size + (char *)rsp);
> +               pctx = (struct smb2_neg_context *)(offset + (char *)rsp);
>                 clen = le16_to_cpu(pctx->DataLength);
>                 if (clen > len_of_ctxts)
>                         break;
> @@ -1155,7 +1154,7 @@ SMB2_sess_auth_rawntlmssp_negotiate(struct SMB2_sess_data *sess_data)
>         if (rc)
>                 goto out;
>
> -       if (offsetof(struct smb2_sess_setup_rsp, Buffer) - ses->server->vals->header_preamble_size !=
> +       if (offsetof(struct smb2_sess_setup_rsp, Buffer) !=
>                         le16_to_cpu(rsp->SecurityBufferOffset)) {
>                 cifs_dbg(VFS, "Invalid security buffer offset %d\n",
>                         le16_to_cpu(rsp->SecurityBufferOffset));
> @@ -1602,7 +1601,7 @@ parse_lease_state(struct TCP_Server_Info *server, struct smb2_create_rsp *rsp,
>         unsigned int remaining;
>         char *name;
>
> -       data_offset = (char *)rsp + server->vals->header_preamble_size + le32_to_cpu(rsp->CreateContextsOffset);
> +       data_offset = (char *)rsp + le32_to_cpu(rsp->CreateContextsOffset);
>         remaining = le32_to_cpu(rsp->CreateContextsLength);
>         cc = (struct create_context *)data_offset;
>         while (remaining >= sizeof(struct create_context)) {
> @@ -2241,13 +2240,12 @@ SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
>  }
>
>  static int
> -validate_iov(struct TCP_Server_Info *server,
> -            unsigned int offset, unsigned int buffer_length,
> +validate_iov(unsigned int offset, unsigned int buffer_length,
>              struct kvec *iov, unsigned int min_buf_size)
>  {
>         unsigned int smb_len = iov->iov_len;
> -       char *end_of_smb = smb_len + server->vals->header_preamble_size + (char *)iov->iov_base;
> -       char *begin_of_buf = server->vals->header_preamble_size + offset + (char *)iov->iov_base;
> +       char *end_of_smb = smb_len + (char *)iov->iov_base;
> +       char *begin_of_buf = offset + (char *)iov->iov_base;
>         char *end_of_buf = begin_of_buf + buffer_length;
>
>
> @@ -2277,18 +2275,17 @@ validate_iov(struct TCP_Server_Info *server,
>   * Caller must free buffer.
>   */
>  static int
> -validate_and_copy_iov(struct TCP_Server_Info *server,
> -                     unsigned int offset, unsigned int buffer_length,
> +validate_and_copy_iov(unsigned int offset, unsigned int buffer_length,
>                       struct kvec *iov, unsigned int minbufsize,
>                       char *data)
>  {
> -       char *begin_of_buf = server->vals->header_preamble_size + offset + (char *)(iov->iov_base);
> +       char *begin_of_buf = offset + (char *)iov->iov_base;
>         int rc;
>
>         if (!data)
>                 return -EINVAL;
>
> -       rc = validate_iov(server, offset, buffer_length, iov, minbufsize);
> +       rc = validate_iov(offset, buffer_length, iov, minbufsize);
>         if (rc)
>                 return rc;
>
> @@ -2368,8 +2365,7 @@ query_info(const unsigned int xid, struct cifs_tcon *tcon,
>                 }
>         }
>
> -       rc = validate_and_copy_iov(ses->server,
> -                                  le16_to_cpu(rsp->OutputBufferOffset),
> +       rc = validate_and_copy_iov(le16_to_cpu(rsp->OutputBufferOffset),
>                                    le32_to_cpu(rsp->OutputBufferLength),
>                                    &rsp_iov, min_len, *data);
>
> @@ -3319,8 +3315,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
>                 goto qdir_exit;
>         }
>
> -       rc = validate_iov(server,
> -                         le16_to_cpu(rsp->OutputBufferOffset),
> +       rc = validate_iov(le16_to_cpu(rsp->OutputBufferOffset),
>                           le32_to_cpu(rsp->OutputBufferLength), &rsp_iov,
>                           info_buf_size);
>         if (rc)
> @@ -3655,7 +3650,7 @@ build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, int level,
>         req->InputBufferOffset =
>                         cpu_to_le16(sizeof(struct smb2_query_info_req) - 1);
>         req->OutputBufferLength = cpu_to_le32(
> -               outbuf_len + sizeof(struct smb2_query_info_rsp) - 1 - server->vals->header_preamble_size);
> +               outbuf_len + sizeof(struct smb2_query_info_rsp) - 1);
>
>         iov->iov_base = (char *)req;
>         iov->iov_len = total_len;
> @@ -3672,7 +3667,6 @@ SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
>         int rc = 0;
>         int resp_buftype;
>         struct cifs_ses *ses = tcon->ses;
> -       struct TCP_Server_Info *server = ses->server;
>         struct smb2_fs_full_size_info *info = NULL;
>         int flags = 0;
>
> @@ -3693,10 +3687,9 @@ SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon,
>         }
>         rsp = (struct smb2_query_info_rsp *)rsp_iov.iov_base;
>
> -       info = (struct smb2_fs_full_size_info *)(server->vals->header_preamble_size +
> +       info = (struct smb2_fs_full_size_info *)(
>                 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp);
> -       rc = validate_iov(server,
> -                         le16_to_cpu(rsp->OutputBufferOffset),
> +       rc = validate_iov(le16_to_cpu(rsp->OutputBufferOffset),
>                           le32_to_cpu(rsp->OutputBufferLength), &rsp_iov,
>                           sizeof(struct smb2_fs_full_size_info));
>         if (!rc)
> @@ -3717,7 +3710,6 @@ SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon,
>         int rc = 0;
>         int resp_buftype, max_len, min_len;
>         struct cifs_ses *ses = tcon->ses;
> -       struct TCP_Server_Info *server = ses->server;
>         unsigned int rsp_len, offset;
>         int flags = 0;
>
> @@ -3753,20 +3745,20 @@ SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon,
>
>         rsp_len = le32_to_cpu(rsp->OutputBufferLength);
>         offset = le16_to_cpu(rsp->OutputBufferOffset);
> -       rc = validate_iov(server, offset, rsp_len, &rsp_iov, min_len);
> +       rc = validate_iov(offset, rsp_len, &rsp_iov, min_len);
>         if (rc)
>                 goto qfsattr_exit;
>
>         if (level == FS_ATTRIBUTE_INFORMATION)
> -               memcpy(&tcon->fsAttrInfo, server->vals->header_preamble_size + offset
> +               memcpy(&tcon->fsAttrInfo, offset
>                         + (char *)rsp, min_t(unsigned int,
>                         rsp_len, max_len));
>         else if (level == FS_DEVICE_INFORMATION)
> -               memcpy(&tcon->fsDevInfo, server->vals->header_preamble_size + offset
> +               memcpy(&tcon->fsDevInfo, offset
>                         + (char *)rsp, sizeof(FILE_SYSTEM_DEVICE_INFO));
>         else if (level == FS_SECTOR_SIZE_INFORMATION) {
>                 struct smb3_fs_ss_info *ss_info = (struct smb3_fs_ss_info *)
> -                       (server->vals->header_preamble_size + offset + (char *)rsp);
> +                       (offset + (char *)rsp);
>                 tcon->ss_flags = le32_to_cpu(ss_info->Flags);
>                 tcon->perf_sector_size =
>                         le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf);
> --
> 2.13.3
>



-- 
Thanks,

Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux