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

1 // SPDX-License-Identifier: LGPL-2.1
11 /* SMB/CIFS PDU handling routines here - except for leftovers in connect.c */
69 /* reconnect the socket, tcon, and smb session if needed */
71 cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command) in cifs_reconnect_tcon() argument
78 * SMBs NegProt, SessSetup, uLogoff do not have tcon yet so check for in cifs_reconnect_tcon()
79 * tcp and smb session status done differently for those three - in the in cifs_reconnect_tcon()
82 if (!tcon) in cifs_reconnect_tcon()
85 ses = tcon->ses; in cifs_reconnect_tcon()
86 server = ses->server; in cifs_reconnect_tcon()
90 * have tcon) are allowed as we start umount in cifs_reconnect_tcon()
92 spin_lock(&tcon->tc_lock); in cifs_reconnect_tcon()
93 if (tcon->status == TID_EXITING) { in cifs_reconnect_tcon()
95 spin_unlock(&tcon->tc_lock); in cifs_reconnect_tcon()
98 return -ENODEV; in cifs_reconnect_tcon()
101 spin_unlock(&tcon->tc_lock); in cifs_reconnect_tcon()
104 rc = cifs_wait_for_server_reconnect(server, tcon->retry); in cifs_reconnect_tcon()
108 spin_lock(&ses->chan_lock); in cifs_reconnect_tcon()
109 if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) { in cifs_reconnect_tcon()
110 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
113 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
115 mutex_lock(&ses->session_mutex); in cifs_reconnect_tcon()
118 * killed a channel. in cifs_reconnect_tcon()
120 spin_lock(&server->srv_lock); in cifs_reconnect_tcon()
121 switch (server->tcpStatus) { in cifs_reconnect_tcon()
123 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
124 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
125 return -EHOSTDOWN; in cifs_reconnect_tcon()
127 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
128 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
129 if (!tcon->retry) in cifs_reconnect_tcon()
130 return -EHOSTDOWN; in cifs_reconnect_tcon()
135 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
141 spin_lock(&ses->ses_lock); in cifs_reconnect_tcon()
142 spin_lock(&ses->chan_lock); in cifs_reconnect_tcon()
144 ses->ses_status == SES_GOOD) { in cifs_reconnect_tcon()
145 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
146 spin_unlock(&ses->ses_lock); in cifs_reconnect_tcon()
149 if (tcon->need_reconnect) in cifs_reconnect_tcon()
152 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
155 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
156 spin_unlock(&ses->ses_lock); in cifs_reconnect_tcon()
160 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
161 if (!tcon->retry) in cifs_reconnect_tcon()
162 return -EHOSTDOWN; in cifs_reconnect_tcon()
165 rc = cifs_setup_session(0, ses, server, ses->local_nls); in cifs_reconnect_tcon()
166 if ((rc == -EACCES) || (rc == -EHOSTDOWN) || (rc == -EKEYREVOKED)) { in cifs_reconnect_tcon()
171 if (ses->password2) in cifs_reconnect_tcon()
172 swap(ses->password2, ses->password); in cifs_reconnect_tcon()
175 /* do we need to reconnect tcon? */ in cifs_reconnect_tcon()
176 if (rc || !tcon->need_reconnect) { in cifs_reconnect_tcon()
177 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
182 cifs_mark_open_files_invalid(tcon); in cifs_reconnect_tcon()
183 rc = cifs_tree_connect(0, tcon); in cifs_reconnect_tcon()
184 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
185 cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc); in cifs_reconnect_tcon()
188 pr_warn_once("reconnect tcon failed rc = %d\n", rc); in cifs_reconnect_tcon()
196 reset_cifs_unix_caps(0, tcon, NULL, NULL); in cifs_reconnect_tcon()
216 rc = -EAGAIN; in cifs_reconnect_tcon()
226 small_smb_init(int smb_command, int wct, struct cifs_tcon *tcon, in small_smb_init() argument
231 rc = cifs_reconnect_tcon(tcon, smb_command); in small_smb_init()
238 return -ENOMEM; in small_smb_init()
242 tcon, wct); in small_smb_init()
244 if (tcon != NULL) in small_smb_init()
245 cifs_stats_inc(&tcon->num_smbs_sent); in small_smb_init()
262 buffer->Mid = get_next_mid(ses->server); in small_smb_init_no_tc()
263 if (ses->capabilities & CAP_UNICODE) in small_smb_init_no_tc()
264 buffer->Flags2 |= SMBFLG2_UNICODE; in small_smb_init_no_tc()
265 if (ses->capabilities & CAP_STATUS32) in small_smb_init_no_tc()
266 buffer->Flags2 |= SMBFLG2_ERR_STATUS; in small_smb_init_no_tc()
278 __smb_init(int smb_command, int wct, struct cifs_tcon *tcon, in __smb_init() argument
284 return -ENOMEM; in __smb_init()
293 header_assemble((struct smb_hdr *) *request_buf, smb_command, tcon, in __smb_init()
296 if (tcon != NULL) in __smb_init()
297 cifs_stats_inc(&tcon->num_smbs_sent); in __smb_init()
304 smb_init(int smb_command, int wct, struct cifs_tcon *tcon, in smb_init() argument
309 rc = cifs_reconnect_tcon(tcon, smb_command); in smb_init()
313 return __smb_init(smb_command, wct, tcon, request_buf, response_buf); in smb_init()
317 smb_init_no_reconnect(int smb_command, int wct, struct cifs_tcon *tcon, in smb_init_no_reconnect() argument
320 spin_lock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
321 if (cifs_chan_needs_reconnect(tcon->ses, tcon->ses->server) || in smb_init_no_reconnect()
322 tcon->need_reconnect) { in smb_init_no_reconnect()
323 spin_unlock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
324 return -EHOSTDOWN; in smb_init_no_reconnect()
326 spin_unlock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
328 return __smb_init(smb_command, wct, tcon, request_buf, response_buf); in smb_init_no_reconnect()
336 if (pSMB->hdr.WordCount < 10) in validate_t2()
340 if (get_unaligned_le16(&pSMB->t2_rsp.ParameterOffset) > 1024 || in validate_t2()
341 get_unaligned_le16(&pSMB->t2_rsp.DataOffset) > 1024) in validate_t2()
344 total_size = get_unaligned_le16(&pSMB->t2_rsp.ParameterCount); in validate_t2()
351 total_size += get_unaligned_le16(&pSMB->t2_rsp.DataCount); in validate_t2()
352 if (total_size > get_bcc(&pSMB->hdr) || in validate_t2()
360 return -EINVAL; in validate_t2()
368 char *guid = pSMBr->u.extended_response.GUID; in decode_ext_sec_blob()
369 struct TCP_Server_Info *server = ses->server; in decode_ext_sec_blob()
371 count = get_bcc(&pSMBr->hdr); in decode_ext_sec_blob()
373 return -EIO; in decode_ext_sec_blob()
376 if (server->srv_count > 1) { in decode_ext_sec_blob()
378 if (memcmp(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE) != 0) { in decode_ext_sec_blob()
380 memcpy(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE); in decode_ext_sec_blob()
384 memcpy(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE); in decode_ext_sec_blob()
388 server->sec_ntlmssp = true; in decode_ext_sec_blob()
390 count -= SMB1_CLIENT_GUID_SIZE; in decode_ext_sec_blob()
392 pSMBr->u.extended_response.SecurityBlob, count, server); in decode_ext_sec_blob()
394 return -EINVAL; in decode_ext_sec_blob()
431 return -EIO; in CIFSSMBNegotiate()
434 rc = smb_init(SMB_COM_NEGOTIATE, 0, NULL /* no tcon yet */ , in CIFSSMBNegotiate()
439 pSMB->hdr.Mid = get_next_mid(server); in CIFSSMBNegotiate()
440 pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS); in CIFSSMBNegotiate()
442 if (should_set_ext_sec_flag(ses->sectype)) { in CIFSSMBNegotiate()
444 pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; in CIFSSMBNegotiate()
455 memcpy(&pSMB->DialectsArray[count], protocols[i].name, len); in CIFSSMBNegotiate()
459 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBNegotiate()
466 server->dialect = le16_to_cpu(pSMBr->DialectIndex); in CIFSSMBNegotiate()
467 cifs_dbg(FYI, "Dialect: %d\n", server->dialect); in CIFSSMBNegotiate()
469 if ((pSMBr->hdr.WordCount <= 13) || (server->dialect == BAD_PROT)) { in CIFSSMBNegotiate()
470 /* core returns wct = 1, but we do not ask for core - otherwise in CIFSSMBNegotiate()
471 small wct just comes when dialect index is -1 indicating we in CIFSSMBNegotiate()
473 rc = -EOPNOTSUPP; in CIFSSMBNegotiate()
475 } else if (pSMBr->hdr.WordCount != 17) { in CIFSSMBNegotiate()
477 rc = -EOPNOTSUPP; in CIFSSMBNegotiate()
482 server->sec_mode = pSMBr->SecurityMode; in CIFSSMBNegotiate()
483 if ((server->sec_mode & SECMODE_USER) == 0) in CIFSSMBNegotiate()
488 server->maxReq = min_t(unsigned int, le16_to_cpu(pSMBr->MaxMpxCount), in CIFSSMBNegotiate()
490 set_credits(server, server->maxReq); in CIFSSMBNegotiate()
492 server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize); in CIFSSMBNegotiate()
494 server->max_read = server->maxBuf; in CIFSSMBNegotiate()
495 server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); in CIFSSMBNegotiate()
496 cifs_dbg(NOISY, "Max buf = %d\n", ses->server->maxBuf); in CIFSSMBNegotiate()
497 server->capabilities = le32_to_cpu(pSMBr->Capabilities); in CIFSSMBNegotiate()
498 server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); in CIFSSMBNegotiate()
499 server->timeAdj *= 60; in CIFSSMBNegotiate()
501 if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) { in CIFSSMBNegotiate()
502 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
503 memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, in CIFSSMBNegotiate()
505 } else if (pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || in CIFSSMBNegotiate()
506 server->capabilities & CAP_EXTENDED_SECURITY) { in CIFSSMBNegotiate()
507 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in CIFSSMBNegotiate()
509 } else if (server->sec_mode & SECMODE_PW_ENCRYPT) { in CIFSSMBNegotiate()
510 rc = -EIO; /* no crypt key only if plain text pwd */ in CIFSSMBNegotiate()
512 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
513 server->capabilities &= ~CAP_EXTENDED_SECURITY; in CIFSSMBNegotiate()
517 rc = cifs_enable_signing(server, ses->sign); in CIFSSMBNegotiate()
526 CIFSSMBTDis(const unsigned int xid, struct cifs_tcon *tcon) in CIFSSMBTDis() argument
534 if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) in CIFSSMBTDis()
535 return -EIO; in CIFSSMBTDis()
540 * the tcon is no longer on the list, so no need to take lock before in CIFSSMBTDis()
543 spin_lock(&tcon->ses->chan_lock); in CIFSSMBTDis()
544 if ((tcon->need_reconnect) || CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses)) { in CIFSSMBTDis()
545 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
546 return -EIO; in CIFSSMBTDis()
548 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
550 rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon, in CIFSSMBTDis()
555 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)smb_buffer, 0); in CIFSSMBTDis()
562 if (rc == -EAGAIN) in CIFSSMBTDis()
569 * This is a no-op for now. We're not really interested in the reply, but
570 * rather in the fact that the server sent one and that server->lstrp
578 struct TCP_Server_Info *server = mid->callback_data; in cifs_echo_callback()
600 if (server->capabilities & CAP_UNICODE) in CIFSSMBEcho()
601 smb->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSSMBEcho()
604 smb->hdr.Tid = 0xffff; in CIFSSMBEcho()
605 smb->hdr.WordCount = 1; in CIFSSMBEcho()
606 put_unaligned_le16(1, &smb->EchoCount); in CIFSSMBEcho()
607 put_bcc(1, &smb->hdr); in CIFSSMBEcho()
608 smb->Data[0] = 'a'; in CIFSSMBEcho()
639 if (!ses || !ses->server) in CIFSSMBLogoff()
640 return -EIO; in CIFSSMBLogoff()
642 mutex_lock(&ses->session_mutex); in CIFSSMBLogoff()
643 spin_lock(&ses->chan_lock); in CIFSSMBLogoff()
645 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
649 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
653 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
657 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSSMBLogoff()
659 if (ses->server->sign) in CIFSSMBLogoff()
660 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSSMBLogoff()
662 pSMB->hdr.Uid = ses->Suid; in CIFSSMBLogoff()
664 pSMB->AndXCommand = 0xFF; in CIFSSMBLogoff()
668 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
673 if (rc == -EAGAIN) in CIFSSMBLogoff()
679 CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon, in CIFSPOSIXDelFile() argument
693 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSPOSIXDelFile()
698 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXDelFile()
700 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSPOSIXDelFile()
705 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSPOSIXDelFile()
709 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXDelFile()
710 pSMB->MaxDataCount = 0; /* BB double check this with jra */ in CIFSPOSIXDelFile()
711 pSMB->MaxSetupCount = 0; in CIFSPOSIXDelFile()
712 pSMB->Reserved = 0; in CIFSPOSIXDelFile()
713 pSMB->Flags = 0; in CIFSPOSIXDelFile()
714 pSMB->Timeout = 0; in CIFSPOSIXDelFile()
715 pSMB->Reserved2 = 0; in CIFSPOSIXDelFile()
717 InformationLevel) - 4; in CIFSPOSIXDelFile()
725 pRqD->type = cpu_to_le16(type); in CIFSPOSIXDelFile()
726 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXDelFile()
727 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXDelFile()
728 pSMB->SetupCount = 1; in CIFSPOSIXDelFile()
729 pSMB->Reserved3 = 0; in CIFSPOSIXDelFile()
730 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXDelFile()
733 pSMB->DataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
734 pSMB->TotalDataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
735 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXDelFile()
736 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXDelFile()
737 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_UNLINK); in CIFSPOSIXDelFile()
738 pSMB->Reserved4 = 0; in CIFSPOSIXDelFile()
740 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXDelFile()
741 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXDelFile()
747 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSPOSIXDelFile()
749 if (rc == -EAGAIN) in CIFSPOSIXDelFile()
756 CIFSSMBDelFile(const unsigned int xid, struct cifs_tcon *tcon, const char *name, in CIFSSMBDelFile() argument
767 rc = smb_init(SMB_COM_DELETE, 1, tcon, (void **) &pSMB, in CIFSSMBDelFile()
772 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBDelFile()
773 name_len = cifsConvertToUTF16((__le16 *) pSMB->fileName, name, in CIFSSMBDelFile()
774 PATH_MAX, cifs_sb->local_nls, in CIFSSMBDelFile()
779 name_len = copy_path_name(pSMB->fileName, name); in CIFSSMBDelFile()
781 pSMB->SearchAttributes = in CIFSSMBDelFile()
783 pSMB->BufferFormat = 0x04; in CIFSSMBDelFile()
785 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBDelFile()
786 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBDelFile()
788 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSSMBDelFile()
793 if (rc == -EAGAIN) in CIFSSMBDelFile()
800 CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, const char *name, in CIFSSMBRmDir() argument
812 rc = smb_init(SMB_COM_DELETE_DIRECTORY, 0, tcon, (void **) &pSMB, in CIFSSMBRmDir()
817 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRmDir()
818 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBRmDir()
819 PATH_MAX, cifs_sb->local_nls, in CIFSSMBRmDir()
824 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBRmDir()
827 pSMB->BufferFormat = 0x04; in CIFSSMBRmDir()
829 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBRmDir()
830 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRmDir()
832 cifs_stats_inc(&tcon->stats.cifs_stats.num_rmdirs); in CIFSSMBRmDir()
837 if (rc == -EAGAIN) in CIFSSMBRmDir()
844 struct cifs_tcon *tcon, const char *name, in CIFSSMBMkDir() argument
856 rc = smb_init(SMB_COM_CREATE_DIRECTORY, 0, tcon, (void **) &pSMB, in CIFSSMBMkDir()
861 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBMkDir()
862 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBMkDir()
863 PATH_MAX, cifs_sb->local_nls, in CIFSSMBMkDir()
868 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBMkDir()
871 pSMB->BufferFormat = 0x04; in CIFSSMBMkDir()
873 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBMkDir()
874 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBMkDir()
876 cifs_stats_inc(&tcon->stats.cifs_stats.num_mkdirs); in CIFSSMBMkDir()
881 if (rc == -EAGAIN) in CIFSSMBMkDir()
887 CIFSPOSIXCreate(const unsigned int xid, struct cifs_tcon *tcon, in CIFSPOSIXCreate() argument
904 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSPOSIXCreate()
909 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXCreate()
911 cifsConvertToUTF16((__le16 *) pSMB->FileName, name, in CIFSPOSIXCreate()
916 name_len = copy_path_name(pSMB->FileName, name); in CIFSPOSIXCreate()
921 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXCreate()
922 pSMB->MaxDataCount = cpu_to_le16(1000); /* large enough */ in CIFSPOSIXCreate()
923 pSMB->MaxSetupCount = 0; in CIFSPOSIXCreate()
924 pSMB->Reserved = 0; in CIFSPOSIXCreate()
925 pSMB->Flags = 0; in CIFSPOSIXCreate()
926 pSMB->Timeout = 0; in CIFSPOSIXCreate()
927 pSMB->Reserved2 = 0; in CIFSPOSIXCreate()
929 InformationLevel) - 4; in CIFSPOSIXCreate()
933 pdata->Level = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSPOSIXCreate()
934 pdata->Permissions = cpu_to_le64(mode); in CIFSPOSIXCreate()
935 pdata->PosixOpenFlags = cpu_to_le32(posix_flags); in CIFSPOSIXCreate()
936 pdata->OpenFlags = cpu_to_le32(*pOplock); in CIFSPOSIXCreate()
937 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXCreate()
938 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXCreate()
939 pSMB->SetupCount = 1; in CIFSPOSIXCreate()
940 pSMB->Reserved3 = 0; in CIFSPOSIXCreate()
941 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXCreate()
944 pSMB->DataCount = cpu_to_le16(count); in CIFSPOSIXCreate()
945 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXCreate()
946 pSMB->TotalDataCount = pSMB->DataCount; in CIFSPOSIXCreate()
947 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXCreate()
948 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_OPEN); in CIFSPOSIXCreate()
949 pSMB->Reserved4 = 0; in CIFSPOSIXCreate()
951 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXCreate()
952 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXCreate()
962 if (rc || get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP)) { in CIFSPOSIXCreate()
963 rc = -EIO; /* bad smb */ in CIFSPOSIXCreate()
968 psx_rsp = (OPEN_PSX_RSP *)((char *) &pSMBr->hdr.Protocol in CIFSPOSIXCreate()
969 + le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSPOSIXCreate()
971 *pOplock = le16_to_cpu(psx_rsp->OplockFlags); in CIFSPOSIXCreate()
973 *netfid = psx_rsp->Fid; /* cifs fid stays in le */ in CIFSPOSIXCreate()
976 if (cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction) in CIFSPOSIXCreate()
979 if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { in CIFSPOSIXCreate()
980 pRetData->Type = cpu_to_le32(-1); /* unknown */ in CIFSPOSIXCreate()
983 if (get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP) in CIFSPOSIXCreate()
986 pRetData->Type = cpu_to_le32(-1); in CIFSPOSIXCreate()
998 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixmkdirs); in CIFSPOSIXCreate()
1000 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixopens); in CIFSPOSIXCreate()
1002 if (rc == -EAGAIN) in CIFSPOSIXCreate()
1053 SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon, in SMBLegacyOpen() argument
1067 rc = smb_init(SMB_COM_OPEN_ANDX, 15, tcon, (void **) &pSMB, in SMBLegacyOpen()
1072 pSMB->AndXCommand = 0xFF; /* none */ in SMBLegacyOpen()
1074 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBLegacyOpen()
1077 cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), in SMBLegacyOpen()
1083 name_len = copy_path_name(pSMB->fileName, fileName); in SMBLegacyOpen()
1086 pSMB->OpenFlags = cpu_to_le16(REQ_OPLOCK); in SMBLegacyOpen()
1088 pSMB->OpenFlags = cpu_to_le16(REQ_BATCHOPLOCK); in SMBLegacyOpen()
1090 pSMB->OpenFlags |= cpu_to_le16(REQ_MORE_INFO); in SMBLegacyOpen()
1091 pSMB->Mode = cpu_to_le16(access_flags_to_smbopen_mode(access_flags)); in SMBLegacyOpen()
1092 pSMB->Mode |= cpu_to_le16(0x40); /* deny none */ in SMBLegacyOpen()
1098 pSMB->FileAttributes = cpu_to_le16(ATTR_SYSTEM); in SMBLegacyOpen()
1100 pSMB->FileAttributes = cpu_to_le16(0/*ATTR_NORMAL*/); in SMBLegacyOpen()
1103 pSMB->FileAttributes |= cpu_to_le16(ATTR_READONLY); in SMBLegacyOpen()
1106 /* pSMB->CreateOptions = cpu_to_le32(create_options & in SMBLegacyOpen()
1110 pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY); in SMBLegacyOpen()
1111 pSMB->OpenFunction = cpu_to_le16(convert_disposition(openDisposition)); in SMBLegacyOpen()
1115 pSMB->ByteCount = cpu_to_le16(count); in SMBLegacyOpen()
1116 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBLegacyOpen()
1118 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in SMBLegacyOpen()
1124 /* *pOplock = pSMBr->OplockLevel; */ /* BB take from action field*/ in SMBLegacyOpen()
1126 *netfid = pSMBr->Fid; /* cifs fid stays in le */ in SMBLegacyOpen()
1130 /* if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction) in SMBLegacyOpen()
1135 pfile_info->CreationTime = 0; /* BB convert CreateTime*/ in SMBLegacyOpen()
1136 pfile_info->LastAccessTime = 0; /* BB fixme */ in SMBLegacyOpen()
1137 pfile_info->LastWriteTime = 0; /* BB fixme */ in SMBLegacyOpen()
1138 pfile_info->ChangeTime = 0; /* BB fixme */ in SMBLegacyOpen()
1139 pfile_info->Attributes = in SMBLegacyOpen()
1140 cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes)); in SMBLegacyOpen()
1142 pfile_info->AllocationSize = in SMBLegacyOpen()
1143 cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile)); in SMBLegacyOpen()
1144 pfile_info->EndOfFile = pfile_info->AllocationSize; in SMBLegacyOpen()
1145 pfile_info->NumberOfLinks = cpu_to_le32(1); in SMBLegacyOpen()
1146 pfile_info->DeletePending = 0; in SMBLegacyOpen()
1151 if (rc == -EAGAIN) in SMBLegacyOpen()
1166 struct cifs_sb_info *cifs_sb = oparms->cifs_sb; in CIFS_open()
1167 struct cifs_tcon *tcon = oparms->tcon; in CIFS_open() local
1169 const struct nls_table *nls = cifs_sb->local_nls; in CIFS_open()
1170 int create_options = oparms->create_options; in CIFS_open()
1171 int desired_access = oparms->desired_access; in CIFS_open()
1172 int disposition = oparms->disposition; in CIFS_open()
1173 const char *path = oparms->path; in CIFS_open()
1176 rc = smb_init(SMB_COM_NT_CREATE_ANDX, 24, tcon, (void **)&req, in CIFS_open()
1182 req->AndXCommand = 0xFF; in CIFS_open()
1184 if (req->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFS_open()
1187 name_len = cifsConvertToUTF16((__le16 *)(req->fileName + 1), in CIFS_open()
1192 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1197 name_len = copy_path_name(req->fileName, path); in CIFS_open()
1198 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1202 req->OpenFlags = cpu_to_le32(REQ_OPLOCK); in CIFS_open()
1204 req->OpenFlags = cpu_to_le32(REQ_BATCHOPLOCK); in CIFS_open()
1206 req->DesiredAccess = cpu_to_le32(desired_access); in CIFS_open()
1207 req->AllocationSize = 0; in CIFS_open()
1214 req->FileAttributes = cpu_to_le32(ATTR_SYSTEM); in CIFS_open()
1216 req->FileAttributes = cpu_to_le32(ATTR_NORMAL); in CIFS_open()
1222 if (tcon->ses->capabilities & CAP_UNIX) in CIFS_open()
1223 req->FileAttributes |= cpu_to_le32(ATTR_POSIX_SEMANTICS); in CIFS_open()
1226 req->FileAttributes |= cpu_to_le32(ATTR_READONLY); in CIFS_open()
1228 req->ShareAccess = cpu_to_le32(FILE_SHARE_ALL); in CIFS_open()
1229 req->CreateDisposition = cpu_to_le32(disposition); in CIFS_open()
1230 req->CreateOptions = cpu_to_le32(create_options & CREATE_OPTIONS_MASK); in CIFS_open()
1233 req->ImpersonationLevel = cpu_to_le32(SECURITY_IMPERSONATION); in CIFS_open()
1234 req->SecurityFlags = SECURITY_CONTEXT_TRACKING|SECURITY_EFFECTIVE_ONLY; in CIFS_open()
1239 req->ByteCount = cpu_to_le16(count); in CIFS_open()
1240 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)req, in CIFS_open()
1242 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in CIFS_open()
1246 if (rc == -EAGAIN) in CIFS_open()
1252 *oplock = rsp->OplockLevel; in CIFS_open()
1254 oparms->fid->netfid = rsp->Fid; in CIFS_open()
1255 oparms->fid->access = desired_access; in CIFS_open()
1259 if (cpu_to_le32(FILE_CREATE) == rsp->CreateAction) in CIFS_open()
1264 memcpy(&buf->common_attributes, in CIFS_open()
1265 &rsp->common_attributes, in CIFS_open()
1266 sizeof(buf->common_attributes)); in CIFS_open()
1268 buf->AllocationSize = rsp->AllocationSize; in CIFS_open()
1269 buf->EndOfFile = rsp->EndOfFile; in CIFS_open()
1270 buf->NumberOfLinks = cpu_to_le32(1); in CIFS_open()
1271 buf->DeletePending = 0; in CIFS_open()
1281 struct cifs_io_subrequest *rdata = mid->callback_data; in cifs_readv_callback()
1282 struct netfs_inode *ictx = netfs_inode(rdata->rreq->inode); in cifs_readv_callback()
1283 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); in cifs_readv_callback() local
1284 struct TCP_Server_Info *server = tcon->ses->server; in cifs_readv_callback()
1285 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_readv_callback()
1287 .rq_iter = rdata->subreq.io_iter }; in cifs_readv_callback()
1291 .rreq_debug_id = rdata->rreq->debug_id, in cifs_readv_callback()
1292 .rreq_debug_index = rdata->subreq.debug_index, in cifs_readv_callback()
1296 __func__, mid->mid, mid->mid_state, rdata->result, in cifs_readv_callback()
1297 rdata->subreq.len); in cifs_readv_callback()
1299 switch (mid->mid_state) { in cifs_readv_callback()
1302 if (server->sign) { in cifs_readv_callback()
1305 iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes); in cifs_readv_callback()
1307 mid->sequence_number); in cifs_readv_callback()
1313 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1314 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1318 rdata->result = -EAGAIN; in cifs_readv_callback()
1319 if (server->sign && rdata->got_bytes) in cifs_readv_callback()
1321 rdata->got_bytes = 0; in cifs_readv_callback()
1323 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1324 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1327 rdata->result = -EIO; in cifs_readv_callback()
1330 if (rdata->result == -ENODATA) { in cifs_readv_callback()
1331 rdata->result = 0; in cifs_readv_callback()
1332 __set_bit(NETFS_SREQ_HIT_EOF, &rdata->subreq.flags); in cifs_readv_callback()
1334 size_t trans = rdata->subreq.transferred + rdata->got_bytes; in cifs_readv_callback()
1335 if (trans < rdata->subreq.len && in cifs_readv_callback()
1336 rdata->subreq.start + trans == ictx->remote_i_size) { in cifs_readv_callback()
1337 rdata->result = 0; in cifs_readv_callback()
1338 __set_bit(NETFS_SREQ_HIT_EOF, &rdata->subreq.flags); in cifs_readv_callback()
1339 } else if (rdata->got_bytes > 0) { in cifs_readv_callback()
1340 __set_bit(NETFS_SREQ_MADE_PROGRESS, &rdata->subreq.flags); in cifs_readv_callback()
1342 if (rdata->got_bytes) in cifs_readv_callback()
1343 __set_bit(NETFS_SREQ_MADE_PROGRESS, &rdata->subreq.flags); in cifs_readv_callback()
1346 rdata->credits.value = 0; in cifs_readv_callback()
1347 rdata->subreq.error = rdata->result; in cifs_readv_callback()
1348 rdata->subreq.transferred += rdata->got_bytes; in cifs_readv_callback()
1349 trace_netfs_sreq(&rdata->subreq, netfs_sreq_trace_io_progress); in cifs_readv_callback()
1350 netfs_read_subreq_terminated(&rdata->subreq); in cifs_readv_callback()
1355 /* cifs_async_readv - send an async write, and set up mid to handle result */
1362 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); in cifs_async_readv() local
1363 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_async_readv()
1367 __func__, rdata->subreq.start, rdata->subreq.len); in cifs_async_readv()
1369 if (tcon->ses->capabilities & CAP_LARGE_FILES) in cifs_async_readv()
1373 if ((rdata->subreq.start >> 32) > 0) { in cifs_async_readv()
1375 return -EIO; in cifs_async_readv()
1379 rc = small_smb_init(SMB_COM_READ_ANDX, wct, tcon, (void **)&smb); in cifs_async_readv()
1383 smb->hdr.Pid = cpu_to_le16((__u16)rdata->req->pid); in cifs_async_readv()
1384 smb->hdr.PidHigh = cpu_to_le16((__u16)(rdata->req->pid >> 16)); in cifs_async_readv()
1386 smb->AndXCommand = 0xFF; /* none */ in cifs_async_readv()
1387 smb->Fid = rdata->req->cfile->fid.netfid; in cifs_async_readv()
1388 smb->OffsetLow = cpu_to_le32(rdata->subreq.start & 0xFFFFFFFF); in cifs_async_readv()
1390 smb->OffsetHigh = cpu_to_le32(rdata->subreq.start >> 32); in cifs_async_readv()
1391 smb->Remaining = 0; in cifs_async_readv()
1392 smb->MaxCount = cpu_to_le16(rdata->subreq.len & 0xFFFF); in cifs_async_readv()
1393 smb->MaxCountHigh = cpu_to_le32(rdata->subreq.len >> 16); in cifs_async_readv()
1395 smb->ByteCount = 0; in cifs_async_readv()
1400 smbr->ByteCount = 0; in cifs_async_readv()
1404 rdata->iov[0].iov_base = smb; in cifs_async_readv()
1405 rdata->iov[0].iov_len = 4; in cifs_async_readv()
1406 rdata->iov[1].iov_base = (char *)smb + 4; in cifs_async_readv()
1407 rdata->iov[1].iov_len = get_rfc1002_length(smb); in cifs_async_readv()
1409 rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, in cifs_async_readv()
1413 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in cifs_async_readv()
1422 int rc = -EACCES; in CIFSSMBRead()
1430 __u32 pid = io_parms->pid; in CIFSSMBRead()
1431 __u16 netfid = io_parms->netfid; in CIFSSMBRead()
1432 __u64 offset = io_parms->offset; in CIFSSMBRead()
1433 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBRead() local
1434 unsigned int count = io_parms->length; in CIFSSMBRead()
1437 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBRead()
1443 return -EIO; in CIFSSMBRead()
1448 rc = small_smb_init(SMB_COM_READ_ANDX, wct, tcon, (void **) &pSMB); in CIFSSMBRead()
1452 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBRead()
1453 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBRead()
1455 /* tcon and ses pointer are checked in smb_init */ in CIFSSMBRead()
1456 if (tcon->ses->server == NULL) in CIFSSMBRead()
1457 return -ECONNABORTED; in CIFSSMBRead()
1459 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBRead()
1460 pSMB->Fid = netfid; in CIFSSMBRead()
1461 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBRead()
1463 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBRead()
1465 pSMB->Remaining = 0; in CIFSSMBRead()
1466 pSMB->MaxCount = cpu_to_le16(count & 0xFFFF); in CIFSSMBRead()
1467 pSMB->MaxCountHigh = cpu_to_le32(count >> 16); in CIFSSMBRead()
1469 pSMB->ByteCount = 0; /* no need to do le conversion since 0 */ in CIFSSMBRead()
1474 pSMBW->ByteCount = 0; in CIFSSMBRead()
1478 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBRead()
1479 rc = SendReceive2(xid, tcon->ses, iov, 1, &resp_buf_type, in CIFSSMBRead()
1482 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in CIFSSMBRead()
1487 int data_length = le16_to_cpu(pSMBr->DataLengthHigh); in CIFSSMBRead()
1489 data_length += le16_to_cpu(pSMBr->DataLength); in CIFSSMBRead()
1497 rc = -EIO; in CIFSSMBRead()
1500 pReadData = (char *) (&pSMBr->hdr.Protocol) + in CIFSSMBRead()
1501 le16_to_cpu(pSMBr->DataOffset); in CIFSSMBRead()
1504 rc = -EFAULT; in CIFSSMBRead()
1520 } /* else no valid buffer on return - leave as null */ in CIFSSMBRead()
1522 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRead()
1532 int rc = -EACCES; in CIFSSMBWrite()
1538 __u32 pid = io_parms->pid; in CIFSSMBWrite()
1539 __u16 netfid = io_parms->netfid; in CIFSSMBWrite()
1540 __u64 offset = io_parms->offset; in CIFSSMBWrite()
1541 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite() local
1542 unsigned int count = io_parms->length; in CIFSSMBWrite()
1547 if (tcon->ses == NULL) in CIFSSMBWrite()
1548 return -ECONNABORTED; in CIFSSMBWrite()
1550 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBWrite()
1556 return -EIO; in CIFSSMBWrite()
1560 rc = smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB, in CIFSSMBWrite()
1565 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite()
1566 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite()
1568 /* tcon and ses pointer are checked in smb_init */ in CIFSSMBWrite()
1569 if (tcon->ses->server == NULL) in CIFSSMBWrite()
1570 return -ECONNABORTED; in CIFSSMBWrite()
1572 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite()
1573 pSMB->Fid = netfid; in CIFSSMBWrite()
1574 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite()
1576 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite()
1578 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite()
1579 pSMB->WriteMode = 0; in CIFSSMBWrite()
1580 pSMB->Remaining = 0; in CIFSSMBWrite()
1586 if (tcon->ses->capabilities & CAP_LARGE_WRITE_X) { in CIFSSMBWrite()
1589 bytes_sent = (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) in CIFSSMBWrite()
1595 pSMB->DataOffset = in CIFSSMBWrite()
1596 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite()
1598 memcpy(pSMB->Data, buf, bytes_sent); in CIFSSMBWrite()
1602 return -EINVAL; in CIFSSMBWrite()
1609 pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); in CIFSSMBWrite()
1610 pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); in CIFSSMBWrite()
1614 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1619 pSMBW->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1622 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBWrite()
1624 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite()
1628 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite()
1630 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite()
1643 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite()
1656 struct cifs_io_subrequest *wdata = mid->callback_data; in cifs_writev_callback()
1657 struct TCP_Server_Info *server = wdata->server; in cifs_writev_callback()
1658 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); in cifs_writev_callback() local
1659 WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; in cifs_writev_callback()
1663 .rreq_debug_id = wdata->rreq->debug_id, in cifs_writev_callback()
1664 .rreq_debug_index = wdata->subreq.debug_index, in cifs_writev_callback()
1669 switch (mid->mid_state) { in cifs_writev_callback()
1671 result = cifs_check_receive(mid, tcon->ses->server, 0); in cifs_writev_callback()
1675 written = le16_to_cpu(smb->CountHigh); in cifs_writev_callback()
1677 written += le16_to_cpu(smb->Count); in cifs_writev_callback()
1684 if (written > wdata->subreq.len) in cifs_writev_callback()
1687 if (written < wdata->subreq.len) { in cifs_writev_callback()
1688 result = -ENOSPC; in cifs_writev_callback()
1692 __set_bit(NETFS_SREQ_MADE_PROGRESS, &wdata->subreq.flags); in cifs_writev_callback()
1697 result = -EAGAIN; in cifs_writev_callback()
1700 result = -EIO; in cifs_writev_callback()
1705 wdata->credits.value, in cifs_writev_callback()
1706 server->credits, server->in_flight, in cifs_writev_callback()
1708 wdata->credits.value = 0; in cifs_writev_callback()
1712 server->credits, server->in_flight, in cifs_writev_callback()
1714 add_credits(tcon->ses->server, &credits, 0); in cifs_writev_callback()
1717 /* cifs_async_writev - send an async write, and set up mid to handle result */
1721 int rc = -EACCES; in cifs_async_writev()
1724 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); in cifs_async_writev() local
1728 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in cifs_async_writev()
1732 if (wdata->subreq.start >> 32 > 0) { in cifs_async_writev()
1734 rc = -EIO; in cifs_async_writev()
1739 rc = small_smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **)&smb); in cifs_async_writev()
1743 smb->hdr.Pid = cpu_to_le16((__u16)wdata->req->pid); in cifs_async_writev()
1744 smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->req->pid >> 16)); in cifs_async_writev()
1746 smb->AndXCommand = 0xFF; /* none */ in cifs_async_writev()
1747 smb->Fid = wdata->req->cfile->fid.netfid; in cifs_async_writev()
1748 smb->OffsetLow = cpu_to_le32(wdata->subreq.start & 0xFFFFFFFF); in cifs_async_writev()
1750 smb->OffsetHigh = cpu_to_le32(wdata->subreq.start >> 32); in cifs_async_writev()
1751 smb->Reserved = 0xFFFFFFFF; in cifs_async_writev()
1752 smb->WriteMode = 0; in cifs_async_writev()
1753 smb->Remaining = 0; in cifs_async_writev()
1755 smb->DataOffset = in cifs_async_writev()
1756 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in cifs_async_writev()
1766 rqst.rq_iter = wdata->subreq.io_iter; in cifs_async_writev()
1769 wdata->subreq.start, wdata->subreq.len); in cifs_async_writev()
1771 smb->DataLengthLow = cpu_to_le16(wdata->subreq.len & 0xFFFF); in cifs_async_writev()
1772 smb->DataLengthHigh = cpu_to_le16(wdata->subreq.len >> 16); in cifs_async_writev()
1775 inc_rfc1001_len(&smb->hdr, wdata->subreq.len + 1); in cifs_async_writev()
1776 put_bcc(wdata->subreq.len + 1, &smb->hdr); in cifs_async_writev()
1781 inc_rfc1001_len(&smbw->hdr, wdata->subreq.len + 5); in cifs_async_writev()
1782 put_bcc(wdata->subreq.len + 5, &smbw->hdr); in cifs_async_writev()
1786 rc = cifs_call_async(tcon->ses->server, &rqst, NULL, in cifs_async_writev()
1790 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in cifs_async_writev()
1796 add_credits_and_wake_if(wdata->server, &wdata->credits, 0); in cifs_async_writev()
1810 __u32 pid = io_parms->pid; in CIFSSMBWrite2()
1811 __u16 netfid = io_parms->netfid; in CIFSSMBWrite2()
1812 __u64 offset = io_parms->offset; in CIFSSMBWrite2()
1813 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite2() local
1814 unsigned int count = io_parms->length; in CIFSSMBWrite2()
1821 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in CIFSSMBWrite2()
1827 return -EIO; in CIFSSMBWrite2()
1830 rc = small_smb_init(SMB_COM_WRITE_ANDX, wct, tcon, (void **) &pSMB); in CIFSSMBWrite2()
1834 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite2()
1835 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite2()
1837 /* tcon and ses pointer are checked in smb_init */ in CIFSSMBWrite2()
1838 if (tcon->ses->server == NULL) in CIFSSMBWrite2()
1839 return -ECONNABORTED; in CIFSSMBWrite2()
1841 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite2()
1842 pSMB->Fid = netfid; in CIFSSMBWrite2()
1843 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite2()
1845 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite2()
1846 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite2()
1847 pSMB->WriteMode = 0; in CIFSSMBWrite2()
1848 pSMB->Remaining = 0; in CIFSSMBWrite2()
1850 pSMB->DataOffset = in CIFSSMBWrite2()
1851 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite2()
1853 pSMB->DataLengthLow = cpu_to_le16(count & 0xFFFF); in CIFSSMBWrite2()
1854 pSMB->DataLengthHigh = cpu_to_le16(count >> 16); in CIFSSMBWrite2()
1856 smb_hdr_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 1; in CIFSSMBWrite2()
1862 pSMB->ByteCount = cpu_to_le16(count + 1); in CIFSSMBWrite2()
1866 pSMBW->ByteCount = cpu_to_le16(count + 5); in CIFSSMBWrite2()
1874 rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0, in CIFSSMBWrite2()
1877 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite2()
1882 rc = -EIO; in CIFSSMBWrite2()
1885 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite2()
1887 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite2()
1900 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite2()
1906 int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon, in cifs_lockv() argument
1920 rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB); in cifs_lockv()
1924 pSMB->Timeout = 0; in cifs_lockv()
1925 pSMB->NumberOfLocks = cpu_to_le16(num_lock); in cifs_lockv()
1926 pSMB->NumberOfUnlocks = cpu_to_le16(num_unlock); in cifs_lockv()
1927 pSMB->LockType = lock_type; in cifs_lockv()
1928 pSMB->AndXCommand = 0xFF; /* none */ in cifs_lockv()
1929 pSMB->Fid = netfid; /* netfid stays le */ in cifs_lockv()
1933 pSMB->ByteCount = cpu_to_le16(count); in cifs_lockv()
1936 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4 - in cifs_lockv()
1941 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in cifs_lockv()
1942 rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, in cifs_lockv()
1952 CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBLock() argument
1967 rc = small_smb_init(SMB_COM_LOCKING_ANDX, 8, tcon, (void **) &pSMB); in CIFSSMBLock()
1975 pSMB->Timeout = 0; in CIFSSMBLock()
1978 pSMB->Timeout = cpu_to_le32(-1);/* blocking - do not time out */ in CIFSSMBLock()
1980 pSMB->Timeout = 0; in CIFSSMBLock()
1983 pSMB->NumberOfLocks = cpu_to_le16(numLock); in CIFSSMBLock()
1984 pSMB->NumberOfUnlocks = cpu_to_le16(numUnlock); in CIFSSMBLock()
1985 pSMB->LockType = lockType; in CIFSSMBLock()
1986 pSMB->OplockLevel = oplock_level; in CIFSSMBLock()
1987 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBLock()
1988 pSMB->Fid = smb_file_id; /* netfid stays le */ in CIFSSMBLock()
1991 pSMB->Locks[0].Pid = cpu_to_le16(netpid); in CIFSSMBLock()
1993 pSMB->Locks[0].LengthLow = cpu_to_le32((u32)len); in CIFSSMBLock()
1994 pSMB->Locks[0].LengthHigh = cpu_to_le32((u32)(len>>32)); in CIFSSMBLock()
1995 pSMB->Locks[0].OffsetLow = cpu_to_le32((u32)offset); in CIFSSMBLock()
1996 pSMB->Locks[0].OffsetHigh = cpu_to_le32((u32)(offset>>32)); in CIFSSMBLock()
2003 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBLock()
2006 rc = SendReceiveBlockingLock(xid, tcon, (struct smb_hdr *) pSMB, in CIFSSMBLock()
2009 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)pSMB, flags); in CIFSSMBLock()
2011 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in CIFSSMBLock()
2015 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBLock()
2021 CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBPosixLock() argument
2040 rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); in CIFSSMBPosixLock()
2048 pSMB->MaxSetupCount = 0; in CIFSSMBPosixLock()
2049 pSMB->Reserved = 0; in CIFSSMBPosixLock()
2050 pSMB->Flags = 0; in CIFSSMBPosixLock()
2051 pSMB->Reserved2 = 0; in CIFSSMBPosixLock()
2052 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBPosixLock()
2056 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBPosixLock()
2057 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBPosixLock()
2058 pSMB->SetupCount = 1; in CIFSSMBPosixLock()
2059 pSMB->Reserved3 = 0; in CIFSSMBPosixLock()
2061 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBPosixLock()
2063 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBPosixLock()
2065 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBPosixLock()
2066 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBPosixLock()
2067 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBPosixLock()
2068 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBPosixLock()
2069 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBPosixLock()
2074 parm_data->lock_type = cpu_to_le16(lock_type); in CIFSSMBPosixLock()
2077 parm_data->lock_flags = cpu_to_le16(1); in CIFSSMBPosixLock()
2078 pSMB->Timeout = cpu_to_le32(-1); in CIFSSMBPosixLock()
2080 pSMB->Timeout = 0; in CIFSSMBPosixLock()
2082 parm_data->pid = cpu_to_le32(netpid); in CIFSSMBPosixLock()
2083 parm_data->start = cpu_to_le64(start_offset); in CIFSSMBPosixLock()
2084 parm_data->length = cpu_to_le64(len); /* normalize negative numbers */ in CIFSSMBPosixLock()
2086 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBPosixLock()
2087 pSMB->Fid = smb_file_id; in CIFSSMBPosixLock()
2088 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_LOCK); in CIFSSMBPosixLock()
2089 pSMB->Reserved4 = 0; in CIFSSMBPosixLock()
2091 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBPosixLock()
2093 rc = SendReceiveBlockingLock(xid, tcon, (struct smb_hdr *) pSMB, in CIFSSMBPosixLock()
2097 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBPosixLock()
2098 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */, in CIFSSMBPosixLock()
2112 if (rc || get_bcc(&pSMBr->hdr) < sizeof(*parm_data)) { in CIFSSMBPosixLock()
2113 rc = -EIO; /* bad smb */ in CIFSSMBPosixLock()
2116 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBPosixLock()
2117 data_count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBPosixLock()
2119 rc = -EIO; in CIFSSMBPosixLock()
2123 ((char *)&pSMBr->hdr.Protocol + data_offset); in CIFSSMBPosixLock()
2124 if (parm_data->lock_type == cpu_to_le16(CIFS_UNLCK)) in CIFSSMBPosixLock()
2125 pLockData->c.flc_type = F_UNLCK; in CIFSSMBPosixLock()
2127 if (parm_data->lock_type == in CIFSSMBPosixLock()
2129 pLockData->c.flc_type = F_RDLCK; in CIFSSMBPosixLock()
2130 else if (parm_data->lock_type == in CIFSSMBPosixLock()
2132 pLockData->c.flc_type = F_WRLCK; in CIFSSMBPosixLock()
2134 pLockData->fl_start = le64_to_cpu(parm_data->start); in CIFSSMBPosixLock()
2135 pLockData->fl_end = pLockData->fl_start + in CIFSSMBPosixLock()
2136 (le64_to_cpu(parm_data->length) ? in CIFSSMBPosixLock()
2137 le64_to_cpu(parm_data->length) - 1 : 0); in CIFSSMBPosixLock()
2138 pLockData->c.flc_pid = -le32_to_cpu(parm_data->pid); in CIFSSMBPosixLock()
2145 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBPosixLock()
2153 CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon, int smb_file_id) in CIFSSMBClose() argument
2160 rc = small_smb_init(SMB_COM_CLOSE, 3, tcon, (void **) &pSMB); in CIFSSMBClose()
2161 if (rc == -EAGAIN) in CIFSSMBClose()
2166 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBClose()
2167 pSMB->LastWriteTime = 0xFFFFFFFF; in CIFSSMBClose()
2168 pSMB->ByteCount = 0; in CIFSSMBClose()
2169 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBClose()
2171 cifs_stats_inc(&tcon->stats.cifs_stats.num_closes); in CIFSSMBClose()
2173 if (rc != -EINTR) { in CIFSSMBClose()
2174 /* EINTR is expected when user ctl-c to kill app */ in CIFSSMBClose()
2180 if (rc == -EAGAIN) in CIFSSMBClose()
2187 CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon, int smb_file_id) in CIFSSMBFlush() argument
2193 rc = small_smb_init(SMB_COM_FLUSH, 1, tcon, (void **) &pSMB); in CIFSSMBFlush()
2197 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBFlush()
2198 pSMB->ByteCount = 0; in CIFSSMBFlush()
2199 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBFlush()
2201 cifs_stats_inc(&tcon->stats.cifs_stats.num_flushes); in CIFSSMBFlush()
2208 int CIFSSMBRename(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBRename() argument
2223 rc = smb_init(SMB_COM_RENAME, 1, tcon, (void **) &pSMB, in CIFSSMBRename()
2228 pSMB->BufferFormat = 0x04; in CIFSSMBRename()
2229 pSMB->SearchAttributes = in CIFSSMBRename()
2233 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRename()
2234 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBRename()
2236 cifs_sb->local_nls, remap); in CIFSSMBRename()
2239 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBRename()
2241 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBRename()
2243 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBRename()
2244 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSSMBRename()
2249 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSSMBRename()
2250 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSSMBRename()
2251 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBRename()
2257 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBRename()
2259 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRename()
2261 cifs_stats_inc(&tcon->stats.cifs_stats.num_renames); in CIFSSMBRename()
2267 if (rc == -EAGAIN) in CIFSSMBRename()
2294 pSMB->MaxSetupCount = 0; in CIFSSMBRenameOpenFile()
2295 pSMB->Reserved = 0; in CIFSSMBRenameOpenFile()
2296 pSMB->Flags = 0; in CIFSSMBRenameOpenFile()
2297 pSMB->Timeout = 0; in CIFSSMBRenameOpenFile()
2298 pSMB->Reserved2 = 0; in CIFSSMBRenameOpenFile()
2299 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBRenameOpenFile()
2305 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBRenameOpenFile()
2306 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBRenameOpenFile()
2307 pSMB->SetupCount = 1; in CIFSSMBRenameOpenFile()
2308 pSMB->Reserved3 = 0; in CIFSSMBRenameOpenFile()
2309 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBRenameOpenFile()
2311 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBRenameOpenFile()
2312 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBRenameOpenFile()
2313 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBRenameOpenFile()
2314 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBRenameOpenFile()
2316 rename_info->overwrite = cpu_to_le32(1); in CIFSSMBRenameOpenFile()
2317 rename_info->root_fid = 0; in CIFSSMBRenameOpenFile()
2320 sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); in CIFSSMBRenameOpenFile()
2322 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2326 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2330 rename_info->target_name_len = cpu_to_le32(2 * len_of_str); in CIFSSMBRenameOpenFile()
2333 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBRenameOpenFile()
2334 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBRenameOpenFile()
2335 pSMB->Fid = netfid; in CIFSSMBRenameOpenFile()
2336 pSMB->InformationLevel = in CIFSSMBRenameOpenFile()
2338 pSMB->Reserved4 = 0; in CIFSSMBRenameOpenFile()
2340 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBRenameOpenFile()
2341 rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRenameOpenFile()
2343 cifs_stats_inc(&pTcon->stats.cifs_stats.num_t2renames); in CIFSSMBRenameOpenFile()
2350 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRenameOpenFile()
2357 CIFSUnixCreateSymLink(const unsigned int xid, struct cifs_tcon *tcon, in CIFSUnixCreateSymLink() argument
2372 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSUnixCreateSymLink()
2377 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2379 cifsConvertToUTF16((__le16 *) pSMB->FileName, fromName, in CIFSUnixCreateSymLink()
2386 name_len = copy_path_name(pSMB->FileName, fromName); in CIFSUnixCreateSymLink()
2389 pSMB->MaxSetupCount = 0; in CIFSUnixCreateSymLink()
2390 pSMB->Reserved = 0; in CIFSUnixCreateSymLink()
2391 pSMB->Flags = 0; in CIFSUnixCreateSymLink()
2392 pSMB->Timeout = 0; in CIFSUnixCreateSymLink()
2393 pSMB->Reserved2 = 0; in CIFSUnixCreateSymLink()
2395 InformationLevel) - 4; in CIFSUnixCreateSymLink()
2400 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2411 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateSymLink()
2413 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateSymLink()
2414 pSMB->SetupCount = 1; in CIFSUnixCreateSymLink()
2415 pSMB->Reserved3 = 0; in CIFSUnixCreateSymLink()
2416 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateSymLink()
2418 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateSymLink()
2419 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateSymLink()
2420 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateSymLink()
2421 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateSymLink()
2422 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateSymLink()
2423 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateSymLink()
2424 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_LINK); in CIFSUnixCreateSymLink()
2425 pSMB->Reserved4 = 0; in CIFSUnixCreateSymLink()
2427 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateSymLink()
2428 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateSymLink()
2430 cifs_stats_inc(&tcon->stats.cifs_stats.num_symlinks); in CIFSUnixCreateSymLink()
2437 if (rc == -EAGAIN) in CIFSUnixCreateSymLink()
2444 CIFSUnixCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon, in CIFSUnixCreateHardLink() argument
2459 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSUnixCreateHardLink()
2464 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2465 name_len = cifsConvertToUTF16((__le16 *) pSMB->FileName, toName, in CIFSUnixCreateHardLink()
2471 name_len = copy_path_name(pSMB->FileName, toName); in CIFSUnixCreateHardLink()
2474 pSMB->MaxSetupCount = 0; in CIFSUnixCreateHardLink()
2475 pSMB->Reserved = 0; in CIFSUnixCreateHardLink()
2476 pSMB->Flags = 0; in CIFSUnixCreateHardLink()
2477 pSMB->Timeout = 0; in CIFSUnixCreateHardLink()
2478 pSMB->Reserved2 = 0; in CIFSUnixCreateHardLink()
2480 InformationLevel) - 4; in CIFSUnixCreateHardLink()
2485 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2495 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateHardLink()
2497 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateHardLink()
2498 pSMB->SetupCount = 1; in CIFSUnixCreateHardLink()
2499 pSMB->Reserved3 = 0; in CIFSUnixCreateHardLink()
2500 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateHardLink()
2502 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateHardLink()
2503 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateHardLink()
2504 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateHardLink()
2505 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateHardLink()
2506 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateHardLink()
2507 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateHardLink()
2508 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_HLINK); in CIFSUnixCreateHardLink()
2509 pSMB->Reserved4 = 0; in CIFSUnixCreateHardLink()
2511 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateHardLink()
2512 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateHardLink()
2514 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSUnixCreateHardLink()
2520 if (rc == -EAGAIN) in CIFSUnixCreateHardLink()
2527 struct cifs_tcon *tcon, in CIFSCreateHardLink() argument
2543 rc = smb_init(SMB_COM_NT_RENAME, 4, tcon, (void **) &pSMB, in CIFSCreateHardLink()
2548 pSMB->SearchAttributes = in CIFSCreateHardLink()
2551 pSMB->Flags = cpu_to_le16(CREATE_HARD_LINK); in CIFSCreateHardLink()
2552 pSMB->ClusterCount = 0; in CIFSCreateHardLink()
2554 pSMB->BufferFormat = 0x04; in CIFSCreateHardLink()
2556 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSCreateHardLink()
2558 cifsConvertToUTF16((__le16 *) pSMB->OldFileName, from_name, in CIFSCreateHardLink()
2559 PATH_MAX, cifs_sb->local_nls, remap); in CIFSCreateHardLink()
2564 pSMB->OldFileName[name_len] = 0x04; in CIFSCreateHardLink()
2565 pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ in CIFSCreateHardLink()
2567 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSCreateHardLink()
2568 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSCreateHardLink()
2573 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSCreateHardLink()
2574 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSCreateHardLink()
2575 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSCreateHardLink()
2581 pSMB->ByteCount = cpu_to_le16(count); in CIFSCreateHardLink()
2583 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSCreateHardLink()
2585 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSCreateHardLink()
2590 if (rc == -EAGAIN) in CIFSCreateHardLink()
2597 CIFSSMBUnixQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBUnixQuerySymLink() argument
2613 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBUnixQuerySymLink()
2618 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQuerySymLink()
2620 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSSMBUnixQuerySymLink()
2626 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQuerySymLink()
2630 pSMB->TotalDataCount = 0; in CIFSSMBUnixQuerySymLink()
2631 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQuerySymLink()
2632 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQuerySymLink()
2633 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQuerySymLink()
2634 pSMB->Reserved = 0; in CIFSSMBUnixQuerySymLink()
2635 pSMB->Flags = 0; in CIFSSMBUnixQuerySymLink()
2636 pSMB->Timeout = 0; in CIFSSMBUnixQuerySymLink()
2637 pSMB->Reserved2 = 0; in CIFSSMBUnixQuerySymLink()
2638 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQuerySymLink()
2639 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQuerySymLink()
2640 pSMB->DataCount = 0; in CIFSSMBUnixQuerySymLink()
2641 pSMB->DataOffset = 0; in CIFSSMBUnixQuerySymLink()
2642 pSMB->SetupCount = 1; in CIFSSMBUnixQuerySymLink()
2643 pSMB->Reserved3 = 0; in CIFSSMBUnixQuerySymLink()
2644 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQuerySymLink()
2646 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQuerySymLink()
2647 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQuerySymLink()
2648 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_LINK); in CIFSSMBUnixQuerySymLink()
2649 pSMB->Reserved4 = 0; in CIFSSMBUnixQuerySymLink()
2651 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQuerySymLink()
2653 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQuerySymLink()
2662 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSSMBUnixQuerySymLink()
2663 rc = -EIO; in CIFSSMBUnixQuerySymLink()
2666 u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBUnixQuerySymLink()
2668 data_start = ((char *) &pSMBr->hdr.Protocol) + in CIFSSMBUnixQuerySymLink()
2669 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQuerySymLink()
2671 if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) in CIFSSMBUnixQuerySymLink()
2680 rc = -ENOMEM; in CIFSSMBUnixQuerySymLink()
2684 if (rc == -EAGAIN) in CIFSSMBUnixQuerySymLink()
2690 struct cifs_tcon *tcon, in cifs_query_reparse_point() argument
2709 if (cap_unix(tcon->ses)) in cifs_query_reparse_point()
2710 return -EOPNOTSUPP; in cifs_query_reparse_point()
2713 .tcon = tcon, in cifs_query_reparse_point()
2727 rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, in cifs_query_reparse_point()
2732 io_req->TotalParameterCount = 0; in cifs_query_reparse_point()
2733 io_req->TotalDataCount = 0; in cifs_query_reparse_point()
2734 io_req->MaxParameterCount = cpu_to_le32(2); in cifs_query_reparse_point()
2736 io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in cifs_query_reparse_point()
2737 io_req->MaxSetupCount = 4; in cifs_query_reparse_point()
2738 io_req->Reserved = 0; in cifs_query_reparse_point()
2739 io_req->ParameterOffset = 0; in cifs_query_reparse_point()
2740 io_req->DataCount = 0; in cifs_query_reparse_point()
2741 io_req->DataOffset = 0; in cifs_query_reparse_point()
2742 io_req->SetupCount = 4; in cifs_query_reparse_point()
2743 io_req->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in cifs_query_reparse_point()
2744 io_req->ParameterCount = io_req->TotalParameterCount; in cifs_query_reparse_point()
2745 io_req->FunctionCode = cpu_to_le32(FSCTL_GET_REPARSE_POINT); in cifs_query_reparse_point()
2746 io_req->IsFsctl = 1; in cifs_query_reparse_point()
2747 io_req->IsRootFlag = 0; in cifs_query_reparse_point()
2748 io_req->Fid = fid.netfid; in cifs_query_reparse_point()
2749 io_req->ByteCount = 0; in cifs_query_reparse_point()
2751 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)io_req, in cifs_query_reparse_point()
2756 data_offset = le32_to_cpu(io_rsp->DataOffset); in cifs_query_reparse_point()
2757 data_count = le32_to_cpu(io_rsp->DataCount); in cifs_query_reparse_point()
2758 if (get_bcc(&io_rsp->hdr) < 2 || data_offset > 512 || in cifs_query_reparse_point()
2760 rc = -EIO; in cifs_query_reparse_point()
2764 end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; in cifs_query_reparse_point()
2765 start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; in cifs_query_reparse_point()
2767 rc = -EIO; in cifs_query_reparse_point()
2771 data_count = le16_to_cpu(io_rsp->ByteCount); in cifs_query_reparse_point()
2775 data_count < le16_to_cpu(buf->ReparseDataLength) + len) { in cifs_query_reparse_point()
2776 rc = -EIO; in cifs_query_reparse_point()
2780 *tag = le32_to_cpu(buf->ReparseTag); in cifs_query_reparse_point()
2781 rsp->iov_base = io_rsp; in cifs_query_reparse_point()
2782 rsp->iov_len = io_rsp_len; in cifs_query_reparse_point()
2784 CIFSSMBClose(xid, tcon, fid.netfid); in cifs_query_reparse_point()
2789 CIFSSMBClose(xid, tcon, fid.netfid); in cifs_query_reparse_point()
2794 CIFSSMB_set_compression(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMB_set_compression() argument
2803 rc = smb_init(SMB_COM_NT_TRANSACT, 23, tcon, (void **) &pSMB, in CIFSSMB_set_compression()
2808 pSMB->compression_state = cpu_to_le16(COMPRESSION_FORMAT_DEFAULT); in CIFSSMB_set_compression()
2810 pSMB->TotalParameterCount = 0; in CIFSSMB_set_compression()
2811 pSMB->TotalDataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2812 pSMB->MaxParameterCount = 0; in CIFSSMB_set_compression()
2813 pSMB->MaxDataCount = 0; in CIFSSMB_set_compression()
2814 pSMB->MaxSetupCount = 4; in CIFSSMB_set_compression()
2815 pSMB->Reserved = 0; in CIFSSMB_set_compression()
2816 pSMB->ParameterOffset = 0; in CIFSSMB_set_compression()
2817 pSMB->DataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2818 pSMB->DataOffset = in CIFSSMB_set_compression()
2820 compression_state) - 4); /* 84 */ in CIFSSMB_set_compression()
2821 pSMB->SetupCount = 4; in CIFSSMB_set_compression()
2822 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in CIFSSMB_set_compression()
2823 pSMB->ParameterCount = 0; in CIFSSMB_set_compression()
2824 pSMB->FunctionCode = cpu_to_le32(FSCTL_SET_COMPRESSION); in CIFSSMB_set_compression()
2825 pSMB->IsFsctl = 1; /* FSCTL */ in CIFSSMB_set_compression()
2826 pSMB->IsRootFlag = 0; in CIFSSMB_set_compression()
2827 pSMB->Fid = fid; /* file handle always le */ in CIFSSMB_set_compression()
2829 pSMB->ByteCount = cpu_to_le16(5); in CIFSSMB_set_compression()
2832 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMB_set_compression()
2840 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMB_set_compression()
2851 * cifs_init_posix_acl - convert ACL from cifs to POSIX ACL format
2864 ace->e_perm = cifs_ace->cifs_e_perm; in cifs_init_posix_acl()
2865 ace->e_tag = cifs_ace->cifs_e_tag; in cifs_init_posix_acl()
2867 switch (ace->e_tag) { in cifs_init_posix_acl()
2869 ace->e_uid = make_kuid(&init_user_ns, in cifs_init_posix_acl()
2870 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2873 ace->e_gid = make_kgid(&init_user_ns, in cifs_init_posix_acl()
2874 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2881 * cifs_to_posix_acl - copy cifs ACL format to POSIX ACL format
2901 if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION) in cifs_to_posix_acl()
2902 return -EOPNOTSUPP; in cifs_to_posix_acl()
2905 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2906 pACE = &cifs_acl->ace_array[0]; in cifs_to_posix_acl()
2913 return -EINVAL; in cifs_to_posix_acl()
2916 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2920 pACE = &cifs_acl->ace_array[count]; in cifs_to_posix_acl()
2921 count = le16_to_cpu(cifs_acl->default_entry_count); in cifs_to_posix_acl()
2925 return -EINVAL; in cifs_to_posix_acl()
2928 return -EINVAL; in cifs_to_posix_acl()
2934 return -ENOMEM; in cifs_to_posix_acl()
2946 * cifs_init_ace - convert ACL entry from POSIX ACL to cifs format
2953 cifs_ace->cifs_e_perm = local_ace->e_perm; in cifs_init_ace()
2954 cifs_ace->cifs_e_tag = local_ace->e_tag; in cifs_init_ace()
2956 switch (local_ace->e_tag) { in cifs_init_ace()
2958 cifs_ace->cifs_uid = in cifs_init_ace()
2959 cpu_to_le64(from_kuid(&init_user_ns, local_ace->e_uid)); in cifs_init_ace()
2962 cifs_ace->cifs_uid = in cifs_init_ace()
2963 cpu_to_le64(from_kgid(&init_user_ns, local_ace->e_gid)); in cifs_init_ace()
2966 cifs_ace->cifs_uid = cpu_to_le64(-1); in cifs_init_ace()
2971 * posix_acl_to_cifs - convert ACLs from POSIX ACL to cifs format
2990 count = acl->a_count; in posix_acl_to_cifs()
3000 cifs_acl->version = cpu_to_le16(1); in posix_acl_to_cifs()
3002 cifs_acl->access_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3003 cifs_acl->default_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3005 cifs_acl->default_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3006 cifs_acl->access_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3012 cifs_init_ace(&cifs_acl->ace_array[i++], pa); in posix_acl_to_cifs()
3022 int cifs_do_get_acl(const unsigned int xid, struct cifs_tcon *tcon, in cifs_do_get_acl() argument
3038 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in cifs_do_get_acl()
3043 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_get_acl()
3045 cifsConvertToUTF16((__le16 *) pSMB->FileName, in cifs_do_get_acl()
3050 pSMB->FileName[name_len] = 0; in cifs_do_get_acl()
3051 pSMB->FileName[name_len+1] = 0; in cifs_do_get_acl()
3053 name_len = copy_path_name(pSMB->FileName, searchName); in cifs_do_get_acl()
3057 pSMB->TotalDataCount = 0; in cifs_do_get_acl()
3058 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_get_acl()
3060 pSMB->MaxDataCount = cpu_to_le16(4000); in cifs_do_get_acl()
3061 pSMB->MaxSetupCount = 0; in cifs_do_get_acl()
3062 pSMB->Reserved = 0; in cifs_do_get_acl()
3063 pSMB->Flags = 0; in cifs_do_get_acl()
3064 pSMB->Timeout = 0; in cifs_do_get_acl()
3065 pSMB->Reserved2 = 0; in cifs_do_get_acl()
3066 pSMB->ParameterOffset = cpu_to_le16( in cifs_do_get_acl()
3068 InformationLevel) - 4); in cifs_do_get_acl()
3069 pSMB->DataCount = 0; in cifs_do_get_acl()
3070 pSMB->DataOffset = 0; in cifs_do_get_acl()
3071 pSMB->SetupCount = 1; in cifs_do_get_acl()
3072 pSMB->Reserved3 = 0; in cifs_do_get_acl()
3073 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in cifs_do_get_acl()
3075 pSMB->TotalParameterCount = cpu_to_le16(params); in cifs_do_get_acl()
3076 pSMB->ParameterCount = pSMB->TotalParameterCount; in cifs_do_get_acl()
3077 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_ACL); in cifs_do_get_acl()
3078 pSMB->Reserved4 = 0; in cifs_do_get_acl()
3080 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_get_acl()
3082 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_get_acl()
3084 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in cifs_do_get_acl()
3092 if (rc || get_bcc(&pSMBr->hdr) < 2) in cifs_do_get_acl()
3093 rc = -EIO; /* bad smb */ in cifs_do_get_acl()
3095 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in cifs_do_get_acl()
3096 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in cifs_do_get_acl()
3098 (char *)&pSMBr->hdr.Protocol+data_offset, in cifs_do_get_acl()
3108 if (rc == -EAGAIN) in cifs_do_get_acl()
3113 int cifs_do_set_acl(const unsigned int xid, struct cifs_tcon *tcon, in cifs_do_set_acl() argument
3128 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in cifs_do_set_acl()
3132 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_set_acl()
3134 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in cifs_do_set_acl()
3139 name_len = copy_path_name(pSMB->FileName, fileName); in cifs_do_set_acl()
3142 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_set_acl()
3144 pSMB->MaxDataCount = cpu_to_le16(1000); in cifs_do_set_acl()
3145 pSMB->MaxSetupCount = 0; in cifs_do_set_acl()
3146 pSMB->Reserved = 0; in cifs_do_set_acl()
3147 pSMB->Flags = 0; in cifs_do_set_acl()
3148 pSMB->Timeout = 0; in cifs_do_set_acl()
3149 pSMB->Reserved2 = 0; in cifs_do_set_acl()
3151 InformationLevel) - 4; in cifs_do_set_acl()
3153 parm_data = ((char *)pSMB) + sizeof(pSMB->hdr.smb_buf_length) + offset; in cifs_do_set_acl()
3154 pSMB->ParameterOffset = cpu_to_le16(param_offset); in cifs_do_set_acl()
3160 rc = -EOPNOTSUPP; in cifs_do_set_acl()
3163 pSMB->DataOffset = cpu_to_le16(offset); in cifs_do_set_acl()
3164 pSMB->SetupCount = 1; in cifs_do_set_acl()
3165 pSMB->Reserved3 = 0; in cifs_do_set_acl()
3166 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in cifs_do_set_acl()
3167 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_ACL); in cifs_do_set_acl()
3169 pSMB->DataCount = cpu_to_le16(data_count); in cifs_do_set_acl()
3170 pSMB->TotalDataCount = pSMB->DataCount; in cifs_do_set_acl()
3171 pSMB->ParameterCount = cpu_to_le16(params); in cifs_do_set_acl()
3172 pSMB->TotalParameterCount = pSMB->ParameterCount; in cifs_do_set_acl()
3173 pSMB->Reserved4 = 0; in cifs_do_set_acl()
3175 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_set_acl()
3176 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_set_acl()
3183 if (rc == -EAGAIN) in cifs_do_set_acl()
3188 int cifs_do_get_acl(const unsigned int xid, struct cifs_tcon *tcon, in cifs_do_get_acl() argument
3193 return -EOPNOTSUPP; in cifs_do_get_acl()
3196 int cifs_do_set_acl(const unsigned int xid, struct cifs_tcon *tcon, in cifs_do_set_acl() argument
3201 return -EOPNOTSUPP; in cifs_do_set_acl()
3206 CIFSGetExtAttr(const unsigned int xid, struct cifs_tcon *tcon, in CIFSGetExtAttr() argument
3216 if (tcon == NULL) in CIFSGetExtAttr()
3217 return -ENODEV; in CIFSGetExtAttr()
3220 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSGetExtAttr()
3226 pSMB->t2.TotalDataCount = 0; in CIFSGetExtAttr()
3227 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSGetExtAttr()
3229 pSMB->t2.MaxDataCount = cpu_to_le16(4000); in CIFSGetExtAttr()
3230 pSMB->t2.MaxSetupCount = 0; in CIFSGetExtAttr()
3231 pSMB->t2.Reserved = 0; in CIFSGetExtAttr()
3232 pSMB->t2.Flags = 0; in CIFSGetExtAttr()
3233 pSMB->t2.Timeout = 0; in CIFSGetExtAttr()
3234 pSMB->t2.Reserved2 = 0; in CIFSGetExtAttr()
3235 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSGetExtAttr()
3236 Fid) - 4); in CIFSGetExtAttr()
3237 pSMB->t2.DataCount = 0; in CIFSGetExtAttr()
3238 pSMB->t2.DataOffset = 0; in CIFSGetExtAttr()
3239 pSMB->t2.SetupCount = 1; in CIFSGetExtAttr()
3240 pSMB->t2.Reserved3 = 0; in CIFSGetExtAttr()
3241 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSGetExtAttr()
3243 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSGetExtAttr()
3244 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSGetExtAttr()
3245 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_ATTR_FLAGS); in CIFSGetExtAttr()
3246 pSMB->Pad = 0; in CIFSGetExtAttr()
3247 pSMB->Fid = netfid; in CIFSGetExtAttr()
3249 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSGetExtAttr()
3251 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetExtAttr()
3259 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetExtAttr()
3262 rc = -EIO; /* bad smb */ in CIFSGetExtAttr()
3264 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetExtAttr()
3265 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetExtAttr()
3270 rc = -EIO; in CIFSGetExtAttr()
3274 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetExtAttr()
3275 *pExtAttrBits = le64_to_cpu(pfinfo->mode); in CIFSGetExtAttr()
3276 *pMask = le64_to_cpu(pfinfo->mask); in CIFSGetExtAttr()
3281 if (rc == -EAGAIN) in CIFSGetExtAttr()
3298 const int parm_len, struct cifs_tcon *tcon, in smb_init_nttransact() argument
3305 rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, in smb_init_nttransact()
3310 pSMB->Reserved = 0; in smb_init_nttransact()
3311 pSMB->TotalParameterCount = cpu_to_le32(parm_len); in smb_init_nttransact()
3312 pSMB->TotalDataCount = 0; in smb_init_nttransact()
3313 pSMB->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in smb_init_nttransact()
3314 pSMB->ParameterCount = pSMB->TotalParameterCount; in smb_init_nttransact()
3315 pSMB->DataCount = pSMB->TotalDataCount; in smb_init_nttransact()
3317 (setup_count * 2) - 4 /* for rfc1001 length itself */; in smb_init_nttransact()
3318 pSMB->ParameterOffset = cpu_to_le32(temp_offset); in smb_init_nttransact()
3319 pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); in smb_init_nttransact()
3320 pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ in smb_init_nttransact()
3321 pSMB->SubCommand = cpu_to_le16(sub_command); in smb_init_nttransact()
3338 return -EINVAL; in validate_ntransact()
3342 bcc = get_bcc(&pSMBr->hdr); in validate_ntransact()
3344 (char *)&pSMBr->ByteCount; in validate_ntransact()
3346 data_offset = le32_to_cpu(pSMBr->DataOffset); in validate_ntransact()
3347 data_count = le32_to_cpu(pSMBr->DataCount); in validate_ntransact()
3348 parm_offset = le32_to_cpu(pSMBr->ParameterOffset); in validate_ntransact()
3349 parm_count = le32_to_cpu(pSMBr->ParameterCount); in validate_ntransact()
3351 *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; in validate_ntransact()
3352 *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; in validate_ntransact()
3357 return -EINVAL; in validate_ntransact()
3360 return -EINVAL; in validate_ntransact()
3363 return -EINVAL; in validate_ntransact()
3368 return -EINVAL; in validate_ntransact()
3371 return -EINVAL; in validate_ntransact()
3380 CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid, in CIFSSMBGetCIFSACL() argument
3395 8 /* parm len */, tcon, (void **) &pSMB); in CIFSSMBGetCIFSACL()
3399 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBGetCIFSACL()
3401 pSMB->MaxSetupCount = 0; in CIFSSMBGetCIFSACL()
3402 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBGetCIFSACL()
3403 pSMB->AclFlags = cpu_to_le32(CIFS_ACL_OWNER | CIFS_ACL_GROUP | in CIFSSMBGetCIFSACL()
3405 pSMB->ByteCount = cpu_to_le16(11); /* 3 bytes pad + 8 bytes parm */ in CIFSSMBGetCIFSACL()
3408 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBGetCIFSACL()
3410 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type, in CIFSSMBGetCIFSACL()
3413 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in CIFSSMBGetCIFSACL()
3433 if (le32_to_cpu(pSMBr->ParameterCount) != 4) { in CIFSSMBGetCIFSACL()
3434 rc = -EIO; /* bad smb */ in CIFSSMBGetCIFSACL()
3454 rc = -EINVAL; in CIFSSMBGetCIFSACL()
3460 rc = -ENOMEM; in CIFSSMBGetCIFSACL()
3470 CIFSSMBSetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, __u16 fid, in CIFSSMBSetCIFSACL() argument
3480 rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, &pSMBr); in CIFSSMBSetCIFSACL()
3484 pSMB->MaxSetupCount = 0; in CIFSSMBSetCIFSACL()
3485 pSMB->Reserved = 0; in CIFSSMBSetCIFSACL()
3488 param_offset = offsetof(struct smb_com_transaction_ssec_req, Fid) - 4; in CIFSSMBSetCIFSACL()
3493 pSMB->DataCount = cpu_to_le32(data_count); in CIFSSMBSetCIFSACL()
3494 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetCIFSACL()
3495 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBSetCIFSACL()
3496 pSMB->MaxDataCount = cpu_to_le32(16384); in CIFSSMBSetCIFSACL()
3497 pSMB->ParameterCount = cpu_to_le32(param_count); in CIFSSMBSetCIFSACL()
3498 pSMB->ParameterOffset = cpu_to_le32(param_offset); in CIFSSMBSetCIFSACL()
3499 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetCIFSACL()
3500 pSMB->DataOffset = cpu_to_le32(data_offset); in CIFSSMBSetCIFSACL()
3501 pSMB->SetupCount = 0; in CIFSSMBSetCIFSACL()
3502 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_SET_SECURITY_DESC); in CIFSSMBSetCIFSACL()
3503 pSMB->ByteCount = cpu_to_le16(byte_count+data_count); in CIFSSMBSetCIFSACL()
3505 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBSetCIFSACL()
3506 pSMB->Reserved2 = 0; in CIFSSMBSetCIFSACL()
3507 pSMB->AclFlags = cpu_to_le32(aclflag); in CIFSSMBSetCIFSACL()
3516 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetCIFSACL()
3525 if (rc == -EAGAIN) in CIFSSMBSetCIFSACL()
3535 SMBQueryInformation(const unsigned int xid, struct cifs_tcon *tcon, in SMBQueryInformation() argument
3547 rc = smb_init(SMB_COM_QUERY_INFORMATION, 0, tcon, (void **) &pSMB, in SMBQueryInformation()
3552 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBQueryInformation()
3554 cifsConvertToUTF16((__le16 *) pSMB->FileName, in SMBQueryInformation()
3560 name_len = copy_path_name(pSMB->FileName, search_name); in SMBQueryInformation()
3562 pSMB->BufferFormat = 0x04; in SMBQueryInformation()
3565 pSMB->ByteCount = cpu_to_le16(name_len); in SMBQueryInformation()
3567 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBQueryInformation()
3573 __u32 time = le32_to_cpu(pSMBr->last_write_time); in SMBQueryInformation()
3576 /* BB FIXME - add time zone adjustment BB */ in SMBQueryInformation()
3581 data->ChangeTime = cpu_to_le64(cifs_UnixTimeToNT(ts)); in SMBQueryInformation()
3582 data->LastWriteTime = data->ChangeTime; in SMBQueryInformation()
3583 data->LastAccessTime = 0; in SMBQueryInformation()
3584 data->AllocationSize = in SMBQueryInformation()
3585 cpu_to_le64(le32_to_cpu(pSMBr->size)); in SMBQueryInformation()
3586 data->EndOfFile = data->AllocationSize; in SMBQueryInformation()
3587 data->Attributes = in SMBQueryInformation()
3588 cpu_to_le32(le16_to_cpu(pSMBr->attr)); in SMBQueryInformation()
3590 rc = -EIO; /* bad buffer passed in */ in SMBQueryInformation()
3594 if (rc == -EAGAIN) in SMBQueryInformation()
3601 CIFSSMBQFileInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBQFileInfo() argument
3611 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQFileInfo()
3617 pSMB->t2.TotalDataCount = 0; in CIFSSMBQFileInfo()
3618 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBQFileInfo()
3620 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQFileInfo()
3621 pSMB->t2.MaxSetupCount = 0; in CIFSSMBQFileInfo()
3622 pSMB->t2.Reserved = 0; in CIFSSMBQFileInfo()
3623 pSMB->t2.Flags = 0; in CIFSSMBQFileInfo()
3624 pSMB->t2.Timeout = 0; in CIFSSMBQFileInfo()
3625 pSMB->t2.Reserved2 = 0; in CIFSSMBQFileInfo()
3626 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBQFileInfo()
3627 Fid) - 4); in CIFSSMBQFileInfo()
3628 pSMB->t2.DataCount = 0; in CIFSSMBQFileInfo()
3629 pSMB->t2.DataOffset = 0; in CIFSSMBQFileInfo()
3630 pSMB->t2.SetupCount = 1; in CIFSSMBQFileInfo()
3631 pSMB->t2.Reserved3 = 0; in CIFSSMBQFileInfo()
3632 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBQFileInfo()
3634 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFileInfo()
3635 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBQFileInfo()
3636 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQFileInfo()
3637 pSMB->Pad = 0; in CIFSSMBQFileInfo()
3638 pSMB->Fid = netfid; in CIFSSMBQFileInfo()
3640 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFileInfo()
3642 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFileInfo()
3650 rc = -EIO; in CIFSSMBQFileInfo()
3651 else if (get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQFileInfo()
3652 rc = -EIO; /* bad smb */ in CIFSSMBQFileInfo()
3654 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFileInfo()
3656 (char *) &pSMBr->hdr.Protocol + in CIFSSMBQFileInfo()
3659 rc = -ENOMEM; in CIFSSMBQFileInfo()
3662 if (rc == -EAGAIN) in CIFSSMBQFileInfo()
3669 CIFSSMBQPathInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBQPathInfo() argument
3684 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQPathInfo()
3689 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQPathInfo()
3691 cifsConvertToUTF16((__le16 *) pSMB->FileName, search_name, in CIFSSMBQPathInfo()
3696 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSSMBQPathInfo()
3700 pSMB->TotalDataCount = 0; in CIFSSMBQPathInfo()
3701 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQPathInfo()
3703 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBQPathInfo()
3704 pSMB->MaxSetupCount = 0; in CIFSSMBQPathInfo()
3705 pSMB->Reserved = 0; in CIFSSMBQPathInfo()
3706 pSMB->Flags = 0; in CIFSSMBQPathInfo()
3707 pSMB->Timeout = 0; in CIFSSMBQPathInfo()
3708 pSMB->Reserved2 = 0; in CIFSSMBQPathInfo()
3709 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQPathInfo()
3710 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQPathInfo()
3711 pSMB->DataCount = 0; in CIFSSMBQPathInfo()
3712 pSMB->DataOffset = 0; in CIFSSMBQPathInfo()
3713 pSMB->SetupCount = 1; in CIFSSMBQPathInfo()
3714 pSMB->Reserved3 = 0; in CIFSSMBQPathInfo()
3715 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQPathInfo()
3717 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQPathInfo()
3718 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQPathInfo()
3720 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_STANDARD); in CIFSSMBQPathInfo()
3722 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQPathInfo()
3723 pSMB->Reserved4 = 0; in CIFSSMBQPathInfo()
3725 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQPathInfo()
3727 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQPathInfo()
3735 rc = -EIO; in CIFSSMBQPathInfo()
3736 else if (!legacy && get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQPathInfo()
3737 rc = -EIO; /* bad smb */ in CIFSSMBQPathInfo()
3738 else if (legacy && get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQPathInfo()
3739 rc = -EIO; /* 24 or 26 expected but we do not read in CIFSSMBQPathInfo()
3743 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQPathInfo()
3755 memcpy((char *) data, (char *) &pSMBr->hdr.Protocol + in CIFSSMBQPathInfo()
3758 rc = -ENOMEM; in CIFSSMBQPathInfo()
3761 if (rc == -EAGAIN) in CIFSSMBQPathInfo()
3768 CIFSSMBUnixQFileInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBUnixQFileInfo() argument
3778 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBUnixQFileInfo()
3784 pSMB->t2.TotalDataCount = 0; in CIFSSMBUnixQFileInfo()
3785 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBUnixQFileInfo()
3787 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQFileInfo()
3788 pSMB->t2.MaxSetupCount = 0; in CIFSSMBUnixQFileInfo()
3789 pSMB->t2.Reserved = 0; in CIFSSMBUnixQFileInfo()
3790 pSMB->t2.Flags = 0; in CIFSSMBUnixQFileInfo()
3791 pSMB->t2.Timeout = 0; in CIFSSMBUnixQFileInfo()
3792 pSMB->t2.Reserved2 = 0; in CIFSSMBUnixQFileInfo()
3793 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBUnixQFileInfo()
3794 Fid) - 4); in CIFSSMBUnixQFileInfo()
3795 pSMB->t2.DataCount = 0; in CIFSSMBUnixQFileInfo()
3796 pSMB->t2.DataOffset = 0; in CIFSSMBUnixQFileInfo()
3797 pSMB->t2.SetupCount = 1; in CIFSSMBUnixQFileInfo()
3798 pSMB->t2.Reserved3 = 0; in CIFSSMBUnixQFileInfo()
3799 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBUnixQFileInfo()
3801 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQFileInfo()
3802 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBUnixQFileInfo()
3803 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQFileInfo()
3804 pSMB->Pad = 0; in CIFSSMBUnixQFileInfo()
3805 pSMB->Fid = netfid; in CIFSSMBUnixQFileInfo()
3807 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQFileInfo()
3809 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQFileInfo()
3816 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQFileInfo()
3818 rc = -EIO; /* bad smb */ in CIFSSMBUnixQFileInfo()
3820 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQFileInfo()
3822 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQFileInfo()
3829 if (rc == -EAGAIN) in CIFSSMBUnixQFileInfo()
3836 CIFSSMBUnixQPathInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBUnixQPathInfo() argument
3851 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBUnixQPathInfo()
3856 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQPathInfo()
3858 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBUnixQPathInfo()
3863 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQPathInfo()
3867 pSMB->TotalDataCount = 0; in CIFSSMBUnixQPathInfo()
3868 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQPathInfo()
3870 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBUnixQPathInfo()
3871 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQPathInfo()
3872 pSMB->Reserved = 0; in CIFSSMBUnixQPathInfo()
3873 pSMB->Flags = 0; in CIFSSMBUnixQPathInfo()
3874 pSMB->Timeout = 0; in CIFSSMBUnixQPathInfo()
3875 pSMB->Reserved2 = 0; in CIFSSMBUnixQPathInfo()
3876 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQPathInfo()
3877 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQPathInfo()
3878 pSMB->DataCount = 0; in CIFSSMBUnixQPathInfo()
3879 pSMB->DataOffset = 0; in CIFSSMBUnixQPathInfo()
3880 pSMB->SetupCount = 1; in CIFSSMBUnixQPathInfo()
3881 pSMB->Reserved3 = 0; in CIFSSMBUnixQPathInfo()
3882 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQPathInfo()
3884 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQPathInfo()
3885 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQPathInfo()
3886 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQPathInfo()
3887 pSMB->Reserved4 = 0; in CIFSSMBUnixQPathInfo()
3889 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQPathInfo()
3891 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQPathInfo()
3898 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQPathInfo()
3900 rc = -EIO; /* bad smb */ in CIFSSMBUnixQPathInfo()
3902 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQPathInfo()
3904 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQPathInfo()
3910 if (rc == -EAGAIN) in CIFSSMBUnixQPathInfo()
3916 /* xid, tcon, searchName and codepage are input parms, rest are returned */
3918 CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon, in CIFSFindFirst() argument
3937 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSFindFirst()
3942 nls_codepage = cifs_sb->local_nls; in CIFSFindFirst()
3945 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSFindFirst()
3947 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSFindFirst()
3954 pSMB->FileName[name_len] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3955 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3956 pSMB->FileName[name_len+2] = '*'; in CIFSFindFirst()
3957 pSMB->FileName[name_len+3] = 0; in CIFSFindFirst()
3960 pSMB->FileName[name_len] = 0; in CIFSFindFirst()
3961 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3965 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSFindFirst()
3967 if (WARN_ON_ONCE(name_len > PATH_MAX-2)) in CIFSFindFirst()
3968 name_len = PATH_MAX-2; in CIFSFindFirst()
3970 pSMB->FileName[name_len-1] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
3971 pSMB->FileName[name_len] = '*'; in CIFSFindFirst()
3972 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
3978 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindFirst()
3979 pSMB->MaxParameterCount = cpu_to_le16(10); in CIFSFindFirst()
3980 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindFirst()
3981 pSMB->MaxSetupCount = 0; in CIFSFindFirst()
3982 pSMB->Reserved = 0; in CIFSFindFirst()
3983 pSMB->Flags = 0; in CIFSFindFirst()
3984 pSMB->Timeout = 0; in CIFSFindFirst()
3985 pSMB->Reserved2 = 0; in CIFSFindFirst()
3987 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindFirst()
3988 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindFirst()
3989 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindFirst()
3991 - 4); in CIFSFindFirst()
3992 pSMB->DataCount = 0; in CIFSFindFirst()
3993 pSMB->DataOffset = 0; in CIFSFindFirst()
3994 pSMB->SetupCount = 1; /* one byte, no need to make endian neutral */ in CIFSFindFirst()
3995 pSMB->Reserved3 = 0; in CIFSFindFirst()
3996 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_FIRST); in CIFSFindFirst()
3997 pSMB->SearchAttributes = in CIFSFindFirst()
4000 pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); in CIFSFindFirst()
4001 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindFirst()
4002 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindFirst()
4005 pSMB->SearchStorageType = 0; in CIFSFindFirst()
4007 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindFirst()
4009 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindFirst()
4011 cifs_stats_inc(&tcon->stats.cifs_stats.num_ffirst); in CIFSFindFirst()
4025 if (rc == -EAGAIN) in CIFSFindFirst()
4036 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindFirst()
4037 psrch_inf->ntwrk_buf_start = (char *)pSMBr; in CIFSFindFirst()
4038 psrch_inf->smallBuf = false; in CIFSFindFirst()
4039 psrch_inf->srch_entries_start = (char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4040 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindFirst()
4042 parms = (T2_FFIRST_RSP_PARMS *)((char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4043 le16_to_cpu(pSMBr->t2.ParameterOffset)); in CIFSFindFirst()
4044 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindFirst()
4046 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindFirst()
4047 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + in CIFSFindFirst()
4048 psrch_inf->entries_in_buffer; in CIFSFindFirst()
4049 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindFirst()
4052 psrch_inf->last_entry = NULL; in CIFSFindFirst()
4054 psrch_inf->last_entry = psrch_inf->srch_entries_start + lnoff; in CIFSFindFirst()
4056 *pnetfid = parms->SearchHandle; in CIFSFindFirst()
4061 int CIFSFindNext(const unsigned int xid, struct cifs_tcon *tcon, in CIFSFindNext() argument
4077 if (psrch_inf->endOfSearch) in CIFSFindNext()
4078 return -ENOENT; in CIFSFindNext()
4080 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSFindNext()
4087 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindNext()
4088 pSMB->MaxParameterCount = cpu_to_le16(8); in CIFSFindNext()
4089 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindNext()
4090 pSMB->MaxSetupCount = 0; in CIFSFindNext()
4091 pSMB->Reserved = 0; in CIFSFindNext()
4092 pSMB->Flags = 0; in CIFSFindNext()
4093 pSMB->Timeout = 0; in CIFSFindNext()
4094 pSMB->Reserved2 = 0; in CIFSFindNext()
4095 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindNext()
4096 offsetof(struct smb_com_transaction2_fnext_req,SearchHandle) - 4); in CIFSFindNext()
4097 pSMB->DataCount = 0; in CIFSFindNext()
4098 pSMB->DataOffset = 0; in CIFSFindNext()
4099 pSMB->SetupCount = 1; in CIFSFindNext()
4100 pSMB->Reserved3 = 0; in CIFSFindNext()
4101 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_NEXT); in CIFSFindNext()
4102 pSMB->SearchHandle = searchHandle; /* always kept as le */ in CIFSFindNext()
4103 pSMB->SearchCount = in CIFSFindNext()
4105 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindNext()
4106 pSMB->ResumeKey = psrch_inf->resume_key; in CIFSFindNext()
4107 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindNext()
4109 name_len = psrch_inf->resume_name_len; in CIFSFindNext()
4112 memcpy(pSMB->ResumeFileName, psrch_inf->presume_name, name_len); in CIFSFindNext()
4115 pSMB->ResumeFileName[name_len] = 0; in CIFSFindNext()
4116 pSMB->ResumeFileName[name_len+1] = 0; in CIFSFindNext()
4119 return -EINVAL; in CIFSFindNext()
4122 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindNext()
4123 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindNext()
4125 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindNext()
4127 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindNext()
4129 cifs_stats_inc(&tcon->stats.cifs_stats.num_fnext); in CIFSFindNext()
4133 if (rc == -EBADF) { in CIFSFindNext()
4134 psrch_inf->endOfSearch = true; in CIFSFindNext()
4149 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindNext()
4150 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4151 le16_to_cpu(pSMBr->t2.ParameterOffset); in CIFSFindNext()
4153 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4154 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindNext()
4156 if (psrch_inf->smallBuf) in CIFSFindNext()
4157 cifs_small_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4159 cifs_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4161 psrch_inf->srch_entries_start = response_data; in CIFSFindNext()
4162 psrch_inf->ntwrk_buf_start = (char *)pSMB; in CIFSFindNext()
4163 psrch_inf->smallBuf = false; in CIFSFindNext()
4164 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindNext()
4165 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindNext()
4166 psrch_inf->index_of_last_entry += psrch_inf->entries_in_buffer; in CIFSFindNext()
4167 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindNext()
4170 psrch_inf->last_entry = NULL; in CIFSFindNext()
4172 psrch_inf->last_entry = in CIFSFindNext()
4173 psrch_inf->srch_entries_start + lnoff; in CIFSFindNext()
4181 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSFindNext()
4188 CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon, in CIFSFindClose() argument
4195 rc = small_smb_init(SMB_COM_FIND_CLOSE2, 1, tcon, (void **)&pSMB); in CIFSFindClose()
4199 if (rc == -EAGAIN) in CIFSFindClose()
4204 pSMB->FileID = searchHandle; in CIFSFindClose()
4205 pSMB->ByteCount = 0; in CIFSFindClose()
4206 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSFindClose()
4211 cifs_stats_inc(&tcon->stats.cifs_stats.num_fclose); in CIFSFindClose()
4214 if (rc == -EAGAIN) in CIFSFindClose()
4221 CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon, in CIFSGetSrvInodeNumber() argument
4232 if (tcon == NULL) in CIFSGetSrvInodeNumber()
4233 return -ENODEV; in CIFSGetSrvInodeNumber()
4236 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSGetSrvInodeNumber()
4241 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSGetSrvInodeNumber()
4243 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSGetSrvInodeNumber()
4249 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSGetSrvInodeNumber()
4253 pSMB->TotalDataCount = 0; in CIFSGetSrvInodeNumber()
4254 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSGetSrvInodeNumber()
4256 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetSrvInodeNumber()
4257 pSMB->MaxSetupCount = 0; in CIFSGetSrvInodeNumber()
4258 pSMB->Reserved = 0; in CIFSGetSrvInodeNumber()
4259 pSMB->Flags = 0; in CIFSGetSrvInodeNumber()
4260 pSMB->Timeout = 0; in CIFSGetSrvInodeNumber()
4261 pSMB->Reserved2 = 0; in CIFSGetSrvInodeNumber()
4262 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetSrvInodeNumber()
4263 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSGetSrvInodeNumber()
4264 pSMB->DataCount = 0; in CIFSGetSrvInodeNumber()
4265 pSMB->DataOffset = 0; in CIFSGetSrvInodeNumber()
4266 pSMB->SetupCount = 1; in CIFSGetSrvInodeNumber()
4267 pSMB->Reserved3 = 0; in CIFSGetSrvInodeNumber()
4268 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSGetSrvInodeNumber()
4270 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSGetSrvInodeNumber()
4271 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSGetSrvInodeNumber()
4272 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_INTERNAL_INFO); in CIFSGetSrvInodeNumber()
4273 pSMB->Reserved4 = 0; in CIFSGetSrvInodeNumber()
4275 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetSrvInodeNumber()
4277 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetSrvInodeNumber()
4285 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetSrvInodeNumber()
4288 rc = -EIO; /* bad smb */ in CIFSGetSrvInodeNumber()
4290 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetSrvInodeNumber()
4291 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetSrvInodeNumber()
4296 rc = -EIO; in CIFSGetSrvInodeNumber()
4300 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetSrvInodeNumber()
4301 *inode_number = le64_to_cpu(pfinfo->UniqueId); in CIFSGetSrvInodeNumber()
4306 if (rc == -EAGAIN) in CIFSGetSrvInodeNumber()
4328 if (ses == NULL || ses->tcon_ipc == NULL) in CIFSGetDFSRefer()
4329 return -ENODEV; in CIFSGetDFSRefer()
4337 rc = smb_init(SMB_COM_TRANSACTION2, 15, ses->tcon_ipc, in CIFSGetDFSRefer()
4344 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSGetDFSRefer()
4345 pSMB->hdr.Tid = ses->tcon_ipc->tid; in CIFSGetDFSRefer()
4346 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4347 if (ses->capabilities & CAP_STATUS32) in CIFSGetDFSRefer()
4348 pSMB->hdr.Flags2 |= SMBFLG2_ERR_STATUS; in CIFSGetDFSRefer()
4349 if (ses->capabilities & CAP_DFS) in CIFSGetDFSRefer()
4350 pSMB->hdr.Flags2 |= SMBFLG2_DFS; in CIFSGetDFSRefer()
4352 if (ses->capabilities & CAP_UNICODE) { in CIFSGetDFSRefer()
4353 pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSGetDFSRefer()
4355 cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, in CIFSGetDFSRefer()
4361 name_len = copy_path_name(pSMB->RequestFileName, search_name); in CIFSGetDFSRefer()
4364 if (ses->server->sign) in CIFSGetDFSRefer()
4365 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSGetDFSRefer()
4367 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4370 pSMB->TotalDataCount = 0; in CIFSGetDFSRefer()
4371 pSMB->DataCount = 0; in CIFSGetDFSRefer()
4372 pSMB->DataOffset = 0; in CIFSGetDFSRefer()
4373 pSMB->MaxParameterCount = 0; in CIFSGetDFSRefer()
4375 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetDFSRefer()
4376 pSMB->MaxSetupCount = 0; in CIFSGetDFSRefer()
4377 pSMB->Reserved = 0; in CIFSGetDFSRefer()
4378 pSMB->Flags = 0; in CIFSGetDFSRefer()
4379 pSMB->Timeout = 0; in CIFSGetDFSRefer()
4380 pSMB->Reserved2 = 0; in CIFSGetDFSRefer()
4381 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetDFSRefer()
4382 struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4); in CIFSGetDFSRefer()
4383 pSMB->SetupCount = 1; in CIFSGetDFSRefer()
4384 pSMB->Reserved3 = 0; in CIFSGetDFSRefer()
4385 pSMB->SubCommand = cpu_to_le16(TRANS2_GET_DFS_REFERRAL); in CIFSGetDFSRefer()
4387 pSMB->ParameterCount = cpu_to_le16(params); in CIFSGetDFSRefer()
4388 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSGetDFSRefer()
4389 pSMB->MaxReferralLevel = cpu_to_le16(3); in CIFSGetDFSRefer()
4391 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetDFSRefer()
4402 if (rc || get_bcc(&pSMBr->hdr) < 17) { in CIFSGetDFSRefer()
4403 rc = -EIO; /* bad smb */ in CIFSGetDFSRefer()
4408 get_bcc(&pSMBr->hdr), le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSGetDFSRefer()
4411 rc = parse_dfs_referrals(&pSMBr->dfs_data, in CIFSGetDFSRefer()
4412 le16_to_cpu(pSMBr->t2.DataCount), in CIFSGetDFSRefer()
4415 (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) != 0); in CIFSGetDFSRefer()
4420 if (rc == -EAGAIN) in CIFSGetDFSRefer()
4428 SMBOldQFSInfo(const unsigned int xid, struct cifs_tcon *tcon, in SMBOldQFSInfo() argument
4441 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in SMBOldQFSInfo()
4447 pSMB->TotalDataCount = 0; in SMBOldQFSInfo()
4448 pSMB->MaxParameterCount = cpu_to_le16(2); in SMBOldQFSInfo()
4449 pSMB->MaxDataCount = cpu_to_le16(1000); in SMBOldQFSInfo()
4450 pSMB->MaxSetupCount = 0; in SMBOldQFSInfo()
4451 pSMB->Reserved = 0; in SMBOldQFSInfo()
4452 pSMB->Flags = 0; in SMBOldQFSInfo()
4453 pSMB->Timeout = 0; in SMBOldQFSInfo()
4454 pSMB->Reserved2 = 0; in SMBOldQFSInfo()
4456 pSMB->TotalParameterCount = cpu_to_le16(params); in SMBOldQFSInfo()
4457 pSMB->ParameterCount = pSMB->TotalParameterCount; in SMBOldQFSInfo()
4458 pSMB->ParameterOffset = cpu_to_le16(offsetof( in SMBOldQFSInfo()
4459 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in SMBOldQFSInfo()
4460 pSMB->DataCount = 0; in SMBOldQFSInfo()
4461 pSMB->DataOffset = 0; in SMBOldQFSInfo()
4462 pSMB->SetupCount = 1; in SMBOldQFSInfo()
4463 pSMB->Reserved3 = 0; in SMBOldQFSInfo()
4464 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in SMBOldQFSInfo()
4465 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_ALLOCATION); in SMBOldQFSInfo()
4467 pSMB->ByteCount = cpu_to_le16(byte_count); in SMBOldQFSInfo()
4469 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBOldQFSInfo()
4476 if (rc || get_bcc(&pSMBr->hdr) < 18) in SMBOldQFSInfo()
4477 rc = -EIO; /* bad smb */ in SMBOldQFSInfo()
4479 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in SMBOldQFSInfo()
4481 get_bcc(&pSMBr->hdr), data_offset); in SMBOldQFSInfo()
4484 (((char *) &pSMBr->hdr.Protocol) + data_offset); in SMBOldQFSInfo()
4485 FSData->f_bsize = in SMBOldQFSInfo()
4486 le16_to_cpu(response_data->BytesPerSector) * in SMBOldQFSInfo()
4487 le32_to_cpu(response_data-> in SMBOldQFSInfo()
4493 if (FSData->f_bsize < 512) in SMBOldQFSInfo()
4494 FSData->f_bsize = 4096; in SMBOldQFSInfo()
4496 FSData->f_blocks = in SMBOldQFSInfo()
4497 le32_to_cpu(response_data->TotalAllocationUnits); in SMBOldQFSInfo()
4498 FSData->f_bfree = FSData->f_bavail = in SMBOldQFSInfo()
4499 le32_to_cpu(response_data->FreeAllocationUnits); in SMBOldQFSInfo()
4501 (unsigned long long)FSData->f_blocks, in SMBOldQFSInfo()
4502 (unsigned long long)FSData->f_bfree, in SMBOldQFSInfo()
4503 FSData->f_bsize); in SMBOldQFSInfo()
4508 if (rc == -EAGAIN) in SMBOldQFSInfo()
4515 CIFSSMBQFSInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBQFSInfo() argument
4528 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQFSInfo()
4534 pSMB->TotalDataCount = 0; in CIFSSMBQFSInfo()
4535 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSInfo()
4536 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSInfo()
4537 pSMB->MaxSetupCount = 0; in CIFSSMBQFSInfo()
4538 pSMB->Reserved = 0; in CIFSSMBQFSInfo()
4539 pSMB->Flags = 0; in CIFSSMBQFSInfo()
4540 pSMB->Timeout = 0; in CIFSSMBQFSInfo()
4541 pSMB->Reserved2 = 0; in CIFSSMBQFSInfo()
4543 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSInfo()
4544 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSInfo()
4545 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSInfo()
4546 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSInfo()
4547 pSMB->DataCount = 0; in CIFSSMBQFSInfo()
4548 pSMB->DataOffset = 0; in CIFSSMBQFSInfo()
4549 pSMB->SetupCount = 1; in CIFSSMBQFSInfo()
4550 pSMB->Reserved3 = 0; in CIFSSMBQFSInfo()
4551 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSInfo()
4552 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_SIZE_INFO); in CIFSSMBQFSInfo()
4554 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSInfo()
4556 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSInfo()
4563 if (rc || get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQFSInfo()
4564 rc = -EIO; /* bad smb */ in CIFSSMBQFSInfo()
4566 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSInfo()
4570 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSInfo()
4572 FSData->f_bsize = in CIFSSMBQFSInfo()
4573 le32_to_cpu(response_data->BytesPerSector) * in CIFSSMBQFSInfo()
4574 le32_to_cpu(response_data-> in CIFSSMBQFSInfo()
4580 if (FSData->f_bsize < 512) in CIFSSMBQFSInfo()
4581 FSData->f_bsize = 4096; in CIFSSMBQFSInfo()
4583 FSData->f_blocks = in CIFSSMBQFSInfo()
4584 le64_to_cpu(response_data->TotalAllocationUnits); in CIFSSMBQFSInfo()
4585 FSData->f_bfree = FSData->f_bavail = in CIFSSMBQFSInfo()
4586 le64_to_cpu(response_data->FreeAllocationUnits); in CIFSSMBQFSInfo()
4588 (unsigned long long)FSData->f_blocks, in CIFSSMBQFSInfo()
4589 (unsigned long long)FSData->f_bfree, in CIFSSMBQFSInfo()
4590 FSData->f_bsize); in CIFSSMBQFSInfo()
4595 if (rc == -EAGAIN) in CIFSSMBQFSInfo()
4602 CIFSSMBQFSAttributeInfo(const unsigned int xid, struct cifs_tcon *tcon) in CIFSSMBQFSAttributeInfo() argument
4614 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQFSAttributeInfo()
4620 pSMB->TotalDataCount = 0; in CIFSSMBQFSAttributeInfo()
4621 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSAttributeInfo()
4623 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSAttributeInfo()
4624 pSMB->MaxSetupCount = 0; in CIFSSMBQFSAttributeInfo()
4625 pSMB->Reserved = 0; in CIFSSMBQFSAttributeInfo()
4626 pSMB->Flags = 0; in CIFSSMBQFSAttributeInfo()
4627 pSMB->Timeout = 0; in CIFSSMBQFSAttributeInfo()
4628 pSMB->Reserved2 = 0; in CIFSSMBQFSAttributeInfo()
4630 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSAttributeInfo()
4631 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSAttributeInfo()
4632 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSAttributeInfo()
4633 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSAttributeInfo()
4634 pSMB->DataCount = 0; in CIFSSMBQFSAttributeInfo()
4635 pSMB->DataOffset = 0; in CIFSSMBQFSAttributeInfo()
4636 pSMB->SetupCount = 1; in CIFSSMBQFSAttributeInfo()
4637 pSMB->Reserved3 = 0; in CIFSSMBQFSAttributeInfo()
4638 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSAttributeInfo()
4639 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_ATTRIBUTE_INFO); in CIFSSMBQFSAttributeInfo()
4641 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSAttributeInfo()
4643 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSAttributeInfo()
4650 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSAttributeInfo()
4652 rc = -EIO; /* bad smb */ in CIFSSMBQFSAttributeInfo()
4654 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSAttributeInfo()
4657 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSAttributeInfo()
4659 memcpy(&tcon->fsAttrInfo, response_data, in CIFSSMBQFSAttributeInfo()
4665 if (rc == -EAGAIN) in CIFSSMBQFSAttributeInfo()
4672 CIFSSMBQFSDeviceInfo(const unsigned int xid, struct cifs_tcon *tcon) in CIFSSMBQFSDeviceInfo() argument
4684 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQFSDeviceInfo()
4690 pSMB->TotalDataCount = 0; in CIFSSMBQFSDeviceInfo()
4691 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSDeviceInfo()
4693 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSDeviceInfo()
4694 pSMB->MaxSetupCount = 0; in CIFSSMBQFSDeviceInfo()
4695 pSMB->Reserved = 0; in CIFSSMBQFSDeviceInfo()
4696 pSMB->Flags = 0; in CIFSSMBQFSDeviceInfo()
4697 pSMB->Timeout = 0; in CIFSSMBQFSDeviceInfo()
4698 pSMB->Reserved2 = 0; in CIFSSMBQFSDeviceInfo()
4700 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSDeviceInfo()
4701 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSDeviceInfo()
4702 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSDeviceInfo()
4703 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSDeviceInfo()
4705 pSMB->DataCount = 0; in CIFSSMBQFSDeviceInfo()
4706 pSMB->DataOffset = 0; in CIFSSMBQFSDeviceInfo()
4707 pSMB->SetupCount = 1; in CIFSSMBQFSDeviceInfo()
4708 pSMB->Reserved3 = 0; in CIFSSMBQFSDeviceInfo()
4709 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSDeviceInfo()
4710 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_DEVICE_INFO); in CIFSSMBQFSDeviceInfo()
4712 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSDeviceInfo()
4714 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSDeviceInfo()
4721 if (rc || get_bcc(&pSMBr->hdr) < in CIFSSMBQFSDeviceInfo()
4723 rc = -EIO; /* bad smb */ in CIFSSMBQFSDeviceInfo()
4725 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSDeviceInfo()
4728 (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSDeviceInfo()
4730 memcpy(&tcon->fsDevInfo, response_data, in CIFSSMBQFSDeviceInfo()
4736 if (rc == -EAGAIN) in CIFSSMBQFSDeviceInfo()
4743 CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon) in CIFSSMBQFSUnixInfo() argument
4755 rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, tcon, in CIFSSMBQFSUnixInfo()
4761 pSMB->TotalDataCount = 0; in CIFSSMBQFSUnixInfo()
4762 pSMB->DataCount = 0; in CIFSSMBQFSUnixInfo()
4763 pSMB->DataOffset = 0; in CIFSSMBQFSUnixInfo()
4764 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSUnixInfo()
4766 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSUnixInfo()
4767 pSMB->MaxSetupCount = 0; in CIFSSMBQFSUnixInfo()
4768 pSMB->Reserved = 0; in CIFSSMBQFSUnixInfo()
4769 pSMB->Flags = 0; in CIFSSMBQFSUnixInfo()
4770 pSMB->Timeout = 0; in CIFSSMBQFSUnixInfo()
4771 pSMB->Reserved2 = 0; in CIFSSMBQFSUnixInfo()
4773 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSUnixInfo()
4774 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSUnixInfo()
4775 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSUnixInfo()
4776 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSUnixInfo()
4777 pSMB->SetupCount = 1; in CIFSSMBQFSUnixInfo()
4778 pSMB->Reserved3 = 0; in CIFSSMBQFSUnixInfo()
4779 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSUnixInfo()
4780 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_CIFS_UNIX_INFO); in CIFSSMBQFSUnixInfo()
4782 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSUnixInfo()
4784 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSUnixInfo()
4791 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSUnixInfo()
4792 rc = -EIO; /* bad smb */ in CIFSSMBQFSUnixInfo()
4794 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSUnixInfo()
4797 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSUnixInfo()
4799 memcpy(&tcon->fsUnixInfo, response_data, in CIFSSMBQFSUnixInfo()
4805 if (rc == -EAGAIN) in CIFSSMBQFSUnixInfo()
4813 CIFSSMBSetFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon, __u64 cap) in CIFSSMBSetFSUnixInfo() argument
4825 rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, tcon, in CIFSSMBSetFSUnixInfo()
4831 pSMB->MaxSetupCount = 0; in CIFSSMBSetFSUnixInfo()
4832 pSMB->Reserved = 0; in CIFSSMBSetFSUnixInfo()
4833 pSMB->Flags = 0; in CIFSSMBSetFSUnixInfo()
4834 pSMB->Timeout = 0; in CIFSSMBSetFSUnixInfo()
4835 pSMB->Reserved2 = 0; in CIFSSMBSetFSUnixInfo()
4837 - 4; in CIFSSMBSetFSUnixInfo()
4840 pSMB->MaxParameterCount = cpu_to_le16(4); in CIFSSMBSetFSUnixInfo()
4842 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBSetFSUnixInfo()
4843 pSMB->SetupCount = 1; in CIFSSMBSetFSUnixInfo()
4844 pSMB->Reserved3 = 0; in CIFSSMBSetFSUnixInfo()
4845 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FS_INFORMATION); in CIFSSMBSetFSUnixInfo()
4848 pSMB->DataCount = cpu_to_le16(12); in CIFSSMBSetFSUnixInfo()
4849 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFSUnixInfo()
4850 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFSUnixInfo()
4851 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFSUnixInfo()
4852 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFSUnixInfo()
4853 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFSUnixInfo()
4856 pSMB->FileNum = 0; in CIFSSMBSetFSUnixInfo()
4857 pSMB->InformationLevel = cpu_to_le16(SMB_SET_CIFS_UNIX_INFO); in CIFSSMBSetFSUnixInfo()
4860 pSMB->ClientUnixMajor = cpu_to_le16(CIFS_UNIX_MAJOR_VERSION); in CIFSSMBSetFSUnixInfo()
4861 pSMB->ClientUnixMinor = cpu_to_le16(CIFS_UNIX_MINOR_VERSION); in CIFSSMBSetFSUnixInfo()
4862 pSMB->ClientUnixCap = cpu_to_le64(cap); in CIFSSMBSetFSUnixInfo()
4865 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFSUnixInfo()
4867 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetFSUnixInfo()
4874 rc = -EIO; /* bad smb */ in CIFSSMBSetFSUnixInfo()
4878 if (rc == -EAGAIN) in CIFSSMBSetFSUnixInfo()
4887 CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBQFSPosixInfo() argument
4900 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQFSPosixInfo()
4906 pSMB->TotalDataCount = 0; in CIFSSMBQFSPosixInfo()
4907 pSMB->DataCount = 0; in CIFSSMBQFSPosixInfo()
4908 pSMB->DataOffset = 0; in CIFSSMBQFSPosixInfo()
4909 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSPosixInfo()
4911 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSPosixInfo()
4912 pSMB->MaxSetupCount = 0; in CIFSSMBQFSPosixInfo()
4913 pSMB->Reserved = 0; in CIFSSMBQFSPosixInfo()
4914 pSMB->Flags = 0; in CIFSSMBQFSPosixInfo()
4915 pSMB->Timeout = 0; in CIFSSMBQFSPosixInfo()
4916 pSMB->Reserved2 = 0; in CIFSSMBQFSPosixInfo()
4918 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSPosixInfo()
4919 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSPosixInfo()
4920 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSPosixInfo()
4921 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSPosixInfo()
4922 pSMB->SetupCount = 1; in CIFSSMBQFSPosixInfo()
4923 pSMB->Reserved3 = 0; in CIFSSMBQFSPosixInfo()
4924 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSPosixInfo()
4925 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_FS_INFO); in CIFSSMBQFSPosixInfo()
4927 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSPosixInfo()
4929 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSPosixInfo()
4936 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSPosixInfo()
4937 rc = -EIO; /* bad smb */ in CIFSSMBQFSPosixInfo()
4939 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSPosixInfo()
4942 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSPosixInfo()
4944 FSData->f_bsize = in CIFSSMBQFSPosixInfo()
4945 le32_to_cpu(response_data->BlockSize); in CIFSSMBQFSPosixInfo()
4950 if (FSData->f_bsize < 512) in CIFSSMBQFSPosixInfo()
4951 FSData->f_bsize = 4096; in CIFSSMBQFSPosixInfo()
4953 FSData->f_blocks = in CIFSSMBQFSPosixInfo()
4954 le64_to_cpu(response_data->TotalBlocks); in CIFSSMBQFSPosixInfo()
4955 FSData->f_bfree = in CIFSSMBQFSPosixInfo()
4956 le64_to_cpu(response_data->BlocksAvail); in CIFSSMBQFSPosixInfo()
4957 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) { in CIFSSMBQFSPosixInfo()
4958 FSData->f_bavail = FSData->f_bfree; in CIFSSMBQFSPosixInfo()
4960 FSData->f_bavail = in CIFSSMBQFSPosixInfo()
4961 le64_to_cpu(response_data->UserBlocksAvail); in CIFSSMBQFSPosixInfo()
4963 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4964 FSData->f_files = in CIFSSMBQFSPosixInfo()
4965 le64_to_cpu(response_data->TotalFileNodes); in CIFSSMBQFSPosixInfo()
4966 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
4967 FSData->f_ffree = in CIFSSMBQFSPosixInfo()
4968 le64_to_cpu(response_data->FreeFileNodes); in CIFSSMBQFSPosixInfo()
4973 if (rc == -EAGAIN) in CIFSSMBQFSPosixInfo()
4987 CIFSSMBSetEOF(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetEOF() argument
5003 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBSetEOF()
5008 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEOF()
5010 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBSetEOF()
5011 PATH_MAX, cifs_sb->local_nls, remap); in CIFSSMBSetEOF()
5015 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBSetEOF()
5019 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEOF()
5020 pSMB->MaxDataCount = cpu_to_le16(4100); in CIFSSMBSetEOF()
5021 pSMB->MaxSetupCount = 0; in CIFSSMBSetEOF()
5022 pSMB->Reserved = 0; in CIFSSMBSetEOF()
5023 pSMB->Flags = 0; in CIFSSMBSetEOF()
5024 pSMB->Timeout = 0; in CIFSSMBSetEOF()
5025 pSMB->Reserved2 = 0; in CIFSSMBSetEOF()
5027 InformationLevel) - 4; in CIFSSMBSetEOF()
5030 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5031 pSMB->InformationLevel = in CIFSSMBSetEOF()
5034 pSMB->InformationLevel = in CIFSSMBSetEOF()
5037 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5038 pSMB->InformationLevel = in CIFSSMBSetEOF()
5041 pSMB->InformationLevel = in CIFSSMBSetEOF()
5046 (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) + in CIFSSMBSetEOF()
5048 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEOF()
5049 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEOF()
5050 pSMB->SetupCount = 1; in CIFSSMBSetEOF()
5051 pSMB->Reserved3 = 0; in CIFSSMBSetEOF()
5052 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEOF()
5054 pSMB->DataCount = cpu_to_le16(data_count); in CIFSSMBSetEOF()
5055 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEOF()
5056 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEOF()
5057 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEOF()
5058 pSMB->Reserved4 = 0; in CIFSSMBSetEOF()
5060 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetEOF()
5061 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEOF()
5062 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEOF()
5069 if (rc == -EAGAIN) in CIFSSMBSetEOF()
5076 CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetFileSize() argument
5086 rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); in CIFSSMBSetFileSize()
5091 pSMB->hdr.Pid = cpu_to_le16((__u16)cfile->pid); in CIFSSMBSetFileSize()
5092 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(cfile->pid >> 16)); in CIFSSMBSetFileSize()
5095 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileSize()
5096 pSMB->Reserved = 0; in CIFSSMBSetFileSize()
5097 pSMB->Flags = 0; in CIFSSMBSetFileSize()
5098 pSMB->Timeout = 0; in CIFSSMBSetFileSize()
5099 pSMB->Reserved2 = 0; in CIFSSMBSetFileSize()
5100 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileSize()
5104 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileSize()
5106 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileSize()
5107 pSMB->SetupCount = 1; in CIFSSMBSetFileSize()
5108 pSMB->Reserved3 = 0; in CIFSSMBSetFileSize()
5109 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileSize()
5111 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileSize()
5112 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileSize()
5113 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileSize()
5114 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileSize()
5115 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileSize()
5119 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileSize()
5120 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetFileSize()
5121 pSMB->Fid = cfile->fid.netfid; in CIFSSMBSetFileSize()
5123 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5124 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5127 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5130 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5131 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5134 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5137 pSMB->Reserved4 = 0; in CIFSSMBSetFileSize()
5139 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileSize()
5140 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileSize()
5147 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileSize()
5154 an open handle, rather than by pathname - this is awkward due to
5160 CIFSSMBSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetFileInfo() argument
5169 rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); in CIFSSMBSetFileInfo()
5174 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileInfo()
5175 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileInfo()
5178 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileInfo()
5179 pSMB->Reserved = 0; in CIFSSMBSetFileInfo()
5180 pSMB->Flags = 0; in CIFSSMBSetFileInfo()
5181 pSMB->Timeout = 0; in CIFSSMBSetFileInfo()
5182 pSMB->Reserved2 = 0; in CIFSSMBSetFileInfo()
5183 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileInfo()
5190 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileInfo()
5192 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileInfo()
5193 pSMB->SetupCount = 1; in CIFSSMBSetFileInfo()
5194 pSMB->Reserved3 = 0; in CIFSSMBSetFileInfo()
5195 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileInfo()
5197 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileInfo()
5198 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileInfo()
5199 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileInfo()
5200 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileInfo()
5201 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileInfo()
5202 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileInfo()
5203 pSMB->Fid = fid; in CIFSSMBSetFileInfo()
5204 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileInfo()
5205 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetFileInfo()
5207 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetFileInfo()
5208 pSMB->Reserved4 = 0; in CIFSSMBSetFileInfo()
5210 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileInfo()
5212 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileInfo()
5218 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileInfo()
5225 CIFSSMBSetFileDisposition(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetFileDisposition() argument
5234 rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); in CIFSSMBSetFileDisposition()
5239 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileDisposition()
5240 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileDisposition()
5243 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileDisposition()
5244 pSMB->Reserved = 0; in CIFSSMBSetFileDisposition()
5245 pSMB->Flags = 0; in CIFSSMBSetFileDisposition()
5246 pSMB->Timeout = 0; in CIFSSMBSetFileDisposition()
5247 pSMB->Reserved2 = 0; in CIFSSMBSetFileDisposition()
5248 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileDisposition()
5255 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileDisposition()
5257 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileDisposition()
5258 pSMB->SetupCount = 1; in CIFSSMBSetFileDisposition()
5259 pSMB->Reserved3 = 0; in CIFSSMBSetFileDisposition()
5260 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileDisposition()
5262 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileDisposition()
5263 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileDisposition()
5264 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileDisposition()
5265 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileDisposition()
5266 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileDisposition()
5267 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileDisposition()
5268 pSMB->Fid = fid; in CIFSSMBSetFileDisposition()
5269 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_DISPOSITION_INFO); in CIFSSMBSetFileDisposition()
5270 pSMB->Reserved4 = 0; in CIFSSMBSetFileDisposition()
5272 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileDisposition()
5274 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileDisposition()
5283 CIFSSMBSetPathInfoFB(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetPathInfoFB() argument
5294 .tcon = tcon, in CIFSSMBSetPathInfoFB()
5307 rc = CIFSSMBSetFileInfo(xid, tcon, data, fid.netfid, current->tgid); in CIFSSMBSetPathInfoFB()
5308 CIFSSMBClose(xid, tcon, fid.netfid); in CIFSSMBSetPathInfoFB()
5315 CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetPathInfo() argument
5332 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBSetPathInfo()
5337 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetPathInfo()
5339 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetPathInfo()
5344 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetPathInfo()
5349 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetPathInfo()
5351 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetPathInfo()
5352 pSMB->MaxSetupCount = 0; in CIFSSMBSetPathInfo()
5353 pSMB->Reserved = 0; in CIFSSMBSetPathInfo()
5354 pSMB->Flags = 0; in CIFSSMBSetPathInfo()
5355 pSMB->Timeout = 0; in CIFSSMBSetPathInfo()
5356 pSMB->Reserved2 = 0; in CIFSSMBSetPathInfo()
5358 InformationLevel) - 4; in CIFSSMBSetPathInfo()
5361 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetPathInfo()
5362 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetPathInfo()
5363 pSMB->SetupCount = 1; in CIFSSMBSetPathInfo()
5364 pSMB->Reserved3 = 0; in CIFSSMBSetPathInfo()
5365 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetPathInfo()
5368 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetPathInfo()
5369 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetPathInfo()
5370 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetPathInfo()
5371 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetPathInfo()
5372 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetPathInfo()
5373 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetPathInfo()
5375 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetPathInfo()
5376 pSMB->Reserved4 = 0; in CIFSSMBSetPathInfo()
5379 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetPathInfo()
5380 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetPathInfo()
5387 if (rc == -EAGAIN) in CIFSSMBSetPathInfo()
5390 if (rc == -EOPNOTSUPP) in CIFSSMBSetPathInfo()
5391 return CIFSSMBSetPathInfoFB(xid, tcon, fileName, data, in CIFSSMBSetPathInfo()
5402 u64 mode = args->mode; in cifs_fill_unix_set_info()
5404 if (uid_valid(args->uid)) in cifs_fill_unix_set_info()
5405 uid = from_kuid(&init_user_ns, args->uid); in cifs_fill_unix_set_info()
5406 if (gid_valid(args->gid)) in cifs_fill_unix_set_info()
5407 gid = from_kgid(&init_user_ns, args->gid); in cifs_fill_unix_set_info()
5411 * older clients, but we should be precise - we use SetFileSize to in cifs_fill_unix_set_info()
5414 * zero instead of -1 here in cifs_fill_unix_set_info()
5416 data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5417 data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5418 data_offset->LastStatusChange = cpu_to_le64(args->ctime); in cifs_fill_unix_set_info()
5419 data_offset->LastAccessTime = cpu_to_le64(args->atime); in cifs_fill_unix_set_info()
5420 data_offset->LastModificationTime = cpu_to_le64(args->mtime); in cifs_fill_unix_set_info()
5421 data_offset->Uid = cpu_to_le64(uid); in cifs_fill_unix_set_info()
5422 data_offset->Gid = cpu_to_le64(gid); in cifs_fill_unix_set_info()
5424 data_offset->DevMajor = cpu_to_le64(MAJOR(args->device)); in cifs_fill_unix_set_info()
5425 data_offset->DevMinor = cpu_to_le64(MINOR(args->device)); in cifs_fill_unix_set_info()
5426 data_offset->Permissions = cpu_to_le64(mode); in cifs_fill_unix_set_info()
5429 data_offset->Type = cpu_to_le32(UNIX_FILE); in cifs_fill_unix_set_info()
5431 data_offset->Type = cpu_to_le32(UNIX_DIR); in cifs_fill_unix_set_info()
5433 data_offset->Type = cpu_to_le32(UNIX_SYMLINK); in cifs_fill_unix_set_info()
5435 data_offset->Type = cpu_to_le32(UNIX_CHARDEV); in cifs_fill_unix_set_info()
5437 data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV); in cifs_fill_unix_set_info()
5439 data_offset->Type = cpu_to_le32(UNIX_FIFO); in cifs_fill_unix_set_info()
5441 data_offset->Type = cpu_to_le32(UNIX_SOCKET); in cifs_fill_unix_set_info()
5445 CIFSSMBUnixSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBUnixSetFileInfo() argument
5455 rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); in CIFSSMBUnixSetFileInfo()
5460 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBUnixSetFileInfo()
5461 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBUnixSetFileInfo()
5464 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetFileInfo()
5465 pSMB->Reserved = 0; in CIFSSMBUnixSetFileInfo()
5466 pSMB->Flags = 0; in CIFSSMBUnixSetFileInfo()
5467 pSMB->Timeout = 0; in CIFSSMBUnixSetFileInfo()
5468 pSMB->Reserved2 = 0; in CIFSSMBUnixSetFileInfo()
5469 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBUnixSetFileInfo()
5477 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetFileInfo()
5479 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetFileInfo()
5480 pSMB->SetupCount = 1; in CIFSSMBUnixSetFileInfo()
5481 pSMB->Reserved3 = 0; in CIFSSMBUnixSetFileInfo()
5482 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBUnixSetFileInfo()
5484 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetFileInfo()
5485 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetFileInfo()
5486 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetFileInfo()
5487 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetFileInfo()
5488 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetFileInfo()
5489 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetFileInfo()
5490 pSMB->Fid = fid; in CIFSSMBUnixSetFileInfo()
5491 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetFileInfo()
5492 pSMB->Reserved4 = 0; in CIFSSMBUnixSetFileInfo()
5494 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetFileInfo()
5498 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBUnixSetFileInfo()
5504 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBUnixSetFileInfo()
5511 CIFSSMBUnixSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBUnixSetPathInfo() argument
5526 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBUnixSetPathInfo()
5531 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixSetPathInfo()
5533 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBUnixSetPathInfo()
5538 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBUnixSetPathInfo()
5543 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetPathInfo()
5545 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetPathInfo()
5546 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetPathInfo()
5547 pSMB->Reserved = 0; in CIFSSMBUnixSetPathInfo()
5548 pSMB->Flags = 0; in CIFSSMBUnixSetPathInfo()
5549 pSMB->Timeout = 0; in CIFSSMBUnixSetPathInfo()
5550 pSMB->Reserved2 = 0; in CIFSSMBUnixSetPathInfo()
5552 InformationLevel) - 4; in CIFSSMBUnixSetPathInfo()
5557 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetPathInfo()
5558 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetPathInfo()
5559 pSMB->SetupCount = 1; in CIFSSMBUnixSetPathInfo()
5560 pSMB->Reserved3 = 0; in CIFSSMBUnixSetPathInfo()
5561 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBUnixSetPathInfo()
5563 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetPathInfo()
5564 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetPathInfo()
5565 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetPathInfo()
5566 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetPathInfo()
5567 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetPathInfo()
5568 pSMB->Reserved4 = 0; in CIFSSMBUnixSetPathInfo()
5573 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetPathInfo()
5574 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixSetPathInfo()
5580 if (rc == -EAGAIN) in CIFSSMBUnixSetPathInfo()
5587 * Do a path-based QUERY_ALL_EAS call and parse the result. This is a common
5596 CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBQAllEAs() argument
5605 struct nls_table *nls_codepage = cifs_sb->local_nls; in CIFSSMBQAllEAs()
5618 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBQAllEAs()
5623 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQAllEAs()
5625 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBQAllEAs()
5630 list_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBQAllEAs()
5634 pSMB->TotalDataCount = 0; in CIFSSMBQAllEAs()
5635 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQAllEAs()
5637 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQAllEAs()
5638 pSMB->MaxSetupCount = 0; in CIFSSMBQAllEAs()
5639 pSMB->Reserved = 0; in CIFSSMBQAllEAs()
5640 pSMB->Flags = 0; in CIFSSMBQAllEAs()
5641 pSMB->Timeout = 0; in CIFSSMBQAllEAs()
5642 pSMB->Reserved2 = 0; in CIFSSMBQAllEAs()
5643 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQAllEAs()
5644 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQAllEAs()
5645 pSMB->DataCount = 0; in CIFSSMBQAllEAs()
5646 pSMB->DataOffset = 0; in CIFSSMBQAllEAs()
5647 pSMB->SetupCount = 1; in CIFSSMBQAllEAs()
5648 pSMB->Reserved3 = 0; in CIFSSMBQAllEAs()
5649 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQAllEAs()
5651 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQAllEAs()
5652 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQAllEAs()
5653 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_QUERY_ALL_EAS); in CIFSSMBQAllEAs()
5654 pSMB->Reserved4 = 0; in CIFSSMBQAllEAs()
5656 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQAllEAs()
5658 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQAllEAs()
5671 if (rc || get_bcc(&pSMBr->hdr) < 4) { in CIFSSMBQAllEAs()
5672 rc = -EIO; /* bad smb */ in CIFSSMBQAllEAs()
5684 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQAllEAs()
5686 (((char *) &pSMBr->hdr.Protocol) + data_offset); in CIFSSMBQAllEAs()
5688 list_len = le32_to_cpu(ea_response_data->list_len); in CIFSSMBQAllEAs()
5694 rc = -ENODATA; in CIFSSMBQAllEAs()
5699 end_of_smb = (char *)pByteArea(&pSMBr->hdr) + get_bcc(&pSMBr->hdr); in CIFSSMBQAllEAs()
5702 rc = -EIO; in CIFSSMBQAllEAs()
5707 list_len -= 4; in CIFSSMBQAllEAs()
5708 temp_fea = &ea_response_data->list; in CIFSSMBQAllEAs()
5714 list_len -= 4; in CIFSSMBQAllEAs()
5719 rc = -EIO; in CIFSSMBQAllEAs()
5723 name_len = temp_fea->name_len; in CIFSSMBQAllEAs()
5724 value_len = le16_to_cpu(temp_fea->value_len); in CIFSSMBQAllEAs()
5725 list_len -= name_len + 1 + value_len; in CIFSSMBQAllEAs()
5728 rc = -EIO; in CIFSSMBQAllEAs()
5740 rc = -ERANGE; in CIFSSMBQAllEAs()
5758 /* skip copy - calc size only */ in CIFSSMBQAllEAs()
5761 rc = -ERANGE; in CIFSSMBQAllEAs()
5771 rc = -ENODATA; in CIFSSMBQAllEAs()
5775 if (rc == -EAGAIN) in CIFSSMBQAllEAs()
5782 CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon, in CIFSSMBSetEA() argument
5798 rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, in CIFSSMBSetEA()
5803 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEA()
5805 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetEA()
5810 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetEA()
5824 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEA()
5826 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetEA()
5827 pSMB->MaxSetupCount = 0; in CIFSSMBSetEA()
5828 pSMB->Reserved = 0; in CIFSSMBSetEA()
5829 pSMB->Flags = 0; in CIFSSMBSetEA()
5830 pSMB->Timeout = 0; in CIFSSMBSetEA()
5831 pSMB->Reserved2 = 0; in CIFSSMBSetEA()
5833 InformationLevel) - 4; in CIFSSMBSetEA()
5835 pSMB->InformationLevel = in CIFSSMBSetEA()
5839 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEA()
5840 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEA()
5841 pSMB->SetupCount = 1; in CIFSSMBSetEA()
5842 pSMB->Reserved3 = 0; in CIFSSMBSetEA()
5843 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEA()
5845 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetEA()
5846 parm_data->list_len = cpu_to_le32(count); in CIFSSMBSetEA()
5847 parm_data->list.EA_flags = 0; in CIFSSMBSetEA()
5849 parm_data->list.name_len = (__u8)name_len; in CIFSSMBSetEA()
5850 /* EA names are always ASCII and NUL-terminated */ in CIFSSMBSetEA()
5851 strscpy(parm_data->list.name, ea_name ?: "", name_len + 1); in CIFSSMBSetEA()
5852 parm_data->list.value_len = cpu_to_le16(ea_value_len); in CIFSSMBSetEA()
5858 /* if (ea_value_len > buffer_size - 512 (enough for header)) */ in CIFSSMBSetEA()
5860 memcpy(parm_data->list.name + name_len + 1, in CIFSSMBSetEA()
5863 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEA()
5864 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEA()
5865 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEA()
5866 pSMB->Reserved4 = 0; in CIFSSMBSetEA()
5868 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEA()
5869 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEA()
5876 if (rc == -EAGAIN) in CIFSSMBSetEA()