Lines Matching +full:tcon +full:- +full:channel
1 // SPDX-License-Identifier: LGPL-2.1
13 /* SMB2 PDU handling routines here - except for leftovers (eg session setup) */
73 int smb3_encryption_required(const struct cifs_tcon *tcon) in smb3_encryption_required() argument
75 if (!tcon || !tcon->ses) in smb3_encryption_required()
77 if ((tcon->ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) || in smb3_encryption_required()
78 (tcon->share_flags & SHI1005_FLAGS_ENCRYPT_DATA)) in smb3_encryption_required()
80 if (tcon->seal && in smb3_encryption_required()
81 (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in smb3_encryption_required()
88 const struct cifs_tcon *tcon, in smb2_hdr_assemble() argument
91 shdr->ProtocolId = SMB2_PROTO_NUMBER; in smb2_hdr_assemble()
92 shdr->StructureSize = cpu_to_le16(64); in smb2_hdr_assemble()
93 shdr->Command = smb2_cmd; in smb2_hdr_assemble()
95 spin_lock(&server->req_lock); in smb2_hdr_assemble()
97 if (server->credits >= server->max_credits) in smb2_hdr_assemble()
98 shdr->CreditRequest = cpu_to_le16(0); in smb2_hdr_assemble()
100 shdr->CreditRequest = cpu_to_le16( in smb2_hdr_assemble()
101 min_t(int, server->max_credits - in smb2_hdr_assemble()
102 server->credits, 10)); in smb2_hdr_assemble()
103 spin_unlock(&server->req_lock); in smb2_hdr_assemble()
105 shdr->CreditRequest = cpu_to_le16(2); in smb2_hdr_assemble()
107 shdr->Id.SyncId.ProcessId = cpu_to_le32((__u16)current->tgid); in smb2_hdr_assemble()
109 if (!tcon) in smb2_hdr_assemble()
113 /* See sections 2.2.4 and 3.2.4.1.5 of MS-SMB2 */ in smb2_hdr_assemble()
114 if (server && (server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_hdr_assemble()
115 shdr->CreditCharge = cpu_to_le16(1); in smb2_hdr_assemble()
118 shdr->Id.SyncId.TreeId = cpu_to_le32(tcon->tid); in smb2_hdr_assemble()
120 if (tcon->ses) in smb2_hdr_assemble()
121 shdr->SessionId = cpu_to_le64(tcon->ses->Suid); in smb2_hdr_assemble()
133 /* if (tcon->share_flags & SHI1005_FLAGS_DFS) in smb2_hdr_assemble()
134 shdr->Flags |= SMB2_FLAGS_DFS_OPERATIONS; */ in smb2_hdr_assemble()
136 if (server && server->sign && !smb3_encryption_required(tcon)) in smb2_hdr_assemble()
137 shdr->Flags |= SMB2_FLAGS_SIGNED; in smb2_hdr_assemble()
143 smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon, in smb2_reconnect() argument
152 * SMB2s NegProt, SessSetup, Logoff do not have tcon yet so in smb2_reconnect()
154 * for those three - in the calling routine. in smb2_reconnect()
156 if (tcon == NULL) in smb2_reconnect()
166 spin_lock(&tcon->tc_lock); in smb2_reconnect()
167 if (tcon->status == TID_EXITING) { in smb2_reconnect()
170 * (and ulogoff which does not have tcon) in smb2_reconnect()
176 spin_unlock(&tcon->tc_lock); in smb2_reconnect()
179 return -ENODEV; in smb2_reconnect()
182 spin_unlock(&tcon->tc_lock); in smb2_reconnect()
183 if ((!tcon->ses) || (tcon->ses->ses_status == SES_EXITING) || in smb2_reconnect()
184 (!tcon->ses->server) || !server) in smb2_reconnect()
185 return -EIO; in smb2_reconnect()
187 ses = tcon->ses; in smb2_reconnect()
188 retries = server->nr_targets; in smb2_reconnect()
192 * reconnect -- should be greater than cifs socket timeout which is 7 in smb2_reconnect()
195 while (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
208 return -EAGAIN; in smb2_reconnect()
211 rc = wait_event_interruptible_timeout(server->response_q, in smb2_reconnect()
212 (server->tcpStatus != CifsNeedReconnect), in smb2_reconnect()
217 return -ERESTARTSYS; in smb2_reconnect()
221 spin_lock(&server->srv_lock); in smb2_reconnect()
222 if (server->tcpStatus != CifsNeedReconnect) { in smb2_reconnect()
223 spin_unlock(&server->srv_lock); in smb2_reconnect()
226 spin_unlock(&server->srv_lock); in smb2_reconnect()
228 if (retries && --retries) in smb2_reconnect()
234 * back on-line in smb2_reconnect()
236 if (!tcon->retry) { in smb2_reconnect()
238 return -EHOSTDOWN; in smb2_reconnect()
240 retries = server->nr_targets; in smb2_reconnect()
243 spin_lock(&ses->chan_lock); in smb2_reconnect()
244 if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) { in smb2_reconnect()
245 spin_unlock(&ses->chan_lock); in smb2_reconnect()
248 spin_unlock(&ses->chan_lock); in smb2_reconnect()
249 cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d", in smb2_reconnect()
250 tcon->ses->chans_need_reconnect, in smb2_reconnect()
251 tcon->need_reconnect); in smb2_reconnect()
260 spin_lock(&server->srv_lock); in smb2_reconnect()
261 if (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
262 spin_unlock(&server->srv_lock); in smb2_reconnect()
263 rc = -EHOSTDOWN; in smb2_reconnect()
266 spin_unlock(&server->srv_lock); in smb2_reconnect()
272 spin_lock(&ses->chan_lock); in smb2_reconnect()
274 spin_unlock(&ses->chan_lock); in smb2_reconnect()
277 if (tcon->need_reconnect) in smb2_reconnect()
282 spin_unlock(&ses->chan_lock); in smb2_reconnect()
284 mutex_lock(&ses->session_mutex); in smb2_reconnect()
288 if ((rc == -EACCES) && !tcon->retry) { in smb2_reconnect()
289 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
290 rc = -EHOSTDOWN; in smb2_reconnect()
293 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
297 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
300 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
303 mutex_lock(&ses->session_mutex); in smb2_reconnect()
304 if (!tcon->need_reconnect) { in smb2_reconnect()
305 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
308 cifs_mark_open_files_invalid(tcon); in smb2_reconnect()
309 if (tcon->use_persistent) in smb2_reconnect()
310 tcon->need_reopen_files = true; in smb2_reconnect()
312 rc = cifs_tree_connect(0, tcon, nls_codepage); in smb2_reconnect()
313 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
315 cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc); in smb2_reconnect()
317 /* If sess reconnected but tcon didn't, something strange ... */ in smb2_reconnect()
318 pr_warn_once("reconnect tcon failed rc = %d\n", rc); in smb2_reconnect()
323 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in smb2_reconnect()
345 rc = -EAGAIN; in smb2_reconnect()
353 fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon, in fill_small_buf() argument
368 smb2_hdr_assemble(&spdu->hdr, smb2_command, tcon, server); in fill_small_buf()
369 spdu->StructureSize2 = cpu_to_le16(parmsize); in fill_small_buf()
379 static int __smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon, in __smb2_plain_req_init() argument
390 return -ENOMEM; in __smb2_plain_req_init()
393 fill_small_buf(smb2_command, tcon, server, in __smb2_plain_req_init()
397 if (tcon != NULL) { in __smb2_plain_req_init()
399 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]); in __smb2_plain_req_init()
400 cifs_stats_inc(&tcon->num_smbs_sent); in __smb2_plain_req_init()
406 static int smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon, in smb2_plain_req_init() argument
412 rc = smb2_reconnect(smb2_command, tcon, server); in smb2_plain_req_init()
416 return __smb2_plain_req_init(smb2_command, tcon, server, request_buf, in smb2_plain_req_init()
420 static int smb2_ioctl_req_init(u32 opcode, struct cifs_tcon *tcon, in smb2_ioctl_req_init() argument
426 return __smb2_plain_req_init(SMB2_IOCTL, tcon, server, in smb2_ioctl_req_init()
429 return smb2_plain_req_init(SMB2_IOCTL, tcon, server, in smb2_ioctl_req_init()
433 /* For explanation of negotiate contexts see MS-SMB2 section 2.2.3.1 */
438 pneg_ctxt->ContextType = SMB2_PREAUTH_INTEGRITY_CAPABILITIES; in build_preauth_ctxt()
439 pneg_ctxt->DataLength = cpu_to_le16(38); in build_preauth_ctxt()
440 pneg_ctxt->HashAlgorithmCount = cpu_to_le16(1); in build_preauth_ctxt()
441 pneg_ctxt->SaltLength = cpu_to_le16(SMB311_SALT_SIZE); in build_preauth_ctxt()
442 get_random_bytes(pneg_ctxt->Salt, SMB311_SALT_SIZE); in build_preauth_ctxt()
443 pneg_ctxt->HashAlgorithms = SMB2_PREAUTH_INTEGRITY_SHA512; in build_preauth_ctxt()
449 pneg_ctxt->ContextType = SMB2_COMPRESSION_CAPABILITIES; in build_compression_ctxt()
450 pneg_ctxt->DataLength = in build_compression_ctxt()
452 - sizeof(struct smb2_neg_context)); in build_compression_ctxt()
453 pneg_ctxt->CompressionAlgorithmCount = cpu_to_le16(3); in build_compression_ctxt()
454 pneg_ctxt->CompressionAlgorithms[0] = SMB3_COMPRESS_LZ77; in build_compression_ctxt()
455 pneg_ctxt->CompressionAlgorithms[1] = SMB3_COMPRESS_LZ77_HUFF; in build_compression_ctxt()
456 pneg_ctxt->CompressionAlgorithms[2] = SMB3_COMPRESS_LZNT1; in build_compression_ctxt()
465 pneg_ctxt->ContextType = SMB2_SIGNING_CAPABILITIES; in build_signing_ctxt()
469 pneg_ctxt->DataLength = cpu_to_le16(ALIGN(sizeof(struct smb2_signing_capabilities) - in build_signing_ctxt()
472 pneg_ctxt->SigningAlgorithmCount = cpu_to_le16(num_algs); in build_signing_ctxt()
473 pneg_ctxt->SigningAlgorithms[0] = cpu_to_le16(SIGNING_ALG_AES_CMAC); in build_signing_ctxt()
484 pneg_ctxt->ContextType = SMB2_ENCRYPTION_CAPABILITIES; in build_encrypt_ctxt()
486 pneg_ctxt->DataLength = cpu_to_le16(4); /* Cipher Count + 1 cipher */ in build_encrypt_ctxt()
487 pneg_ctxt->CipherCount = cpu_to_le16(1); in build_encrypt_ctxt()
488 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
490 pneg_ctxt->DataLength = cpu_to_le16(8); /* Cipher Count + 3 ciphers */ in build_encrypt_ctxt()
491 pneg_ctxt->CipherCount = cpu_to_le16(3); in build_encrypt_ctxt()
492 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
493 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
494 pneg_ctxt->Ciphers[2] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
496 pneg_ctxt->DataLength = cpu_to_le16(6); /* Cipher Count + 2 ciphers */ in build_encrypt_ctxt()
497 pneg_ctxt->CipherCount = cpu_to_le16(2); in build_encrypt_ctxt()
498 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
499 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
508 pneg_ctxt->ContextType = SMB2_NETNAME_NEGOTIATE_CONTEXT_ID; in build_netname_ctxt()
511 pneg_ctxt->DataLength = cpu_to_le16(2 * cifs_strtoUTF16(pneg_ctxt->NetName, hostname, 100, cp)); in build_netname_ctxt()
513 return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8); in build_netname_ctxt()
519 pneg_ctxt->ContextType = SMB2_POSIX_EXTENSIONS_AVAILABLE; in build_posix_ctxt()
520 pneg_ctxt->DataLength = cpu_to_le16(POSIX_CTXT_DATA_LEN); in build_posix_ctxt()
522 pneg_ctxt->Name[0] = 0x93; in build_posix_ctxt()
523 pneg_ctxt->Name[1] = 0xAD; in build_posix_ctxt()
524 pneg_ctxt->Name[2] = 0x25; in build_posix_ctxt()
525 pneg_ctxt->Name[3] = 0x50; in build_posix_ctxt()
526 pneg_ctxt->Name[4] = 0x9C; in build_posix_ctxt()
527 pneg_ctxt->Name[5] = 0xB4; in build_posix_ctxt()
528 pneg_ctxt->Name[6] = 0x11; in build_posix_ctxt()
529 pneg_ctxt->Name[7] = 0xE7; in build_posix_ctxt()
530 pneg_ctxt->Name[8] = 0xB4; in build_posix_ctxt()
531 pneg_ctxt->Name[9] = 0x23; in build_posix_ctxt()
532 pneg_ctxt->Name[10] = 0x83; in build_posix_ctxt()
533 pneg_ctxt->Name[11] = 0xDE; in build_posix_ctxt()
534 pneg_ctxt->Name[12] = 0x96; in build_posix_ctxt()
535 pneg_ctxt->Name[13] = 0x8B; in build_posix_ctxt()
536 pneg_ctxt->Name[14] = 0xCD; in build_posix_ctxt()
537 pneg_ctxt->Name[15] = 0x7C; in build_posix_ctxt()
561 req->NegotiateContextOffset = cpu_to_le32(*total_len); in assemble_neg_contexts()
575 * use the hostname field in the primary channel instead in assemble_neg_contexts()
578 server->primary_server->hostname : server->hostname; in assemble_neg_contexts()
593 if (server->compress_algorithm) { in assemble_neg_contexts()
611 req->NegotiateContextCount = cpu_to_le16(neg_context_count); in assemble_neg_contexts()
617 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_preauth_context()
619 /* If invalid preauth context warn but use what we requested, SHA-512 */ in decode_preauth_context()
623 } else if (len < MIN_PREAUTH_CTXT_DATA_LEN + le16_to_cpu(ctxt->SaltLength)) { in decode_preauth_context()
627 if (le16_to_cpu(ctxt->HashAlgorithmCount) != 1) in decode_preauth_context()
629 if (ctxt->HashAlgorithms != SMB2_PREAUTH_INTEGRITY_SHA512) in decode_preauth_context()
636 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_compress_ctx()
643 if (le16_to_cpu(ctxt->CompressionAlgorithmCount) != 1) { in decode_compress_ctx()
647 if (le16_to_cpu(ctxt->CompressionAlgorithms[0]) > 3) { in decode_compress_ctx()
651 server->compress_algorithm = ctxt->CompressionAlgorithms[0]; in decode_compress_ctx()
657 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_encrypt_ctx()
662 return -EINVAL; in decode_encrypt_ctx()
665 if (le16_to_cpu(ctxt->CipherCount) != 1) { in decode_encrypt_ctx()
667 return -EINVAL; in decode_encrypt_ctx()
669 cifs_dbg(FYI, "SMB311 cipher type:%d\n", le16_to_cpu(ctxt->Ciphers[0])); in decode_encrypt_ctx()
671 if (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM) { in decode_encrypt_ctx()
673 return -EOPNOTSUPP; in decode_encrypt_ctx()
675 } else if (ctxt->Ciphers[0] == 0) { in decode_encrypt_ctx()
685 server->cipher_type = 0; in decode_encrypt_ctx()
686 server->capabilities &= ~SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
689 } else if ((ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_CCM) && in decode_encrypt_ctx()
690 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_GCM) && in decode_encrypt_ctx()
691 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM)) { in decode_encrypt_ctx()
694 return -EINVAL; in decode_encrypt_ctx()
696 server->cipher_type = ctxt->Ciphers[0]; in decode_encrypt_ctx()
697 server->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
704 unsigned int len = le16_to_cpu(pctxt->DataLength); in decode_signing_ctx()
710 if (le16_to_cpu(pctxt->SigningAlgorithmCount) != 1) { in decode_signing_ctx()
714 if (le16_to_cpu(pctxt->SigningAlgorithms[0]) > 2) { in decode_signing_ctx()
719 server->signing_negotiated = true; in decode_signing_ctx()
720 server->signing_algorithm = le16_to_cpu(pctxt->SigningAlgorithms[0]); in decode_signing_ctx()
722 server->signing_algorithm); in decode_signing_ctx()
731 unsigned int offset = le32_to_cpu(rsp->NegotiateContextOffset); in smb311_decode_neg_context()
732 unsigned int ctxt_cnt = le16_to_cpu(rsp->NegotiateContextCount); in smb311_decode_neg_context()
739 return -EINVAL; in smb311_decode_neg_context()
742 len_of_ctxts = len_of_smb - offset; in smb311_decode_neg_context()
754 clen = le16_to_cpu(pctx->DataLength); in smb311_decode_neg_context()
758 if (pctx->ContextType == SMB2_PREAUTH_INTEGRITY_CAPABILITIES) in smb311_decode_neg_context()
761 else if (pctx->ContextType == SMB2_ENCRYPTION_CAPABILITIES) in smb311_decode_neg_context()
764 else if (pctx->ContextType == SMB2_COMPRESSION_CAPABILITIES) in smb311_decode_neg_context()
767 else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE) in smb311_decode_neg_context()
768 server->posix_ext_supported = true; in smb311_decode_neg_context()
769 else if (pctx->ContextType == SMB2_SIGNING_CAPABILITIES) in smb311_decode_neg_context()
774 le16_to_cpu(pctx->ContextType)); in smb311_decode_neg_context()
781 len_of_ctxts -= clen; in smb311_decode_neg_context()
796 buf->ccontext.DataOffset = in create_posix_buf()
798 buf->ccontext.DataLength = cpu_to_le32(4); in create_posix_buf()
799 buf->ccontext.NameOffset = in create_posix_buf()
801 buf->ccontext.NameLength = cpu_to_le16(16); in create_posix_buf()
804 buf->Name[0] = 0x93; in create_posix_buf()
805 buf->Name[1] = 0xAD; in create_posix_buf()
806 buf->Name[2] = 0x25; in create_posix_buf()
807 buf->Name[3] = 0x50; in create_posix_buf()
808 buf->Name[4] = 0x9C; in create_posix_buf()
809 buf->Name[5] = 0xB4; in create_posix_buf()
810 buf->Name[6] = 0x11; in create_posix_buf()
811 buf->Name[7] = 0xE7; in create_posix_buf()
812 buf->Name[8] = 0xB4; in create_posix_buf()
813 buf->Name[9] = 0x23; in create_posix_buf()
814 buf->Name[10] = 0x83; in create_posix_buf()
815 buf->Name[11] = 0xDE; in create_posix_buf()
816 buf->Name[12] = 0x96; in create_posix_buf()
817 buf->Name[13] = 0x8B; in create_posix_buf()
818 buf->Name[14] = 0xCD; in create_posix_buf()
819 buf->Name[15] = 0x7C; in create_posix_buf()
820 buf->Mode = cpu_to_le32(mode); in create_posix_buf()
835 return -ENOMEM; in add_posix_context()
837 if (!req->CreateContextsOffset) in add_posix_context()
838 req->CreateContextsOffset = cpu_to_le32( in add_posix_context()
840 iov[num - 1].iov_len); in add_posix_context()
841 le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_posix)); in add_posix_context()
883 return -EIO; in SMB2_negotiate()
891 req->hdr.SessionId = 0; in SMB2_negotiate()
893 memset(server->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
894 memset(ses->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
896 if (strcmp(server->vals->version_string, in SMB2_negotiate()
898 req->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
899 req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
900 req->Dialects[2] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
901 req->DialectCount = cpu_to_le16(3); in SMB2_negotiate()
903 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
905 req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in SMB2_negotiate()
906 req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
907 req->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
908 req->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
909 req->DialectCount = cpu_to_le16(4); in SMB2_negotiate()
913 req->Dialects[0] = cpu_to_le16(server->vals->protocol_id); in SMB2_negotiate()
914 req->DialectCount = cpu_to_le16(1); in SMB2_negotiate()
919 if (ses->sign) in SMB2_negotiate()
920 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_REQUIRED); in SMB2_negotiate()
922 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_ENABLED); in SMB2_negotiate()
924 req->SecurityMode = 0; in SMB2_negotiate()
926 req->Capabilities = cpu_to_le32(server->vals->req_capabilities); in SMB2_negotiate()
927 if (ses->chan_max > 1) in SMB2_negotiate()
928 req->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in SMB2_negotiate()
931 if (server->vals->protocol_id == SMB20_PROT_ID) in SMB2_negotiate()
932 memset(req->ClientGUID, 0, SMB2_CLIENT_GUID_SIZE); in SMB2_negotiate()
934 memcpy(req->ClientGUID, server->client_guid, in SMB2_negotiate()
936 if ((server->vals->protocol_id == SMB311_PROT_ID) || in SMB2_negotiate()
937 (strcmp(server->vals->version_string, in SMB2_negotiate()
939 (strcmp(server->vals->version_string, in SMB2_negotiate()
955 * No tcon so can't do in SMB2_negotiate()
956 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_negotiate()
958 if (rc == -EOPNOTSUPP) { in SMB2_negotiate()
964 rc = -EIO; in SMB2_negotiate()
965 if (strcmp(server->vals->version_string, in SMB2_negotiate()
967 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
971 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
975 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
977 server->ops = &smb311_operations; in SMB2_negotiate()
978 server->vals = &smb311_values; in SMB2_negotiate()
980 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
982 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
986 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
988 server->ops = &smb21_operations; in SMB2_negotiate()
989 server->vals = &smb21_values; in SMB2_negotiate()
990 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
991 server->ops = &smb311_operations; in SMB2_negotiate()
992 server->vals = &smb311_values; in SMB2_negotiate()
994 } else if (le16_to_cpu(rsp->DialectRevision) != in SMB2_negotiate()
995 server->vals->protocol_id) { in SMB2_negotiate()
998 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
1002 cifs_dbg(FYI, "mode 0x%x\n", rsp->SecurityMode); in SMB2_negotiate()
1004 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) in SMB2_negotiate()
1006 else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) in SMB2_negotiate()
1008 else if (rsp->DialectRevision == cpu_to_le16(SMB30_PROT_ID)) in SMB2_negotiate()
1010 else if (rsp->DialectRevision == cpu_to_le16(SMB302_PROT_ID)) in SMB2_negotiate()
1012 else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) in SMB2_negotiate()
1016 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
1021 server->dialect = le16_to_cpu(rsp->DialectRevision); in SMB2_negotiate()
1028 memcpy(server->preauth_sha_hash, ses->preauth_sha_hash, in SMB2_negotiate()
1032 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in SMB2_negotiate()
1034 server->maxBuf = min_t(unsigned int, le32_to_cpu(rsp->MaxTransactSize), in SMB2_negotiate()
1036 server->max_read = le32_to_cpu(rsp->MaxReadSize); in SMB2_negotiate()
1037 server->max_write = le32_to_cpu(rsp->MaxWriteSize); in SMB2_negotiate()
1038 server->sec_mode = le16_to_cpu(rsp->SecurityMode); in SMB2_negotiate()
1039 if ((server->sec_mode & SMB2_SEC_MODE_FLAGS_ALL) != server->sec_mode) in SMB2_negotiate()
1041 server->sec_mode); in SMB2_negotiate()
1042 server->capabilities = le32_to_cpu(rsp->Capabilities); in SMB2_negotiate()
1044 server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; in SMB2_negotiate()
1050 if (server->dialect == SMB30_PROT_ID && (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_negotiate()
1051 server->cipher_type = SMB2_ENCRYPTION_AES128_CCM; in SMB2_negotiate()
1056 * See MS-SMB2 section 2.2.4: if no blob, client picks default which in SMB2_negotiate()
1058 * ses->sectype = RawNTLMSSP; in SMB2_negotiate()
1064 server->sec_ntlmssp = true; in SMB2_negotiate()
1067 rc = cifs_enable_signing(server, ses->sign); in SMB2_negotiate()
1075 rc = -EIO; in SMB2_negotiate()
1078 if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1079 if (rsp->NegotiateContextCount) in SMB2_negotiate()
1090 int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) in smb3_validate_negotiate() argument
1097 struct TCP_Server_Info *server = tcon->ses->server; in smb3_validate_negotiate()
1102 if (server->dialect == SMB311_PROT_ID) in smb3_validate_negotiate()
1112 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) in smb3_validate_negotiate()
1115 if (tcon->ses->user_name == NULL) { in smb3_validate_negotiate()
1120 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL) in smb3_validate_negotiate()
1125 return -ENOMEM; in smb3_validate_negotiate()
1127 pneg_inbuf->Capabilities = in smb3_validate_negotiate()
1128 cpu_to_le32(server->vals->req_capabilities); in smb3_validate_negotiate()
1129 if (tcon->ses->chan_max > 1) in smb3_validate_negotiate()
1130 pneg_inbuf->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in smb3_validate_negotiate()
1132 memcpy(pneg_inbuf->Guid, server->client_guid, in smb3_validate_negotiate()
1135 if (tcon->ses->sign) in smb3_validate_negotiate()
1136 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1139 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1142 pneg_inbuf->SecurityMode = 0; in smb3_validate_negotiate()
1145 if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1147 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1148 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1149 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1150 pneg_inbuf->DialectCount = cpu_to_le16(3); in smb3_validate_negotiate()
1152 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1153 (sizeof(pneg_inbuf->Dialects[0])); in smb3_validate_negotiate()
1154 } else if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1156 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in smb3_validate_negotiate()
1157 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1158 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1159 pneg_inbuf->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1160 pneg_inbuf->DialectCount = cpu_to_le16(4); in smb3_validate_negotiate()
1165 pneg_inbuf->Dialects[0] = in smb3_validate_negotiate()
1166 cpu_to_le16(server->vals->protocol_id); in smb3_validate_negotiate()
1167 pneg_inbuf->DialectCount = cpu_to_le16(1); in smb3_validate_negotiate()
1169 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1170 sizeof(pneg_inbuf->Dialects[0]) * 3; in smb3_validate_negotiate()
1173 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in smb3_validate_negotiate()
1177 if (rc == -EOPNOTSUPP) { in smb3_validate_negotiate()
1188 rc = -EIO; in smb3_validate_negotiate()
1192 rc = -EIO; in smb3_validate_negotiate()
1203 if (pneg_rsp->Dialect != cpu_to_le16(server->dialect)) in smb3_validate_negotiate()
1206 if (pneg_rsp->SecurityMode != cpu_to_le16(server->sec_mode)) in smb3_validate_negotiate()
1211 if ((le32_to_cpu(pneg_rsp->Capabilities) | SMB2_NT_FIND | in smb3_validate_negotiate()
1212 SMB2_LARGE_FILES) != server->capabilities) in smb3_validate_negotiate()
1221 cifs_tcon_dbg(VFS, "protocol revalidation - security settings mismatch\n"); in smb3_validate_negotiate()
1239 if (server->sec_ntlmssp && in smb2_select_sectype()
1242 if ((server->sec_kerberos || server->sec_mskerberos) && in smb2_select_sectype()
1275 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_alloc_buffer()
1276 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_alloc_buffer()
1287 spin_lock(&ses->chan_lock); in SMB2_sess_alloc_buffer()
1289 spin_unlock(&ses->chan_lock); in SMB2_sess_alloc_buffer()
1292 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_sess_alloc_buffer()
1293 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_sess_alloc_buffer()
1294 req->PreviousSessionId = 0; in SMB2_sess_alloc_buffer()
1295 req->Flags = SMB2_SESSION_REQ_FLAG_BINDING; in SMB2_sess_alloc_buffer()
1296 cifs_dbg(FYI, "Binding to sess id: %llx\n", ses->Suid); in SMB2_sess_alloc_buffer()
1299 req->hdr.SessionId = 0; in SMB2_sess_alloc_buffer()
1304 req->PreviousSessionId = cpu_to_le64(sess_data->previous_session); in SMB2_sess_alloc_buffer()
1305 req->Flags = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1307 sess_data->previous_session); in SMB2_sess_alloc_buffer()
1311 req->hdr.CreditRequest = cpu_to_le16(130); in SMB2_sess_alloc_buffer()
1314 if (server->sign) in SMB2_sess_alloc_buffer()
1315 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED; in SMB2_sess_alloc_buffer()
1317 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED; in SMB2_sess_alloc_buffer()
1319 req->SecurityMode = 0; in SMB2_sess_alloc_buffer()
1322 req->Capabilities = cpu_to_le32(SMB2_GLOBAL_CAP_DFS); in SMB2_sess_alloc_buffer()
1324 req->Capabilities = 0; in SMB2_sess_alloc_buffer()
1327 req->Channel = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1329 sess_data->iov[0].iov_base = (char *)req; in SMB2_sess_alloc_buffer()
1331 sess_data->iov[0].iov_len = total_len - 1; in SMB2_sess_alloc_buffer()
1336 sess_data->buf0_type = CIFS_SMALL_BUFFER; in SMB2_sess_alloc_buffer()
1344 struct kvec *iov = sess_data->iov; in SMB2_sess_free_buffer()
1347 if (sess_data->buf0_type != CIFS_NO_BUFFER && iov[0].iov_base) in SMB2_sess_free_buffer()
1350 free_rsp_buf(sess_data->buf0_type, iov[0].iov_base); in SMB2_sess_free_buffer()
1351 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_free_buffer()
1359 struct smb2_sess_setup_req *req = sess_data->iov[0].iov_base; in SMB2_sess_sendreceive()
1363 req->SecurityBufferOffset = in SMB2_sess_sendreceive()
1364 cpu_to_le16(sizeof(struct smb2_sess_setup_req) - 1 /* pad */); in SMB2_sess_sendreceive()
1365 req->SecurityBufferLength = cpu_to_le16(sess_data->iov[1].iov_len); in SMB2_sess_sendreceive()
1368 rqst.rq_iov = sess_data->iov; in SMB2_sess_sendreceive()
1372 rc = cifs_send_recv(sess_data->xid, sess_data->ses, in SMB2_sess_sendreceive()
1373 sess_data->server, in SMB2_sess_sendreceive()
1375 &sess_data->buf0_type, in SMB2_sess_sendreceive()
1377 cifs_small_buf_release(sess_data->iov[0].iov_base); in SMB2_sess_sendreceive()
1378 memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec)); in SMB2_sess_sendreceive()
1387 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_establish_session()
1388 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_establish_session()
1391 if (server->ops->generate_signingkey) { in SMB2_sess_establish_session()
1392 rc = server->ops->generate_signingkey(ses, server); in SMB2_sess_establish_session()
1400 if (!server->session_estab) { in SMB2_sess_establish_session()
1401 server->sequence_number = 0x2; in SMB2_sess_establish_session()
1402 server->session_estab = true; in SMB2_sess_establish_session()
1415 struct cifs_ses *ses = sess_data->ses; in SMB2_auth_kerberos()
1416 struct TCP_Server_Info *server = sess_data->server; in SMB2_auth_kerberos()
1429 if (rc == -ENOKEY) in SMB2_auth_kerberos()
1435 msg = spnego_key->payload.data[0]; in SMB2_auth_kerberos()
1440 if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { in SMB2_auth_kerberos()
1442 CIFS_SPNEGO_UPCALL_VERSION, msg->version); in SMB2_auth_kerberos()
1443 rc = -EKEYREJECTED; in SMB2_auth_kerberos()
1447 spin_lock(&ses->chan_lock); in SMB2_auth_kerberos()
1449 spin_unlock(&ses->chan_lock); in SMB2_auth_kerberos()
1453 ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len, in SMB2_auth_kerberos()
1455 if (!ses->auth_key.response) { in SMB2_auth_kerberos()
1457 msg->sesskey_len); in SMB2_auth_kerberos()
1458 rc = -ENOMEM; in SMB2_auth_kerberos()
1461 ses->auth_key.len = msg->sesskey_len; in SMB2_auth_kerberos()
1464 sess_data->iov[1].iov_base = msg->data + msg->sesskey_len; in SMB2_auth_kerberos()
1465 sess_data->iov[1].iov_len = msg->secblob_len; in SMB2_auth_kerberos()
1471 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_auth_kerberos()
1474 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_auth_kerberos()
1475 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_auth_kerberos()
1483 kfree_sensitive(ses->auth_key.response); in SMB2_auth_kerberos()
1485 sess_data->result = rc; in SMB2_auth_kerberos()
1486 sess_data->func = NULL; in SMB2_auth_kerberos()
1494 sess_data->result = -EOPNOTSUPP; in SMB2_auth_kerberos()
1495 sess_data->func = NULL; in SMB2_auth_kerberos()
1506 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_negotiate()
1507 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_auth_rawntlmssp_negotiate()
1518 ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL); in SMB2_sess_auth_rawntlmssp_negotiate()
1519 if (!ses->ntlmssp) { in SMB2_sess_auth_rawntlmssp_negotiate()
1520 rc = -ENOMEM; in SMB2_sess_auth_rawntlmssp_negotiate()
1523 ses->ntlmssp->sesskey_per_smbsess = true; in SMB2_sess_auth_rawntlmssp_negotiate()
1531 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_negotiate()
1538 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_negotiate()
1541 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_negotiate()
1542 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_negotiate()
1545 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_negotiate()
1548 if (sess_data->buf0_type != CIFS_NO_BUFFER && in SMB2_sess_auth_rawntlmssp_negotiate()
1549 rsp->hdr.Status == STATUS_MORE_PROCESSING_REQUIRED) in SMB2_sess_auth_rawntlmssp_negotiate()
1556 le16_to_cpu(rsp->SecurityBufferOffset)) { in SMB2_sess_auth_rawntlmssp_negotiate()
1558 le16_to_cpu(rsp->SecurityBufferOffset)); in SMB2_sess_auth_rawntlmssp_negotiate()
1559 rc = -EIO; in SMB2_sess_auth_rawntlmssp_negotiate()
1562 rc = decode_ntlmssp_challenge(rsp->Buffer, in SMB2_sess_auth_rawntlmssp_negotiate()
1563 le16_to_cpu(rsp->SecurityBufferLength), ses); in SMB2_sess_auth_rawntlmssp_negotiate()
1569 spin_lock(&ses->chan_lock); in SMB2_sess_auth_rawntlmssp_negotiate()
1571 spin_unlock(&ses->chan_lock); in SMB2_sess_auth_rawntlmssp_negotiate()
1575 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_sess_auth_rawntlmssp_negotiate()
1576 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_negotiate()
1583 sess_data->result = 0; in SMB2_sess_auth_rawntlmssp_negotiate()
1584 sess_data->func = SMB2_sess_auth_rawntlmssp_authenticate; in SMB2_sess_auth_rawntlmssp_negotiate()
1588 kfree_sensitive(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_negotiate()
1589 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1590 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_negotiate()
1591 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1598 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_authenticate()
1599 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_auth_rawntlmssp_authenticate()
1611 req = (struct smb2_sess_setup_req *) sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1612 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1616 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_authenticate()
1625 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_authenticate()
1628 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_authenticate()
1629 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_authenticate()
1635 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1637 spin_lock(&ses->chan_lock); in SMB2_sess_auth_rawntlmssp_authenticate()
1639 spin_unlock(&ses->chan_lock); in SMB2_sess_auth_rawntlmssp_authenticate()
1643 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_sess_auth_rawntlmssp_authenticate()
1644 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_authenticate()
1649 if (ses->server->dialect < SMB30_PROT_ID) { in SMB2_sess_auth_rawntlmssp_authenticate()
1655 cifs_dbg(VFS, "Session Id %*ph\n", (int)sizeof(ses->Suid), in SMB2_sess_auth_rawntlmssp_authenticate()
1656 &ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1658 SMB2_NTLMV2_SESSKEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1660 SMB3_SIGN_KEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1666 kfree_sensitive(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_authenticate()
1667 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1668 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_authenticate()
1669 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1676 struct cifs_ses *ses = sess_data->ses; in SMB2_select_sec()
1677 struct TCP_Server_Info *server = sess_data->server; in SMB2_select_sec()
1679 type = smb2_select_sectype(server, ses->sectype); in SMB2_select_sec()
1683 return -EINVAL; in SMB2_select_sec()
1688 sess_data->func = SMB2_auth_kerberos; in SMB2_select_sec()
1691 sess_data->func = SMB2_sess_auth_rawntlmssp_negotiate; in SMB2_select_sec()
1695 return -EOPNOTSUPP; in SMB2_select_sec()
1713 return -EIO; in SMB2_sess_setup()
1718 return -ENOMEM; in SMB2_sess_setup()
1720 sess_data->xid = xid; in SMB2_sess_setup()
1721 sess_data->ses = ses; in SMB2_sess_setup()
1722 sess_data->server = server; in SMB2_sess_setup()
1723 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_setup()
1724 sess_data->nls_cp = (struct nls_table *) nls_cp; in SMB2_sess_setup()
1725 sess_data->previous_session = ses->Suid; in SMB2_sess_setup()
1734 memcpy(ses->preauth_sha_hash, server->preauth_sha_hash, in SMB2_sess_setup()
1737 while (sess_data->func) in SMB2_sess_setup()
1738 sess_data->func(sess_data); in SMB2_sess_setup()
1740 if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign)) in SMB2_sess_setup()
1742 rc = sess_data->result; in SMB2_sess_setup()
1763 if (ses && (ses->server)) in SMB2_logoff()
1764 server = ses->server; in SMB2_logoff()
1766 return -EIO; in SMB2_logoff()
1769 spin_lock(&ses->chan_lock); in SMB2_logoff()
1771 spin_unlock(&ses->chan_lock); in SMB2_logoff()
1774 spin_unlock(&ses->chan_lock); in SMB2_logoff()
1776 rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, ses->server, in SMB2_logoff()
1781 /* since no tcon, smb2_init can not do this, so do here */ in SMB2_logoff()
1782 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_logoff()
1784 if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) in SMB2_logoff()
1786 else if (server->sign) in SMB2_logoff()
1787 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_logoff()
1798 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_logoff()
1802 * No tcon so can't do in SMB2_logoff()
1803 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_logoff()
1810 static inline void cifs_stats_fail_inc(struct cifs_tcon *tcon, uint16_t code) in cifs_stats_fail_inc() argument
1812 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_failed[code]); in cifs_stats_fail_inc()
1818 static inline void init_copy_chunk_defaults(struct cifs_tcon *tcon) in init_copy_chunk_defaults() argument
1820 tcon->max_chunks = 256; in init_copy_chunk_defaults()
1821 tcon->max_bytes_chunk = 1048576; in init_copy_chunk_defaults()
1822 tcon->max_bytes_copy = 16777216; in init_copy_chunk_defaults()
1827 struct cifs_tcon *tcon, const struct nls_table *cp) in SMB2_tcon() argument
1842 /* always use master channel */ in SMB2_tcon()
1843 server = ses->server; in SMB2_tcon()
1845 cifs_dbg(FYI, "TCON\n"); in SMB2_tcon()
1848 return -EIO; in SMB2_tcon()
1852 return -ENOMEM; in SMB2_tcon()
1858 return -EINVAL; in SMB2_tcon()
1862 tcon->tid = 0; in SMB2_tcon()
1863 atomic_set(&tcon->num_remote_opens, 0); in SMB2_tcon()
1864 rc = smb2_plain_req_init(SMB2_TREE_CONNECT, tcon, server, in SMB2_tcon()
1871 if (smb3_encryption_required(tcon)) in SMB2_tcon()
1876 iov[0].iov_len = total_len - 1; in SMB2_tcon()
1879 req->PathOffset = cpu_to_le16(sizeof(struct smb2_tree_connect_req) in SMB2_tcon()
1880 - 1 /* pad */); in SMB2_tcon()
1881 req->PathLength = cpu_to_le16(unc_path_len - 2); in SMB2_tcon()
1886 * 3.11 tcon req must be signed if not encrypted. See MS-SMB2 3.2.4.1.1 in SMB2_tcon()
1887 * unless it is guest or anonymous user. See MS-SMB2 3.2.5.3.1 in SMB2_tcon()
1890 if ((server->dialect == SMB311_PROT_ID) && in SMB2_tcon()
1891 !smb3_encryption_required(tcon) && in SMB2_tcon()
1892 !(ses->session_flags & in SMB2_tcon()
1894 ((ses->user_name != NULL) || (ses->sectype == Kerberos))) in SMB2_tcon()
1895 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_tcon()
1902 req->hdr.CreditRequest = cpu_to_le16(64); in SMB2_tcon()
1908 trace_smb3_tcon(xid, tcon->tid, ses->Suid, tree, rc); in SMB2_tcon()
1910 cifs_stats_fail_inc(tcon, SMB2_TREE_CONNECT_HE); in SMB2_tcon()
1911 tcon->need_reconnect = true; in SMB2_tcon()
1915 switch (rsp->ShareType) { in SMB2_tcon()
1920 tcon->pipe = true; in SMB2_tcon()
1924 tcon->print = true; in SMB2_tcon()
1928 cifs_server_dbg(VFS, "unknown share type %d\n", rsp->ShareType); in SMB2_tcon()
1929 rc = -EOPNOTSUPP; in SMB2_tcon()
1933 tcon->share_flags = le32_to_cpu(rsp->ShareFlags); in SMB2_tcon()
1934 tcon->capabilities = rsp->Capabilities; /* we keep caps little endian */ in SMB2_tcon()
1935 tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess); in SMB2_tcon()
1936 tcon->tid = le32_to_cpu(rsp->hdr.Id.SyncId.TreeId); in SMB2_tcon()
1937 strscpy(tcon->tree_name, tree, sizeof(tcon->tree_name)); in SMB2_tcon()
1939 if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) && in SMB2_tcon()
1940 ((tcon->share_flags & SHI1005_FLAGS_DFS) == 0)) in SMB2_tcon()
1943 if (tcon->seal && in SMB2_tcon()
1944 !(server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_tcon()
1947 init_copy_chunk_defaults(tcon); in SMB2_tcon()
1948 if (server->ops->validate_negotiate) in SMB2_tcon()
1949 rc = server->ops->validate_negotiate(xid, tcon); in SMB2_tcon()
1957 if (rsp && rsp->hdr.Status == STATUS_BAD_NETWORK_NAME) in SMB2_tcon()
1963 SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon) in SMB2_tdis() argument
1968 struct cifs_ses *ses = tcon->ses; in SMB2_tdis()
1977 if (!ses || !(ses->server)) in SMB2_tdis()
1978 return -EIO; in SMB2_tdis()
1980 trace_smb3_tdis_enter(xid, tcon->tid, ses->Suid, tcon->tree_name); in SMB2_tdis()
1981 spin_lock(&ses->chan_lock); in SMB2_tdis()
1982 if ((tcon->need_reconnect) || in SMB2_tdis()
1983 (CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses))) { in SMB2_tdis()
1984 spin_unlock(&ses->chan_lock); in SMB2_tdis()
1987 spin_unlock(&ses->chan_lock); in SMB2_tdis()
1989 invalidate_all_cached_dirs(tcon); in SMB2_tdis()
1991 rc = smb2_plain_req_init(SMB2_TREE_DISCONNECT, tcon, ses->server, in SMB2_tdis()
1997 if (smb3_encryption_required(tcon)) in SMB2_tdis()
2009 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_tdis()
2013 cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE); in SMB2_tdis()
2014 trace_smb3_tdis_err(xid, tcon->tid, ses->Suid, rc); in SMB2_tdis()
2016 trace_smb3_tdis_done(xid, tcon->tid, ses->Suid); in SMB2_tdis()
2031 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_buf()
2033 buf->ccontext.DataLength = cpu_to_le32(16); in create_durable_buf()
2034 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_buf()
2036 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_buf()
2038 buf->Name[0] = 'D'; in create_durable_buf()
2039 buf->Name[1] = 'H'; in create_durable_buf()
2040 buf->Name[2] = 'n'; in create_durable_buf()
2041 buf->Name[3] = 'Q'; in create_durable_buf()
2054 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
2056 buf->ccontext.DataLength = cpu_to_le32(16); in create_reconnect_durable_buf()
2057 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
2059 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_buf()
2060 buf->Data.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_buf()
2061 buf->Data.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_buf()
2063 buf->Name[0] = 'D'; in create_reconnect_durable_buf()
2064 buf->Name[1] = 'H'; in create_reconnect_durable_buf()
2065 buf->Name[2] = 'n'; in create_reconnect_durable_buf()
2066 buf->Name[3] = 'C'; in create_reconnect_durable_buf()
2076 pdisk_id->DiskFileId, pdisk_id->VolumeId); in parse_query_id_ctxt()
2077 buf->IndexNumber = pdisk_id->DiskFileId; in parse_query_id_ctxt()
2085 u8 *beg = (u8 *)cc + le16_to_cpu(cc->DataOffset); in parse_posix_ctxt()
2086 u8 *end = beg + le32_to_cpu(cc->DataLength); in parse_posix_ctxt()
2091 posix->nlink = le32_to_cpu(*(__le32 *)(beg + 0)); in parse_posix_ctxt()
2092 posix->reparse_tag = le32_to_cpu(*(__le32 *)(beg + 4)); in parse_posix_ctxt()
2093 posix->mode = le32_to_cpu(*(__le32 *)(beg + 8)); in parse_posix_ctxt()
2101 memcpy(&posix->owner, sid, sid_len); in parse_posix_ctxt()
2109 memcpy(&posix->group, sid, sid_len); in parse_posix_ctxt()
2112 posix->nlink, posix->mode, posix->reparse_tag); in parse_posix_ctxt()
2134 data_offset = (char *)rsp + le32_to_cpu(rsp->CreateContextsOffset); in smb2_parse_contexts()
2135 remaining = le32_to_cpu(rsp->CreateContextsLength); in smb2_parse_contexts()
2140 buf->IndexNumber = 0; in smb2_parse_contexts()
2143 name = le16_to_cpu(cc->NameOffset) + (char *)cc; in smb2_parse_contexts()
2144 if (le16_to_cpu(cc->NameLength) == 4 && in smb2_parse_contexts()
2146 *oplock = server->ops->parse_lease_buf(cc, epoch, in smb2_parse_contexts()
2148 else if (buf && (le16_to_cpu(cc->NameLength) == 4) && in smb2_parse_contexts()
2151 else if ((le16_to_cpu(cc->NameLength) == 16)) { in smb2_parse_contexts()
2158 le16_to_cpu(cc->NameLength)); in smb2_parse_contexts()
2162 next = le32_to_cpu(cc->Next); in smb2_parse_contexts()
2165 remaining -= next; in smb2_parse_contexts()
2169 if (rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE) in smb2_parse_contexts()
2170 *oplock = rsp->OplockLevel; in smb2_parse_contexts()
2182 iov[num].iov_base = server->ops->create_lease_buf(lease_key, *oplock); in add_lease_context()
2184 return -ENOMEM; in add_lease_context()
2185 iov[num].iov_len = server->vals->create_lease_size; in add_lease_context()
2186 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE; in add_lease_context()
2187 if (!req->CreateContextsOffset) in add_lease_context()
2188 req->CreateContextsOffset = cpu_to_le32( in add_lease_context()
2190 iov[num - 1].iov_len); in add_lease_context()
2191 le32_add_cpu(&req->CreateContextsLength, in add_lease_context()
2192 server->vals->create_lease_size); in add_lease_context()
2200 struct cifs_fid *pfid = oparms->fid; in create_durable_v2_buf()
2207 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2209 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct durable_context_v2)); in create_durable_v2_buf()
2210 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2212 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_v2_buf()
2221 buf->dcontext.Timeout = cpu_to_le32(oparms->tcon->handle_timeout); in create_durable_v2_buf()
2222 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_durable_v2_buf()
2223 generate_random_uuid(buf->dcontext.CreateGuid); in create_durable_v2_buf()
2224 memcpy(pfid->create_guid, buf->dcontext.CreateGuid, 16); in create_durable_v2_buf()
2227 buf->Name[0] = 'D'; in create_durable_v2_buf()
2228 buf->Name[1] = 'H'; in create_durable_v2_buf()
2229 buf->Name[2] = '2'; in create_durable_v2_buf()
2230 buf->Name[3] = 'Q'; in create_durable_v2_buf()
2244 buf->ccontext.DataOffset = in create_reconnect_durable_v2_buf()
2247 buf->ccontext.DataLength = in create_reconnect_durable_v2_buf()
2249 buf->ccontext.NameOffset = in create_reconnect_durable_v2_buf()
2252 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_v2_buf()
2254 buf->dcontext.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_v2_buf()
2255 buf->dcontext.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_v2_buf()
2256 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_reconnect_durable_v2_buf()
2257 memcpy(buf->dcontext.CreateGuid, fid->create_guid, 16); in create_reconnect_durable_v2_buf()
2260 buf->Name[0] = 'D'; in create_reconnect_durable_v2_buf()
2261 buf->Name[1] = 'H'; in create_reconnect_durable_v2_buf()
2262 buf->Name[2] = '2'; in create_reconnect_durable_v2_buf()
2263 buf->Name[3] = 'C'; in create_reconnect_durable_v2_buf()
2276 return -ENOMEM; in add_durable_v2_context()
2278 if (!req->CreateContextsOffset) in add_durable_v2_context()
2279 req->CreateContextsOffset = in add_durable_v2_context()
2282 le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_durable_v2)); in add_durable_v2_context()
2295 oparms->reconnect = false; in add_durable_reconnect_v2_context()
2297 iov[num].iov_base = create_reconnect_durable_v2_buf(oparms->fid); in add_durable_reconnect_v2_context()
2299 return -ENOMEM; in add_durable_reconnect_v2_context()
2301 if (!req->CreateContextsOffset) in add_durable_reconnect_v2_context()
2302 req->CreateContextsOffset = in add_durable_reconnect_v2_context()
2305 le32_add_cpu(&req->CreateContextsLength, in add_durable_reconnect_v2_context()
2319 if (oparms->reconnect) in add_durable_context()
2326 if (oparms->reconnect) { in add_durable_context()
2327 iov[num].iov_base = create_reconnect_durable_buf(oparms->fid); in add_durable_context()
2329 oparms->reconnect = false; in add_durable_context()
2333 return -ENOMEM; in add_durable_context()
2335 if (!req->CreateContextsOffset) in add_durable_context()
2336 req->CreateContextsOffset = in add_durable_context()
2339 le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_durable)); in add_durable_context()
2344 /* See MS-SMB2 2.2.13.2.7 */
2354 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_twarp_buf()
2356 buf->ccontext.DataLength = cpu_to_le32(8); in create_twarp_buf()
2357 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_twarp_buf()
2359 buf->ccontext.NameLength = cpu_to_le16(4); in create_twarp_buf()
2361 buf->Name[0] = 'T'; in create_twarp_buf()
2362 buf->Name[1] = 'W'; in create_twarp_buf()
2363 buf->Name[2] = 'r'; in create_twarp_buf()
2364 buf->Name[3] = 'p'; in create_twarp_buf()
2365 buf->Timestamp = cpu_to_le64(timewarp); in create_twarp_buf()
2369 /* See MS-SMB2 2.2.13.2.7 */
2378 return -ENOMEM; in add_twarp_context()
2380 if (!req->CreateContextsOffset) in add_twarp_context()
2381 req->CreateContextsOffset = cpu_to_le32( in add_twarp_context()
2383 iov[num - 1].iov_len); in add_twarp_context()
2384 le32_add_cpu(&req->CreateContextsLength, sizeof(struct crt_twarp_ctxt)); in add_twarp_context()
2389 /* See See http://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */
2394 /* Populate the user ownership fields S-1-5-88-1 */ in setup_owner_group_sids()
2395 sids->owner.Revision = 1; in setup_owner_group_sids()
2396 sids->owner.NumAuth = 3; in setup_owner_group_sids()
2397 sids->owner.Authority[5] = 5; in setup_owner_group_sids()
2398 sids->owner.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2399 sids->owner.SubAuthorities[1] = cpu_to_le32(1); in setup_owner_group_sids()
2400 sids->owner.SubAuthorities[2] = cpu_to_le32(current_fsuid().val); in setup_owner_group_sids()
2402 /* Populate the group ownership fields S-1-5-88-2 */ in setup_owner_group_sids()
2403 sids->group.Revision = 1; in setup_owner_group_sids()
2404 sids->group.NumAuth = 3; in setup_owner_group_sids()
2405 sids->group.Authority[5] = 5; in setup_owner_group_sids()
2406 sids->group.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2407 sids->group.SubAuthorities[1] = cpu_to_le32(2); in setup_owner_group_sids()
2408 sids->group.SubAuthorities[2] = cpu_to_le32(current_fsgid().val); in setup_owner_group_sids()
2410 …cifs_dbg(FYI, "owner S-1-5-88-1-%d, group S-1-5-88-2-%d\n", current_fsuid().val, current_fsgid().v… in setup_owner_group_sids()
2413 /* See MS-SMB2 2.2.13.2.2 and MS-DTYP 2.4.6 */
2438 owner_offset = ptr - (__u8 *)&buf->sd; in create_sd_buf()
2439 buf->sd.OffsetOwner = cpu_to_le32(owner_offset); in create_sd_buf()
2441 buf->sd.OffsetGroup = cpu_to_le32(group_offset); in create_sd_buf()
2446 buf->sd.OffsetOwner = 0; in create_sd_buf()
2447 buf->sd.OffsetGroup = 0; in create_sd_buf()
2450 buf->ccontext.DataOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, sd)); in create_sd_buf()
2451 buf->ccontext.NameOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, Name)); in create_sd_buf()
2452 buf->ccontext.NameLength = cpu_to_le16(4); in create_sd_buf()
2454 buf->Name[0] = 'S'; in create_sd_buf()
2455 buf->Name[1] = 'e'; in create_sd_buf()
2456 buf->Name[2] = 'c'; in create_sd_buf()
2457 buf->Name[3] = 'D'; in create_sd_buf()
2458 buf->sd.Revision = 1; /* Must be one see MS-DTYP 2.4.6 */ in create_sd_buf()
2464 buf->sd.Control = cpu_to_le16(ACL_CONTROL_SR | ACL_CONTROL_DP); in create_sd_buf()
2467 buf->sd.OffsetDacl = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2492 acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */ in create_sd_buf()
2498 buf->ccontext.DataLength = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2499 *len = round_up((unsigned int)(ptr - (__u8 *)buf), 8); in create_sd_buf()
2513 return -ENOMEM; in add_sd_context()
2515 if (!req->CreateContextsOffset) in add_sd_context()
2516 req->CreateContextsOffset = cpu_to_le32( in add_sd_context()
2518 iov[num - 1].iov_len); in add_sd_context()
2519 le32_add_cpu(&req->CreateContextsLength, len); in add_sd_context()
2533 buf->ccontext.DataOffset = cpu_to_le16(0); in create_query_id_buf()
2534 buf->ccontext.DataLength = cpu_to_le32(0); in create_query_id_buf()
2535 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_query_id_buf()
2537 buf->ccontext.NameLength = cpu_to_le16(4); in create_query_id_buf()
2539 buf->Name[0] = 'Q'; in create_query_id_buf()
2540 buf->Name[1] = 'F'; in create_query_id_buf()
2541 buf->Name[2] = 'i'; in create_query_id_buf()
2542 buf->Name[3] = 'd'; in create_query_id_buf()
2546 /* See MS-SMB2 2.2.13.2.9 */
2555 return -ENOMEM; in add_query_id_context()
2557 if (!req->CreateContextsOffset) in add_query_id_context()
2558 req->CreateContextsOffset = cpu_to_le32( in add_query_id_context()
2560 iov[num - 1].iov_len); in add_query_id_context()
2561 le32_add_cpu(&req->CreateContextsLength, sizeof(struct crt_query_id_ctxt)); in add_query_id_context()
2579 return -EINVAL; in alloc_path_with_tree_prefix()
2582 treename_len -= 2; in alloc_path_with_tree_prefix()
2590 * final path needs to be 8-byte aligned as specified in in alloc_path_with_tree_prefix()
2591 * MS-SMB2 2.2.13 SMB2 CREATE Request. in alloc_path_with_tree_prefix()
2596 return -ENOMEM; in alloc_path_with_tree_prefix()
2613 umode_t mode, struct cifs_tcon *tcon, in smb311_posix_mkdir() argument
2620 struct cifs_ses *ses = tcon->ses; in smb311_posix_mkdir()
2641 return -ENOMEM; in smb311_posix_mkdir()
2644 rc = -EIO; in smb311_posix_mkdir()
2649 rc = smb2_plain_req_init(SMB2_CREATE, tcon, server, in smb311_posix_mkdir()
2655 if (smb3_encryption_required(tcon)) in smb311_posix_mkdir()
2658 req->ImpersonationLevel = IL_IMPERSONATION; in smb311_posix_mkdir()
2659 req->DesiredAccess = cpu_to_le32(FILE_WRITE_ATTRIBUTES); in smb311_posix_mkdir()
2661 req->FileAttributes = cpu_to_le32(file_attributes); in smb311_posix_mkdir()
2662 req->ShareAccess = FILE_SHARE_ALL_LE; in smb311_posix_mkdir()
2663 req->CreateDisposition = cpu_to_le32(FILE_CREATE); in smb311_posix_mkdir()
2664 req->CreateOptions = cpu_to_le32(CREATE_NOT_FILE); in smb311_posix_mkdir()
2667 /* -1 since last byte is buf[0] which is sent below (path) */ in smb311_posix_mkdir()
2668 iov[0].iov_len = total_len - 1; in smb311_posix_mkdir()
2670 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in smb311_posix_mkdir()
2672 /* [MS-SMB2] 2.2.13 NameOffset: in smb311_posix_mkdir()
2680 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in smb311_posix_mkdir()
2683 req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in smb311_posix_mkdir()
2686 tcon->tree_name, utf16_path); in smb311_posix_mkdir()
2690 req->NameLength = cpu_to_le16(name_len * 2); in smb311_posix_mkdir()
2698 req->NameLength = cpu_to_le16(uni_path_len - 2); in smb311_posix_mkdir()
2703 rc = -ENOMEM; in smb311_posix_mkdir()
2717 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_NONE; in smb311_posix_mkdir()
2719 if (tcon->posix_extensions) { in smb311_posix_mkdir()
2724 pc_buf = iov[n_iov-1].iov_base; in smb311_posix_mkdir()
2733 trace_smb3_posix_mkdir_enter(xid, tcon->tid, ses->Suid, CREATE_NOT_FILE, in smb311_posix_mkdir()
2739 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE); in smb311_posix_mkdir()
2740 trace_smb3_posix_mkdir_err(xid, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2753 rc = -EIO; in smb311_posix_mkdir()
2758 trace_smb3_posix_mkdir_done(xid, rsp->PersistentFileId, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2761 SMB2_close(xid, tcon, rsp->PersistentFileId, rsp->VolatileFileId); in smb311_posix_mkdir()
2776 SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_open_init() argument
2786 struct kvec *iov = rqst->rq_iov; in SMB2_open_init()
2790 rc = smb2_plain_req_init(SMB2_CREATE, tcon, server, in SMB2_open_init()
2796 /* -1 since last byte is buf[0] which is sent below (path) */ in SMB2_open_init()
2797 iov[0].iov_len = total_len - 1; in SMB2_open_init()
2799 if (oparms->create_options & CREATE_OPTION_READONLY) in SMB2_open_init()
2801 if (oparms->create_options & CREATE_OPTION_SPECIAL) in SMB2_open_init()
2804 req->ImpersonationLevel = IL_IMPERSONATION; in SMB2_open_init()
2805 req->DesiredAccess = cpu_to_le32(oparms->desired_access); in SMB2_open_init()
2807 req->FileAttributes = cpu_to_le32(file_attributes); in SMB2_open_init()
2808 req->ShareAccess = FILE_SHARE_ALL_LE; in SMB2_open_init()
2810 req->CreateDisposition = cpu_to_le32(oparms->disposition); in SMB2_open_init()
2811 req->CreateOptions = cpu_to_le32(oparms->create_options & CREATE_OPTIONS_MASK); in SMB2_open_init()
2812 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in SMB2_open_init()
2814 /* [MS-SMB2] 2.2.13 NameOffset: in SMB2_open_init()
2822 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in SMB2_open_init()
2825 req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in SMB2_open_init()
2828 tcon->tree_name, path); in SMB2_open_init()
2831 req->NameLength = cpu_to_le16(name_len * 2); in SMB2_open_init()
2837 req->NameLength = cpu_to_le16(uni_path_len - 2); in SMB2_open_init()
2841 return -ENOMEM; in SMB2_open_init()
2851 if ((!server->oplocks) || (tcon->no_lease)) in SMB2_open_init()
2854 if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) || in SMB2_open_init()
2856 req->RequestedOplockLevel = *oplock; in SMB2_open_init()
2857 else if (!(server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) && in SMB2_open_init()
2858 (oparms->create_options & CREATE_NOT_FILE)) in SMB2_open_init()
2859 req->RequestedOplockLevel = *oplock; /* no srv lease support */ in SMB2_open_init()
2862 oparms->fid->lease_key, oplock); in SMB2_open_init()
2869 if (server->capabilities & SMB2_GLOBAL_CAP_LEASING) { in SMB2_open_init()
2871 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2872 ccontext->Next = in SMB2_open_init()
2873 cpu_to_le32(server->vals->create_lease_size); in SMB2_open_init()
2877 tcon->use_persistent); in SMB2_open_init()
2882 if (tcon->posix_extensions) { in SMB2_open_init()
2885 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2886 ccontext->Next = in SMB2_open_init()
2887 cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2890 rc = add_posix_context(iov, &n_iov, oparms->mode); in SMB2_open_init()
2895 if (tcon->snapshot_time) { in SMB2_open_init()
2899 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2900 ccontext->Next = in SMB2_open_init()
2901 cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2904 rc = add_twarp_context(iov, &n_iov, tcon->snapshot_time); in SMB2_open_init()
2909 if ((oparms->disposition != FILE_OPEN) && (oparms->cifs_sb)) { in SMB2_open_init()
2913 if ((oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) && in SMB2_open_init()
2914 (oparms->mode != ACL_NO_MODE)) in SMB2_open_init()
2918 oparms->mode = ACL_NO_MODE; in SMB2_open_init()
2921 if (oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL) in SMB2_open_init()
2929 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2930 ccontext->Next = cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2933 cifs_dbg(FYI, "add sd with mode 0x%x\n", oparms->mode); in SMB2_open_init()
2934 rc = add_sd_context(iov, &n_iov, oparms->mode, set_owner); in SMB2_open_init()
2942 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2943 ccontext->Next = cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2947 rqst->rq_nvec = n_iov; in SMB2_open_init()
2959 if (rqst && rqst->rq_iov) { in SMB2_open_free()
2960 cifs_small_buf_release(rqst->rq_iov[0].iov_base); in SMB2_open_free()
2961 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_open_free()
2962 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_open_free()
2963 kfree(rqst->rq_iov[i].iov_base); in SMB2_open_free()
2975 struct cifs_tcon *tcon = oparms->tcon; in SMB2_open() local
2976 struct cifs_ses *ses = tcon->ses; in SMB2_open()
2986 return -EIO; in SMB2_open()
2988 if (smb3_encryption_required(tcon)) in SMB2_open()
2996 rc = SMB2_open_init(tcon, server, in SMB2_open()
3001 trace_smb3_open_enter(xid, tcon->tid, tcon->ses->Suid, in SMB2_open()
3002 oparms->create_options, oparms->desired_access); in SMB2_open()
3010 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE); in SMB2_open()
3017 trace_smb3_open_err(xid, tcon->tid, ses->Suid, in SMB2_open()
3018 oparms->create_options, oparms->desired_access, rc); in SMB2_open()
3019 if (rc == -EREMCHG) { in SMB2_open()
3021 tcon->tree_name); in SMB2_open()
3022 tcon->need_reconnect = true; in SMB2_open()
3028 trace_smb3_open_done(xid, rsp->PersistentFileId, tcon->tid, ses->Suid, in SMB2_open()
3029 oparms->create_options, oparms->desired_access); in SMB2_open()
3031 atomic_inc(&tcon->num_remote_opens); in SMB2_open()
3032 oparms->fid->persistent_fid = rsp->PersistentFileId; in SMB2_open()
3033 oparms->fid->volatile_fid = rsp->VolatileFileId; in SMB2_open()
3034 oparms->fid->access = oparms->desired_access; in SMB2_open()
3036 oparms->fid->mid = le64_to_cpu(rsp->hdr.MessageId); in SMB2_open()
3040 buf->CreationTime = rsp->CreationTime; in SMB2_open()
3041 buf->LastAccessTime = rsp->LastAccessTime; in SMB2_open()
3042 buf->LastWriteTime = rsp->LastWriteTime; in SMB2_open()
3043 buf->ChangeTime = rsp->ChangeTime; in SMB2_open()
3044 buf->AllocationSize = rsp->AllocationSize; in SMB2_open()
3045 buf->EndOfFile = rsp->EndofFile; in SMB2_open()
3046 buf->Attributes = rsp->FileAttributes; in SMB2_open()
3047 buf->NumberOfLinks = cpu_to_le32(1); in SMB2_open()
3048 buf->DeletePending = 0; in SMB2_open()
3052 smb2_parse_contexts(server, rsp, &oparms->fid->epoch, in SMB2_open()
3053 oparms->fid->lease_key, oplock, buf, posix); in SMB2_open()
3061 SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_ioctl_init() argument
3068 struct kvec *iov = rqst->rq_iov; in SMB2_ioctl_init()
3073 rc = smb2_ioctl_req_init(opcode, tcon, server, in SMB2_ioctl_init()
3086 return -ENOMEM; in SMB2_ioctl_init()
3090 req->CtlCode = cpu_to_le32(opcode); in SMB2_ioctl_init()
3091 req->PersistentFileId = persistent_fid; in SMB2_ioctl_init()
3092 req->VolatileFileId = volatile_fid; in SMB2_ioctl_init()
3104 req->InputCount = cpu_to_le32(indatalen); in SMB2_ioctl_init()
3106 req->InputOffset = in SMB2_ioctl_init()
3108 rqst->rq_nvec = 2; in SMB2_ioctl_init()
3109 iov[0].iov_len = total_len - 1; in SMB2_ioctl_init()
3113 rqst->rq_nvec = 1; in SMB2_ioctl_init()
3117 req->OutputOffset = 0; in SMB2_ioctl_init()
3118 req->OutputCount = 0; /* MBZ */ in SMB2_ioctl_init()
3135 req->MaxOutputResponse = cpu_to_le32(max_response_size); in SMB2_ioctl_init()
3136 req->hdr.CreditCharge = in SMB2_ioctl_init()
3140 req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL); in SMB2_ioctl_init()
3142 /* validate negotiate request must be signed - see MS-SMB2 3.2.5.5 */ in SMB2_ioctl_init()
3144 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_ioctl_init()
3153 if (rqst && rqst->rq_iov) { in SMB2_ioctl_free()
3154 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_ioctl_free()
3155 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_ioctl_free()
3156 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_ioctl_free()
3157 kfree(rqst->rq_iov[i].iov_base); in SMB2_ioctl_free()
3166 SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_ioctl() argument
3190 if (!tcon) in SMB2_ioctl()
3191 return -EIO; in SMB2_ioctl()
3193 ses = tcon->ses; in SMB2_ioctl()
3195 return -EIO; in SMB2_ioctl()
3199 return -EIO; in SMB2_ioctl()
3201 if (smb3_encryption_required(tcon)) in SMB2_ioctl()
3209 rc = SMB2_ioctl_init(tcon, server, in SMB2_ioctl()
3221 trace_smb3_fsctl_err(xid, persistent_fid, tcon->tid, in SMB2_ioctl()
3222 ses->Suid, 0, opcode, rc); in SMB2_ioctl()
3224 if ((rc != 0) && (rc != -EINVAL) && (rc != -E2BIG)) { in SMB2_ioctl()
3225 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3227 } else if (rc == -EINVAL) { in SMB2_ioctl()
3230 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3233 } else if (rc == -E2BIG) { in SMB2_ioctl()
3235 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3250 rc = -EIO; in SMB2_ioctl()
3254 *plen = le32_to_cpu(rsp->OutputCount); in SMB2_ioctl()
3262 rc = -EIO; in SMB2_ioctl()
3266 if (rsp_iov.iov_len - *plen < le32_to_cpu(rsp->OutputOffset)) { in SMB2_ioctl()
3268 le32_to_cpu(rsp->OutputOffset)); in SMB2_ioctl()
3270 rc = -EIO; in SMB2_ioctl()
3274 *out_data = kmemdup((char *)rsp + le32_to_cpu(rsp->OutputOffset), in SMB2_ioctl()
3277 rc = -ENOMEM; in SMB2_ioctl()
3292 SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_compression() argument
3302 rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_compression()
3314 SMB2_close_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_close_init() argument
3319 struct kvec *iov = rqst->rq_iov; in SMB2_close_init()
3323 rc = smb2_plain_req_init(SMB2_CLOSE, tcon, server, in SMB2_close_init()
3328 req->PersistentFileId = persistent_fid; in SMB2_close_init()
3329 req->VolatileFileId = volatile_fid; in SMB2_close_init()
3331 req->Flags = SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB; in SMB2_close_init()
3333 req->Flags = 0; in SMB2_close_init()
3343 if (rqst && rqst->rq_iov) in SMB2_close_free()
3344 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_close_free()
3348 __SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, in __SMB2_close() argument
3354 struct cifs_ses *ses = tcon->ses; in __SMB2_close()
3366 return -EIO; in __SMB2_close()
3368 if (smb3_encryption_required(tcon)) in __SMB2_close()
3380 trace_smb3_close_enter(xid, persistent_fid, tcon->tid, ses->Suid); in __SMB2_close()
3381 rc = SMB2_close_init(tcon, server, in __SMB2_close()
3392 cifs_stats_fail_inc(tcon, SMB2_CLOSE_HE); in __SMB2_close()
3393 trace_smb3_close_err(xid, persistent_fid, tcon->tid, ses->Suid, in __SMB2_close()
3397 trace_smb3_close_done(xid, persistent_fid, tcon->tid, in __SMB2_close()
3398 ses->Suid); in __SMB2_close()
3404 memcpy(pbuf, (char *)&rsp->CreationTime, sizeof(*pbuf) - 4); in __SMB2_close()
3407 atomic_dec(&tcon->num_remote_opens); in __SMB2_close()
3416 tmp_rc = smb2_handle_cancelled_close(tcon, persistent_fid, in __SMB2_close()
3426 SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_close() argument
3429 return __SMB2_close(xid, tcon, persistent_fid, volatile_fid, NULL); in SMB2_close()
3436 unsigned int smb_len = iov->iov_len; in smb2_validate_iov()
3437 char *end_of_smb = smb_len + (char *)iov->iov_base; in smb2_validate_iov()
3438 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_iov()
3445 return -EINVAL; in smb2_validate_iov()
3452 return -EINVAL; in smb2_validate_iov()
3457 return -EINVAL; in smb2_validate_iov()
3472 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_and_copy_iov()
3476 return -EINVAL; in smb2_validate_and_copy_iov()
3488 SMB2_query_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_query_info_init() argument
3495 struct kvec *iov = rqst->rq_iov; in SMB2_query_info_init()
3499 rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server, in SMB2_query_info_init()
3504 req->InfoType = info_type; in SMB2_query_info_init()
3505 req->FileInfoClass = info_class; in SMB2_query_info_init()
3506 req->PersistentFileId = persistent_fid; in SMB2_query_info_init()
3507 req->VolatileFileId = volatile_fid; in SMB2_query_info_init()
3508 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_query_info_init()
3510 req->OutputBufferLength = cpu_to_le32(output_len); in SMB2_query_info_init()
3512 req->InputBufferLength = cpu_to_le32(input_len); in SMB2_query_info_init()
3514 req->InputBufferOffset = cpu_to_le16(total_len - 1); in SMB2_query_info_init()
3515 memcpy(req->Buffer, input, input_len); in SMB2_query_info_init()
3520 iov[0].iov_len = total_len - 1 + input_len; in SMB2_query_info_init()
3527 if (rqst && rqst->rq_iov) in SMB2_query_info_free()
3528 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_info_free()
3532 query_info(const unsigned int xid, struct cifs_tcon *tcon, in query_info() argument
3543 struct cifs_ses *ses = tcon->ses; in query_info()
3551 return -EIO; in query_info()
3554 return -EIO; in query_info()
3556 if (smb3_encryption_required(tcon)) in query_info()
3564 rc = SMB2_query_info_init(tcon, server, in query_info()
3571 trace_smb3_query_info_enter(xid, persistent_fid, tcon->tid, in query_info()
3572 ses->Suid, info_class, (__u32)info_type); in query_info()
3579 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in query_info()
3580 trace_smb3_query_info_err(xid, persistent_fid, tcon->tid, in query_info()
3581 ses->Suid, info_class, (__u32)info_type, rc); in query_info()
3585 trace_smb3_query_info_done(xid, persistent_fid, tcon->tid, in query_info()
3586 ses->Suid, info_class, (__u32)info_type); in query_info()
3589 *dlen = le32_to_cpu(rsp->OutputBufferLength); in query_info()
3597 rc = -ENOMEM; in query_info()
3604 rc = smb2_validate_and_copy_iov(le16_to_cpu(rsp->OutputBufferOffset), in query_info()
3605 le32_to_cpu(rsp->OutputBufferLength), in query_info()
3619 int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_info() argument
3622 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_query_info()
3632 SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon,
3639 return query_info(xid, tcon, persistent_fid, volatile_fid,
3647 SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_acl() argument
3655 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_query_acl()
3661 SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_get_srv_num() argument
3664 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_get_srv_num()
3673 * See MS-SMB2 2.2.35 and 2.2.36
3678 struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_notify_init() argument
3683 struct kvec *iov = rqst->rq_iov; in SMB2_notify_init()
3687 rc = smb2_plain_req_init(SMB2_CHANGE_NOTIFY, tcon, server, in SMB2_notify_init()
3692 req->PersistentFileId = persistent_fid; in SMB2_notify_init()
3693 req->VolatileFileId = volatile_fid; in SMB2_notify_init()
3694 /* See note 354 of MS-SMB2, 64K max */ in SMB2_notify_init()
3695 req->OutputBufferLength = in SMB2_notify_init()
3696 cpu_to_le32(SMB2_MAX_BUFFER_SIZE - MAX_SMB2_HDR_SIZE); in SMB2_notify_init()
3697 req->CompletionFilter = cpu_to_le32(completion_filter); in SMB2_notify_init()
3699 req->Flags = cpu_to_le16(SMB2_WATCH_TREE); in SMB2_notify_init()
3701 req->Flags = 0; in SMB2_notify_init()
3710 SMB2_change_notify(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_change_notify() argument
3715 struct cifs_ses *ses = tcon->ses; in SMB2_change_notify()
3727 return -EIO; in SMB2_change_notify()
3729 if (smb3_encryption_required(tcon)) in SMB2_change_notify()
3740 rc = SMB2_notify_init(xid, &rqst, tcon, server, in SMB2_change_notify()
3746 trace_smb3_notify_enter(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
3752 cifs_stats_fail_inc(tcon, SMB2_CHANGE_NOTIFY_HE); in SMB2_change_notify()
3753 trace_smb3_notify_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
3756 trace_smb3_notify_done(xid, persistent_fid, tcon->tid, in SMB2_change_notify()
3757 ses->Suid, (u8)watch_tree, completion_filter); in SMB2_change_notify()
3765 smb2_validate_iov(le16_to_cpu(smb_rsp->OutputBufferOffset), in SMB2_change_notify()
3766 le32_to_cpu(smb_rsp->OutputBufferLength), &rsp_iov, in SMB2_change_notify()
3769 *out_data = kmemdup((char *)smb_rsp + le16_to_cpu(smb_rsp->OutputBufferOffset), in SMB2_change_notify()
3770 le32_to_cpu(smb_rsp->OutputBufferLength), GFP_KERNEL); in SMB2_change_notify()
3772 rc = -ENOMEM; in SMB2_change_notify()
3775 *plen = le32_to_cpu(smb_rsp->OutputBufferLength); in SMB2_change_notify()
3788 * This is a no-op for now. We're not really interested in the reply, but
3789 * rather in the fact that the server sent one and that server->lstrp
3797 struct TCP_Server_Info *server = mid->callback_data; in smb2_echo_callback()
3798 struct smb2_echo_rsp *rsp = (struct smb2_echo_rsp *)mid->resp_buf; in smb2_echo_callback()
3801 if (mid->mid_state == MID_RESPONSE_RECEIVED in smb2_echo_callback()
3802 || mid->mid_state == MID_RESPONSE_MALFORMED) { in smb2_echo_callback()
3803 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_echo_callback()
3804 credits.instance = server->reconnect_instance; in smb2_echo_callback()
3817 struct cifs_tcon *tcon, *tcon2; in smb2_reconnect_server() local
3824 /* If server is a channel, select the primary channel */ in smb2_reconnect_server()
3825 pserver = CIFS_SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_reconnect_server()
3827 /* Prevent simultaneous reconnects that can corrupt tcon->rlist list */ in smb2_reconnect_server()
3828 mutex_lock(&pserver->reconnect_mutex); in smb2_reconnect_server()
3835 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_reconnect_server()
3839 list_for_each_entry(tcon, &ses->tcon_list, tcon_list) { in smb2_reconnect_server()
3840 if (tcon->need_reconnect || tcon->need_reopen_files) { in smb2_reconnect_server()
3841 tcon->tc_count++; in smb2_reconnect_server()
3842 list_add_tail(&tcon->rlist, &tmp_list); in smb2_reconnect_server()
3850 if (ses->tcon_ipc && ses->tcon_ipc->need_reconnect) { in smb2_reconnect_server()
3851 list_add_tail(&ses->tcon_ipc->rlist, &tmp_list); in smb2_reconnect_server()
3853 ses->ses_count++; in smb2_reconnect_server()
3856 * handle the case where channel needs to reconnect in smb2_reconnect_server()
3857 * binding session, but tcon is healthy (some other channel in smb2_reconnect_server()
3860 spin_lock(&ses->chan_lock); in smb2_reconnect_server()
3862 list_add_tail(&ses->rlist, &tmp_ses_list); in smb2_reconnect_server()
3864 ses->ses_count++; in smb2_reconnect_server()
3866 spin_unlock(&ses->chan_lock); in smb2_reconnect_server()
3873 server->srv_count++; in smb2_reconnect_server()
3877 list_for_each_entry_safe(tcon, tcon2, &tmp_list, rlist) { in smb2_reconnect_server()
3878 rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon, server); in smb2_reconnect_server()
3880 cifs_reopen_persistent_handles(tcon); in smb2_reconnect_server()
3883 list_del_init(&tcon->rlist); in smb2_reconnect_server()
3884 if (tcon->ipc) in smb2_reconnect_server()
3885 cifs_put_smb_ses(tcon->ses); in smb2_reconnect_server()
3887 cifs_put_tcon(tcon); in smb2_reconnect_server()
3893 /* allocate a dummy tcon struct used for reconnect */ in smb2_reconnect_server()
3894 tcon = kzalloc(sizeof(struct cifs_tcon), GFP_KERNEL); in smb2_reconnect_server()
3895 if (!tcon) { in smb2_reconnect_server()
3898 list_del_init(&ses->rlist); in smb2_reconnect_server()
3904 tcon->status = TID_GOOD; in smb2_reconnect_server()
3905 tcon->retry = false; in smb2_reconnect_server()
3906 tcon->need_reconnect = false; in smb2_reconnect_server()
3910 tcon->ses = ses; in smb2_reconnect_server()
3911 rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon, server); in smb2_reconnect_server()
3914 list_del_init(&ses->rlist); in smb2_reconnect_server()
3917 kfree(tcon); in smb2_reconnect_server()
3922 queue_delayed_work(cifsiod_wq, &server->reconnect, 2 * HZ); in smb2_reconnect_server()
3923 mutex_unlock(&pserver->reconnect_mutex); in smb2_reconnect_server()
3940 cifs_dbg(FYI, "In echo request for conn_id %lld\n", server->conn_id); in SMB2_echo()
3942 spin_lock(&server->srv_lock); in SMB2_echo()
3943 if (server->ops->need_neg && in SMB2_echo()
3944 server->ops->need_neg(server)) { in SMB2_echo()
3945 spin_unlock(&server->srv_lock); in SMB2_echo()
3947 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in SMB2_echo()
3950 spin_unlock(&server->srv_lock); in SMB2_echo()
3957 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_echo()
3974 if (rqst && rqst->rq_iov) in SMB2_flush_free()
3975 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_flush_free()
3980 struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_flush_init() argument
3984 struct kvec *iov = rqst->rq_iov; in SMB2_flush_init()
3988 rc = smb2_plain_req_init(SMB2_FLUSH, tcon, server, in SMB2_flush_init()
3993 req->PersistentFileId = persistent_fid; in SMB2_flush_init()
3994 req->VolatileFileId = volatile_fid; in SMB2_flush_init()
4003 SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_flush() argument
4006 struct cifs_ses *ses = tcon->ses; in SMB2_flush()
4016 if (!ses || !(ses->server)) in SMB2_flush()
4017 return -EIO; in SMB2_flush()
4019 if (smb3_encryption_required(tcon)) in SMB2_flush()
4027 rc = SMB2_flush_init(xid, &rqst, tcon, server, in SMB2_flush()
4032 trace_smb3_flush_enter(xid, persistent_fid, tcon->tid, ses->Suid); in SMB2_flush()
4037 cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE); in SMB2_flush()
4038 trace_smb3_flush_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_flush()
4041 trace_smb3_flush_done(xid, persistent_fid, tcon->tid, in SMB2_flush()
4042 ses->Suid); in SMB2_flush()
4059 int rc = -EACCES; in smb2_new_read_req()
4062 struct TCP_Server_Info *server = io_parms->server; in smb2_new_read_req()
4064 rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server, in smb2_new_read_req()
4070 return -ECONNABORTED; in smb2_new_read_req()
4072 shdr = &req->hdr; in smb2_new_read_req()
4073 shdr->Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in smb2_new_read_req()
4075 req->PersistentFileId = io_parms->persistent_fid; in smb2_new_read_req()
4076 req->VolatileFileId = io_parms->volatile_fid; in smb2_new_read_req()
4077 req->ReadChannelInfoOffset = 0; /* reserved */ in smb2_new_read_req()
4078 req->ReadChannelInfoLength = 0; /* reserved */ in smb2_new_read_req()
4079 req->Channel = 0; /* reserved */ in smb2_new_read_req()
4080 req->MinimumCount = 0; in smb2_new_read_req()
4081 req->Length = cpu_to_le32(io_parms->length); in smb2_new_read_req()
4082 req->Offset = cpu_to_le64(io_parms->offset); in smb2_new_read_req()
4085 io_parms->persistent_fid, in smb2_new_read_req()
4086 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in smb2_new_read_req()
4087 io_parms->offset, io_parms->length); in smb2_new_read_req()
4093 if (server->rdma && rdata && !server->sign && in smb2_new_read_req()
4094 rdata->bytes >= server->smbd_conn->rdma_readwrite_threshold) { in smb2_new_read_req()
4097 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_new_read_req()
4099 rdata->mr = smbd_register_mr( in smb2_new_read_req()
4100 server->smbd_conn, rdata->pages, in smb2_new_read_req()
4101 rdata->nr_pages, rdata->page_offset, in smb2_new_read_req()
4102 rdata->tailsz, true, need_invalidate); in smb2_new_read_req()
4103 if (!rdata->mr) in smb2_new_read_req()
4104 return -EAGAIN; in smb2_new_read_req()
4106 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_new_read_req()
4108 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_new_read_req()
4109 req->ReadChannelInfoOffset = in smb2_new_read_req()
4111 req->ReadChannelInfoLength = in smb2_new_read_req()
4113 v1 = (struct smbd_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_new_read_req()
4114 v1->offset = cpu_to_le64(rdata->mr->mr->iova); in smb2_new_read_req()
4115 v1->token = cpu_to_le32(rdata->mr->mr->rkey); in smb2_new_read_req()
4116 v1->length = cpu_to_le32(rdata->mr->mr->length); in smb2_new_read_req()
4118 *total_len += sizeof(*v1) - 1; in smb2_new_read_req()
4123 /* next 8-byte aligned request */ in smb2_new_read_req()
4125 shdr->NextCommand = cpu_to_le32(*total_len); in smb2_new_read_req()
4127 shdr->NextCommand = 0; in smb2_new_read_req()
4129 shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; in smb2_new_read_req()
4134 shdr->SessionId = cpu_to_le64(0xFFFFFFFFFFFFFFFF); in smb2_new_read_req()
4135 shdr->Id.SyncId.TreeId = cpu_to_le32(0xFFFFFFFF); in smb2_new_read_req()
4136 req->PersistentFileId = (u64)-1; in smb2_new_read_req()
4137 req->VolatileFileId = (u64)-1; in smb2_new_read_req()
4140 if (remaining_bytes > io_parms->length) in smb2_new_read_req()
4141 req->RemainingBytes = cpu_to_le32(remaining_bytes); in smb2_new_read_req()
4143 req->RemainingBytes = 0; in smb2_new_read_req()
4152 struct cifs_readdata *rdata = mid->callback_data; in smb2_readv_callback()
4153 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in smb2_readv_callback() local
4154 struct TCP_Server_Info *server = rdata->server; in smb2_readv_callback()
4156 (struct smb2_hdr *)rdata->iov[0].iov_base; in smb2_readv_callback()
4158 struct smb_rqst rqst = { .rq_iov = &rdata->iov[1], in smb2_readv_callback()
4160 .rq_pages = rdata->pages, in smb2_readv_callback()
4161 .rq_offset = rdata->page_offset, in smb2_readv_callback()
4162 .rq_npages = rdata->nr_pages, in smb2_readv_callback()
4163 .rq_pagesz = rdata->pagesz, in smb2_readv_callback()
4164 .rq_tailsz = rdata->tailsz }; in smb2_readv_callback()
4166 WARN_ONCE(rdata->server != mid->server, in smb2_readv_callback()
4168 rdata->server, mid->server); in smb2_readv_callback()
4171 __func__, mid->mid, mid->mid_state, rdata->result, in smb2_readv_callback()
4172 rdata->bytes); in smb2_readv_callback()
4174 switch (mid->mid_state) { in smb2_readv_callback()
4176 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
4177 credits.instance = server->reconnect_instance; in smb2_readv_callback()
4179 if (server->sign && !mid->decrypted) { in smb2_readv_callback()
4188 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
4189 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
4193 rdata->result = -EAGAIN; in smb2_readv_callback()
4194 if (server->sign && rdata->got_bytes) in smb2_readv_callback()
4196 rdata->got_bytes = 0; in smb2_readv_callback()
4198 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
4199 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
4202 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
4203 credits.instance = server->reconnect_instance; in smb2_readv_callback()
4206 rdata->result = -EIO; in smb2_readv_callback()
4214 if (rdata->mr) { in smb2_readv_callback()
4215 smbd_deregister_mr(rdata->mr); in smb2_readv_callback()
4216 rdata->mr = NULL; in smb2_readv_callback()
4219 if (rdata->result && rdata->result != -ENODATA) { in smb2_readv_callback()
4220 cifs_stats_fail_inc(tcon, SMB2_READ_HE); in smb2_readv_callback()
4222 rdata->cfile->fid.persistent_fid, in smb2_readv_callback()
4223 tcon->tid, tcon->ses->Suid, rdata->offset, in smb2_readv_callback()
4224 rdata->bytes, rdata->result); in smb2_readv_callback()
4227 rdata->cfile->fid.persistent_fid, in smb2_readv_callback()
4228 tcon->tid, tcon->ses->Suid, in smb2_readv_callback()
4229 rdata->offset, rdata->got_bytes); in smb2_readv_callback()
4231 queue_work(cifsiod_wq, &rdata->work); in smb2_readv_callback()
4236 /* smb2_async_readv - send an async read, and set up mid to handle result */
4244 struct smb_rqst rqst = { .rq_iov = rdata->iov, in smb2_async_readv()
4247 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in smb2_async_readv() local
4251 __func__, rdata->offset, rdata->bytes); in smb2_async_readv()
4253 if (!rdata->server) in smb2_async_readv()
4254 rdata->server = cifs_pick_channel(tcon->ses); in smb2_async_readv()
4256 io_parms.tcon = tlink_tcon(rdata->cfile->tlink); in smb2_async_readv()
4257 io_parms.server = server = rdata->server; in smb2_async_readv()
4258 io_parms.offset = rdata->offset; in smb2_async_readv()
4259 io_parms.length = rdata->bytes; in smb2_async_readv()
4260 io_parms.persistent_fid = rdata->cfile->fid.persistent_fid; in smb2_async_readv()
4261 io_parms.volatile_fid = rdata->cfile->fid.volatile_fid; in smb2_async_readv()
4262 io_parms.pid = rdata->pid; in smb2_async_readv()
4269 if (smb3_encryption_required(io_parms.tcon)) in smb2_async_readv()
4272 rdata->iov[0].iov_base = buf; in smb2_async_readv()
4273 rdata->iov[0].iov_len = total_len; in smb2_async_readv()
4277 if (rdata->credits.value > 0) { in smb2_async_readv()
4278 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes, in smb2_async_readv()
4280 shdr->CreditRequest = cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 8); in smb2_async_readv()
4282 rc = adjust_credits(server, &rdata->credits, rdata->bytes); in smb2_async_readv()
4289 kref_get(&rdata->refcount); in smb2_async_readv()
4293 &rdata->credits); in smb2_async_readv()
4295 kref_put(&rdata->refcount, cifs_readdata_release); in smb2_async_readv()
4296 cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); in smb2_async_readv()
4298 io_parms.tcon->tid, in smb2_async_readv()
4299 io_parms.tcon->ses->Suid, in smb2_async_readv()
4320 struct cifs_ses *ses = io_parms->tcon->ses; in SMB2_read()
4322 if (!io_parms->server) in SMB2_read()
4323 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_read()
4330 if (smb3_encryption_required(io_parms->tcon)) in SMB2_read()
4340 rc = cifs_send_recv(xid, ses, io_parms->server, in SMB2_read()
4345 if (rc != -ENODATA) { in SMB2_read()
4346 cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE); in SMB2_read()
4349 req->PersistentFileId, in SMB2_read()
4350 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4351 io_parms->offset, io_parms->length, in SMB2_read()
4354 trace_smb3_read_done(xid, req->PersistentFileId, io_parms->tcon->tid, in SMB2_read()
4355 ses->Suid, io_parms->offset, 0); in SMB2_read()
4358 return rc == -ENODATA ? 0 : rc; in SMB2_read()
4361 req->PersistentFileId, in SMB2_read()
4362 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4363 io_parms->offset, io_parms->length); in SMB2_read()
4367 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_read()
4369 (*nbytes > io_parms->length)) { in SMB2_read()
4371 *nbytes, io_parms->length); in SMB2_read()
4372 rc = -EIO; in SMB2_read()
4377 memcpy(*buf, (char *)rsp + rsp->DataOffset, *nbytes); in SMB2_read()
4396 struct cifs_writedata *wdata = mid->callback_data; in smb2_writev_callback()
4397 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in smb2_writev_callback() local
4398 struct TCP_Server_Info *server = wdata->server; in smb2_writev_callback()
4400 struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; in smb2_writev_callback()
4403 WARN_ONCE(wdata->server != mid->server, in smb2_writev_callback()
4405 wdata->server, mid->server); in smb2_writev_callback()
4407 switch (mid->mid_state) { in smb2_writev_callback()
4409 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_writev_callback()
4410 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4411 wdata->result = smb2_check_receive(mid, server, 0); in smb2_writev_callback()
4412 if (wdata->result != 0) in smb2_writev_callback()
4415 written = le32_to_cpu(rsp->DataLength); in smb2_writev_callback()
4422 if (written > wdata->bytes) in smb2_writev_callback()
4425 if (written < wdata->bytes) in smb2_writev_callback()
4426 wdata->result = -ENOSPC; in smb2_writev_callback()
4428 wdata->bytes = written; in smb2_writev_callback()
4432 wdata->result = -EAGAIN; in smb2_writev_callback()
4435 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_writev_callback()
4436 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4439 wdata->result = -EIO; in smb2_writev_callback()
4450 if (wdata->mr) { in smb2_writev_callback()
4451 smbd_deregister_mr(wdata->mr); in smb2_writev_callback()
4452 wdata->mr = NULL; in smb2_writev_callback()
4455 if (wdata->result) { in smb2_writev_callback()
4456 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); in smb2_writev_callback()
4458 wdata->cfile->fid.persistent_fid, in smb2_writev_callback()
4459 tcon->tid, tcon->ses->Suid, wdata->offset, in smb2_writev_callback()
4460 wdata->bytes, wdata->result); in smb2_writev_callback()
4461 if (wdata->result == -ENOSPC) in smb2_writev_callback()
4463 tcon->tree_name); in smb2_writev_callback()
4466 wdata->cfile->fid.persistent_fid, in smb2_writev_callback()
4467 tcon->tid, tcon->ses->Suid, in smb2_writev_callback()
4468 wdata->offset, wdata->bytes); in smb2_writev_callback()
4470 queue_work(cifsiod_wq, &wdata->work); in smb2_writev_callback()
4475 /* smb2_async_writev - send an async write, and set up mid to handle result */
4480 int rc = -EACCES, flags = 0; in smb2_async_writev()
4483 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in smb2_async_writev() local
4484 struct TCP_Server_Info *server = wdata->server; in smb2_async_writev()
4489 if (!wdata->server) in smb2_async_writev()
4490 server = wdata->server = cifs_pick_channel(tcon->ses); in smb2_async_writev()
4492 rc = smb2_plain_req_init(SMB2_WRITE, tcon, server, in smb2_async_writev()
4497 if (smb3_encryption_required(tcon)) in smb2_async_writev()
4501 shdr->Id.SyncId.ProcessId = cpu_to_le32(wdata->cfile->pid); in smb2_async_writev()
4503 req->PersistentFileId = wdata->cfile->fid.persistent_fid; in smb2_async_writev()
4504 req->VolatileFileId = wdata->cfile->fid.volatile_fid; in smb2_async_writev()
4505 req->WriteChannelInfoOffset = 0; in smb2_async_writev()
4506 req->WriteChannelInfoLength = 0; in smb2_async_writev()
4507 req->Channel = 0; in smb2_async_writev()
4508 req->Offset = cpu_to_le64(wdata->offset); in smb2_async_writev()
4509 req->DataOffset = cpu_to_le16( in smb2_async_writev()
4511 req->RemainingBytes = 0; in smb2_async_writev()
4513 trace_smb3_write_enter(0 /* xid */, wdata->cfile->fid.persistent_fid, in smb2_async_writev()
4514 tcon->tid, tcon->ses->Suid, wdata->offset, wdata->bytes); in smb2_async_writev()
4520 if (server->rdma && !server->sign && wdata->bytes >= in smb2_async_writev()
4521 server->smbd_conn->rdma_readwrite_threshold) { in smb2_async_writev()
4524 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_async_writev()
4526 wdata->mr = smbd_register_mr( in smb2_async_writev()
4527 server->smbd_conn, wdata->pages, in smb2_async_writev()
4528 wdata->nr_pages, wdata->page_offset, in smb2_async_writev()
4529 wdata->tailsz, false, need_invalidate); in smb2_async_writev()
4530 if (!wdata->mr) { in smb2_async_writev()
4531 rc = -EAGAIN; in smb2_async_writev()
4534 req->Length = 0; in smb2_async_writev()
4535 req->DataOffset = 0; in smb2_async_writev()
4536 if (wdata->nr_pages > 1) in smb2_async_writev()
4537 req->RemainingBytes = in smb2_async_writev()
4539 (wdata->nr_pages - 1) * wdata->pagesz - in smb2_async_writev()
4540 wdata->page_offset + wdata->tailsz in smb2_async_writev()
4543 req->RemainingBytes = cpu_to_le32(wdata->tailsz); in smb2_async_writev()
4544 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_async_writev()
4546 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_async_writev()
4547 req->WriteChannelInfoOffset = in smb2_async_writev()
4549 req->WriteChannelInfoLength = in smb2_async_writev()
4551 v1 = (struct smbd_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_async_writev()
4552 v1->offset = cpu_to_le64(wdata->mr->mr->iova); in smb2_async_writev()
4553 v1->token = cpu_to_le32(wdata->mr->mr->rkey); in smb2_async_writev()
4554 v1->length = cpu_to_le32(wdata->mr->mr->length); in smb2_async_writev()
4557 iov[0].iov_len = total_len - 1; in smb2_async_writev()
4562 rqst.rq_pages = wdata->pages; in smb2_async_writev()
4563 rqst.rq_offset = wdata->page_offset; in smb2_async_writev()
4564 rqst.rq_npages = wdata->nr_pages; in smb2_async_writev()
4565 rqst.rq_pagesz = wdata->pagesz; in smb2_async_writev()
4566 rqst.rq_tailsz = wdata->tailsz; in smb2_async_writev()
4568 if (wdata->mr) { in smb2_async_writev()
4574 wdata->offset, wdata->bytes); in smb2_async_writev()
4578 if (!wdata->mr) in smb2_async_writev()
4579 req->Length = cpu_to_le32(wdata->bytes); in smb2_async_writev()
4581 req->Length = cpu_to_le32(wdata->bytes); in smb2_async_writev()
4584 if (wdata->credits.value > 0) { in smb2_async_writev()
4585 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes, in smb2_async_writev()
4587 shdr->CreditRequest = cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 8); in smb2_async_writev()
4589 rc = adjust_credits(server, &wdata->credits, wdata->bytes); in smb2_async_writev()
4596 kref_get(&wdata->refcount); in smb2_async_writev()
4598 wdata, flags, &wdata->credits); in smb2_async_writev()
4602 req->PersistentFileId, in smb2_async_writev()
4603 tcon->tid, tcon->ses->Suid, wdata->offset, in smb2_async_writev()
4604 wdata->bytes, rc); in smb2_async_writev()
4605 kref_put(&wdata->refcount, release); in smb2_async_writev()
4606 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); in smb2_async_writev()
4639 if (!io_parms->server) in SMB2_write()
4640 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_write()
4641 server = io_parms->server; in SMB2_write()
4643 return -ECONNABORTED; in SMB2_write()
4645 rc = smb2_plain_req_init(SMB2_WRITE, io_parms->tcon, server, in SMB2_write()
4650 if (smb3_encryption_required(io_parms->tcon)) in SMB2_write()
4653 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in SMB2_write()
4655 req->PersistentFileId = io_parms->persistent_fid; in SMB2_write()
4656 req->VolatileFileId = io_parms->volatile_fid; in SMB2_write()
4657 req->WriteChannelInfoOffset = 0; in SMB2_write()
4658 req->WriteChannelInfoLength = 0; in SMB2_write()
4659 req->Channel = 0; in SMB2_write()
4660 req->Length = cpu_to_le32(io_parms->length); in SMB2_write()
4661 req->Offset = cpu_to_le64(io_parms->offset); in SMB2_write()
4662 req->DataOffset = cpu_to_le16( in SMB2_write()
4664 req->RemainingBytes = 0; in SMB2_write()
4666 trace_smb3_write_enter(xid, io_parms->persistent_fid, in SMB2_write()
4667 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in SMB2_write()
4668 io_parms->offset, io_parms->length); in SMB2_write()
4672 iov[0].iov_len = total_len - 1; in SMB2_write()
4678 rc = cifs_send_recv(xid, io_parms->tcon->ses, server, in SMB2_write()
4685 req->PersistentFileId, in SMB2_write()
4686 io_parms->tcon->tid, in SMB2_write()
4687 io_parms->tcon->ses->Suid, in SMB2_write()
4688 io_parms->offset, io_parms->length, rc); in SMB2_write()
4689 cifs_stats_fail_inc(io_parms->tcon, SMB2_WRITE_HE); in SMB2_write()
4692 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_write()
4694 req->PersistentFileId, in SMB2_write()
4695 io_parms->tcon->tid, in SMB2_write()
4696 io_parms->tcon->ses->Suid, in SMB2_write()
4697 io_parms->offset, *nbytes); in SMB2_write()
4711 return -1; in posix_info_sid_size()
4715 return -1; in posix_info_sid_size()
4719 return -1; in posix_info_sid_size()
4739 end = beg + le32_to_cpu(p->NextEntryOffset); in posix_info_parse()
4747 return -1; in posix_info_parse()
4754 return -1; in posix_info_parse()
4761 return -1; in posix_info_parse()
4766 return -1; in posix_info_parse()
4769 return -1; in posix_info_parse()
4775 return -1; in posix_info_parse()
4779 out->base = beg; in posix_info_parse()
4780 out->size = total_len; in posix_info_parse()
4781 out->name_len = name_len; in posix_info_parse()
4782 out->name = name; in posix_info_parse()
4783 memcpy(&out->owner, owner_sid, owner_len); in posix_info_parse()
4784 memcpy(&out->group, group_sid, group_len); in posix_info_parse()
4794 return -1; in posix_info_extra_size()
4795 return len - sizeof(struct smb2_posix_info); in posix_info_extra_size()
4827 len = le32_to_cpu(dir_info->FileNameLength); in num_entries()
4841 next_offset = le32_to_cpu(dir_info->NextEntryOffset); in num_entries()
4853 struct cifs_tcon *tcon, in SMB2_query_directory_init() argument
4862 unsigned int output_size = CIFSMaxBufSize - in SMB2_query_directory_init()
4863 MAX_SMB2_CREATE_RESPONSE_SIZE - in SMB2_query_directory_init()
4866 struct kvec *iov = rqst->rq_iov; in SMB2_query_directory_init()
4869 rc = smb2_plain_req_init(SMB2_QUERY_DIRECTORY, tcon, server, in SMB2_query_directory_init()
4876 req->FileInformationClass = FILE_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
4879 req->FileInformationClass = FILEID_FULL_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
4882 req->FileInformationClass = SMB_FIND_FILE_POSIX_INFO; in SMB2_query_directory_init()
4887 return -EINVAL; in SMB2_query_directory_init()
4890 req->FileIndex = cpu_to_le32(index); in SMB2_query_directory_init()
4891 req->PersistentFileId = persistent_fid; in SMB2_query_directory_init()
4892 req->VolatileFileId = volatile_fid; in SMB2_query_directory_init()
4895 bufptr = req->Buffer; in SMB2_query_directory_init()
4898 req->FileNameOffset = in SMB2_query_directory_init()
4899 cpu_to_le16(sizeof(struct smb2_query_directory_req) - 1); in SMB2_query_directory_init()
4900 req->FileNameLength = cpu_to_le16(len); in SMB2_query_directory_init()
4905 output_size = min_t(unsigned int, output_size, server->maxBuf); in SMB2_query_directory_init()
4907 req->OutputBufferLength = cpu_to_le32(output_size); in SMB2_query_directory_init()
4911 iov[0].iov_len = total_len - 1; in SMB2_query_directory_init()
4913 iov[1].iov_base = (char *)(req->Buffer); in SMB2_query_directory_init()
4916 trace_smb3_query_dir_enter(xid, persistent_fid, tcon->tid, in SMB2_query_directory_init()
4917 tcon->ses->Suid, index, output_size); in SMB2_query_directory_init()
4924 if (rqst && rqst->rq_iov) { in SMB2_query_directory_free()
4925 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_directory_free()
4930 smb2_parse_query_directory(struct cifs_tcon *tcon, in smb2_parse_query_directory() argument
4940 rsp = (struct smb2_query_directory_rsp *)rsp_iov->iov_base; in smb2_parse_query_directory()
4942 switch (srch_inf->info_level) { in smb2_parse_query_directory()
4944 info_buf_size = sizeof(FILE_DIRECTORY_INFO) - 1; in smb2_parse_query_directory()
4947 info_buf_size = sizeof(SEARCH_ID_FULL_DIR_INFO) - 1; in smb2_parse_query_directory()
4955 srch_inf->info_level); in smb2_parse_query_directory()
4956 return -EINVAL; in smb2_parse_query_directory()
4959 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_parse_query_directory()
4960 le32_to_cpu(rsp->OutputBufferLength), rsp_iov, in smb2_parse_query_directory()
4967 srch_inf->unicode = true; in smb2_parse_query_directory()
4969 if (srch_inf->ntwrk_buf_start) { in smb2_parse_query_directory()
4970 if (srch_inf->smallBuf) in smb2_parse_query_directory()
4971 cifs_small_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
4973 cifs_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
4975 srch_inf->ntwrk_buf_start = (char *)rsp; in smb2_parse_query_directory()
4976 srch_inf->srch_entries_start = srch_inf->last_entry = in smb2_parse_query_directory()
4977 (char *)rsp + le16_to_cpu(rsp->OutputBufferOffset); in smb2_parse_query_directory()
4978 end_of_smb = rsp_iov->iov_len + (char *)rsp; in smb2_parse_query_directory()
4980 srch_inf->entries_in_buffer = num_entries( in smb2_parse_query_directory()
4981 srch_inf->info_level, in smb2_parse_query_directory()
4982 srch_inf->srch_entries_start, in smb2_parse_query_directory()
4984 &srch_inf->last_entry, in smb2_parse_query_directory()
4987 srch_inf->index_of_last_entry += srch_inf->entries_in_buffer; in smb2_parse_query_directory()
4989 srch_inf->entries_in_buffer, srch_inf->index_of_last_entry, in smb2_parse_query_directory()
4990 srch_inf->srch_entries_start, srch_inf->last_entry); in smb2_parse_query_directory()
4992 srch_inf->smallBuf = false; in smb2_parse_query_directory()
4994 srch_inf->smallBuf = true; in smb2_parse_query_directory()
5002 SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_directory() argument
5012 struct cifs_ses *ses = tcon->ses; in SMB2_query_directory()
5016 if (!ses || !(ses->server)) in SMB2_query_directory()
5017 return -EIO; in SMB2_query_directory()
5019 if (smb3_encryption_required(tcon)) in SMB2_query_directory()
5027 rc = SMB2_query_directory_init(xid, tcon, server, in SMB2_query_directory()
5030 srch_inf->info_level); in SMB2_query_directory()
5039 if (rc == -ENODATA && in SMB2_query_directory()
5040 rsp->hdr.Status == STATUS_NO_MORE_FILES) { in SMB2_query_directory()
5042 tcon->tid, tcon->ses->Suid, index, 0); in SMB2_query_directory()
5043 srch_inf->endOfSearch = true; in SMB2_query_directory()
5046 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5047 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
5048 cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE); in SMB2_query_directory()
5053 rc = smb2_parse_query_directory(tcon, &rsp_iov, resp_buftype, in SMB2_query_directory()
5056 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5057 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
5062 trace_smb3_query_dir_done(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5063 tcon->ses->Suid, index, srch_inf->entries_in_buffer); in SMB2_query_directory()
5072 SMB2_set_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_set_info_init() argument
5079 struct kvec *iov = rqst->rq_iov; in SMB2_set_info_init()
5083 rc = smb2_plain_req_init(SMB2_SET_INFO, tcon, server, in SMB2_set_info_init()
5088 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid); in SMB2_set_info_init()
5089 req->InfoType = info_type; in SMB2_set_info_init()
5090 req->FileInfoClass = info_class; in SMB2_set_info_init()
5091 req->PersistentFileId = persistent_fid; in SMB2_set_info_init()
5092 req->VolatileFileId = volatile_fid; in SMB2_set_info_init()
5093 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_set_info_init()
5095 req->BufferOffset = in SMB2_set_info_init()
5096 cpu_to_le16(sizeof(struct smb2_set_info_req) - 1); in SMB2_set_info_init()
5097 req->BufferLength = cpu_to_le32(*size); in SMB2_set_info_init()
5099 memcpy(req->Buffer, *data, *size); in SMB2_set_info_init()
5104 iov[0].iov_len = total_len - 1; in SMB2_set_info_init()
5106 for (i = 1; i < rqst->rq_nvec; i++) { in SMB2_set_info_init()
5107 le32_add_cpu(&req->BufferLength, size[i]); in SMB2_set_info_init()
5118 if (rqst && rqst->rq_iov) in SMB2_set_info_free()
5119 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_set_info_free()
5123 send_set_info(const unsigned int xid, struct cifs_tcon *tcon, in send_set_info() argument
5134 struct cifs_ses *ses = tcon->ses; in send_set_info()
5139 return -EIO; in send_set_info()
5142 return -EINVAL; in send_set_info()
5144 if (smb3_encryption_required(tcon)) in send_set_info()
5149 return -ENOMEM; in send_set_info()
5155 rc = SMB2_set_info_init(tcon, server, in send_set_info()
5172 cifs_stats_fail_inc(tcon, SMB2_SET_INFO_HE); in send_set_info()
5173 trace_smb3_set_info_err(xid, persistent_fid, tcon->tid, in send_set_info()
5174 ses->Suid, info_class, (__u32)info_type, rc); in send_set_info()
5183 SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_set_eof() argument
5195 trace_smb3_set_eof(xid, persistent_fid, tcon->tid, tcon->ses->Suid, le64_to_cpu(*eof)); in SMB2_set_eof()
5197 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_eof()
5203 SMB2_set_acl(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_acl() argument
5207 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_acl()
5208 current->tgid, 0, SMB2_O_INFO_SECURITY, aclflag, in SMB2_set_acl()
5213 SMB2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_ea() argument
5217 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_ea()
5218 current->tgid, FILE_FULL_EA_INFORMATION, SMB2_O_INFO_FILE, in SMB2_set_ea()
5223 SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_oplock_break() argument
5230 struct cifs_ses *ses = tcon->ses; in SMB2_oplock_break()
5239 rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server, in SMB2_oplock_break()
5244 if (smb3_encryption_required(tcon)) in SMB2_oplock_break()
5247 req->VolatileFid = volatile_fid; in SMB2_oplock_break()
5248 req->PersistentFid = persistent_fid; in SMB2_oplock_break()
5249 req->OplockLevel = oplock_level; in SMB2_oplock_break()
5250 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_oplock_break()
5266 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE); in SMB2_oplock_break()
5277 kst->f_bsize = le32_to_cpu(pfs_inf->BytesPerSector) * in smb2_copy_fs_info_to_kstatfs()
5278 le32_to_cpu(pfs_inf->SectorsPerAllocationUnit); in smb2_copy_fs_info_to_kstatfs()
5279 kst->f_blocks = le64_to_cpu(pfs_inf->TotalAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5280 kst->f_bfree = kst->f_bavail = in smb2_copy_fs_info_to_kstatfs()
5281 le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5289 kst->f_bsize = le32_to_cpu(response_data->BlockSize); in copy_posix_fs_info_to_kstatfs()
5290 kst->f_blocks = le64_to_cpu(response_data->TotalBlocks); in copy_posix_fs_info_to_kstatfs()
5291 kst->f_bfree = le64_to_cpu(response_data->BlocksAvail); in copy_posix_fs_info_to_kstatfs()
5292 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5293 kst->f_bavail = kst->f_bfree; in copy_posix_fs_info_to_kstatfs()
5295 kst->f_bavail = le64_to_cpu(response_data->UserBlocksAvail); in copy_posix_fs_info_to_kstatfs()
5296 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5297 kst->f_files = le64_to_cpu(response_data->TotalFileNodes); in copy_posix_fs_info_to_kstatfs()
5298 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5299 kst->f_ffree = le64_to_cpu(response_data->FreeFileNodes); in copy_posix_fs_info_to_kstatfs()
5305 build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, in build_qfs_info_req() argument
5316 if ((tcon->ses == NULL) || server == NULL) in build_qfs_info_req()
5317 return -EIO; in build_qfs_info_req()
5319 rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server, in build_qfs_info_req()
5324 req->InfoType = SMB2_O_INFO_FILESYSTEM; in build_qfs_info_req()
5325 req->FileInfoClass = level; in build_qfs_info_req()
5326 req->PersistentFileId = persistent_fid; in build_qfs_info_req()
5327 req->VolatileFileId = volatile_fid; in build_qfs_info_req()
5329 req->InputBufferOffset = in build_qfs_info_req()
5330 cpu_to_le16(sizeof(struct smb2_query_info_req) - 1); in build_qfs_info_req()
5331 req->OutputBufferLength = cpu_to_le32( in build_qfs_info_req()
5332 outbuf_len + sizeof(struct smb2_query_info_rsp) - 1); in build_qfs_info_req()
5334 iov->iov_base = (char *)req; in build_qfs_info_req()
5335 iov->iov_len = total_len; in build_qfs_info_req()
5340 SMB311_posix_qfs_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB311_posix_qfs_info() argument
5349 struct cifs_ses *ses = tcon->ses; in SMB311_posix_qfs_info()
5354 rc = build_qfs_info_req(&iov, tcon, server, in SMB311_posix_qfs_info()
5361 if (smb3_encryption_required(tcon)) in SMB311_posix_qfs_info()
5372 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB311_posix_qfs_info()
5378 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB311_posix_qfs_info()
5379 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB311_posix_qfs_info()
5380 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB311_posix_qfs_info()
5391 SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_QFS_info() argument
5400 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_info()
5405 rc = build_qfs_info_req(&iov, tcon, server, in SMB2_QFS_info()
5412 if (smb3_encryption_required(tcon)) in SMB2_QFS_info()
5423 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB2_QFS_info()
5429 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB2_QFS_info()
5430 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB2_QFS_info()
5431 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB2_QFS_info()
5442 SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_QFS_attr() argument
5451 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_attr()
5470 return -EINVAL; in SMB2_QFS_attr()
5473 rc = build_qfs_info_req(&iov, tcon, server, in SMB2_QFS_attr()
5479 if (smb3_encryption_required(tcon)) in SMB2_QFS_attr()
5490 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB2_QFS_attr()
5495 rsp_len = le32_to_cpu(rsp->OutputBufferLength); in SMB2_QFS_attr()
5496 offset = le16_to_cpu(rsp->OutputBufferOffset); in SMB2_QFS_attr()
5502 memcpy(&tcon->fsAttrInfo, offset in SMB2_QFS_attr()
5506 memcpy(&tcon->fsDevInfo, offset in SMB2_QFS_attr()
5511 tcon->ss_flags = le32_to_cpu(ss_info->Flags); in SMB2_QFS_attr()
5512 tcon->perf_sector_size = in SMB2_QFS_attr()
5513 le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf); in SMB2_QFS_attr()
5517 tcon->vol_serial_number = vol_info->VolumeSerialNumber; in SMB2_QFS_attr()
5518 tcon->vol_create_time = vol_info->VolumeCreationTime; in SMB2_QFS_attr()
5527 smb2_lockv(const unsigned int xid, struct cifs_tcon *tcon, in smb2_lockv() argument
5540 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in smb2_lockv()
5544 rc = smb2_plain_req_init(SMB2_LOCK, tcon, server, in smb2_lockv()
5549 if (smb3_encryption_required(tcon)) in smb2_lockv()
5552 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid); in smb2_lockv()
5553 req->LockCount = cpu_to_le16(num_lock); in smb2_lockv()
5555 req->PersistentFileId = persist_fid; in smb2_lockv()
5556 req->VolatileFileId = volatile_fid; in smb2_lockv()
5561 iov[0].iov_len = total_len - sizeof(struct smb2_lock_element); in smb2_lockv()
5565 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in smb2_lockv()
5571 rc = cifs_send_recv(xid, tcon->ses, server, in smb2_lockv()
5577 cifs_stats_fail_inc(tcon, SMB2_LOCK_HE); in smb2_lockv()
5578 trace_smb3_lock_err(xid, persist_fid, tcon->tid, in smb2_lockv()
5579 tcon->ses->Suid, rc); in smb2_lockv()
5586 SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_lock() argument
5599 return smb2_lockv(xid, tcon, persist_fid, volatile_fid, pid, 1, &lock); in SMB2_lock()
5603 SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_lease_break() argument
5609 struct cifs_ses *ses = tcon->ses; in SMB2_lease_break()
5617 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in SMB2_lease_break()
5620 rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server, in SMB2_lease_break()
5625 if (smb3_encryption_required(tcon)) in SMB2_lease_break()
5628 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_lease_break()
5629 req->StructureSize = cpu_to_le16(36); in SMB2_lease_break()
5632 memcpy(req->LeaseKey, lease_key, 16); in SMB2_lease_break()
5633 req->LeaseState = lease_state; in SMB2_lease_break()
5651 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE); in SMB2_lease_break()
5652 trace_smb3_lease_err(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
5653 ses->Suid, *please_key_low, *please_key_high, rc); in SMB2_lease_break()
5656 trace_smb3_lease_done(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
5657 ses->Suid, *please_key_low, *please_key_high); in SMB2_lease_break()