Lines Matching +full:max +full:- +full:retries
1 // SPDX-License-Identifier: LGPL-2.1
13 /* SMB2 PDU handling routines here - except for leftovers (eg session setup) */
80 if (!tcon || !tcon->ses) in smb3_encryption_required()
82 if ((tcon->ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) || in smb3_encryption_required()
83 (tcon->share_flags & SHI1005_FLAGS_ENCRYPT_DATA)) in smb3_encryption_required()
85 if (tcon->seal && in smb3_encryption_required()
86 (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in smb3_encryption_required()
89 (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in smb3_encryption_required()
101 shdr->ProtocolId = SMB2_PROTO_NUMBER; in smb2_hdr_assemble()
102 shdr->StructureSize = cpu_to_le16(64); in smb2_hdr_assemble()
103 shdr->Command = smb2_cmd; in smb2_hdr_assemble()
107 if (server->dialect >= SMB30_PROT_ID) { in smb2_hdr_assemble()
114 smb3_hdr->ChannelSequence = in smb2_hdr_assemble()
115 cpu_to_le16(server->primary_server->channel_sequence_num); in smb2_hdr_assemble()
117 smb3_hdr->ChannelSequence = in smb2_hdr_assemble()
118 cpu_to_le16(server->channel_sequence_num); in smb2_hdr_assemble()
120 spin_lock(&server->req_lock); in smb2_hdr_assemble()
122 if (server->credits >= server->max_credits) in smb2_hdr_assemble()
123 shdr->CreditRequest = cpu_to_le16(0); in smb2_hdr_assemble()
125 shdr->CreditRequest = cpu_to_le16( in smb2_hdr_assemble()
126 min_t(int, server->max_credits - in smb2_hdr_assemble()
127 server->credits, 10)); in smb2_hdr_assemble()
128 spin_unlock(&server->req_lock); in smb2_hdr_assemble()
130 shdr->CreditRequest = cpu_to_le16(2); in smb2_hdr_assemble()
132 shdr->Id.SyncId.ProcessId = cpu_to_le32((__u16)current->tgid); in smb2_hdr_assemble()
138 /* See sections 2.2.4 and 3.2.4.1.5 of MS-SMB2 */ in smb2_hdr_assemble()
139 if (server && (server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_hdr_assemble()
140 shdr->CreditCharge = cpu_to_le16(1); in smb2_hdr_assemble()
143 shdr->Id.SyncId.TreeId = cpu_to_le32(tcon->tid); in smb2_hdr_assemble()
145 if (tcon->ses) in smb2_hdr_assemble()
146 shdr->SessionId = cpu_to_le64(tcon->ses->Suid); in smb2_hdr_assemble()
158 /* if (tcon->share_flags & SHI1005_FLAGS_DFS) in smb2_hdr_assemble()
159 shdr->Flags |= SMB2_FLAGS_DFS_OPERATIONS; */ in smb2_hdr_assemble()
161 if (server && server->sign && !smb3_encryption_required(tcon)) in smb2_hdr_assemble()
162 shdr->Flags |= SMB2_FLAGS_SIGNED; in smb2_hdr_assemble()
179 ses->server->hostname); in cifs_chan_skip_or_disable()
181 spin_lock(&ses->chan_lock); in cifs_chan_skip_or_disable()
184 spin_unlock(&ses->chan_lock); in cifs_chan_skip_or_disable()
188 ses->chans[chan_index].server = NULL; in cifs_chan_skip_or_disable()
189 server->terminate = true; in cifs_chan_skip_or_disable()
190 spin_unlock(&ses->chan_lock); in cifs_chan_skip_or_disable()
203 pserver = server->primary_server; in cifs_chan_skip_or_disable()
206 return -EHOSTDOWN; in cifs_chan_skip_or_disable()
228 * for those three - in the calling routine. in smb2_reconnect()
236 spin_lock(&tcon->tc_lock); in smb2_reconnect()
237 if (tcon->status == TID_EXITING) { in smb2_reconnect()
242 spin_unlock(&tcon->tc_lock); in smb2_reconnect()
245 return -ENODEV; in smb2_reconnect()
248 spin_unlock(&tcon->tc_lock); in smb2_reconnect()
250 ses = tcon->ses; in smb2_reconnect()
252 return -EIO; in smb2_reconnect()
253 spin_lock(&ses->ses_lock); in smb2_reconnect()
254 if (ses->ses_status == SES_EXITING) { in smb2_reconnect()
255 spin_unlock(&ses->ses_lock); in smb2_reconnect()
256 return -EIO; in smb2_reconnect()
258 spin_unlock(&ses->ses_lock); in smb2_reconnect()
259 if (!ses->server || !server) in smb2_reconnect()
260 return -EIO; in smb2_reconnect()
262 spin_lock(&server->srv_lock); in smb2_reconnect()
263 if (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
276 spin_unlock(&server->srv_lock); in smb2_reconnect()
277 return -EAGAIN; in smb2_reconnect()
282 if (server->terminate) { in smb2_reconnect()
283 spin_unlock(&server->srv_lock); in smb2_reconnect()
284 return -EHOSTDOWN; in smb2_reconnect()
286 spin_unlock(&server->srv_lock); in smb2_reconnect()
289 rc = cifs_wait_for_server_reconnect(server, tcon->retry); in smb2_reconnect()
293 spin_lock(&ses->chan_lock); in smb2_reconnect()
294 if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) { in smb2_reconnect()
295 spin_unlock(&ses->chan_lock); in smb2_reconnect()
298 spin_unlock(&ses->chan_lock); in smb2_reconnect()
300 tcon->ses->chans_need_reconnect, in smb2_reconnect()
301 tcon->need_reconnect); in smb2_reconnect()
303 mutex_lock(&ses->session_mutex); in smb2_reconnect()
308 spin_lock(&server->srv_lock); in smb2_reconnect()
309 switch (server->tcpStatus) { in smb2_reconnect()
311 spin_unlock(&server->srv_lock); in smb2_reconnect()
312 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
313 return -EHOSTDOWN; in smb2_reconnect()
315 spin_unlock(&server->srv_lock); in smb2_reconnect()
316 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
317 if (!tcon->retry) in smb2_reconnect()
318 return -EHOSTDOWN; in smb2_reconnect()
323 spin_unlock(&server->srv_lock); in smb2_reconnect()
329 spin_lock(&ses->ses_lock); in smb2_reconnect()
330 spin_lock(&ses->chan_lock); in smb2_reconnect()
332 ses->ses_status == SES_GOOD) { in smb2_reconnect()
333 spin_unlock(&ses->chan_lock); in smb2_reconnect()
334 spin_unlock(&ses->ses_lock); in smb2_reconnect()
336 if (tcon->need_reconnect) in smb2_reconnect()
339 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
342 spin_unlock(&ses->chan_lock); in smb2_reconnect()
343 spin_unlock(&ses->ses_lock); in smb2_reconnect()
347 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
348 if (!tcon->retry) in smb2_reconnect()
349 return -EHOSTDOWN; in smb2_reconnect()
356 if (ses->chan_count > 1 && in smb2_reconnect()
357 !(server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { in smb2_reconnect()
361 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
366 rc = cifs_setup_session(0, ses, server, ses->local_nls); in smb2_reconnect()
367 if ((rc == -EACCES) || (rc == -EKEYEXPIRED) || (rc == -EKEYREVOKED)) { in smb2_reconnect()
374 if (ses->password2) in smb2_reconnect()
375 swap(ses->password2, ses->password); in smb2_reconnect()
378 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
379 if (rc == -EACCES && !tcon->retry) in smb2_reconnect()
380 return -EHOSTDOWN; in smb2_reconnect()
385 if (!tcon->need_reconnect) { in smb2_reconnect()
386 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
390 if (tcon->use_persistent) in smb2_reconnect()
391 tcon->need_reopen_files = true; in smb2_reconnect()
398 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
403 spin_lock(&ses->ses_lock); in smb2_reconnect()
404 if (ses->flags & CIFS_SES_FLAG_SCALE_CHANNELS) { in smb2_reconnect()
405 spin_unlock(&ses->ses_lock); in smb2_reconnect()
406 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
409 ses->flags |= CIFS_SES_FLAG_SCALE_CHANNELS; in smb2_reconnect()
410 spin_unlock(&ses->ses_lock); in smb2_reconnect()
413 (server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL) && in smb2_reconnect()
414 server->ops->query_server_interfaces) { in smb2_reconnect()
421 ses->flags |= CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; in smb2_reconnect()
423 rc = server->ops->query_server_interfaces(xid, tcon, false); in smb2_reconnect()
425 ses->flags &= ~CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES; in smb2_reconnect()
427 if (!tcon->ipc && !tcon->dummy) in smb2_reconnect()
428 queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, in smb2_reconnect()
431 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
433 if (rc == -EOPNOTSUPP && ses->chan_count > 1) { in smb2_reconnect()
448 if (ses->chan_max > ses->chan_count && in smb2_reconnect()
449 ses->iface_count && in smb2_reconnect()
451 if (ses->chan_count == 1) in smb2_reconnect()
457 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
461 spin_lock(&ses->ses_lock); in smb2_reconnect()
462 ses->flags &= ~CIFS_SES_FLAG_SCALE_CHANNELS; in smb2_reconnect()
463 spin_unlock(&ses->ses_lock); in smb2_reconnect()
466 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in smb2_reconnect()
488 rc = -EAGAIN; in smb2_reconnect()
509 smb2_hdr_assemble(&spdu->hdr, smb2_command, tcon, server); in fill_small_buf()
510 spdu->StructureSize2 = cpu_to_le16(parmsize); in fill_small_buf()
536 return -ENOMEM; in __smb2_plain_req_init()
545 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]); in __smb2_plain_req_init()
546 cifs_stats_inc(&tcon->num_smbs_sent); in __smb2_plain_req_init()
578 (tcon->ses->flags & CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES))) in smb2_ioctl_req_init()
586 /* For explanation of negotiate contexts see MS-SMB2 section 2.2.3.1 */
591 pneg_ctxt->ContextType = SMB2_PREAUTH_INTEGRITY_CAPABILITIES; in build_preauth_ctxt()
592 pneg_ctxt->DataLength = cpu_to_le16(38); in build_preauth_ctxt()
593 pneg_ctxt->HashAlgorithmCount = cpu_to_le16(1); in build_preauth_ctxt()
594 pneg_ctxt->SaltLength = cpu_to_le16(SMB311_SALT_SIZE); in build_preauth_ctxt()
595 get_random_bytes(pneg_ctxt->Salt, SMB311_SALT_SIZE); in build_preauth_ctxt()
596 pneg_ctxt->HashAlgorithms = SMB2_PREAUTH_INTEGRITY_SHA512; in build_preauth_ctxt()
602 pneg_ctxt->ContextType = SMB2_COMPRESSION_CAPABILITIES; in build_compression_ctxt()
603 pneg_ctxt->DataLength = in build_compression_ctxt()
605 - sizeof(struct smb2_neg_context)); in build_compression_ctxt()
606 pneg_ctxt->CompressionAlgorithmCount = cpu_to_le16(3); in build_compression_ctxt()
607 pneg_ctxt->CompressionAlgorithms[0] = SMB3_COMPRESS_LZ77; in build_compression_ctxt()
608 pneg_ctxt->CompressionAlgorithms[1] = SMB3_COMPRESS_LZ77_HUFF; in build_compression_ctxt()
609 pneg_ctxt->CompressionAlgorithms[2] = SMB3_COMPRESS_LZNT1; in build_compression_ctxt()
618 pneg_ctxt->ContextType = SMB2_SIGNING_CAPABILITIES; in build_signing_ctxt()
622 pneg_ctxt->DataLength = cpu_to_le16(ALIGN(sizeof(struct smb2_signing_capabilities) - in build_signing_ctxt()
625 pneg_ctxt->SigningAlgorithmCount = cpu_to_le16(num_algs); in build_signing_ctxt()
626 pneg_ctxt->SigningAlgorithms[0] = cpu_to_le16(SIGNING_ALG_AES_CMAC); in build_signing_ctxt()
637 pneg_ctxt->ContextType = SMB2_ENCRYPTION_CAPABILITIES; in build_encrypt_ctxt()
639 pneg_ctxt->DataLength = cpu_to_le16(4); /* Cipher Count + 1 cipher */ in build_encrypt_ctxt()
640 pneg_ctxt->CipherCount = cpu_to_le16(1); in build_encrypt_ctxt()
641 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
643 pneg_ctxt->DataLength = cpu_to_le16(8); /* Cipher Count + 3 ciphers */ in build_encrypt_ctxt()
644 pneg_ctxt->CipherCount = cpu_to_le16(3); in build_encrypt_ctxt()
645 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
646 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
647 pneg_ctxt->Ciphers[2] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
649 pneg_ctxt->DataLength = cpu_to_le16(6); /* Cipher Count + 2 ciphers */ in build_encrypt_ctxt()
650 pneg_ctxt->CipherCount = cpu_to_le16(2); in build_encrypt_ctxt()
651 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
652 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
661 pneg_ctxt->ContextType = SMB2_NETNAME_NEGOTIATE_CONTEXT_ID; in build_netname_ctxt()
663 /* copy up to max of first 100 bytes of server name to NetName field */ in build_netname_ctxt()
664 pneg_ctxt->DataLength = cpu_to_le16(2 * cifs_strtoUTF16(pneg_ctxt->NetName, hostname, 100, cp)); in build_netname_ctxt()
666 return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8); in build_netname_ctxt()
672 pneg_ctxt->ContextType = SMB2_POSIX_EXTENSIONS_AVAILABLE; in build_posix_ctxt()
673 pneg_ctxt->DataLength = cpu_to_le16(POSIX_CTXT_DATA_LEN); in build_posix_ctxt()
675 pneg_ctxt->Name[0] = 0x93; in build_posix_ctxt()
676 pneg_ctxt->Name[1] = 0xAD; in build_posix_ctxt()
677 pneg_ctxt->Name[2] = 0x25; in build_posix_ctxt()
678 pneg_ctxt->Name[3] = 0x50; in build_posix_ctxt()
679 pneg_ctxt->Name[4] = 0x9C; in build_posix_ctxt()
680 pneg_ctxt->Name[5] = 0xB4; in build_posix_ctxt()
681 pneg_ctxt->Name[6] = 0x11; in build_posix_ctxt()
682 pneg_ctxt->Name[7] = 0xE7; in build_posix_ctxt()
683 pneg_ctxt->Name[8] = 0xB4; in build_posix_ctxt()
684 pneg_ctxt->Name[9] = 0x23; in build_posix_ctxt()
685 pneg_ctxt->Name[10] = 0x83; in build_posix_ctxt()
686 pneg_ctxt->Name[11] = 0xDE; in build_posix_ctxt()
687 pneg_ctxt->Name[12] = 0x96; in build_posix_ctxt()
688 pneg_ctxt->Name[13] = 0x8B; in build_posix_ctxt()
689 pneg_ctxt->Name[14] = 0xCD; in build_posix_ctxt()
690 pneg_ctxt->Name[15] = 0x7C; in build_posix_ctxt()
715 req->NegotiateContextOffset = cpu_to_le32(*total_len); in assemble_neg_contexts()
731 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in assemble_neg_contexts()
733 hostname = pserver->hostname; in assemble_neg_contexts()
749 if (server->compression.requested) { in assemble_neg_contexts()
767 req->NegotiateContextCount = cpu_to_le16(neg_context_count); in assemble_neg_contexts()
771 /* If invalid preauth context warn but use what we requested, SHA-512 */
774 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_preauth_context()
783 } else if (len < MIN_PREAUTH_CTXT_DATA_LEN + le16_to_cpu(ctxt->SaltLength)) { in decode_preauth_context()
787 if (le16_to_cpu(ctxt->HashAlgorithmCount) != 1) in decode_preauth_context()
789 if (ctxt->HashAlgorithms != SMB2_PREAUTH_INTEGRITY_SHA512) in decode_preauth_context()
796 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_compress_ctx()
799 server->compression.enabled = false; in decode_compress_ctx()
811 if (le16_to_cpu(ctxt->CompressionAlgorithmCount) != 1) { in decode_compress_ctx()
816 alg = ctxt->CompressionAlgorithms[0]; in decode_compress_ctx()
824 server->compression.alg = alg; in decode_compress_ctx()
825 server->compression.enabled = true; in decode_compress_ctx()
831 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_encrypt_ctx()
841 return -EINVAL; in decode_encrypt_ctx()
844 if (le16_to_cpu(ctxt->CipherCount) != 1) { in decode_encrypt_ctx()
846 return -EINVAL; in decode_encrypt_ctx()
848 cifs_dbg(FYI, "SMB311 cipher type:%d\n", le16_to_cpu(ctxt->Ciphers[0])); in decode_encrypt_ctx()
850 if (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM) { in decode_encrypt_ctx()
852 return -EOPNOTSUPP; in decode_encrypt_ctx()
854 } else if (ctxt->Ciphers[0] == 0) { in decode_encrypt_ctx()
864 server->cipher_type = 0; in decode_encrypt_ctx()
865 server->capabilities &= ~SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
868 } else if ((ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_CCM) && in decode_encrypt_ctx()
869 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_GCM) && in decode_encrypt_ctx()
870 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM)) { in decode_encrypt_ctx()
873 return -EINVAL; in decode_encrypt_ctx()
875 server->cipher_type = ctxt->Ciphers[0]; in decode_encrypt_ctx()
876 server->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
883 unsigned int len = le16_to_cpu(pctxt->DataLength); in decode_signing_ctx()
894 if (le16_to_cpu(pctxt->SigningAlgorithmCount) != 1) { in decode_signing_ctx()
898 if (le16_to_cpu(pctxt->SigningAlgorithms[0]) > 2) { in decode_signing_ctx()
903 server->signing_negotiated = true; in decode_signing_ctx()
904 server->signing_algorithm = le16_to_cpu(pctxt->SigningAlgorithms[0]); in decode_signing_ctx()
906 server->signing_algorithm); in decode_signing_ctx()
915 unsigned int offset = le32_to_cpu(rsp->NegotiateContextOffset); in smb311_decode_neg_context()
916 unsigned int ctxt_cnt = le16_to_cpu(rsp->NegotiateContextCount); in smb311_decode_neg_context()
923 return -EINVAL; in smb311_decode_neg_context()
926 len_of_ctxts = len_of_smb - offset; in smb311_decode_neg_context()
936 + le16_to_cpu(pctx->DataLength); in smb311_decode_neg_context()
939 * Subsequent negotiate contexts MUST appear at the first 8-byte in smb311_decode_neg_context()
947 if (pctx->ContextType == SMB2_PREAUTH_INTEGRITY_CAPABILITIES) in smb311_decode_neg_context()
950 else if (pctx->ContextType == SMB2_ENCRYPTION_CAPABILITIES) in smb311_decode_neg_context()
953 else if (pctx->ContextType == SMB2_COMPRESSION_CAPABILITIES) in smb311_decode_neg_context()
956 else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE) in smb311_decode_neg_context()
957 server->posix_ext_supported = true; in smb311_decode_neg_context()
958 else if (pctx->ContextType == SMB2_SIGNING_CAPABILITIES) in smb311_decode_neg_context()
963 le16_to_cpu(pctx->ContextType)); in smb311_decode_neg_context()
968 len_of_ctxts -= clen; in smb311_decode_neg_context()
983 buf->ccontext.DataOffset = in create_posix_buf()
985 buf->ccontext.DataLength = cpu_to_le32(4); in create_posix_buf()
986 buf->ccontext.NameOffset = in create_posix_buf()
988 buf->ccontext.NameLength = cpu_to_le16(16); in create_posix_buf()
991 buf->Name[0] = 0x93; in create_posix_buf()
992 buf->Name[1] = 0xAD; in create_posix_buf()
993 buf->Name[2] = 0x25; in create_posix_buf()
994 buf->Name[3] = 0x50; in create_posix_buf()
995 buf->Name[4] = 0x9C; in create_posix_buf()
996 buf->Name[5] = 0xB4; in create_posix_buf()
997 buf->Name[6] = 0x11; in create_posix_buf()
998 buf->Name[7] = 0xE7; in create_posix_buf()
999 buf->Name[8] = 0xB4; in create_posix_buf()
1000 buf->Name[9] = 0x23; in create_posix_buf()
1001 buf->Name[10] = 0x83; in create_posix_buf()
1002 buf->Name[11] = 0xDE; in create_posix_buf()
1003 buf->Name[12] = 0x96; in create_posix_buf()
1004 buf->Name[13] = 0x8B; in create_posix_buf()
1005 buf->Name[14] = 0xCD; in create_posix_buf()
1006 buf->Name[15] = 0x7C; in create_posix_buf()
1007 buf->Mode = cpu_to_le32(mode); in create_posix_buf()
1021 return -ENOMEM; in add_posix_context()
1064 return -EIO; in SMB2_negotiate()
1072 req->hdr.SessionId = 0; in SMB2_negotiate()
1074 memset(server->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
1075 memset(ses->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
1077 if (strcmp(server->vals->version_string, in SMB2_negotiate()
1079 req->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
1080 req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
1081 req->Dialects[2] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
1082 req->DialectCount = cpu_to_le16(3); in SMB2_negotiate()
1084 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
1086 req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in SMB2_negotiate()
1087 req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
1088 req->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
1089 req->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
1090 req->DialectCount = cpu_to_le16(4); in SMB2_negotiate()
1094 req->Dialects[0] = cpu_to_le16(server->vals->protocol_id); in SMB2_negotiate()
1095 req->DialectCount = cpu_to_le16(1); in SMB2_negotiate()
1100 if (ses->sign) in SMB2_negotiate()
1101 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_REQUIRED); in SMB2_negotiate()
1103 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_ENABLED); in SMB2_negotiate()
1105 req->SecurityMode = 0; in SMB2_negotiate()
1107 req->Capabilities = cpu_to_le32(server->vals->req_capabilities); in SMB2_negotiate()
1108 if (ses->chan_max > 1) in SMB2_negotiate()
1109 req->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in SMB2_negotiate()
1112 if (server->vals->protocol_id == SMB20_PROT_ID) in SMB2_negotiate()
1113 memset(req->ClientGUID, 0, SMB2_CLIENT_GUID_SIZE); in SMB2_negotiate()
1115 memcpy(req->ClientGUID, server->client_guid, in SMB2_negotiate()
1117 if ((server->vals->protocol_id == SMB311_PROT_ID) || in SMB2_negotiate()
1118 (strcmp(server->vals->version_string, in SMB2_negotiate()
1120 (strcmp(server->vals->version_string, in SMB2_negotiate()
1137 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_negotiate()
1139 if (rc == -EOPNOTSUPP) { in SMB2_negotiate()
1145 rc = -EIO; in SMB2_negotiate()
1146 if (strcmp(server->vals->version_string, in SMB2_negotiate()
1148 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
1152 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
1156 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1158 server->ops = &smb311_operations; in SMB2_negotiate()
1159 server->vals = &smb311_values; in SMB2_negotiate()
1161 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
1163 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
1167 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
1169 server->ops = &smb21_operations; in SMB2_negotiate()
1170 server->vals = &smb21_values; in SMB2_negotiate()
1171 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1172 server->ops = &smb311_operations; in SMB2_negotiate()
1173 server->vals = &smb311_values; in SMB2_negotiate()
1175 } else if (le16_to_cpu(rsp->DialectRevision) != in SMB2_negotiate()
1176 server->vals->protocol_id) { in SMB2_negotiate()
1179 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
1183 cifs_dbg(FYI, "mode 0x%x\n", rsp->SecurityMode); in SMB2_negotiate()
1185 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) in SMB2_negotiate()
1187 else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) in SMB2_negotiate()
1189 else if (rsp->DialectRevision == cpu_to_le16(SMB30_PROT_ID)) in SMB2_negotiate()
1191 else if (rsp->DialectRevision == cpu_to_le16(SMB302_PROT_ID)) in SMB2_negotiate()
1193 else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) in SMB2_negotiate()
1197 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
1202 server->dialect = le16_to_cpu(rsp->DialectRevision); in SMB2_negotiate()
1209 memcpy(server->preauth_sha_hash, ses->preauth_sha_hash, in SMB2_negotiate()
1213 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in SMB2_negotiate()
1215 server->maxBuf = min_t(unsigned int, le32_to_cpu(rsp->MaxTransactSize), in SMB2_negotiate()
1217 server->max_read = le32_to_cpu(rsp->MaxReadSize); in SMB2_negotiate()
1218 server->max_write = le32_to_cpu(rsp->MaxWriteSize); in SMB2_negotiate()
1219 server->sec_mode = le16_to_cpu(rsp->SecurityMode); in SMB2_negotiate()
1220 if ((server->sec_mode & SMB2_SEC_MODE_FLAGS_ALL) != server->sec_mode) in SMB2_negotiate()
1222 server->sec_mode); in SMB2_negotiate()
1223 server->capabilities = le32_to_cpu(rsp->Capabilities); in SMB2_negotiate()
1225 server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; in SMB2_negotiate()
1231 if ((server->dialect == SMB30_PROT_ID || in SMB2_negotiate()
1232 server->dialect == SMB302_PROT_ID) && in SMB2_negotiate()
1233 (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_negotiate()
1234 server->cipher_type = SMB2_ENCRYPTION_AES128_CCM; in SMB2_negotiate()
1239 * See MS-SMB2 section 2.2.4: if no blob, client picks default which in SMB2_negotiate()
1241 * ses->sectype = RawNTLMSSP; in SMB2_negotiate()
1247 server->sec_ntlmssp = true; in SMB2_negotiate()
1250 rc = cifs_enable_signing(server, ses->sign); in SMB2_negotiate()
1258 rc = -EIO; in SMB2_negotiate()
1261 if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1262 if (rsp->NegotiateContextCount) in SMB2_negotiate()
1269 if (server->cipher_type && !rc) in SMB2_negotiate()
1282 u32 inbuflen; /* max of 4 dialects */ in smb3_validate_negotiate()
1283 struct TCP_Server_Info *server = tcon->ses->server; in smb3_validate_negotiate()
1288 if (server->dialect == SMB311_PROT_ID) in smb3_validate_negotiate()
1298 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) in smb3_validate_negotiate()
1301 if (tcon->ses->user_name == NULL) { in smb3_validate_negotiate()
1306 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL) in smb3_validate_negotiate()
1311 return -ENOMEM; in smb3_validate_negotiate()
1313 pneg_inbuf->Capabilities = in smb3_validate_negotiate()
1314 cpu_to_le32(server->vals->req_capabilities); in smb3_validate_negotiate()
1315 if (tcon->ses->chan_max > 1) in smb3_validate_negotiate()
1316 pneg_inbuf->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in smb3_validate_negotiate()
1318 memcpy(pneg_inbuf->Guid, server->client_guid, in smb3_validate_negotiate()
1321 if (tcon->ses->sign) in smb3_validate_negotiate()
1322 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1325 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1328 pneg_inbuf->SecurityMode = 0; in smb3_validate_negotiate()
1331 if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1333 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1334 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1335 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1336 pneg_inbuf->DialectCount = cpu_to_le16(3); in smb3_validate_negotiate()
1338 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1339 (sizeof(pneg_inbuf->Dialects[0])); in smb3_validate_negotiate()
1340 } else if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1342 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in smb3_validate_negotiate()
1343 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1344 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1345 pneg_inbuf->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1346 pneg_inbuf->DialectCount = cpu_to_le16(4); in smb3_validate_negotiate()
1351 pneg_inbuf->Dialects[0] = in smb3_validate_negotiate()
1352 cpu_to_le16(server->vals->protocol_id); in smb3_validate_negotiate()
1353 pneg_inbuf->DialectCount = cpu_to_le16(1); in smb3_validate_negotiate()
1355 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1356 sizeof(pneg_inbuf->Dialects[0]) * 3; in smb3_validate_negotiate()
1363 if (rc == -EOPNOTSUPP) { in smb3_validate_negotiate()
1374 rc = -EIO; in smb3_validate_negotiate()
1378 rc = -EIO; in smb3_validate_negotiate()
1383 /* relax check since Mac returns max bufsize allowed on ioctl */ in smb3_validate_negotiate()
1389 if (pneg_rsp->Dialect != cpu_to_le16(server->dialect)) in smb3_validate_negotiate()
1392 if (pneg_rsp->SecurityMode != cpu_to_le16(server->sec_mode)) in smb3_validate_negotiate()
1397 if ((le32_to_cpu(pneg_rsp->Capabilities) | SMB2_NT_FIND | in smb3_validate_negotiate()
1398 SMB2_LARGE_FILES) != server->capabilities) in smb3_validate_negotiate()
1407 cifs_tcon_dbg(VFS, "protocol revalidation - security settings mismatch\n"); in smb3_validate_negotiate()
1425 if (server->sec_ntlmssp && in smb2_select_sectype()
1428 if ((server->sec_kerberos || server->sec_mskerberos || server->sec_iakerb) && in smb2_select_sectype()
1461 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_alloc_buffer()
1462 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_alloc_buffer()
1473 spin_lock(&ses->ses_lock); in SMB2_sess_alloc_buffer()
1474 is_binding = (ses->ses_status == SES_GOOD); in SMB2_sess_alloc_buffer()
1475 spin_unlock(&ses->ses_lock); in SMB2_sess_alloc_buffer()
1478 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_sess_alloc_buffer()
1479 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_sess_alloc_buffer()
1480 req->PreviousSessionId = 0; in SMB2_sess_alloc_buffer()
1481 req->Flags = SMB2_SESSION_REQ_FLAG_BINDING; in SMB2_sess_alloc_buffer()
1482 cifs_dbg(FYI, "Binding to sess id: %llx\n", ses->Suid); in SMB2_sess_alloc_buffer()
1485 req->hdr.SessionId = 0; in SMB2_sess_alloc_buffer()
1490 req->PreviousSessionId = cpu_to_le64(sess_data->previous_session); in SMB2_sess_alloc_buffer()
1491 req->Flags = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1493 sess_data->previous_session); in SMB2_sess_alloc_buffer()
1496 /* enough to enable echos and oplocks and one max size write */ in SMB2_sess_alloc_buffer()
1497 if (server->credits >= server->max_credits) in SMB2_sess_alloc_buffer()
1498 req->hdr.CreditRequest = cpu_to_le16(0); in SMB2_sess_alloc_buffer()
1500 req->hdr.CreditRequest = cpu_to_le16( in SMB2_sess_alloc_buffer()
1501 min_t(int, server->max_credits - in SMB2_sess_alloc_buffer()
1502 server->credits, 130)); in SMB2_sess_alloc_buffer()
1505 if (server->sign) in SMB2_sess_alloc_buffer()
1506 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED; in SMB2_sess_alloc_buffer()
1508 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED; in SMB2_sess_alloc_buffer()
1510 req->SecurityMode = 0; in SMB2_sess_alloc_buffer()
1513 req->Capabilities = cpu_to_le32(SMB2_GLOBAL_CAP_DFS); in SMB2_sess_alloc_buffer()
1515 req->Capabilities = 0; in SMB2_sess_alloc_buffer()
1518 req->Channel = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1520 sess_data->iov[0].iov_base = (char *)req; in SMB2_sess_alloc_buffer()
1522 sess_data->iov[0].iov_len = total_len - 1; in SMB2_sess_alloc_buffer()
1527 sess_data->buf0_type = CIFS_SMALL_BUFFER; in SMB2_sess_alloc_buffer()
1535 struct kvec *iov = sess_data->iov; in SMB2_sess_free_buffer()
1538 if (sess_data->buf0_type != CIFS_NO_BUFFER && iov[0].iov_base) in SMB2_sess_free_buffer()
1541 free_rsp_buf(sess_data->buf0_type, iov[0].iov_base); in SMB2_sess_free_buffer()
1542 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_free_buffer()
1550 struct smb2_sess_setup_req *req = sess_data->iov[0].iov_base; in SMB2_sess_sendreceive()
1554 req->SecurityBufferOffset = in SMB2_sess_sendreceive()
1556 req->SecurityBufferLength = cpu_to_le16(sess_data->iov[1].iov_len); in SMB2_sess_sendreceive()
1559 rqst.rq_iov = sess_data->iov; in SMB2_sess_sendreceive()
1563 rc = cifs_send_recv(sess_data->xid, sess_data->ses, in SMB2_sess_sendreceive()
1564 sess_data->server, in SMB2_sess_sendreceive()
1566 &sess_data->buf0_type, in SMB2_sess_sendreceive()
1568 cifs_small_buf_release(sess_data->iov[0].iov_base); in SMB2_sess_sendreceive()
1570 sess_data->ses->expired_pwd = false; in SMB2_sess_sendreceive()
1571 else if ((rc == -EACCES) || (rc == -EKEYEXPIRED) || (rc == -EKEYREVOKED)) { in SMB2_sess_sendreceive()
1572 if (sess_data->ses->expired_pwd == false) in SMB2_sess_sendreceive()
1573 trace_smb3_key_expired(sess_data->server->hostname, in SMB2_sess_sendreceive()
1574 sess_data->ses->user_name, in SMB2_sess_sendreceive()
1575 sess_data->server->conn_id, in SMB2_sess_sendreceive()
1576 &sess_data->server->dstaddr, rc); in SMB2_sess_sendreceive()
1577 sess_data->ses->expired_pwd = true; in SMB2_sess_sendreceive()
1580 memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec)); in SMB2_sess_sendreceive()
1589 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_establish_session()
1590 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_establish_session()
1593 if (server->ops->generate_signingkey) { in SMB2_sess_establish_session()
1594 rc = server->ops->generate_signingkey(ses, server); in SMB2_sess_establish_session()
1602 if (!server->session_estab) { in SMB2_sess_establish_session()
1603 server->sequence_number = 0x2; in SMB2_sess_establish_session()
1604 server->session_estab = true; in SMB2_sess_establish_session()
1617 struct cifs_ses *ses = sess_data->ses; in SMB2_auth_kerberos()
1618 struct TCP_Server_Info *server = sess_data->server; in SMB2_auth_kerberos()
1631 if (rc == -ENOKEY) in SMB2_auth_kerberos()
1637 msg = spnego_key->payload.data[0]; in SMB2_auth_kerberos()
1642 if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { in SMB2_auth_kerberos()
1644 CIFS_SPNEGO_UPCALL_VERSION, msg->version); in SMB2_auth_kerberos()
1645 rc = -EKEYREJECTED; in SMB2_auth_kerberos()
1649 spin_lock(&ses->ses_lock); in SMB2_auth_kerberos()
1650 is_binding = (ses->ses_status == SES_GOOD); in SMB2_auth_kerberos()
1651 spin_unlock(&ses->ses_lock); in SMB2_auth_kerberos()
1655 kfree_sensitive(ses->auth_key.response); in SMB2_auth_kerberos()
1656 ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len, in SMB2_auth_kerberos()
1658 if (!ses->auth_key.response) { in SMB2_auth_kerberos()
1660 msg->sesskey_len); in SMB2_auth_kerberos()
1661 rc = -ENOMEM; in SMB2_auth_kerberos()
1664 ses->auth_key.len = msg->sesskey_len; in SMB2_auth_kerberos()
1667 sess_data->iov[1].iov_base = msg->data + msg->sesskey_len; in SMB2_auth_kerberos()
1668 sess_data->iov[1].iov_len = msg->secblob_len; in SMB2_auth_kerberos()
1674 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_auth_kerberos()
1677 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_auth_kerberos()
1678 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_auth_kerberos()
1686 kfree_sensitive(ses->auth_key.response); in SMB2_auth_kerberos()
1687 ses->auth_key.response = NULL; in SMB2_auth_kerberos()
1688 ses->auth_key.len = 0; in SMB2_auth_kerberos()
1691 sess_data->result = rc; in SMB2_auth_kerberos()
1692 sess_data->func = NULL; in SMB2_auth_kerberos()
1700 sess_data->result = -EOPNOTSUPP; in SMB2_auth_kerberos()
1701 sess_data->func = NULL; in SMB2_auth_kerberos()
1712 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_negotiate()
1713 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_auth_rawntlmssp_negotiate()
1724 ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL); in SMB2_sess_auth_rawntlmssp_negotiate()
1725 if (!ses->ntlmssp) { in SMB2_sess_auth_rawntlmssp_negotiate()
1726 rc = -ENOMEM; in SMB2_sess_auth_rawntlmssp_negotiate()
1729 ses->ntlmssp->sesskey_per_smbsess = true; in SMB2_sess_auth_rawntlmssp_negotiate()
1737 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_negotiate()
1744 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_negotiate()
1747 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_negotiate()
1748 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_negotiate()
1751 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_negotiate()
1754 if (sess_data->buf0_type != CIFS_NO_BUFFER && in SMB2_sess_auth_rawntlmssp_negotiate()
1755 rsp->hdr.Status == STATUS_MORE_PROCESSING_REQUIRED) in SMB2_sess_auth_rawntlmssp_negotiate()
1762 le16_to_cpu(rsp->SecurityBufferOffset)) { in SMB2_sess_auth_rawntlmssp_negotiate()
1764 le16_to_cpu(rsp->SecurityBufferOffset)); in SMB2_sess_auth_rawntlmssp_negotiate()
1765 rc = -EIO; in SMB2_sess_auth_rawntlmssp_negotiate()
1768 rc = decode_ntlmssp_challenge(rsp->Buffer, in SMB2_sess_auth_rawntlmssp_negotiate()
1769 le16_to_cpu(rsp->SecurityBufferLength), ses); in SMB2_sess_auth_rawntlmssp_negotiate()
1775 spin_lock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_negotiate()
1776 is_binding = (ses->ses_status == SES_GOOD); in SMB2_sess_auth_rawntlmssp_negotiate()
1777 spin_unlock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_negotiate()
1781 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_sess_auth_rawntlmssp_negotiate()
1782 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_negotiate()
1789 sess_data->result = 0; in SMB2_sess_auth_rawntlmssp_negotiate()
1790 sess_data->func = SMB2_sess_auth_rawntlmssp_authenticate; in SMB2_sess_auth_rawntlmssp_negotiate()
1794 kfree_sensitive(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_negotiate()
1795 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1796 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_negotiate()
1797 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1804 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_authenticate()
1805 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_auth_rawntlmssp_authenticate()
1817 req = (struct smb2_sess_setup_req *) sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1818 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1822 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_authenticate()
1831 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_authenticate()
1834 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_authenticate()
1835 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_authenticate()
1841 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1843 spin_lock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_authenticate()
1844 is_binding = (ses->ses_status == SES_GOOD); in SMB2_sess_auth_rawntlmssp_authenticate()
1845 spin_unlock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_authenticate()
1849 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_sess_auth_rawntlmssp_authenticate()
1850 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_authenticate()
1855 if (ses->server->dialect < SMB30_PROT_ID) { in SMB2_sess_auth_rawntlmssp_authenticate()
1861 cifs_dbg(VFS, "Session Id %*ph\n", (int)sizeof(ses->Suid), in SMB2_sess_auth_rawntlmssp_authenticate()
1862 &ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1864 SMB2_NTLMV2_SESSKEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1866 SMB3_SIGN_KEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1872 kfree_sensitive(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_authenticate()
1873 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1874 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_authenticate()
1875 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1882 struct cifs_ses *ses = sess_data->ses; in SMB2_select_sec()
1883 struct TCP_Server_Info *server = sess_data->server; in SMB2_select_sec()
1885 type = smb2_select_sectype(server, ses->sectype); in SMB2_select_sec()
1889 return -EINVAL; in SMB2_select_sec()
1894 sess_data->func = SMB2_auth_kerberos; in SMB2_select_sec()
1897 sess_data->func = SMB2_sess_auth_rawntlmssp_negotiate; in SMB2_select_sec()
1901 return -EOPNOTSUPP; in SMB2_select_sec()
1919 return -EIO; in SMB2_sess_setup()
1924 return -ENOMEM; in SMB2_sess_setup()
1926 sess_data->xid = xid; in SMB2_sess_setup()
1927 sess_data->ses = ses; in SMB2_sess_setup()
1928 sess_data->server = server; in SMB2_sess_setup()
1929 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_setup()
1930 sess_data->nls_cp = (struct nls_table *) nls_cp; in SMB2_sess_setup()
1931 sess_data->previous_session = ses->Suid; in SMB2_sess_setup()
1940 memcpy(ses->preauth_sha_hash, server->preauth_sha_hash, in SMB2_sess_setup()
1943 while (sess_data->func) in SMB2_sess_setup()
1944 sess_data->func(sess_data); in SMB2_sess_setup()
1946 if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign)) in SMB2_sess_setup()
1948 rc = sess_data->result; in SMB2_sess_setup()
1969 if (ses && (ses->server)) in SMB2_logoff()
1970 server = ses->server; in SMB2_logoff()
1972 return -EIO; in SMB2_logoff()
1975 spin_lock(&ses->chan_lock); in SMB2_logoff()
1977 spin_unlock(&ses->chan_lock); in SMB2_logoff()
1980 spin_unlock(&ses->chan_lock); in SMB2_logoff()
1982 rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, ses->server, in SMB2_logoff()
1988 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_logoff()
1990 if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) in SMB2_logoff()
1992 else if (server->sign) in SMB2_logoff()
1993 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_logoff()
2004 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_logoff()
2009 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_logoff()
2018 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_failed[code]); in cifs_stats_fail_inc()
2026 tcon->max_chunks = 256; in init_copy_chunk_defaults()
2027 tcon->max_bytes_chunk = 1048576; in init_copy_chunk_defaults()
2028 tcon->max_bytes_copy = 16777216; in init_copy_chunk_defaults()
2051 return -EIO; in SMB2_tcon()
2055 return -ENOMEM; in SMB2_tcon()
2060 return -EINVAL; in SMB2_tcon()
2065 tcon->tid = 0; in SMB2_tcon()
2066 atomic_set(&tcon->num_remote_opens, 0); in SMB2_tcon()
2079 iov[0].iov_len = total_len - 1; in SMB2_tcon()
2082 req->PathOffset = cpu_to_le16(sizeof(struct smb2_tree_connect_req)); in SMB2_tcon()
2083 req->PathLength = cpu_to_le16(unc_path_len); in SMB2_tcon()
2088 * 3.11 tcon req must be signed if not encrypted. See MS-SMB2 3.2.4.1.1 in SMB2_tcon()
2089 * unless it is guest or anonymous user. See MS-SMB2 3.2.5.3.1 in SMB2_tcon()
2092 if ((server->dialect == SMB311_PROT_ID) && in SMB2_tcon()
2094 !(ses->session_flags & in SMB2_tcon()
2096 ((ses->user_name != NULL) || (ses->sectype == Kerberos))) in SMB2_tcon()
2097 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_tcon()
2103 /* Need 64 for max size write so ask for more in case not there yet */ in SMB2_tcon()
2104 if (server->credits >= server->max_credits) in SMB2_tcon()
2105 req->hdr.CreditRequest = cpu_to_le16(0); in SMB2_tcon()
2107 req->hdr.CreditRequest = cpu_to_le16( in SMB2_tcon()
2108 min_t(int, server->max_credits - in SMB2_tcon()
2109 server->credits, 64)); in SMB2_tcon()
2115 trace_smb3_tcon(xid, tcon->tid, ses->Suid, tree, rc); in SMB2_tcon()
2118 tcon->need_reconnect = true; in SMB2_tcon()
2122 switch (rsp->ShareType) { in SMB2_tcon()
2127 tcon->pipe = true; in SMB2_tcon()
2131 tcon->print = true; in SMB2_tcon()
2135 cifs_server_dbg(VFS, "unknown share type %d\n", rsp->ShareType); in SMB2_tcon()
2136 rc = -EOPNOTSUPP; in SMB2_tcon()
2140 tcon->share_flags = le32_to_cpu(rsp->ShareFlags); in SMB2_tcon()
2141 tcon->capabilities = rsp->Capabilities; /* we keep caps little endian */ in SMB2_tcon()
2142 tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess); in SMB2_tcon()
2143 tcon->tid = le32_to_cpu(rsp->hdr.Id.SyncId.TreeId); in SMB2_tcon()
2144 strscpy(tcon->tree_name, tree, sizeof(tcon->tree_name)); in SMB2_tcon()
2146 if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) && in SMB2_tcon()
2147 ((tcon->share_flags & SHI1005_FLAGS_DFS) == 0)) in SMB2_tcon()
2150 if (tcon->seal && in SMB2_tcon()
2151 !(server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_tcon()
2155 if (server->ops->validate_negotiate) in SMB2_tcon()
2156 rc = server->ops->validate_negotiate(xid, tcon); in SMB2_tcon()
2157 if (rc == 0) /* See MS-SMB2 2.2.10 and 3.2.5.5 */ in SMB2_tcon()
2158 if (tcon->share_flags & SMB2_SHAREFLAG_ISOLATED_TRANSPORT) in SMB2_tcon()
2159 server->nosharesock = true; in SMB2_tcon()
2167 if (rsp && rsp->hdr.Status == STATUS_BAD_NETWORK_NAME) in SMB2_tcon()
2178 struct cifs_ses *ses = tcon->ses; in SMB2_tdis()
2188 if (!ses || !(ses->server)) in SMB2_tdis()
2189 return -EIO; in SMB2_tdis()
2191 trace_smb3_tdis_enter(xid, tcon->tid, ses->Suid, tcon->tree_name); in SMB2_tdis()
2192 spin_lock(&ses->chan_lock); in SMB2_tdis()
2193 if ((tcon->need_reconnect) || in SMB2_tdis()
2194 (CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses))) { in SMB2_tdis()
2195 spin_unlock(&ses->chan_lock); in SMB2_tdis()
2198 spin_unlock(&ses->chan_lock); in SMB2_tdis()
2225 trace_smb3_tdis_err(xid, tcon->tid, ses->Suid, rc); in SMB2_tdis()
2227 trace_smb3_tdis_done(xid, tcon->tid, ses->Suid); in SMB2_tdis()
2242 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_buf()
2244 buf->ccontext.DataLength = cpu_to_le32(16); in create_durable_buf()
2245 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_buf()
2247 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_buf()
2249 buf->Name[0] = 'D'; in create_durable_buf()
2250 buf->Name[1] = 'H'; in create_durable_buf()
2251 buf->Name[2] = 'n'; in create_durable_buf()
2252 buf->Name[3] = 'Q'; in create_durable_buf()
2265 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
2267 buf->ccontext.DataLength = cpu_to_le32(16); in create_reconnect_durable_buf()
2268 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
2270 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_buf()
2271 buf->Data.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_buf()
2272 buf->Data.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_buf()
2274 buf->Name[0] = 'D'; in create_reconnect_durable_buf()
2275 buf->Name[1] = 'H'; in create_reconnect_durable_buf()
2276 buf->Name[2] = 'n'; in create_reconnect_durable_buf()
2277 buf->Name[3] = 'C'; in create_reconnect_durable_buf()
2287 pdisk_id->DiskFileId, pdisk_id->VolumeId); in parse_query_id_ctxt()
2288 buf->IndexNumber = pdisk_id->DiskFileId; in parse_query_id_ctxt()
2296 u8 *beg = (u8 *)cc + le16_to_cpu(cc->DataOffset); in parse_posix_ctxt()
2297 u8 *end = beg + le32_to_cpu(cc->DataLength); in parse_posix_ctxt()
2302 posix->nlink = le32_to_cpu(*(__le32 *)(beg + 0)); in parse_posix_ctxt()
2303 posix->reparse_tag = le32_to_cpu(*(__le32 *)(beg + 4)); in parse_posix_ctxt()
2304 posix->mode = le32_to_cpu(*(__le32 *)(beg + 8)); in parse_posix_ctxt()
2312 memcpy(&posix->owner, sid, sid_len); in parse_posix_ctxt()
2320 memcpy(&posix->group, sid, sid_len); in parse_posix_ctxt()
2323 posix->nlink, posix->mode, posix->reparse_tag); in parse_posix_ctxt()
2333 struct smb2_create_rsp *rsp = rsp_iov->iov_base; in smb2_parse_contexts()
2347 off = le32_to_cpu(rsp->CreateContextsOffset); in smb2_parse_contexts()
2348 rem = le32_to_cpu(rsp->CreateContextsLength); in smb2_parse_contexts()
2349 if (check_add_overflow(off, rem, &len) || len > rsp_iov->iov_len) in smb2_parse_contexts()
2350 return -EINVAL; in smb2_parse_contexts()
2355 buf->IndexNumber = 0; in smb2_parse_contexts()
2358 doff = le16_to_cpu(cc->DataOffset); in smb2_parse_contexts()
2359 dlen = le32_to_cpu(cc->DataLength); in smb2_parse_contexts()
2361 return -EINVAL; in smb2_parse_contexts()
2363 noff = le16_to_cpu(cc->NameOffset); in smb2_parse_contexts()
2364 nlen = le16_to_cpu(cc->NameLength); in smb2_parse_contexts()
2366 return -EINVAL; in smb2_parse_contexts()
2372 *oplock = server->ops->parse_lease_buf(cc, epoch, in smb2_parse_contexts()
2391 off = le32_to_cpu(cc->Next); in smb2_parse_contexts()
2395 return -EINVAL; in smb2_parse_contexts()
2399 if (rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE) in smb2_parse_contexts()
2400 *oplock = rsp->OplockLevel; in smb2_parse_contexts()
2417 iov[num].iov_base = server->ops->create_lease_buf(lease_key, *oplock, in add_lease_context()
2420 return -ENOMEM; in add_lease_context()
2421 iov[num].iov_len = server->vals->create_lease_size; in add_lease_context()
2422 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE; in add_lease_context()
2430 struct cifs_fid *pfid = oparms->fid; in create_durable_v2_buf()
2437 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2439 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct durable_context_v2)); in create_durable_v2_buf()
2440 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2442 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_v2_buf()
2451 buf->dcontext.Timeout = cpu_to_le32(oparms->tcon->handle_timeout); in create_durable_v2_buf()
2452 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_durable_v2_buf()
2455 if (!oparms->replay) { in create_durable_v2_buf()
2456 generate_random_uuid(buf->dcontext.CreateGuid); in create_durable_v2_buf()
2457 memcpy(pfid->create_guid, buf->dcontext.CreateGuid, 16); in create_durable_v2_buf()
2459 memcpy(buf->dcontext.CreateGuid, pfid->create_guid, 16); in create_durable_v2_buf()
2462 buf->Name[0] = 'D'; in create_durable_v2_buf()
2463 buf->Name[1] = 'H'; in create_durable_v2_buf()
2464 buf->Name[2] = '2'; in create_durable_v2_buf()
2465 buf->Name[3] = 'Q'; in create_durable_v2_buf()
2479 buf->ccontext.DataOffset = in create_reconnect_durable_v2_buf()
2482 buf->ccontext.DataLength = in create_reconnect_durable_v2_buf()
2484 buf->ccontext.NameOffset = in create_reconnect_durable_v2_buf()
2487 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_v2_buf()
2489 buf->dcontext.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_v2_buf()
2490 buf->dcontext.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_v2_buf()
2491 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_reconnect_durable_v2_buf()
2492 memcpy(buf->dcontext.CreateGuid, fid->create_guid, 16); in create_reconnect_durable_v2_buf()
2495 buf->Name[0] = 'D'; in create_reconnect_durable_v2_buf()
2496 buf->Name[1] = 'H'; in create_reconnect_durable_v2_buf()
2497 buf->Name[2] = '2'; in create_reconnect_durable_v2_buf()
2498 buf->Name[3] = 'C'; in create_reconnect_durable_v2_buf()
2510 return -ENOMEM; in add_durable_v2_context()
2523 oparms->reconnect = false; in add_durable_reconnect_v2_context()
2525 iov[num].iov_base = create_reconnect_durable_v2_buf(oparms->fid); in add_durable_reconnect_v2_context()
2527 return -ENOMEM; in add_durable_reconnect_v2_context()
2540 if (oparms->reconnect) in add_durable_context()
2547 if (oparms->reconnect) { in add_durable_context()
2548 iov[num].iov_base = create_reconnect_durable_buf(oparms->fid); in add_durable_context()
2550 oparms->reconnect = false; in add_durable_context()
2554 return -ENOMEM; in add_durable_context()
2560 /* See MS-SMB2 2.2.13.2.7 */
2570 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_twarp_buf()
2572 buf->ccontext.DataLength = cpu_to_le32(8); in create_twarp_buf()
2573 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_twarp_buf()
2575 buf->ccontext.NameLength = cpu_to_le16(4); in create_twarp_buf()
2577 buf->Name[0] = 'T'; in create_twarp_buf()
2578 buf->Name[1] = 'W'; in create_twarp_buf()
2579 buf->Name[2] = 'r'; in create_twarp_buf()
2580 buf->Name[3] = 'p'; in create_twarp_buf()
2581 buf->Timestamp = cpu_to_le64(timewarp); in create_twarp_buf()
2585 /* See MS-SMB2 2.2.13.2.7 */
2593 return -ENOMEM; in add_twarp_context()
2599 /* See http://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */
2604 /* Populate the user ownership fields S-1-5-88-1 */ in setup_owner_group_sids()
2605 sids->owner.Revision = 1; in setup_owner_group_sids()
2606 sids->owner.NumAuth = 3; in setup_owner_group_sids()
2607 sids->owner.Authority[5] = 5; in setup_owner_group_sids()
2608 sids->owner.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2609 sids->owner.SubAuthorities[1] = cpu_to_le32(1); in setup_owner_group_sids()
2610 sids->owner.SubAuthorities[2] = cpu_to_le32(current_fsuid().val); in setup_owner_group_sids()
2612 /* Populate the group ownership fields S-1-5-88-2 */ in setup_owner_group_sids()
2613 sids->group.Revision = 1; in setup_owner_group_sids()
2614 sids->group.NumAuth = 3; in setup_owner_group_sids()
2615 sids->group.Authority[5] = 5; in setup_owner_group_sids()
2616 sids->group.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2617 sids->group.SubAuthorities[1] = cpu_to_le32(2); in setup_owner_group_sids()
2618 sids->group.SubAuthorities[2] = cpu_to_le32(current_fsgid().val); in setup_owner_group_sids()
2620 …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()
2623 /* See MS-SMB2 2.2.13.2.2 and MS-DTYP 2.4.6 */
2648 owner_offset = ptr - (__u8 *)&buf->sd; in create_sd_buf()
2649 buf->sd.OffsetOwner = cpu_to_le32(owner_offset); in create_sd_buf()
2651 buf->sd.OffsetGroup = cpu_to_le32(group_offset); in create_sd_buf()
2656 buf->sd.OffsetOwner = 0; in create_sd_buf()
2657 buf->sd.OffsetGroup = 0; in create_sd_buf()
2660 buf->ccontext.DataOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, sd)); in create_sd_buf()
2661 buf->ccontext.NameOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, Name)); in create_sd_buf()
2662 buf->ccontext.NameLength = cpu_to_le16(4); in create_sd_buf()
2664 buf->Name[0] = 'S'; in create_sd_buf()
2665 buf->Name[1] = 'e'; in create_sd_buf()
2666 buf->Name[2] = 'c'; in create_sd_buf()
2667 buf->Name[3] = 'D'; in create_sd_buf()
2668 buf->sd.Revision = 1; /* Must be one see MS-DTYP 2.4.6 */ in create_sd_buf()
2674 buf->sd.Control = cpu_to_le16(ACL_CONTROL_SR | ACL_CONTROL_DP); in create_sd_buf()
2677 buf->sd.OffsetDacl = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2702 acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */ in create_sd_buf()
2708 buf->ccontext.DataLength = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2709 *len = round_up((unsigned int)(ptr - (__u8 *)buf), 8); in create_sd_buf()
2722 return -ENOMEM; in add_sd_context()
2737 buf->ccontext.DataOffset = cpu_to_le16(0); in create_query_id_buf()
2738 buf->ccontext.DataLength = cpu_to_le32(0); in create_query_id_buf()
2739 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_query_id_buf()
2741 buf->ccontext.NameLength = cpu_to_le16(4); in create_query_id_buf()
2743 buf->Name[0] = 'Q'; in create_query_id_buf()
2744 buf->Name[1] = 'F'; in create_query_id_buf()
2745 buf->Name[2] = 'i'; in create_query_id_buf()
2746 buf->Name[3] = 'd'; in create_query_id_buf()
2750 /* See MS-SMB2 2.2.13.2.9 */
2758 return -ENOMEM; in add_query_id_context()
2767 struct kvec *iov = oparms->ea_cctx; in add_ea_context()
2769 if (iov && iov->iov_base && iov->iov_len) { in add_ea_context()
2788 return -EINVAL; in alloc_path_with_tree_prefix()
2791 treename_len -= 2; in alloc_path_with_tree_prefix()
2799 * final path needs to be 8-byte aligned as specified in in alloc_path_with_tree_prefix()
2800 * MS-SMB2 2.2.13 SMB2 CREATE Request. in alloc_path_with_tree_prefix()
2805 return -ENOMEM; in alloc_path_with_tree_prefix()
2829 struct cifs_ses *ses = tcon->ses; in smb311_posix_mkdir()
2844 int retries = 0, cur_sleep = 1; in smb311_posix_mkdir() local
2857 return -ENOMEM; in smb311_posix_mkdir()
2860 rc = -EIO; in smb311_posix_mkdir()
2874 req->ImpersonationLevel = IL_IMPERSONATION; in smb311_posix_mkdir()
2875 req->DesiredAccess = cpu_to_le32(FILE_WRITE_ATTRIBUTES); in smb311_posix_mkdir()
2877 req->FileAttributes = cpu_to_le32(file_attributes); in smb311_posix_mkdir()
2878 req->ShareAccess = FILE_SHARE_ALL_LE; in smb311_posix_mkdir()
2879 req->CreateDisposition = cpu_to_le32(FILE_CREATE); in smb311_posix_mkdir()
2880 req->CreateOptions = cpu_to_le32(CREATE_NOT_FILE); in smb311_posix_mkdir()
2883 /* -1 since last byte is buf[0] which is sent below (path) */ in smb311_posix_mkdir()
2884 iov[0].iov_len = total_len - 1; in smb311_posix_mkdir()
2886 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in smb311_posix_mkdir()
2888 /* [MS-SMB2] 2.2.13 NameOffset: in smb311_posix_mkdir()
2896 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in smb311_posix_mkdir()
2899 req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in smb311_posix_mkdir()
2902 tcon->tree_name, utf16_path); in smb311_posix_mkdir()
2906 req->NameLength = cpu_to_le16(name_len * 2); in smb311_posix_mkdir()
2914 req->NameLength = cpu_to_le16(uni_path_len - 2); in smb311_posix_mkdir()
2919 rc = -ENOMEM; in smb311_posix_mkdir()
2933 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_NONE; in smb311_posix_mkdir()
2935 if (tcon->posix_extensions) { in smb311_posix_mkdir()
2940 req->CreateContextsOffset = cpu_to_le32( in smb311_posix_mkdir()
2943 le32_add_cpu(&req->CreateContextsLength, iov[n_iov-1].iov_len); in smb311_posix_mkdir()
2944 pc_buf = iov[n_iov-1].iov_base; in smb311_posix_mkdir()
2953 trace_smb3_posix_mkdir_enter(xid, tcon->tid, ses->Suid, full_path, CREATE_NOT_FILE, in smb311_posix_mkdir()
2956 if (retries) in smb311_posix_mkdir()
2964 trace_smb3_posix_mkdir_err(xid, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2977 rc = -EIO; in smb311_posix_mkdir()
2982 trace_smb3_posix_mkdir_done(xid, rsp->PersistentFileId, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2985 SMB2_close(xid, tcon, rsp->PersistentFileId, rsp->VolatileFileId); in smb311_posix_mkdir()
2998 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb311_posix_mkdir()
3015 struct kvec *iov = rqst->rq_iov; in SMB2_open_init()
3025 /* -1 since last byte is buf[0] which is sent below (path) */ in SMB2_open_init()
3026 iov[0].iov_len = total_len - 1; in SMB2_open_init()
3028 if (oparms->create_options & CREATE_OPTION_READONLY) in SMB2_open_init()
3030 if (oparms->create_options & CREATE_OPTION_SPECIAL) in SMB2_open_init()
3033 req->ImpersonationLevel = IL_IMPERSONATION; in SMB2_open_init()
3034 req->DesiredAccess = cpu_to_le32(oparms->desired_access); in SMB2_open_init()
3036 req->FileAttributes = cpu_to_le32(file_attributes); in SMB2_open_init()
3037 req->ShareAccess = FILE_SHARE_ALL_LE; in SMB2_open_init()
3039 req->CreateDisposition = cpu_to_le32(oparms->disposition); in SMB2_open_init()
3040 req->CreateOptions = cpu_to_le32(oparms->create_options & CREATE_OPTIONS_MASK); in SMB2_open_init()
3041 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in SMB2_open_init()
3043 /* [MS-SMB2] 2.2.13 NameOffset: in SMB2_open_init()
3051 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in SMB2_open_init()
3054 req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in SMB2_open_init()
3057 tcon->tree_name, path); in SMB2_open_init()
3060 req->NameLength = cpu_to_le16(name_len * 2); in SMB2_open_init()
3066 req->NameLength = cpu_to_le16(uni_path_len - 2); in SMB2_open_init()
3070 return -ENOMEM; in SMB2_open_init()
3080 if ((!server->oplocks) || (tcon->no_lease)) in SMB2_open_init()
3083 if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) || in SMB2_open_init()
3085 req->RequestedOplockLevel = *oplock; in SMB2_open_init()
3086 else if (!(server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) && in SMB2_open_init()
3087 (oparms->create_options & CREATE_NOT_FILE)) in SMB2_open_init()
3088 req->RequestedOplockLevel = *oplock; /* no srv lease support */ in SMB2_open_init()
3091 oparms->fid->lease_key, oplock, in SMB2_open_init()
3092 oparms->fid->parent_lease_key, in SMB2_open_init()
3093 oparms->lease_flags); in SMB2_open_init()
3100 tcon->use_persistent); in SMB2_open_init()
3105 if (tcon->posix_extensions) { in SMB2_open_init()
3106 rc = add_posix_context(iov, &n_iov, oparms->mode); in SMB2_open_init()
3111 if (tcon->snapshot_time) { in SMB2_open_init()
3113 rc = add_twarp_context(iov, &n_iov, tcon->snapshot_time); in SMB2_open_init()
3118 if ((oparms->disposition != FILE_OPEN) && (oparms->cifs_sb)) { in SMB2_open_init()
3122 if ((oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) && in SMB2_open_init()
3123 (oparms->mode != ACL_NO_MODE)) in SMB2_open_init()
3127 oparms->mode = ACL_NO_MODE; in SMB2_open_init()
3130 if (oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL) in SMB2_open_init()
3136 cifs_dbg(FYI, "add sd with mode 0x%x\n", oparms->mode); in SMB2_open_init()
3137 rc = add_sd_context(iov, &n_iov, oparms->mode, set_owner); in SMB2_open_init()
3151 req->CreateContextsOffset = cpu_to_le32( in SMB2_open_init()
3154 req->CreateContextsLength = 0; in SMB2_open_init()
3156 for (unsigned int i = 2; i < (n_iov-1); i++) { in SMB2_open_init()
3158 size_t len = v->iov_len; in SMB2_open_init()
3160 (struct create_context *)v->iov_base; in SMB2_open_init()
3162 cctx->Next = cpu_to_le32(len); in SMB2_open_init()
3163 le32_add_cpu(&req->CreateContextsLength, len); in SMB2_open_init()
3165 le32_add_cpu(&req->CreateContextsLength, in SMB2_open_init()
3166 iov[n_iov-1].iov_len); in SMB2_open_init()
3169 rqst->rq_nvec = n_iov; in SMB2_open_init()
3181 if (rqst && rqst->rq_iov) { in SMB2_open_free()
3182 cifs_small_buf_release(rqst->rq_iov[0].iov_base); in SMB2_open_free()
3183 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_open_free()
3184 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_open_free()
3185 kfree(rqst->rq_iov[i].iov_base); in SMB2_open_free()
3197 struct cifs_tcon *tcon = oparms->tcon; in SMB2_open()
3198 struct cifs_ses *ses = tcon->ses; in SMB2_open()
3205 int retries = 0, cur_sleep = 1; in SMB2_open() local
3211 oparms->replay = !!(retries); in SMB2_open()
3215 return -EIO; in SMB2_open()
3230 trace_smb3_open_enter(xid, tcon->tid, tcon->ses->Suid, oparms->path, in SMB2_open()
3231 oparms->create_options, oparms->desired_access); in SMB2_open()
3233 if (retries) in SMB2_open()
3249 trace_smb3_open_err(xid, tcon->tid, ses->Suid, in SMB2_open()
3250 oparms->create_options, oparms->desired_access, rc); in SMB2_open()
3251 if (rc == -EREMCHG) { in SMB2_open()
3253 tcon->tree_name); in SMB2_open()
3254 tcon->need_reconnect = true; in SMB2_open()
3260 trace_smb3_open_done(xid, rsp->PersistentFileId, tcon->tid, ses->Suid, in SMB2_open()
3261 oparms->create_options, oparms->desired_access); in SMB2_open()
3263 atomic_inc(&tcon->num_remote_opens); in SMB2_open()
3264 oparms->fid->persistent_fid = rsp->PersistentFileId; in SMB2_open()
3265 oparms->fid->volatile_fid = rsp->VolatileFileId; in SMB2_open()
3266 oparms->fid->access = oparms->desired_access; in SMB2_open()
3268 oparms->fid->mid = le64_to_cpu(rsp->hdr.MessageId); in SMB2_open()
3272 buf->CreationTime = rsp->CreationTime; in SMB2_open()
3273 buf->LastAccessTime = rsp->LastAccessTime; in SMB2_open()
3274 buf->LastWriteTime = rsp->LastWriteTime; in SMB2_open()
3275 buf->ChangeTime = rsp->ChangeTime; in SMB2_open()
3276 buf->AllocationSize = rsp->AllocationSize; in SMB2_open()
3277 buf->EndOfFile = rsp->EndofFile; in SMB2_open()
3278 buf->Attributes = rsp->FileAttributes; in SMB2_open()
3279 buf->NumberOfLinks = cpu_to_le32(1); in SMB2_open()
3280 buf->DeletePending = 0; /* successful open = not delete pending */ in SMB2_open()
3284 rc = smb2_parse_contexts(server, &rsp_iov, &oparms->fid->epoch, in SMB2_open()
3285 oparms->fid->lease_key, oplock, buf, posix); in SMB2_open()
3291 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_open()
3305 struct kvec *iov = rqst->rq_iov; in SMB2_ioctl_init()
3317 * indatalen is usually small at a couple of bytes max, so in SMB2_ioctl_init()
3323 return -ENOMEM; in SMB2_ioctl_init()
3327 req->CtlCode = cpu_to_le32(opcode); in SMB2_ioctl_init()
3328 req->PersistentFileId = persistent_fid; in SMB2_ioctl_init()
3329 req->VolatileFileId = volatile_fid; in SMB2_ioctl_init()
3341 req->InputCount = cpu_to_le32(indatalen); in SMB2_ioctl_init()
3343 req->InputOffset = in SMB2_ioctl_init()
3345 rqst->rq_nvec = 2; in SMB2_ioctl_init()
3346 iov[0].iov_len = total_len - 1; in SMB2_ioctl_init()
3350 rqst->rq_nvec = 1; in SMB2_ioctl_init()
3354 req->OutputOffset = 0; in SMB2_ioctl_init()
3355 req->OutputCount = 0; /* MBZ */ in SMB2_ioctl_init()
3369 * of eight bytes. Currently that is the only case where we set max in SMB2_ioctl_init()
3372 req->MaxOutputResponse = cpu_to_le32(max_response_size); in SMB2_ioctl_init()
3373 req->hdr.CreditCharge = in SMB2_ioctl_init()
3374 cpu_to_le16(DIV_ROUND_UP(max(indatalen, max_response_size), in SMB2_ioctl_init()
3377 req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL); in SMB2_ioctl_init()
3379 /* validate negotiate request must be signed - see MS-SMB2 3.2.5.5 */ in SMB2_ioctl_init()
3381 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_ioctl_init()
3391 if (rqst && rqst->rq_iov) { in SMB2_ioctl_free()
3392 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_ioctl_free()
3393 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_ioctl_free()
3394 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_ioctl_free()
3395 kfree(rqst->rq_iov[i].iov_base); in SMB2_ioctl_free()
3418 int retries = 0, cur_sleep = 1; in SMB2_ioctl() local
3421 return -EIO; in SMB2_ioctl()
3423 ses = tcon->ses; in SMB2_ioctl()
3425 return -EIO; in SMB2_ioctl()
3433 return -EIO; in SMB2_ioctl()
3458 if (retries) in SMB2_ioctl()
3467 trace_smb3_fsctl_err(xid, persistent_fid, tcon->tid, in SMB2_ioctl()
3468 ses->Suid, 0, opcode, rc); in SMB2_ioctl()
3470 if ((rc != 0) && (rc != -EINVAL) && (rc != -E2BIG)) { in SMB2_ioctl()
3473 } else if (rc == -EINVAL) { in SMB2_ioctl()
3479 } else if (rc == -E2BIG) { in SMB2_ioctl()
3496 rc = -EIO; in SMB2_ioctl()
3500 *plen = le32_to_cpu(rsp->OutputCount); in SMB2_ioctl()
3508 rc = -EIO; in SMB2_ioctl()
3512 if (rsp_iov.iov_len - *plen < le32_to_cpu(rsp->OutputOffset)) { in SMB2_ioctl()
3514 le32_to_cpu(rsp->OutputOffset)); in SMB2_ioctl()
3516 rc = -EIO; in SMB2_ioctl()
3520 *out_data = kmemdup((char *)rsp + le32_to_cpu(rsp->OutputOffset), in SMB2_ioctl()
3523 rc = -ENOMEM; in SMB2_ioctl()
3532 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_ioctl()
3556 2 /* in data len */, CIFSMaxBufSize /* max out data */, in SMB2_set_compression()
3570 struct kvec *iov = rqst->rq_iov; in SMB2_close_init()
3579 req->PersistentFileId = persistent_fid; in SMB2_close_init()
3580 req->VolatileFileId = volatile_fid; in SMB2_close_init()
3582 req->Flags = SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB; in SMB2_close_init()
3584 req->Flags = 0; in SMB2_close_init()
3594 if (rqst && rqst->rq_iov) in SMB2_close_free()
3595 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_close_free()
3605 struct cifs_ses *ses = tcon->ses; in __SMB2_close()
3613 int retries = 0, cur_sleep = 1; in __SMB2_close() local
3624 return -EIO; in __SMB2_close()
3638 trace_smb3_close_enter(xid, persistent_fid, tcon->tid, ses->Suid); in __SMB2_close()
3645 if (retries) in __SMB2_close()
3654 trace_smb3_close_err(xid, persistent_fid, tcon->tid, ses->Suid, in __SMB2_close()
3658 trace_smb3_close_done(xid, persistent_fid, tcon->tid, in __SMB2_close()
3659 ses->Suid); in __SMB2_close()
3661 memcpy(&pbuf->network_open_info, in __SMB2_close()
3662 &rsp->network_open_info, in __SMB2_close()
3663 sizeof(pbuf->network_open_info)); in __SMB2_close()
3664 atomic_dec(&tcon->num_remote_opens); in __SMB2_close()
3683 smb2_should_replay(tcon, &retries, &cur_sleep)) in __SMB2_close()
3700 unsigned int smb_len = iov->iov_len; in smb2_validate_iov()
3701 char *end_of_smb = smb_len + (char *)iov->iov_base; in smb2_validate_iov()
3702 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_iov()
3709 return -EINVAL; in smb2_validate_iov()
3716 return -EINVAL; in smb2_validate_iov()
3721 return -EINVAL; in smb2_validate_iov()
3736 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_and_copy_iov()
3740 return -EINVAL; in smb2_validate_and_copy_iov()
3759 struct kvec *iov = rqst->rq_iov; in SMB2_query_info_init()
3766 return -EINVAL; in SMB2_query_info_init()
3773 req->InfoType = info_type; in SMB2_query_info_init()
3774 req->FileInfoClass = info_class; in SMB2_query_info_init()
3775 req->PersistentFileId = persistent_fid; in SMB2_query_info_init()
3776 req->VolatileFileId = volatile_fid; in SMB2_query_info_init()
3777 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_query_info_init()
3779 req->OutputBufferLength = cpu_to_le32(output_len); in SMB2_query_info_init()
3781 req->InputBufferLength = cpu_to_le32(input_len); in SMB2_query_info_init()
3782 /* total_len for smb query request never close to le16 max */ in SMB2_query_info_init()
3783 req->InputBufferOffset = cpu_to_le16(total_len - 1); in SMB2_query_info_init()
3784 memcpy(req->Buffer, input, input_len); in SMB2_query_info_init()
3796 if (rqst && rqst->rq_iov) in SMB2_query_info_free()
3797 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_info_free()
3812 struct cifs_ses *ses = tcon->ses; in query_info()
3816 int retries = 0, cur_sleep = 1; in query_info() local
3821 return -EIO; in query_info()
3830 return -EIO; in query_info()
3847 trace_smb3_query_info_enter(xid, persistent_fid, tcon->tid, in query_info()
3848 ses->Suid, info_class, (__u32)info_type); in query_info()
3850 if (retries) in query_info()
3859 trace_smb3_query_info_err(xid, persistent_fid, tcon->tid, in query_info()
3860 ses->Suid, info_class, (__u32)info_type, rc); in query_info()
3864 trace_smb3_query_info_done(xid, persistent_fid, tcon->tid, in query_info()
3865 ses->Suid, info_class, (__u32)info_type); in query_info()
3868 *dlen = le32_to_cpu(rsp->OutputBufferLength); in query_info()
3876 rc = -ENOMEM; in query_info()
3883 rc = smb2_validate_and_copy_iov(le16_to_cpu(rsp->OutputBufferOffset), in query_info()
3884 le32_to_cpu(rsp->OutputBufferLength), in query_info()
3897 smb2_should_replay(tcon, &retries, &cur_sleep)) in query_info()
3955 * See MS-SMB2 2.2.35 and 2.2.36
3965 struct kvec *iov = rqst->rq_iov; in SMB2_notify_init()
3974 req->PersistentFileId = persistent_fid; in SMB2_notify_init()
3975 req->VolatileFileId = volatile_fid; in SMB2_notify_init()
3976 /* See note 354 of MS-SMB2, 64K max */ in SMB2_notify_init()
3977 req->OutputBufferLength = in SMB2_notify_init()
3978 cpu_to_le32(SMB2_MAX_BUFFER_SIZE - MAX_SMB2_HDR_SIZE); in SMB2_notify_init()
3979 req->CompletionFilter = cpu_to_le32(completion_filter); in SMB2_notify_init()
3981 req->Flags = cpu_to_le16(SMB2_WATCH_TREE); in SMB2_notify_init()
3983 req->Flags = 0; in SMB2_notify_init()
3997 struct cifs_ses *ses = tcon->ses; in SMB2_change_notify()
4006 int retries = 0, cur_sleep = 1; in SMB2_change_notify() local
4015 return -EIO; in SMB2_change_notify()
4034 trace_smb3_notify_enter(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
4037 if (retries) in SMB2_change_notify()
4045 trace_smb3_notify_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
4048 trace_smb3_notify_done(xid, persistent_fid, tcon->tid, in SMB2_change_notify()
4049 ses->Suid, (u8)watch_tree, completion_filter); in SMB2_change_notify()
4057 smb2_validate_iov(le16_to_cpu(smb_rsp->OutputBufferOffset), in SMB2_change_notify()
4058 le32_to_cpu(smb_rsp->OutputBufferLength), &rsp_iov, in SMB2_change_notify()
4061 *out_data = kmemdup((char *)smb_rsp + le16_to_cpu(smb_rsp->OutputBufferOffset), in SMB2_change_notify()
4062 le32_to_cpu(smb_rsp->OutputBufferLength), GFP_KERNEL); in SMB2_change_notify()
4064 rc = -ENOMEM; in SMB2_change_notify()
4067 *plen = le32_to_cpu(smb_rsp->OutputBufferLength); in SMB2_change_notify()
4076 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_change_notify()
4085 * This is a no-op for now. We're not really interested in the reply, but
4086 * rather in the fact that the server sent one and that server->lstrp
4094 struct TCP_Server_Info *server = mid->callback_data; in smb2_echo_callback()
4095 struct smb2_echo_rsp *rsp = (struct smb2_echo_rsp *)mid->resp_buf; in smb2_echo_callback()
4098 if (mid->mid_state == MID_RESPONSE_RECEIVED in smb2_echo_callback()
4099 || mid->mid_state == MID_RESPONSE_MALFORMED) { in smb2_echo_callback()
4100 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_echo_callback()
4101 credits.instance = server->reconnect_instance; in smb2_echo_callback()
4116 spin_lock(&tcon->sb_list_lock); in cifs_renegotiate_iosize()
4117 list_for_each_entry(cifs_sb, &tcon->cifs_sb_list, tcon_sb_link) in cifs_renegotiate_iosize()
4118 cifs_negotiate_iosize(server, cifs_sb->ctx, tcon); in cifs_renegotiate_iosize()
4119 spin_unlock(&tcon->sb_list_lock); in cifs_renegotiate_iosize()
4137 if (!server->srv_count) { in smb2_reconnect_server()
4141 server->srv_count++; in smb2_reconnect_server()
4145 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_reconnect_server()
4147 /* Prevent simultaneous reconnects that can corrupt tcon->rlist list */ in smb2_reconnect_server()
4148 mutex_lock(&pserver->reconnect_mutex); in smb2_reconnect_server()
4151 if (server->terminate) { in smb2_reconnect_server()
4153 mutex_unlock(&pserver->reconnect_mutex); in smb2_reconnect_server()
4162 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_reconnect_server()
4163 spin_lock(&ses->ses_lock); in smb2_reconnect_server()
4164 if (ses->ses_status == SES_EXITING) { in smb2_reconnect_server()
4165 spin_unlock(&ses->ses_lock); in smb2_reconnect_server()
4168 spin_unlock(&ses->ses_lock); in smb2_reconnect_server()
4172 list_for_each_entry(tcon, &ses->tcon_list, tcon_list) { in smb2_reconnect_server()
4173 if (tcon->need_reconnect || tcon->need_reopen_files) { in smb2_reconnect_server()
4174 tcon->tc_count++; in smb2_reconnect_server()
4175 trace_smb3_tcon_ref(tcon->debug_id, tcon->tc_count, in smb2_reconnect_server()
4177 list_add_tail(&tcon->rlist, &tmp_list); in smb2_reconnect_server()
4185 if (ses->tcon_ipc && ses->tcon_ipc->need_reconnect) { in smb2_reconnect_server()
4186 list_add_tail(&ses->tcon_ipc->rlist, &tmp_list); in smb2_reconnect_server()
4195 spin_lock(&ses->chan_lock); in smb2_reconnect_server()
4197 list_add_tail(&ses->rlist, &tmp_ses_list); in smb2_reconnect_server()
4201 spin_unlock(&ses->chan_lock); in smb2_reconnect_server()
4212 list_del_init(&tcon->rlist); in smb2_reconnect_server()
4213 if (tcon->ipc) in smb2_reconnect_server()
4214 cifs_put_smb_ses(tcon->ses); in smb2_reconnect_server()
4227 list_del_init(&ses->rlist); in smb2_reconnect_server()
4232 tcon->status = TID_GOOD; in smb2_reconnect_server()
4233 tcon->dummy = true; in smb2_reconnect_server()
4237 tcon->ses = ses; in smb2_reconnect_server()
4241 list_del_init(&ses->rlist); in smb2_reconnect_server()
4249 queue_delayed_work(cifsiod_wq, &server->reconnect, 2 * HZ); in smb2_reconnect_server()
4250 mutex_unlock(&pserver->reconnect_mutex); in smb2_reconnect_server()
4266 cifs_dbg(FYI, "In echo request for conn_id %lld\n", server->conn_id); in SMB2_echo()
4268 spin_lock(&server->srv_lock); in SMB2_echo()
4269 if (server->ops->need_neg && in SMB2_echo()
4270 server->ops->need_neg(server)) { in SMB2_echo()
4271 spin_unlock(&server->srv_lock); in SMB2_echo()
4273 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in SMB2_echo()
4276 spin_unlock(&server->srv_lock); in SMB2_echo()
4283 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_echo()
4300 if (rqst && rqst->rq_iov) in SMB2_flush_free()
4301 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_flush_free()
4310 struct kvec *iov = rqst->rq_iov; in SMB2_flush_init()
4319 req->PersistentFileId = persistent_fid; in SMB2_flush_init()
4320 req->VolatileFileId = volatile_fid; in SMB2_flush_init()
4332 struct cifs_ses *ses = tcon->ses; in SMB2_flush()
4340 int retries = 0, cur_sleep = 1; in SMB2_flush() local
4348 if (!ses || !(ses->server)) in SMB2_flush()
4349 return -EIO; in SMB2_flush()
4364 trace_smb3_flush_enter(xid, persistent_fid, tcon->tid, ses->Suid); in SMB2_flush()
4366 if (retries) in SMB2_flush()
4374 trace_smb3_flush_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_flush()
4377 trace_smb3_flush_done(xid, persistent_fid, tcon->tid, in SMB2_flush()
4378 ses->Suid); in SMB2_flush()
4385 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_flush()
4394 struct TCP_Server_Info *server = io_parms->server; in smb3_use_rdma_offload()
4395 struct cifs_tcon *tcon = io_parms->tcon; in smb3_use_rdma_offload()
4402 if (!server->rdma || !server->smbd_conn) in smb3_use_rdma_offload()
4406 if (server->sign) in smb3_use_rdma_offload()
4414 if (io_parms->length < server->rdma_readwrite_threshold) in smb3_use_rdma_offload()
4430 int rc = -EACCES; in smb2_new_read_req()
4433 struct TCP_Server_Info *server = io_parms->server; in smb2_new_read_req()
4435 rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server, in smb2_new_read_req()
4441 return -ECONNABORTED; in smb2_new_read_req()
4443 shdr = &req->hdr; in smb2_new_read_req()
4444 shdr->Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in smb2_new_read_req()
4446 req->PersistentFileId = io_parms->persistent_fid; in smb2_new_read_req()
4447 req->VolatileFileId = io_parms->volatile_fid; in smb2_new_read_req()
4448 req->ReadChannelInfoOffset = 0; /* reserved */ in smb2_new_read_req()
4449 req->ReadChannelInfoLength = 0; /* reserved */ in smb2_new_read_req()
4450 req->Channel = 0; /* reserved */ in smb2_new_read_req()
4451 req->MinimumCount = 0; in smb2_new_read_req()
4452 req->Length = cpu_to_le32(io_parms->length); in smb2_new_read_req()
4453 req->Offset = cpu_to_le64(io_parms->offset); in smb2_new_read_req()
4455 trace_smb3_read_enter(rdata ? rdata->rreq->debug_id : 0, in smb2_new_read_req()
4456 rdata ? rdata->subreq.debug_index : 0, in smb2_new_read_req()
4457 rdata ? rdata->xid : 0, in smb2_new_read_req()
4458 io_parms->persistent_fid, in smb2_new_read_req()
4459 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in smb2_new_read_req()
4460 io_parms->offset, io_parms->length); in smb2_new_read_req()
4468 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_new_read_req()
4470 rdata->mr = smbd_register_mr(server->smbd_conn, &rdata->subreq.io_iter, in smb2_new_read_req()
4472 if (!rdata->mr) in smb2_new_read_req()
4473 return -EAGAIN; in smb2_new_read_req()
4475 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_new_read_req()
4477 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_new_read_req()
4478 req->ReadChannelInfoOffset = in smb2_new_read_req()
4480 req->ReadChannelInfoLength = in smb2_new_read_req()
4482 v1 = (struct smbdirect_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_new_read_req()
4483 v1->offset = cpu_to_le64(rdata->mr->mr->iova); in smb2_new_read_req()
4484 v1->token = cpu_to_le32(rdata->mr->mr->rkey); in smb2_new_read_req()
4485 v1->length = cpu_to_le32(rdata->mr->mr->length); in smb2_new_read_req()
4487 *total_len += sizeof(*v1) - 1; in smb2_new_read_req()
4492 /* next 8-byte aligned request */ in smb2_new_read_req()
4494 shdr->NextCommand = cpu_to_le32(*total_len); in smb2_new_read_req()
4496 shdr->NextCommand = 0; in smb2_new_read_req()
4498 shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; in smb2_new_read_req()
4503 shdr->SessionId = cpu_to_le64(0xFFFFFFFFFFFFFFFF); in smb2_new_read_req()
4504 shdr->Id.SyncId.TreeId = cpu_to_le32(0xFFFFFFFF); in smb2_new_read_req()
4505 req->PersistentFileId = (u64)-1; in smb2_new_read_req()
4506 req->VolatileFileId = (u64)-1; in smb2_new_read_req()
4509 if (remaining_bytes > io_parms->length) in smb2_new_read_req()
4510 req->RemainingBytes = cpu_to_le32(remaining_bytes); in smb2_new_read_req()
4512 req->RemainingBytes = 0; in smb2_new_read_req()
4521 struct cifs_io_subrequest *rdata = mid->callback_data; in smb2_readv_callback()
4522 struct netfs_inode *ictx = netfs_inode(rdata->rreq->inode); in smb2_readv_callback()
4523 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); in smb2_readv_callback()
4524 struct TCP_Server_Info *server = rdata->server; in smb2_readv_callback()
4526 (struct smb2_hdr *)rdata->iov[0].iov_base; in smb2_readv_callback()
4530 .rreq_debug_id = rdata->rreq->debug_id, in smb2_readv_callback()
4531 .rreq_debug_index = rdata->subreq.debug_index, in smb2_readv_callback()
4533 struct smb_rqst rqst = { .rq_iov = &rdata->iov[1], .rq_nvec = 1 }; in smb2_readv_callback()
4534 unsigned int rreq_debug_id = rdata->rreq->debug_id; in smb2_readv_callback()
4535 unsigned int subreq_debug_index = rdata->subreq.debug_index; in smb2_readv_callback()
4537 if (rdata->got_bytes) { in smb2_readv_callback()
4538 rqst.rq_iter = rdata->subreq.io_iter; in smb2_readv_callback()
4541 WARN_ONCE(rdata->server != mid->server, in smb2_readv_callback()
4543 rdata->server, mid->server); in smb2_readv_callback()
4546 __func__, mid->mid, mid->mid_state, rdata->result, in smb2_readv_callback()
4547 rdata->got_bytes, rdata->subreq.len - rdata->subreq.transferred); in smb2_readv_callback()
4549 switch (mid->mid_state) { in smb2_readv_callback()
4551 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
4552 credits.instance = server->reconnect_instance; in smb2_readv_callback()
4554 if (server->sign && !mid->decrypted) { in smb2_readv_callback()
4557 iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes); in smb2_readv_callback()
4564 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
4565 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
4568 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_req_submitted); in smb2_readv_callback()
4571 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_retry_needed); in smb2_readv_callback()
4573 __set_bit(NETFS_SREQ_NEED_RETRY, &rdata->subreq.flags); in smb2_readv_callback()
4574 rdata->result = -EAGAIN; in smb2_readv_callback()
4575 if (server->sign && rdata->got_bytes) in smb2_readv_callback()
4577 rdata->got_bytes = 0; in smb2_readv_callback()
4579 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
4580 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
4583 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_malformed); in smb2_readv_callback()
4584 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
4585 credits.instance = server->reconnect_instance; in smb2_readv_callback()
4586 rdata->result = -EIO; in smb2_readv_callback()
4589 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_unknown); in smb2_readv_callback()
4590 rdata->result = -EIO; in smb2_readv_callback()
4599 if (rdata->mr) { in smb2_readv_callback()
4600 smbd_deregister_mr(rdata->mr); in smb2_readv_callback()
4601 rdata->mr = NULL; in smb2_readv_callback()
4604 if (rdata->result && rdata->result != -ENODATA) { in smb2_readv_callback()
4606 trace_smb3_read_err(rdata->rreq->debug_id, in smb2_readv_callback()
4607 rdata->subreq.debug_index, in smb2_readv_callback()
4608 rdata->xid, in smb2_readv_callback()
4609 rdata->req->cfile->fid.persistent_fid, in smb2_readv_callback()
4610 tcon->tid, tcon->ses->Suid, in smb2_readv_callback()
4611 rdata->subreq.start + rdata->subreq.transferred, in smb2_readv_callback()
4612 rdata->subreq.len - rdata->subreq.transferred, in smb2_readv_callback()
4613 rdata->result); in smb2_readv_callback()
4615 trace_smb3_read_done(rdata->rreq->debug_id, in smb2_readv_callback()
4616 rdata->subreq.debug_index, in smb2_readv_callback()
4617 rdata->xid, in smb2_readv_callback()
4618 rdata->req->cfile->fid.persistent_fid, in smb2_readv_callback()
4619 tcon->tid, tcon->ses->Suid, in smb2_readv_callback()
4620 rdata->subreq.start + rdata->subreq.transferred, in smb2_readv_callback()
4621 rdata->got_bytes); in smb2_readv_callback()
4623 if (rdata->result == -ENODATA) { in smb2_readv_callback()
4624 __set_bit(NETFS_SREQ_HIT_EOF, &rdata->subreq.flags); in smb2_readv_callback()
4625 rdata->result = 0; in smb2_readv_callback()
4627 size_t trans = rdata->subreq.transferred + rdata->got_bytes; in smb2_readv_callback()
4628 if (trans < rdata->subreq.len && in smb2_readv_callback()
4629 rdata->subreq.start + trans == ictx->remote_i_size) { in smb2_readv_callback()
4630 __set_bit(NETFS_SREQ_HIT_EOF, &rdata->subreq.flags); in smb2_readv_callback()
4631 rdata->result = 0; in smb2_readv_callback()
4633 if (rdata->got_bytes) in smb2_readv_callback()
4634 __set_bit(NETFS_SREQ_MADE_PROGRESS, &rdata->subreq.flags); in smb2_readv_callback()
4636 trace_smb3_rw_credits(rreq_debug_id, subreq_debug_index, rdata->credits.value, in smb2_readv_callback()
4637 server->credits, server->in_flight, in smb2_readv_callback()
4639 rdata->credits.value = 0; in smb2_readv_callback()
4640 rdata->subreq.error = rdata->result; in smb2_readv_callback()
4641 rdata->subreq.transferred += rdata->got_bytes; in smb2_readv_callback()
4642 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_progress); in smb2_readv_callback()
4643 netfs_read_subreq_terminated(&rdata->subreq); in smb2_readv_callback()
4646 server->credits, server->in_flight, in smb2_readv_callback()
4651 /* smb2_async_readv - send an async read, and set up mid to handle result */
4657 struct netfs_io_subrequest *subreq = &rdata->subreq; in smb2_async_readv()
4660 struct smb_rqst rqst = { .rq_iov = rdata->iov, in smb2_async_readv()
4663 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); in smb2_async_readv()
4668 __func__, subreq->start, subreq->len); in smb2_async_readv()
4670 if (!rdata->server) in smb2_async_readv()
4671 rdata->server = cifs_pick_channel(tcon->ses); in smb2_async_readv()
4673 io_parms.tcon = tlink_tcon(rdata->req->cfile->tlink); in smb2_async_readv()
4674 io_parms.server = server = rdata->server; in smb2_async_readv()
4675 io_parms.offset = subreq->start + subreq->transferred; in smb2_async_readv()
4676 io_parms.length = subreq->len - subreq->transferred; in smb2_async_readv()
4677 io_parms.persistent_fid = rdata->req->cfile->fid.persistent_fid; in smb2_async_readv()
4678 io_parms.volatile_fid = rdata->req->cfile->fid.volatile_fid; in smb2_async_readv()
4679 io_parms.pid = rdata->req->pid; in smb2_async_readv()
4689 rdata->iov[0].iov_base = buf; in smb2_async_readv()
4690 rdata->iov[0].iov_len = total_len; in smb2_async_readv()
4691 rdata->got_bytes = 0; in smb2_async_readv()
4692 rdata->result = 0; in smb2_async_readv()
4696 if (rdata->credits.value > 0) { in smb2_async_readv()
4697 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(io_parms.length, in smb2_async_readv()
4699 credit_request = le16_to_cpu(shdr->CreditCharge) + 8; in smb2_async_readv()
4700 if (server->credits >= server->max_credits) in smb2_async_readv()
4701 shdr->CreditRequest = cpu_to_le16(0); in smb2_async_readv()
4703 shdr->CreditRequest = cpu_to_le16( in smb2_async_readv()
4704 min_t(int, server->max_credits - in smb2_async_readv()
4705 server->credits, credit_request)); in smb2_async_readv()
4717 &rdata->credits); in smb2_async_readv()
4720 trace_smb3_read_err(rdata->rreq->debug_id, in smb2_async_readv()
4721 subreq->debug_index, in smb2_async_readv()
4722 rdata->xid, io_parms.persistent_fid, in smb2_async_readv()
4723 io_parms.tcon->tid, in smb2_async_readv()
4724 io_parms.tcon->ses->Suid, in smb2_async_readv()
4726 subreq->len - subreq->transferred, rc); in smb2_async_readv()
4746 struct cifs_ses *ses = io_parms->tcon->ses; in SMB2_read()
4748 if (!io_parms->server) in SMB2_read()
4749 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_read()
4756 if (smb3_encryption_required(io_parms->tcon)) in SMB2_read()
4766 rc = cifs_send_recv(xid, ses, io_parms->server, in SMB2_read()
4771 if (rc != -ENODATA) { in SMB2_read()
4772 cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE); in SMB2_read()
4775 req->PersistentFileId, in SMB2_read()
4776 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4777 io_parms->offset, io_parms->length, in SMB2_read()
4781 req->PersistentFileId, io_parms->tcon->tid, in SMB2_read()
4782 ses->Suid, io_parms->offset, 0); in SMB2_read()
4785 return rc == -ENODATA ? 0 : rc; in SMB2_read()
4788 req->PersistentFileId, in SMB2_read()
4789 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4790 io_parms->offset, io_parms->length); in SMB2_read()
4794 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_read()
4796 (*nbytes > io_parms->length)) { in SMB2_read()
4798 *nbytes, io_parms->length); in SMB2_read()
4799 rc = -EIO; in SMB2_read()
4804 memcpy(*buf, (char *)rsp + rsp->DataOffset, *nbytes); in SMB2_read()
4823 struct cifs_io_subrequest *wdata = mid->callback_data; in smb2_writev_callback()
4824 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); in smb2_writev_callback()
4825 struct TCP_Server_Info *server = wdata->server; in smb2_writev_callback()
4826 struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; in smb2_writev_callback()
4830 .rreq_debug_id = wdata->rreq->debug_id, in smb2_writev_callback()
4831 .rreq_debug_index = wdata->subreq.debug_index, in smb2_writev_callback()
4833 unsigned int rreq_debug_id = wdata->rreq->debug_id; in smb2_writev_callback()
4834 unsigned int subreq_debug_index = wdata->subreq.debug_index; in smb2_writev_callback()
4838 WARN_ONCE(wdata->server != mid->server, in smb2_writev_callback()
4840 wdata->server, mid->server); in smb2_writev_callback()
4842 switch (mid->mid_state) { in smb2_writev_callback()
4844 trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_progress); in smb2_writev_callback()
4845 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_writev_callback()
4846 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4849 trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_bad); in smb2_writev_callback()
4853 written = le32_to_cpu(rsp->DataLength); in smb2_writev_callback()
4860 if (written > wdata->subreq.len) in smb2_writev_callback()
4865 if (written < wdata->subreq.len) { in smb2_writev_callback()
4866 wdata->result = -ENOSPC; in smb2_writev_callback()
4868 wdata->subreq.len = written; in smb2_writev_callback()
4869 __set_bit(NETFS_SREQ_MADE_PROGRESS, &wdata->subreq.flags); in smb2_writev_callback()
4873 trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_req_submitted); in smb2_writev_callback()
4874 __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); in smb2_writev_callback()
4875 result = -EAGAIN; in smb2_writev_callback()
4878 trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_retry_needed); in smb2_writev_callback()
4879 __set_bit(NETFS_SREQ_NEED_RETRY, &wdata->subreq.flags); in smb2_writev_callback()
4880 result = -EAGAIN; in smb2_writev_callback()
4883 trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_malformed); in smb2_writev_callback()
4884 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_writev_callback()
4885 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4886 result = -EIO; in smb2_writev_callback()
4889 trace_netfs_sreq(&wdata->subreq, netfs_sreq_trace_io_unknown); in smb2_writev_callback()
4890 result = -EIO; in smb2_writev_callback()
4901 if (wdata->mr) { in smb2_writev_callback()
4902 smbd_deregister_mr(wdata->mr); in smb2_writev_callback()
4903 wdata->mr = NULL; in smb2_writev_callback()
4908 trace_smb3_write_err(wdata->rreq->debug_id, in smb2_writev_callback()
4909 wdata->subreq.debug_index, in smb2_writev_callback()
4910 wdata->xid, in smb2_writev_callback()
4911 wdata->req->cfile->fid.persistent_fid, in smb2_writev_callback()
4912 tcon->tid, tcon->ses->Suid, wdata->subreq.start, in smb2_writev_callback()
4913 wdata->subreq.len, wdata->result); in smb2_writev_callback()
4914 if (wdata->result == -ENOSPC) in smb2_writev_callback()
4916 tcon->tree_name); in smb2_writev_callback()
4918 trace_smb3_write_done(wdata->rreq->debug_id, in smb2_writev_callback()
4919 wdata->subreq.debug_index, in smb2_writev_callback()
4920 wdata->xid, in smb2_writev_callback()
4921 wdata->req->cfile->fid.persistent_fid, in smb2_writev_callback()
4922 tcon->tid, tcon->ses->Suid, in smb2_writev_callback()
4923 wdata->subreq.start, wdata->subreq.len); in smb2_writev_callback()
4925 trace_smb3_rw_credits(rreq_debug_id, subreq_debug_index, wdata->credits.value, in smb2_writev_callback()
4926 server->credits, server->in_flight, in smb2_writev_callback()
4928 wdata->credits.value = 0; in smb2_writev_callback()
4932 server->credits, server->in_flight, in smb2_writev_callback()
4937 /* smb2_async_writev - send an async write, and set up mid to handle result */
4941 int rc = -EACCES, flags = 0; in smb2_async_writev()
4944 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); in smb2_async_writev()
4945 struct TCP_Server_Info *server = wdata->server; in smb2_async_writev()
4948 unsigned int total_len, xid = wdata->xid; in smb2_async_writev()
4960 .offset = wdata->subreq.start, in smb2_async_writev()
4961 .length = wdata->subreq.len, in smb2_async_writev()
4962 .persistent_fid = wdata->req->cfile->fid.persistent_fid, in smb2_async_writev()
4963 .volatile_fid = wdata->req->cfile->fid.volatile_fid, in smb2_async_writev()
4964 .pid = wdata->req->pid, in smb2_async_writev()
4974 rqst.rq_iter = wdata->subreq.io_iter; in smb2_async_writev()
4976 rqst.rq_iov[0].iov_len = total_len - 1; in smb2_async_writev()
4984 shdr->Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in smb2_async_writev()
4986 req->PersistentFileId = io_parms->persistent_fid; in smb2_async_writev()
4987 req->VolatileFileId = io_parms->volatile_fid; in smb2_async_writev()
4988 req->WriteChannelInfoOffset = 0; in smb2_async_writev()
4989 req->WriteChannelInfoLength = 0; in smb2_async_writev()
4990 req->Channel = SMB2_CHANNEL_NONE; in smb2_async_writev()
4991 req->Length = cpu_to_le32(io_parms->length); in smb2_async_writev()
4992 req->Offset = cpu_to_le64(io_parms->offset); in smb2_async_writev()
4993 req->DataOffset = cpu_to_le16( in smb2_async_writev()
4995 req->RemainingBytes = 0; in smb2_async_writev()
4997 trace_smb3_write_enter(wdata->rreq->debug_id, in smb2_async_writev()
4998 wdata->subreq.debug_index, in smb2_async_writev()
4999 wdata->xid, in smb2_async_writev()
5000 io_parms->persistent_fid, in smb2_async_writev()
5001 io_parms->tcon->tid, in smb2_async_writev()
5002 io_parms->tcon->ses->Suid, in smb2_async_writev()
5003 io_parms->offset, in smb2_async_writev()
5004 io_parms->length); in smb2_async_writev()
5013 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_async_writev()
5015 wdata->mr = smbd_register_mr(server->smbd_conn, &wdata->subreq.io_iter, in smb2_async_writev()
5017 if (!wdata->mr) { in smb2_async_writev()
5018 rc = -EAGAIN; in smb2_async_writev()
5022 req->RemainingBytes = req->Length; in smb2_async_writev()
5023 req->Length = 0; in smb2_async_writev()
5024 req->DataOffset = 0; in smb2_async_writev()
5025 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_async_writev()
5027 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_async_writev()
5028 req->WriteChannelInfoOffset = in smb2_async_writev()
5030 req->WriteChannelInfoLength = in smb2_async_writev()
5032 v1 = (struct smbdirect_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_async_writev()
5033 v1->offset = cpu_to_le64(wdata->mr->mr->iova); in smb2_async_writev()
5034 v1->token = cpu_to_le32(wdata->mr->mr->rkey); in smb2_async_writev()
5035 v1->length = cpu_to_le32(wdata->mr->mr->length); in smb2_async_writev()
5040 * We keep wdata->subreq.io_iter, in smb2_async_writev()
5047 if (wdata->subreq.retry_count > 0) in smb2_async_writev()
5051 io_parms->offset, io_parms->length, iov_iter_count(&wdata->subreq.io_iter)); in smb2_async_writev()
5053 if (wdata->credits.value > 0) { in smb2_async_writev()
5054 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->subreq.len, in smb2_async_writev()
5056 credit_request = le16_to_cpu(shdr->CreditCharge) + 8; in smb2_async_writev()
5057 if (server->credits >= server->max_credits) in smb2_async_writev()
5058 shdr->CreditRequest = cpu_to_le16(0); in smb2_async_writev()
5060 shdr->CreditRequest = cpu_to_le16( in smb2_async_writev()
5061 min_t(int, server->max_credits - in smb2_async_writev()
5062 server->credits, credit_request)); in smb2_async_writev()
5076 wdata, flags, &wdata->credits); in smb2_async_writev()
5079 trace_smb3_write_err(wdata->rreq->debug_id, in smb2_async_writev()
5080 wdata->subreq.debug_index, in smb2_async_writev()
5082 io_parms->persistent_fid, in smb2_async_writev()
5083 io_parms->tcon->tid, in smb2_async_writev()
5084 io_parms->tcon->ses->Suid, in smb2_async_writev()
5085 io_parms->offset, in smb2_async_writev()
5086 io_parms->length, in smb2_async_writev()
5095 trace_smb3_rw_credits(wdata->rreq->debug_id, in smb2_async_writev()
5096 wdata->subreq.debug_index, in smb2_async_writev()
5097 wdata->credits.value, in smb2_async_writev()
5098 server->credits, server->in_flight, in smb2_async_writev()
5099 -(int)wdata->credits.value, in smb2_async_writev()
5101 add_credits_and_wake_if(wdata->server, &wdata->credits, 0); in smb2_async_writev()
5125 int retries = 0, cur_sleep = 1; in SMB2_write() local
5131 if (!io_parms->server) in SMB2_write()
5132 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_write()
5133 server = io_parms->server; in SMB2_write()
5135 return -ECONNABORTED; in SMB2_write()
5140 rc = smb2_plain_req_init(SMB2_WRITE, io_parms->tcon, server, in SMB2_write()
5145 if (smb3_encryption_required(io_parms->tcon)) in SMB2_write()
5148 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in SMB2_write()
5150 req->PersistentFileId = io_parms->persistent_fid; in SMB2_write()
5151 req->VolatileFileId = io_parms->volatile_fid; in SMB2_write()
5152 req->WriteChannelInfoOffset = 0; in SMB2_write()
5153 req->WriteChannelInfoLength = 0; in SMB2_write()
5154 req->Channel = 0; in SMB2_write()
5155 req->Length = cpu_to_le32(io_parms->length); in SMB2_write()
5156 req->Offset = cpu_to_le64(io_parms->offset); in SMB2_write()
5157 req->DataOffset = cpu_to_le16( in SMB2_write()
5159 req->RemainingBytes = 0; in SMB2_write()
5161 trace_smb3_write_enter(0, 0, xid, io_parms->persistent_fid, in SMB2_write()
5162 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in SMB2_write()
5163 io_parms->offset, io_parms->length); in SMB2_write()
5167 iov[0].iov_len = total_len - 1; in SMB2_write()
5173 if (retries) in SMB2_write()
5176 rc = cifs_send_recv(xid, io_parms->tcon->ses, server, in SMB2_write()
5183 req->PersistentFileId, in SMB2_write()
5184 io_parms->tcon->tid, in SMB2_write()
5185 io_parms->tcon->ses->Suid, in SMB2_write()
5186 io_parms->offset, io_parms->length, rc); in SMB2_write()
5187 cifs_stats_fail_inc(io_parms->tcon, SMB2_WRITE_HE); in SMB2_write()
5190 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_write()
5191 cifs_stats_bytes_written(io_parms->tcon, *nbytes); in SMB2_write()
5193 req->PersistentFileId, in SMB2_write()
5194 io_parms->tcon->tid, in SMB2_write()
5195 io_parms->tcon->ses->Suid, in SMB2_write()
5196 io_parms->offset, *nbytes); in SMB2_write()
5203 smb2_should_replay(io_parms->tcon, &retries, &cur_sleep)) in SMB2_write()
5215 return -1; in posix_info_sid_size()
5219 return -1; in posix_info_sid_size()
5223 return -1; in posix_info_sid_size()
5243 end = beg + le32_to_cpu(p->NextEntryOffset); in posix_info_parse()
5251 return -1; in posix_info_parse()
5258 return -1; in posix_info_parse()
5265 return -1; in posix_info_parse()
5270 return -1; in posix_info_parse()
5273 return -1; in posix_info_parse()
5279 return -1; in posix_info_parse()
5283 out->base = beg; in posix_info_parse()
5284 out->size = total_len; in posix_info_parse()
5285 out->name_len = name_len; in posix_info_parse()
5286 out->name = name; in posix_info_parse()
5287 memcpy(&out->owner, owner_sid, owner_len); in posix_info_parse()
5288 memcpy(&out->group, group_sid, group_len); in posix_info_parse()
5298 return -1; in posix_info_extra_size()
5299 return len - sizeof(struct smb2_posix_info); in posix_info_extra_size()
5331 len = le32_to_cpu(dir_info->FileNameLength); in num_entries()
5345 next_offset = le32_to_cpu(dir_info->NextEntryOffset); in num_entries()
5366 unsigned int output_size = CIFSMaxBufSize - in SMB2_query_directory_init()
5367 MAX_SMB2_CREATE_RESPONSE_SIZE - in SMB2_query_directory_init()
5370 struct kvec *iov = rqst->rq_iov; in SMB2_query_directory_init()
5380 req->FileInformationClass = FILE_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
5383 req->FileInformationClass = FILEID_FULL_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
5386 req->FileInformationClass = SMB_FIND_FILE_POSIX_INFO; in SMB2_query_directory_init()
5389 req->FileInformationClass = FILE_FULL_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
5394 return -EINVAL; in SMB2_query_directory_init()
5397 req->FileIndex = cpu_to_le32(index); in SMB2_query_directory_init()
5398 req->PersistentFileId = persistent_fid; in SMB2_query_directory_init()
5399 req->VolatileFileId = volatile_fid; in SMB2_query_directory_init()
5402 bufptr = req->Buffer; in SMB2_query_directory_init()
5405 req->FileNameOffset = in SMB2_query_directory_init()
5407 req->FileNameLength = cpu_to_le16(len); in SMB2_query_directory_init()
5412 output_size = min_t(unsigned int, output_size, server->maxBuf); in SMB2_query_directory_init()
5414 req->OutputBufferLength = cpu_to_le32(output_size); in SMB2_query_directory_init()
5418 iov[0].iov_len = total_len - 1; in SMB2_query_directory_init()
5420 iov[1].iov_base = (char *)(req->Buffer); in SMB2_query_directory_init()
5423 trace_smb3_query_dir_enter(xid, persistent_fid, tcon->tid, in SMB2_query_directory_init()
5424 tcon->ses->Suid, index, output_size); in SMB2_query_directory_init()
5431 if (rqst && rqst->rq_iov) { in SMB2_query_directory_free()
5432 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_directory_free()
5447 rsp = (struct smb2_query_directory_rsp *)rsp_iov->iov_base; in smb2_parse_query_directory()
5449 switch (srch_inf->info_level) { in smb2_parse_query_directory()
5465 srch_inf->info_level); in smb2_parse_query_directory()
5466 return -EINVAL; in smb2_parse_query_directory()
5469 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_parse_query_directory()
5470 le32_to_cpu(rsp->OutputBufferLength), rsp_iov, in smb2_parse_query_directory()
5477 srch_inf->unicode = true; in smb2_parse_query_directory()
5479 if (srch_inf->ntwrk_buf_start) { in smb2_parse_query_directory()
5480 if (srch_inf->smallBuf) in smb2_parse_query_directory()
5481 cifs_small_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
5483 cifs_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
5485 srch_inf->ntwrk_buf_start = (char *)rsp; in smb2_parse_query_directory()
5486 srch_inf->srch_entries_start = srch_inf->last_entry = in smb2_parse_query_directory()
5487 (char *)rsp + le16_to_cpu(rsp->OutputBufferOffset); in smb2_parse_query_directory()
5488 end_of_smb = rsp_iov->iov_len + (char *)rsp; in smb2_parse_query_directory()
5490 srch_inf->entries_in_buffer = num_entries( in smb2_parse_query_directory()
5491 srch_inf->info_level, in smb2_parse_query_directory()
5492 srch_inf->srch_entries_start, in smb2_parse_query_directory()
5494 &srch_inf->last_entry, in smb2_parse_query_directory()
5497 srch_inf->index_of_last_entry += srch_inf->entries_in_buffer; in smb2_parse_query_directory()
5499 srch_inf->entries_in_buffer, srch_inf->index_of_last_entry, in smb2_parse_query_directory()
5500 srch_inf->srch_entries_start, srch_inf->last_entry); in smb2_parse_query_directory()
5502 srch_inf->smallBuf = false; in smb2_parse_query_directory()
5504 srch_inf->smallBuf = true; in smb2_parse_query_directory()
5522 struct cifs_ses *ses = tcon->ses; in SMB2_query_directory()
5525 int retries = 0, cur_sleep = 1; in SMB2_query_directory() local
5532 if (!ses || !(ses->server)) in SMB2_query_directory()
5533 return -EIO; in SMB2_query_directory()
5546 srch_inf->info_level); in SMB2_query_directory()
5550 if (retries) in SMB2_query_directory()
5558 if (rc == -ENODATA && in SMB2_query_directory()
5559 rsp->hdr.Status == STATUS_NO_MORE_FILES) { in SMB2_query_directory()
5561 tcon->tid, tcon->ses->Suid, index, 0); in SMB2_query_directory()
5562 srch_inf->endOfSearch = true; in SMB2_query_directory()
5565 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5566 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
5575 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5576 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
5581 trace_smb3_query_dir_done(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5582 tcon->ses->Suid, index, srch_inf->entries_in_buffer); in SMB2_query_directory()
5589 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_query_directory()
5603 struct kvec *iov = rqst->rq_iov; in SMB2_set_info_init()
5612 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid); in SMB2_set_info_init()
5613 req->InfoType = info_type; in SMB2_set_info_init()
5614 req->FileInfoClass = info_class; in SMB2_set_info_init()
5615 req->PersistentFileId = persistent_fid; in SMB2_set_info_init()
5616 req->VolatileFileId = volatile_fid; in SMB2_set_info_init()
5617 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_set_info_init()
5619 req->BufferOffset = cpu_to_le16(sizeof(struct smb2_set_info_req)); in SMB2_set_info_init()
5620 req->BufferLength = cpu_to_le32(*size); in SMB2_set_info_init()
5622 memcpy(req->Buffer, *data, *size); in SMB2_set_info_init()
5627 iov[0].iov_len = total_len - 1; in SMB2_set_info_init()
5629 for (i = 1; i < rqst->rq_nvec; i++) { in SMB2_set_info_init()
5630 le32_add_cpu(&req->BufferLength, size[i]); in SMB2_set_info_init()
5641 if (rqst && rqst->rq_iov) in SMB2_set_info_free()
5642 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_set_info_free()
5657 struct cifs_ses *ses = tcon->ses; in send_set_info()
5660 int retries = 0, cur_sleep = 1; in send_set_info() local
5668 return -EIO; in send_set_info()
5671 return -EINVAL; in send_set_info()
5678 return -ENOMEM; in send_set_info()
5693 if (retries) in send_set_info()
5704 trace_smb3_set_info_err(xid, persistent_fid, tcon->tid, in send_set_info()
5705 ses->Suid, info_class, (__u32)info_type, rc); in send_set_info()
5712 smb2_should_replay(tcon, &retries, &cur_sleep)) in send_set_info()
5731 trace_smb3_set_eof(xid, persistent_fid, tcon->tid, tcon->ses->Suid, new_eof); in SMB2_set_eof()
5744 current->tgid, 0, SMB2_O_INFO_SECURITY, aclflag, in SMB2_set_acl()
5754 current->tgid, FILE_FULL_EA_INFORMATION, SMB2_O_INFO_FILE, in SMB2_set_ea()
5766 struct cifs_ses *ses = tcon->ses; in SMB2_oplock_break()
5773 int retries = 0, cur_sleep = 1; in SMB2_oplock_break() local
5789 req->VolatileFid = volatile_fid; in SMB2_oplock_break()
5790 req->PersistentFid = persistent_fid; in SMB2_oplock_break()
5791 req->OplockLevel = oplock_level; in SMB2_oplock_break()
5792 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_oplock_break()
5803 if (retries) in SMB2_oplock_break()
5815 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_oplock_break()
5825 kst->f_bsize = le32_to_cpu(pfs_inf->BytesPerSector) * in smb2_copy_fs_info_to_kstatfs()
5826 le32_to_cpu(pfs_inf->SectorsPerAllocationUnit); in smb2_copy_fs_info_to_kstatfs()
5827 kst->f_blocks = le64_to_cpu(pfs_inf->TotalAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5828 kst->f_bfree = kst->f_bavail = in smb2_copy_fs_info_to_kstatfs()
5829 le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5837 kst->f_bsize = le32_to_cpu(response_data->BlockSize); in copy_posix_fs_info_to_kstatfs()
5838 kst->f_blocks = le64_to_cpu(response_data->TotalBlocks); in copy_posix_fs_info_to_kstatfs()
5839 kst->f_bfree = le64_to_cpu(response_data->BlocksAvail); in copy_posix_fs_info_to_kstatfs()
5840 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5841 kst->f_bavail = kst->f_bfree; in copy_posix_fs_info_to_kstatfs()
5843 kst->f_bavail = le64_to_cpu(response_data->UserBlocksAvail); in copy_posix_fs_info_to_kstatfs()
5844 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5845 kst->f_files = le64_to_cpu(response_data->TotalFileNodes); in copy_posix_fs_info_to_kstatfs()
5846 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5847 kst->f_ffree = le64_to_cpu(response_data->FreeFileNodes); in copy_posix_fs_info_to_kstatfs()
5864 if ((tcon->ses == NULL) || server == NULL) in build_qfs_info_req()
5865 return -EIO; in build_qfs_info_req()
5872 req->InfoType = SMB2_O_INFO_FILESYSTEM; in build_qfs_info_req()
5873 req->FileInfoClass = level; in build_qfs_info_req()
5874 req->PersistentFileId = persistent_fid; in build_qfs_info_req()
5875 req->VolatileFileId = volatile_fid; in build_qfs_info_req()
5877 req->InputBufferOffset = in build_qfs_info_req()
5879 req->OutputBufferLength = cpu_to_le32( in build_qfs_info_req()
5882 iov->iov_base = (char *)req; in build_qfs_info_req()
5883 iov->iov_len = total_len; in build_qfs_info_req()
5889 cifs_buf_release(iov->iov_base); in free_qfs_info_req()
5902 struct cifs_ses *ses = tcon->ses; in SMB311_posix_qfs_info()
5906 int retries = 0, cur_sleep = 1; in SMB311_posix_qfs_info() local
5927 if (retries) in SMB311_posix_qfs_info()
5940 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB311_posix_qfs_info()
5941 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB311_posix_qfs_info()
5942 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB311_posix_qfs_info()
5951 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB311_posix_qfs_info()
5967 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_attr()
5971 int retries = 0, cur_sleep = 1; in SMB2_QFS_attr() local
5992 return -EINVAL; in SMB2_QFS_attr()
6008 if (retries) in SMB2_QFS_attr()
6020 rsp_len = le32_to_cpu(rsp->OutputBufferLength); in SMB2_QFS_attr()
6021 offset = le16_to_cpu(rsp->OutputBufferOffset); in SMB2_QFS_attr()
6027 memcpy(&tcon->fsAttrInfo, offset in SMB2_QFS_attr()
6031 memcpy(&tcon->fsDevInfo, offset in SMB2_QFS_attr()
6036 tcon->ss_flags = le32_to_cpu(ss_info->Flags); in SMB2_QFS_attr()
6037 tcon->perf_sector_size = in SMB2_QFS_attr()
6038 le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf); in SMB2_QFS_attr()
6042 tcon->vol_serial_number = vol_info->VolumeSerialNumber; in SMB2_QFS_attr()
6043 tcon->vol_create_time = vol_info->VolumeCreationTime; in SMB2_QFS_attr()
6050 smb2_should_replay(tcon, &retries, &cur_sleep)) in SMB2_QFS_attr()
6071 int retries = 0, cur_sleep = 1; in smb2_lockv() local
6076 server = cifs_pick_channel(tcon->ses); in smb2_lockv()
6088 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid); in smb2_lockv()
6089 req->LockCount = cpu_to_le16(num_lock); in smb2_lockv()
6091 req->PersistentFileId = persist_fid; in smb2_lockv()
6092 req->VolatileFileId = volatile_fid; in smb2_lockv()
6097 iov[0].iov_len = total_len - sizeof(struct smb2_lock_element); in smb2_lockv()
6101 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in smb2_lockv()
6107 if (retries) in smb2_lockv()
6110 rc = cifs_send_recv(xid, tcon->ses, server, in smb2_lockv()
6117 trace_smb3_lock_err(xid, persist_fid, tcon->tid, in smb2_lockv()
6118 tcon->ses->Suid, rc); in smb2_lockv()
6122 smb2_should_replay(tcon, &retries, &cur_sleep)) in smb2_lockv()
6152 struct cifs_ses *ses = tcon->ses; in SMB2_lease_break()
6160 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in SMB2_lease_break()
6171 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_lease_break()
6172 req->StructureSize = cpu_to_le16(36); in SMB2_lease_break()
6175 memcpy(req->LeaseKey, lease_key, SMB2_LEASE_KEY_SIZE); in SMB2_lease_break()
6176 req->LeaseState = lease_state; in SMB2_lease_break()
6195 trace_smb3_lease_ack_err(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
6196 ses->Suid, *please_key_low, *please_key_high, rc); in SMB2_lease_break()
6199 trace_smb3_lease_ack_done(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
6200 ses->Suid, *please_key_low, *please_key_high); in SMB2_lease_break()