• Home
  • Raw
  • Download

Lines Matching +full:tcon +full:- +full:channel

23  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 /* SMB2 PDU handling routines here - except for leftovers (eg session setup) */
86 int smb3_encryption_required(const struct cifs_tcon *tcon) in smb3_encryption_required() argument
88 if (!tcon || !tcon->ses) in smb3_encryption_required()
90 if ((tcon->ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) || in smb3_encryption_required()
91 (tcon->share_flags & SHI1005_FLAGS_ENCRYPT_DATA)) in smb3_encryption_required()
93 if (tcon->seal && in smb3_encryption_required()
94 (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in smb3_encryption_required()
101 const struct cifs_tcon *tcon, in smb2_hdr_assemble() argument
104 shdr->ProtocolId = SMB2_PROTO_NUMBER; in smb2_hdr_assemble()
105 shdr->StructureSize = cpu_to_le16(64); in smb2_hdr_assemble()
106 shdr->Command = smb2_cmd; in smb2_hdr_assemble()
108 spin_lock(&server->req_lock); in smb2_hdr_assemble()
110 if (server->credits >= server->max_credits) in smb2_hdr_assemble()
111 shdr->CreditRequest = cpu_to_le16(0); in smb2_hdr_assemble()
113 shdr->CreditRequest = cpu_to_le16( in smb2_hdr_assemble()
114 min_t(int, server->max_credits - in smb2_hdr_assemble()
115 server->credits, 10)); in smb2_hdr_assemble()
116 spin_unlock(&server->req_lock); in smb2_hdr_assemble()
118 shdr->CreditRequest = cpu_to_le16(2); in smb2_hdr_assemble()
120 shdr->ProcessId = cpu_to_le32((__u16)current->tgid); in smb2_hdr_assemble()
122 if (!tcon) in smb2_hdr_assemble()
126 /* See sections 2.2.4 and 3.2.4.1.5 of MS-SMB2 */ in smb2_hdr_assemble()
127 if (server && (server->capabilities & SMB2_GLOBAL_CAP_LARGE_MTU)) in smb2_hdr_assemble()
128 shdr->CreditCharge = cpu_to_le16(1); in smb2_hdr_assemble()
131 shdr->TreeId = tcon->tid; in smb2_hdr_assemble()
133 if (tcon->ses) in smb2_hdr_assemble()
134 shdr->SessionId = tcon->ses->Suid; in smb2_hdr_assemble()
146 /* if (tcon->share_flags & SHI1005_FLAGS_DFS) in smb2_hdr_assemble()
147 shdr->Flags |= SMB2_FLAGS_DFS_OPERATIONS; */ in smb2_hdr_assemble()
149 if (server && server->sign && !smb3_encryption_required(tcon)) in smb2_hdr_assemble()
150 shdr->Flags |= SMB2_FLAGS_SIGNED; in smb2_hdr_assemble()
156 smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon, in smb2_reconnect() argument
165 * SMB2s NegProt, SessSetup, Logoff do not have tcon yet so in smb2_reconnect()
167 * for those three - in the calling routine. in smb2_reconnect()
169 if (tcon == NULL) in smb2_reconnect()
175 if (tcon->tidStatus == CifsExiting) { in smb2_reconnect()
178 * (and ulogoff which does not have tcon) in smb2_reconnect()
186 return -ENODEV; in smb2_reconnect()
189 if ((!tcon->ses) || (tcon->ses->status == CifsExiting) || in smb2_reconnect()
190 (!tcon->ses->server) || !server) in smb2_reconnect()
191 return -EIO; in smb2_reconnect()
193 ses = tcon->ses; in smb2_reconnect()
194 retries = server->nr_targets; in smb2_reconnect()
198 * reconnect -- should be greater than cifs socket timeout which is 7 in smb2_reconnect()
201 while (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
214 return -EAGAIN; in smb2_reconnect()
217 rc = wait_event_interruptible_timeout(server->response_q, in smb2_reconnect()
218 (server->tcpStatus != CifsNeedReconnect), in smb2_reconnect()
223 return -ERESTARTSYS; in smb2_reconnect()
227 if (server->tcpStatus != CifsNeedReconnect) in smb2_reconnect()
230 if (retries && --retries) in smb2_reconnect()
236 * back on-line in smb2_reconnect()
238 if (!tcon->retry) { in smb2_reconnect()
240 return -EHOSTDOWN; in smb2_reconnect()
242 retries = server->nr_targets; in smb2_reconnect()
245 if (!tcon->ses->need_reconnect && !tcon->need_reconnect) in smb2_reconnect()
254 mutex_lock(&tcon->ses->session_mutex); in smb2_reconnect()
261 if (server->tcpStatus == CifsNeedReconnect) { in smb2_reconnect()
262 rc = -EHOSTDOWN; in smb2_reconnect()
263 mutex_unlock(&tcon->ses->session_mutex); in smb2_reconnect()
268 * If we are reconnecting an extra channel, bind in smb2_reconnect()
270 if (server->is_channel) { in smb2_reconnect()
271 ses->binding = true; in smb2_reconnect()
272 ses->binding_chan = cifs_ses_find_chan(ses, server); in smb2_reconnect()
275 rc = cifs_negotiate_protocol(0, tcon->ses); in smb2_reconnect()
276 if (!rc && tcon->ses->need_reconnect) { in smb2_reconnect()
277 rc = cifs_setup_session(0, tcon->ses, nls_codepage); in smb2_reconnect()
278 if ((rc == -EACCES) && !tcon->retry) { in smb2_reconnect()
279 rc = -EHOSTDOWN; in smb2_reconnect()
280 ses->binding = false; in smb2_reconnect()
281 ses->binding_chan = NULL; in smb2_reconnect()
282 mutex_unlock(&tcon->ses->session_mutex); in smb2_reconnect()
285 mutex_unlock(&ses->session_mutex); in smb2_reconnect()
290 * End of channel binding in smb2_reconnect()
292 ses->binding = false; in smb2_reconnect()
293 ses->binding_chan = NULL; in smb2_reconnect()
295 if (rc || !tcon->need_reconnect) { in smb2_reconnect()
296 mutex_unlock(&tcon->ses->session_mutex); in smb2_reconnect()
300 cifs_mark_open_files_invalid(tcon); in smb2_reconnect()
301 if (tcon->use_persistent) in smb2_reconnect()
302 tcon->need_reopen_files = true; in smb2_reconnect()
304 rc = cifs_tree_connect(0, tcon, nls_codepage); in smb2_reconnect()
305 mutex_unlock(&tcon->ses->session_mutex); in smb2_reconnect()
307 cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc); in smb2_reconnect()
309 /* If sess reconnected but tcon didn't, something strange ... */ in smb2_reconnect()
310 pr_warn_once("reconnect tcon failed rc = %d\n", rc); in smb2_reconnect()
315 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in smb2_reconnect()
337 rc = -EAGAIN; in smb2_reconnect()
345 fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon, in fill_small_buf() argument
360 smb2_hdr_assemble(&spdu->sync_hdr, smb2_command, tcon, server); in fill_small_buf()
361 spdu->StructureSize2 = cpu_to_le16(parmsize); in fill_small_buf()
371 static int __smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon, in __smb2_plain_req_init() argument
387 return -ENOMEM; in __smb2_plain_req_init()
390 fill_small_buf(smb2_command, tcon, server, in __smb2_plain_req_init()
394 if (tcon != NULL) { in __smb2_plain_req_init()
396 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_sent[com_code]); in __smb2_plain_req_init()
397 cifs_stats_inc(&tcon->num_smbs_sent); in __smb2_plain_req_init()
403 static int smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon, in smb2_plain_req_init() argument
409 rc = smb2_reconnect(smb2_command, tcon, server); in smb2_plain_req_init()
413 return __smb2_plain_req_init(smb2_command, tcon, server, request_buf, in smb2_plain_req_init()
417 static int smb2_ioctl_req_init(u32 opcode, struct cifs_tcon *tcon, in smb2_ioctl_req_init() argument
423 return __smb2_plain_req_init(SMB2_IOCTL, tcon, server, in smb2_ioctl_req_init()
426 return smb2_plain_req_init(SMB2_IOCTL, tcon, server, in smb2_ioctl_req_init()
430 /* For explanation of negotiate contexts see MS-SMB2 section 2.2.3.1 */
435 pneg_ctxt->ContextType = SMB2_PREAUTH_INTEGRITY_CAPABILITIES; in build_preauth_ctxt()
436 pneg_ctxt->DataLength = cpu_to_le16(38); in build_preauth_ctxt()
437 pneg_ctxt->HashAlgorithmCount = cpu_to_le16(1); in build_preauth_ctxt()
438 pneg_ctxt->SaltLength = cpu_to_le16(SMB311_LINUX_CLIENT_SALT_SIZE); in build_preauth_ctxt()
439 get_random_bytes(pneg_ctxt->Salt, SMB311_LINUX_CLIENT_SALT_SIZE); in build_preauth_ctxt()
440 pneg_ctxt->HashAlgorithms = SMB2_PREAUTH_INTEGRITY_SHA512; in build_preauth_ctxt()
446 pneg_ctxt->ContextType = SMB2_COMPRESSION_CAPABILITIES; in build_compression_ctxt()
447 pneg_ctxt->DataLength = in build_compression_ctxt()
449 - sizeof(struct smb2_neg_context)); in build_compression_ctxt()
450 pneg_ctxt->CompressionAlgorithmCount = cpu_to_le16(3); in build_compression_ctxt()
451 pneg_ctxt->CompressionAlgorithms[0] = SMB3_COMPRESS_LZ77; in build_compression_ctxt()
452 pneg_ctxt->CompressionAlgorithms[1] = SMB3_COMPRESS_LZ77_HUFF; in build_compression_ctxt()
453 pneg_ctxt->CompressionAlgorithms[2] = SMB3_COMPRESS_LZNT1; in build_compression_ctxt()
459 pneg_ctxt->ContextType = SMB2_ENCRYPTION_CAPABILITIES; in build_encrypt_ctxt()
461 pneg_ctxt->DataLength = cpu_to_le16(4); /* Cipher Count + 1 cipher */ in build_encrypt_ctxt()
462 pneg_ctxt->CipherCount = cpu_to_le16(1); in build_encrypt_ctxt()
463 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
465 pneg_ctxt->DataLength = cpu_to_le16(8); /* Cipher Count + 3 ciphers */ in build_encrypt_ctxt()
466 pneg_ctxt->CipherCount = cpu_to_le16(3); in build_encrypt_ctxt()
467 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
468 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES256_GCM; in build_encrypt_ctxt()
469 pneg_ctxt->Ciphers[2] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
471 pneg_ctxt->DataLength = cpu_to_le16(6); /* Cipher Count + 2 ciphers */ in build_encrypt_ctxt()
472 pneg_ctxt->CipherCount = cpu_to_le16(2); in build_encrypt_ctxt()
473 pneg_ctxt->Ciphers[0] = SMB2_ENCRYPTION_AES128_GCM; in build_encrypt_ctxt()
474 pneg_ctxt->Ciphers[1] = SMB2_ENCRYPTION_AES128_CCM; in build_encrypt_ctxt()
483 pneg_ctxt->ContextType = SMB2_NETNAME_NEGOTIATE_CONTEXT_ID; in build_netname_ctxt()
486 pneg_ctxt->DataLength = cpu_to_le16(2 * cifs_strtoUTF16(pneg_ctxt->NetName, hostname, 100, cp)); in build_netname_ctxt()
488 return DIV_ROUND_UP(le16_to_cpu(pneg_ctxt->DataLength) + in build_netname_ctxt()
495 pneg_ctxt->ContextType = SMB2_POSIX_EXTENSIONS_AVAILABLE; in build_posix_ctxt()
496 pneg_ctxt->DataLength = cpu_to_le16(POSIX_CTXT_DATA_LEN); in build_posix_ctxt()
498 pneg_ctxt->Name[0] = 0x93; in build_posix_ctxt()
499 pneg_ctxt->Name[1] = 0xAD; in build_posix_ctxt()
500 pneg_ctxt->Name[2] = 0x25; in build_posix_ctxt()
501 pneg_ctxt->Name[3] = 0x50; in build_posix_ctxt()
502 pneg_ctxt->Name[4] = 0x9C; in build_posix_ctxt()
503 pneg_ctxt->Name[5] = 0xB4; in build_posix_ctxt()
504 pneg_ctxt->Name[6] = 0x11; in build_posix_ctxt()
505 pneg_ctxt->Name[7] = 0xE7; in build_posix_ctxt()
506 pneg_ctxt->Name[8] = 0xB4; in build_posix_ctxt()
507 pneg_ctxt->Name[9] = 0x23; in build_posix_ctxt()
508 pneg_ctxt->Name[10] = 0x83; in build_posix_ctxt()
509 pneg_ctxt->Name[11] = 0xDE; in build_posix_ctxt()
510 pneg_ctxt->Name[12] = 0x96; in build_posix_ctxt()
511 pneg_ctxt->Name[13] = 0x8B; in build_posix_ctxt()
512 pneg_ctxt->Name[14] = 0xCD; in build_posix_ctxt()
513 pneg_ctxt->Name[15] = 0x7C; in build_posix_ctxt()
536 req->NegotiateContextOffset = cpu_to_le32(*total_len); in assemble_neg_contexts()
548 if (server->compress_algorithm) { in assemble_neg_contexts()
556 req->NegotiateContextCount = cpu_to_le16(5); in assemble_neg_contexts()
558 req->NegotiateContextCount = cpu_to_le16(4); in assemble_neg_contexts()
561 server->hostname); in assemble_neg_contexts()
571 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_preauth_context()
573 /* If invalid preauth context warn but use what we requested, SHA-512 */ in decode_preauth_context()
577 } else if (len < MIN_PREAUTH_CTXT_DATA_LEN + le16_to_cpu(ctxt->SaltLength)) { in decode_preauth_context()
581 if (le16_to_cpu(ctxt->HashAlgorithmCount) != 1) in decode_preauth_context()
583 if (ctxt->HashAlgorithms != SMB2_PREAUTH_INTEGRITY_SHA512) in decode_preauth_context()
590 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_compress_ctx()
597 if (le16_to_cpu(ctxt->CompressionAlgorithmCount) != 1) { in decode_compress_ctx()
601 if (le16_to_cpu(ctxt->CompressionAlgorithms[0]) > 3) { in decode_compress_ctx()
605 server->compress_algorithm = ctxt->CompressionAlgorithms[0]; in decode_compress_ctx()
611 unsigned int len = le16_to_cpu(ctxt->DataLength); in decode_encrypt_ctx()
616 return -EINVAL; in decode_encrypt_ctx()
619 if (le16_to_cpu(ctxt->CipherCount) != 1) { in decode_encrypt_ctx()
621 return -EINVAL; in decode_encrypt_ctx()
623 cifs_dbg(FYI, "SMB311 cipher type:%d\n", le16_to_cpu(ctxt->Ciphers[0])); in decode_encrypt_ctx()
625 if (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM) { in decode_encrypt_ctx()
627 return -EOPNOTSUPP; in decode_encrypt_ctx()
629 } else if (ctxt->Ciphers[0] == 0) { in decode_encrypt_ctx()
639 server->cipher_type = 0; in decode_encrypt_ctx()
640 server->capabilities &= ~SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
643 } else if ((ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_CCM) && in decode_encrypt_ctx()
644 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES128_GCM) && in decode_encrypt_ctx()
645 (ctxt->Ciphers[0] != SMB2_ENCRYPTION_AES256_GCM)) { in decode_encrypt_ctx()
648 return -EINVAL; in decode_encrypt_ctx()
650 server->cipher_type = ctxt->Ciphers[0]; in decode_encrypt_ctx()
651 server->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION; in decode_encrypt_ctx()
660 unsigned int offset = le32_to_cpu(rsp->NegotiateContextOffset); in smb311_decode_neg_context()
661 unsigned int ctxt_cnt = le16_to_cpu(rsp->NegotiateContextCount); in smb311_decode_neg_context()
668 return -EINVAL; in smb311_decode_neg_context()
671 len_of_ctxts = len_of_smb - offset; in smb311_decode_neg_context()
683 clen = le16_to_cpu(pctx->DataLength); in smb311_decode_neg_context()
687 if (pctx->ContextType == SMB2_PREAUTH_INTEGRITY_CAPABILITIES) in smb311_decode_neg_context()
690 else if (pctx->ContextType == SMB2_ENCRYPTION_CAPABILITIES) in smb311_decode_neg_context()
693 else if (pctx->ContextType == SMB2_COMPRESSION_CAPABILITIES) in smb311_decode_neg_context()
696 else if (pctx->ContextType == SMB2_POSIX_EXTENSIONS_AVAILABLE) in smb311_decode_neg_context()
697 server->posix_ext_supported = true; in smb311_decode_neg_context()
700 le16_to_cpu(pctx->ContextType)); in smb311_decode_neg_context()
707 len_of_ctxts -= clen; in smb311_decode_neg_context()
722 buf->ccontext.DataOffset = in create_posix_buf()
724 buf->ccontext.DataLength = cpu_to_le32(4); in create_posix_buf()
725 buf->ccontext.NameOffset = in create_posix_buf()
727 buf->ccontext.NameLength = cpu_to_le16(16); in create_posix_buf()
730 buf->Name[0] = 0x93; in create_posix_buf()
731 buf->Name[1] = 0xAD; in create_posix_buf()
732 buf->Name[2] = 0x25; in create_posix_buf()
733 buf->Name[3] = 0x50; in create_posix_buf()
734 buf->Name[4] = 0x9C; in create_posix_buf()
735 buf->Name[5] = 0xB4; in create_posix_buf()
736 buf->Name[6] = 0x11; in create_posix_buf()
737 buf->Name[7] = 0xE7; in create_posix_buf()
738 buf->Name[8] = 0xB4; in create_posix_buf()
739 buf->Name[9] = 0x23; in create_posix_buf()
740 buf->Name[10] = 0x83; in create_posix_buf()
741 buf->Name[11] = 0xDE; in create_posix_buf()
742 buf->Name[12] = 0x96; in create_posix_buf()
743 buf->Name[13] = 0x8B; in create_posix_buf()
744 buf->Name[14] = 0xCD; in create_posix_buf()
745 buf->Name[15] = 0x7C; in create_posix_buf()
746 buf->Mode = cpu_to_le32(mode); in create_posix_buf()
761 return -ENOMEM; in add_posix_context()
763 if (!req->CreateContextsOffset) in add_posix_context()
764 req->CreateContextsOffset = cpu_to_le32( in add_posix_context()
766 iov[num - 1].iov_len); in add_posix_context()
767 le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_posix)); in add_posix_context()
808 return -EIO; in SMB2_negotiate()
816 req->sync_hdr.SessionId = 0; in SMB2_negotiate()
818 memset(server->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
819 memset(ses->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE); in SMB2_negotiate()
821 if (strcmp(server->vals->version_string, in SMB2_negotiate()
823 req->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
824 req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
825 req->DialectCount = cpu_to_le16(2); in SMB2_negotiate()
827 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
829 req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in SMB2_negotiate()
830 req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in SMB2_negotiate()
831 req->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in SMB2_negotiate()
832 req->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in SMB2_negotiate()
833 req->DialectCount = cpu_to_le16(4); in SMB2_negotiate()
837 req->Dialects[0] = cpu_to_le16(server->vals->protocol_id); in SMB2_negotiate()
838 req->DialectCount = cpu_to_le16(1); in SMB2_negotiate()
843 if (ses->sign) in SMB2_negotiate()
844 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_REQUIRED); in SMB2_negotiate()
846 req->SecurityMode = cpu_to_le16(SMB2_NEGOTIATE_SIGNING_ENABLED); in SMB2_negotiate()
848 req->SecurityMode = 0; in SMB2_negotiate()
850 req->Capabilities = cpu_to_le32(server->vals->req_capabilities); in SMB2_negotiate()
851 if (ses->chan_max > 1) in SMB2_negotiate()
852 req->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in SMB2_negotiate()
855 if (server->vals->protocol_id == SMB20_PROT_ID) in SMB2_negotiate()
856 memset(req->ClientGUID, 0, SMB2_CLIENT_GUID_SIZE); in SMB2_negotiate()
858 memcpy(req->ClientGUID, server->client_guid, in SMB2_negotiate()
860 if ((server->vals->protocol_id == SMB311_PROT_ID) || in SMB2_negotiate()
861 (strcmp(server->vals->version_string, in SMB2_negotiate()
877 * No tcon so can't do in SMB2_negotiate()
878 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_negotiate()
880 if (rc == -EOPNOTSUPP) { in SMB2_negotiate()
886 if (strcmp(server->vals->version_string, in SMB2_negotiate()
888 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
891 return -EIO; in SMB2_negotiate()
892 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
895 return -EIO; in SMB2_negotiate()
897 } else if (strcmp(server->vals->version_string, in SMB2_negotiate()
899 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) { in SMB2_negotiate()
902 return -EIO; in SMB2_negotiate()
903 } else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) { in SMB2_negotiate()
905 server->ops = &smb21_operations; in SMB2_negotiate()
906 server->vals = &smb21_values; in SMB2_negotiate()
907 } else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
908 server->ops = &smb311_operations; in SMB2_negotiate()
909 server->vals = &smb311_values; in SMB2_negotiate()
911 } else if (le16_to_cpu(rsp->DialectRevision) != in SMB2_negotiate()
912 server->vals->protocol_id) { in SMB2_negotiate()
915 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
916 return -EIO; in SMB2_negotiate()
919 cifs_dbg(FYI, "mode 0x%x\n", rsp->SecurityMode); in SMB2_negotiate()
921 if (rsp->DialectRevision == cpu_to_le16(SMB20_PROT_ID)) in SMB2_negotiate()
923 else if (rsp->DialectRevision == cpu_to_le16(SMB21_PROT_ID)) in SMB2_negotiate()
925 else if (rsp->DialectRevision == cpu_to_le16(SMB30_PROT_ID)) in SMB2_negotiate()
927 else if (rsp->DialectRevision == cpu_to_le16(SMB302_PROT_ID)) in SMB2_negotiate()
929 else if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) in SMB2_negotiate()
933 le16_to_cpu(rsp->DialectRevision)); in SMB2_negotiate()
934 rc = -EIO; in SMB2_negotiate()
937 server->dialect = le16_to_cpu(rsp->DialectRevision); in SMB2_negotiate()
944 memcpy(server->preauth_sha_hash, ses->preauth_sha_hash, in SMB2_negotiate()
948 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in SMB2_negotiate()
950 server->maxBuf = min_t(unsigned int, le32_to_cpu(rsp->MaxTransactSize), in SMB2_negotiate()
952 server->max_read = le32_to_cpu(rsp->MaxReadSize); in SMB2_negotiate()
953 server->max_write = le32_to_cpu(rsp->MaxWriteSize); in SMB2_negotiate()
954 server->sec_mode = le16_to_cpu(rsp->SecurityMode); in SMB2_negotiate()
955 if ((server->sec_mode & SMB2_SEC_MODE_FLAGS_ALL) != server->sec_mode) in SMB2_negotiate()
957 server->sec_mode); in SMB2_negotiate()
958 server->capabilities = le32_to_cpu(rsp->Capabilities); in SMB2_negotiate()
960 server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; in SMB2_negotiate()
966 if (server->dialect == SMB30_PROT_ID && (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_negotiate()
967 server->cipher_type = SMB2_ENCRYPTION_AES128_CCM; in SMB2_negotiate()
972 * See MS-SMB2 section 2.2.4: if no blob, client picks default which in SMB2_negotiate()
974 * ses->sectype = RawNTLMSSP; in SMB2_negotiate()
980 server->sec_ntlmssp = true; in SMB2_negotiate()
983 rc = cifs_enable_signing(server, ses->sign); in SMB2_negotiate()
991 rc = -EIO; in SMB2_negotiate()
994 if (rsp->DialectRevision == cpu_to_le16(SMB311_PROT_ID)) { in SMB2_negotiate()
995 if (rsp->NegotiateContextCount) in SMB2_negotiate()
1006 int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon) in smb3_validate_negotiate() argument
1013 struct TCP_Server_Info *server = tcon->ses->server; in smb3_validate_negotiate()
1018 if (server->dialect == SMB311_PROT_ID) in smb3_validate_negotiate()
1028 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) in smb3_validate_negotiate()
1031 if (tcon->ses->user_name == NULL) { in smb3_validate_negotiate()
1036 if (tcon->ses->session_flags & SMB2_SESSION_FLAG_IS_NULL) in smb3_validate_negotiate()
1041 return -ENOMEM; in smb3_validate_negotiate()
1043 pneg_inbuf->Capabilities = in smb3_validate_negotiate()
1044 cpu_to_le32(server->vals->req_capabilities); in smb3_validate_negotiate()
1045 if (tcon->ses->chan_max > 1) in smb3_validate_negotiate()
1046 pneg_inbuf->Capabilities |= cpu_to_le32(SMB2_GLOBAL_CAP_MULTI_CHANNEL); in smb3_validate_negotiate()
1048 memcpy(pneg_inbuf->Guid, server->client_guid, in smb3_validate_negotiate()
1051 if (tcon->ses->sign) in smb3_validate_negotiate()
1052 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1055 pneg_inbuf->SecurityMode = in smb3_validate_negotiate()
1058 pneg_inbuf->SecurityMode = 0; in smb3_validate_negotiate()
1061 if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1063 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1064 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1065 pneg_inbuf->DialectCount = cpu_to_le16(2); in smb3_validate_negotiate()
1067 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1068 (2 * sizeof(pneg_inbuf->Dialects[0])); in smb3_validate_negotiate()
1069 } else if (strcmp(server->vals->version_string, in smb3_validate_negotiate()
1071 pneg_inbuf->Dialects[0] = cpu_to_le16(SMB21_PROT_ID); in smb3_validate_negotiate()
1072 pneg_inbuf->Dialects[1] = cpu_to_le16(SMB30_PROT_ID); in smb3_validate_negotiate()
1073 pneg_inbuf->Dialects[2] = cpu_to_le16(SMB302_PROT_ID); in smb3_validate_negotiate()
1074 pneg_inbuf->Dialects[3] = cpu_to_le16(SMB311_PROT_ID); in smb3_validate_negotiate()
1075 pneg_inbuf->DialectCount = cpu_to_le16(4); in smb3_validate_negotiate()
1080 pneg_inbuf->Dialects[0] = in smb3_validate_negotiate()
1081 cpu_to_le16(server->vals->protocol_id); in smb3_validate_negotiate()
1082 pneg_inbuf->DialectCount = cpu_to_le16(1); in smb3_validate_negotiate()
1084 inbuflen = sizeof(*pneg_inbuf) - in smb3_validate_negotiate()
1085 sizeof(pneg_inbuf->Dialects[0]) * 3; in smb3_validate_negotiate()
1088 rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID, in smb3_validate_negotiate()
1092 if (rc == -EOPNOTSUPP) { in smb3_validate_negotiate()
1103 rc = -EIO; in smb3_validate_negotiate()
1107 rc = -EIO; in smb3_validate_negotiate()
1118 if (pneg_rsp->Dialect != cpu_to_le16(server->dialect)) in smb3_validate_negotiate()
1121 if (pneg_rsp->SecurityMode != cpu_to_le16(server->sec_mode)) in smb3_validate_negotiate()
1126 if ((le32_to_cpu(pneg_rsp->Capabilities) | SMB2_NT_FIND | in smb3_validate_negotiate()
1127 SMB2_LARGE_FILES) != server->capabilities) in smb3_validate_negotiate()
1136 cifs_tcon_dbg(VFS, "protocol revalidation - security settings mismatch\n"); in smb3_validate_negotiate()
1154 if (server->sec_ntlmssp && in smb2_select_sectype()
1157 if ((server->sec_kerberos || server->sec_mskerberos) && in smb2_select_sectype()
1189 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_alloc_buffer()
1200 if (sess_data->ses->binding) { in SMB2_sess_alloc_buffer()
1201 req->sync_hdr.SessionId = sess_data->ses->Suid; in SMB2_sess_alloc_buffer()
1202 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_sess_alloc_buffer()
1203 req->PreviousSessionId = 0; in SMB2_sess_alloc_buffer()
1204 req->Flags = SMB2_SESSION_REQ_FLAG_BINDING; in SMB2_sess_alloc_buffer()
1207 req->sync_hdr.SessionId = 0; in SMB2_sess_alloc_buffer()
1212 req->PreviousSessionId = sess_data->previous_session; in SMB2_sess_alloc_buffer()
1213 req->Flags = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1217 req->sync_hdr.CreditRequest = cpu_to_le16(130); in SMB2_sess_alloc_buffer()
1220 if (server->sign) in SMB2_sess_alloc_buffer()
1221 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_REQUIRED; in SMB2_sess_alloc_buffer()
1223 req->SecurityMode = SMB2_NEGOTIATE_SIGNING_ENABLED; in SMB2_sess_alloc_buffer()
1225 req->SecurityMode = 0; in SMB2_sess_alloc_buffer()
1228 req->Capabilities = cpu_to_le32(SMB2_GLOBAL_CAP_DFS); in SMB2_sess_alloc_buffer()
1230 req->Capabilities = 0; in SMB2_sess_alloc_buffer()
1233 req->Channel = 0; /* MBZ */ in SMB2_sess_alloc_buffer()
1235 sess_data->iov[0].iov_base = (char *)req; in SMB2_sess_alloc_buffer()
1237 sess_data->iov[0].iov_len = total_len - 1; in SMB2_sess_alloc_buffer()
1242 sess_data->buf0_type = CIFS_SMALL_BUFFER; in SMB2_sess_alloc_buffer()
1250 free_rsp_buf(sess_data->buf0_type, sess_data->iov[0].iov_base); in SMB2_sess_free_buffer()
1251 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_free_buffer()
1259 struct smb2_sess_setup_req *req = sess_data->iov[0].iov_base; in SMB2_sess_sendreceive()
1263 req->SecurityBufferOffset = in SMB2_sess_sendreceive()
1264 cpu_to_le16(sizeof(struct smb2_sess_setup_req) - 1 /* pad */); in SMB2_sess_sendreceive()
1265 req->SecurityBufferLength = cpu_to_le16(sess_data->iov[1].iov_len); in SMB2_sess_sendreceive()
1268 rqst.rq_iov = sess_data->iov; in SMB2_sess_sendreceive()
1272 rc = cifs_send_recv(sess_data->xid, sess_data->ses, in SMB2_sess_sendreceive()
1273 cifs_ses_server(sess_data->ses), in SMB2_sess_sendreceive()
1275 &sess_data->buf0_type, in SMB2_sess_sendreceive()
1277 cifs_small_buf_release(sess_data->iov[0].iov_base); in SMB2_sess_sendreceive()
1278 memcpy(&sess_data->iov[0], &rsp_iov, sizeof(struct kvec)); in SMB2_sess_sendreceive()
1287 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_establish_session()
1290 mutex_lock(&server->srv_mutex); in SMB2_sess_establish_session()
1291 if (server->ops->generate_signingkey) { in SMB2_sess_establish_session()
1292 rc = server->ops->generate_signingkey(ses); in SMB2_sess_establish_session()
1296 mutex_unlock(&server->srv_mutex); in SMB2_sess_establish_session()
1300 if (!server->session_estab) { in SMB2_sess_establish_session()
1301 server->sequence_number = 0x2; in SMB2_sess_establish_session()
1302 server->session_estab = true; in SMB2_sess_establish_session()
1304 mutex_unlock(&server->srv_mutex); in SMB2_sess_establish_session()
1308 if (!ses->binding) { in SMB2_sess_establish_session()
1310 ses->status = CifsGood; in SMB2_sess_establish_session()
1311 ses->need_reconnect = false; in SMB2_sess_establish_session()
1323 struct cifs_ses *ses = sess_data->ses; in SMB2_auth_kerberos()
1335 if (rc == -ENOKEY) in SMB2_auth_kerberos()
1341 msg = spnego_key->payload.data[0]; in SMB2_auth_kerberos()
1346 if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { in SMB2_auth_kerberos()
1348 CIFS_SPNEGO_UPCALL_VERSION, msg->version); in SMB2_auth_kerberos()
1349 rc = -EKEYREJECTED; in SMB2_auth_kerberos()
1354 if (!ses->binding) { in SMB2_auth_kerberos()
1355 ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len, in SMB2_auth_kerberos()
1357 if (!ses->auth_key.response) { in SMB2_auth_kerberos()
1359 msg->sesskey_len); in SMB2_auth_kerberos()
1360 rc = -ENOMEM; in SMB2_auth_kerberos()
1363 ses->auth_key.len = msg->sesskey_len; in SMB2_auth_kerberos()
1366 sess_data->iov[1].iov_base = msg->data + msg->sesskey_len; in SMB2_auth_kerberos()
1367 sess_data->iov[1].iov_len = msg->secblob_len; in SMB2_auth_kerberos()
1373 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_auth_kerberos()
1375 if (!ses->binding) { in SMB2_auth_kerberos()
1376 ses->Suid = rsp->sync_hdr.SessionId; in SMB2_auth_kerberos()
1377 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_auth_kerberos()
1385 sess_data->result = rc; in SMB2_auth_kerberos()
1386 sess_data->func = NULL; in SMB2_auth_kerberos()
1394 sess_data->result = -EOPNOTSUPP; in SMB2_auth_kerberos()
1395 sess_data->func = NULL; in SMB2_auth_kerberos()
1406 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_negotiate()
1416 ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL); in SMB2_sess_auth_rawntlmssp_negotiate()
1417 if (!ses->ntlmssp) { in SMB2_sess_auth_rawntlmssp_negotiate()
1418 rc = -ENOMEM; in SMB2_sess_auth_rawntlmssp_negotiate()
1421 ses->ntlmssp->sesskey_per_smbsess = true; in SMB2_sess_auth_rawntlmssp_negotiate()
1430 rc = -ENOMEM; in SMB2_sess_auth_rawntlmssp_negotiate()
1438 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_negotiate()
1444 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_negotiate()
1445 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_negotiate()
1448 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_negotiate()
1451 if (sess_data->buf0_type != CIFS_NO_BUFFER && in SMB2_sess_auth_rawntlmssp_negotiate()
1452 rsp->sync_hdr.Status == STATUS_MORE_PROCESSING_REQUIRED) in SMB2_sess_auth_rawntlmssp_negotiate()
1459 le16_to_cpu(rsp->SecurityBufferOffset)) { in SMB2_sess_auth_rawntlmssp_negotiate()
1461 le16_to_cpu(rsp->SecurityBufferOffset)); in SMB2_sess_auth_rawntlmssp_negotiate()
1462 rc = -EIO; in SMB2_sess_auth_rawntlmssp_negotiate()
1465 rc = decode_ntlmssp_challenge(rsp->Buffer, in SMB2_sess_auth_rawntlmssp_negotiate()
1466 le16_to_cpu(rsp->SecurityBufferLength), ses); in SMB2_sess_auth_rawntlmssp_negotiate()
1473 if (!ses->binding) { in SMB2_sess_auth_rawntlmssp_negotiate()
1474 ses->Suid = rsp->sync_hdr.SessionId; in SMB2_sess_auth_rawntlmssp_negotiate()
1475 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_negotiate()
1482 sess_data->result = 0; in SMB2_sess_auth_rawntlmssp_negotiate()
1483 sess_data->func = SMB2_sess_auth_rawntlmssp_authenticate; in SMB2_sess_auth_rawntlmssp_negotiate()
1487 kfree(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_negotiate()
1488 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1489 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_negotiate()
1490 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_negotiate()
1497 struct cifs_ses *ses = sess_data->ses; in SMB2_sess_auth_rawntlmssp_authenticate()
1508 req = (struct smb2_sess_setup_req *) sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1509 req->sync_hdr.SessionId = ses->Suid; in SMB2_sess_auth_rawntlmssp_authenticate()
1512 sess_data->nls_cp); in SMB2_sess_auth_rawntlmssp_authenticate()
1521 rc = -EOPNOTSUPP; in SMB2_sess_auth_rawntlmssp_authenticate()
1524 sess_data->iov[1].iov_base = ntlmssp_blob; in SMB2_sess_auth_rawntlmssp_authenticate()
1525 sess_data->iov[1].iov_len = blob_length; in SMB2_sess_auth_rawntlmssp_authenticate()
1531 rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base; in SMB2_sess_auth_rawntlmssp_authenticate()
1534 if (!ses->binding) { in SMB2_sess_auth_rawntlmssp_authenticate()
1535 ses->Suid = rsp->sync_hdr.SessionId; in SMB2_sess_auth_rawntlmssp_authenticate()
1536 ses->session_flags = le16_to_cpu(rsp->SessionFlags); in SMB2_sess_auth_rawntlmssp_authenticate()
1541 if (ses->server->dialect < SMB30_PROT_ID) { in SMB2_sess_auth_rawntlmssp_authenticate()
1547 cifs_dbg(VFS, "Session Id %*ph\n", (int)sizeof(ses->Suid), in SMB2_sess_auth_rawntlmssp_authenticate()
1548 &ses->Suid); in SMB2_sess_auth_rawntlmssp_authenticate()
1550 SMB2_NTLMV2_SESSKEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1552 SMB3_SIGN_KEY_SIZE, ses->auth_key.response); in SMB2_sess_auth_rawntlmssp_authenticate()
1558 kfree(ses->ntlmssp); in SMB2_sess_auth_rawntlmssp_authenticate()
1559 ses->ntlmssp = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1560 sess_data->result = rc; in SMB2_sess_auth_rawntlmssp_authenticate()
1561 sess_data->func = NULL; in SMB2_sess_auth_rawntlmssp_authenticate()
1569 type = smb2_select_sectype(cifs_ses_server(ses), ses->sectype); in SMB2_select_sec()
1573 return -EINVAL; in SMB2_select_sec()
1578 sess_data->func = SMB2_auth_kerberos; in SMB2_select_sec()
1581 sess_data->func = SMB2_sess_auth_rawntlmssp_negotiate; in SMB2_select_sec()
1585 return -EOPNOTSUPP; in SMB2_select_sec()
1603 return -EIO; in SMB2_sess_setup()
1608 return -ENOMEM; in SMB2_sess_setup()
1613 sess_data->xid = xid; in SMB2_sess_setup()
1614 sess_data->ses = ses; in SMB2_sess_setup()
1615 sess_data->buf0_type = CIFS_NO_BUFFER; in SMB2_sess_setup()
1616 sess_data->nls_cp = (struct nls_table *) nls_cp; in SMB2_sess_setup()
1617 sess_data->previous_session = ses->Suid; in SMB2_sess_setup()
1622 memcpy(ses->preauth_sha_hash, server->preauth_sha_hash, in SMB2_sess_setup()
1625 while (sess_data->func) in SMB2_sess_setup()
1626 sess_data->func(sess_data); in SMB2_sess_setup()
1628 if ((ses->session_flags & SMB2_SESSION_FLAG_IS_GUEST) && (ses->sign)) in SMB2_sess_setup()
1630 rc = sess_data->result; in SMB2_sess_setup()
1651 if (ses && (ses->server)) in SMB2_logoff()
1652 server = ses->server; in SMB2_logoff()
1654 return -EIO; in SMB2_logoff()
1657 if (ses->need_reconnect) in SMB2_logoff()
1660 rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, ses->server, in SMB2_logoff()
1665 /* since no tcon, smb2_init can not do this, so do here */ in SMB2_logoff()
1666 req->sync_hdr.SessionId = ses->Suid; in SMB2_logoff()
1668 if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA) in SMB2_logoff()
1670 else if (server->sign) in SMB2_logoff()
1671 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_logoff()
1682 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_logoff()
1686 * No tcon so can't do in SMB2_logoff()
1687 * cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_fail[SMB2...]); in SMB2_logoff()
1694 static inline void cifs_stats_fail_inc(struct cifs_tcon *tcon, uint16_t code) in cifs_stats_fail_inc() argument
1696 cifs_stats_inc(&tcon->stats.smb2_stats.smb2_com_failed[code]); in cifs_stats_fail_inc()
1702 static inline void init_copy_chunk_defaults(struct cifs_tcon *tcon) in init_copy_chunk_defaults() argument
1704 tcon->max_chunks = 256; in init_copy_chunk_defaults()
1705 tcon->max_bytes_chunk = 1048576; in init_copy_chunk_defaults()
1706 tcon->max_bytes_copy = 16777216; in init_copy_chunk_defaults()
1711 struct cifs_tcon *tcon, const struct nls_table *cp) in SMB2_tcon() argument
1726 /* always use master channel */ in SMB2_tcon()
1727 server = ses->server; in SMB2_tcon()
1729 cifs_dbg(FYI, "TCON\n"); in SMB2_tcon()
1732 return -EIO; in SMB2_tcon()
1736 return -ENOMEM; in SMB2_tcon()
1742 return -EINVAL; in SMB2_tcon()
1746 tcon->tid = 0; in SMB2_tcon()
1747 atomic_set(&tcon->num_remote_opens, 0); in SMB2_tcon()
1748 rc = smb2_plain_req_init(SMB2_TREE_CONNECT, tcon, server, in SMB2_tcon()
1755 if (smb3_encryption_required(tcon)) in SMB2_tcon()
1760 iov[0].iov_len = total_len - 1; in SMB2_tcon()
1763 req->PathOffset = cpu_to_le16(sizeof(struct smb2_tree_connect_req) in SMB2_tcon()
1764 - 1 /* pad */); in SMB2_tcon()
1765 req->PathLength = cpu_to_le16(unc_path_len - 2); in SMB2_tcon()
1770 * 3.11 tcon req must be signed if not encrypted. See MS-SMB2 3.2.4.1.1 in SMB2_tcon()
1771 * unless it is guest or anonymous user. See MS-SMB2 3.2.5.3.1 in SMB2_tcon()
1774 if ((server->dialect == SMB311_PROT_ID) && in SMB2_tcon()
1775 !smb3_encryption_required(tcon) && in SMB2_tcon()
1776 !(ses->session_flags & in SMB2_tcon()
1778 ((ses->user_name != NULL) || (ses->sectype == Kerberos))) in SMB2_tcon()
1779 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_tcon()
1786 req->sync_hdr.CreditRequest = cpu_to_le16(64); in SMB2_tcon()
1792 trace_smb3_tcon(xid, tcon->tid, ses->Suid, tree, rc); in SMB2_tcon()
1794 if (tcon) { in SMB2_tcon()
1795 cifs_stats_fail_inc(tcon, SMB2_TREE_CONNECT_HE); in SMB2_tcon()
1796 tcon->need_reconnect = true; in SMB2_tcon()
1801 switch (rsp->ShareType) { in SMB2_tcon()
1806 tcon->pipe = true; in SMB2_tcon()
1810 tcon->print = true; in SMB2_tcon()
1814 cifs_server_dbg(VFS, "unknown share type %d\n", rsp->ShareType); in SMB2_tcon()
1815 rc = -EOPNOTSUPP; in SMB2_tcon()
1819 tcon->share_flags = le32_to_cpu(rsp->ShareFlags); in SMB2_tcon()
1820 tcon->capabilities = rsp->Capabilities; /* we keep caps little endian */ in SMB2_tcon()
1821 tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess); in SMB2_tcon()
1822 tcon->tidStatus = CifsGood; in SMB2_tcon()
1823 tcon->need_reconnect = false; in SMB2_tcon()
1824 tcon->tid = rsp->sync_hdr.TreeId; in SMB2_tcon()
1825 strlcpy(tcon->treeName, tree, sizeof(tcon->treeName)); in SMB2_tcon()
1827 if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) && in SMB2_tcon()
1828 ((tcon->share_flags & SHI1005_FLAGS_DFS) == 0)) in SMB2_tcon()
1831 if (tcon->seal && in SMB2_tcon()
1832 !(server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) in SMB2_tcon()
1835 init_copy_chunk_defaults(tcon); in SMB2_tcon()
1836 if (server->ops->validate_negotiate) in SMB2_tcon()
1837 rc = server->ops->validate_negotiate(xid, tcon); in SMB2_tcon()
1845 if (rsp && rsp->sync_hdr.Status == STATUS_BAD_NETWORK_NAME) { in SMB2_tcon()
1852 SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon) in SMB2_tdis() argument
1857 struct cifs_ses *ses = tcon->ses; in SMB2_tdis()
1866 if (!ses || !(ses->server)) in SMB2_tdis()
1867 return -EIO; in SMB2_tdis()
1869 if ((tcon->need_reconnect) || (tcon->ses->need_reconnect)) in SMB2_tdis()
1872 close_shroot_lease(&tcon->crfid); in SMB2_tdis()
1874 rc = smb2_plain_req_init(SMB2_TREE_DISCONNECT, tcon, ses->server, in SMB2_tdis()
1880 if (smb3_encryption_required(tcon)) in SMB2_tdis()
1892 rc = cifs_send_recv(xid, ses, ses->server, in SMB2_tdis()
1896 cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE); in SMB2_tdis()
1911 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_buf()
1913 buf->ccontext.DataLength = cpu_to_le32(16); in create_durable_buf()
1914 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_buf()
1916 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_buf()
1918 buf->Name[0] = 'D'; in create_durable_buf()
1919 buf->Name[1] = 'H'; in create_durable_buf()
1920 buf->Name[2] = 'n'; in create_durable_buf()
1921 buf->Name[3] = 'Q'; in create_durable_buf()
1934 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
1936 buf->ccontext.DataLength = cpu_to_le32(16); in create_reconnect_durable_buf()
1937 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_reconnect_durable_buf()
1939 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_buf()
1940 buf->Data.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_buf()
1941 buf->Data.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_buf()
1943 buf->Name[0] = 'D'; in create_reconnect_durable_buf()
1944 buf->Name[1] = 'H'; in create_reconnect_durable_buf()
1945 buf->Name[2] = 'n'; in create_reconnect_durable_buf()
1946 buf->Name[3] = 'C'; in create_reconnect_durable_buf()
1956 pdisk_id->DiskFileId, pdisk_id->VolumeId); in parse_query_id_ctxt()
1957 buf->IndexNumber = pdisk_id->DiskFileId; in parse_query_id_ctxt()
1965 u8 *beg = (u8 *)cc + le16_to_cpu(cc->DataOffset); in parse_posix_ctxt()
1966 u8 *end = beg + le32_to_cpu(cc->DataLength); in parse_posix_ctxt()
1971 posix->nlink = le32_to_cpu(*(__le32 *)(beg + 0)); in parse_posix_ctxt()
1972 posix->reparse_tag = le32_to_cpu(*(__le32 *)(beg + 4)); in parse_posix_ctxt()
1973 posix->mode = le32_to_cpu(*(__le32 *)(beg + 8)); in parse_posix_ctxt()
1981 memcpy(&posix->owner, sid, sid_len); in parse_posix_ctxt()
1989 memcpy(&posix->group, sid, sid_len); in parse_posix_ctxt()
1992 posix->nlink, posix->mode, posix->reparse_tag); in parse_posix_ctxt()
2014 data_offset = (char *)rsp + le32_to_cpu(rsp->CreateContextsOffset); in smb2_parse_contexts()
2015 remaining = le32_to_cpu(rsp->CreateContextsLength); in smb2_parse_contexts()
2020 buf->IndexNumber = 0; in smb2_parse_contexts()
2023 name = le16_to_cpu(cc->NameOffset) + (char *)cc; in smb2_parse_contexts()
2024 if (le16_to_cpu(cc->NameLength) == 4 && in smb2_parse_contexts()
2026 *oplock = server->ops->parse_lease_buf(cc, epoch, in smb2_parse_contexts()
2028 else if (buf && (le16_to_cpu(cc->NameLength) == 4) && in smb2_parse_contexts()
2031 else if ((le16_to_cpu(cc->NameLength) == 16)) { in smb2_parse_contexts()
2038 le16_to_cpu(cc->NameLength)); in smb2_parse_contexts()
2042 next = le32_to_cpu(cc->Next); in smb2_parse_contexts()
2045 remaining -= next; in smb2_parse_contexts()
2049 if (rsp->OplockLevel != SMB2_OPLOCK_LEVEL_LEASE) in smb2_parse_contexts()
2050 *oplock = rsp->OplockLevel; in smb2_parse_contexts()
2062 iov[num].iov_base = server->ops->create_lease_buf(lease_key, *oplock); in add_lease_context()
2064 return -ENOMEM; in add_lease_context()
2065 iov[num].iov_len = server->vals->create_lease_size; in add_lease_context()
2066 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_LEASE; in add_lease_context()
2067 if (!req->CreateContextsOffset) in add_lease_context()
2068 req->CreateContextsOffset = cpu_to_le32( in add_lease_context()
2070 iov[num - 1].iov_len); in add_lease_context()
2071 le32_add_cpu(&req->CreateContextsLength, in add_lease_context()
2072 server->vals->create_lease_size); in add_lease_context()
2080 struct cifs_fid *pfid = oparms->fid; in create_durable_v2_buf()
2087 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2089 buf->ccontext.DataLength = cpu_to_le32(sizeof(struct durable_context_v2)); in create_durable_v2_buf()
2090 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_durable_v2_buf()
2092 buf->ccontext.NameLength = cpu_to_le16(4); in create_durable_v2_buf()
2101 buf->dcontext.Timeout = cpu_to_le32(oparms->tcon->handle_timeout); in create_durable_v2_buf()
2102 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_durable_v2_buf()
2103 generate_random_uuid(buf->dcontext.CreateGuid); in create_durable_v2_buf()
2104 memcpy(pfid->create_guid, buf->dcontext.CreateGuid, 16); in create_durable_v2_buf()
2107 buf->Name[0] = 'D'; in create_durable_v2_buf()
2108 buf->Name[1] = 'H'; in create_durable_v2_buf()
2109 buf->Name[2] = '2'; in create_durable_v2_buf()
2110 buf->Name[3] = 'Q'; in create_durable_v2_buf()
2124 buf->ccontext.DataOffset = in create_reconnect_durable_v2_buf()
2127 buf->ccontext.DataLength = in create_reconnect_durable_v2_buf()
2129 buf->ccontext.NameOffset = in create_reconnect_durable_v2_buf()
2132 buf->ccontext.NameLength = cpu_to_le16(4); in create_reconnect_durable_v2_buf()
2134 buf->dcontext.Fid.PersistentFileId = fid->persistent_fid; in create_reconnect_durable_v2_buf()
2135 buf->dcontext.Fid.VolatileFileId = fid->volatile_fid; in create_reconnect_durable_v2_buf()
2136 buf->dcontext.Flags = cpu_to_le32(SMB2_DHANDLE_FLAG_PERSISTENT); in create_reconnect_durable_v2_buf()
2137 memcpy(buf->dcontext.CreateGuid, fid->create_guid, 16); in create_reconnect_durable_v2_buf()
2140 buf->Name[0] = 'D'; in create_reconnect_durable_v2_buf()
2141 buf->Name[1] = 'H'; in create_reconnect_durable_v2_buf()
2142 buf->Name[2] = '2'; in create_reconnect_durable_v2_buf()
2143 buf->Name[3] = 'C'; in create_reconnect_durable_v2_buf()
2156 return -ENOMEM; in add_durable_v2_context()
2158 if (!req->CreateContextsOffset) in add_durable_v2_context()
2159 req->CreateContextsOffset = in add_durable_v2_context()
2162 le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_durable_v2)); in add_durable_v2_context()
2175 oparms->reconnect = false; in add_durable_reconnect_v2_context()
2177 iov[num].iov_base = create_reconnect_durable_v2_buf(oparms->fid); in add_durable_reconnect_v2_context()
2179 return -ENOMEM; in add_durable_reconnect_v2_context()
2181 if (!req->CreateContextsOffset) in add_durable_reconnect_v2_context()
2182 req->CreateContextsOffset = in add_durable_reconnect_v2_context()
2185 le32_add_cpu(&req->CreateContextsLength, in add_durable_reconnect_v2_context()
2199 if (oparms->reconnect) in add_durable_context()
2206 if (oparms->reconnect) { in add_durable_context()
2207 iov[num].iov_base = create_reconnect_durable_buf(oparms->fid); in add_durable_context()
2209 oparms->reconnect = false; in add_durable_context()
2213 return -ENOMEM; in add_durable_context()
2215 if (!req->CreateContextsOffset) in add_durable_context()
2216 req->CreateContextsOffset = in add_durable_context()
2219 le32_add_cpu(&req->CreateContextsLength, sizeof(struct create_durable)); in add_durable_context()
2224 /* See MS-SMB2 2.2.13.2.7 */
2234 buf->ccontext.DataOffset = cpu_to_le16(offsetof in create_twarp_buf()
2236 buf->ccontext.DataLength = cpu_to_le32(8); in create_twarp_buf()
2237 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_twarp_buf()
2239 buf->ccontext.NameLength = cpu_to_le16(4); in create_twarp_buf()
2241 buf->Name[0] = 'T'; in create_twarp_buf()
2242 buf->Name[1] = 'W'; in create_twarp_buf()
2243 buf->Name[2] = 'r'; in create_twarp_buf()
2244 buf->Name[3] = 'p'; in create_twarp_buf()
2245 buf->Timestamp = cpu_to_le64(timewarp); in create_twarp_buf()
2249 /* See MS-SMB2 2.2.13.2.7 */
2258 return -ENOMEM; in add_twarp_context()
2260 if (!req->CreateContextsOffset) in add_twarp_context()
2261 req->CreateContextsOffset = cpu_to_le32( in add_twarp_context()
2263 iov[num - 1].iov_len); in add_twarp_context()
2264 le32_add_cpu(&req->CreateContextsLength, sizeof(struct crt_twarp_ctxt)); in add_twarp_context()
2269 /* See See http://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */
2274 /* Populate the user ownership fields S-1-5-88-1 */ in setup_owner_group_sids()
2275 sids->owner.Revision = 1; in setup_owner_group_sids()
2276 sids->owner.NumAuth = 3; in setup_owner_group_sids()
2277 sids->owner.Authority[5] = 5; in setup_owner_group_sids()
2278 sids->owner.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2279 sids->owner.SubAuthorities[1] = cpu_to_le32(1); in setup_owner_group_sids()
2280 sids->owner.SubAuthorities[2] = cpu_to_le32(current_fsuid().val); in setup_owner_group_sids()
2282 /* Populate the group ownership fields S-1-5-88-2 */ in setup_owner_group_sids()
2283 sids->group.Revision = 1; in setup_owner_group_sids()
2284 sids->group.NumAuth = 3; in setup_owner_group_sids()
2285 sids->group.Authority[5] = 5; in setup_owner_group_sids()
2286 sids->group.SubAuthorities[0] = cpu_to_le32(88); in setup_owner_group_sids()
2287 sids->group.SubAuthorities[1] = cpu_to_le32(2); in setup_owner_group_sids()
2288 sids->group.SubAuthorities[2] = cpu_to_le32(current_fsgid().val); in setup_owner_group_sids()
2290 …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()
2293 /* See MS-SMB2 2.2.13.2.2 and MS-DTYP 2.4.6 */
2318 owner_offset = ptr - (__u8 *)&buf->sd; in create_sd_buf()
2319 buf->sd.OffsetOwner = cpu_to_le32(owner_offset); in create_sd_buf()
2321 buf->sd.OffsetGroup = cpu_to_le32(group_offset); in create_sd_buf()
2326 buf->sd.OffsetOwner = 0; in create_sd_buf()
2327 buf->sd.OffsetGroup = 0; in create_sd_buf()
2330 buf->ccontext.DataOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, sd)); in create_sd_buf()
2331 buf->ccontext.NameOffset = cpu_to_le16(offsetof(struct crt_sd_ctxt, Name)); in create_sd_buf()
2332 buf->ccontext.NameLength = cpu_to_le16(4); in create_sd_buf()
2334 buf->Name[0] = 'S'; in create_sd_buf()
2335 buf->Name[1] = 'e'; in create_sd_buf()
2336 buf->Name[2] = 'c'; in create_sd_buf()
2337 buf->Name[3] = 'D'; in create_sd_buf()
2338 buf->sd.Revision = 1; /* Must be one see MS-DTYP 2.4.6 */ in create_sd_buf()
2344 buf->sd.Control = cpu_to_le16(ACL_CONTROL_SR | ACL_CONTROL_DP); in create_sd_buf()
2347 buf->sd.OffsetDacl = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2372 acl.AclRevision = ACL_REVISION; /* See 2.4.4.1 of MS-DTYP */ in create_sd_buf()
2378 buf->ccontext.DataLength = cpu_to_le32(ptr - (__u8 *)&buf->sd); in create_sd_buf()
2379 *len = roundup(ptr - (__u8 *)buf, 8); in create_sd_buf()
2393 return -ENOMEM; in add_sd_context()
2395 if (!req->CreateContextsOffset) in add_sd_context()
2396 req->CreateContextsOffset = cpu_to_le32( in add_sd_context()
2398 iov[num - 1].iov_len); in add_sd_context()
2399 le32_add_cpu(&req->CreateContextsLength, len); in add_sd_context()
2413 buf->ccontext.DataOffset = cpu_to_le16(0); in create_query_id_buf()
2414 buf->ccontext.DataLength = cpu_to_le32(0); in create_query_id_buf()
2415 buf->ccontext.NameOffset = cpu_to_le16(offsetof in create_query_id_buf()
2417 buf->ccontext.NameLength = cpu_to_le16(4); in create_query_id_buf()
2419 buf->Name[0] = 'Q'; in create_query_id_buf()
2420 buf->Name[1] = 'F'; in create_query_id_buf()
2421 buf->Name[2] = 'i'; in create_query_id_buf()
2422 buf->Name[3] = 'd'; in create_query_id_buf()
2426 /* See MS-SMB2 2.2.13.2.9 */
2435 return -ENOMEM; in add_query_id_context()
2437 if (!req->CreateContextsOffset) in add_query_id_context()
2438 req->CreateContextsOffset = cpu_to_le32( in add_query_id_context()
2440 iov[num - 1].iov_len); in add_query_id_context()
2441 le32_add_cpu(&req->CreateContextsLength, sizeof(struct crt_query_id_ctxt)); in add_query_id_context()
2459 return -EINVAL; in alloc_path_with_tree_prefix()
2462 treename_len -= 2; in alloc_path_with_tree_prefix()
2473 * final path needs to be null-terminated UTF16 with a in alloc_path_with_tree_prefix()
2480 return -ENOMEM; in alloc_path_with_tree_prefix()
2492 umode_t mode, struct cifs_tcon *tcon, in smb311_posix_mkdir() argument
2499 struct cifs_ses *ses = tcon->ses; in smb311_posix_mkdir()
2520 return -ENOMEM; in smb311_posix_mkdir()
2523 rc = -EIO; in smb311_posix_mkdir()
2528 rc = smb2_plain_req_init(SMB2_CREATE, tcon, server, in smb311_posix_mkdir()
2534 if (smb3_encryption_required(tcon)) in smb311_posix_mkdir()
2537 req->ImpersonationLevel = IL_IMPERSONATION; in smb311_posix_mkdir()
2538 req->DesiredAccess = cpu_to_le32(FILE_WRITE_ATTRIBUTES); in smb311_posix_mkdir()
2540 req->FileAttributes = cpu_to_le32(file_attributes); in smb311_posix_mkdir()
2541 req->ShareAccess = FILE_SHARE_ALL_LE; in smb311_posix_mkdir()
2542 req->CreateDisposition = cpu_to_le32(FILE_CREATE); in smb311_posix_mkdir()
2543 req->CreateOptions = cpu_to_le32(CREATE_NOT_FILE); in smb311_posix_mkdir()
2546 /* -1 since last byte is buf[0] which is sent below (path) */ in smb311_posix_mkdir()
2547 iov[0].iov_len = total_len - 1; in smb311_posix_mkdir()
2549 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in smb311_posix_mkdir()
2551 /* [MS-SMB2] 2.2.13 NameOffset: in smb311_posix_mkdir()
2559 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in smb311_posix_mkdir()
2562 req->sync_hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in smb311_posix_mkdir()
2565 tcon->treeName, utf16_path); in smb311_posix_mkdir()
2569 req->NameLength = cpu_to_le16(name_len * 2); in smb311_posix_mkdir()
2577 req->NameLength = cpu_to_le16(uni_path_len - 2); in smb311_posix_mkdir()
2582 rc = -ENOMEM; in smb311_posix_mkdir()
2596 req->RequestedOplockLevel = SMB2_OPLOCK_LEVEL_NONE; in smb311_posix_mkdir()
2598 if (tcon->posix_extensions) { in smb311_posix_mkdir()
2603 pc_buf = iov[n_iov-1].iov_base; in smb311_posix_mkdir()
2612 trace_smb3_posix_mkdir_enter(xid, tcon->tid, ses->Suid, CREATE_NOT_FILE, in smb311_posix_mkdir()
2618 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE); in smb311_posix_mkdir()
2619 trace_smb3_posix_mkdir_err(xid, tcon->tid, ses->Suid, in smb311_posix_mkdir()
2626 trace_smb3_posix_mkdir_done(xid, rsp->PersistentFileId, tcon->tid, in smb311_posix_mkdir()
2627 ses->Suid, CREATE_NOT_FILE, in smb311_posix_mkdir()
2630 SMB2_close(xid, tcon, rsp->PersistentFileId, rsp->VolatileFileId); in smb311_posix_mkdir()
2645 SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_open_init() argument
2655 struct kvec *iov = rqst->rq_iov; in SMB2_open_init()
2659 rc = smb2_plain_req_init(SMB2_CREATE, tcon, server, in SMB2_open_init()
2665 /* -1 since last byte is buf[0] which is sent below (path) */ in SMB2_open_init()
2666 iov[0].iov_len = total_len - 1; in SMB2_open_init()
2668 if (oparms->create_options & CREATE_OPTION_READONLY) in SMB2_open_init()
2670 if (oparms->create_options & CREATE_OPTION_SPECIAL) in SMB2_open_init()
2673 req->ImpersonationLevel = IL_IMPERSONATION; in SMB2_open_init()
2674 req->DesiredAccess = cpu_to_le32(oparms->desired_access); in SMB2_open_init()
2676 req->FileAttributes = cpu_to_le32(file_attributes); in SMB2_open_init()
2677 req->ShareAccess = FILE_SHARE_ALL_LE; in SMB2_open_init()
2679 req->CreateDisposition = cpu_to_le32(oparms->disposition); in SMB2_open_init()
2680 req->CreateOptions = cpu_to_le32(oparms->create_options & CREATE_OPTIONS_MASK); in SMB2_open_init()
2681 req->NameOffset = cpu_to_le16(sizeof(struct smb2_create_req)); in SMB2_open_init()
2683 /* [MS-SMB2] 2.2.13 NameOffset: in SMB2_open_init()
2691 if (tcon->share_flags & SHI1005_FLAGS_DFS) { in SMB2_open_init()
2694 req->sync_hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS; in SMB2_open_init()
2697 tcon->treeName, path); in SMB2_open_init()
2700 req->NameLength = cpu_to_le16(name_len * 2); in SMB2_open_init()
2706 req->NameLength = cpu_to_le16(uni_path_len - 2); in SMB2_open_init()
2712 return -ENOMEM; in SMB2_open_init()
2722 if ((!server->oplocks) || (tcon->no_lease)) in SMB2_open_init()
2725 if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) || in SMB2_open_init()
2727 req->RequestedOplockLevel = *oplock; in SMB2_open_init()
2728 else if (!(server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING) && in SMB2_open_init()
2729 (oparms->create_options & CREATE_NOT_FILE)) in SMB2_open_init()
2730 req->RequestedOplockLevel = *oplock; /* no srv lease support */ in SMB2_open_init()
2733 oparms->fid->lease_key, oplock); in SMB2_open_init()
2740 if (server->capabilities & SMB2_GLOBAL_CAP_LEASING) { in SMB2_open_init()
2742 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2743 ccontext->Next = in SMB2_open_init()
2744 cpu_to_le32(server->vals->create_lease_size); in SMB2_open_init()
2748 tcon->use_persistent); in SMB2_open_init()
2753 if (tcon->posix_extensions) { in SMB2_open_init()
2756 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2757 ccontext->Next = in SMB2_open_init()
2758 cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2761 rc = add_posix_context(iov, &n_iov, oparms->mode); in SMB2_open_init()
2766 if (tcon->snapshot_time) { in SMB2_open_init()
2770 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2771 ccontext->Next = in SMB2_open_init()
2772 cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2775 rc = add_twarp_context(iov, &n_iov, tcon->snapshot_time); in SMB2_open_init()
2780 if ((oparms->disposition != FILE_OPEN) && (oparms->cifs_sb)) { in SMB2_open_init()
2784 if ((oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MODE_FROM_SID) && in SMB2_open_init()
2785 (oparms->mode != ACL_NO_MODE)) in SMB2_open_init()
2789 oparms->mode = ACL_NO_MODE; in SMB2_open_init()
2792 if (oparms->cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UID_FROM_ACL) in SMB2_open_init()
2800 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2801 ccontext->Next = cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2804 cifs_dbg(FYI, "add sd with mode 0x%x\n", oparms->mode); in SMB2_open_init()
2805 rc = add_sd_context(iov, &n_iov, oparms->mode, set_owner); in SMB2_open_init()
2813 (struct create_context *)iov[n_iov-1].iov_base; in SMB2_open_init()
2814 ccontext->Next = cpu_to_le32(iov[n_iov-1].iov_len); in SMB2_open_init()
2818 rqst->rq_nvec = n_iov; in SMB2_open_init()
2830 if (rqst && rqst->rq_iov) { in SMB2_open_free()
2831 cifs_small_buf_release(rqst->rq_iov[0].iov_base); in SMB2_open_free()
2832 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_open_free()
2833 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_open_free()
2834 kfree(rqst->rq_iov[i].iov_base); in SMB2_open_free()
2846 struct cifs_tcon *tcon = oparms->tcon; in SMB2_open() local
2847 struct cifs_ses *ses = tcon->ses; in SMB2_open()
2857 return -EIO; in SMB2_open()
2859 if (smb3_encryption_required(tcon)) in SMB2_open()
2867 rc = SMB2_open_init(tcon, server, in SMB2_open()
2872 trace_smb3_open_enter(xid, tcon->tid, tcon->ses->Suid, in SMB2_open()
2873 oparms->create_options, oparms->desired_access); in SMB2_open()
2881 cifs_stats_fail_inc(tcon, SMB2_CREATE_HE); in SMB2_open()
2888 trace_smb3_open_err(xid, tcon->tid, ses->Suid, in SMB2_open()
2889 oparms->create_options, oparms->desired_access, rc); in SMB2_open()
2890 if (rc == -EREMCHG) { in SMB2_open()
2892 tcon->treeName); in SMB2_open()
2893 tcon->need_reconnect = true; in SMB2_open()
2897 trace_smb3_open_done(xid, rsp->PersistentFileId, tcon->tid, in SMB2_open()
2898 ses->Suid, oparms->create_options, in SMB2_open()
2899 oparms->desired_access); in SMB2_open()
2901 atomic_inc(&tcon->num_remote_opens); in SMB2_open()
2902 oparms->fid->persistent_fid = rsp->PersistentFileId; in SMB2_open()
2903 oparms->fid->volatile_fid = rsp->VolatileFileId; in SMB2_open()
2904 oparms->fid->access = oparms->desired_access; in SMB2_open()
2906 oparms->fid->mid = le64_to_cpu(rsp->sync_hdr.MessageId); in SMB2_open()
2910 memcpy(buf, &rsp->CreationTime, 32); in SMB2_open()
2911 buf->AllocationSize = rsp->AllocationSize; in SMB2_open()
2912 buf->EndOfFile = rsp->EndofFile; in SMB2_open()
2913 buf->Attributes = rsp->FileAttributes; in SMB2_open()
2914 buf->NumberOfLinks = cpu_to_le32(1); in SMB2_open()
2915 buf->DeletePending = 0; in SMB2_open()
2919 smb2_parse_contexts(server, rsp, &oparms->fid->epoch, in SMB2_open()
2920 oparms->fid->lease_key, oplock, buf, posix); in SMB2_open()
2928 SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_ioctl_init() argument
2935 struct kvec *iov = rqst->rq_iov; in SMB2_ioctl_init()
2940 rc = smb2_ioctl_req_init(opcode, tcon, server, in SMB2_ioctl_init()
2953 return -ENOMEM; in SMB2_ioctl_init()
2957 req->CtlCode = cpu_to_le32(opcode); in SMB2_ioctl_init()
2958 req->PersistentFileId = persistent_fid; in SMB2_ioctl_init()
2959 req->VolatileFileId = volatile_fid; in SMB2_ioctl_init()
2971 req->InputCount = cpu_to_le32(indatalen); in SMB2_ioctl_init()
2973 req->InputOffset = in SMB2_ioctl_init()
2975 rqst->rq_nvec = 2; in SMB2_ioctl_init()
2976 iov[0].iov_len = total_len - 1; in SMB2_ioctl_init()
2980 rqst->rq_nvec = 1; in SMB2_ioctl_init()
2984 req->OutputOffset = 0; in SMB2_ioctl_init()
2985 req->OutputCount = 0; /* MBZ */ in SMB2_ioctl_init()
3002 req->MaxOutputResponse = cpu_to_le32(max_response_size); in SMB2_ioctl_init()
3003 req->sync_hdr.CreditCharge = in SMB2_ioctl_init()
3007 req->Flags = cpu_to_le32(SMB2_0_IOCTL_IS_FSCTL); in SMB2_ioctl_init()
3009 /* validate negotiate request must be signed - see MS-SMB2 3.2.5.5 */ in SMB2_ioctl_init()
3011 req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED; in SMB2_ioctl_init()
3020 if (rqst && rqst->rq_iov) { in SMB2_ioctl_free()
3021 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_ioctl_free()
3022 for (i = 1; i < rqst->rq_nvec; i++) in SMB2_ioctl_free()
3023 if (rqst->rq_iov[i].iov_base != smb2_padding) in SMB2_ioctl_free()
3024 kfree(rqst->rq_iov[i].iov_base); in SMB2_ioctl_free()
3033 SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_ioctl() argument
3057 if (!tcon) in SMB2_ioctl()
3058 return -EIO; in SMB2_ioctl()
3060 ses = tcon->ses; in SMB2_ioctl()
3062 return -EIO; in SMB2_ioctl()
3066 return -EIO; in SMB2_ioctl()
3068 if (smb3_encryption_required(tcon)) in SMB2_ioctl()
3076 rc = SMB2_ioctl_init(tcon, server, in SMB2_ioctl()
3088 trace_smb3_fsctl_err(xid, persistent_fid, tcon->tid, in SMB2_ioctl()
3089 ses->Suid, 0, opcode, rc); in SMB2_ioctl()
3091 if ((rc != 0) && (rc != -EINVAL) && (rc != -E2BIG)) { in SMB2_ioctl()
3092 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3094 } else if (rc == -EINVAL) { in SMB2_ioctl()
3097 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3100 } else if (rc == -E2BIG) { in SMB2_ioctl()
3102 cifs_stats_fail_inc(tcon, SMB2_IOCTL_HE); in SMB2_ioctl()
3111 *plen = le32_to_cpu(rsp->OutputCount); in SMB2_ioctl()
3119 rc = -EIO; in SMB2_ioctl()
3123 if (rsp_iov.iov_len - *plen < le32_to_cpu(rsp->OutputOffset)) { in SMB2_ioctl()
3125 le32_to_cpu(rsp->OutputOffset)); in SMB2_ioctl()
3127 rc = -EIO; in SMB2_ioctl()
3131 *out_data = kmemdup((char *)rsp + le32_to_cpu(rsp->OutputOffset), in SMB2_ioctl()
3134 rc = -ENOMEM; in SMB2_ioctl()
3149 SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_compression() argument
3159 rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_compression()
3171 SMB2_close_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_close_init() argument
3176 struct kvec *iov = rqst->rq_iov; in SMB2_close_init()
3180 rc = smb2_plain_req_init(SMB2_CLOSE, tcon, server, in SMB2_close_init()
3185 req->PersistentFileId = persistent_fid; in SMB2_close_init()
3186 req->VolatileFileId = volatile_fid; in SMB2_close_init()
3188 req->Flags = SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB; in SMB2_close_init()
3190 req->Flags = 0; in SMB2_close_init()
3200 if (rqst && rqst->rq_iov) in SMB2_close_free()
3201 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_close_free()
3205 __SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, in __SMB2_close() argument
3211 struct cifs_ses *ses = tcon->ses; in __SMB2_close()
3223 return -EIO; in __SMB2_close()
3225 if (smb3_encryption_required(tcon)) in __SMB2_close()
3237 trace_smb3_close_enter(xid, persistent_fid, tcon->tid, ses->Suid); in __SMB2_close()
3238 rc = SMB2_close_init(tcon, server, in __SMB2_close()
3249 cifs_stats_fail_inc(tcon, SMB2_CLOSE_HE); in __SMB2_close()
3250 trace_smb3_close_err(xid, persistent_fid, tcon->tid, ses->Suid, in __SMB2_close()
3254 trace_smb3_close_done(xid, persistent_fid, tcon->tid, in __SMB2_close()
3255 ses->Suid); in __SMB2_close()
3261 memcpy(pbuf, (char *)&rsp->CreationTime, sizeof(*pbuf) - 4); in __SMB2_close()
3264 atomic_dec(&tcon->num_remote_opens); in __SMB2_close()
3273 tmp_rc = smb2_handle_cancelled_close(tcon, persistent_fid, in __SMB2_close()
3283 SMB2_close(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_close() argument
3286 return __SMB2_close(xid, tcon, persistent_fid, volatile_fid, NULL); in SMB2_close()
3293 unsigned int smb_len = iov->iov_len; in smb2_validate_iov()
3294 char *end_of_smb = smb_len + (char *)iov->iov_base; in smb2_validate_iov()
3295 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_iov()
3302 return -EINVAL; in smb2_validate_iov()
3309 return -EINVAL; in smb2_validate_iov()
3314 return -EINVAL; in smb2_validate_iov()
3329 char *begin_of_buf = offset + (char *)iov->iov_base; in smb2_validate_and_copy_iov()
3333 return -EINVAL; in smb2_validate_and_copy_iov()
3345 SMB2_query_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_query_info_init() argument
3352 struct kvec *iov = rqst->rq_iov; in SMB2_query_info_init()
3359 return -EINVAL; in SMB2_query_info_init()
3361 rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server, in SMB2_query_info_init()
3366 req->InfoType = info_type; in SMB2_query_info_init()
3367 req->FileInfoClass = info_class; in SMB2_query_info_init()
3368 req->PersistentFileId = persistent_fid; in SMB2_query_info_init()
3369 req->VolatileFileId = volatile_fid; in SMB2_query_info_init()
3370 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_query_info_init()
3372 req->OutputBufferLength = cpu_to_le32(output_len); in SMB2_query_info_init()
3374 req->InputBufferLength = cpu_to_le32(input_len); in SMB2_query_info_init()
3376 req->InputBufferOffset = cpu_to_le16(total_len - 1); in SMB2_query_info_init()
3377 memcpy(req->Buffer, input, input_len); in SMB2_query_info_init()
3389 if (rqst && rqst->rq_iov) in SMB2_query_info_free()
3390 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_info_free()
3394 query_info(const unsigned int xid, struct cifs_tcon *tcon, in query_info() argument
3405 struct cifs_ses *ses = tcon->ses; in query_info()
3413 return -EIO; in query_info()
3416 return -EIO; in query_info()
3418 if (smb3_encryption_required(tcon)) in query_info()
3426 rc = SMB2_query_info_init(tcon, server, in query_info()
3433 trace_smb3_query_info_enter(xid, persistent_fid, tcon->tid, in query_info()
3434 ses->Suid, info_class, (__u32)info_type); in query_info()
3441 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in query_info()
3442 trace_smb3_query_info_err(xid, persistent_fid, tcon->tid, in query_info()
3443 ses->Suid, info_class, (__u32)info_type, rc); in query_info()
3447 trace_smb3_query_info_done(xid, persistent_fid, tcon->tid, in query_info()
3448 ses->Suid, info_class, (__u32)info_type); in query_info()
3451 *dlen = le32_to_cpu(rsp->OutputBufferLength); in query_info()
3459 rc = -ENOMEM; in query_info()
3466 rc = smb2_validate_and_copy_iov(le16_to_cpu(rsp->OutputBufferOffset), in query_info()
3467 le32_to_cpu(rsp->OutputBufferLength), in query_info()
3481 int SMB2_query_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_info() argument
3484 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_query_info()
3492 SMB311_posix_query_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB311_posix_query_info() argument
3499 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB311_posix_query_info()
3505 SMB2_query_acl(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_acl() argument
3512 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_query_acl()
3518 SMB2_get_srv_num(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_get_srv_num() argument
3521 return query_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_get_srv_num()
3530 * See MS-SMB2 2.2.35 and 2.2.36
3535 struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_notify_init() argument
3540 struct kvec *iov = rqst->rq_iov; in SMB2_notify_init()
3544 rc = smb2_plain_req_init(SMB2_CHANGE_NOTIFY, tcon, server, in SMB2_notify_init()
3549 req->PersistentFileId = persistent_fid; in SMB2_notify_init()
3550 req->VolatileFileId = volatile_fid; in SMB2_notify_init()
3551 /* See note 354 of MS-SMB2, 64K max */ in SMB2_notify_init()
3552 req->OutputBufferLength = in SMB2_notify_init()
3553 cpu_to_le32(SMB2_MAX_BUFFER_SIZE - MAX_SMB2_HDR_SIZE); in SMB2_notify_init()
3554 req->CompletionFilter = cpu_to_le32(completion_filter); in SMB2_notify_init()
3556 req->Flags = cpu_to_le16(SMB2_WATCH_TREE); in SMB2_notify_init()
3558 req->Flags = 0; in SMB2_notify_init()
3567 SMB2_change_notify(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_change_notify() argument
3571 struct cifs_ses *ses = tcon->ses; in SMB2_change_notify()
3582 return -EIO; in SMB2_change_notify()
3584 if (smb3_encryption_required(tcon)) in SMB2_change_notify()
3592 rc = SMB2_notify_init(xid, &rqst, tcon, server, in SMB2_change_notify()
3598 trace_smb3_notify_enter(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
3604 cifs_stats_fail_inc(tcon, SMB2_CHANGE_NOTIFY_HE); in SMB2_change_notify()
3605 trace_smb3_notify_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_change_notify()
3608 trace_smb3_notify_done(xid, persistent_fid, tcon->tid, in SMB2_change_notify()
3609 ses->Suid, (u8)watch_tree, completion_filter); in SMB2_change_notify()
3621 * This is a no-op for now. We're not really interested in the reply, but
3622 * rather in the fact that the server sent one and that server->lstrp
3630 struct TCP_Server_Info *server = mid->callback_data; in smb2_echo_callback()
3631 struct smb2_echo_rsp *rsp = (struct smb2_echo_rsp *)mid->resp_buf; in smb2_echo_callback()
3634 if (mid->mid_state == MID_RESPONSE_RECEIVED in smb2_echo_callback()
3635 || mid->mid_state == MID_RESPONSE_MALFORMED) { in smb2_echo_callback()
3636 credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest); in smb2_echo_callback()
3637 credits.instance = server->reconnect_instance; in smb2_echo_callback()
3649 struct cifs_tcon *tcon, *tcon2; in smb2_reconnect_server() local
3656 /* Prevent simultaneous reconnects that can corrupt tcon->rlist list */ in smb2_reconnect_server()
3657 mutex_lock(&server->reconnect_mutex); in smb2_reconnect_server()
3663 list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) { in smb2_reconnect_server()
3664 list_for_each_entry(tcon, &ses->tcon_list, tcon_list) { in smb2_reconnect_server()
3665 if (tcon->need_reconnect || tcon->need_reopen_files) { in smb2_reconnect_server()
3666 tcon->tc_count++; in smb2_reconnect_server()
3667 list_add_tail(&tcon->rlist, &tmp_list); in smb2_reconnect_server()
3675 if (ses->tcon_ipc && ses->tcon_ipc->need_reconnect) { in smb2_reconnect_server()
3676 list_add_tail(&ses->tcon_ipc->rlist, &tmp_list); in smb2_reconnect_server()
3678 ses->ses_count++; in smb2_reconnect_server()
3686 server->srv_count++; in smb2_reconnect_server()
3690 list_for_each_entry_safe(tcon, tcon2, &tmp_list, rlist) { in smb2_reconnect_server()
3691 rc = smb2_reconnect(SMB2_INTERNAL_CMD, tcon, server); in smb2_reconnect_server()
3693 cifs_reopen_persistent_handles(tcon); in smb2_reconnect_server()
3696 list_del_init(&tcon->rlist); in smb2_reconnect_server()
3697 if (tcon->ipc) in smb2_reconnect_server()
3698 cifs_put_smb_ses(tcon->ses); in smb2_reconnect_server()
3700 cifs_put_tcon(tcon); in smb2_reconnect_server()
3705 queue_delayed_work(cifsiod_wq, &server->reconnect, 2 * HZ); in smb2_reconnect_server()
3706 mutex_unlock(&server->reconnect_mutex); in smb2_reconnect_server()
3725 if (server->tcpStatus == CifsNeedNegotiate) { in SMB2_echo()
3727 mod_delayed_work(cifsiod_wq, &server->reconnect, 0); in SMB2_echo()
3736 req->sync_hdr.CreditRequest = cpu_to_le16(1); in SMB2_echo()
3753 if (rqst && rqst->rq_iov) in SMB2_flush_free()
3754 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_flush_free()
3759 struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_flush_init() argument
3763 struct kvec *iov = rqst->rq_iov; in SMB2_flush_init()
3767 rc = smb2_plain_req_init(SMB2_FLUSH, tcon, server, in SMB2_flush_init()
3772 req->PersistentFileId = persistent_fid; in SMB2_flush_init()
3773 req->VolatileFileId = volatile_fid; in SMB2_flush_init()
3782 SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_flush() argument
3785 struct cifs_ses *ses = tcon->ses; in SMB2_flush()
3795 if (!ses || !(ses->server)) in SMB2_flush()
3796 return -EIO; in SMB2_flush()
3798 if (smb3_encryption_required(tcon)) in SMB2_flush()
3806 rc = SMB2_flush_init(xid, &rqst, tcon, server, in SMB2_flush()
3811 trace_smb3_flush_enter(xid, persistent_fid, tcon->tid, ses->Suid); in SMB2_flush()
3816 cifs_stats_fail_inc(tcon, SMB2_FLUSH_HE); in SMB2_flush()
3817 trace_smb3_flush_err(xid, persistent_fid, tcon->tid, ses->Suid, in SMB2_flush()
3820 trace_smb3_flush_done(xid, persistent_fid, tcon->tid, in SMB2_flush()
3821 ses->Suid); in SMB2_flush()
3838 int rc = -EACCES; in smb2_new_read_req()
3841 struct TCP_Server_Info *server = io_parms->server; in smb2_new_read_req()
3843 rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server, in smb2_new_read_req()
3849 return -ECONNABORTED; in smb2_new_read_req()
3851 shdr = &req->sync_hdr; in smb2_new_read_req()
3852 shdr->ProcessId = cpu_to_le32(io_parms->pid); in smb2_new_read_req()
3854 req->PersistentFileId = io_parms->persistent_fid; in smb2_new_read_req()
3855 req->VolatileFileId = io_parms->volatile_fid; in smb2_new_read_req()
3856 req->ReadChannelInfoOffset = 0; /* reserved */ in smb2_new_read_req()
3857 req->ReadChannelInfoLength = 0; /* reserved */ in smb2_new_read_req()
3858 req->Channel = 0; /* reserved */ in smb2_new_read_req()
3859 req->MinimumCount = 0; in smb2_new_read_req()
3860 req->Length = cpu_to_le32(io_parms->length); in smb2_new_read_req()
3861 req->Offset = cpu_to_le64(io_parms->offset); in smb2_new_read_req()
3864 io_parms->persistent_fid, in smb2_new_read_req()
3865 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in smb2_new_read_req()
3866 io_parms->offset, io_parms->length); in smb2_new_read_req()
3872 if (server->rdma && rdata && !server->sign && in smb2_new_read_req()
3873 rdata->bytes >= server->smbd_conn->rdma_readwrite_threshold) { in smb2_new_read_req()
3876 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_new_read_req()
3878 rdata->mr = smbd_register_mr( in smb2_new_read_req()
3879 server->smbd_conn, rdata->pages, in smb2_new_read_req()
3880 rdata->nr_pages, rdata->page_offset, in smb2_new_read_req()
3881 rdata->tailsz, true, need_invalidate); in smb2_new_read_req()
3882 if (!rdata->mr) in smb2_new_read_req()
3883 return -EAGAIN; in smb2_new_read_req()
3885 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_new_read_req()
3887 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_new_read_req()
3888 req->ReadChannelInfoOffset = in smb2_new_read_req()
3890 req->ReadChannelInfoLength = in smb2_new_read_req()
3892 v1 = (struct smbd_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_new_read_req()
3893 v1->offset = cpu_to_le64(rdata->mr->mr->iova); in smb2_new_read_req()
3894 v1->token = cpu_to_le32(rdata->mr->mr->rkey); in smb2_new_read_req()
3895 v1->length = cpu_to_le32(rdata->mr->mr->length); in smb2_new_read_req()
3897 *total_len += sizeof(*v1) - 1; in smb2_new_read_req()
3902 /* next 8-byte aligned request */ in smb2_new_read_req()
3904 shdr->NextCommand = cpu_to_le32(*total_len); in smb2_new_read_req()
3906 shdr->NextCommand = 0; in smb2_new_read_req()
3908 shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; in smb2_new_read_req()
3913 shdr->SessionId = 0xFFFFFFFFFFFFFFFF; in smb2_new_read_req()
3914 shdr->TreeId = 0xFFFFFFFF; in smb2_new_read_req()
3915 req->PersistentFileId = 0xFFFFFFFFFFFFFFFF; in smb2_new_read_req()
3916 req->VolatileFileId = 0xFFFFFFFFFFFFFFFF; in smb2_new_read_req()
3919 if (remaining_bytes > io_parms->length) in smb2_new_read_req()
3920 req->RemainingBytes = cpu_to_le32(remaining_bytes); in smb2_new_read_req()
3922 req->RemainingBytes = 0; in smb2_new_read_req()
3931 struct cifs_readdata *rdata = mid->callback_data; in smb2_readv_callback()
3932 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in smb2_readv_callback() local
3933 struct TCP_Server_Info *server = rdata->server; in smb2_readv_callback()
3935 (struct smb2_sync_hdr *)rdata->iov[0].iov_base; in smb2_readv_callback()
3937 struct smb_rqst rqst = { .rq_iov = &rdata->iov[1], in smb2_readv_callback()
3940 if (rdata->got_bytes) { in smb2_readv_callback()
3941 rqst.rq_pages = rdata->pages; in smb2_readv_callback()
3942 rqst.rq_offset = rdata->page_offset; in smb2_readv_callback()
3943 rqst.rq_npages = rdata->nr_pages; in smb2_readv_callback()
3944 rqst.rq_pagesz = rdata->pagesz; in smb2_readv_callback()
3945 rqst.rq_tailsz = rdata->tailsz; in smb2_readv_callback()
3948 WARN_ONCE(rdata->server != mid->server, in smb2_readv_callback()
3950 rdata->server, mid->server); in smb2_readv_callback()
3953 __func__, mid->mid, mid->mid_state, rdata->result, in smb2_readv_callback()
3954 rdata->bytes); in smb2_readv_callback()
3956 switch (mid->mid_state) { in smb2_readv_callback()
3958 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
3959 credits.instance = server->reconnect_instance; in smb2_readv_callback()
3961 if (server->sign && !mid->decrypted) { in smb2_readv_callback()
3970 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
3971 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
3975 rdata->result = -EAGAIN; in smb2_readv_callback()
3976 if (server->sign && rdata->got_bytes) in smb2_readv_callback()
3978 rdata->got_bytes = 0; in smb2_readv_callback()
3980 task_io_account_read(rdata->got_bytes); in smb2_readv_callback()
3981 cifs_stats_bytes_read(tcon, rdata->got_bytes); in smb2_readv_callback()
3984 credits.value = le16_to_cpu(shdr->CreditRequest); in smb2_readv_callback()
3985 credits.instance = server->reconnect_instance; in smb2_readv_callback()
3988 rdata->result = -EIO; in smb2_readv_callback()
3996 if (rdata->mr) { in smb2_readv_callback()
3997 smbd_deregister_mr(rdata->mr); in smb2_readv_callback()
3998 rdata->mr = NULL; in smb2_readv_callback()
4001 if (rdata->result && rdata->result != -ENODATA) { in smb2_readv_callback()
4002 cifs_stats_fail_inc(tcon, SMB2_READ_HE); in smb2_readv_callback()
4004 rdata->cfile->fid.persistent_fid, in smb2_readv_callback()
4005 tcon->tid, tcon->ses->Suid, rdata->offset, in smb2_readv_callback()
4006 rdata->bytes, rdata->result); in smb2_readv_callback()
4009 rdata->cfile->fid.persistent_fid, in smb2_readv_callback()
4010 tcon->tid, tcon->ses->Suid, in smb2_readv_callback()
4011 rdata->offset, rdata->got_bytes); in smb2_readv_callback()
4013 queue_work(cifsiod_wq, &rdata->work); in smb2_readv_callback()
4018 /* smb2_async_readv - send an async read, and set up mid to handle result */
4026 struct smb_rqst rqst = { .rq_iov = rdata->iov, in smb2_async_readv()
4029 struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink); in smb2_async_readv() local
4033 __func__, rdata->offset, rdata->bytes); in smb2_async_readv()
4035 if (!rdata->server) in smb2_async_readv()
4036 rdata->server = cifs_pick_channel(tcon->ses); in smb2_async_readv()
4038 io_parms.tcon = tlink_tcon(rdata->cfile->tlink); in smb2_async_readv()
4039 io_parms.server = server = rdata->server; in smb2_async_readv()
4040 io_parms.offset = rdata->offset; in smb2_async_readv()
4041 io_parms.length = rdata->bytes; in smb2_async_readv()
4042 io_parms.persistent_fid = rdata->cfile->fid.persistent_fid; in smb2_async_readv()
4043 io_parms.volatile_fid = rdata->cfile->fid.volatile_fid; in smb2_async_readv()
4044 io_parms.pid = rdata->pid; in smb2_async_readv()
4051 if (smb3_encryption_required(io_parms.tcon)) in smb2_async_readv()
4054 rdata->iov[0].iov_base = buf; in smb2_async_readv()
4055 rdata->iov[0].iov_len = total_len; in smb2_async_readv()
4059 if (rdata->credits.value > 0) { in smb2_async_readv()
4060 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes, in smb2_async_readv()
4062 shdr->CreditRequest = cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 8); in smb2_async_readv()
4064 rc = adjust_credits(server, &rdata->credits, rdata->bytes); in smb2_async_readv()
4071 kref_get(&rdata->refcount); in smb2_async_readv()
4075 &rdata->credits); in smb2_async_readv()
4077 kref_put(&rdata->refcount, cifs_readdata_release); in smb2_async_readv()
4078 cifs_stats_fail_inc(io_parms.tcon, SMB2_READ_HE); in smb2_async_readv()
4080 io_parms.tcon->tid, in smb2_async_readv()
4081 io_parms.tcon->ses->Suid, in smb2_async_readv()
4102 struct cifs_ses *ses = io_parms->tcon->ses; in SMB2_read()
4104 if (!io_parms->server) in SMB2_read()
4105 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_read()
4112 if (smb3_encryption_required(io_parms->tcon)) in SMB2_read()
4122 rc = cifs_send_recv(xid, ses, io_parms->server, in SMB2_read()
4127 if (rc != -ENODATA) { in SMB2_read()
4128 cifs_stats_fail_inc(io_parms->tcon, SMB2_READ_HE); in SMB2_read()
4130 trace_smb3_read_err(xid, req->PersistentFileId, in SMB2_read()
4131 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4132 io_parms->offset, io_parms->length, in SMB2_read()
4135 trace_smb3_read_done(xid, req->PersistentFileId, in SMB2_read()
4136 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4137 io_parms->offset, 0); in SMB2_read()
4140 return rc == -ENODATA ? 0 : rc; in SMB2_read()
4142 trace_smb3_read_done(xid, req->PersistentFileId, in SMB2_read()
4143 io_parms->tcon->tid, ses->Suid, in SMB2_read()
4144 io_parms->offset, io_parms->length); in SMB2_read()
4148 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_read()
4150 (*nbytes > io_parms->length)) { in SMB2_read()
4152 *nbytes, io_parms->length); in SMB2_read()
4153 rc = -EIO; in SMB2_read()
4158 memcpy(*buf, (char *)rsp + rsp->DataOffset, *nbytes); in SMB2_read()
4177 struct cifs_writedata *wdata = mid->callback_data; in smb2_writev_callback()
4178 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in smb2_writev_callback() local
4179 struct TCP_Server_Info *server = wdata->server; in smb2_writev_callback()
4181 struct smb2_write_rsp *rsp = (struct smb2_write_rsp *)mid->resp_buf; in smb2_writev_callback()
4184 WARN_ONCE(wdata->server != mid->server, in smb2_writev_callback()
4186 wdata->server, mid->server); in smb2_writev_callback()
4188 switch (mid->mid_state) { in smb2_writev_callback()
4190 credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest); in smb2_writev_callback()
4191 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4192 wdata->result = smb2_check_receive(mid, server, 0); in smb2_writev_callback()
4193 if (wdata->result != 0) in smb2_writev_callback()
4196 written = le32_to_cpu(rsp->DataLength); in smb2_writev_callback()
4203 if (written > wdata->bytes) in smb2_writev_callback()
4206 if (written < wdata->bytes) in smb2_writev_callback()
4207 wdata->result = -ENOSPC; in smb2_writev_callback()
4209 wdata->bytes = written; in smb2_writev_callback()
4213 wdata->result = -EAGAIN; in smb2_writev_callback()
4216 credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest); in smb2_writev_callback()
4217 credits.instance = server->reconnect_instance; in smb2_writev_callback()
4220 wdata->result = -EIO; in smb2_writev_callback()
4231 if (wdata->mr) { in smb2_writev_callback()
4232 smbd_deregister_mr(wdata->mr); in smb2_writev_callback()
4233 wdata->mr = NULL; in smb2_writev_callback()
4236 if (wdata->result) { in smb2_writev_callback()
4237 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); in smb2_writev_callback()
4239 wdata->cfile->fid.persistent_fid, in smb2_writev_callback()
4240 tcon->tid, tcon->ses->Suid, wdata->offset, in smb2_writev_callback()
4241 wdata->bytes, wdata->result); in smb2_writev_callback()
4242 if (wdata->result == -ENOSPC) in smb2_writev_callback()
4244 tcon->treeName); in smb2_writev_callback()
4247 wdata->cfile->fid.persistent_fid, in smb2_writev_callback()
4248 tcon->tid, tcon->ses->Suid, in smb2_writev_callback()
4249 wdata->offset, wdata->bytes); in smb2_writev_callback()
4251 queue_work(cifsiod_wq, &wdata->work); in smb2_writev_callback()
4256 /* smb2_async_writev - send an async write, and set up mid to handle result */
4261 int rc = -EACCES, flags = 0; in smb2_async_writev()
4264 struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink); in smb2_async_writev() local
4265 struct TCP_Server_Info *server = wdata->server; in smb2_async_writev()
4270 if (!wdata->server) in smb2_async_writev()
4271 server = wdata->server = cifs_pick_channel(tcon->ses); in smb2_async_writev()
4273 rc = smb2_plain_req_init(SMB2_WRITE, tcon, server, in smb2_async_writev()
4278 if (smb3_encryption_required(tcon)) in smb2_async_writev()
4282 shdr->ProcessId = cpu_to_le32(wdata->cfile->pid); in smb2_async_writev()
4284 req->PersistentFileId = wdata->cfile->fid.persistent_fid; in smb2_async_writev()
4285 req->VolatileFileId = wdata->cfile->fid.volatile_fid; in smb2_async_writev()
4286 req->WriteChannelInfoOffset = 0; in smb2_async_writev()
4287 req->WriteChannelInfoLength = 0; in smb2_async_writev()
4288 req->Channel = 0; in smb2_async_writev()
4289 req->Offset = cpu_to_le64(wdata->offset); in smb2_async_writev()
4290 req->DataOffset = cpu_to_le16( in smb2_async_writev()
4292 req->RemainingBytes = 0; in smb2_async_writev()
4294 trace_smb3_write_enter(0 /* xid */, wdata->cfile->fid.persistent_fid, in smb2_async_writev()
4295 tcon->tid, tcon->ses->Suid, wdata->offset, wdata->bytes); in smb2_async_writev()
4301 if (server->rdma && !server->sign && wdata->bytes >= in smb2_async_writev()
4302 server->smbd_conn->rdma_readwrite_threshold) { in smb2_async_writev()
4305 bool need_invalidate = server->dialect == SMB30_PROT_ID; in smb2_async_writev()
4307 wdata->mr = smbd_register_mr( in smb2_async_writev()
4308 server->smbd_conn, wdata->pages, in smb2_async_writev()
4309 wdata->nr_pages, wdata->page_offset, in smb2_async_writev()
4310 wdata->tailsz, false, need_invalidate); in smb2_async_writev()
4311 if (!wdata->mr) { in smb2_async_writev()
4312 rc = -EAGAIN; in smb2_async_writev()
4315 req->Length = 0; in smb2_async_writev()
4316 req->DataOffset = 0; in smb2_async_writev()
4317 if (wdata->nr_pages > 1) in smb2_async_writev()
4318 req->RemainingBytes = in smb2_async_writev()
4320 (wdata->nr_pages - 1) * wdata->pagesz - in smb2_async_writev()
4321 wdata->page_offset + wdata->tailsz in smb2_async_writev()
4324 req->RemainingBytes = cpu_to_le32(wdata->tailsz); in smb2_async_writev()
4325 req->Channel = SMB2_CHANNEL_RDMA_V1_INVALIDATE; in smb2_async_writev()
4327 req->Channel = SMB2_CHANNEL_RDMA_V1; in smb2_async_writev()
4328 req->WriteChannelInfoOffset = in smb2_async_writev()
4330 req->WriteChannelInfoLength = in smb2_async_writev()
4332 v1 = (struct smbd_buffer_descriptor_v1 *) &req->Buffer[0]; in smb2_async_writev()
4333 v1->offset = cpu_to_le64(wdata->mr->mr->iova); in smb2_async_writev()
4334 v1->token = cpu_to_le32(wdata->mr->mr->rkey); in smb2_async_writev()
4335 v1->length = cpu_to_le32(wdata->mr->mr->length); in smb2_async_writev()
4338 iov[0].iov_len = total_len - 1; in smb2_async_writev()
4343 rqst.rq_pages = wdata->pages; in smb2_async_writev()
4344 rqst.rq_offset = wdata->page_offset; in smb2_async_writev()
4345 rqst.rq_npages = wdata->nr_pages; in smb2_async_writev()
4346 rqst.rq_pagesz = wdata->pagesz; in smb2_async_writev()
4347 rqst.rq_tailsz = wdata->tailsz; in smb2_async_writev()
4349 if (wdata->mr) { in smb2_async_writev()
4355 wdata->offset, wdata->bytes); in smb2_async_writev()
4359 if (!wdata->mr) in smb2_async_writev()
4360 req->Length = cpu_to_le32(wdata->bytes); in smb2_async_writev()
4362 req->Length = cpu_to_le32(wdata->bytes); in smb2_async_writev()
4365 if (wdata->credits.value > 0) { in smb2_async_writev()
4366 shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(wdata->bytes, in smb2_async_writev()
4368 shdr->CreditRequest = cpu_to_le16(le16_to_cpu(shdr->CreditCharge) + 8); in smb2_async_writev()
4370 rc = adjust_credits(server, &wdata->credits, wdata->bytes); in smb2_async_writev()
4377 kref_get(&wdata->refcount); in smb2_async_writev()
4379 wdata, flags, &wdata->credits); in smb2_async_writev()
4382 trace_smb3_write_err(0 /* no xid */, req->PersistentFileId, in smb2_async_writev()
4383 tcon->tid, tcon->ses->Suid, wdata->offset, in smb2_async_writev()
4384 wdata->bytes, rc); in smb2_async_writev()
4385 kref_put(&wdata->refcount, release); in smb2_async_writev()
4386 cifs_stats_fail_inc(tcon, SMB2_WRITE_HE); in smb2_async_writev()
4419 if (!io_parms->server) in SMB2_write()
4420 io_parms->server = cifs_pick_channel(io_parms->tcon->ses); in SMB2_write()
4421 server = io_parms->server; in SMB2_write()
4423 return -ECONNABORTED; in SMB2_write()
4425 rc = smb2_plain_req_init(SMB2_WRITE, io_parms->tcon, server, in SMB2_write()
4430 if (smb3_encryption_required(io_parms->tcon)) in SMB2_write()
4433 req->sync_hdr.ProcessId = cpu_to_le32(io_parms->pid); in SMB2_write()
4435 req->PersistentFileId = io_parms->persistent_fid; in SMB2_write()
4436 req->VolatileFileId = io_parms->volatile_fid; in SMB2_write()
4437 req->WriteChannelInfoOffset = 0; in SMB2_write()
4438 req->WriteChannelInfoLength = 0; in SMB2_write()
4439 req->Channel = 0; in SMB2_write()
4440 req->Length = cpu_to_le32(io_parms->length); in SMB2_write()
4441 req->Offset = cpu_to_le64(io_parms->offset); in SMB2_write()
4442 req->DataOffset = cpu_to_le16( in SMB2_write()
4444 req->RemainingBytes = 0; in SMB2_write()
4446 trace_smb3_write_enter(xid, io_parms->persistent_fid, in SMB2_write()
4447 io_parms->tcon->tid, io_parms->tcon->ses->Suid, in SMB2_write()
4448 io_parms->offset, io_parms->length); in SMB2_write()
4452 iov[0].iov_len = total_len - 1; in SMB2_write()
4458 rc = cifs_send_recv(xid, io_parms->tcon->ses, server, in SMB2_write()
4464 trace_smb3_write_err(xid, req->PersistentFileId, in SMB2_write()
4465 io_parms->tcon->tid, in SMB2_write()
4466 io_parms->tcon->ses->Suid, in SMB2_write()
4467 io_parms->offset, io_parms->length, rc); in SMB2_write()
4468 cifs_stats_fail_inc(io_parms->tcon, SMB2_WRITE_HE); in SMB2_write()
4471 *nbytes = le32_to_cpu(rsp->DataLength); in SMB2_write()
4472 trace_smb3_write_done(xid, req->PersistentFileId, in SMB2_write()
4473 io_parms->tcon->tid, in SMB2_write()
4474 io_parms->tcon->ses->Suid, in SMB2_write()
4475 io_parms->offset, *nbytes); in SMB2_write()
4489 return -1; in posix_info_sid_size()
4493 return -1; in posix_info_sid_size()
4497 return -1; in posix_info_sid_size()
4517 end = beg + le32_to_cpu(p->NextEntryOffset); in posix_info_parse()
4525 return -1; in posix_info_parse()
4532 return -1; in posix_info_parse()
4539 return -1; in posix_info_parse()
4544 return -1; in posix_info_parse()
4547 return -1; in posix_info_parse()
4553 return -1; in posix_info_parse()
4557 out->base = beg; in posix_info_parse()
4558 out->size = total_len; in posix_info_parse()
4559 out->name_len = name_len; in posix_info_parse()
4560 out->name = name; in posix_info_parse()
4561 memcpy(&out->owner, owner_sid, in posix_info_parse()
4563 memcpy(&out->group, group_sid, in posix_info_parse()
4574 return -1; in posix_info_extra_size()
4575 return len - sizeof(struct smb2_posix_info); in posix_info_extra_size()
4607 len = le32_to_cpu(dir_info->FileNameLength); in num_entries()
4621 next_offset = le32_to_cpu(dir_info->NextEntryOffset); in num_entries()
4633 struct cifs_tcon *tcon, in SMB2_query_directory_init() argument
4642 unsigned int output_size = CIFSMaxBufSize - in SMB2_query_directory_init()
4643 MAX_SMB2_CREATE_RESPONSE_SIZE - in SMB2_query_directory_init()
4646 struct kvec *iov = rqst->rq_iov; in SMB2_query_directory_init()
4649 rc = smb2_plain_req_init(SMB2_QUERY_DIRECTORY, tcon, server, in SMB2_query_directory_init()
4656 req->FileInformationClass = FILE_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
4659 req->FileInformationClass = FILEID_FULL_DIRECTORY_INFORMATION; in SMB2_query_directory_init()
4662 req->FileInformationClass = SMB_FIND_FILE_POSIX_INFO; in SMB2_query_directory_init()
4667 return -EINVAL; in SMB2_query_directory_init()
4670 req->FileIndex = cpu_to_le32(index); in SMB2_query_directory_init()
4671 req->PersistentFileId = persistent_fid; in SMB2_query_directory_init()
4672 req->VolatileFileId = volatile_fid; in SMB2_query_directory_init()
4675 bufptr = req->Buffer; in SMB2_query_directory_init()
4678 req->FileNameOffset = in SMB2_query_directory_init()
4679 cpu_to_le16(sizeof(struct smb2_query_directory_req) - 1); in SMB2_query_directory_init()
4680 req->FileNameLength = cpu_to_le16(len); in SMB2_query_directory_init()
4685 output_size = min_t(unsigned int, output_size, server->maxBuf); in SMB2_query_directory_init()
4687 req->OutputBufferLength = cpu_to_le32(output_size); in SMB2_query_directory_init()
4691 iov[0].iov_len = total_len - 1; in SMB2_query_directory_init()
4693 iov[1].iov_base = (char *)(req->Buffer); in SMB2_query_directory_init()
4696 trace_smb3_query_dir_enter(xid, persistent_fid, tcon->tid, in SMB2_query_directory_init()
4697 tcon->ses->Suid, index, output_size); in SMB2_query_directory_init()
4704 if (rqst && rqst->rq_iov) { in SMB2_query_directory_free()
4705 cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_query_directory_free()
4710 smb2_parse_query_directory(struct cifs_tcon *tcon, in smb2_parse_query_directory() argument
4720 rsp = (struct smb2_query_directory_rsp *)rsp_iov->iov_base; in smb2_parse_query_directory()
4722 switch (srch_inf->info_level) { in smb2_parse_query_directory()
4724 info_buf_size = sizeof(FILE_DIRECTORY_INFO) - 1; in smb2_parse_query_directory()
4727 info_buf_size = sizeof(SEARCH_ID_FULL_DIR_INFO) - 1; in smb2_parse_query_directory()
4735 srch_inf->info_level); in smb2_parse_query_directory()
4736 return -EINVAL; in smb2_parse_query_directory()
4739 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in smb2_parse_query_directory()
4740 le32_to_cpu(rsp->OutputBufferLength), rsp_iov, in smb2_parse_query_directory()
4747 srch_inf->unicode = true; in smb2_parse_query_directory()
4749 if (srch_inf->ntwrk_buf_start) { in smb2_parse_query_directory()
4750 if (srch_inf->smallBuf) in smb2_parse_query_directory()
4751 cifs_small_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
4753 cifs_buf_release(srch_inf->ntwrk_buf_start); in smb2_parse_query_directory()
4755 srch_inf->ntwrk_buf_start = (char *)rsp; in smb2_parse_query_directory()
4756 srch_inf->srch_entries_start = srch_inf->last_entry = in smb2_parse_query_directory()
4757 (char *)rsp + le16_to_cpu(rsp->OutputBufferOffset); in smb2_parse_query_directory()
4758 end_of_smb = rsp_iov->iov_len + (char *)rsp; in smb2_parse_query_directory()
4760 srch_inf->entries_in_buffer = num_entries( in smb2_parse_query_directory()
4761 srch_inf->info_level, in smb2_parse_query_directory()
4762 srch_inf->srch_entries_start, in smb2_parse_query_directory()
4764 &srch_inf->last_entry, in smb2_parse_query_directory()
4767 srch_inf->index_of_last_entry += srch_inf->entries_in_buffer; in smb2_parse_query_directory()
4769 srch_inf->entries_in_buffer, srch_inf->index_of_last_entry, in smb2_parse_query_directory()
4770 srch_inf->srch_entries_start, srch_inf->last_entry); in smb2_parse_query_directory()
4772 srch_inf->smallBuf = false; in smb2_parse_query_directory()
4774 srch_inf->smallBuf = true; in smb2_parse_query_directory()
4782 SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_query_directory() argument
4792 struct cifs_ses *ses = tcon->ses; in SMB2_query_directory()
4796 if (!ses || !(ses->server)) in SMB2_query_directory()
4797 return -EIO; in SMB2_query_directory()
4799 if (smb3_encryption_required(tcon)) in SMB2_query_directory()
4807 rc = SMB2_query_directory_init(xid, tcon, server, in SMB2_query_directory()
4810 srch_inf->info_level); in SMB2_query_directory()
4819 if (rc == -ENODATA && in SMB2_query_directory()
4820 rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) { in SMB2_query_directory()
4822 tcon->tid, tcon->ses->Suid, index, 0); in SMB2_query_directory()
4823 srch_inf->endOfSearch = true; in SMB2_query_directory()
4826 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
4827 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
4828 cifs_stats_fail_inc(tcon, SMB2_QUERY_DIRECTORY_HE); in SMB2_query_directory()
4833 rc = smb2_parse_query_directory(tcon, &rsp_iov, resp_buftype, in SMB2_query_directory()
4836 trace_smb3_query_dir_err(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
4837 tcon->ses->Suid, index, 0, rc); in SMB2_query_directory()
4842 trace_smb3_query_dir_done(xid, persistent_fid, tcon->tid, in SMB2_query_directory()
4843 tcon->ses->Suid, index, srch_inf->entries_in_buffer); in SMB2_query_directory()
4852 SMB2_set_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server, in SMB2_set_info_init() argument
4859 struct kvec *iov = rqst->rq_iov; in SMB2_set_info_init()
4863 rc = smb2_plain_req_init(SMB2_SET_INFO, tcon, server, in SMB2_set_info_init()
4868 req->sync_hdr.ProcessId = cpu_to_le32(pid); in SMB2_set_info_init()
4869 req->InfoType = info_type; in SMB2_set_info_init()
4870 req->FileInfoClass = info_class; in SMB2_set_info_init()
4871 req->PersistentFileId = persistent_fid; in SMB2_set_info_init()
4872 req->VolatileFileId = volatile_fid; in SMB2_set_info_init()
4873 req->AdditionalInformation = cpu_to_le32(additional_info); in SMB2_set_info_init()
4875 req->BufferOffset = in SMB2_set_info_init()
4876 cpu_to_le16(sizeof(struct smb2_set_info_req) - 1); in SMB2_set_info_init()
4877 req->BufferLength = cpu_to_le32(*size); in SMB2_set_info_init()
4879 memcpy(req->Buffer, *data, *size); in SMB2_set_info_init()
4884 iov[0].iov_len = total_len - 1; in SMB2_set_info_init()
4886 for (i = 1; i < rqst->rq_nvec; i++) { in SMB2_set_info_init()
4887 le32_add_cpu(&req->BufferLength, size[i]); in SMB2_set_info_init()
4898 if (rqst && rqst->rq_iov) in SMB2_set_info_free()
4899 cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */ in SMB2_set_info_free()
4903 send_set_info(const unsigned int xid, struct cifs_tcon *tcon, in send_set_info() argument
4914 struct cifs_ses *ses = tcon->ses; in send_set_info()
4919 return -EIO; in send_set_info()
4922 return -EINVAL; in send_set_info()
4924 if (smb3_encryption_required(tcon)) in send_set_info()
4929 return -ENOMEM; in send_set_info()
4935 rc = SMB2_set_info_init(tcon, server, in send_set_info()
4952 cifs_stats_fail_inc(tcon, SMB2_SET_INFO_HE); in send_set_info()
4953 trace_smb3_set_info_err(xid, persistent_fid, tcon->tid, in send_set_info()
4954 ses->Suid, info_class, (__u32)info_type, rc); in send_set_info()
4963 SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid, in SMB2_set_eof() argument
4975 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_eof()
4981 SMB2_set_acl(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_acl() argument
4985 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_acl()
4986 current->tgid, 0, SMB2_O_INFO_SECURITY, aclflag, in SMB2_set_acl()
4991 SMB2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_set_ea() argument
4995 return send_set_info(xid, tcon, persistent_fid, volatile_fid, in SMB2_set_ea()
4996 current->tgid, FILE_FULL_EA_INFORMATION, SMB2_O_INFO_FILE, in SMB2_set_ea()
5001 SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_oplock_break() argument
5008 struct cifs_ses *ses = tcon->ses; in SMB2_oplock_break()
5017 rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server, in SMB2_oplock_break()
5022 if (smb3_encryption_required(tcon)) in SMB2_oplock_break()
5025 req->VolatileFid = volatile_fid; in SMB2_oplock_break()
5026 req->PersistentFid = persistent_fid; in SMB2_oplock_break()
5027 req->OplockLevel = oplock_level; in SMB2_oplock_break()
5028 req->sync_hdr.CreditRequest = cpu_to_le16(1); in SMB2_oplock_break()
5044 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE); in SMB2_oplock_break()
5055 kst->f_bsize = le32_to_cpu(pfs_inf->BytesPerSector) * in smb2_copy_fs_info_to_kstatfs()
5056 le32_to_cpu(pfs_inf->SectorsPerAllocationUnit); in smb2_copy_fs_info_to_kstatfs()
5057 kst->f_blocks = le64_to_cpu(pfs_inf->TotalAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5058 kst->f_bfree = kst->f_bavail = in smb2_copy_fs_info_to_kstatfs()
5059 le64_to_cpu(pfs_inf->CallerAvailableAllocationUnits); in smb2_copy_fs_info_to_kstatfs()
5067 kst->f_bsize = le32_to_cpu(response_data->BlockSize); in copy_posix_fs_info_to_kstatfs()
5068 kst->f_blocks = le64_to_cpu(response_data->TotalBlocks); in copy_posix_fs_info_to_kstatfs()
5069 kst->f_bfree = le64_to_cpu(response_data->BlocksAvail); in copy_posix_fs_info_to_kstatfs()
5070 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5071 kst->f_bavail = kst->f_bfree; in copy_posix_fs_info_to_kstatfs()
5073 kst->f_bavail = le64_to_cpu(response_data->UserBlocksAvail); in copy_posix_fs_info_to_kstatfs()
5074 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5075 kst->f_files = le64_to_cpu(response_data->TotalFileNodes); in copy_posix_fs_info_to_kstatfs()
5076 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in copy_posix_fs_info_to_kstatfs()
5077 kst->f_ffree = le64_to_cpu(response_data->FreeFileNodes); in copy_posix_fs_info_to_kstatfs()
5083 build_qfs_info_req(struct kvec *iov, struct cifs_tcon *tcon, in build_qfs_info_req() argument
5094 if ((tcon->ses == NULL) || server == NULL) in build_qfs_info_req()
5095 return -EIO; in build_qfs_info_req()
5097 rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server, in build_qfs_info_req()
5102 req->InfoType = SMB2_O_INFO_FILESYSTEM; in build_qfs_info_req()
5103 req->FileInfoClass = level; in build_qfs_info_req()
5104 req->PersistentFileId = persistent_fid; in build_qfs_info_req()
5105 req->VolatileFileId = volatile_fid; in build_qfs_info_req()
5107 req->InputBufferOffset = in build_qfs_info_req()
5108 cpu_to_le16(sizeof(struct smb2_query_info_req) - 1); in build_qfs_info_req()
5109 req->OutputBufferLength = cpu_to_le32( in build_qfs_info_req()
5110 outbuf_len + sizeof(struct smb2_query_info_rsp) - 1); in build_qfs_info_req()
5112 iov->iov_base = (char *)req; in build_qfs_info_req()
5113 iov->iov_len = total_len; in build_qfs_info_req()
5119 cifs_buf_release(iov->iov_base); in free_qfs_info_req()
5123 SMB311_posix_qfs_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB311_posix_qfs_info() argument
5132 struct cifs_ses *ses = tcon->ses; in SMB311_posix_qfs_info()
5137 rc = build_qfs_info_req(&iov, tcon, server, in SMB311_posix_qfs_info()
5144 if (smb3_encryption_required(tcon)) in SMB311_posix_qfs_info()
5155 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB311_posix_qfs_info()
5161 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB311_posix_qfs_info()
5162 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB311_posix_qfs_info()
5163 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB311_posix_qfs_info()
5174 SMB2_QFS_info(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_QFS_info() argument
5183 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_info()
5188 rc = build_qfs_info_req(&iov, tcon, server, in SMB2_QFS_info()
5195 if (smb3_encryption_required(tcon)) in SMB2_QFS_info()
5206 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB2_QFS_info()
5212 le16_to_cpu(rsp->OutputBufferOffset) + (char *)rsp); in SMB2_QFS_info()
5213 rc = smb2_validate_iov(le16_to_cpu(rsp->OutputBufferOffset), in SMB2_QFS_info()
5214 le32_to_cpu(rsp->OutputBufferLength), &rsp_iov, in SMB2_QFS_info()
5225 SMB2_QFS_attr(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_QFS_attr() argument
5234 struct cifs_ses *ses = tcon->ses; in SMB2_QFS_attr()
5253 return -EINVAL; in SMB2_QFS_attr()
5256 rc = build_qfs_info_req(&iov, tcon, server, in SMB2_QFS_attr()
5262 if (smb3_encryption_required(tcon)) in SMB2_QFS_attr()
5273 cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE); in SMB2_QFS_attr()
5278 rsp_len = le32_to_cpu(rsp->OutputBufferLength); in SMB2_QFS_attr()
5279 offset = le16_to_cpu(rsp->OutputBufferOffset); in SMB2_QFS_attr()
5285 memcpy(&tcon->fsAttrInfo, offset in SMB2_QFS_attr()
5289 memcpy(&tcon->fsDevInfo, offset in SMB2_QFS_attr()
5294 tcon->ss_flags = le32_to_cpu(ss_info->Flags); in SMB2_QFS_attr()
5295 tcon->perf_sector_size = in SMB2_QFS_attr()
5296 le32_to_cpu(ss_info->PhysicalBytesPerSectorForPerf); in SMB2_QFS_attr()
5300 tcon->vol_serial_number = vol_info->VolumeSerialNumber; in SMB2_QFS_attr()
5301 tcon->vol_create_time = vol_info->VolumeCreationTime; in SMB2_QFS_attr()
5310 smb2_lockv(const unsigned int xid, struct cifs_tcon *tcon, in smb2_lockv() argument
5323 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in smb2_lockv()
5327 rc = smb2_plain_req_init(SMB2_LOCK, tcon, server, in smb2_lockv()
5332 if (smb3_encryption_required(tcon)) in smb2_lockv()
5335 req->sync_hdr.ProcessId = cpu_to_le32(pid); in smb2_lockv()
5336 req->LockCount = cpu_to_le16(num_lock); in smb2_lockv()
5338 req->PersistentFileId = persist_fid; in smb2_lockv()
5339 req->VolatileFileId = volatile_fid; in smb2_lockv()
5344 iov[0].iov_len = total_len - sizeof(struct smb2_lock_element); in smb2_lockv()
5348 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in smb2_lockv()
5354 rc = cifs_send_recv(xid, tcon->ses, server, in smb2_lockv()
5360 cifs_stats_fail_inc(tcon, SMB2_LOCK_HE); in smb2_lockv()
5361 trace_smb3_lock_err(xid, persist_fid, tcon->tid, in smb2_lockv()
5362 tcon->ses->Suid, rc); in smb2_lockv()
5369 SMB2_lock(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_lock() argument
5382 return smb2_lockv(xid, tcon, persist_fid, volatile_fid, pid, 1, &lock); in SMB2_lock()
5386 SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon, in SMB2_lease_break() argument
5392 struct cifs_ses *ses = tcon->ses; in SMB2_lease_break()
5400 struct TCP_Server_Info *server = cifs_pick_channel(tcon->ses); in SMB2_lease_break()
5403 rc = smb2_plain_req_init(SMB2_OPLOCK_BREAK, tcon, server, in SMB2_lease_break()
5408 if (smb3_encryption_required(tcon)) in SMB2_lease_break()
5411 req->sync_hdr.CreditRequest = cpu_to_le16(1); in SMB2_lease_break()
5412 req->StructureSize = cpu_to_le16(36); in SMB2_lease_break()
5415 memcpy(req->LeaseKey, lease_key, 16); in SMB2_lease_break()
5416 req->LeaseState = lease_state; in SMB2_lease_break()
5434 cifs_stats_fail_inc(tcon, SMB2_OPLOCK_BREAK_HE); in SMB2_lease_break()
5435 trace_smb3_lease_err(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
5436 ses->Suid, *please_key_low, *please_key_high, rc); in SMB2_lease_break()
5439 trace_smb3_lease_done(le32_to_cpu(lease_state), tcon->tid, in SMB2_lease_break()
5440 ses->Suid, *please_key_low, *please_key_high); in SMB2_lease_break()