smb3: add indatalen that can be a non-zero value to calculation of credit charge in smb2 ioctl
Some of tests in xfstests failed with cifsd kernel server since commite80ddeb2f7
. cifsd kernel server validates credit charge from client by calculating it base on max((InputCount + OutputCount) and (MaxInputResponse + MaxOutputResponse)) according to specification. MS-SMB2 specification describe credit charge calculation of smb2 ioctl : If Connection.SupportsMultiCredit is TRUE, the server MUST validate CreditCharge based on the maximum of (InputCount + OutputCount) and (MaxInputResponse + MaxOutputResponse), as specified in section 3.3.5.2.5. If the validation fails, it MUST fail the IOCTL request with STATUS_INVALID_PARAMETER. This patch add indatalen that can be a non-zero value to calculation of credit charge in SMB2_ioctl_init(). Fixes:e80ddeb2f7
("smb3: fix incorrect number of credits when ioctl MaxOutputResponse > 64K") Cc: Stable <stable@vger.kernel.org> Reviewed-by: Aurelien Aptel <aaptel@suse.com> Cc: Steve French <smfrench@gmail.com> Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
7866c177a0
commit
ebf57440ec
|
@ -2973,7 +2973,9 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
|
||||||
* response size smaller.
|
* response size smaller.
|
||||||
*/
|
*/
|
||||||
req->MaxOutputResponse = cpu_to_le32(max_response_size);
|
req->MaxOutputResponse = cpu_to_le32(max_response_size);
|
||||||
req->sync_hdr.CreditCharge = cpu_to_le16(DIV_ROUND_UP(max_response_size, SMB2_MAX_BUFFER_SIZE));
|
req->sync_hdr.CreditCharge =
|
||||||
|
cpu_to_le16(DIV_ROUND_UP(max(indatalen, max_response_size),
|
||||||
|
SMB2_MAX_BUFFER_SIZE));
|
||||||
if (is_fsctl)
|
if (is_fsctl)
|
||||||
req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL);
|
req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL);
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue