Lines Matching +full:tcon +full:- +full:channel
1 // SPDX-License-Identifier: LGPL-2.1
13 /* SMB2 PDU handling routines here - except for leftovers (eg session setup) */
73 int smb3_encryption_required(const struct cifs_tcon *tcon) in smb3_encryption_required() argument
75 if (!tcon || !tcon->ses) in smb3_encryption_required()
77 if ((tcon->ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) || in smb3_encryption_required()
78 (tcon->share_flags & SHI1005_FLAGS_ENCRYPT_DATA)) in smb3_encryption_required()
80 if (tcon->seal && in smb3_encryption_required()
81 (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in smb3_encryption_required()
88 const struct cifs_tcon *tcon, in smb2_hdr_assemble() argument
93 shdr->ProtocolId = SMB2_PROTO_NUMBER; in smb2_hdr_assemble()
94 shdr->StructureSize = cpu_to_le16(64); in smb2_hdr_assemble()
95 shdr->Command = smb2_cmd; in smb2_hdr_assemble()
99 if (server->dialect >= SMB30_PROT_ID) { in smb2_hdr_assemble()
102 * if primary channel is not set yet, use default in smb2_hdr_assemble()
103 * channel for chan sequence num in smb2_hdr_assemble()
106 smb3_hdr->ChannelSequence = in smb2_hdr_assemble()
107 cpu_to_le16(server->primary_server->channel_sequence_num); in smb2_hdr_assemble()
109 smb3_hdr->ChannelSequence = in smb2_hdr_assemble()
110 cpu_to_le16(server->channel_sequence_num); in smb2_hdr_assemble()
112 spin_lock(&server->req_lock); in smb2_hdr_assemble()
114 if (server->credits >= server->max_credits) in smb2_hdr_assemble()
115 shdr->CreditRequest = cpu_to_le16(0); in smb2_hdr_assemble()
117 shdr->CreditRequest = cpu_to_le16( in smb2_hdr_assemble()
118 min_t(int, server->max_credits - in smb2_hdr_assemble()
119 server->credits, 10)); in smb2_hdr_assemble()
120 spin_unlock(&server->req_lock); in smb2_hdr_assemble()
122 shdr->CreditRequest = cpu_to_le16(2); in smb2_hdr_assemble()
124 shdr->Id.SyncId.ProcessId = cpu_to_le32((__u16)current->tgid); in smb2_hdr_assemble()
126 if (!tcon) in smb2_hdr_assemble()
130 /* See sections 2.2.4 and 3.2.4.1.5 of MS-SMB2 */ in smb2_hdr_assemble()
131 if (server && (server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_hdr_assemble()
132 shdr->CreditCharge = cpu_to_le16(1); in smb2_hdr_assemble()
135 shdr->Id.SyncId.TreeId = cpu_to_le32(tcon->tid); in smb2_hdr_assemble()
137 if (tcon->ses) in smb2_hdr_assemble()
138 shdr->SessionId = cpu_to_le64(tcon->ses->Suid); in smb2_hdr_assemble()
150 /* if (tcon->share_flags & SHI1005_FLAGS_DFS) in smb2_hdr_assemble()
151 shdr->Flags |= SMB2_FLAGS_DFS_OPERATIONS; */ in smb2_hdr_assemble()
153 if (server && server->sign && !smb3_encryption_required(tcon)) in smb2_hdr_assemble()
154 shdr->Flags |= SMB2_FLAGS_SIGNED; in smb2_hdr_assemble()
170 "server %s does not support multichannel anymore. Skip secondary channel\n", in cifs_chan_skip_or_disable()
171 ses->server->hostname); in cifs_chan_skip_or_disable()
173 spin_lock(&ses->chan_lock); in cifs_chan_skip_or_disable()
176 spin_unlock(&ses->chan_lock); in cifs_chan_skip_or_disable()
180 ses->chans[chan_index].server = NULL; in cifs_chan_skip_or_disable()
181 server->terminate = true; in cifs_chan_skip_or_disable()
182 spin_unlock(&ses->chan_lock); in cifs_chan_skip_or_disable()
185 * the above reference of server by channel in cifs_chan_skip_or_disable()
195 pserver = server->primary_server; in cifs_chan_skip_or_disable()
198 return -EHOSTDOWN; in cifs_chan_skip_or_disable()
210 smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon, in smb2_reconnect() argument
219 * SMB2s NegProt, SessSetup, Logoff do not have tcon yet so in smb2_reconnect()
221 * for those three - in the calling routine. in smb2_reconnect()
223 if (tcon == NULL) in smb2_reconnect()
233 spin_lock(&tcon->tc_lock); in smb2_reconnect()
234 if (tcon->status == TID_EXITING) { in smb2_reconnect()
239 spin_unlock(&tcon->tc_lock); in smb2_reconnect()
242 return -ENODEV; in smb2_reconnect()
245 spin_unlock(&tcon->tc_lock); in smb2_reconnect()
247 ses = tcon->ses; in smb2_reconnect()
249 return -EIO; in smb2_reconnect()
250 spin_lock(&ses->ses_lock); in smb2_reconnect()
251 if (ses->ses_status == SES_EXITING) { in smb2_reconnect()
252 spin_unlock(&ses->ses_lock); in smb2_reconnect()
253 return -EIO; in smb2_reconnect()
255 spin_unlock(&ses->ses_lock); in smb2_reconnect()
256 if (!ses->server || !server) in smb2_reconnect()
257 return -EIO; in smb2_reconnect()
259 spin_lock(&server->srv_lock); in smb2_reconnect()
260 if (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
273 spin_unlock(&server->srv_lock); in smb2_reconnect()
274 return -EAGAIN; in smb2_reconnect()
279 if (server->terminate) { in smb2_reconnect()
280 spin_unlock(&server->srv_lock); in smb2_reconnect()
281 return -EHOSTDOWN; in smb2_reconnect()
283 spin_unlock(&server->srv_lock); in smb2_reconnect()
286 rc = cifs_wait_for_server_reconnect(server, tcon->retry); in smb2_reconnect()
290 spin_lock(&ses->chan_lock); in smb2_reconnect()
291 if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) { in smb2_reconnect()
292 spin_unlock(&ses->chan_lock); in smb2_reconnect()
295 spin_unlock(&ses->chan_lock); in smb2_reconnect()
296 cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d", in smb2_reconnect()
297 tcon->ses->chans_need_reconnect, in smb2_reconnect()
298 tcon->need_reconnect); in smb2_reconnect()
300 mutex_lock(&ses->session_mutex); in smb2_reconnect()
302 * if this is called by delayed work, and the channel has been disabled in smb2_reconnect()
304 * there's a chance that this channel may not exist anymore in smb2_reconnect()
306 spin_lock(&server->srv_lock); in smb2_reconnect()
307 if (server->tcpStatus == CifsExiting) { in smb2_reconnect()
308 spin_unlock(&server->srv_lock); in smb2_reconnect()
309 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
310 rc = -EHOSTDOWN; in smb2_reconnect()
319 if (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
320 spin_unlock(&server->srv_lock); in smb2_reconnect()
321 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
323 if (tcon->retry) in smb2_reconnect()
326 rc = -EHOSTDOWN; in smb2_reconnect()
329 spin_unlock(&server->srv_lock); in smb2_reconnect()
331 nls_codepage = ses->local_nls; in smb2_reconnect()
337 spin_lock(&ses->ses_lock); in smb2_reconnect()
338 spin_lock(&ses->chan_lock); in smb2_reconnect()
340 ses->ses_status == SES_GOOD) { in smb2_reconnect()
341 spin_unlock(&ses->chan_lock); in smb2_reconnect()
342 spin_unlock(&ses->ses_lock); in smb2_reconnect()
344 if (tcon->need_reconnect) in smb2_reconnect()
347 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
350 spin_unlock(&ses->chan_lock); in smb2_reconnect()
351 spin_unlock(&ses->ses_lock); in smb2_reconnect()
357 * and the first channel reconnected, disable all the others. in smb2_reconnect()
359 if (ses->chan_count > 1 && in smb2_reconnect()
360 !(server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { in smb2_reconnect()
364 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
370 if ((rc == -EACCES) && !tcon->retry) { in smb2_reconnect()
371 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
372 rc = -EHOSTDOWN; in smb2_reconnect()
375 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
379 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
384 if (!tcon->need_reconnect) { in smb2_reconnect()
385 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
388 cifs_mark_open_files_invalid(tcon); in smb2_reconnect()
389 if (tcon->use_persistent) in smb2_reconnect()
390 tcon->need_reopen_files = true; in smb2_reconnect()
392 rc = cifs_tree_connect(0, tcon, nls_codepage); in smb2_reconnect()
394 cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc); in smb2_reconnect()
396 /* If sess reconnected but tcon didn't, something strange ... */ in smb2_reconnect()
397 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
398 cifs_dbg(VFS, "reconnect tcon failed rc = %d\n", rc); in smb2_reconnect()
402 spin_lock(&ses->ses_lock); in smb2_reconnect()
403 if (ses->flags & CIFS_SES_FLAG_SCALE_CHANNELS) { in smb2_reconnect()
404 spin_unlock(&ses->ses_lock); in smb2_reconnect()
405 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
408 ses->flags |= CIFS_SES_FLAG_SCALE_CHANNELS; in smb2_reconnect()
409 spin_unlock(&ses->ses_lock); in smb2_reconnect()
412 (server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) { in smb2_reconnect()
413 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
419 rc = SMB3_request_interfaces(xid, tcon, false); in smb2_reconnect()
422 if (rc == -EOPNOTSUPP && ses->chan_count > 1) { in smb2_reconnect()
437 if (ses->chan_max > ses->chan_count && in smb2_reconnect()
438 ses->iface_count && in smb2_reconnect()
440 if (ses->chan_count == 1) { in smb2_reconnect()
442 queue_delayed_work(cifsiod_wq, &tcon->query_interfaces, in smb2_reconnect()
449 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
453 spin_lock(&ses->ses_lock); in smb2_reconnect()
454 ses->flags &= ~CIFS_SES_FLAG_SCALE_CHANNELS; in smb2_reconnect()
455 spin_unlock(&ses->ses_lock); in smb2_reconnect()
458 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in smb2_reconnect()
479 rc = -EAGAIN; in smb2_reconnect()
486 fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon, in fill_small_buf() argument
501 smb2_hdr_assemble(&spdu->hdr, smb2_command, tcon, server); in fill_small_buf()
502 spdu->StructureSize2 = cpu_to_le16(parmsize); in fill_small_buf()
512 static int __smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon, in __smb2_plain_req_init() argument
528 return -ENOMEM; in __smb2_plain_req_init()
531 fill_small_buf(smb2_command, tcon, server, in __smb2_plain_req_init()
535 if (tcon != NULL) { in __smb2_plain_req_init()
537 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]); in __smb2_plain_req_init()
538 cifs_stats_inc(&tcon->num_smbs_sent); in __smb2_plain_req_init()
544 static int smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon, in smb2_plain_req_init() argument
550 rc = smb2_reconnect(smb2_command, tcon, server, false); in smb2_plain_req_init()
554 return __smb2_plain_req_init(smb2_command, tcon, server, request_buf, in smb2_plain_req_init()
558 static int smb2_ioctl_req_init(u32 opcode, struct cifs_tcon *tcon, in smb2_ioctl_req_init() argument
564 return __smb2_plain_req_init(SMB2_IOCTL, tcon, server, in smb2_ioctl_req_init()
567 return smb2_plain_req_init(SMB2_IOCTL, tcon, server, in smb2_ioctl_req_init()
571 /* For explanation of negotiate contexts see MS-SMB2 section 2.2.3.1 */
576 pneg_ctxt->ContextType = SMB2_PREAUTH_INTEGRITY_CAPABILITIES; in build_preauth_ctxt()
577 pneg_ctxt->DataLength = cpu_to_le16(38); in build_preauth_ctxt()
578 pneg_ctxt->HashAlgorithmCount = cpu_to_le16(1); in build_preauth_ctxt()
579 pneg_ctxt->SaltLength = cpu_to_le16(SMB311_SALT_SIZE); in build_preauth_ctxt()
580 get_random_bytes(pneg_ctxt->Salt, SMB311_SALT_SIZE); in build_preauth_ctxt()
581 pneg_ctxt->HashAlgorithms = SMB2_PREAUTH_INTEGRITY_SHA512; in build_preauth_ctxt()
587 pneg_ctxt->ContextType = SMB2_COMPRESSION_CAPABILITIES; in build_compression_ctxt()
588 pneg_ctxt->DataLength = in build_compression_ctxt()
590 - sizeof(struct smb2_neg_context)); in build_compression_ctxt()
591 pneg_ctxt->CompressionAlgorithmCount = cpu_to_le16(3); in build_compression_ctxt()
592 pneg_ctxt->CompressionAlgorithms[0] = SMB3_COMPRESS_LZ77; in build_compression_ctxt()
593 pneg_ctxt->CompressionAlgorithms[1] = SMB3_COMPRESS_LZ77_HUFF; in build_compression_ctxt()
594 pneg_ctxt->CompressionAlgorithms[2] = SMB3_COMPRESS_LZNT1; in build_compression_ctxt()
603 pneg_ctxt->ContextType = SMB2_SIGNING_CAPABILITIES; in build_signing_ctxt()
607 pneg_ctxt->DataLength = cpu_to_le16(ALIGN(sizeof(struct smb2_signing_capabilities) - in build_signing_ctxt()
610 pneg_ctxt->SigningAlgorithmCount = cpu_to_le16(num_algs); in build_signing_ctxt()
611 pneg_ctxt->SigningAlgorithms[0] = cpu_to_le16(SIGNING_ALG_AES_CMAC); in build_signing_ctxt()
622 pneg_ctxt->ContextType = SMB2_ENCRYPTION_CAPABILITIES; in build_encrypt_ctxt()
624 pneg_ctxt->DataLength = cpu_to_le16(4); /* Cipher Count + 1 cipher */ in build_encrypt_ctxt()
625 pneg_ctxt->CipherCount = cpu_to_le16(1); in build_encrypt_ctxt()
626 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
628 pneg_ctxt->DataLength = cpu_to_le16(8); /* Cipher Count + 3 ciphers */ in build_encrypt_ctxt()
629 pneg_ctxt->CipherCount = cpu_to_le16(3); in build_encrypt_ctxt()
630 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
631 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
632 pneg_ctxt->Ciphers[2] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
634 pneg_ctxt->DataLength = cpu_to_le16(6); /* Cipher Count + 2 ciphers */ in build_encrypt_ctxt()
635 pneg_ctxt->CipherCount = cpu_to_le16(2); in build_encrypt_ctxt()
636 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
637 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
646 pneg_ctxt->ContextType = SMB2_NETNAME_NEGOTIATE_CONTEXT_ID; in build_netname_ctxt()
649 pneg_ctxt->DataLength = cpu_to_le16(2 * cifs_strtoUTF16(pneg_ctxt->NetName, hostname, 100, cp)); in build_netname_ctxt()
651 return ALIGN(le16_to_cpu(pneg_ctxt->DataLength) + sizeof(struct smb2_neg_context), 8); in build_netname_ctxt()
657 pneg_ctxt->ContextType = SMB2_POSIX_EXTENSIONS_AVAILABLE; in build_posix_ctxt()
658 pneg_ctxt->DataLength = cpu_to_le16(POSIX_CTXT_DATA_LEN); in build_posix_ctxt()
660 pneg_ctxt->Name[0] = 0x93; in build_posix_ctxt()
661 pneg_ctxt->Name[1] = 0xAD; in build_posix_ctxt()
662 pneg_ctxt->Name[2] = 0x25; in build_posix_ctxt()
663 pneg_ctxt->Name[3] = 0x50; in build_posix_ctxt()
664 pneg_ctxt->Name[4] = 0x9C; in build_posix_ctxt()
665 pneg_ctxt->Name[5] = 0xB4; in build_posix_ctxt()
666 pneg_ctxt->Name[6] = 0x11; in build_posix_ctxt()
667 pneg_ctxt->Name[7] = 0xE7; in build_posix_ctxt()
668 pneg_ctxt->Name[8] = 0xB4; in build_posix_ctxt()
669 pneg_ctxt->Name[9] = 0x23; in build_posix_ctxt()
670 pneg_ctxt->Name[10] = 0x83; in build_posix_ctxt()
671 pneg_ctxt->Name[11] = 0xDE; in build_posix_ctxt()
672 pneg_ctxt->Name[12] = 0x96; in build_posix_ctxt()
673 pneg_ctxt->Name[13] = 0x8B; in build_posix_ctxt()
674 pneg_ctxt->Name[14] = 0xCD; in build_posix_ctxt()
675 pneg_ctxt->Name[15] = 0x7C; in build_posix_ctxt()
700 req->NegotiateContextOffset = cpu_to_le32(*total_len); in assemble_neg_contexts()
714 * use the hostname field in the primary channel instead in assemble_neg_contexts()
716 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in assemble_neg_contexts()
718 hostname = pserver->hostname; in assemble_neg_contexts()
734 if (server->compress_algorithm) { in assemble_neg_contexts()
752 req->NegotiateContextCount = cpu_to_le16(neg_context_count); in assemble_neg_contexts()
756 /* If invalid preauth context warn but use what we requested, SHA-512 */
759 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_preauth_context()
768 } else if (len < MIN_PREAUTH_CTXT_DATA_LEN + le16_to_cpu(ctxt->SaltLength)) { in decode_preauth_context()
772 if (le16_to_cpu(ctxt->HashAlgorithmCount) != 1) in decode_preauth_context()
774 if (ctxt->HashAlgorithms != SMB2_PREAUTH_INTEGRITY_SHA512) in decode_preauth_context()
781 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_compress_ctx()
792 if (le16_to_cpu(ctxt->CompressionAlgorithmCount) != 1) { in decode_compress_ctx()
796 if (le16_to_cpu(ctxt->CompressionAlgorithms[0]) > 3) { in decode_compress_ctx()
800 server->compress_algorithm = ctxt->CompressionAlgorithms[0]; in decode_compress_ctx()
806 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_encrypt_ctx()
816 return -EINVAL; in decode_encrypt_ctx()
819 if (le16_to_cpu(ctxt->CipherCount) != 1) { in decode_encrypt_ctx()
821 return -EINVAL; in decode_encrypt_ctx()
823 cifs_dbg(FYI, "SMB311 cipher type:%d\n", le16_to_cpu(ctxt->Ciphers[0])); in decode_encrypt_ctx()
825 if (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM) { in decode_encrypt_ctx()
827 return -EOPNOTSUPP; in decode_encrypt_ctx()
829 } else if (ctxt->Ciphers[0] == 0) { in decode_encrypt_ctx()
839 server->cipher_type = 0; in decode_encrypt_ctx()
840 server->capabilities &= ~SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
843 } else if ((ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_CCM) && in decode_encrypt_ctx()
844 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_GCM) && in decode_encrypt_ctx()
845 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM)) { in decode_encrypt_ctx()
848 return -EINVAL; in decode_encrypt_ctx()
850 server->cipher_type = ctxt->Ciphers[0]; in decode_encrypt_ctx()
851 server->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
858 unsigned int len = le16_to_cpu(pctxt->DataLength); in decode_signing_ctx()
869 if (le16_to_cpu(pctxt->SigningAlgorithmCount) != 1) { in decode_signing_ctx()
873 if (le16_to_cpu(pctxt->SigningAlgorithms[0]) > 2) { in decode_signing_ctx()
878 server->signing_negotiated = true; in decode_signing_ctx()
879 server->signing_algorithm = le16_to_cpu(pctxt->SigningAlgorithms[0]); in decode_signing_ctx()
881 server->signing_algorithm); in decode_signing_ctx()
890 unsigned int offset = le32_to_cpu(rsp->NegotiateContextOffset); in smb311_decode_neg_context()
891 unsigned int ctxt_cnt = le16_to_cpu(rsp->NegotiateContextCount); in smb311_decode_neg_context()
898 return -EINVAL; in smb311_decode_neg_context()
901 len_of_ctxts = len_of_smb - offset; in smb311_decode_neg_context()
911 + le16_to_cpu(pctx->DataLength); in smb311_decode_neg_context()
914 * Subsequent negotiate contexts MUST appear at the first 8-byte in smb311_decode_neg_context()
922 if (pctx->ContextType == SMB2_PREAUTH_INTEGRITY_CAPABILITIES) in smb311_decode_neg_context()
925 else if (pctx->ContextType == SMB2_ENCRYPTION_CAPABILITIES) in smb311_decode_neg_context()
928 else if (pctx->ContextType == SMB2_COMPRESSION_CAPABILITIES) in smb311_decode_neg_context()
931 else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE) in smb311_decode_neg_context()
932 server->posix_ext_supported = true; in smb311_decode_neg_context()
933 else if (pctx->ContextType == SMB2_SIGNING_CAPABILITIES) in smb311_decode_neg_context()
938 le16_to_cpu(pctx->ContextType)); in smb311_decode_neg_context()
943 len_of_ctxts -= clen; in smb311_decode_neg_context()
958 buf->ccontext.DataOffset = in create_posix_buf()
960 buf->ccontext.DataLength = cpu_to_le32(4); in create_posix_buf()
961 buf->ccontext.NameOffset = in create_posix_buf()
963 buf->ccontext.NameLength = cpu_to_le16(16); in create_posix_buf()
966 buf->Name[0] = 0x93; in create_posix_buf()
967 buf->Name[1] = 0xAD; in create_posix_buf()
968 buf->Name[2] = 0x25; in create_posix_buf()
969 buf->Name[3] = 0x50; in create_posix_buf()
970 buf->Name[4] = 0x9C; in create_posix_buf()
971 buf->Name[5] = 0xB4; in create_posix_buf()
972 buf->Name[6] = 0x11; in create_posix_buf()
973 buf->Name[7] = 0xE7; in create_posix_buf()
974 buf->Name[8] = 0xB4; in create_posix_buf()
975 buf->Name[9] = 0x23; in create_posix_buf()
976 buf->Name[10] = 0x83; in create_posix_buf()
977 buf->Name[11] = 0xDE; in create_posix_buf()
978 buf->Name[12] = 0x96; in create_posix_buf()
979 buf->Name[13] = 0x8B; in create_posix_buf()
980 buf->Name[14] = 0xCD; in create_posix_buf()
981 buf->Name[15] = 0x7C; in create_posix_buf()
982 buf->Mode = cpu_to_le32(mode); in create_posix_buf()
996 return -ENOMEM; in add_posix_context()
1039 return -EIO; in SMB2_negotiate()
1047 req->hdr.SessionId = 0; in SMB2_negotiate()
1049 memset(server->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
1050 memset(ses->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
1052 if (strcmp(server->vals->version_string, in SMB2_negotiate()
1054 req->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
1055 req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
1056 req->Dialects[2] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
1057 req->DialectCount = cpu_to_le16(3); in SMB2_negotiate()
1059 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
1061 req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in SMB2_negotiate()
1062 req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
1063 req->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
1064 req->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
1065 req->DialectCount = cpu_to_le16(4); in SMB2_negotiate()
1069 req->Dialects[0] = cpu_to_le16(server->vals->protocol_id); in SMB2_negotiate()
1070 req->DialectCount = cpu_to_le16(1); in SMB2_negotiate()
1075 if (ses->sign) in SMB2_negotiate()
1076 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_REQUIRED); in SMB2_negotiate()
1078 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_ENABLED); in SMB2_negotiate()
1080 req->SecurityMode = 0; in SMB2_negotiate()
1082 req->Capabilities = cpu_to_le32(server->vals->req_capabilities); in SMB2_negotiate()
1083 if (ses->chan_max > 1) in SMB2_negotiate()
1084 req->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in SMB2_negotiate()
1087 if (server->vals->protocol_id == SMB20_PROT_ID) in SMB2_negotiate()
1088 memset(req->ClientGUID, 0, SMB2_CLIENT_GUID_SIZE); in SMB2_negotiate()
1090 memcpy(req->ClientGUID, server->client_guid, in SMB2_negotiate()
1092 if ((server->vals->protocol_id == SMB311_PROT_ID) || in SMB2_negotiate()
1093 (strcmp(server->vals->version_string, in SMB2_negotiate()
1095 (strcmp(server->vals->version_string, in SMB2_negotiate()
1111 * No tcon so can't do in SMB2_negotiate()
1112 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_negotiate()
1114 if (rc == -EOPNOTSUPP) { in SMB2_negotiate()
1120 rc = -EIO; in SMB2_negotiate()
1121 if (strcmp(server->vals->version_string, in SMB2_negotiate()
1123 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
1127 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
1131 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1133 server->ops = &smb311_operations; in SMB2_negotiate()
1134 server->vals = &smb311_values; in SMB2_negotiate()
1136 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
1138 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
1142 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
1144 server->ops = &smb21_operations; in SMB2_negotiate()
1145 server->vals = &smb21_values; in SMB2_negotiate()
1146 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1147 server->ops = &smb311_operations; in SMB2_negotiate()
1148 server->vals = &smb311_values; in SMB2_negotiate()
1150 } else if (le16_to_cpu(rsp->DialectRevision) != in SMB2_negotiate()
1151 server->vals->protocol_id) { in SMB2_negotiate()
1154 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
1158 cifs_dbg(FYI, "mode 0x%x\n", rsp->SecurityMode); in SMB2_negotiate()
1160 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) in SMB2_negotiate()
1162 else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) in SMB2_negotiate()
1164 else if (rsp->DialectRevision == cpu_to_le16(SMB30_PROT_ID)) in SMB2_negotiate()
1166 else if (rsp->DialectRevision == cpu_to_le16(SMB302_PROT_ID)) in SMB2_negotiate()
1168 else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) in SMB2_negotiate()
1172 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
1177 server->dialect = le16_to_cpu(rsp->DialectRevision); in SMB2_negotiate()
1184 memcpy(server->preauth_sha_hash, ses->preauth_sha_hash, in SMB2_negotiate()
1188 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in SMB2_negotiate()
1190 server->maxBuf = min_t(unsigned int, le32_to_cpu(rsp->MaxTransactSize), in SMB2_negotiate()
1192 server->max_read = le32_to_cpu(rsp->MaxReadSize); in SMB2_negotiate()
1193 server->max_write = le32_to_cpu(rsp->MaxWriteSize); in SMB2_negotiate()
1194 server->sec_mode = le16_to_cpu(rsp->SecurityMode); in SMB2_negotiate()
1195 if ((server->sec_mode & SMB2_SEC_MODE_FLAGS_ALL) != server->sec_mode) in SMB2_negotiate()
1197 server->sec_mode); in SMB2_negotiate()
1198 server->capabilities = le32_to_cpu(rsp->Capabilities); in SMB2_negotiate()
1200 server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; in SMB2_negotiate()
1206 if (server->dialect == SMB30_PROT_ID && (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_negotiate()
1207 server->cipher_type = SMB2_ENCRYPTION_AES128_CCM; in SMB2_negotiate()
1212 * See MS-SMB2 section 2.2.4: if no blob, client picks default which in SMB2_negotiate()
1214 * ses->sectype = RawNTLMSSP; in SMB2_negotiate()
1220 server->sec_ntlmssp = true; in SMB2_negotiate()
1223 rc = cifs_enable_signing(server, ses->sign); in SMB2_negotiate()
1231 rc = -EIO; in SMB2_negotiate()
1234 if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
1235 if (rsp->NegotiateContextCount) in SMB2_negotiate()
1246 int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) in smb3_validate_negotiate() argument
1253 struct TCP_Server_Info *server = tcon->ses->server; in smb3_validate_negotiate()
1258 if (server->dialect == SMB311_PROT_ID) in smb3_validate_negotiate()
1268 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) in smb3_validate_negotiate()
1271 if (tcon->ses->user_name == NULL) { in smb3_validate_negotiate()
1276 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL) in smb3_validate_negotiate()
1281 return -ENOMEM; in smb3_validate_negotiate()
1283 pneg_inbuf->Capabilities = in smb3_validate_negotiate()
1284 cpu_to_le32(server->vals->req_capabilities); in smb3_validate_negotiate()
1285 if (tcon->ses->chan_max > 1) in smb3_validate_negotiate()
1286 pneg_inbuf->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in smb3_validate_negotiate()
1288 memcpy(pneg_inbuf->Guid, server->client_guid, in smb3_validate_negotiate()
1291 if (tcon->ses->sign) in smb3_validate_negotiate()
1292 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1295 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1298 pneg_inbuf->SecurityMode = 0; in smb3_validate_negotiate()
1301 if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1303 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1304 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1305 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1306 pneg_inbuf->DialectCount = cpu_to_le16(3); in smb3_validate_negotiate()
1308 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1309 (sizeof(pneg_inbuf->Dialects[0])); in smb3_validate_negotiate()
1310 } else if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1312 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in smb3_validate_negotiate()
1313 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1314 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1315 pneg_inbuf->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1316 pneg_inbuf->DialectCount = cpu_to_le16(4); in smb3_validate_negotiate()
1321 pneg_inbuf->Dialects[0] = in smb3_validate_negotiate()
1322 cpu_to_le16(server->vals->protocol_id); in smb3_validate_negotiate()
1323 pneg_inbuf->DialectCount = cpu_to_le16(1); in smb3_validate_negotiate()
1325 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1326 sizeof(pneg_inbuf->Dialects[0]) * 3; in smb3_validate_negotiate()
1329 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in smb3_validate_negotiate()
1333 if (rc == -EOPNOTSUPP) { in smb3_validate_negotiate()
1344 rc = -EIO; in smb3_validate_negotiate()
1348 rc = -EIO; in smb3_validate_negotiate()
1359 if (pneg_rsp->Dialect != cpu_to_le16(server->dialect)) in smb3_validate_negotiate()
1362 if (pneg_rsp->SecurityMode != cpu_to_le16(server->sec_mode)) in smb3_validate_negotiate()
1367 if ((le32_to_cpu(pneg_rsp->Capabilities) | SMB2_NT_FIND | in smb3_validate_negotiate()
1368 SMB2_LARGE_FILES) != server->capabilities) in smb3_validate_negotiate()
1377 cifs_tcon_dbg(VFS, "protocol revalidation - security settings mismatch\n"); in smb3_validate_negotiate()
1395 if (server->sec_ntlmssp && in smb2_select_sectype()
1398 if ((server->sec_kerberos || server->sec_mskerberos) && in smb2_select_sectype()
1431 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_alloc_buffer()
1432 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_alloc_buffer()
1443 spin_lock(&ses->ses_lock); in SMB2_sess_alloc_buffer()
1444 is_binding = (ses->ses_status == SES_GOOD); in SMB2_sess_alloc_buffer()
1445 spin_unlock(&ses->ses_lock); in SMB2_sess_alloc_buffer()
1448 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_sess_alloc_buffer()
1449 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_sess_alloc_buffer()
1450 req->PreviousSessionId = 0; in SMB2_sess_alloc_buffer()
1451 req->Flags = SMB2_SESSION_REQ_FLAG_BINDING; in SMB2_sess_alloc_buffer()
1452 cifs_dbg(FYI, "Binding to sess id: %llx\n", ses->Suid); in SMB2_sess_alloc_buffer()
1455 req->hdr.SessionId = 0; in SMB2_sess_alloc_buffer()
1460 req->PreviousSessionId = cpu_to_le64(sess_data->previous_session); in SMB2_sess_alloc_buffer()
1461 req->Flags = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1463 sess_data->previous_session); in SMB2_sess_alloc_buffer()
1467 if (server->credits >= server->max_credits) in SMB2_sess_alloc_buffer()
1468 req->hdr.CreditRequest = cpu_to_le16(0); in SMB2_sess_alloc_buffer()
1470 req->hdr.CreditRequest = cpu_to_le16( in SMB2_sess_alloc_buffer()
1471 min_t(int, server->max_credits - in SMB2_sess_alloc_buffer()
1472 server->credits, 130)); in SMB2_sess_alloc_buffer()
1475 if (server->sign) in SMB2_sess_alloc_buffer()
1476 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED; in SMB2_sess_alloc_buffer()
1478 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED; in SMB2_sess_alloc_buffer()
1480 req->SecurityMode = 0; in SMB2_sess_alloc_buffer()
1483 req->Capabilities = cpu_to_le32(SMB2_GLOBAL_CAP_DFS); in SMB2_sess_alloc_buffer()
1485 req->Capabilities = 0; in SMB2_sess_alloc_buffer()
1488 req->Channel = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1490 sess_data->iov[0].iov_base = (char *)req; in SMB2_sess_alloc_buffer()
1492 sess_data->iov[0].iov_len = total_len - 1; in SMB2_sess_alloc_buffer()
1497 sess_data->buf0_type = CIFS_SMALL_BUFFER; in SMB2_sess_alloc_buffer()
1505 struct kvec *iov = sess_data->iov; in SMB2_sess_free_buffer()
1508 if (sess_data->buf0_type != CIFS_NO_BUFFER && iov[0].iov_base) in SMB2_sess_free_buffer()
1511 free_rsp_buf(sess_data->buf0_type, iov[0].iov_base); in SMB2_sess_free_buffer()
1512 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_free_buffer()
1520 struct smb2_sess_setup_req *req = sess_data->iov[0].iov_base; in SMB2_sess_sendreceive()
1524 req->SecurityBufferOffset = in SMB2_sess_sendreceive()
1526 req->SecurityBufferLength = cpu_to_le16(sess_data->iov[1].iov_len); in SMB2_sess_sendreceive()
1529 rqst.rq_iov = sess_data->iov; in SMB2_sess_sendreceive()
1533 rc = cifs_send_recv(sess_data->xid, sess_data->ses, in SMB2_sess_sendreceive()
1534 sess_data->server, in SMB2_sess_sendreceive()
1536 &sess_data->buf0_type, in SMB2_sess_sendreceive()
1538 cifs_small_buf_release(sess_data->iov[0].iov_base); in SMB2_sess_sendreceive()
1539 memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec)); in SMB2_sess_sendreceive()
1548 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_establish_session()
1549 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_establish_session()
1552 if (server->ops->generate_signingkey) { in SMB2_sess_establish_session()
1553 rc = server->ops->generate_signingkey(ses, server); in SMB2_sess_establish_session()
1561 if (!server->session_estab) { in SMB2_sess_establish_session()
1562 server->sequence_number = 0x2; in SMB2_sess_establish_session()
1563 server->session_estab = true; in SMB2_sess_establish_session()
1576 struct cifs_ses *ses = sess_data->ses; in SMB2_auth_kerberos()
1577 struct TCP_Server_Info *server = sess_data->server; in SMB2_auth_kerberos()
1590 if (rc == -ENOKEY) in SMB2_auth_kerberos()
1596 msg = spnego_key->payload.data[0]; in SMB2_auth_kerberos()
1601 if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { in SMB2_auth_kerberos()
1603 CIFS_SPNEGO_UPCALL_VERSION, msg->version); in SMB2_auth_kerberos()
1604 rc = -EKEYREJECTED; in SMB2_auth_kerberos()
1608 spin_lock(&ses->ses_lock); in SMB2_auth_kerberos()
1609 is_binding = (ses->ses_status == SES_GOOD); in SMB2_auth_kerberos()
1610 spin_unlock(&ses->ses_lock); in SMB2_auth_kerberos()
1614 kfree_sensitive(ses->auth_key.response); in SMB2_auth_kerberos()
1615 ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len, in SMB2_auth_kerberos()
1617 if (!ses->auth_key.response) { in SMB2_auth_kerberos()
1619 msg->sesskey_len); in SMB2_auth_kerberos()
1620 rc = -ENOMEM; in SMB2_auth_kerberos()
1623 ses->auth_key.len = msg->sesskey_len; in SMB2_auth_kerberos()
1626 sess_data->iov[1].iov_base = msg->data + msg->sesskey_len; in SMB2_auth_kerberos()
1627 sess_data->iov[1].iov_len = msg->secblob_len; in SMB2_auth_kerberos()
1633 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_auth_kerberos()
1636 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_auth_kerberos()
1637 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_auth_kerberos()
1645 kfree_sensitive(ses->auth_key.response); in SMB2_auth_kerberos()
1646 ses->auth_key.response = NULL; in SMB2_auth_kerberos()
1647 ses->auth_key.len = 0; in SMB2_auth_kerberos()
1650 sess_data->result = rc; in SMB2_auth_kerberos()
1651 sess_data->func = NULL; in SMB2_auth_kerberos()
1659 sess_data->result = -EOPNOTSUPP; in SMB2_auth_kerberos()
1660 sess_data->func = NULL; in SMB2_auth_kerberos()
1671 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_negotiate()
1672 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_auth_rawntlmssp_negotiate()
1683 ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL); in SMB2_sess_auth_rawntlmssp_negotiate()
1684 if (!ses->ntlmssp) { in SMB2_sess_auth_rawntlmssp_negotiate()
1685 rc = -ENOMEM; in SMB2_sess_auth_rawntlmssp_negotiate()
1688 ses->ntlmssp->sesskey_per_smbsess = true; in SMB2_sess_auth_rawntlmssp_negotiate()
1696 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_negotiate()
1703 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_negotiate()
1706 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_negotiate()
1707 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_negotiate()
1710 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_negotiate()
1713 if (sess_data->buf0_type != CIFS_NO_BUFFER && in SMB2_sess_auth_rawntlmssp_negotiate()
1714 rsp->hdr.Status == STATUS_MORE_PROCESSING_REQUIRED) in SMB2_sess_auth_rawntlmssp_negotiate()
1721 le16_to_cpu(rsp->SecurityBufferOffset)) { in SMB2_sess_auth_rawntlmssp_negotiate()
1723 le16_to_cpu(rsp->SecurityBufferOffset)); in SMB2_sess_auth_rawntlmssp_negotiate()
1724 rc = -EIO; in SMB2_sess_auth_rawntlmssp_negotiate()
1727 rc = decode_ntlmssp_challenge(rsp->Buffer, in SMB2_sess_auth_rawntlmssp_negotiate()
1728 le16_to_cpu(rsp->SecurityBufferLength), ses); in SMB2_sess_auth_rawntlmssp_negotiate()
1734 spin_lock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_negotiate()
1735 is_binding = (ses->ses_status == SES_GOOD); in SMB2_sess_auth_rawntlmssp_negotiate()
1736 spin_unlock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_negotiate()
1740 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_sess_auth_rawntlmssp_negotiate()
1741 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_negotiate()
1748 sess_data->result = 0; in SMB2_sess_auth_rawntlmssp_negotiate()
1749 sess_data->func = SMB2_sess_auth_rawntlmssp_authenticate; in SMB2_sess_auth_rawntlmssp_negotiate()
1753 kfree_sensitive(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_negotiate()
1754 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1755 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_negotiate()
1756 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1763 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_authenticate()
1764 struct TCP_Server_Info *server = sess_data->server; in SMB2_sess_auth_rawntlmssp_authenticate()
1776 req = (struct smb2_sess_setup_req *) sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1777 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1781 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_authenticate()
1790 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_authenticate()
1793 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_authenticate()
1794 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_authenticate()
1800 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1802 spin_lock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_authenticate()
1803 is_binding = (ses->ses_status == SES_GOOD); in SMB2_sess_auth_rawntlmssp_authenticate()
1804 spin_unlock(&ses->ses_lock); in SMB2_sess_auth_rawntlmssp_authenticate()
1808 ses->Suid = le64_to_cpu(rsp->hdr.SessionId); in SMB2_sess_auth_rawntlmssp_authenticate()
1809 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_authenticate()
1814 if (ses->server->dialect < SMB30_PROT_ID) { in SMB2_sess_auth_rawntlmssp_authenticate()
1820 cifs_dbg(VFS, "Session Id %*ph\n", (int)sizeof(ses->Suid), in SMB2_sess_auth_rawntlmssp_authenticate()
1821 &ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1823 SMB2_NTLMV2_SESSKEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1825 SMB3_SIGN_KEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1831 kfree_sensitive(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_authenticate()
1832 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1833 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_authenticate()
1834 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1841 struct cifs_ses *ses = sess_data->ses; in SMB2_select_sec()
1842 struct TCP_Server_Info *server = sess_data->server; in SMB2_select_sec()
1844 type = smb2_select_sectype(server, ses->sectype); in SMB2_select_sec()
1848 return -EINVAL; in SMB2_select_sec()
1853 sess_data->func = SMB2_auth_kerberos; in SMB2_select_sec()
1856 sess_data->func = SMB2_sess_auth_rawntlmssp_negotiate; in SMB2_select_sec()
1860 return -EOPNOTSUPP; in SMB2_select_sec()
1878 return -EIO; in SMB2_sess_setup()
1883 return -ENOMEM; in SMB2_sess_setup()
1885 sess_data->xid = xid; in SMB2_sess_setup()
1886 sess_data->ses = ses; in SMB2_sess_setup()
1887 sess_data->server = server; in SMB2_sess_setup()
1888 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_setup()
1889 sess_data->nls_cp = (struct nls_table *) nls_cp; in SMB2_sess_setup()
1890 sess_data->previous_session = ses->Suid; in SMB2_sess_setup()
1899 memcpy(ses->preauth_sha_hash, server->preauth_sha_hash, in SMB2_sess_setup()
1902 while (sess_data->func) in SMB2_sess_setup()
1903 sess_data->func(sess_data); in SMB2_sess_setup()
1905 if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign)) in SMB2_sess_setup()
1907 rc = sess_data->result; in SMB2_sess_setup()
1928 if (ses && (ses->server)) in SMB2_logoff()
1929 server = ses->server; in SMB2_logoff()
1931 return -EIO; in SMB2_logoff()
1934 spin_lock(&ses->chan_lock); in SMB2_logoff()
1936 spin_unlock(&ses->chan_lock); in SMB2_logoff()
1939 spin_unlock(&ses->chan_lock); in SMB2_logoff()
1941 rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, ses->server, in SMB2_logoff()
1946 /* since no tcon, smb2_init can not do this, so do here */ in SMB2_logoff()
1947 req->hdr.SessionId = cpu_to_le64(ses->Suid); in SMB2_logoff()
1949 if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) in SMB2_logoff()
1951 else if (server->sign) in SMB2_logoff()
1952 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_logoff()
1963 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_logoff()
1967 * No tcon so can't do in SMB2_logoff()
1968 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_logoff()
1975 static inline void cifs_stats_fail_inc(struct cifs_tcon *tcon, uint16_t code) in cifs_stats_fail_inc() argument
1977 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_failed[code]); in cifs_stats_fail_inc()
1983 static inline void init_copy_chunk_defaults(struct cifs_tcon *tcon) in init_copy_chunk_defaults() argument
1985 tcon->max_chunks = 256; in init_copy_chunk_defaults()
1986 tcon->max_bytes_chunk = 1048576; in init_copy_chunk_defaults()
1987 tcon->max_bytes_copy = 16777216; in init_copy_chunk_defaults()
1992 struct cifs_tcon *tcon, const struct nls_table *cp) in SMB2_tcon() argument
2007 /* always use master channel */ in SMB2_tcon()
2008 server = ses->server; in SMB2_tcon()
2010 cifs_dbg(FYI, "TCON\n"); in SMB2_tcon()
2013 return -EIO; in SMB2_tcon()
2017 return -ENOMEM; in SMB2_tcon()
2022 return -EINVAL; in SMB2_tcon()
2027 tcon->tid = 0; in SMB2_tcon()
2028 atomic_set(&tcon->num_remote_opens, 0); in SMB2_tcon()
2029 rc = smb2_plain_req_init(SMB2_TREE_CONNECT, tcon, server, in SMB2_tcon()
2036 if (smb3_encryption_required(tcon)) in SMB2_tcon()
2041 iov[0].iov_len = total_len - 1; in SMB2_tcon()
2044 req->PathOffset = cpu_to_le16(sizeof(struct smb2_tree_connect_req)); in SMB2_tcon()
2045 req->PathLength = cpu_to_le16(unc_path_len); in SMB2_tcon()
2050 * 3.11 tcon req must be signed if not encrypted. See MS-SMB2 3.2.4.1.1 in SMB2_tcon()
2051 * unless it is guest or anonymous user. See MS-SMB2 3.2.5.3.1 in SMB2_tcon()
2054 if ((server->dialect == SMB311_PROT_ID) && in SMB2_tcon()
2055 !smb3_encryption_required(tcon) && in SMB2_tcon()
2056 !(ses->session_flags & in SMB2_tcon()
2058 ((ses->user_name != NULL) || (ses->sectype == Kerberos))) in SMB2_tcon()
2059 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_tcon()
2066 if (server->credits >= server->max_credits) in SMB2_tcon()
2067 req->hdr.CreditRequest = cpu_to_le16(0); in SMB2_tcon()
2069 req->hdr.CreditRequest = cpu_to_le16( in SMB2_tcon()
2070 min_t(int, server->max_credits - in SMB2_tcon()
2071 server->credits, 64)); in SMB2_tcon()
2077 trace_smb3_tcon(xid, tcon->tid, ses->Suid, tree, rc); in SMB2_tcon()
2079 cifs_stats_fail_inc(tcon, SMB2_TREE_CONNECT_HE); in SMB2_tcon()
2080 tcon->need_reconnect = true; in SMB2_tcon()
2084 switch (rsp->ShareType) { in SMB2_tcon()
2089 tcon->pipe = true; in SMB2_tcon()
2093 tcon->print = true; in SMB2_tcon()
2097 cifs_server_dbg(VFS, "unknown share type %d\n", rsp->ShareType); in SMB2_tcon()
2098 rc = -EOPNOTSUPP; in SMB2_tcon()
2102 tcon->share_flags = le32_to_cpu(rsp->ShareFlags); in SMB2_tcon()
2103 tcon->capabilities = rsp->Capabilities; /* we keep caps little endian */ in SMB2_tcon()
2104 tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess); in SMB2_tcon()
2105 tcon->tid = le32_to_cpu(rsp->hdr.Id.SyncId.TreeId); in SMB2_tcon()
2106 strscpy(tcon->tree_name, tree, sizeof(tcon->tree_name)); in SMB2_tcon()
2108 if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) && in SMB2_tcon()
2109 ((tcon->share_flags & SHI1005_FLAGS_DFS) == 0)) in SMB2_tcon()
2112 if (tcon->seal && in SMB2_tcon()
2113 !(server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_tcon()
2116 init_copy_chunk_defaults(tcon); in SMB2_tcon()
2117 if (server->ops->validate_negotiate) in SMB2_tcon()
2118 rc = server->ops->validate_negotiate(xid, tcon); in SMB2_tcon()
2119 if (rc == 0) /* See MS-SMB2 2.2.10 and 3.2.5.5 */ in SMB2_tcon()
2120 if (tcon->share_flags & SMB2_SHAREFLAG_ISOLATED_TRANSPORT) in SMB2_tcon()
2121 server->nosharesock = true; in SMB2_tcon()
2129 if (rsp && rsp->hdr.Status == STATUS_BAD_NETWORK_NAME) in SMB2_tcon()
2135 SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon) in SMB2_tdis() argument
2140 struct cifs_ses *ses = tcon->ses; in SMB2_tdis()
2149 if (!ses || !(ses->server)) in SMB2_tdis()
2150 return -EIO; in SMB2_tdis()
2152 trace_smb3_tdis_enter(xid, tcon->tid, ses->Suid, tcon->tree_name); in SMB2_tdis()
2153 spin_lock(&ses->chan_lock); in SMB2_tdis()
2154 if ((tcon->need_reconnect) || in SMB2_tdis()
2155 (CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses))) { in SMB2_tdis()
2156 spin_unlock(&ses->chan_lock); in SMB2_tdis()
2159 spin_unlock(&ses->chan_lock); in SMB2_tdis()
2161 invalidate_all_cached_dirs(tcon); in SMB2_tdis()
2163 rc = smb2_plain_req_init(SMB2_TREE_DISCONNECT, tcon, ses->server, in SMB2_tdis()
2169 if (smb3_encryption_required(tcon)) in SMB2_tdis()
2181 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_tdis()
2185 cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE); in SMB2_tdis()
2186 trace_smb3_tdis_err(xid, tcon->tid, ses->Suid, rc); in SMB2_tdis()
2188 trace_smb3_tdis_done(xid, tcon->tid, ses->Suid); in SMB2_tdis()
2203 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_buf()
2205 buf->ccontext.DataLength = cpu_to_le32(16); in create_durable_buf()
2206 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_buf()
2208 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_buf()
2210 buf->Name[0] = 'D'; in create_durable_buf()
2211 buf->Name[1] = 'H'; in create_durable_buf()
2212 buf->Name[2] = 'n'; in create_durable_buf()
2213 buf->Name[3] = 'Q'; in create_durable_buf()
2226 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
2228 buf->ccontext.DataLength = cpu_to_le32(16); in create_reconnect_durable_buf()
2229 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
2231 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_buf()
2232 buf->Data.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_buf()
2233 buf->Data.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_buf()
2235 buf->Name[0] = 'D'; in create_reconnect_durable_buf()
2236 buf->Name[1] = 'H'; in create_reconnect_durable_buf()
2237 buf->Name[2] = 'n'; in create_reconnect_durable_buf()
2238 buf->Name[3] = 'C'; in create_reconnect_durable_buf()
2248 pdisk_id->DiskFileId, pdisk_id->VolumeId); in parse_query_id_ctxt()
2249 buf->IndexNumber = pdisk_id->DiskFileId; in parse_query_id_ctxt()
2257 u8 *beg = (u8 *)cc + le16_to_cpu(cc->DataOffset); in parse_posix_ctxt()
2258 u8 *end = beg + le32_to_cpu(cc->DataLength); in parse_posix_ctxt()
2263 posix->nlink = le32_to_cpu(*(__le32 *)(beg + 0)); in parse_posix_ctxt()
2264 posix->reparse_tag = le32_to_cpu(*(__le32 *)(beg + 4)); in parse_posix_ctxt()
2265 posix->mode = le32_to_cpu(*(__le32 *)(beg + 8)); in parse_posix_ctxt()
2273 memcpy(&posix->owner, sid, sid_len); in parse_posix_ctxt()
2281 memcpy(&posix->group, sid, sid_len); in parse_posix_ctxt()
2284 posix->nlink, posix->mode, posix->reparse_tag); in parse_posix_ctxt()
2294 struct smb2_create_rsp *rsp = rsp_iov->iov_base; in smb2_parse_contexts()
2308 off = le32_to_cpu(rsp->CreateContextsOffset); in smb2_parse_contexts()
2309 rem = le32_to_cpu(rsp->CreateContextsLength); in smb2_parse_contexts()
2310 if (check_add_overflow(off, rem, &len) || len > rsp_iov->iov_len) in smb2_parse_contexts()
2311 return -EINVAL; in smb2_parse_contexts()
2316 buf->IndexNumber = 0; in smb2_parse_contexts()
2319 doff = le16_to_cpu(cc->DataOffset); in smb2_parse_contexts()
2320 dlen = le32_to_cpu(cc->DataLength); in smb2_parse_contexts()
2322 return -EINVAL; in smb2_parse_contexts()
2324 noff = le16_to_cpu(cc->NameOffset); in smb2_parse_contexts()
2325 nlen = le16_to_cpu(cc->NameLength); in smb2_parse_contexts()
2327 return -EINVAL; in smb2_parse_contexts()
2333 *oplock = server->ops->parse_lease_buf(cc, epoch, in smb2_parse_contexts()
2352 off = le32_to_cpu(cc->Next); in smb2_parse_contexts()
2356 return -EINVAL; in smb2_parse_contexts()
2360 if (rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE) in smb2_parse_contexts()
2361 *oplock = rsp->OplockLevel; in smb2_parse_contexts()
2374 iov[num].iov_base = server->ops->create_lease_buf(lease_key, *oplock); in add_lease_context()
2376 return -ENOMEM; in add_lease_context()
2377 iov[num].iov_len = server->vals->create_lease_size; in add_lease_context()
2378 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE; in add_lease_context()
2386 struct cifs_fid *pfid = oparms->fid; in create_durable_v2_buf()
2393 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2395 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct durable_context_v2)); in create_durable_v2_buf()
2396 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2398 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_v2_buf()
2407 buf->dcontext.Timeout = cpu_to_le32(oparms->tcon->handle_timeout); in create_durable_v2_buf()
2408 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_durable_v2_buf()
2409 generate_random_uuid(buf->dcontext.CreateGuid); in create_durable_v2_buf()
2410 memcpy(pfid->create_guid, buf->dcontext.CreateGuid, 16); in create_durable_v2_buf()
2413 buf->Name[0] = 'D'; in create_durable_v2_buf()
2414 buf->Name[1] = 'H'; in create_durable_v2_buf()
2415 buf->Name[2] = '2'; in create_durable_v2_buf()
2416 buf->Name[3] = 'Q'; in create_durable_v2_buf()
2430 buf->ccontext.DataOffset = in create_reconnect_durable_v2_buf()
2433 buf->ccontext.DataLength = in create_reconnect_durable_v2_buf()
2435 buf->ccontext.NameOffset = in create_reconnect_durable_v2_buf()
2438 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_v2_buf()
2440 buf->dcontext.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_v2_buf()
2441 buf->dcontext.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_v2_buf()
2442 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_reconnect_durable_v2_buf()
2443 memcpy(buf->dcontext.CreateGuid, fid->create_guid, 16); in create_reconnect_durable_v2_buf()
2446 buf->Name[0] = 'D'; in create_reconnect_durable_v2_buf()
2447 buf->Name[1] = 'H'; in create_reconnect_durable_v2_buf()
2448 buf->Name[2] = '2'; in create_reconnect_durable_v2_buf()
2449 buf->Name[3] = 'C'; in create_reconnect_durable_v2_buf()
2461 return -ENOMEM; in add_durable_v2_context()
2474 oparms->reconnect = false; in add_durable_reconnect_v2_context()
2476 iov[num].iov_base = create_reconnect_durable_v2_buf(oparms->fid); in add_durable_reconnect_v2_context()
2478 return -ENOMEM; in add_durable_reconnect_v2_context()
2491 if (oparms->reconnect) in add_durable_context()
2498 if (oparms->reconnect) { in add_durable_context()
2499 iov[num].iov_base = create_reconnect_durable_buf(oparms->fid); in add_durable_context()
2501 oparms->reconnect = false; in add_durable_context()
2505 return -ENOMEM; in add_durable_context()
2511 /* See MS-SMB2 2.2.13.2.7 */
2521 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_twarp_buf()
2523 buf->ccontext.DataLength = cpu_to_le32(8); in create_twarp_buf()
2524 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_twarp_buf()
2526 buf->ccontext.NameLength = cpu_to_le16(4); in create_twarp_buf()
2528 buf->Name[0] = 'T'; in create_twarp_buf()
2529 buf->Name[1] = 'W'; in create_twarp_buf()
2530 buf->Name[2] = 'r'; in create_twarp_buf()
2531 buf->Name[3] = 'p'; in create_twarp_buf()
2532 buf->Timestamp = cpu_to_le64(timewarp); in create_twarp_buf()
2536 /* See MS-SMB2 2.2.13.2.7 */
2544 return -ENOMEM; in add_twarp_context()
2550 /* See http://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */
2555 /* Populate the user ownership fields S-1-5-88-1 */ in setup_owner_group_sids()
2556 sids->owner.Revision = 1; in setup_owner_group_sids()
2557 sids->owner.NumAuth = 3; in setup_owner_group_sids()
2558 sids->owner.Authority[5] = 5; in setup_owner_group_sids()
2559 sids->owner.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2560 sids->owner.SubAuthorities[1] = cpu_to_le32(1); in setup_owner_group_sids()
2561 sids->owner.SubAuthorities[2] = cpu_to_le32(current_fsuid().val); in setup_owner_group_sids()
2563 /* Populate the group ownership fields S-1-5-88-2 */ in setup_owner_group_sids()
2564 sids->group.Revision = 1; in setup_owner_group_sids()
2565 sids->group.NumAuth = 3; in setup_owner_group_sids()
2566 sids->group.Authority[5] = 5; in setup_owner_group_sids()
2567 sids->group.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2568 sids->group.SubAuthorities[1] = cpu_to_le32(2); in setup_owner_group_sids()
2569 sids->group.SubAuthorities[2] = cpu_to_le32(current_fsgid().val); in setup_owner_group_sids()
2571 …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()
2574 /* See MS-SMB2 2.2.13.2.2 and MS-DTYP 2.4.6 */
2599 owner_offset = ptr - (__u8 *)&buf->sd; in create_sd_buf()
2600 buf->sd.OffsetOwner = cpu_to_le32(owner_offset); in create_sd_buf()
2602 buf->sd.OffsetGroup = cpu_to_le32(group_offset); in create_sd_buf()
2607 buf->sd.OffsetOwner = 0; in create_sd_buf()
2608 buf->sd.OffsetGroup = 0; in create_sd_buf()
2611 buf->ccontext.DataOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, sd)); in create_sd_buf()
2612 buf->ccontext.NameOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, Name)); in create_sd_buf()
2613 buf->ccontext.NameLength = cpu_to_le16(4); in create_sd_buf()
2615 buf->Name[0] = 'S'; in create_sd_buf()
2616 buf->Name[1] = 'e'; in create_sd_buf()
2617 buf->Name[2] = 'c'; in create_sd_buf()
2618 buf->Name[3] = 'D'; in create_sd_buf()
2619 buf->sd.Revision = 1; /* Must be one see MS-DTYP 2.4.6 */ in create_sd_buf()
2625 buf->sd.Control = cpu_to_le16(ACL_CONTROL_SR | ACL_CONTROL_DP); in create_sd_buf()
2628 buf->sd.OffsetDacl = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2653 acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */ in create_sd_buf()
2659 buf->ccontext.DataLength = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2660 *len = round_up((unsigned int)(ptr - (__u8 *)buf), 8); in create_sd_buf()
2673 return -ENOMEM; in add_sd_context()
2688 buf->ccontext.DataOffset = cpu_to_le16(0); in create_query_id_buf()
2689 buf->ccontext.DataLength = cpu_to_le32(0); in create_query_id_buf()
2690 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_query_id_buf()
2692 buf->ccontext.NameLength = cpu_to_le16(4); in create_query_id_buf()
2694 buf->Name[0] = 'Q'; in create_query_id_buf()
2695 buf->Name[1] = 'F'; in create_query_id_buf()
2696 buf->Name[2] = 'i'; in create_query_id_buf()
2697 buf->Name[3] = 'd'; in create_query_id_buf()
2701 /* See MS-SMB2 2.2.13.2.9 */
2709 return -ENOMEM; in add_query_id_context()
2728 return -EINVAL; in alloc_path_with_tree_prefix()
2731 treename_len -= 2; in alloc_path_with_tree_prefix()
2739 * final path needs to be 8-byte aligned as specified in in alloc_path_with_tree_prefix()
2740 * MS-SMB2 2.2.13 SMB2 CREATE Request. in alloc_path_with_tree_prefix()
2745 return -ENOMEM; in alloc_path_with_tree_prefix()
2762 umode_t mode, struct cifs_tcon *tcon, in smb311_posix_mkdir() argument
2769 struct cifs_ses *ses = tcon->ses; in smb311_posix_mkdir()
2790 return -ENOMEM; in smb311_posix_mkdir()
2793 rc = -EIO; in smb311_posix_mkdir()
2798 rc = smb2_plain_req_init(SMB2_CREATE, tcon, server, in smb311_posix_mkdir()
2804 if (smb3_encryption_required(tcon)) in smb311_posix_mkdir()
2807 req->ImpersonationLevel = IL_IMPERSONATION; in smb311_posix_mkdir()
2808 req->DesiredAccess = cpu_to_le32(FILE_WRITE_ATTRIBUTES); in smb311_posix_mkdir()
2810 req->FileAttributes = cpu_to_le32(file_attributes); in smb311_posix_mkdir()
2811 req->ShareAccess = FILE_SHARE_ALL_LE; in smb311_posix_mkdir()
2812 req->CreateDisposition = cpu_to_le32(FILE_CREATE); in smb311_posix_mkdir()
2813 req->CreateOptions = cpu_to_le32(CREATE_NOT_FILE); in smb311_posix_mkdir()
2816 /* -1 since last byte is buf[0] which is sent below (path) */ in smb311_posix_mkdir()
2817 iov[0].iov_len = total_len - 1; in smb311_posix_mkdir()
2819 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in smb311_posix_mkdir()
2821 /* [MS-SMB2] 2.2.13 NameOffset: in smb311_posix_mkdir()
2829 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in smb311_posix_mkdir()
2832 req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in smb311_posix_mkdir()
2835 tcon->tree_name, utf16_path); in smb311_posix_mkdir()
2839 req->NameLength = cpu_to_le16(name_len * 2); in smb311_posix_mkdir()
2847 req->NameLength = cpu_to_le16(uni_path_len - 2); in smb311_posix_mkdir()
2852 rc = -ENOMEM; in smb311_posix_mkdir()
2866 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_NONE; in smb311_posix_mkdir()
2868 if (tcon->posix_extensions) { in smb311_posix_mkdir()
2873 req->CreateContextsOffset = cpu_to_le32( in smb311_posix_mkdir()
2876 pc_buf = iov[n_iov-1].iov_base; in smb311_posix_mkdir()
2885 trace_smb3_posix_mkdir_enter(xid, tcon->tid, ses->Suid, full_path, CREATE_NOT_FILE, in smb311_posix_mkdir()
2891 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE); in smb311_posix_mkdir()
2892 trace_smb3_posix_mkdir_err(xid, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2905 rc = -EIO; in smb311_posix_mkdir()
2910 trace_smb3_posix_mkdir_done(xid, rsp->PersistentFileId, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2913 SMB2_close(xid, tcon, rsp->PersistentFileId, rsp->VolatileFileId); in smb311_posix_mkdir()
2928 SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_open_init() argument
2938 struct kvec *iov = rqst->rq_iov; in SMB2_open_init()
2942 rc = smb2_plain_req_init(SMB2_CREATE, tcon, server, in SMB2_open_init()
2948 /* -1 since last byte is buf[0] which is sent below (path) */ in SMB2_open_init()
2949 iov[0].iov_len = total_len - 1; in SMB2_open_init()
2951 if (oparms->create_options & CREATE_OPTION_READONLY) in SMB2_open_init()
2953 if (oparms->create_options & CREATE_OPTION_SPECIAL) in SMB2_open_init()
2956 req->ImpersonationLevel = IL_IMPERSONATION; in SMB2_open_init()
2957 req->DesiredAccess = cpu_to_le32(oparms->desired_access); in SMB2_open_init()
2959 req->FileAttributes = cpu_to_le32(file_attributes); in SMB2_open_init()
2960 req->ShareAccess = FILE_SHARE_ALL_LE; in SMB2_open_init()
2962 req->CreateDisposition = cpu_to_le32(oparms->disposition); in SMB2_open_init()
2963 req->CreateOptions = cpu_to_le32(oparms->create_options & CREATE_OPTIONS_MASK); in SMB2_open_init()
2964 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in SMB2_open_init()
2966 /* [MS-SMB2] 2.2.13 NameOffset: in SMB2_open_init()
2974 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in SMB2_open_init()
2977 req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in SMB2_open_init()
2980 tcon->tree_name, path); in SMB2_open_init()
2983 req->NameLength = cpu_to_le16(name_len * 2); in SMB2_open_init()
2989 req->NameLength = cpu_to_le16(uni_path_len - 2); in SMB2_open_init()
2993 return -ENOMEM; in SMB2_open_init()
3003 if ((!server->oplocks) || (tcon->no_lease)) in SMB2_open_init()
3006 if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) || in SMB2_open_init()
3008 req->RequestedOplockLevel = *oplock; in SMB2_open_init()
3009 else if (!(server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) && in SMB2_open_init()
3010 (oparms->create_options & CREATE_NOT_FILE)) in SMB2_open_init()
3011 req->RequestedOplockLevel = *oplock; /* no srv lease support */ in SMB2_open_init()
3014 oparms->fid->lease_key, oplock); in SMB2_open_init()
3021 tcon->use_persistent); in SMB2_open_init()
3026 if (tcon->posix_extensions) { in SMB2_open_init()
3027 rc = add_posix_context(iov, &n_iov, oparms->mode); in SMB2_open_init()
3032 if (tcon->snapshot_time) { in SMB2_open_init()
3034 rc = add_twarp_context(iov, &n_iov, tcon->snapshot_time); in SMB2_open_init()
3039 if ((oparms->disposition != FILE_OPEN) && (oparms->cifs_sb)) { in SMB2_open_init()
3043 if ((oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) && in SMB2_open_init()
3044 (oparms->mode != ACL_NO_MODE)) in SMB2_open_init()
3048 oparms->mode = ACL_NO_MODE; in SMB2_open_init()
3051 if (oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL) in SMB2_open_init()
3057 cifs_dbg(FYI, "add sd with mode 0x%x\n", oparms->mode); in SMB2_open_init()
3058 rc = add_sd_context(iov, &n_iov, oparms->mode, set_owner); in SMB2_open_init()
3071 req->CreateContextsOffset = cpu_to_le32( in SMB2_open_init()
3074 req->CreateContextsLength = 0; in SMB2_open_init()
3076 for (unsigned int i = 2; i < (n_iov-1); i++) { in SMB2_open_init()
3078 size_t len = v->iov_len; in SMB2_open_init()
3080 (struct create_context *)v->iov_base; in SMB2_open_init()
3082 cctx->Next = cpu_to_le32(len); in SMB2_open_init()
3083 le32_add_cpu(&req->CreateContextsLength, len); in SMB2_open_init()
3085 le32_add_cpu(&req->CreateContextsLength, in SMB2_open_init()
3086 iov[n_iov-1].iov_len); in SMB2_open_init()
3089 rqst->rq_nvec = n_iov; in SMB2_open_init()
3101 if (rqst && rqst->rq_iov) { in SMB2_open_free()
3102 cifs_small_buf_release(rqst->rq_iov[0].iov_base); in SMB2_open_free()
3103 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_open_free()
3104 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_open_free()
3105 kfree(rqst->rq_iov[i].iov_base); in SMB2_open_free()
3117 struct cifs_tcon *tcon = oparms->tcon; in SMB2_open() local
3118 struct cifs_ses *ses = tcon->ses; in SMB2_open()
3128 return -EIO; in SMB2_open()
3130 if (smb3_encryption_required(tcon)) in SMB2_open()
3138 rc = SMB2_open_init(tcon, server, in SMB2_open()
3143 trace_smb3_open_enter(xid, tcon->tid, tcon->ses->Suid, oparms->path, in SMB2_open()
3144 oparms->create_options, oparms->desired_access); in SMB2_open()
3152 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE); in SMB2_open()
3159 trace_smb3_open_err(xid, tcon->tid, ses->Suid, in SMB2_open()
3160 oparms->create_options, oparms->desired_access, rc); in SMB2_open()
3161 if (rc == -EREMCHG) { in SMB2_open()
3163 tcon->tree_name); in SMB2_open()
3164 tcon->need_reconnect = true; in SMB2_open()
3170 trace_smb3_open_done(xid, rsp->PersistentFileId, tcon->tid, ses->Suid, in SMB2_open()
3171 oparms->create_options, oparms->desired_access); in SMB2_open()
3173 atomic_inc(&tcon->num_remote_opens); in SMB2_open()
3174 oparms->fid->persistent_fid = rsp->PersistentFileId; in SMB2_open()
3175 oparms->fid->volatile_fid = rsp->VolatileFileId; in SMB2_open()
3176 oparms->fid->access = oparms->desired_access; in SMB2_open()
3178 oparms->fid->mid = le64_to_cpu(rsp->hdr.MessageId); in SMB2_open()
3182 buf->CreationTime = rsp->CreationTime; in SMB2_open()
3183 buf->LastAccessTime = rsp->LastAccessTime; in SMB2_open()
3184 buf->LastWriteTime = rsp->LastWriteTime; in SMB2_open()
3185 buf->ChangeTime = rsp->ChangeTime; in SMB2_open()
3186 buf->AllocationSize = rsp->AllocationSize; in SMB2_open()
3187 buf->EndOfFile = rsp->EndofFile; in SMB2_open()
3188 buf->Attributes = rsp->FileAttributes; in SMB2_open()
3189 buf->NumberOfLinks = cpu_to_le32(1); in SMB2_open()
3190 buf->DeletePending = 0; in SMB2_open()
3194 rc = smb2_parse_contexts(server, &rsp_iov, &oparms->fid->epoch, in SMB2_open()
3195 oparms->fid->lease_key, oplock, buf, posix); in SMB2_open()
3203 SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_ioctl_init() argument
3210 struct kvec *iov = rqst->rq_iov; in SMB2_ioctl_init()
3215 rc = smb2_ioctl_req_init(opcode, tcon, server, in SMB2_ioctl_init()
3228 return -ENOMEM; in SMB2_ioctl_init()
3232 req->CtlCode = cpu_to_le32(opcode); in SMB2_ioctl_init()
3233 req->PersistentFileId = persistent_fid; in SMB2_ioctl_init()
3234 req->VolatileFileId = volatile_fid; in SMB2_ioctl_init()
3246 req->InputCount = cpu_to_le32(indatalen); in SMB2_ioctl_init()
3248 req->InputOffset = in SMB2_ioctl_init()
3250 rqst->rq_nvec = 2; in SMB2_ioctl_init()
3251 iov[0].iov_len = total_len - 1; in SMB2_ioctl_init()
3255 rqst->rq_nvec = 1; in SMB2_ioctl_init()
3259 req->OutputOffset = 0; in SMB2_ioctl_init()
3260 req->OutputCount = 0; /* MBZ */ in SMB2_ioctl_init()
3277 req->MaxOutputResponse = cpu_to_le32(max_response_size); in SMB2_ioctl_init()
3278 req->hdr.CreditCharge = in SMB2_ioctl_init()
3282 req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL); in SMB2_ioctl_init()
3284 /* validate negotiate request must be signed - see MS-SMB2 3.2.5.5 */ in SMB2_ioctl_init()
3286 req->hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_ioctl_init()
3296 if (rqst && rqst->rq_iov) { in SMB2_ioctl_free()
3297 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_ioctl_free()
3298 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_ioctl_free()
3299 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_ioctl_free()
3300 kfree(rqst->rq_iov[i].iov_base); in SMB2_ioctl_free()
3309 SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_ioctl() argument
3333 if (!tcon) in SMB2_ioctl()
3334 return -EIO; in SMB2_ioctl()
3336 ses = tcon->ses; in SMB2_ioctl()
3338 return -EIO; in SMB2_ioctl()
3342 return -EIO; in SMB2_ioctl()
3344 if (smb3_encryption_required(tcon)) in SMB2_ioctl()
3352 rc = SMB2_ioctl_init(tcon, server, in SMB2_ioctl()
3364 trace_smb3_fsctl_err(xid, persistent_fid, tcon->tid, in SMB2_ioctl()
3365 ses->Suid, 0, opcode, rc); in SMB2_ioctl()
3367 if ((rc != 0) && (rc != -EINVAL) && (rc != -E2BIG)) { in SMB2_ioctl()
3368 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3370 } else if (rc == -EINVAL) { in SMB2_ioctl()
3373 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3376 } else if (rc == -E2BIG) { in SMB2_ioctl()
3378 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3393 rc = -EIO; in SMB2_ioctl()
3397 *plen = le32_to_cpu(rsp->OutputCount); in SMB2_ioctl()
3405 rc = -EIO; in SMB2_ioctl()
3409 if (rsp_iov.iov_len - *plen < le32_to_cpu(rsp->OutputOffset)) { in SMB2_ioctl()
3411 le32_to_cpu(rsp->OutputOffset)); in SMB2_ioctl()
3413 rc = -EIO; in SMB2_ioctl()
3417 *out_data = kmemdup((char *)rsp + le32_to_cpu(rsp->OutputOffset), in SMB2_ioctl()
3420 rc = -ENOMEM; in SMB2_ioctl()
3435 SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_compression() argument
3445 rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_compression()
3457 SMB2_close_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_close_init() argument
3462 struct kvec *iov = rqst->rq_iov; in SMB2_close_init()
3466 rc = smb2_plain_req_init(SMB2_CLOSE, tcon, server, in SMB2_close_init()
3471 req->PersistentFileId = persistent_fid; in SMB2_close_init()
3472 req->VolatileFileId = volatile_fid; in SMB2_close_init()
3474 req->Flags = SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB; in SMB2_close_init()
3476 req->Flags = 0; in SMB2_close_init()
3486 if (rqst && rqst->rq_iov) in SMB2_close_free()
3487 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_close_free()
3491 __SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, in __SMB2_close() argument
3497 struct cifs_ses *ses = tcon->ses; in __SMB2_close()
3509 return -EIO; in __SMB2_close()
3511 if (smb3_encryption_required(tcon)) in __SMB2_close()
3523 trace_smb3_close_enter(xid, persistent_fid, tcon->tid, ses->Suid); in __SMB2_close()
3524 rc = SMB2_close_init(tcon, server, in __SMB2_close()
3535 cifs_stats_fail_inc(tcon, SMB2_CLOSE_HE); in __SMB2_close()
3536 trace_smb3_close_err(xid, persistent_fid, tcon->tid, ses->Suid, in __SMB2_close()
3540 trace_smb3_close_done(xid, persistent_fid, tcon->tid, in __SMB2_close()
3541 ses->Suid); in __SMB2_close()
3543 memcpy(&pbuf->network_open_info, in __SMB2_close()
3544 &rsp->network_open_info, in __SMB2_close()
3545 sizeof(pbuf->network_open_info)); in __SMB2_close()
3548 atomic_dec(&tcon->num_remote_opens); in __SMB2_close()
3557 tmp_rc = smb2_handle_cancelled_close(tcon, persistent_fid, in __SMB2_close()
3567 SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_close() argument
3570 return __SMB2_close(xid, tcon, persistent_fid, volatile_fid, NULL); in SMB2_close()
3577 unsigned int smb_len = iov->iov_len; in smb2_validate_iov()
3578 char *end_of_smb = smb_len + (char *)iov->iov_base; in smb2_validate_iov()
3579 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_iov()
3586 return -EINVAL; in smb2_validate_iov()
3593 return -EINVAL; in smb2_validate_iov()
3598 return -EINVAL; in smb2_validate_iov()
3613 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_and_copy_iov()
3617 return -EINVAL; in smb2_validate_and_copy_iov()
3629 SMB2_query_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_query_info_init() argument
3636 struct kvec *iov = rqst->rq_iov; in SMB2_query_info_init()
3643 return -EINVAL; in SMB2_query_info_init()
3645 rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server, in SMB2_query_info_init()
3650 req->InfoType = info_type; in SMB2_query_info_init()
3651 req->FileInfoClass = info_class; in SMB2_query_info_init()
3652 req->PersistentFileId = persistent_fid; in SMB2_query_info_init()
3653 req->VolatileFileId = volatile_fid; in SMB2_query_info_init()
3654 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_query_info_init()
3656 req->OutputBufferLength = cpu_to_le32(output_len); in SMB2_query_info_init()
3658 req->InputBufferLength = cpu_to_le32(input_len); in SMB2_query_info_init()
3660 req->InputBufferOffset = cpu_to_le16(total_len - 1); in SMB2_query_info_init()
3661 memcpy(req->Buffer, input, input_len); in SMB2_query_info_init()
3673 if (rqst && rqst->rq_iov) in SMB2_query_info_free()
3674 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_info_free()
3678 query_info(const unsigned int xid, struct cifs_tcon *tcon, in query_info() argument
3689 struct cifs_ses *ses = tcon->ses; in query_info()
3697 return -EIO; in query_info()
3700 return -EIO; in query_info()
3702 if (smb3_encryption_required(tcon)) in query_info()
3710 rc = SMB2_query_info_init(tcon, server, in query_info()
3717 trace_smb3_query_info_enter(xid, persistent_fid, tcon->tid, in query_info()
3718 ses->Suid, info_class, (__u32)info_type); in query_info()
3725 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in query_info()
3726 trace_smb3_query_info_err(xid, persistent_fid, tcon->tid, in query_info()
3727 ses->Suid, info_class, (__u32)info_type, rc); in query_info()
3731 trace_smb3_query_info_done(xid, persistent_fid, tcon->tid, in query_info()
3732 ses->Suid, info_class, (__u32)info_type); in query_info()
3735 *dlen = le32_to_cpu(rsp->OutputBufferLength); in query_info()
3743 rc = -ENOMEM; in query_info()
3750 rc = smb2_validate_and_copy_iov(le16_to_cpu(rsp->OutputBufferOffset), in query_info()
3751 le32_to_cpu(rsp->OutputBufferLength), in query_info()
3765 int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_info() argument
3768 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_query_info()
3778 SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon,
3785 return query_info(xid, tcon, persistent_fid, volatile_fid,
3793 SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_acl() argument
3801 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_query_acl()
3807 SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_get_srv_num() argument
3810 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_get_srv_num()
3819 * See MS-SMB2 2.2.35 and 2.2.36
3824 struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_notify_init() argument
3829 struct kvec *iov = rqst->rq_iov; in SMB2_notify_init()
3833 rc = smb2_plain_req_init(SMB2_CHANGE_NOTIFY, tcon, server, in SMB2_notify_init()
3838 req->PersistentFileId = persistent_fid; in SMB2_notify_init()
3839 req->VolatileFileId = volatile_fid; in SMB2_notify_init()
3840 /* See note 354 of MS-SMB2, 64K max */ in SMB2_notify_init()
3841 req->OutputBufferLength = in SMB2_notify_init()
3842 cpu_to_le32(SMB2_MAX_BUFFER_SIZE - MAX_SMB2_HDR_SIZE); in SMB2_notify_init()
3843 req->CompletionFilter = cpu_to_le32(completion_filter); in SMB2_notify_init()
3845 req->Flags = cpu_to_le16(SMB2_WATCH_TREE); in SMB2_notify_init()
3847 req->Flags = 0; in SMB2_notify_init()
3856 SMB2_change_notify(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_change_notify() argument
3861 struct cifs_ses *ses = tcon->ses; in SMB2_change_notify()
3873 return -EIO; in SMB2_change_notify()
3875 if (smb3_encryption_required(tcon)) in SMB2_change_notify()
3886 rc = SMB2_notify_init(xid, &rqst, tcon, server, in SMB2_change_notify()
3892 trace_smb3_notify_enter(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
3898 cifs_stats_fail_inc(tcon, SMB2_CHANGE_NOTIFY_HE); in SMB2_change_notify()
3899 trace_smb3_notify_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
3902 trace_smb3_notify_done(xid, persistent_fid, tcon->tid, in SMB2_change_notify()
3903 ses->Suid, (u8)watch_tree, completion_filter); in SMB2_change_notify()
3911 smb2_validate_iov(le16_to_cpu(smb_rsp->OutputBufferOffset), in SMB2_change_notify()
3912 le32_to_cpu(smb_rsp->OutputBufferLength), &rsp_iov, in SMB2_change_notify()
3915 *out_data = kmemdup((char *)smb_rsp + le16_to_cpu(smb_rsp->OutputBufferOffset), in SMB2_change_notify()
3916 le32_to_cpu(smb_rsp->OutputBufferLength), GFP_KERNEL); in SMB2_change_notify()
3918 rc = -ENOMEM; in SMB2_change_notify()
3921 *plen = le32_to_cpu(smb_rsp->OutputBufferLength); in SMB2_change_notify()
3934 * This is a no-op for now. We're not really interested in the reply, but
3935 * rather in the fact that the server sent one and that server->lstrp
3943 struct TCP_Server_Info *server = mid->callback_data; in smb2_echo_callback()
3944 struct smb2_echo_rsp *rsp = (struct smb2_echo_rsp *)mid->resp_buf; in smb2_echo_callback()
3947 if (mid->mid_state == MID_RESPONSE_RECEIVED in smb2_echo_callback()
3948 || mid->mid_state == MID_RESPONSE_MALFORMED) { in smb2_echo_callback()
3949 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_echo_callback()
3950 credits.instance = server->reconnect_instance; in smb2_echo_callback()
3963 struct cifs_tcon *tcon, *tcon2; in smb2_reconnect_server() local
3972 if (!server->srv_count) { in smb2_reconnect_server()
3976 server->srv_count++; in smb2_reconnect_server()
3979 /* If server is a channel, select the primary channel */ in smb2_reconnect_server()
3980 pserver = SERVER_IS_CHAN(server) ? server->primary_server : server; in smb2_reconnect_server()
3982 /* Prevent simultaneous reconnects that can corrupt tcon->rlist list */ in smb2_reconnect_server()
3983 mutex_lock(&pserver->reconnect_mutex); in smb2_reconnect_server()
3986 if (server->terminate) { in smb2_reconnect_server()
3988 mutex_unlock(&pserver->reconnect_mutex); in smb2_reconnect_server()
3997 list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) { in smb2_reconnect_server()
3998 spin_lock(&ses->ses_lock); in smb2_reconnect_server()
3999 if (ses->ses_status == SES_EXITING) { in smb2_reconnect_server()
4000 spin_unlock(&ses->ses_lock); in smb2_reconnect_server()
4003 spin_unlock(&ses->ses_lock); in smb2_reconnect_server()
4007 list_for_each_entry(tcon, &ses->tcon_list, tcon_list) { in smb2_reconnect_server()
4008 if (tcon->need_reconnect || tcon->need_reopen_files) { in smb2_reconnect_server()
4009 tcon->tc_count++; in smb2_reconnect_server()
4010 list_add_tail(&tcon->rlist, &tmp_list); in smb2_reconnect_server()
4018 if (ses->tcon_ipc && ses->tcon_ipc->need_reconnect) { in smb2_reconnect_server()
4019 list_add_tail(&ses->tcon_ipc->rlist, &tmp_list); in smb2_reconnect_server()
4024 * handle the case where channel needs to reconnect in smb2_reconnect_server()
4025 * binding session, but tcon is healthy (some other channel in smb2_reconnect_server()
4028 spin_lock(&ses->chan_lock); in smb2_reconnect_server()
4030 list_add_tail(&ses->rlist, &tmp_ses_list); in smb2_reconnect_server()
4034 spin_unlock(&ses->chan_lock); in smb2_reconnect_server()
4038 list_for_each_entry_safe(tcon, tcon2, &tmp_list, rlist) { in smb2_reconnect_server()
4039 rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon, server, true); in smb2_reconnect_server()
4041 cifs_reopen_persistent_handles(tcon); in smb2_reconnect_server()
4044 list_del_init(&tcon->rlist); in smb2_reconnect_server()
4045 if (tcon->ipc) in smb2_reconnect_server()
4046 cifs_put_smb_ses(tcon->ses); in smb2_reconnect_server()
4048 cifs_put_tcon(tcon); in smb2_reconnect_server()
4054 /* allocate a dummy tcon struct used for reconnect */ in smb2_reconnect_server()
4055 tcon = tcon_info_alloc(false); in smb2_reconnect_server()
4056 if (!tcon) { in smb2_reconnect_server()
4059 list_del_init(&ses->rlist); in smb2_reconnect_server()
4065 tcon->status = TID_GOOD; in smb2_reconnect_server()
4066 tcon->retry = false; in smb2_reconnect_server()
4067 tcon->need_reconnect = false; in smb2_reconnect_server()
4071 tcon->ses = ses; in smb2_reconnect_server()
4072 rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon, server, true); in smb2_reconnect_server()
4075 list_del_init(&ses->rlist); in smb2_reconnect_server()
4078 tconInfoFree(tcon); in smb2_reconnect_server()
4083 queue_delayed_work(cifsiod_wq, &server->reconnect, 2 * HZ); in smb2_reconnect_server()
4084 mutex_unlock(&pserver->reconnect_mutex); in smb2_reconnect_server()
4100 cifs_dbg(FYI, "In echo request for conn_id %lld\n", server->conn_id); in SMB2_echo()
4102 spin_lock(&server->srv_lock); in SMB2_echo()
4103 if (server->ops->need_neg && in SMB2_echo()
4104 server->ops->need_neg(server)) { in SMB2_echo()
4105 spin_unlock(&server->srv_lock); in SMB2_echo()
4107 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in SMB2_echo()
4110 spin_unlock(&server->srv_lock); in SMB2_echo()
4117 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_echo()
4134 if (rqst && rqst->rq_iov) in SMB2_flush_free()
4135 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_flush_free()
4140 struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_flush_init() argument
4144 struct kvec *iov = rqst->rq_iov; in SMB2_flush_init()
4148 rc = smb2_plain_req_init(SMB2_FLUSH, tcon, server, in SMB2_flush_init()
4153 req->PersistentFileId = persistent_fid; in SMB2_flush_init()
4154 req->VolatileFileId = volatile_fid; in SMB2_flush_init()
4163 SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_flush() argument
4166 struct cifs_ses *ses = tcon->ses; in SMB2_flush()
4176 if (!ses || !(ses->server)) in SMB2_flush()
4177 return -EIO; in SMB2_flush()
4179 if (smb3_encryption_required(tcon)) in SMB2_flush()
4187 rc = SMB2_flush_init(xid, &rqst, tcon, server, in SMB2_flush()
4192 trace_smb3_flush_enter(xid, persistent_fid, tcon->tid, ses->Suid); in SMB2_flush()
4197 cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE); in SMB2_flush()
4198 trace_smb3_flush_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_flush()
4201 trace_smb3_flush_done(xid, persistent_fid, tcon->tid, in SMB2_flush()
4202 ses->Suid); in SMB2_flush()
4213 struct TCP_Server_Info *server = io_parms->server; in smb3_use_rdma_offload()
4214 struct cifs_tcon *tcon = io_parms->tcon; in smb3_use_rdma_offload() local
4217 if (!server || !tcon) in smb3_use_rdma_offload()
4221 if (!server->rdma || !server->smbd_conn) in smb3_use_rdma_offload()
4225 if (server->sign) in smb3_use_rdma_offload()
4229 if (smb3_encryption_required(tcon)) in smb3_use_rdma_offload()
4233 if (io_parms->length < server->smbd_conn->rdma_readwrite_threshold) in smb3_use_rdma_offload()
4249 int rc = -EACCES; in smb2_new_read_req()
4252 struct TCP_Server_Info *server = io_parms->server; in smb2_new_read_req()
4254 rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server, in smb2_new_read_req()
4260 return -ECONNABORTED; in smb2_new_read_req()
4262 shdr = &req->hdr; in smb2_new_read_req()
4263 shdr->Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in smb2_new_read_req()
4265 req->PersistentFileId = io_parms->persistent_fid; in smb2_new_read_req()
4266 req->VolatileFileId = io_parms->volatile_fid; in smb2_new_read_req()
4267 req->ReadChannelInfoOffset = 0; /* reserved */ in smb2_new_read_req()
4268 req->ReadChannelInfoLength = 0; /* reserved */ in smb2_new_read_req()
4269 req->Channel = 0; /* reserved */ in smb2_new_read_req()
4270 req->MinimumCount = 0; in smb2_new_read_req()
4271 req->Length = cpu_to_le32(io_parms->length); in smb2_new_read_req()
4272 req->Offset = cpu_to_le64(io_parms->offset); in smb2_new_read_req()
4275 io_parms->persistent_fid, in smb2_new_read_req()
4276 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in smb2_new_read_req()
4277 io_parms->offset, io_parms->length); in smb2_new_read_req()
4285 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_new_read_req()
4287 rdata->mr = smbd_register_mr(server->smbd_conn, &rdata->iter, in smb2_new_read_req()
4289 if (!rdata->mr) in smb2_new_read_req()
4290 return -EAGAIN; in smb2_new_read_req()
4292 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_new_read_req()
4294 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_new_read_req()
4295 req->ReadChannelInfoOffset = in smb2_new_read_req()
4297 req->ReadChannelInfoLength = in smb2_new_read_req()
4299 v1 = (struct smbd_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_new_read_req()
4300 v1->offset = cpu_to_le64(rdata->mr->mr->iova); in smb2_new_read_req()
4301 v1->token = cpu_to_le32(rdata->mr->mr->rkey); in smb2_new_read_req()
4302 v1->length = cpu_to_le32(rdata->mr->mr->length); in smb2_new_read_req()
4304 *total_len += sizeof(*v1) - 1; in smb2_new_read_req()
4309 /* next 8-byte aligned request */ in smb2_new_read_req()
4311 shdr->NextCommand = cpu_to_le32(*total_len); in smb2_new_read_req()
4313 shdr->NextCommand = 0; in smb2_new_read_req()
4315 shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; in smb2_new_read_req()
4320 shdr->SessionId = cpu_to_le64(0xFFFFFFFFFFFFFFFF); in smb2_new_read_req()
4321 shdr->Id.SyncId.TreeId = cpu_to_le32(0xFFFFFFFF); in smb2_new_read_req()
4322 req->PersistentFileId = (u64)-1; in smb2_new_read_req()
4323 req->VolatileFileId = (u64)-1; in smb2_new_read_req()
4326 if (remaining_bytes > io_parms->length) in smb2_new_read_req()
4327 req->RemainingBytes = cpu_to_le32(remaining_bytes); in smb2_new_read_req()
4329 req->RemainingBytes = 0; in smb2_new_read_req()
4338 struct cifs_readdata *rdata = mid->callback_data; in smb2_readv_callback()
4339 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in smb2_readv_callback() local
4340 struct TCP_Server_Info *server = rdata->server; in smb2_readv_callback()
4342 (struct smb2_hdr *)rdata->iov[0].iov_base; in smb2_readv_callback()
4344 struct smb_rqst rqst = { .rq_iov = &rdata->iov[1], .rq_nvec = 1 }; in smb2_readv_callback()
4346 if (rdata->got_bytes) { in smb2_readv_callback()
4347 rqst.rq_iter = rdata->iter; in smb2_readv_callback()
4348 rqst.rq_iter_size = iov_iter_count(&rdata->iter); in smb2_readv_callback()
4351 WARN_ONCE(rdata->server != mid->server, in smb2_readv_callback()
4353 rdata->server, mid->server); in smb2_readv_callback()
4356 __func__, mid->mid, mid->mid_state, rdata->result, in smb2_readv_callback()
4357 rdata->bytes); in smb2_readv_callback()
4359 switch (mid->mid_state) { in smb2_readv_callback()
4361 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
4362 credits.instance = server->reconnect_instance; in smb2_readv_callback()
4364 if (server->sign && !mid->decrypted) { in smb2_readv_callback()
4367 iov_iter_revert(&rqst.rq_iter, rdata->got_bytes); in smb2_readv_callback()
4368 iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes); in smb2_readv_callback()
4375 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
4376 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
4380 rdata->result = -EAGAIN; in smb2_readv_callback()
4381 if (server->sign && rdata->got_bytes) in smb2_readv_callback()
4383 rdata->got_bytes = 0; in smb2_readv_callback()
4385 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
4386 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
4389 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
4390 credits.instance = server->reconnect_instance; in smb2_readv_callback()
4393 rdata->result = -EIO; in smb2_readv_callback()
4401 if (rdata->mr) { in smb2_readv_callback()
4402 smbd_deregister_mr(rdata->mr); in smb2_readv_callback()
4403 rdata->mr = NULL; in smb2_readv_callback()
4406 if (rdata->result && rdata->result != -ENODATA) { in smb2_readv_callback()
4407 cifs_stats_fail_inc(tcon, SMB2_READ_HE); in smb2_readv_callback()
4409 rdata->cfile->fid.persistent_fid, in smb2_readv_callback()
4410 tcon->tid, tcon->ses->Suid, rdata->offset, in smb2_readv_callback()
4411 rdata->bytes, rdata->result); in smb2_readv_callback()
4414 rdata->cfile->fid.persistent_fid, in smb2_readv_callback()
4415 tcon->tid, tcon->ses->Suid, in smb2_readv_callback()
4416 rdata->offset, rdata->got_bytes); in smb2_readv_callback()
4418 queue_work(cifsiod_wq, &rdata->work); in smb2_readv_callback()
4423 /* smb2_async_readv - send an async read, and set up mid to handle result */
4431 struct smb_rqst rqst = { .rq_iov = rdata->iov, in smb2_async_readv()
4434 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in smb2_async_readv() local
4439 __func__, rdata->offset, rdata->bytes); in smb2_async_readv()
4441 if (!rdata->server) in smb2_async_readv()
4442 rdata->server = cifs_pick_channel(tcon->ses); in smb2_async_readv()
4444 io_parms.tcon = tlink_tcon(rdata->cfile->tlink); in smb2_async_readv()
4445 io_parms.server = server = rdata->server; in smb2_async_readv()
4446 io_parms.offset = rdata->offset; in smb2_async_readv()
4447 io_parms.length = rdata->bytes; in smb2_async_readv()
4448 io_parms.persistent_fid = rdata->cfile->fid.persistent_fid; in smb2_async_readv()
4449 io_parms.volatile_fid = rdata->cfile->fid.volatile_fid; in smb2_async_readv()
4450 io_parms.pid = rdata->pid; in smb2_async_readv()
4457 if (smb3_encryption_required(io_parms.tcon)) in smb2_async_readv()
4460 rdata->iov[0].iov_base = buf; in smb2_async_readv()
4461 rdata->iov[0].iov_len = total_len; in smb2_async_readv()
4465 if (rdata->credits.value > 0) { in smb2_async_readv()
4466 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes, in smb2_async_readv()
4468 credit_request = le16_to_cpu(shdr->CreditCharge) + 8; in smb2_async_readv()
4469 if (server->credits >= server->max_credits) in smb2_async_readv()
4470 shdr->CreditRequest = cpu_to_le16(0); in smb2_async_readv()
4472 shdr->CreditRequest = cpu_to_le16( in smb2_async_readv()
4473 min_t(int, server->max_credits - in smb2_async_readv()
4474 server->credits, credit_request)); in smb2_async_readv()
4476 rc = adjust_credits(server, &rdata->credits, rdata->bytes); in smb2_async_readv()
4483 kref_get(&rdata->refcount); in smb2_async_readv()
4487 &rdata->credits); in smb2_async_readv()
4489 kref_put(&rdata->refcount, cifs_readdata_release); in smb2_async_readv()
4490 cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); in smb2_async_readv()
4492 io_parms.tcon->tid, in smb2_async_readv()
4493 io_parms.tcon->ses->Suid, in smb2_async_readv()
4514 struct cifs_ses *ses = io_parms->tcon->ses; in SMB2_read()
4516 if (!io_parms->server) in SMB2_read()
4517 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_read()
4524 if (smb3_encryption_required(io_parms->tcon)) in SMB2_read()
4534 rc = cifs_send_recv(xid, ses, io_parms->server, in SMB2_read()
4539 if (rc != -ENODATA) { in SMB2_read()
4540 cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE); in SMB2_read()
4543 req->PersistentFileId, in SMB2_read()
4544 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4545 io_parms->offset, io_parms->length, in SMB2_read()
4548 trace_smb3_read_done(xid, req->PersistentFileId, io_parms->tcon->tid, in SMB2_read()
4549 ses->Suid, io_parms->offset, 0); in SMB2_read()
4552 return rc == -ENODATA ? 0 : rc; in SMB2_read()
4555 req->PersistentFileId, in SMB2_read()
4556 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4557 io_parms->offset, io_parms->length); in SMB2_read()
4561 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_read()
4563 (*nbytes > io_parms->length)) { in SMB2_read()
4565 *nbytes, io_parms->length); in SMB2_read()
4566 rc = -EIO; in SMB2_read()
4571 memcpy(*buf, (char *)rsp + rsp->DataOffset, *nbytes); in SMB2_read()
4590 struct cifs_writedata *wdata = mid->callback_data; in smb2_writev_callback()
4591 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in smb2_writev_callback() local
4592 struct TCP_Server_Info *server = wdata->server; in smb2_writev_callback()
4594 struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; in smb2_writev_callback()
4597 WARN_ONCE(wdata->server != mid->server, in smb2_writev_callback()
4599 wdata->server, mid->server); in smb2_writev_callback()
4601 switch (mid->mid_state) { in smb2_writev_callback()
4603 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_writev_callback()
4604 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4605 wdata->result = smb2_check_receive(mid, server, 0); in smb2_writev_callback()
4606 if (wdata->result != 0) in smb2_writev_callback()
4609 written = le32_to_cpu(rsp->DataLength); in smb2_writev_callback()
4616 if (written > wdata->bytes) in smb2_writev_callback()
4619 if (written < wdata->bytes) in smb2_writev_callback()
4620 wdata->result = -ENOSPC; in smb2_writev_callback()
4622 wdata->bytes = written; in smb2_writev_callback()
4626 wdata->result = -EAGAIN; in smb2_writev_callback()
4629 credits.value = le16_to_cpu(rsp->hdr.CreditRequest); in smb2_writev_callback()
4630 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4633 wdata->result = -EIO; in smb2_writev_callback()
4644 if (wdata->mr) { in smb2_writev_callback()
4645 smbd_deregister_mr(wdata->mr); in smb2_writev_callback()
4646 wdata->mr = NULL; in smb2_writev_callback()
4649 if (wdata->result) { in smb2_writev_callback()
4650 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); in smb2_writev_callback()
4652 wdata->cfile->fid.persistent_fid, in smb2_writev_callback()
4653 tcon->tid, tcon->ses->Suid, wdata->offset, in smb2_writev_callback()
4654 wdata->bytes, wdata->result); in smb2_writev_callback()
4655 if (wdata->result == -ENOSPC) in smb2_writev_callback()
4657 tcon->tree_name); in smb2_writev_callback()
4660 wdata->cfile->fid.persistent_fid, in smb2_writev_callback()
4661 tcon->tid, tcon->ses->Suid, in smb2_writev_callback()
4662 wdata->offset, wdata->bytes); in smb2_writev_callback()
4664 queue_work(cifsiod_wq, &wdata->work); in smb2_writev_callback()
4669 /* smb2_async_writev - send an async write, and set up mid to handle result */
4674 int rc = -EACCES, flags = 0; in smb2_async_writev()
4677 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in smb2_async_writev() local
4678 struct TCP_Server_Info *server = wdata->server; in smb2_async_writev()
4686 if (!wdata->server) in smb2_async_writev()
4687 server = wdata->server = cifs_pick_channel(tcon->ses); in smb2_async_writev()
4694 .tcon = tcon, in smb2_async_writev()
4696 .offset = wdata->offset, in smb2_async_writev()
4697 .length = wdata->bytes, in smb2_async_writev()
4698 .persistent_fid = wdata->cfile->fid.persistent_fid, in smb2_async_writev()
4699 .volatile_fid = wdata->cfile->fid.volatile_fid, in smb2_async_writev()
4700 .pid = wdata->pid, in smb2_async_writev()
4704 rc = smb2_plain_req_init(SMB2_WRITE, tcon, server, in smb2_async_writev()
4709 if (smb3_encryption_required(tcon)) in smb2_async_writev()
4713 shdr->Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in smb2_async_writev()
4715 req->PersistentFileId = io_parms->persistent_fid; in smb2_async_writev()
4716 req->VolatileFileId = io_parms->volatile_fid; in smb2_async_writev()
4717 req->WriteChannelInfoOffset = 0; in smb2_async_writev()
4718 req->WriteChannelInfoLength = 0; in smb2_async_writev()
4719 req->Channel = SMB2_CHANNEL_NONE; in smb2_async_writev()
4720 req->Offset = cpu_to_le64(io_parms->offset); in smb2_async_writev()
4721 req->DataOffset = cpu_to_le16( in smb2_async_writev()
4723 req->RemainingBytes = 0; in smb2_async_writev()
4726 io_parms->persistent_fid, in smb2_async_writev()
4727 io_parms->tcon->tid, in smb2_async_writev()
4728 io_parms->tcon->ses->Suid, in smb2_async_writev()
4729 io_parms->offset, in smb2_async_writev()
4730 io_parms->length); in smb2_async_writev()
4739 size_t data_size = iov_iter_count(&wdata->iter); in smb2_async_writev()
4740 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_async_writev()
4742 wdata->mr = smbd_register_mr(server->smbd_conn, &wdata->iter, in smb2_async_writev()
4744 if (!wdata->mr) { in smb2_async_writev()
4745 rc = -EAGAIN; in smb2_async_writev()
4748 req->Length = 0; in smb2_async_writev()
4749 req->DataOffset = 0; in smb2_async_writev()
4750 req->RemainingBytes = cpu_to_le32(data_size); in smb2_async_writev()
4751 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_async_writev()
4753 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_async_writev()
4754 req->WriteChannelInfoOffset = in smb2_async_writev()
4756 req->WriteChannelInfoLength = in smb2_async_writev()
4758 v1 = (struct smbd_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_async_writev()
4759 v1->offset = cpu_to_le64(wdata->mr->mr->iova); in smb2_async_writev()
4760 v1->token = cpu_to_le32(wdata->mr->mr->rkey); in smb2_async_writev()
4761 v1->length = cpu_to_le32(wdata->mr->mr->length); in smb2_async_writev()
4764 iov[0].iov_len = total_len - 1; in smb2_async_writev()
4769 rqst.rq_iter = wdata->iter; in smb2_async_writev()
4772 if (wdata->mr) in smb2_async_writev()
4776 io_parms->offset, io_parms->length, iov_iter_count(&rqst.rq_iter)); in smb2_async_writev()
4780 if (!wdata->mr) in smb2_async_writev()
4781 req->Length = cpu_to_le32(io_parms->length); in smb2_async_writev()
4783 req->Length = cpu_to_le32(io_parms->length); in smb2_async_writev()
4786 if (wdata->credits.value > 0) { in smb2_async_writev()
4787 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes, in smb2_async_writev()
4789 credit_request = le16_to_cpu(shdr->CreditCharge) + 8; in smb2_async_writev()
4790 if (server->credits >= server->max_credits) in smb2_async_writev()
4791 shdr->CreditRequest = cpu_to_le16(0); in smb2_async_writev()
4793 shdr->CreditRequest = cpu_to_le16( in smb2_async_writev()
4794 min_t(int, server->max_credits - in smb2_async_writev()
4795 server->credits, credit_request)); in smb2_async_writev()
4797 rc = adjust_credits(server, &wdata->credits, io_parms->length); in smb2_async_writev()
4804 kref_get(&wdata->refcount); in smb2_async_writev()
4806 wdata, flags, &wdata->credits); in smb2_async_writev()
4810 io_parms->persistent_fid, in smb2_async_writev()
4811 io_parms->tcon->tid, in smb2_async_writev()
4812 io_parms->tcon->ses->Suid, in smb2_async_writev()
4813 io_parms->offset, in smb2_async_writev()
4814 io_parms->length, in smb2_async_writev()
4816 kref_put(&wdata->refcount, release); in smb2_async_writev()
4817 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); in smb2_async_writev()
4850 if (!io_parms->server) in SMB2_write()
4851 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_write()
4852 server = io_parms->server; in SMB2_write()
4854 return -ECONNABORTED; in SMB2_write()
4856 rc = smb2_plain_req_init(SMB2_WRITE, io_parms->tcon, server, in SMB2_write()
4861 if (smb3_encryption_required(io_parms->tcon)) in SMB2_write()
4864 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid); in SMB2_write()
4866 req->PersistentFileId = io_parms->persistent_fid; in SMB2_write()
4867 req->VolatileFileId = io_parms->volatile_fid; in SMB2_write()
4868 req->WriteChannelInfoOffset = 0; in SMB2_write()
4869 req->WriteChannelInfoLength = 0; in SMB2_write()
4870 req->Channel = 0; in SMB2_write()
4871 req->Length = cpu_to_le32(io_parms->length); in SMB2_write()
4872 req->Offset = cpu_to_le64(io_parms->offset); in SMB2_write()
4873 req->DataOffset = cpu_to_le16( in SMB2_write()
4875 req->RemainingBytes = 0; in SMB2_write()
4877 trace_smb3_write_enter(xid, io_parms->persistent_fid, in SMB2_write()
4878 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in SMB2_write()
4879 io_parms->offset, io_parms->length); in SMB2_write()
4883 iov[0].iov_len = total_len - 1; in SMB2_write()
4889 rc = cifs_send_recv(xid, io_parms->tcon->ses, server, in SMB2_write()
4896 req->PersistentFileId, in SMB2_write()
4897 io_parms->tcon->tid, in SMB2_write()
4898 io_parms->tcon->ses->Suid, in SMB2_write()
4899 io_parms->offset, io_parms->length, rc); in SMB2_write()
4900 cifs_stats_fail_inc(io_parms->tcon, SMB2_WRITE_HE); in SMB2_write()
4903 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_write()
4905 req->PersistentFileId, in SMB2_write()
4906 io_parms->tcon->tid, in SMB2_write()
4907 io_parms->tcon->ses->Suid, in SMB2_write()
4908 io_parms->offset, *nbytes); in SMB2_write()
4922 return -1; in posix_info_sid_size()
4926 return -1; in posix_info_sid_size()
4930 return -1; in posix_info_sid_size()
4950 end = beg + le32_to_cpu(p->NextEntryOffset); in posix_info_parse()
4958 return -1; in posix_info_parse()
4965 return -1; in posix_info_parse()
4972 return -1; in posix_info_parse()
4977 return -1; in posix_info_parse()
4980 return -1; in posix_info_parse()
4986 return -1; in posix_info_parse()
4990 out->base = beg; in posix_info_parse()
4991 out->size = total_len; in posix_info_parse()
4992 out->name_len = name_len; in posix_info_parse()
4993 out->name = name; in posix_info_parse()
4994 memcpy(&out->owner, owner_sid, owner_len); in posix_info_parse()
4995 memcpy(&out->group, group_sid, group_len); in posix_info_parse()
5005 return -1; in posix_info_extra_size()
5006 return len - sizeof(struct smb2_posix_info); in posix_info_extra_size()
5038 len = le32_to_cpu(dir_info->FileNameLength); in num_entries()
5052 next_offset = le32_to_cpu(dir_info->NextEntryOffset); in num_entries()
5064 struct cifs_tcon *tcon, in SMB2_query_directory_init() argument
5073 unsigned int output_size = CIFSMaxBufSize - in SMB2_query_directory_init()
5074 MAX_SMB2_CREATE_RESPONSE_SIZE - in SMB2_query_directory_init()
5077 struct kvec *iov = rqst->rq_iov; in SMB2_query_directory_init()
5080 rc = smb2_plain_req_init(SMB2_QUERY_DIRECTORY, tcon, server, in SMB2_query_directory_init()
5087 req->FileInformationClass = FILE_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
5090 req->FileInformationClass = FILEID_FULL_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
5093 req->FileInformationClass = SMB_FIND_FILE_POSIX_INFO; in SMB2_query_directory_init()
5096 req->FileInformationClass = FILE_FULL_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
5101 return -EINVAL; in SMB2_query_directory_init()
5104 req->FileIndex = cpu_to_le32(index); in SMB2_query_directory_init()
5105 req->PersistentFileId = persistent_fid; in SMB2_query_directory_init()
5106 req->VolatileFileId = volatile_fid; in SMB2_query_directory_init()
5109 bufptr = req->Buffer; in SMB2_query_directory_init()
5112 req->FileNameOffset = in SMB2_query_directory_init()
5114 req->FileNameLength = cpu_to_le16(len); in SMB2_query_directory_init()
5119 output_size = min_t(unsigned int, output_size, server->maxBuf); in SMB2_query_directory_init()
5121 req->OutputBufferLength = cpu_to_le32(output_size); in SMB2_query_directory_init()
5125 iov[0].iov_len = total_len - 1; in SMB2_query_directory_init()
5127 iov[1].iov_base = (char *)(req->Buffer); in SMB2_query_directory_init()
5130 trace_smb3_query_dir_enter(xid, persistent_fid, tcon->tid, in SMB2_query_directory_init()
5131 tcon->ses->Suid, index, output_size); in SMB2_query_directory_init()
5138 if (rqst && rqst->rq_iov) { in SMB2_query_directory_free()
5139 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_directory_free()
5144 smb2_parse_query_directory(struct cifs_tcon *tcon, in smb2_parse_query_directory() argument
5154 rsp = (struct smb2_query_directory_rsp *)rsp_iov->iov_base; in smb2_parse_query_directory()
5156 switch (srch_inf->info_level) { in smb2_parse_query_directory()
5172 srch_inf->info_level); in smb2_parse_query_directory()
5173 return -EINVAL; in smb2_parse_query_directory()
5176 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_parse_query_directory()
5177 le32_to_cpu(rsp->OutputBufferLength), rsp_iov, in smb2_parse_query_directory()
5184 srch_inf->unicode = true; in smb2_parse_query_directory()
5186 if (srch_inf->ntwrk_buf_start) { in smb2_parse_query_directory()
5187 if (srch_inf->smallBuf) in smb2_parse_query_directory()
5188 cifs_small_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
5190 cifs_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
5192 srch_inf->ntwrk_buf_start = (char *)rsp; in smb2_parse_query_directory()
5193 srch_inf->srch_entries_start = srch_inf->last_entry = in smb2_parse_query_directory()
5194 (char *)rsp + le16_to_cpu(rsp->OutputBufferOffset); in smb2_parse_query_directory()
5195 end_of_smb = rsp_iov->iov_len + (char *)rsp; in smb2_parse_query_directory()
5197 srch_inf->entries_in_buffer = num_entries( in smb2_parse_query_directory()
5198 srch_inf->info_level, in smb2_parse_query_directory()
5199 srch_inf->srch_entries_start, in smb2_parse_query_directory()
5201 &srch_inf->last_entry, in smb2_parse_query_directory()
5204 srch_inf->index_of_last_entry += srch_inf->entries_in_buffer; in smb2_parse_query_directory()
5206 srch_inf->entries_in_buffer, srch_inf->index_of_last_entry, in smb2_parse_query_directory()
5207 srch_inf->srch_entries_start, srch_inf->last_entry); in smb2_parse_query_directory()
5209 srch_inf->smallBuf = false; in smb2_parse_query_directory()
5211 srch_inf->smallBuf = true; in smb2_parse_query_directory()
5219 SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_directory() argument
5229 struct cifs_ses *ses = tcon->ses; in SMB2_query_directory()
5233 if (!ses || !(ses->server)) in SMB2_query_directory()
5234 return -EIO; in SMB2_query_directory()
5236 if (smb3_encryption_required(tcon)) in SMB2_query_directory()
5244 rc = SMB2_query_directory_init(xid, tcon, server, in SMB2_query_directory()
5247 srch_inf->info_level); in SMB2_query_directory()
5256 if (rc == -ENODATA && in SMB2_query_directory()
5257 rsp->hdr.Status == STATUS_NO_MORE_FILES) { in SMB2_query_directory()
5259 tcon->tid, tcon->ses->Suid, index, 0); in SMB2_query_directory()
5260 srch_inf->endOfSearch = true; in SMB2_query_directory()
5263 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5264 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
5265 cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE); in SMB2_query_directory()
5270 rc = smb2_parse_query_directory(tcon, &rsp_iov, resp_buftype, in SMB2_query_directory()
5273 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5274 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
5279 trace_smb3_query_dir_done(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
5280 tcon->ses->Suid, index, srch_inf->entries_in_buffer); in SMB2_query_directory()
5289 SMB2_set_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_set_info_init() argument
5296 struct kvec *iov = rqst->rq_iov; in SMB2_set_info_init()
5300 rc = smb2_plain_req_init(SMB2_SET_INFO, tcon, server, in SMB2_set_info_init()
5305 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid); in SMB2_set_info_init()
5306 req->InfoType = info_type; in SMB2_set_info_init()
5307 req->FileInfoClass = info_class; in SMB2_set_info_init()
5308 req->PersistentFileId = persistent_fid; in SMB2_set_info_init()
5309 req->VolatileFileId = volatile_fid; in SMB2_set_info_init()
5310 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_set_info_init()
5312 req->BufferOffset = cpu_to_le16(sizeof(struct smb2_set_info_req)); in SMB2_set_info_init()
5313 req->BufferLength = cpu_to_le32(*size); in SMB2_set_info_init()
5315 memcpy(req->Buffer, *data, *size); in SMB2_set_info_init()
5320 iov[0].iov_len = total_len - 1; in SMB2_set_info_init()
5322 for (i = 1; i < rqst->rq_nvec; i++) { in SMB2_set_info_init()
5323 le32_add_cpu(&req->BufferLength, size[i]); in SMB2_set_info_init()
5334 if (rqst && rqst->rq_iov) in SMB2_set_info_free()
5335 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_set_info_free()
5339 send_set_info(const unsigned int xid, struct cifs_tcon *tcon, in send_set_info() argument
5350 struct cifs_ses *ses = tcon->ses; in send_set_info()
5355 return -EIO; in send_set_info()
5358 return -EINVAL; in send_set_info()
5360 if (smb3_encryption_required(tcon)) in send_set_info()
5365 return -ENOMEM; in send_set_info()
5371 rc = SMB2_set_info_init(tcon, server, in send_set_info()
5388 cifs_stats_fail_inc(tcon, SMB2_SET_INFO_HE); in send_set_info()
5389 trace_smb3_set_info_err(xid, persistent_fid, tcon->tid, in send_set_info()
5390 ses->Suid, info_class, (__u32)info_type, rc); in send_set_info()
5399 SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_set_eof() argument
5411 trace_smb3_set_eof(xid, persistent_fid, tcon->tid, tcon->ses->Suid, le64_to_cpu(*eof)); in SMB2_set_eof()
5413 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_eof()
5419 SMB2_set_acl(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_acl() argument
5423 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_acl()
5424 current->tgid, 0, SMB2_O_INFO_SECURITY, aclflag, in SMB2_set_acl()
5429 SMB2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_ea() argument
5433 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_ea()
5434 current->tgid, FILE_FULL_EA_INFORMATION, SMB2_O_INFO_FILE, in SMB2_set_ea()
5439 SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_oplock_break() argument
5446 struct cifs_ses *ses = tcon->ses; in SMB2_oplock_break()
5455 rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server, in SMB2_oplock_break()
5460 if (smb3_encryption_required(tcon)) in SMB2_oplock_break()
5463 req->VolatileFid = volatile_fid; in SMB2_oplock_break()
5464 req->PersistentFid = persistent_fid; in SMB2_oplock_break()
5465 req->OplockLevel = oplock_level; in SMB2_oplock_break()
5466 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_oplock_break()
5482 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE); in SMB2_oplock_break()
5493 kst->f_bsize = le32_to_cpu(pfs_inf->BytesPerSector) * in smb2_copy_fs_info_to_kstatfs()
5494 le32_to_cpu(pfs_inf->SectorsPerAllocationUnit); in smb2_copy_fs_info_to_kstatfs()
5495 kst->f_blocks = le64_to_cpu(pfs_inf->TotalAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5496 kst->f_bfree = kst->f_bavail = in smb2_copy_fs_info_to_kstatfs()
5497 le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5505 kst->f_bsize = le32_to_cpu(response_data->BlockSize); in copy_posix_fs_info_to_kstatfs()
5506 kst->f_blocks = le64_to_cpu(response_data->TotalBlocks); in copy_posix_fs_info_to_kstatfs()
5507 kst->f_bfree = le64_to_cpu(response_data->BlocksAvail); in copy_posix_fs_info_to_kstatfs()
5508 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5509 kst->f_bavail = kst->f_bfree; in copy_posix_fs_info_to_kstatfs()
5511 kst->f_bavail = le64_to_cpu(response_data->UserBlocksAvail); in copy_posix_fs_info_to_kstatfs()
5512 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5513 kst->f_files = le64_to_cpu(response_data->TotalFileNodes); in copy_posix_fs_info_to_kstatfs()
5514 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5515 kst->f_ffree = le64_to_cpu(response_data->FreeFileNodes); in copy_posix_fs_info_to_kstatfs()
5521 build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, in build_qfs_info_req() argument
5532 if ((tcon->ses == NULL) || server == NULL) in build_qfs_info_req()
5533 return -EIO; in build_qfs_info_req()
5535 rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server, in build_qfs_info_req()
5540 req->InfoType = SMB2_O_INFO_FILESYSTEM; in build_qfs_info_req()
5541 req->FileInfoClass = level; in build_qfs_info_req()
5542 req->PersistentFileId = persistent_fid; in build_qfs_info_req()
5543 req->VolatileFileId = volatile_fid; in build_qfs_info_req()
5545 req->InputBufferOffset = in build_qfs_info_req()
5547 req->OutputBufferLength = cpu_to_le32( in build_qfs_info_req()
5550 iov->iov_base = (char *)req; in build_qfs_info_req()
5551 iov->iov_len = total_len; in build_qfs_info_req()
5557 cifs_buf_release(iov->iov_base); in free_qfs_info_req()
5561 SMB311_posix_qfs_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB311_posix_qfs_info() argument
5570 struct cifs_ses *ses = tcon->ses; in SMB311_posix_qfs_info()
5575 rc = build_qfs_info_req(&iov, tcon, server, in SMB311_posix_qfs_info()
5582 if (smb3_encryption_required(tcon)) in SMB311_posix_qfs_info()
5593 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB311_posix_qfs_info()
5599 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB311_posix_qfs_info()
5600 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB311_posix_qfs_info()
5601 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB311_posix_qfs_info()
5612 SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_QFS_info() argument
5621 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_info()
5626 rc = build_qfs_info_req(&iov, tcon, server, in SMB2_QFS_info()
5633 if (smb3_encryption_required(tcon)) in SMB2_QFS_info()
5644 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB2_QFS_info()
5650 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB2_QFS_info()
5651 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB2_QFS_info()
5652 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB2_QFS_info()
5663 SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_QFS_attr() argument
5672 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_attr()
5691 return -EINVAL; in SMB2_QFS_attr()
5694 rc = build_qfs_info_req(&iov, tcon, server, in SMB2_QFS_attr()
5700 if (smb3_encryption_required(tcon)) in SMB2_QFS_attr()
5711 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB2_QFS_attr()
5716 rsp_len = le32_to_cpu(rsp->OutputBufferLength); in SMB2_QFS_attr()
5717 offset = le16_to_cpu(rsp->OutputBufferOffset); in SMB2_QFS_attr()
5723 memcpy(&tcon->fsAttrInfo, offset in SMB2_QFS_attr()
5727 memcpy(&tcon->fsDevInfo, offset in SMB2_QFS_attr()
5732 tcon->ss_flags = le32_to_cpu(ss_info->Flags); in SMB2_QFS_attr()
5733 tcon->perf_sector_size = in SMB2_QFS_attr()
5734 le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf); in SMB2_QFS_attr()
5738 tcon->vol_serial_number = vol_info->VolumeSerialNumber; in SMB2_QFS_attr()
5739 tcon->vol_create_time = vol_info->VolumeCreationTime; in SMB2_QFS_attr()
5748 smb2_lockv(const unsigned int xid, struct cifs_tcon *tcon, in smb2_lockv() argument
5761 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in smb2_lockv()
5765 rc = smb2_plain_req_init(SMB2_LOCK, tcon, server, in smb2_lockv()
5770 if (smb3_encryption_required(tcon)) in smb2_lockv()
5773 req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid); in smb2_lockv()
5774 req->LockCount = cpu_to_le16(num_lock); in smb2_lockv()
5776 req->PersistentFileId = persist_fid; in smb2_lockv()
5777 req->VolatileFileId = volatile_fid; in smb2_lockv()
5782 iov[0].iov_len = total_len - sizeof(struct smb2_lock_element); in smb2_lockv()
5786 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in smb2_lockv()
5792 rc = cifs_send_recv(xid, tcon->ses, server, in smb2_lockv()
5798 cifs_stats_fail_inc(tcon, SMB2_LOCK_HE); in smb2_lockv()
5799 trace_smb3_lock_err(xid, persist_fid, tcon->tid, in smb2_lockv()
5800 tcon->ses->Suid, rc); in smb2_lockv()
5807 SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_lock() argument
5820 return smb2_lockv(xid, tcon, persist_fid, volatile_fid, pid, 1, &lock); in SMB2_lock()
5824 SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_lease_break() argument
5830 struct cifs_ses *ses = tcon->ses; in SMB2_lease_break()
5838 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in SMB2_lease_break()
5841 rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server, in SMB2_lease_break()
5846 if (smb3_encryption_required(tcon)) in SMB2_lease_break()
5849 req->hdr.CreditRequest = cpu_to_le16(1); in SMB2_lease_break()
5850 req->StructureSize = cpu_to_le16(36); in SMB2_lease_break()
5853 memcpy(req->LeaseKey, lease_key, 16); in SMB2_lease_break()
5854 req->LeaseState = lease_state; in SMB2_lease_break()
5872 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE); in SMB2_lease_break()
5873 trace_smb3_lease_err(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
5874 ses->Suid, *please_key_low, *please_key_high, rc); in SMB2_lease_break()
5877 trace_smb3_lease_done(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
5878 ses->Suid, *please_key_low, *please_key_high); in SMB2_lease_break()