Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp943123ybb; Wed, 25 Mar 2020 12:31:17 -0700 (PDT) X-Google-Smtp-Source: ADFU+vuHjeMevw9pxRBNz1ICFHl5mN5UkXeDov6PuTHM1e6IQBqMlfK/+SXhYpQjdPYJipAxNVhK X-Received: by 2002:aca:1b05:: with SMTP id b5mr3767816oib.1.1585164676932; Wed, 25 Mar 2020 12:31:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585164676; cv=none; d=google.com; s=arc-20160816; b=KbJ7WjH8p5FwKED78lYv8yFRFdy3U6EYixUwRcAI39MHEtkZJYKu2Iiwr2b35bWvDG bqEdBFo+AlU+AHs9wi6g4EX9dpoN1JsFxfn1TW1UlPDd0MTmn8jiDb0dOalY4q7ib+AJ Y75m8ZLZRkpUj3F168bLlj/QFITEG5C00JXgQZJcb+DXadBP7x7UB1Ul5mUK/scuUbLa BiFL4al5nddTKEdBQhO664qm1Wf/fJezh4GYUmsmQ2kZ/waxrIui3VV45sp85qzsi60r a95OcbJO9+1aIyNOHqpV97bI5Q4/js3azLrx40bJcrporc0QzC2t0awLprjQsofyRCyH cU/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:reply-to:message-id:date:subject:cc:to :from:dkim-signature:dkim-filter; bh=JTOKPle64Y3CcsUT3NLGdNuqHsoqlanFLCnXhn2nAO4=; b=SYjQYMPXAuFXdT3ckj3OtbShsdYP+Mif3hECTBbDOGoq8XCer/xtq9M4UaAgFF56Mr GpvrKPfRwBhpwmNuJpkn/lLlwgG0kr0fmc9Fnh32zXomyiLzWObtiwE2HD/CIM2Ja1ud GJTOagmy7M7oK6mFDoFd8weTFmJR3xGlxldeZXhWMK/K+y1gZ+Sb+lzgvBf+TGfmnI29 WATwMPl1Y3xUJk+k7ZPJBJgSyZHMkGJzLUf69FhyUVMuaayv/5sXzVSOT4QYWJCFNqR4 KVk3tNvQVaUtooDPdzlgn5muZlR/zYUeau4jJeW1tj5tmgHVKqz7X9oTWGpEbVy1yTlc 2wuw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxonhyperv.com header.s=default header.b="OwgWT/j+"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxonhyperv.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e24si19638otk.203.2020.03.25.12.31.02; Wed, 25 Mar 2020 12:31:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxonhyperv.com header.s=default header.b="OwgWT/j+"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxonhyperv.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727883AbgCYTa0 (ORCPT + 99 others); Wed, 25 Mar 2020 15:30:26 -0400 Received: from linux.microsoft.com ([13.77.154.182]:46716 "EHLO linux.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727328AbgCYTaZ (ORCPT ); Wed, 25 Mar 2020 15:30:25 -0400 Received: by linux.microsoft.com (Postfix, from userid 1004) id 5956420B4737; Wed, 25 Mar 2020 12:30:24 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5956420B4737 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1585164624; bh=JTOKPle64Y3CcsUT3NLGdNuqHsoqlanFLCnXhn2nAO4=; h=From:To:Cc:Subject:Date:Reply-To:From; b=OwgWT/j+a88JSBxb/rt6FAeu2wCIayAMGUkyBZpi9tL2y59B4zn9Ww3JWvkaXXwlw s9qozR0xVpfeefTYvoG9n2GqKFlVRR+RWEScgsSI1DPpx145t6RsVf3u4F98yVGgvl n84cMyFzRyiKXNcrAPwAUUdKscIX0FhV5mO1jx2Q= From: longli@linuxonhyperv.com To: Steve French , linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, linux-kernel@vger.kernel.org Cc: Long Li Subject: [PATCH] cifs: smbd: Calculate the correct maximum packet size for segmented SMBDirect send/receive Date: Wed, 25 Mar 2020 12:30:14 -0700 Message-Id: <1585164614-123696-1-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 Reply-To: longli@microsoft.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Long Li The packet size needs to take account of SMB2 header size and possible encryption header size. This is only done when signing is used and it is for RDMA send/receive, not read/write. Also remove the dead SMBD code in smb2_negotiate_r(w)size. Signed-off-by: Long Li --- fs/cifs/smb2ops.c | 38 ++++++++++++++++---------------------- fs/cifs/smbdirect.c | 3 +-- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c index 4c0922596467..9043d34eef43 100644 --- a/fs/cifs/smb2ops.c +++ b/fs/cifs/smb2ops.c @@ -332,16 +332,6 @@ smb2_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) /* start with specified wsize, or default */ wsize = volume_info->wsize ? volume_info->wsize : CIFS_DEFAULT_IOSIZE; wsize = min_t(unsigned int, wsize, server->max_write); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->rdma) { - if (server->sign) - wsize = min_t(unsigned int, - wsize, server->smbd_conn->max_fragmented_send_size); - else - wsize = min_t(unsigned int, - wsize, server->smbd_conn->max_readwrite_size); - } -#endif if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) wsize = min_t(unsigned int, wsize, SMB2_MAX_BUFFER_SIZE); @@ -360,8 +350,15 @@ smb3_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) #ifdef CONFIG_CIFS_SMB_DIRECT if (server->rdma) { if (server->sign) + /* + * Account for SMB2 data transfer packet header + * SMB2_READ/SMB2_WRITE (49) and possible encryption + * headers + */ wsize = min_t(unsigned int, - wsize, server->smbd_conn->max_fragmented_send_size); + wsize, + server->smbd_conn->max_fragmented_send_size - + 49 - sizeof(struct smb2_transform_hdr)); else wsize = min_t(unsigned int, wsize, server->smbd_conn->max_readwrite_size); @@ -382,16 +379,6 @@ smb2_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) /* start with specified rsize, or default */ rsize = volume_info->rsize ? volume_info->rsize : CIFS_DEFAULT_IOSIZE; rsize = min_t(unsigned int, rsize, server->max_read); -#ifdef CONFIG_CIFS_SMB_DIRECT - if (server->rdma) { - if (server->sign) - rsize = min_t(unsigned int, - rsize, server->smbd_conn->max_fragmented_recv_size); - else - rsize = min_t(unsigned int, - rsize, server->smbd_conn->max_readwrite_size); - } -#endif if (!(server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) rsize = min_t(unsigned int, rsize, SMB2_MAX_BUFFER_SIZE); @@ -411,8 +398,15 @@ smb3_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) #ifdef CONFIG_CIFS_SMB_DIRECT if (server->rdma) { if (server->sign) + /* + * Account for SMB2 data transfer packet header + * SMB2_READ/SMB2_WRITE (49) and possible encryption + * headers + */ rsize = min_t(unsigned int, - rsize, server->smbd_conn->max_fragmented_recv_size); + rsize, + server->smbd_conn->max_fragmented_recv_size - + 49 - sizeof(struct smb2_transform_hdr)); else rsize = min_t(unsigned int, rsize, server->smbd_conn->max_readwrite_size); diff --git a/fs/cifs/smbdirect.c b/fs/cifs/smbdirect.c index eb1e40af9f3a..0327b575ab87 100644 --- a/fs/cifs/smbdirect.c +++ b/fs/cifs/smbdirect.c @@ -2097,8 +2097,7 @@ int smbd_send(struct TCP_Server_Info *server, for (i = 0; i < num_rqst; i++) remaining_data_length += smb_rqst_len(server, &rqst_array[i]); - if (remaining_data_length + sizeof(struct smbd_data_transfer) > - info->max_fragmented_send_size) { + if (remaining_data_length > info->max_fragmented_send_size) { log_write(ERR, "payload size %d > max size %d\n", remaining_data_length, info->max_fragmented_send_size); rc = -EINVAL; -- 2.17.1