Lines Matching +full:set +full:- +full:aces

1 // SPDX-License-Identifier: LGPL-2.1
11 /* SMB/CIFS PDU handling routines here - except for leftovers in connect.c */
80 * tcp and smb session status done differently for those three - in the in cifs_reconnect_tcon()
86 ses = tcon->ses; in cifs_reconnect_tcon()
87 server = ses->server; in cifs_reconnect_tcon()
93 spin_lock(&tcon->tc_lock); in cifs_reconnect_tcon()
94 if (tcon->status == TID_EXITING) { in cifs_reconnect_tcon()
96 spin_unlock(&tcon->tc_lock); in cifs_reconnect_tcon()
99 return -ENODEV; in cifs_reconnect_tcon()
102 spin_unlock(&tcon->tc_lock); in cifs_reconnect_tcon()
105 rc = cifs_wait_for_server_reconnect(server, tcon->retry); in cifs_reconnect_tcon()
109 spin_lock(&ses->chan_lock); in cifs_reconnect_tcon()
110 if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) { in cifs_reconnect_tcon()
111 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
114 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
116 mutex_lock(&ses->session_mutex); in cifs_reconnect_tcon()
120 * and tcpStatus set to reconnect. in cifs_reconnect_tcon()
122 spin_lock(&server->srv_lock); in cifs_reconnect_tcon()
123 if (server->tcpStatus == CifsNeedReconnect) { in cifs_reconnect_tcon()
124 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
125 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
127 if (tcon->retry) in cifs_reconnect_tcon()
129 rc = -EHOSTDOWN; in cifs_reconnect_tcon()
132 spin_unlock(&server->srv_lock); in cifs_reconnect_tcon()
134 nls_codepage = ses->local_nls; in cifs_reconnect_tcon()
140 spin_lock(&ses->ses_lock); in cifs_reconnect_tcon()
141 spin_lock(&ses->chan_lock); in cifs_reconnect_tcon()
143 ses->ses_status == SES_GOOD) { in cifs_reconnect_tcon()
144 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
145 spin_unlock(&ses->ses_lock); in cifs_reconnect_tcon()
148 if (tcon->need_reconnect) in cifs_reconnect_tcon()
151 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
154 spin_unlock(&ses->chan_lock); in cifs_reconnect_tcon()
155 spin_unlock(&ses->ses_lock); in cifs_reconnect_tcon()
162 if (rc || !tcon->need_reconnect) { in cifs_reconnect_tcon()
163 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
170 mutex_unlock(&ses->session_mutex); in cifs_reconnect_tcon()
202 rc = -EAGAIN; in cifs_reconnect_tcon()
208 /* Allocate and return pointer to an SMB request buffer, and set basic
224 return -ENOMEM; in small_smb_init()
231 cifs_stats_inc(&tcon->num_smbs_sent); in small_smb_init()
248 buffer->Mid = get_next_mid(ses->server); in small_smb_init_no_tc()
249 if (ses->capabilities & CAP_UNICODE) in small_smb_init_no_tc()
250 buffer->Flags2 |= SMBFLG2_UNICODE; in small_smb_init_no_tc()
251 if (ses->capabilities & CAP_STATUS32) in small_smb_init_no_tc()
252 buffer->Flags2 |= SMBFLG2_ERR_STATUS; in small_smb_init_no_tc()
254 /* uid, tid can stay at zero as set in header assemble */ in small_smb_init_no_tc()
270 return -ENOMEM; in __smb_init()
283 cifs_stats_inc(&tcon->num_smbs_sent); in __smb_init()
306 spin_lock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
307 if (cifs_chan_needs_reconnect(tcon->ses, tcon->ses->server) || in smb_init_no_reconnect()
308 tcon->need_reconnect) { in smb_init_no_reconnect()
309 spin_unlock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
310 return -EHOSTDOWN; in smb_init_no_reconnect()
312 spin_unlock(&tcon->ses->chan_lock); in smb_init_no_reconnect()
322 if (pSMB->hdr.WordCount < 10) in validate_t2()
326 if (get_unaligned_le16(&pSMB->t2_rsp.ParameterOffset) > 1024 || in validate_t2()
327 get_unaligned_le16(&pSMB->t2_rsp.DataOffset) > 1024) in validate_t2()
330 total_size = get_unaligned_le16(&pSMB->t2_rsp.ParameterCount); in validate_t2()
337 total_size += get_unaligned_le16(&pSMB->t2_rsp.DataCount); in validate_t2()
338 if (total_size > get_bcc(&pSMB->hdr) || in validate_t2()
346 return -EINVAL; in validate_t2()
354 char *guid = pSMBr->u.extended_response.GUID; in decode_ext_sec_blob()
355 struct TCP_Server_Info *server = ses->server; in decode_ext_sec_blob()
357 count = get_bcc(&pSMBr->hdr); in decode_ext_sec_blob()
359 return -EIO; in decode_ext_sec_blob()
362 if (server->srv_count > 1) { in decode_ext_sec_blob()
364 if (memcmp(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE) != 0) { in decode_ext_sec_blob()
366 memcpy(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE); in decode_ext_sec_blob()
370 memcpy(server->server_GUID, guid, SMB1_CLIENT_GUID_SIZE); in decode_ext_sec_blob()
374 server->sec_ntlmssp = true; in decode_ext_sec_blob()
376 count -= SMB1_CLIENT_GUID_SIZE; in decode_ext_sec_blob()
378 pSMBr->u.extended_response.SecurityBlob, count, server); in decode_ext_sec_blob()
380 return -EINVAL; in decode_ext_sec_blob()
417 return -EIO; in CIFSSMBNegotiate()
425 pSMB->hdr.Mid = get_next_mid(server); in CIFSSMBNegotiate()
426 pSMB->hdr.Flags2 |= (SMBFLG2_UNICODE | SMBFLG2_ERR_STATUS); in CIFSSMBNegotiate()
428 if (should_set_ext_sec_flag(ses->sectype)) { in CIFSSMBNegotiate()
430 pSMB->hdr.Flags2 |= SMBFLG2_EXT_SEC; in CIFSSMBNegotiate()
441 memcpy(&pSMB->DialectsArray[count], protocols[i].name, len); in CIFSSMBNegotiate()
445 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBNegotiate()
452 server->dialect = le16_to_cpu(pSMBr->DialectIndex); in CIFSSMBNegotiate()
453 cifs_dbg(FYI, "Dialect: %d\n", server->dialect); in CIFSSMBNegotiate()
455 if ((pSMBr->hdr.WordCount <= 13) || (server->dialect == BAD_PROT)) { in CIFSSMBNegotiate()
456 /* core returns wct = 1, but we do not ask for core - otherwise in CIFSSMBNegotiate()
457 small wct just comes when dialect index is -1 indicating we in CIFSSMBNegotiate()
459 rc = -EOPNOTSUPP; in CIFSSMBNegotiate()
461 } else if (pSMBr->hdr.WordCount != 17) { in CIFSSMBNegotiate()
463 rc = -EOPNOTSUPP; in CIFSSMBNegotiate()
468 server->sec_mode = pSMBr->SecurityMode; in CIFSSMBNegotiate()
469 if ((server->sec_mode & SECMODE_USER) == 0) in CIFSSMBNegotiate()
474 server->maxReq = min_t(unsigned int, le16_to_cpu(pSMBr->MaxMpxCount), in CIFSSMBNegotiate()
476 set_credits(server, server->maxReq); in CIFSSMBNegotiate()
478 server->maxBuf = le32_to_cpu(pSMBr->MaxBufferSize); in CIFSSMBNegotiate()
479 /* set up max_read for readahead check */ in CIFSSMBNegotiate()
480 server->max_read = server->maxBuf; in CIFSSMBNegotiate()
481 server->max_rw = le32_to_cpu(pSMBr->MaxRawSize); in CIFSSMBNegotiate()
482 cifs_dbg(NOISY, "Max buf = %d\n", ses->server->maxBuf); in CIFSSMBNegotiate()
483 server->capabilities = le32_to_cpu(pSMBr->Capabilities); in CIFSSMBNegotiate()
484 server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); in CIFSSMBNegotiate()
485 server->timeAdj *= 60; in CIFSSMBNegotiate()
487 if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) { in CIFSSMBNegotiate()
488 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
489 memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, in CIFSSMBNegotiate()
491 } else if (pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC || in CIFSSMBNegotiate()
492 server->capabilities & CAP_EXTENDED_SECURITY) { in CIFSSMBNegotiate()
493 server->negflavor = CIFS_NEGFLAVOR_EXTENDED; in CIFSSMBNegotiate()
495 } else if (server->sec_mode & SECMODE_PW_ENCRYPT) { in CIFSSMBNegotiate()
496 rc = -EIO; /* no crypt key only if plain text pwd */ in CIFSSMBNegotiate()
498 server->negflavor = CIFS_NEGFLAVOR_UNENCAP; in CIFSSMBNegotiate()
499 server->capabilities &= ~CAP_EXTENDED_SECURITY; in CIFSSMBNegotiate()
503 rc = cifs_enable_signing(server, ses->sign); in CIFSSMBNegotiate()
520 if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) in CIFSSMBTDis()
521 return -EIO; in CIFSSMBTDis()
529 spin_lock(&tcon->ses->chan_lock); in CIFSSMBTDis()
530 if ((tcon->need_reconnect) || CIFS_ALL_CHANS_NEED_RECONNECT(tcon->ses)) { in CIFSSMBTDis()
531 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
532 return -EIO; in CIFSSMBTDis()
534 spin_unlock(&tcon->ses->chan_lock); in CIFSSMBTDis()
541 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)smb_buffer, 0); in CIFSSMBTDis()
548 if (rc == -EAGAIN) in CIFSSMBTDis()
555 * This is a no-op for now. We're not really interested in the reply, but
556 * rather in the fact that the server sent one and that server->lstrp
564 struct TCP_Server_Info *server = mid->callback_data; in cifs_echo_callback()
586 if (server->capabilities & CAP_UNICODE) in CIFSSMBEcho()
587 smb->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSSMBEcho()
589 /* set up echo request */ in CIFSSMBEcho()
590 smb->hdr.Tid = 0xffff; in CIFSSMBEcho()
591 smb->hdr.WordCount = 1; in CIFSSMBEcho()
592 put_unaligned_le16(1, &smb->EchoCount); in CIFSSMBEcho()
593 put_bcc(1, &smb->hdr); in CIFSSMBEcho()
594 smb->Data[0] = 'a'; in CIFSSMBEcho()
625 if (!ses || !ses->server) in CIFSSMBLogoff()
626 return -EIO; in CIFSSMBLogoff()
628 mutex_lock(&ses->session_mutex); in CIFSSMBLogoff()
629 spin_lock(&ses->chan_lock); in CIFSSMBLogoff()
631 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
635 spin_unlock(&ses->chan_lock); in CIFSSMBLogoff()
639 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
643 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSSMBLogoff()
645 if (ses->server->sign) in CIFSSMBLogoff()
646 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSSMBLogoff()
648 pSMB->hdr.Uid = ses->Suid; in CIFSSMBLogoff()
650 pSMB->AndXCommand = 0xFF; in CIFSSMBLogoff()
654 mutex_unlock(&ses->session_mutex); in CIFSSMBLogoff()
659 if (rc == -EAGAIN) in CIFSSMBLogoff()
684 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXDelFile()
686 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSPOSIXDelFile()
691 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSPOSIXDelFile()
695 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXDelFile()
696 pSMB->MaxDataCount = 0; /* BB double check this with jra */ in CIFSPOSIXDelFile()
697 pSMB->MaxSetupCount = 0; in CIFSPOSIXDelFile()
698 pSMB->Reserved = 0; in CIFSPOSIXDelFile()
699 pSMB->Flags = 0; in CIFSPOSIXDelFile()
700 pSMB->Timeout = 0; in CIFSPOSIXDelFile()
701 pSMB->Reserved2 = 0; in CIFSPOSIXDelFile()
703 InformationLevel) - 4; in CIFSPOSIXDelFile()
711 pRqD->type = cpu_to_le16(type); in CIFSPOSIXDelFile()
712 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXDelFile()
713 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXDelFile()
714 pSMB->SetupCount = 1; in CIFSPOSIXDelFile()
715 pSMB->Reserved3 = 0; in CIFSPOSIXDelFile()
716 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXDelFile()
719 pSMB->DataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
720 pSMB->TotalDataCount = cpu_to_le16(sizeof(struct unlink_psx_rq)); in CIFSPOSIXDelFile()
721 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXDelFile()
722 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXDelFile()
723 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_UNLINK); in CIFSPOSIXDelFile()
724 pSMB->Reserved4 = 0; in CIFSPOSIXDelFile()
726 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXDelFile()
727 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXDelFile()
733 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSPOSIXDelFile()
735 if (rc == -EAGAIN) in CIFSPOSIXDelFile()
758 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBDelFile()
759 name_len = cifsConvertToUTF16((__le16 *) pSMB->fileName, name, in CIFSSMBDelFile()
760 PATH_MAX, cifs_sb->local_nls, in CIFSSMBDelFile()
765 name_len = copy_path_name(pSMB->fileName, name); in CIFSSMBDelFile()
767 pSMB->SearchAttributes = in CIFSSMBDelFile()
769 pSMB->BufferFormat = 0x04; in CIFSSMBDelFile()
771 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBDelFile()
772 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBDelFile()
774 cifs_stats_inc(&tcon->stats.cifs_stats.num_deletes); in CIFSSMBDelFile()
779 if (rc == -EAGAIN) in CIFSSMBDelFile()
803 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRmDir()
804 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBRmDir()
805 PATH_MAX, cifs_sb->local_nls, in CIFSSMBRmDir()
810 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBRmDir()
813 pSMB->BufferFormat = 0x04; in CIFSSMBRmDir()
815 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBRmDir()
816 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRmDir()
818 cifs_stats_inc(&tcon->stats.cifs_stats.num_rmdirs); in CIFSSMBRmDir()
823 if (rc == -EAGAIN) in CIFSSMBRmDir()
847 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBMkDir()
848 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, in CIFSSMBMkDir()
849 PATH_MAX, cifs_sb->local_nls, in CIFSSMBMkDir()
854 name_len = copy_path_name(pSMB->DirName, name); in CIFSSMBMkDir()
857 pSMB->BufferFormat = 0x04; in CIFSSMBMkDir()
859 pSMB->ByteCount = cpu_to_le16(name_len + 1); in CIFSSMBMkDir()
860 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBMkDir()
862 cifs_stats_inc(&tcon->stats.cifs_stats.num_mkdirs); in CIFSSMBMkDir()
867 if (rc == -EAGAIN) in CIFSSMBMkDir()
895 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSPOSIXCreate()
897 cifsConvertToUTF16((__le16 *) pSMB->FileName, name, in CIFSPOSIXCreate()
902 name_len = copy_path_name(pSMB->FileName, name); in CIFSPOSIXCreate()
907 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSPOSIXCreate()
908 pSMB->MaxDataCount = cpu_to_le16(1000); /* large enough */ in CIFSPOSIXCreate()
909 pSMB->MaxSetupCount = 0; in CIFSPOSIXCreate()
910 pSMB->Reserved = 0; in CIFSPOSIXCreate()
911 pSMB->Flags = 0; in CIFSPOSIXCreate()
912 pSMB->Timeout = 0; in CIFSPOSIXCreate()
913 pSMB->Reserved2 = 0; in CIFSPOSIXCreate()
915 InformationLevel) - 4; in CIFSPOSIXCreate()
919 pdata->Level = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSPOSIXCreate()
920 pdata->Permissions = cpu_to_le64(mode); in CIFSPOSIXCreate()
921 pdata->PosixOpenFlags = cpu_to_le32(posix_flags); in CIFSPOSIXCreate()
922 pdata->OpenFlags = cpu_to_le32(*pOplock); in CIFSPOSIXCreate()
923 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSPOSIXCreate()
924 pSMB->DataOffset = cpu_to_le16(offset); in CIFSPOSIXCreate()
925 pSMB->SetupCount = 1; in CIFSPOSIXCreate()
926 pSMB->Reserved3 = 0; in CIFSPOSIXCreate()
927 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSPOSIXCreate()
930 pSMB->DataCount = cpu_to_le16(count); in CIFSPOSIXCreate()
931 pSMB->ParameterCount = cpu_to_le16(params); in CIFSPOSIXCreate()
932 pSMB->TotalDataCount = pSMB->DataCount; in CIFSPOSIXCreate()
933 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSPOSIXCreate()
934 pSMB->InformationLevel = cpu_to_le16(SMB_POSIX_OPEN); in CIFSPOSIXCreate()
935 pSMB->Reserved4 = 0; in CIFSPOSIXCreate()
937 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSPOSIXCreate()
938 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSPOSIXCreate()
948 if (rc || get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP)) { in CIFSPOSIXCreate()
949 rc = -EIO; /* bad smb */ in CIFSPOSIXCreate()
954 psx_rsp = (OPEN_PSX_RSP *)((char *) &pSMBr->hdr.Protocol in CIFSPOSIXCreate()
955 + le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSPOSIXCreate()
957 *pOplock = le16_to_cpu(psx_rsp->OplockFlags); in CIFSPOSIXCreate()
959 *netfid = psx_rsp->Fid; /* cifs fid stays in le */ in CIFSPOSIXCreate()
960 /* Let caller know file was created so we can set the mode. */ in CIFSPOSIXCreate()
962 if (cpu_to_le32(FILE_CREATE) == psx_rsp->CreateAction) in CIFSPOSIXCreate()
965 if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { in CIFSPOSIXCreate()
966 pRetData->Type = cpu_to_le32(-1); /* unknown */ in CIFSPOSIXCreate()
969 if (get_bcc(&pSMBr->hdr) < sizeof(OPEN_PSX_RSP) in CIFSPOSIXCreate()
972 pRetData->Type = cpu_to_le32(-1); in CIFSPOSIXCreate()
984 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixmkdirs); in CIFSPOSIXCreate()
986 cifs_stats_inc(&tcon->stats.cifs_stats.num_posixopens); in CIFSPOSIXCreate()
988 if (rc == -EAGAIN) in CIFSPOSIXCreate()
1058 pSMB->AndXCommand = 0xFF; /* none */ in SMBLegacyOpen()
1060 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBLegacyOpen()
1063 cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1), in SMBLegacyOpen()
1069 name_len = copy_path_name(pSMB->fileName, fileName); in SMBLegacyOpen()
1072 pSMB->OpenFlags = cpu_to_le16(REQ_OPLOCK); in SMBLegacyOpen()
1074 pSMB->OpenFlags = cpu_to_le16(REQ_BATCHOPLOCK); in SMBLegacyOpen()
1076 pSMB->OpenFlags |= cpu_to_le16(REQ_MORE_INFO); in SMBLegacyOpen()
1077 pSMB->Mode = cpu_to_le16(access_flags_to_smbopen_mode(access_flags)); in SMBLegacyOpen()
1078 pSMB->Mode |= cpu_to_le16(0x40); /* deny none */ in SMBLegacyOpen()
1079 /* set file as system file if special file such as fifo, in SMBLegacyOpen()
1084 pSMB->FileAttributes = cpu_to_le16(ATTR_SYSTEM); in SMBLegacyOpen()
1086 pSMB->FileAttributes = cpu_to_le16(0/*ATTR_NORMAL*/); in SMBLegacyOpen()
1089 pSMB->FileAttributes |= cpu_to_le16(ATTR_READONLY); in SMBLegacyOpen()
1092 /* pSMB->CreateOptions = cpu_to_le32(create_options & in SMBLegacyOpen()
1096 pSMB->Sattr = cpu_to_le16(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_DIRECTORY); in SMBLegacyOpen()
1097 pSMB->OpenFunction = cpu_to_le16(convert_disposition(openDisposition)); in SMBLegacyOpen()
1101 pSMB->ByteCount = cpu_to_le16(count); in SMBLegacyOpen()
1102 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBLegacyOpen()
1104 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in SMBLegacyOpen()
1110 /* *pOplock = pSMBr->OplockLevel; */ /* BB take from action field*/ in SMBLegacyOpen()
1112 *netfid = pSMBr->Fid; /* cifs fid stays in le */ in SMBLegacyOpen()
1113 /* Let caller know file was created so we can set the mode. */ in SMBLegacyOpen()
1116 /* if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction) in SMBLegacyOpen()
1121 pfile_info->CreationTime = 0; /* BB convert CreateTime*/ in SMBLegacyOpen()
1122 pfile_info->LastAccessTime = 0; /* BB fixme */ in SMBLegacyOpen()
1123 pfile_info->LastWriteTime = 0; /* BB fixme */ in SMBLegacyOpen()
1124 pfile_info->ChangeTime = 0; /* BB fixme */ in SMBLegacyOpen()
1125 pfile_info->Attributes = in SMBLegacyOpen()
1126 cpu_to_le32(le16_to_cpu(pSMBr->FileAttributes)); in SMBLegacyOpen()
1128 pfile_info->AllocationSize = in SMBLegacyOpen()
1129 cpu_to_le64(le32_to_cpu(pSMBr->EndOfFile)); in SMBLegacyOpen()
1130 pfile_info->EndOfFile = pfile_info->AllocationSize; in SMBLegacyOpen()
1131 pfile_info->NumberOfLinks = cpu_to_le32(1); in SMBLegacyOpen()
1132 pfile_info->DeletePending = 0; in SMBLegacyOpen()
1137 if (rc == -EAGAIN) in SMBLegacyOpen()
1152 struct cifs_sb_info *cifs_sb = oparms->cifs_sb; in CIFS_open()
1153 struct cifs_tcon *tcon = oparms->tcon; in CIFS_open()
1155 const struct nls_table *nls = cifs_sb->local_nls; in CIFS_open()
1156 int create_options = oparms->create_options; in CIFS_open()
1157 int desired_access = oparms->desired_access; in CIFS_open()
1158 int disposition = oparms->disposition; in CIFS_open()
1159 const char *path = oparms->path; in CIFS_open()
1168 req->AndXCommand = 0xFF; in CIFS_open()
1170 if (req->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFS_open()
1173 name_len = cifsConvertToUTF16((__le16 *)(req->fileName + 1), in CIFS_open()
1178 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1183 name_len = copy_path_name(req->fileName, path); in CIFS_open()
1184 req->NameLength = cpu_to_le16(name_len); in CIFS_open()
1188 req->OpenFlags = cpu_to_le32(REQ_OPLOCK); in CIFS_open()
1190 req->OpenFlags = cpu_to_le32(REQ_BATCHOPLOCK); in CIFS_open()
1192 req->DesiredAccess = cpu_to_le32(desired_access); in CIFS_open()
1193 req->AllocationSize = 0; in CIFS_open()
1196 * Set file as system file if special file such as fifo, socket, char in CIFS_open()
1200 req->FileAttributes = cpu_to_le32(ATTR_SYSTEM); in CIFS_open()
1202 req->FileAttributes = cpu_to_le32(ATTR_NORMAL); in CIFS_open()
1208 if (tcon->ses->capabilities & CAP_UNIX) in CIFS_open()
1209 req->FileAttributes |= cpu_to_le32(ATTR_POSIX_SEMANTICS); in CIFS_open()
1212 req->FileAttributes |= cpu_to_le32(ATTR_READONLY); in CIFS_open()
1214 req->ShareAccess = cpu_to_le32(FILE_SHARE_ALL); in CIFS_open()
1215 req->CreateDisposition = cpu_to_le32(disposition); in CIFS_open()
1216 req->CreateOptions = cpu_to_le32(create_options & CREATE_OPTIONS_MASK); in CIFS_open()
1219 req->ImpersonationLevel = cpu_to_le32(SECURITY_IMPERSONATION); in CIFS_open()
1220 req->SecurityFlags = SECURITY_CONTEXT_TRACKING|SECURITY_EFFECTIVE_ONLY; in CIFS_open()
1225 req->ByteCount = cpu_to_le16(count); in CIFS_open()
1226 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)req, in CIFS_open()
1228 cifs_stats_inc(&tcon->stats.cifs_stats.num_opens); in CIFS_open()
1232 if (rc == -EAGAIN) in CIFS_open()
1238 *oplock = rsp->OplockLevel; in CIFS_open()
1240 oparms->fid->netfid = rsp->Fid; in CIFS_open()
1241 oparms->fid->access = desired_access; in CIFS_open()
1243 /* Let caller know file was created so we can set the mode. */ in CIFS_open()
1245 if (cpu_to_le32(FILE_CREATE) == rsp->CreateAction) in CIFS_open()
1250 memcpy(&buf->common_attributes, in CIFS_open()
1251 &rsp->common_attributes, in CIFS_open()
1252 sizeof(buf->common_attributes)); in CIFS_open()
1254 buf->AllocationSize = rsp->AllocationSize; in CIFS_open()
1255 buf->EndOfFile = rsp->EndOfFile; in CIFS_open()
1256 buf->NumberOfLinks = cpu_to_le32(1); in CIFS_open()
1257 buf->DeletePending = 0; in CIFS_open()
1269 netfs_read_subreq_terminated(&rdata->subreq, rdata->result, false); in cifs_readv_worker()
1275 struct cifs_io_subrequest *rdata = mid->callback_data; in cifs_readv_callback()
1276 struct netfs_inode *ictx = netfs_inode(rdata->rreq->inode); in cifs_readv_callback()
1277 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); in cifs_readv_callback()
1278 struct TCP_Server_Info *server = tcon->ses->server; in cifs_readv_callback()
1279 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_readv_callback()
1281 .rq_iter = rdata->subreq.io_iter }; in cifs_readv_callback()
1285 .rreq_debug_id = rdata->rreq->debug_id, in cifs_readv_callback()
1286 .rreq_debug_index = rdata->subreq.debug_index, in cifs_readv_callback()
1290 __func__, mid->mid, mid->mid_state, rdata->result, in cifs_readv_callback()
1291 rdata->subreq.len); in cifs_readv_callback()
1293 switch (mid->mid_state) { in cifs_readv_callback()
1295 /* result already set, check signature */ in cifs_readv_callback()
1296 if (server->sign) { in cifs_readv_callback()
1299 iov_iter_truncate(&rqst.rq_iter, rdata->got_bytes); in cifs_readv_callback()
1301 mid->sequence_number); in cifs_readv_callback()
1307 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1308 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1312 rdata->result = -EAGAIN; in cifs_readv_callback()
1313 if (server->sign && rdata->got_bytes) in cifs_readv_callback()
1315 rdata->got_bytes = 0; in cifs_readv_callback()
1317 task_io_account_read(rdata->got_bytes); in cifs_readv_callback()
1318 cifs_stats_bytes_read(tcon, rdata->got_bytes); in cifs_readv_callback()
1321 rdata->result = -EIO; in cifs_readv_callback()
1324 if (rdata->result == -ENODATA) { in cifs_readv_callback()
1325 __set_bit(NETFS_SREQ_HIT_EOF, &rdata->subreq.flags); in cifs_readv_callback()
1326 rdata->result = 0; in cifs_readv_callback()
1328 size_t trans = rdata->subreq.transferred + rdata->got_bytes; in cifs_readv_callback()
1329 if (trans < rdata->subreq.len && in cifs_readv_callback()
1330 rdata->subreq.start + trans == ictx->remote_i_size) { in cifs_readv_callback()
1331 __set_bit(NETFS_SREQ_HIT_EOF, &rdata->subreq.flags); in cifs_readv_callback()
1332 rdata->result = 0; in cifs_readv_callback()
1336 rdata->credits.value = 0; in cifs_readv_callback()
1337 rdata->subreq.transferred += rdata->got_bytes; in cifs_readv_callback()
1338 INIT_WORK(&rdata->subreq.work, cifs_readv_worker); in cifs_readv_callback()
1339 queue_work(cifsiod_wq, &rdata->subreq.work); in cifs_readv_callback()
1344 /* cifs_async_readv - send an async write, and set up mid to handle result */
1351 struct cifs_tcon *tcon = tlink_tcon(rdata->req->cfile->tlink); in cifs_async_readv()
1352 struct smb_rqst rqst = { .rq_iov = rdata->iov, in cifs_async_readv()
1356 __func__, rdata->subreq.start, rdata->subreq.len); in cifs_async_readv()
1358 if (tcon->ses->capabilities & CAP_LARGE_FILES) in cifs_async_readv()
1362 if ((rdata->subreq.start >> 32) > 0) { in cifs_async_readv()
1364 return -EIO; in cifs_async_readv()
1372 smb->hdr.Pid = cpu_to_le16((__u16)rdata->req->pid); in cifs_async_readv()
1373 smb->hdr.PidHigh = cpu_to_le16((__u16)(rdata->req->pid >> 16)); in cifs_async_readv()
1375 smb->AndXCommand = 0xFF; /* none */ in cifs_async_readv()
1376 smb->Fid = rdata->req->cfile->fid.netfid; in cifs_async_readv()
1377 smb->OffsetLow = cpu_to_le32(rdata->subreq.start & 0xFFFFFFFF); in cifs_async_readv()
1379 smb->OffsetHigh = cpu_to_le32(rdata->subreq.start >> 32); in cifs_async_readv()
1380 smb->Remaining = 0; in cifs_async_readv()
1381 smb->MaxCount = cpu_to_le16(rdata->subreq.len & 0xFFFF); in cifs_async_readv()
1382 smb->MaxCountHigh = cpu_to_le32(rdata->subreq.len >> 16); in cifs_async_readv()
1384 smb->ByteCount = 0; in cifs_async_readv()
1389 smbr->ByteCount = 0; in cifs_async_readv()
1393 rdata->iov[0].iov_base = smb; in cifs_async_readv()
1394 rdata->iov[0].iov_len = 4; in cifs_async_readv()
1395 rdata->iov[1].iov_base = (char *)smb + 4; in cifs_async_readv()
1396 rdata->iov[1].iov_len = get_rfc1002_length(smb); in cifs_async_readv()
1398 rc = cifs_call_async(tcon->ses->server, &rqst, cifs_readv_receive, in cifs_async_readv()
1402 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in cifs_async_readv()
1411 int rc = -EACCES; in CIFSSMBRead()
1419 __u32 pid = io_parms->pid; in CIFSSMBRead()
1420 __u16 netfid = io_parms->netfid; in CIFSSMBRead()
1421 __u64 offset = io_parms->offset; in CIFSSMBRead()
1422 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBRead()
1423 unsigned int count = io_parms->length; in CIFSSMBRead()
1426 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBRead()
1432 return -EIO; in CIFSSMBRead()
1441 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBRead()
1442 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBRead()
1445 if (tcon->ses->server == NULL) in CIFSSMBRead()
1446 return -ECONNABORTED; in CIFSSMBRead()
1448 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBRead()
1449 pSMB->Fid = netfid; in CIFSSMBRead()
1450 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBRead()
1452 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBRead()
1454 pSMB->Remaining = 0; in CIFSSMBRead()
1455 pSMB->MaxCount = cpu_to_le16(count & 0xFFFF); in CIFSSMBRead()
1456 pSMB->MaxCountHigh = cpu_to_le32(count >> 16); in CIFSSMBRead()
1458 pSMB->ByteCount = 0; /* no need to do le conversion since 0 */ in CIFSSMBRead()
1463 pSMBW->ByteCount = 0; in CIFSSMBRead()
1467 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBRead()
1468 rc = SendReceive2(xid, tcon->ses, iov, 1, &resp_buf_type, in CIFSSMBRead()
1471 cifs_stats_inc(&tcon->stats.cifs_stats.num_reads); in CIFSSMBRead()
1476 int data_length = le16_to_cpu(pSMBr->DataLengthHigh); in CIFSSMBRead()
1478 data_length += le16_to_cpu(pSMBr->DataLength); in CIFSSMBRead()
1486 rc = -EIO; in CIFSSMBRead()
1489 pReadData = (char *) (&pSMBr->hdr.Protocol) + in CIFSSMBRead()
1490 le16_to_cpu(pSMBr->DataOffset); in CIFSSMBRead()
1493 rc = -EFAULT; in CIFSSMBRead()
1509 } /* else no valid buffer on return - leave as null */ in CIFSSMBRead()
1511 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRead()
1521 int rc = -EACCES; in CIFSSMBWrite()
1527 __u32 pid = io_parms->pid; in CIFSSMBWrite()
1528 __u16 netfid = io_parms->netfid; in CIFSSMBWrite()
1529 __u64 offset = io_parms->offset; in CIFSSMBWrite()
1530 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite()
1531 unsigned int count = io_parms->length; in CIFSSMBWrite()
1536 if (tcon->ses == NULL) in CIFSSMBWrite()
1537 return -ECONNABORTED; in CIFSSMBWrite()
1539 if (tcon->ses->capabilities & CAP_LARGE_FILES) in CIFSSMBWrite()
1545 return -EIO; in CIFSSMBWrite()
1554 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite()
1555 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite()
1558 if (tcon->ses->server == NULL) in CIFSSMBWrite()
1559 return -ECONNABORTED; in CIFSSMBWrite()
1561 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite()
1562 pSMB->Fid = netfid; in CIFSSMBWrite()
1563 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite()
1565 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite()
1567 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite()
1568 pSMB->WriteMode = 0; in CIFSSMBWrite()
1569 pSMB->Remaining = 0; in CIFSSMBWrite()
1575 if (tcon->ses->capabilities & CAP_LARGE_WRITE_X) { in CIFSSMBWrite()
1578 bytes_sent = (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) in CIFSSMBWrite()
1584 pSMB->DataOffset = in CIFSSMBWrite()
1585 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite()
1587 memcpy(pSMB->Data, buf, bytes_sent); in CIFSSMBWrite()
1591 return -EINVAL; in CIFSSMBWrite()
1598 pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); in CIFSSMBWrite()
1599 pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); in CIFSSMBWrite()
1603 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1608 pSMBW->ByteCount = cpu_to_le16(byte_count); in CIFSSMBWrite()
1611 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBWrite()
1613 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite()
1617 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite()
1619 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite()
1624 * OS/2 servers are known to set incorrect CountHigh values. in CIFSSMBWrite()
1632 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite()
1645 struct cifs_io_subrequest *wdata = mid->callback_data; in cifs_writev_callback()
1646 struct TCP_Server_Info *server = wdata->server; in cifs_writev_callback()
1647 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); in cifs_writev_callback()
1648 WRITE_RSP *smb = (WRITE_RSP *)mid->resp_buf; in cifs_writev_callback()
1652 .rreq_debug_id = wdata->rreq->debug_id, in cifs_writev_callback()
1653 .rreq_debug_index = wdata->subreq.debug_index, in cifs_writev_callback()
1658 switch (mid->mid_state) { in cifs_writev_callback()
1660 result = cifs_check_receive(mid, tcon->ses->server, 0); in cifs_writev_callback()
1664 written = le16_to_cpu(smb->CountHigh); in cifs_writev_callback()
1666 written += le16_to_cpu(smb->Count); in cifs_writev_callback()
1670 * client. OS/2 servers are known to set incorrect in cifs_writev_callback()
1673 if (written > wdata->subreq.len) in cifs_writev_callback()
1676 if (written < wdata->subreq.len) in cifs_writev_callback()
1677 result = -ENOSPC; in cifs_writev_callback()
1683 result = -EAGAIN; in cifs_writev_callback()
1686 result = -EIO; in cifs_writev_callback()
1691 wdata->credits.value, in cifs_writev_callback()
1692 server->credits, server->in_flight, in cifs_writev_callback()
1694 wdata->credits.value = 0; in cifs_writev_callback()
1698 server->credits, server->in_flight, in cifs_writev_callback()
1700 add_credits(tcon->ses->server, &credits, 0); in cifs_writev_callback()
1703 /* cifs_async_writev - send an async write, and set up mid to handle result */
1707 int rc = -EACCES; in cifs_async_writev()
1710 struct cifs_tcon *tcon = tlink_tcon(wdata->req->cfile->tlink); in cifs_async_writev()
1714 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in cifs_async_writev()
1718 if (wdata->subreq.start >> 32 > 0) { in cifs_async_writev()
1720 rc = -EIO; in cifs_async_writev()
1729 smb->hdr.Pid = cpu_to_le16((__u16)wdata->req->pid); in cifs_async_writev()
1730 smb->hdr.PidHigh = cpu_to_le16((__u16)(wdata->req->pid >> 16)); in cifs_async_writev()
1732 smb->AndXCommand = 0xFF; /* none */ in cifs_async_writev()
1733 smb->Fid = wdata->req->cfile->fid.netfid; in cifs_async_writev()
1734 smb->OffsetLow = cpu_to_le32(wdata->subreq.start & 0xFFFFFFFF); in cifs_async_writev()
1736 smb->OffsetHigh = cpu_to_le32(wdata->subreq.start >> 32); in cifs_async_writev()
1737 smb->Reserved = 0xFFFFFFFF; in cifs_async_writev()
1738 smb->WriteMode = 0; in cifs_async_writev()
1739 smb->Remaining = 0; in cifs_async_writev()
1741 smb->DataOffset = in cifs_async_writev()
1742 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in cifs_async_writev()
1752 rqst.rq_iter = wdata->subreq.io_iter; in cifs_async_writev()
1755 wdata->subreq.start, wdata->subreq.len); in cifs_async_writev()
1757 smb->DataLengthLow = cpu_to_le16(wdata->subreq.len & 0xFFFF); in cifs_async_writev()
1758 smb->DataLengthHigh = cpu_to_le16(wdata->subreq.len >> 16); in cifs_async_writev()
1761 inc_rfc1001_len(&smb->hdr, wdata->subreq.len + 1); in cifs_async_writev()
1762 put_bcc(wdata->subreq.len + 1, &smb->hdr); in cifs_async_writev()
1767 inc_rfc1001_len(&smbw->hdr, wdata->subreq.len + 5); in cifs_async_writev()
1768 put_bcc(wdata->subreq.len + 5, &smbw->hdr); in cifs_async_writev()
1772 rc = cifs_call_async(tcon->ses->server, &rqst, NULL, in cifs_async_writev()
1776 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in cifs_async_writev()
1782 add_credits_and_wake_if(wdata->server, &wdata->credits, 0); in cifs_async_writev()
1796 __u32 pid = io_parms->pid; in CIFSSMBWrite2()
1797 __u16 netfid = io_parms->netfid; in CIFSSMBWrite2()
1798 __u64 offset = io_parms->offset; in CIFSSMBWrite2()
1799 struct cifs_tcon *tcon = io_parms->tcon; in CIFSSMBWrite2()
1800 unsigned int count = io_parms->length; in CIFSSMBWrite2()
1807 if (tcon->ses->capabilities & CAP_LARGE_FILES) { in CIFSSMBWrite2()
1813 return -EIO; in CIFSSMBWrite2()
1820 pSMB->hdr.Pid = cpu_to_le16((__u16)pid); in CIFSSMBWrite2()
1821 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid >> 16)); in CIFSSMBWrite2()
1824 if (tcon->ses->server == NULL) in CIFSSMBWrite2()
1825 return -ECONNABORTED; in CIFSSMBWrite2()
1827 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBWrite2()
1828 pSMB->Fid = netfid; in CIFSSMBWrite2()
1829 pSMB->OffsetLow = cpu_to_le32(offset & 0xFFFFFFFF); in CIFSSMBWrite2()
1831 pSMB->OffsetHigh = cpu_to_le32(offset >> 32); in CIFSSMBWrite2()
1832 pSMB->Reserved = 0xFFFFFFFF; in CIFSSMBWrite2()
1833 pSMB->WriteMode = 0; in CIFSSMBWrite2()
1834 pSMB->Remaining = 0; in CIFSSMBWrite2()
1836 pSMB->DataOffset = in CIFSSMBWrite2()
1837 cpu_to_le16(offsetof(struct smb_com_write_req, Data) - 4); in CIFSSMBWrite2()
1839 pSMB->DataLengthLow = cpu_to_le16(count & 0xFFFF); in CIFSSMBWrite2()
1840 pSMB->DataLengthHigh = cpu_to_le16(count >> 16); in CIFSSMBWrite2()
1842 smb_hdr_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 1; in CIFSSMBWrite2()
1848 pSMB->ByteCount = cpu_to_le16(count + 1); in CIFSSMBWrite2()
1852 pSMBW->ByteCount = cpu_to_le16(count + 5); in CIFSSMBWrite2()
1860 rc = SendReceive2(xid, tcon->ses, iov, n_vec + 1, &resp_buf_type, 0, in CIFSSMBWrite2()
1863 cifs_stats_inc(&tcon->stats.cifs_stats.num_writes); in CIFSSMBWrite2()
1868 rc = -EIO; in CIFSSMBWrite2()
1871 *nbytes = le16_to_cpu(pSMBr->CountHigh); in CIFSSMBWrite2()
1873 *nbytes += le16_to_cpu(pSMBr->Count); in CIFSSMBWrite2()
1878 * servers are known to set incorrect CountHigh values. in CIFSSMBWrite2()
1886 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBWrite2()
1910 pSMB->Timeout = 0; in cifs_lockv()
1911 pSMB->NumberOfLocks = cpu_to_le16(num_lock); in cifs_lockv()
1912 pSMB->NumberOfUnlocks = cpu_to_le16(num_unlock); in cifs_lockv()
1913 pSMB->LockType = lock_type; in cifs_lockv()
1914 pSMB->AndXCommand = 0xFF; /* none */ in cifs_lockv()
1915 pSMB->Fid = netfid; /* netfid stays le */ in cifs_lockv()
1919 pSMB->ByteCount = cpu_to_le16(count); in cifs_lockv()
1922 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4 - in cifs_lockv()
1927 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in cifs_lockv()
1928 rc = SendReceive2(xid, tcon->ses, iov, 2, &resp_buf_type, in cifs_lockv()
1961 pSMB->Timeout = 0; in CIFSSMBLock()
1964 pSMB->Timeout = cpu_to_le32(-1);/* blocking - do not time out */ in CIFSSMBLock()
1966 pSMB->Timeout = 0; in CIFSSMBLock()
1969 pSMB->NumberOfLocks = cpu_to_le16(numLock); in CIFSSMBLock()
1970 pSMB->NumberOfUnlocks = cpu_to_le16(numUnlock); in CIFSSMBLock()
1971 pSMB->LockType = lockType; in CIFSSMBLock()
1972 pSMB->OplockLevel = oplock_level; in CIFSSMBLock()
1973 pSMB->AndXCommand = 0xFF; /* none */ in CIFSSMBLock()
1974 pSMB->Fid = smb_file_id; /* netfid stays le */ in CIFSSMBLock()
1977 pSMB->Locks[0].Pid = cpu_to_le16(netpid); in CIFSSMBLock()
1979 pSMB->Locks[0].LengthLow = cpu_to_le32((u32)len); in CIFSSMBLock()
1980 pSMB->Locks[0].LengthHigh = cpu_to_le32((u32)(len>>32)); in CIFSSMBLock()
1981 pSMB->Locks[0].OffsetLow = cpu_to_le32((u32)offset); in CIFSSMBLock()
1982 pSMB->Locks[0].OffsetHigh = cpu_to_le32((u32)(offset>>32)); in CIFSSMBLock()
1989 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBLock()
1995 rc = SendReceiveNoRsp(xid, tcon->ses, (char *)pSMB, flags); in CIFSSMBLock()
1997 cifs_stats_inc(&tcon->stats.cifs_stats.num_locks); in CIFSSMBLock()
2001 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBLock()
2034 pSMB->MaxSetupCount = 0; in CIFSSMBPosixLock()
2035 pSMB->Reserved = 0; in CIFSSMBPosixLock()
2036 pSMB->Flags = 0; in CIFSSMBPosixLock()
2037 pSMB->Reserved2 = 0; in CIFSSMBPosixLock()
2038 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBPosixLock()
2042 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBPosixLock()
2043 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBPosixLock()
2044 pSMB->SetupCount = 1; in CIFSSMBPosixLock()
2045 pSMB->Reserved3 = 0; in CIFSSMBPosixLock()
2047 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBPosixLock()
2049 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBPosixLock()
2051 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBPosixLock()
2052 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBPosixLock()
2053 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBPosixLock()
2054 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBPosixLock()
2055 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBPosixLock()
2060 parm_data->lock_type = cpu_to_le16(lock_type); in CIFSSMBPosixLock()
2063 parm_data->lock_flags = cpu_to_le16(1); in CIFSSMBPosixLock()
2064 pSMB->Timeout = cpu_to_le32(-1); in CIFSSMBPosixLock()
2066 pSMB->Timeout = 0; in CIFSSMBPosixLock()
2068 parm_data->pid = cpu_to_le32(netpid); in CIFSSMBPosixLock()
2069 parm_data->start = cpu_to_le64(start_offset); in CIFSSMBPosixLock()
2070 parm_data->length = cpu_to_le64(len); /* normalize negative numbers */ in CIFSSMBPosixLock()
2072 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBPosixLock()
2073 pSMB->Fid = smb_file_id; in CIFSSMBPosixLock()
2074 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_LOCK); in CIFSSMBPosixLock()
2075 pSMB->Reserved4 = 0; in CIFSSMBPosixLock()
2077 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBPosixLock()
2083 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBPosixLock()
2084 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovecs */, in CIFSSMBPosixLock()
2098 if (rc || get_bcc(&pSMBr->hdr) < sizeof(*parm_data)) { in CIFSSMBPosixLock()
2099 rc = -EIO; /* bad smb */ in CIFSSMBPosixLock()
2102 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBPosixLock()
2103 data_count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBPosixLock()
2105 rc = -EIO; in CIFSSMBPosixLock()
2109 ((char *)&pSMBr->hdr.Protocol + data_offset); in CIFSSMBPosixLock()
2110 if (parm_data->lock_type == cpu_to_le16(CIFS_UNLCK)) in CIFSSMBPosixLock()
2111 pLockData->c.flc_type = F_UNLCK; in CIFSSMBPosixLock()
2113 if (parm_data->lock_type == in CIFSSMBPosixLock()
2115 pLockData->c.flc_type = F_RDLCK; in CIFSSMBPosixLock()
2116 else if (parm_data->lock_type == in CIFSSMBPosixLock()
2118 pLockData->c.flc_type = F_WRLCK; in CIFSSMBPosixLock()
2120 pLockData->fl_start = le64_to_cpu(parm_data->start); in CIFSSMBPosixLock()
2121 pLockData->fl_end = pLockData->fl_start + in CIFSSMBPosixLock()
2122 (le64_to_cpu(parm_data->length) ? in CIFSSMBPosixLock()
2123 le64_to_cpu(parm_data->length) - 1 : 0); in CIFSSMBPosixLock()
2124 pLockData->c.flc_pid = -le32_to_cpu(parm_data->pid); in CIFSSMBPosixLock()
2131 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBPosixLock()
2147 if (rc == -EAGAIN) in CIFSSMBClose()
2152 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBClose()
2153 pSMB->LastWriteTime = 0xFFFFFFFF; in CIFSSMBClose()
2154 pSMB->ByteCount = 0; in CIFSSMBClose()
2155 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBClose()
2157 cifs_stats_inc(&tcon->stats.cifs_stats.num_closes); in CIFSSMBClose()
2159 if (rc != -EINTR) { in CIFSSMBClose()
2160 /* EINTR is expected when user ctl-c to kill app */ in CIFSSMBClose()
2166 if (rc == -EAGAIN) in CIFSSMBClose()
2183 pSMB->FileID = (__u16) smb_file_id; in CIFSSMBFlush()
2184 pSMB->ByteCount = 0; in CIFSSMBFlush()
2185 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBFlush()
2187 cifs_stats_inc(&tcon->stats.cifs_stats.num_flushes); in CIFSSMBFlush()
2214 pSMB->BufferFormat = 0x04; in CIFSSMBRename()
2215 pSMB->SearchAttributes = in CIFSSMBRename()
2219 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBRename()
2220 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBRename()
2222 cifs_sb->local_nls, remap); in CIFSSMBRename()
2225 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBRename()
2227 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBRename()
2229 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBRename()
2230 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSSMBRename()
2235 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSSMBRename()
2236 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSSMBRename()
2237 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBRename()
2243 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBRename()
2245 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRename()
2247 cifs_stats_inc(&tcon->stats.cifs_stats.num_renames); in CIFSSMBRename()
2253 if (rc == -EAGAIN) in CIFSSMBRename()
2280 pSMB->MaxSetupCount = 0; in CIFSSMBRenameOpenFile()
2281 pSMB->Reserved = 0; in CIFSSMBRenameOpenFile()
2282 pSMB->Flags = 0; in CIFSSMBRenameOpenFile()
2283 pSMB->Timeout = 0; in CIFSSMBRenameOpenFile()
2284 pSMB->Reserved2 = 0; in CIFSSMBRenameOpenFile()
2285 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBRenameOpenFile()
2291 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBRenameOpenFile()
2292 pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ in CIFSSMBRenameOpenFile()
2293 pSMB->SetupCount = 1; in CIFSSMBRenameOpenFile()
2294 pSMB->Reserved3 = 0; in CIFSSMBRenameOpenFile()
2295 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBRenameOpenFile()
2297 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBRenameOpenFile()
2298 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBRenameOpenFile()
2299 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBRenameOpenFile()
2300 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBRenameOpenFile()
2302 rename_info->overwrite = cpu_to_le32(1); in CIFSSMBRenameOpenFile()
2303 rename_info->root_fid = 0; in CIFSSMBRenameOpenFile()
2306 sprintf(dummy_string, "cifs%x", pSMB->hdr.Mid); in CIFSSMBRenameOpenFile()
2308 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2312 cifsConvertToUTF16((__le16 *)rename_info->target_name, in CIFSSMBRenameOpenFile()
2316 rename_info->target_name_len = cpu_to_le32(2 * len_of_str); in CIFSSMBRenameOpenFile()
2319 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBRenameOpenFile()
2320 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBRenameOpenFile()
2321 pSMB->Fid = netfid; in CIFSSMBRenameOpenFile()
2322 pSMB->InformationLevel = in CIFSSMBRenameOpenFile()
2324 pSMB->Reserved4 = 0; in CIFSSMBRenameOpenFile()
2326 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBRenameOpenFile()
2327 rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBRenameOpenFile()
2329 cifs_stats_inc(&pTcon->stats.cifs_stats.num_t2renames); in CIFSSMBRenameOpenFile()
2336 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBRenameOpenFile()
2361 pSMB->BufferFormat = 0x04; in CIFSSMBCopy()
2362 pSMB->Tid2 = target_tid; in CIFSSMBCopy()
2364 pSMB->Flags = cpu_to_le16(flags & COPY_TREE); in CIFSSMBCopy()
2366 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBCopy()
2367 name_len = cifsConvertToUTF16((__le16 *) pSMB->OldFileName, in CIFSSMBCopy()
2372 pSMB->OldFileName[name_len] = 0x04; /* pad */ in CIFSSMBCopy()
2374 pSMB->OldFileName[name_len + 1] = 0x00; in CIFSSMBCopy()
2376 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSSMBCopy()
2381 name_len = copy_path_name(pSMB->OldFileName, fromName); in CIFSSMBCopy()
2382 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSSMBCopy()
2383 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, toName); in CIFSSMBCopy()
2389 pSMB->ByteCount = cpu_to_le16(count); in CIFSSMBCopy()
2391 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBCopy()
2395 rc, le16_to_cpu(pSMBr->CopyCount)); in CIFSSMBCopy()
2399 if (rc == -EAGAIN) in CIFSSMBCopy()
2426 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2428 cifsConvertToUTF16((__le16 *) pSMB->FileName, fromName, in CIFSUnixCreateSymLink()
2435 name_len = copy_path_name(pSMB->FileName, fromName); in CIFSUnixCreateSymLink()
2438 pSMB->MaxSetupCount = 0; in CIFSUnixCreateSymLink()
2439 pSMB->Reserved = 0; in CIFSUnixCreateSymLink()
2440 pSMB->Flags = 0; in CIFSUnixCreateSymLink()
2441 pSMB->Timeout = 0; in CIFSUnixCreateSymLink()
2442 pSMB->Reserved2 = 0; in CIFSUnixCreateSymLink()
2444 InformationLevel) - 4; in CIFSUnixCreateSymLink()
2449 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateSymLink()
2460 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateSymLink()
2462 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateSymLink()
2463 pSMB->SetupCount = 1; in CIFSUnixCreateSymLink()
2464 pSMB->Reserved3 = 0; in CIFSUnixCreateSymLink()
2465 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateSymLink()
2467 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateSymLink()
2468 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateSymLink()
2469 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateSymLink()
2470 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateSymLink()
2471 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateSymLink()
2472 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateSymLink()
2473 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_LINK); in CIFSUnixCreateSymLink()
2474 pSMB->Reserved4 = 0; in CIFSUnixCreateSymLink()
2476 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateSymLink()
2477 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateSymLink()
2479 cifs_stats_inc(&tcon->stats.cifs_stats.num_symlinks); in CIFSUnixCreateSymLink()
2486 if (rc == -EAGAIN) in CIFSUnixCreateSymLink()
2513 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2514 name_len = cifsConvertToUTF16((__le16 *) pSMB->FileName, toName, in CIFSUnixCreateHardLink()
2520 name_len = copy_path_name(pSMB->FileName, toName); in CIFSUnixCreateHardLink()
2523 pSMB->MaxSetupCount = 0; in CIFSUnixCreateHardLink()
2524 pSMB->Reserved = 0; in CIFSUnixCreateHardLink()
2525 pSMB->Flags = 0; in CIFSUnixCreateHardLink()
2526 pSMB->Timeout = 0; in CIFSUnixCreateHardLink()
2527 pSMB->Reserved2 = 0; in CIFSUnixCreateHardLink()
2529 InformationLevel) - 4; in CIFSUnixCreateHardLink()
2534 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSUnixCreateHardLink()
2544 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSUnixCreateHardLink()
2546 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSUnixCreateHardLink()
2547 pSMB->SetupCount = 1; in CIFSUnixCreateHardLink()
2548 pSMB->Reserved3 = 0; in CIFSUnixCreateHardLink()
2549 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSUnixCreateHardLink()
2551 pSMB->ParameterCount = cpu_to_le16(params); in CIFSUnixCreateHardLink()
2552 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSUnixCreateHardLink()
2553 pSMB->DataCount = cpu_to_le16(name_len_target); in CIFSUnixCreateHardLink()
2554 pSMB->TotalDataCount = pSMB->DataCount; in CIFSUnixCreateHardLink()
2555 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSUnixCreateHardLink()
2556 pSMB->DataOffset = cpu_to_le16(offset); in CIFSUnixCreateHardLink()
2557 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_HLINK); in CIFSUnixCreateHardLink()
2558 pSMB->Reserved4 = 0; in CIFSUnixCreateHardLink()
2560 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSUnixCreateHardLink()
2561 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSUnixCreateHardLink()
2563 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSUnixCreateHardLink()
2569 if (rc == -EAGAIN) in CIFSUnixCreateHardLink()
2597 pSMB->SearchAttributes = in CIFSCreateHardLink()
2600 pSMB->Flags = cpu_to_le16(CREATE_HARD_LINK); in CIFSCreateHardLink()
2601 pSMB->ClusterCount = 0; in CIFSCreateHardLink()
2603 pSMB->BufferFormat = 0x04; in CIFSCreateHardLink()
2605 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSCreateHardLink()
2607 cifsConvertToUTF16((__le16 *) pSMB->OldFileName, from_name, in CIFSCreateHardLink()
2608 PATH_MAX, cifs_sb->local_nls, remap); in CIFSCreateHardLink()
2613 pSMB->OldFileName[name_len] = 0x04; in CIFSCreateHardLink()
2614 pSMB->OldFileName[name_len + 1] = 0x00; /* pad */ in CIFSCreateHardLink()
2616 cifsConvertToUTF16((__le16 *)&pSMB->OldFileName[name_len+2], in CIFSCreateHardLink()
2617 to_name, PATH_MAX, cifs_sb->local_nls, in CIFSCreateHardLink()
2622 name_len = copy_path_name(pSMB->OldFileName, from_name); in CIFSCreateHardLink()
2623 pSMB->OldFileName[name_len] = 0x04; /* 2nd buffer format */ in CIFSCreateHardLink()
2624 name_len2 = copy_path_name(pSMB->OldFileName+name_len+1, to_name); in CIFSCreateHardLink()
2630 pSMB->ByteCount = cpu_to_le16(count); in CIFSCreateHardLink()
2632 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSCreateHardLink()
2634 cifs_stats_inc(&tcon->stats.cifs_stats.num_hardlinks); in CIFSCreateHardLink()
2639 if (rc == -EAGAIN) in CIFSCreateHardLink()
2667 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQuerySymLink()
2669 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSSMBUnixQuerySymLink()
2675 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQuerySymLink()
2679 pSMB->TotalDataCount = 0; in CIFSSMBUnixQuerySymLink()
2680 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQuerySymLink()
2681 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQuerySymLink()
2682 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQuerySymLink()
2683 pSMB->Reserved = 0; in CIFSSMBUnixQuerySymLink()
2684 pSMB->Flags = 0; in CIFSSMBUnixQuerySymLink()
2685 pSMB->Timeout = 0; in CIFSSMBUnixQuerySymLink()
2686 pSMB->Reserved2 = 0; in CIFSSMBUnixQuerySymLink()
2687 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQuerySymLink()
2688 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQuerySymLink()
2689 pSMB->DataCount = 0; in CIFSSMBUnixQuerySymLink()
2690 pSMB->DataOffset = 0; in CIFSSMBUnixQuerySymLink()
2691 pSMB->SetupCount = 1; in CIFSSMBUnixQuerySymLink()
2692 pSMB->Reserved3 = 0; in CIFSSMBUnixQuerySymLink()
2693 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQuerySymLink()
2695 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQuerySymLink()
2696 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQuerySymLink()
2697 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_LINK); in CIFSSMBUnixQuerySymLink()
2698 pSMB->Reserved4 = 0; in CIFSSMBUnixQuerySymLink()
2700 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQuerySymLink()
2702 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQuerySymLink()
2711 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSSMBUnixQuerySymLink()
2712 rc = -EIO; in CIFSSMBUnixQuerySymLink()
2715 u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSSMBUnixQuerySymLink()
2717 data_start = ((char *) &pSMBr->hdr.Protocol) + in CIFSSMBUnixQuerySymLink()
2718 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQuerySymLink()
2720 if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) in CIFSSMBUnixQuerySymLink()
2729 rc = -ENOMEM; in CIFSSMBUnixQuerySymLink()
2733 if (rc == -EAGAIN) in CIFSSMBUnixQuerySymLink()
2758 if (cap_unix(tcon->ses)) in cifs_query_reparse_point()
2759 return -EOPNOTSUPP; in cifs_query_reparse_point()
2781 io_req->TotalParameterCount = 0; in cifs_query_reparse_point()
2782 io_req->TotalDataCount = 0; in cifs_query_reparse_point()
2783 io_req->MaxParameterCount = cpu_to_le32(2); in cifs_query_reparse_point()
2785 io_req->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in cifs_query_reparse_point()
2786 io_req->MaxSetupCount = 4; in cifs_query_reparse_point()
2787 io_req->Reserved = 0; in cifs_query_reparse_point()
2788 io_req->ParameterOffset = 0; in cifs_query_reparse_point()
2789 io_req->DataCount = 0; in cifs_query_reparse_point()
2790 io_req->DataOffset = 0; in cifs_query_reparse_point()
2791 io_req->SetupCount = 4; in cifs_query_reparse_point()
2792 io_req->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in cifs_query_reparse_point()
2793 io_req->ParameterCount = io_req->TotalParameterCount; in cifs_query_reparse_point()
2794 io_req->FunctionCode = cpu_to_le32(FSCTL_GET_REPARSE_POINT); in cifs_query_reparse_point()
2795 io_req->IsFsctl = 1; in cifs_query_reparse_point()
2796 io_req->IsRootFlag = 0; in cifs_query_reparse_point()
2797 io_req->Fid = fid.netfid; in cifs_query_reparse_point()
2798 io_req->ByteCount = 0; in cifs_query_reparse_point()
2800 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *)io_req, in cifs_query_reparse_point()
2805 data_offset = le32_to_cpu(io_rsp->DataOffset); in cifs_query_reparse_point()
2806 data_count = le32_to_cpu(io_rsp->DataCount); in cifs_query_reparse_point()
2807 if (get_bcc(&io_rsp->hdr) < 2 || data_offset > 512 || in cifs_query_reparse_point()
2809 rc = -EIO; in cifs_query_reparse_point()
2813 end = 2 + get_bcc(&io_rsp->hdr) + (__u8 *)&io_rsp->ByteCount; in cifs_query_reparse_point()
2814 start = (__u8 *)&io_rsp->hdr.Protocol + data_offset; in cifs_query_reparse_point()
2816 rc = -EIO; in cifs_query_reparse_point()
2820 data_count = le16_to_cpu(io_rsp->ByteCount); in cifs_query_reparse_point()
2824 data_count < le16_to_cpu(buf->ReparseDataLength) + len) { in cifs_query_reparse_point()
2825 rc = -EIO; in cifs_query_reparse_point()
2829 *tag = le32_to_cpu(buf->ReparseTag); in cifs_query_reparse_point()
2830 rsp->iov_base = io_rsp; in cifs_query_reparse_point()
2831 rsp->iov_len = io_rsp_len; in cifs_query_reparse_point()
2851 cifs_dbg(FYI, "Set compression for %u\n", fid); in CIFSSMB_set_compression()
2857 pSMB->compression_state = cpu_to_le16(COMPRESSION_FORMAT_DEFAULT); in CIFSSMB_set_compression()
2859 pSMB->TotalParameterCount = 0; in CIFSSMB_set_compression()
2860 pSMB->TotalDataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2861 pSMB->MaxParameterCount = 0; in CIFSSMB_set_compression()
2862 pSMB->MaxDataCount = 0; in CIFSSMB_set_compression()
2863 pSMB->MaxSetupCount = 4; in CIFSSMB_set_compression()
2864 pSMB->Reserved = 0; in CIFSSMB_set_compression()
2865 pSMB->ParameterOffset = 0; in CIFSSMB_set_compression()
2866 pSMB->DataCount = cpu_to_le32(2); in CIFSSMB_set_compression()
2867 pSMB->DataOffset = in CIFSSMB_set_compression()
2869 compression_state) - 4); /* 84 */ in CIFSSMB_set_compression()
2870 pSMB->SetupCount = 4; in CIFSSMB_set_compression()
2871 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_IOCTL); in CIFSSMB_set_compression()
2872 pSMB->ParameterCount = 0; in CIFSSMB_set_compression()
2873 pSMB->FunctionCode = cpu_to_le32(FSCTL_SET_COMPRESSION); in CIFSSMB_set_compression()
2874 pSMB->IsFsctl = 1; /* FSCTL */ in CIFSSMB_set_compression()
2875 pSMB->IsRootFlag = 0; in CIFSSMB_set_compression()
2876 pSMB->Fid = fid; /* file handle always le */ in CIFSSMB_set_compression()
2878 pSMB->ByteCount = cpu_to_le16(5); in CIFSSMB_set_compression()
2881 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMB_set_compression()
2889 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMB_set_compression()
2900 * cifs_init_posix_acl - convert ACL from cifs to POSIX ACL format
2913 ace->e_perm = cifs_ace->cifs_e_perm; in cifs_init_posix_acl()
2914 ace->e_tag = cifs_ace->cifs_e_tag; in cifs_init_posix_acl()
2916 switch (ace->e_tag) { in cifs_init_posix_acl()
2918 ace->e_uid = make_kuid(&init_user_ns, in cifs_init_posix_acl()
2919 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2922 ace->e_gid = make_kgid(&init_user_ns, in cifs_init_posix_acl()
2923 le64_to_cpu(cifs_ace->cifs_uid)); in cifs_init_posix_acl()
2930 * cifs_to_posix_acl - copy cifs ACL format to POSIX ACL format
2950 if (le16_to_cpu(cifs_acl->version) != CIFS_ACL_VERSION) in cifs_to_posix_acl()
2951 return -EOPNOTSUPP; in cifs_to_posix_acl()
2954 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2955 pACE = &cifs_acl->ace_array[0]; in cifs_to_posix_acl()
2962 return -EINVAL; in cifs_to_posix_acl()
2965 count = le16_to_cpu(cifs_acl->access_entry_count); in cifs_to_posix_acl()
2968 /* skip past access ACEs to get to default ACEs */ in cifs_to_posix_acl()
2969 pACE = &cifs_acl->ace_array[count]; in cifs_to_posix_acl()
2970 count = le16_to_cpu(cifs_acl->default_entry_count); in cifs_to_posix_acl()
2974 return -EINVAL; in cifs_to_posix_acl()
2977 return -EINVAL; in cifs_to_posix_acl()
2983 return -ENOMEM; in cifs_to_posix_acl()
2995 * cifs_init_ace - convert ACL entry from POSIX ACL to cifs format
3002 cifs_ace->cifs_e_perm = local_ace->e_perm; in cifs_init_ace()
3003 cifs_ace->cifs_e_tag = local_ace->e_tag; in cifs_init_ace()
3005 switch (local_ace->e_tag) { in cifs_init_ace()
3007 cifs_ace->cifs_uid = in cifs_init_ace()
3008 cpu_to_le64(from_kuid(&init_user_ns, local_ace->e_uid)); in cifs_init_ace()
3011 cifs_ace->cifs_uid = in cifs_init_ace()
3012 cpu_to_le64(from_kgid(&init_user_ns, local_ace->e_gid)); in cifs_init_ace()
3015 cifs_ace->cifs_uid = cpu_to_le64(-1); in cifs_init_ace()
3020 * posix_acl_to_cifs - convert ACLs from POSIX ACL to cifs format
3039 count = acl->a_count; in posix_acl_to_cifs()
3049 cifs_acl->version = cpu_to_le16(1); in posix_acl_to_cifs()
3051 cifs_acl->access_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3052 cifs_acl->default_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3054 cifs_acl->default_entry_count = cpu_to_le16(count); in posix_acl_to_cifs()
3055 cifs_acl->access_entry_count = cpu_to_le16(0xFFFF); in posix_acl_to_cifs()
3061 cifs_init_ace(&cifs_acl->ace_array[i++], pa); in posix_acl_to_cifs()
3092 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_get_acl()
3094 cifsConvertToUTF16((__le16 *) pSMB->FileName, in cifs_do_get_acl()
3099 pSMB->FileName[name_len] = 0; in cifs_do_get_acl()
3100 pSMB->FileName[name_len+1] = 0; in cifs_do_get_acl()
3102 name_len = copy_path_name(pSMB->FileName, searchName); in cifs_do_get_acl()
3106 pSMB->TotalDataCount = 0; in cifs_do_get_acl()
3107 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_get_acl()
3109 pSMB->MaxDataCount = cpu_to_le16(4000); in cifs_do_get_acl()
3110 pSMB->MaxSetupCount = 0; in cifs_do_get_acl()
3111 pSMB->Reserved = 0; in cifs_do_get_acl()
3112 pSMB->Flags = 0; in cifs_do_get_acl()
3113 pSMB->Timeout = 0; in cifs_do_get_acl()
3114 pSMB->Reserved2 = 0; in cifs_do_get_acl()
3115 pSMB->ParameterOffset = cpu_to_le16( in cifs_do_get_acl()
3117 InformationLevel) - 4); in cifs_do_get_acl()
3118 pSMB->DataCount = 0; in cifs_do_get_acl()
3119 pSMB->DataOffset = 0; in cifs_do_get_acl()
3120 pSMB->SetupCount = 1; in cifs_do_get_acl()
3121 pSMB->Reserved3 = 0; in cifs_do_get_acl()
3122 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in cifs_do_get_acl()
3124 pSMB->TotalParameterCount = cpu_to_le16(params); in cifs_do_get_acl()
3125 pSMB->ParameterCount = pSMB->TotalParameterCount; in cifs_do_get_acl()
3126 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_ACL); in cifs_do_get_acl()
3127 pSMB->Reserved4 = 0; in cifs_do_get_acl()
3129 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_get_acl()
3131 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_get_acl()
3133 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in cifs_do_get_acl()
3141 if (rc || get_bcc(&pSMBr->hdr) < 2) in cifs_do_get_acl()
3142 rc = -EIO; /* bad smb */ in cifs_do_get_acl()
3144 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in cifs_do_get_acl()
3145 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in cifs_do_get_acl()
3147 (char *)&pSMBr->hdr.Protocol+data_offset, in cifs_do_get_acl()
3157 if (rc == -EAGAIN) in cifs_do_get_acl()
3181 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in cifs_do_set_acl()
3183 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in cifs_do_set_acl()
3188 name_len = copy_path_name(pSMB->FileName, fileName); in cifs_do_set_acl()
3191 pSMB->MaxParameterCount = cpu_to_le16(2); in cifs_do_set_acl()
3193 pSMB->MaxDataCount = cpu_to_le16(1000); in cifs_do_set_acl()
3194 pSMB->MaxSetupCount = 0; in cifs_do_set_acl()
3195 pSMB->Reserved = 0; in cifs_do_set_acl()
3196 pSMB->Flags = 0; in cifs_do_set_acl()
3197 pSMB->Timeout = 0; in cifs_do_set_acl()
3198 pSMB->Reserved2 = 0; in cifs_do_set_acl()
3200 InformationLevel) - 4; in cifs_do_set_acl()
3202 parm_data = ((char *)pSMB) + sizeof(pSMB->hdr.smb_buf_length) + offset; in cifs_do_set_acl()
3203 pSMB->ParameterOffset = cpu_to_le16(param_offset); in cifs_do_set_acl()
3209 rc = -EOPNOTSUPP; in cifs_do_set_acl()
3212 pSMB->DataOffset = cpu_to_le16(offset); in cifs_do_set_acl()
3213 pSMB->SetupCount = 1; in cifs_do_set_acl()
3214 pSMB->Reserved3 = 0; in cifs_do_set_acl()
3215 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in cifs_do_set_acl()
3216 pSMB->InformationLevel = cpu_to_le16(SMB_SET_POSIX_ACL); in cifs_do_set_acl()
3218 pSMB->DataCount = cpu_to_le16(data_count); in cifs_do_set_acl()
3219 pSMB->TotalDataCount = pSMB->DataCount; in cifs_do_set_acl()
3220 pSMB->ParameterCount = cpu_to_le16(params); in cifs_do_set_acl()
3221 pSMB->TotalParameterCount = pSMB->ParameterCount; in cifs_do_set_acl()
3222 pSMB->Reserved4 = 0; in cifs_do_set_acl()
3224 pSMB->ByteCount = cpu_to_le16(byte_count); in cifs_do_set_acl()
3225 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in cifs_do_set_acl()
3228 cifs_dbg(FYI, "Set POSIX ACL returned %d\n", rc); in cifs_do_set_acl()
3232 if (rc == -EAGAIN) in cifs_do_set_acl()
3242 return -EOPNOTSUPP; in cifs_do_get_acl()
3250 return -EOPNOTSUPP; in cifs_do_set_acl()
3266 return -ENODEV; in CIFSGetExtAttr()
3275 pSMB->t2.TotalDataCount = 0; in CIFSGetExtAttr()
3276 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSGetExtAttr()
3278 pSMB->t2.MaxDataCount = cpu_to_le16(4000); in CIFSGetExtAttr()
3279 pSMB->t2.MaxSetupCount = 0; in CIFSGetExtAttr()
3280 pSMB->t2.Reserved = 0; in CIFSGetExtAttr()
3281 pSMB->t2.Flags = 0; in CIFSGetExtAttr()
3282 pSMB->t2.Timeout = 0; in CIFSGetExtAttr()
3283 pSMB->t2.Reserved2 = 0; in CIFSGetExtAttr()
3284 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSGetExtAttr()
3285 Fid) - 4); in CIFSGetExtAttr()
3286 pSMB->t2.DataCount = 0; in CIFSGetExtAttr()
3287 pSMB->t2.DataOffset = 0; in CIFSGetExtAttr()
3288 pSMB->t2.SetupCount = 1; in CIFSGetExtAttr()
3289 pSMB->t2.Reserved3 = 0; in CIFSGetExtAttr()
3290 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSGetExtAttr()
3292 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSGetExtAttr()
3293 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSGetExtAttr()
3294 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_ATTR_FLAGS); in CIFSGetExtAttr()
3295 pSMB->Pad = 0; in CIFSGetExtAttr()
3296 pSMB->Fid = netfid; in CIFSGetExtAttr()
3298 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSGetExtAttr()
3300 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetExtAttr()
3308 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetExtAttr()
3311 rc = -EIO; /* bad smb */ in CIFSGetExtAttr()
3313 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetExtAttr()
3314 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetExtAttr()
3319 rc = -EIO; in CIFSGetExtAttr()
3323 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetExtAttr()
3324 *pExtAttrBits = le64_to_cpu(pfinfo->mode); in CIFSGetExtAttr()
3325 *pMask = le64_to_cpu(pfinfo->mask); in CIFSGetExtAttr()
3330 if (rc == -EAGAIN) in CIFSGetExtAttr()
3342 * returned setup area) and MaxParameterCount (returned parms size) must be set
3359 pSMB->Reserved = 0; in smb_init_nttransact()
3360 pSMB->TotalParameterCount = cpu_to_le32(parm_len); in smb_init_nttransact()
3361 pSMB->TotalDataCount = 0; in smb_init_nttransact()
3362 pSMB->MaxDataCount = cpu_to_le32(CIFSMaxBufSize & 0xFFFFFF00); in smb_init_nttransact()
3363 pSMB->ParameterCount = pSMB->TotalParameterCount; in smb_init_nttransact()
3364 pSMB->DataCount = pSMB->TotalDataCount; in smb_init_nttransact()
3366 (setup_count * 2) - 4 /* for rfc1001 length itself */; in smb_init_nttransact()
3367 pSMB->ParameterOffset = cpu_to_le32(temp_offset); in smb_init_nttransact()
3368 pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); in smb_init_nttransact()
3369 pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ in smb_init_nttransact()
3370 pSMB->SubCommand = cpu_to_le16(sub_command); in smb_init_nttransact()
3387 return -EINVAL; in validate_ntransact()
3391 bcc = get_bcc(&pSMBr->hdr); in validate_ntransact()
3393 (char *)&pSMBr->ByteCount; in validate_ntransact()
3395 data_offset = le32_to_cpu(pSMBr->DataOffset); in validate_ntransact()
3396 data_count = le32_to_cpu(pSMBr->DataCount); in validate_ntransact()
3397 parm_offset = le32_to_cpu(pSMBr->ParameterOffset); in validate_ntransact()
3398 parm_count = le32_to_cpu(pSMBr->ParameterCount); in validate_ntransact()
3400 *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; in validate_ntransact()
3401 *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; in validate_ntransact()
3406 return -EINVAL; in validate_ntransact()
3409 return -EINVAL; in validate_ntransact()
3412 return -EINVAL; in validate_ntransact()
3417 return -EINVAL; in validate_ntransact()
3420 return -EINVAL; in validate_ntransact()
3448 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBGetCIFSACL()
3450 pSMB->MaxSetupCount = 0; in CIFSSMBGetCIFSACL()
3451 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBGetCIFSACL()
3452 pSMB->AclFlags = cpu_to_le32(CIFS_ACL_OWNER | CIFS_ACL_GROUP | in CIFSSMBGetCIFSACL()
3454 pSMB->ByteCount = cpu_to_le16(11); /* 3 bytes pad + 8 bytes parm */ in CIFSSMBGetCIFSACL()
3457 iov[0].iov_len = be32_to_cpu(pSMB->hdr.smb_buf_length) + 4; in CIFSSMBGetCIFSACL()
3459 rc = SendReceive2(xid, tcon->ses, iov, 1 /* num iovec */, &buf_type, in CIFSSMBGetCIFSACL()
3462 cifs_stats_inc(&tcon->stats.cifs_stats.num_acl_get); in CIFSSMBGetCIFSACL()
3482 if (le32_to_cpu(pSMBr->ParameterCount) != 4) { in CIFSSMBGetCIFSACL()
3483 rc = -EIO; /* bad smb */ in CIFSSMBGetCIFSACL()
3503 rc = -EINVAL; in CIFSSMBGetCIFSACL()
3509 rc = -ENOMEM; in CIFSSMBGetCIFSACL()
3533 pSMB->MaxSetupCount = 0; in CIFSSMBSetCIFSACL()
3534 pSMB->Reserved = 0; in CIFSSMBSetCIFSACL()
3537 param_offset = offsetof(struct smb_com_transaction_ssec_req, Fid) - 4; in CIFSSMBSetCIFSACL()
3542 pSMB->DataCount = cpu_to_le32(data_count); in CIFSSMBSetCIFSACL()
3543 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetCIFSACL()
3544 pSMB->MaxParameterCount = cpu_to_le32(4); in CIFSSMBSetCIFSACL()
3545 pSMB->MaxDataCount = cpu_to_le32(16384); in CIFSSMBSetCIFSACL()
3546 pSMB->ParameterCount = cpu_to_le32(param_count); in CIFSSMBSetCIFSACL()
3547 pSMB->ParameterOffset = cpu_to_le32(param_offset); in CIFSSMBSetCIFSACL()
3548 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetCIFSACL()
3549 pSMB->DataOffset = cpu_to_le32(data_offset); in CIFSSMBSetCIFSACL()
3550 pSMB->SetupCount = 0; in CIFSSMBSetCIFSACL()
3551 pSMB->SubCommand = cpu_to_le16(NT_TRANSACT_SET_SECURITY_DESC); in CIFSSMBSetCIFSACL()
3552 pSMB->ByteCount = cpu_to_le16(byte_count+data_count); in CIFSSMBSetCIFSACL()
3554 pSMB->Fid = fid; /* file handle always le */ in CIFSSMBSetCIFSACL()
3555 pSMB->Reserved2 = 0; in CIFSSMBSetCIFSACL()
3556 pSMB->AclFlags = cpu_to_le32(aclflag); in CIFSSMBSetCIFSACL()
3565 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetCIFSACL()
3571 cifs_dbg(FYI, "Set CIFS ACL returned %d\n", rc); in CIFSSMBSetCIFSACL()
3574 if (rc == -EAGAIN) in CIFSSMBSetCIFSACL()
3601 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in SMBQueryInformation()
3603 cifsConvertToUTF16((__le16 *) pSMB->FileName, in SMBQueryInformation()
3609 name_len = copy_path_name(pSMB->FileName, search_name); in SMBQueryInformation()
3611 pSMB->BufferFormat = 0x04; in SMBQueryInformation()
3614 pSMB->ByteCount = cpu_to_le16(name_len); in SMBQueryInformation()
3616 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBQueryInformation()
3622 __u32 time = le32_to_cpu(pSMBr->last_write_time); in SMBQueryInformation()
3625 /* BB FIXME - add time zone adjustment BB */ in SMBQueryInformation()
3630 data->ChangeTime = cpu_to_le64(cifs_UnixTimeToNT(ts)); in SMBQueryInformation()
3631 data->LastWriteTime = data->ChangeTime; in SMBQueryInformation()
3632 data->LastAccessTime = 0; in SMBQueryInformation()
3633 data->AllocationSize = in SMBQueryInformation()
3634 cpu_to_le64(le32_to_cpu(pSMBr->size)); in SMBQueryInformation()
3635 data->EndOfFile = data->AllocationSize; in SMBQueryInformation()
3636 data->Attributes = in SMBQueryInformation()
3637 cpu_to_le32(le16_to_cpu(pSMBr->attr)); in SMBQueryInformation()
3639 rc = -EIO; /* bad buffer passed in */ in SMBQueryInformation()
3643 if (rc == -EAGAIN) in SMBQueryInformation()
3666 pSMB->t2.TotalDataCount = 0; in CIFSSMBQFileInfo()
3667 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBQFileInfo()
3669 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQFileInfo()
3670 pSMB->t2.MaxSetupCount = 0; in CIFSSMBQFileInfo()
3671 pSMB->t2.Reserved = 0; in CIFSSMBQFileInfo()
3672 pSMB->t2.Flags = 0; in CIFSSMBQFileInfo()
3673 pSMB->t2.Timeout = 0; in CIFSSMBQFileInfo()
3674 pSMB->t2.Reserved2 = 0; in CIFSSMBQFileInfo()
3675 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBQFileInfo()
3676 Fid) - 4); in CIFSSMBQFileInfo()
3677 pSMB->t2.DataCount = 0; in CIFSSMBQFileInfo()
3678 pSMB->t2.DataOffset = 0; in CIFSSMBQFileInfo()
3679 pSMB->t2.SetupCount = 1; in CIFSSMBQFileInfo()
3680 pSMB->t2.Reserved3 = 0; in CIFSSMBQFileInfo()
3681 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBQFileInfo()
3683 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFileInfo()
3684 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBQFileInfo()
3685 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQFileInfo()
3686 pSMB->Pad = 0; in CIFSSMBQFileInfo()
3687 pSMB->Fid = netfid; in CIFSSMBQFileInfo()
3689 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFileInfo()
3691 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFileInfo()
3699 rc = -EIO; in CIFSSMBQFileInfo()
3700 else if (get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQFileInfo()
3701 rc = -EIO; /* bad smb */ in CIFSSMBQFileInfo()
3703 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFileInfo()
3705 (char *) &pSMBr->hdr.Protocol + in CIFSSMBQFileInfo()
3708 rc = -ENOMEM; in CIFSSMBQFileInfo()
3711 if (rc == -EAGAIN) in CIFSSMBQFileInfo()
3738 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQPathInfo()
3740 cifsConvertToUTF16((__le16 *) pSMB->FileName, search_name, in CIFSSMBQPathInfo()
3745 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSSMBQPathInfo()
3749 pSMB->TotalDataCount = 0; in CIFSSMBQPathInfo()
3750 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQPathInfo()
3752 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBQPathInfo()
3753 pSMB->MaxSetupCount = 0; in CIFSSMBQPathInfo()
3754 pSMB->Reserved = 0; in CIFSSMBQPathInfo()
3755 pSMB->Flags = 0; in CIFSSMBQPathInfo()
3756 pSMB->Timeout = 0; in CIFSSMBQPathInfo()
3757 pSMB->Reserved2 = 0; in CIFSSMBQPathInfo()
3758 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQPathInfo()
3759 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQPathInfo()
3760 pSMB->DataCount = 0; in CIFSSMBQPathInfo()
3761 pSMB->DataOffset = 0; in CIFSSMBQPathInfo()
3762 pSMB->SetupCount = 1; in CIFSSMBQPathInfo()
3763 pSMB->Reserved3 = 0; in CIFSSMBQPathInfo()
3764 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQPathInfo()
3766 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQPathInfo()
3767 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQPathInfo()
3769 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_STANDARD); in CIFSSMBQPathInfo()
3771 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_ALL_INFO); in CIFSSMBQPathInfo()
3772 pSMB->Reserved4 = 0; in CIFSSMBQPathInfo()
3774 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQPathInfo()
3776 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQPathInfo()
3784 rc = -EIO; in CIFSSMBQPathInfo()
3785 else if (!legacy && get_bcc(&pSMBr->hdr) < 40) in CIFSSMBQPathInfo()
3786 rc = -EIO; /* bad smb */ in CIFSSMBQPathInfo()
3787 else if (legacy && get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQPathInfo()
3788 rc = -EIO; /* 24 or 26 expected but we do not read in CIFSSMBQPathInfo()
3792 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQPathInfo()
3797 * also note it differs on Set vs Get, ie two bytes or 4 in CIFSSMBQPathInfo()
3804 memcpy((char *) data, (char *) &pSMBr->hdr.Protocol + in CIFSSMBQPathInfo()
3807 rc = -ENOMEM; in CIFSSMBQPathInfo()
3810 if (rc == -EAGAIN) in CIFSSMBQPathInfo()
3833 pSMB->t2.TotalDataCount = 0; in CIFSSMBUnixQFileInfo()
3834 pSMB->t2.MaxParameterCount = cpu_to_le16(4); in CIFSSMBUnixQFileInfo()
3836 pSMB->t2.MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBUnixQFileInfo()
3837 pSMB->t2.MaxSetupCount = 0; in CIFSSMBUnixQFileInfo()
3838 pSMB->t2.Reserved = 0; in CIFSSMBUnixQFileInfo()
3839 pSMB->t2.Flags = 0; in CIFSSMBUnixQFileInfo()
3840 pSMB->t2.Timeout = 0; in CIFSSMBUnixQFileInfo()
3841 pSMB->t2.Reserved2 = 0; in CIFSSMBUnixQFileInfo()
3842 pSMB->t2.ParameterOffset = cpu_to_le16(offsetof(struct smb_t2_qfi_req, in CIFSSMBUnixQFileInfo()
3843 Fid) - 4); in CIFSSMBUnixQFileInfo()
3844 pSMB->t2.DataCount = 0; in CIFSSMBUnixQFileInfo()
3845 pSMB->t2.DataOffset = 0; in CIFSSMBUnixQFileInfo()
3846 pSMB->t2.SetupCount = 1; in CIFSSMBUnixQFileInfo()
3847 pSMB->t2.Reserved3 = 0; in CIFSSMBUnixQFileInfo()
3848 pSMB->t2.SubCommand = cpu_to_le16(TRANS2_QUERY_FILE_INFORMATION); in CIFSSMBUnixQFileInfo()
3850 pSMB->t2.TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQFileInfo()
3851 pSMB->t2.ParameterCount = pSMB->t2.TotalParameterCount; in CIFSSMBUnixQFileInfo()
3852 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQFileInfo()
3853 pSMB->Pad = 0; in CIFSSMBUnixQFileInfo()
3854 pSMB->Fid = netfid; in CIFSSMBUnixQFileInfo()
3856 pSMB->t2.ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQFileInfo()
3858 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQFileInfo()
3865 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQFileInfo()
3867 rc = -EIO; /* bad smb */ in CIFSSMBUnixQFileInfo()
3869 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQFileInfo()
3871 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQFileInfo()
3878 if (rc == -EAGAIN) in CIFSSMBUnixQFileInfo()
3905 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixQPathInfo()
3907 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBUnixQPathInfo()
3912 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBUnixQPathInfo()
3916 pSMB->TotalDataCount = 0; in CIFSSMBUnixQPathInfo()
3917 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixQPathInfo()
3919 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSSMBUnixQPathInfo()
3920 pSMB->MaxSetupCount = 0; in CIFSSMBUnixQPathInfo()
3921 pSMB->Reserved = 0; in CIFSSMBUnixQPathInfo()
3922 pSMB->Flags = 0; in CIFSSMBUnixQPathInfo()
3923 pSMB->Timeout = 0; in CIFSSMBUnixQPathInfo()
3924 pSMB->Reserved2 = 0; in CIFSSMBUnixQPathInfo()
3925 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBUnixQPathInfo()
3926 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBUnixQPathInfo()
3927 pSMB->DataCount = 0; in CIFSSMBUnixQPathInfo()
3928 pSMB->DataOffset = 0; in CIFSSMBUnixQPathInfo()
3929 pSMB->SetupCount = 1; in CIFSSMBUnixQPathInfo()
3930 pSMB->Reserved3 = 0; in CIFSSMBUnixQPathInfo()
3931 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBUnixQPathInfo()
3933 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBUnixQPathInfo()
3934 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBUnixQPathInfo()
3935 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC); in CIFSSMBUnixQPathInfo()
3936 pSMB->Reserved4 = 0; in CIFSSMBUnixQPathInfo()
3938 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixQPathInfo()
3940 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixQPathInfo()
3947 if (rc || get_bcc(&pSMBr->hdr) < sizeof(FILE_UNIX_BASIC_INFO)) { in CIFSSMBUnixQPathInfo()
3949 rc = -EIO; /* bad smb */ in CIFSSMBUnixQPathInfo()
3951 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBUnixQPathInfo()
3953 (char *) &pSMBr->hdr.Protocol + in CIFSSMBUnixQPathInfo()
3959 if (rc == -EAGAIN) in CIFSSMBUnixQPathInfo()
3991 nls_codepage = cifs_sb->local_nls; in CIFSFindFirst()
3994 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSFindFirst()
3996 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSFindFirst()
4003 pSMB->FileName[name_len] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
4004 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
4005 pSMB->FileName[name_len+2] = '*'; in CIFSFindFirst()
4006 pSMB->FileName[name_len+3] = 0; in CIFSFindFirst()
4009 pSMB->FileName[name_len] = 0; in CIFSFindFirst()
4010 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
4014 name_len = copy_path_name(pSMB->FileName, searchName); in CIFSFindFirst()
4016 if (WARN_ON_ONCE(name_len > PATH_MAX-2)) in CIFSFindFirst()
4017 name_len = PATH_MAX-2; in CIFSFindFirst()
4019 pSMB->FileName[name_len-1] = CIFS_DIR_SEP(cifs_sb); in CIFSFindFirst()
4020 pSMB->FileName[name_len] = '*'; in CIFSFindFirst()
4021 pSMB->FileName[name_len+1] = 0; in CIFSFindFirst()
4027 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindFirst()
4028 pSMB->MaxParameterCount = cpu_to_le16(10); in CIFSFindFirst()
4029 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindFirst()
4030 pSMB->MaxSetupCount = 0; in CIFSFindFirst()
4031 pSMB->Reserved = 0; in CIFSFindFirst()
4032 pSMB->Flags = 0; in CIFSFindFirst()
4033 pSMB->Timeout = 0; in CIFSFindFirst()
4034 pSMB->Reserved2 = 0; in CIFSFindFirst()
4036 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindFirst()
4037 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindFirst()
4038 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindFirst()
4040 - 4); in CIFSFindFirst()
4041 pSMB->DataCount = 0; in CIFSFindFirst()
4042 pSMB->DataOffset = 0; in CIFSFindFirst()
4043 pSMB->SetupCount = 1; /* one byte, no need to make endian neutral */ in CIFSFindFirst()
4044 pSMB->Reserved3 = 0; in CIFSFindFirst()
4045 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_FIRST); in CIFSFindFirst()
4046 pSMB->SearchAttributes = in CIFSFindFirst()
4049 pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); in CIFSFindFirst()
4050 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindFirst()
4051 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindFirst()
4053 /* BB what should we set StorageType to? Does it matter? BB */ in CIFSFindFirst()
4054 pSMB->SearchStorageType = 0; in CIFSFindFirst()
4056 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindFirst()
4058 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindFirst()
4060 cifs_stats_inc(&tcon->stats.cifs_stats.num_ffirst); in CIFSFindFirst()
4074 if (rc == -EAGAIN) in CIFSFindFirst()
4085 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindFirst()
4086 psrch_inf->ntwrk_buf_start = (char *)pSMBr; in CIFSFindFirst()
4087 psrch_inf->smallBuf = false; in CIFSFindFirst()
4088 psrch_inf->srch_entries_start = (char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4089 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindFirst()
4091 parms = (T2_FFIRST_RSP_PARMS *)((char *)&pSMBr->hdr.Protocol + in CIFSFindFirst()
4092 le16_to_cpu(pSMBr->t2.ParameterOffset)); in CIFSFindFirst()
4093 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindFirst()
4095 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindFirst()
4096 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + in CIFSFindFirst()
4097 psrch_inf->entries_in_buffer; in CIFSFindFirst()
4098 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindFirst()
4101 psrch_inf->last_entry = NULL; in CIFSFindFirst()
4103 psrch_inf->last_entry = psrch_inf->srch_entries_start + lnoff; in CIFSFindFirst()
4105 *pnetfid = parms->SearchHandle; in CIFSFindFirst()
4126 if (psrch_inf->endOfSearch) in CIFSFindNext()
4127 return -ENOENT; in CIFSFindNext()
4136 pSMB->TotalDataCount = 0; /* no EAs */ in CIFSFindNext()
4137 pSMB->MaxParameterCount = cpu_to_le16(8); in CIFSFindNext()
4138 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize & 0xFFFFFF00); in CIFSFindNext()
4139 pSMB->MaxSetupCount = 0; in CIFSFindNext()
4140 pSMB->Reserved = 0; in CIFSFindNext()
4141 pSMB->Flags = 0; in CIFSFindNext()
4142 pSMB->Timeout = 0; in CIFSFindNext()
4143 pSMB->Reserved2 = 0; in CIFSFindNext()
4144 pSMB->ParameterOffset = cpu_to_le16( in CIFSFindNext()
4145 offsetof(struct smb_com_transaction2_fnext_req,SearchHandle) - 4); in CIFSFindNext()
4146 pSMB->DataCount = 0; in CIFSFindNext()
4147 pSMB->DataOffset = 0; in CIFSFindNext()
4148 pSMB->SetupCount = 1; in CIFSFindNext()
4149 pSMB->Reserved3 = 0; in CIFSFindNext()
4150 pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_NEXT); in CIFSFindNext()
4151 pSMB->SearchHandle = searchHandle; /* always kept as le */ in CIFSFindNext()
4152 pSMB->SearchCount = in CIFSFindNext()
4154 pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); in CIFSFindNext()
4155 pSMB->ResumeKey = psrch_inf->resume_key; in CIFSFindNext()
4156 pSMB->SearchFlags = cpu_to_le16(search_flags); in CIFSFindNext()
4158 name_len = psrch_inf->resume_name_len; in CIFSFindNext()
4161 memcpy(pSMB->ResumeFileName, psrch_inf->presume_name, name_len); in CIFSFindNext()
4164 pSMB->ResumeFileName[name_len] = 0; in CIFSFindNext()
4165 pSMB->ResumeFileName[name_len+1] = 0; in CIFSFindNext()
4168 return -EINVAL; in CIFSFindNext()
4171 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSFindNext()
4172 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSFindNext()
4174 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSFindNext()
4176 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSFindNext()
4178 cifs_stats_inc(&tcon->stats.cifs_stats.num_fnext); in CIFSFindNext()
4182 if (rc == -EBADF) { in CIFSFindNext()
4183 psrch_inf->endOfSearch = true; in CIFSFindNext()
4198 psrch_inf->unicode = !!(pSMBr->hdr.Flags2 & SMBFLG2_UNICODE); in CIFSFindNext()
4199 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4200 le16_to_cpu(pSMBr->t2.ParameterOffset); in CIFSFindNext()
4202 response_data = (char *)&pSMBr->hdr.Protocol + in CIFSFindNext()
4203 le16_to_cpu(pSMBr->t2.DataOffset); in CIFSFindNext()
4205 if (psrch_inf->smallBuf) in CIFSFindNext()
4206 cifs_small_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4208 cifs_buf_release(psrch_inf->ntwrk_buf_start); in CIFSFindNext()
4210 psrch_inf->srch_entries_start = response_data; in CIFSFindNext()
4211 psrch_inf->ntwrk_buf_start = (char *)pSMB; in CIFSFindNext()
4212 psrch_inf->smallBuf = false; in CIFSFindNext()
4213 psrch_inf->endOfSearch = !!parms->EndofSearch; in CIFSFindNext()
4214 psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); in CIFSFindNext()
4215 psrch_inf->index_of_last_entry += psrch_inf->entries_in_buffer; in CIFSFindNext()
4216 lnoff = le16_to_cpu(parms->LastNameOffset); in CIFSFindNext()
4219 psrch_inf->last_entry = NULL; in CIFSFindNext()
4221 psrch_inf->last_entry = in CIFSFindNext()
4222 psrch_inf->srch_entries_start + lnoff; in CIFSFindNext()
4230 * Note: On -EAGAIN error only caller can retry on handle based calls in CIFSFindNext()
4248 if (rc == -EAGAIN) in CIFSFindClose()
4253 pSMB->FileID = searchHandle; in CIFSFindClose()
4254 pSMB->ByteCount = 0; in CIFSFindClose()
4255 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSFindClose()
4260 cifs_stats_inc(&tcon->stats.cifs_stats.num_fclose); in CIFSFindClose()
4263 if (rc == -EAGAIN) in CIFSFindClose()
4282 return -ENODEV; in CIFSGetSrvInodeNumber()
4290 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSGetSrvInodeNumber()
4292 cifsConvertToUTF16((__le16 *) pSMB->FileName, in CIFSGetSrvInodeNumber()
4298 name_len = copy_path_name(pSMB->FileName, search_name); in CIFSGetSrvInodeNumber()
4302 pSMB->TotalDataCount = 0; in CIFSGetSrvInodeNumber()
4303 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSGetSrvInodeNumber()
4305 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetSrvInodeNumber()
4306 pSMB->MaxSetupCount = 0; in CIFSGetSrvInodeNumber()
4307 pSMB->Reserved = 0; in CIFSGetSrvInodeNumber()
4308 pSMB->Flags = 0; in CIFSGetSrvInodeNumber()
4309 pSMB->Timeout = 0; in CIFSGetSrvInodeNumber()
4310 pSMB->Reserved2 = 0; in CIFSGetSrvInodeNumber()
4311 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetSrvInodeNumber()
4312 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSGetSrvInodeNumber()
4313 pSMB->DataCount = 0; in CIFSGetSrvInodeNumber()
4314 pSMB->DataOffset = 0; in CIFSGetSrvInodeNumber()
4315 pSMB->SetupCount = 1; in CIFSGetSrvInodeNumber()
4316 pSMB->Reserved3 = 0; in CIFSGetSrvInodeNumber()
4317 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSGetSrvInodeNumber()
4319 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSGetSrvInodeNumber()
4320 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSGetSrvInodeNumber()
4321 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FILE_INTERNAL_INFO); in CIFSGetSrvInodeNumber()
4322 pSMB->Reserved4 = 0; in CIFSGetSrvInodeNumber()
4324 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetSrvInodeNumber()
4326 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSGetSrvInodeNumber()
4334 if (rc || get_bcc(&pSMBr->hdr) < 2) in CIFSGetSrvInodeNumber()
4337 rc = -EIO; /* bad smb */ in CIFSGetSrvInodeNumber()
4339 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSGetSrvInodeNumber()
4340 __u16 count = le16_to_cpu(pSMBr->t2.DataCount); in CIFSGetSrvInodeNumber()
4345 rc = -EIO; in CIFSGetSrvInodeNumber()
4349 (data_offset + (char *) &pSMBr->hdr.Protocol); in CIFSGetSrvInodeNumber()
4350 *inode_number = le64_to_cpu(pfinfo->UniqueId); in CIFSGetSrvInodeNumber()
4355 if (rc == -EAGAIN) in CIFSGetSrvInodeNumber()
4377 if (ses == NULL || ses->tcon_ipc == NULL) in CIFSGetDFSRefer()
4378 return -ENODEV; in CIFSGetDFSRefer()
4386 rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, ses->tcon_ipc, in CIFSGetDFSRefer()
4393 pSMB->hdr.Mid = get_next_mid(ses->server); in CIFSGetDFSRefer()
4394 pSMB->hdr.Tid = ses->tcon_ipc->tid; in CIFSGetDFSRefer()
4395 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4396 if (ses->capabilities & CAP_STATUS32) in CIFSGetDFSRefer()
4397 pSMB->hdr.Flags2 |= SMBFLG2_ERR_STATUS; in CIFSGetDFSRefer()
4398 if (ses->capabilities & CAP_DFS) in CIFSGetDFSRefer()
4399 pSMB->hdr.Flags2 |= SMBFLG2_DFS; in CIFSGetDFSRefer()
4401 if (ses->capabilities & CAP_UNICODE) { in CIFSGetDFSRefer()
4402 pSMB->hdr.Flags2 |= SMBFLG2_UNICODE; in CIFSGetDFSRefer()
4404 cifsConvertToUTF16((__le16 *) pSMB->RequestFileName, in CIFSGetDFSRefer()
4410 name_len = copy_path_name(pSMB->RequestFileName, search_name); in CIFSGetDFSRefer()
4413 if (ses->server->sign) in CIFSGetDFSRefer()
4414 pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE; in CIFSGetDFSRefer()
4416 pSMB->hdr.Uid = ses->Suid; in CIFSGetDFSRefer()
4419 pSMB->TotalDataCount = 0; in CIFSGetDFSRefer()
4420 pSMB->DataCount = 0; in CIFSGetDFSRefer()
4421 pSMB->DataOffset = 0; in CIFSGetDFSRefer()
4422 pSMB->MaxParameterCount = 0; in CIFSGetDFSRefer()
4424 pSMB->MaxDataCount = cpu_to_le16(4000); in CIFSGetDFSRefer()
4425 pSMB->MaxSetupCount = 0; in CIFSGetDFSRefer()
4426 pSMB->Reserved = 0; in CIFSGetDFSRefer()
4427 pSMB->Flags = 0; in CIFSGetDFSRefer()
4428 pSMB->Timeout = 0; in CIFSGetDFSRefer()
4429 pSMB->Reserved2 = 0; in CIFSGetDFSRefer()
4430 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSGetDFSRefer()
4431 struct smb_com_transaction2_get_dfs_refer_req, MaxReferralLevel) - 4); in CIFSGetDFSRefer()
4432 pSMB->SetupCount = 1; in CIFSGetDFSRefer()
4433 pSMB->Reserved3 = 0; in CIFSGetDFSRefer()
4434 pSMB->SubCommand = cpu_to_le16(TRANS2_GET_DFS_REFERRAL); in CIFSGetDFSRefer()
4436 pSMB->ParameterCount = cpu_to_le16(params); in CIFSGetDFSRefer()
4437 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSGetDFSRefer()
4438 pSMB->MaxReferralLevel = cpu_to_le16(3); in CIFSGetDFSRefer()
4440 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSGetDFSRefer()
4451 if (rc || get_bcc(&pSMBr->hdr) < 17) { in CIFSGetDFSRefer()
4452 rc = -EIO; /* bad smb */ in CIFSGetDFSRefer()
4457 get_bcc(&pSMBr->hdr), le16_to_cpu(pSMBr->t2.DataOffset)); in CIFSGetDFSRefer()
4460 rc = parse_dfs_referrals(&pSMBr->dfs_data, in CIFSGetDFSRefer()
4461 le16_to_cpu(pSMBr->t2.DataCount), in CIFSGetDFSRefer()
4464 (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) != 0); in CIFSGetDFSRefer()
4469 if (rc == -EAGAIN) in CIFSGetDFSRefer()
4496 pSMB->TotalDataCount = 0; in SMBOldQFSInfo()
4497 pSMB->MaxParameterCount = cpu_to_le16(2); in SMBOldQFSInfo()
4498 pSMB->MaxDataCount = cpu_to_le16(1000); in SMBOldQFSInfo()
4499 pSMB->MaxSetupCount = 0; in SMBOldQFSInfo()
4500 pSMB->Reserved = 0; in SMBOldQFSInfo()
4501 pSMB->Flags = 0; in SMBOldQFSInfo()
4502 pSMB->Timeout = 0; in SMBOldQFSInfo()
4503 pSMB->Reserved2 = 0; in SMBOldQFSInfo()
4505 pSMB->TotalParameterCount = cpu_to_le16(params); in SMBOldQFSInfo()
4506 pSMB->ParameterCount = pSMB->TotalParameterCount; in SMBOldQFSInfo()
4507 pSMB->ParameterOffset = cpu_to_le16(offsetof( in SMBOldQFSInfo()
4508 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in SMBOldQFSInfo()
4509 pSMB->DataCount = 0; in SMBOldQFSInfo()
4510 pSMB->DataOffset = 0; in SMBOldQFSInfo()
4511 pSMB->SetupCount = 1; in SMBOldQFSInfo()
4512 pSMB->Reserved3 = 0; in SMBOldQFSInfo()
4513 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in SMBOldQFSInfo()
4514 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_ALLOCATION); in SMBOldQFSInfo()
4516 pSMB->ByteCount = cpu_to_le16(byte_count); in SMBOldQFSInfo()
4518 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in SMBOldQFSInfo()
4525 if (rc || get_bcc(&pSMBr->hdr) < 18) in SMBOldQFSInfo()
4526 rc = -EIO; /* bad smb */ in SMBOldQFSInfo()
4528 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in SMBOldQFSInfo()
4530 get_bcc(&pSMBr->hdr), data_offset); in SMBOldQFSInfo()
4533 (((char *) &pSMBr->hdr.Protocol) + data_offset); in SMBOldQFSInfo()
4534 FSData->f_bsize = in SMBOldQFSInfo()
4535 le16_to_cpu(response_data->BytesPerSector) * in SMBOldQFSInfo()
4536 le32_to_cpu(response_data-> in SMBOldQFSInfo()
4542 if (FSData->f_bsize < 512) in SMBOldQFSInfo()
4543 FSData->f_bsize = 4096; in SMBOldQFSInfo()
4545 FSData->f_blocks = in SMBOldQFSInfo()
4546 le32_to_cpu(response_data->TotalAllocationUnits); in SMBOldQFSInfo()
4547 FSData->f_bfree = FSData->f_bavail = in SMBOldQFSInfo()
4548 le32_to_cpu(response_data->FreeAllocationUnits); in SMBOldQFSInfo()
4550 (unsigned long long)FSData->f_blocks, in SMBOldQFSInfo()
4551 (unsigned long long)FSData->f_bfree, in SMBOldQFSInfo()
4552 FSData->f_bsize); in SMBOldQFSInfo()
4557 if (rc == -EAGAIN) in SMBOldQFSInfo()
4583 pSMB->TotalDataCount = 0; in CIFSSMBQFSInfo()
4584 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSInfo()
4585 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSInfo()
4586 pSMB->MaxSetupCount = 0; in CIFSSMBQFSInfo()
4587 pSMB->Reserved = 0; in CIFSSMBQFSInfo()
4588 pSMB->Flags = 0; in CIFSSMBQFSInfo()
4589 pSMB->Timeout = 0; in CIFSSMBQFSInfo()
4590 pSMB->Reserved2 = 0; in CIFSSMBQFSInfo()
4592 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSInfo()
4593 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSInfo()
4594 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSInfo()
4595 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSInfo()
4596 pSMB->DataCount = 0; in CIFSSMBQFSInfo()
4597 pSMB->DataOffset = 0; in CIFSSMBQFSInfo()
4598 pSMB->SetupCount = 1; in CIFSSMBQFSInfo()
4599 pSMB->Reserved3 = 0; in CIFSSMBQFSInfo()
4600 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSInfo()
4601 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_SIZE_INFO); in CIFSSMBQFSInfo()
4603 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSInfo()
4605 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSInfo()
4612 if (rc || get_bcc(&pSMBr->hdr) < 24) in CIFSSMBQFSInfo()
4613 rc = -EIO; /* bad smb */ in CIFSSMBQFSInfo()
4615 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSInfo()
4619 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSInfo()
4621 FSData->f_bsize = in CIFSSMBQFSInfo()
4622 le32_to_cpu(response_data->BytesPerSector) * in CIFSSMBQFSInfo()
4623 le32_to_cpu(response_data-> in CIFSSMBQFSInfo()
4629 if (FSData->f_bsize < 512) in CIFSSMBQFSInfo()
4630 FSData->f_bsize = 4096; in CIFSSMBQFSInfo()
4632 FSData->f_blocks = in CIFSSMBQFSInfo()
4633 le64_to_cpu(response_data->TotalAllocationUnits); in CIFSSMBQFSInfo()
4634 FSData->f_bfree = FSData->f_bavail = in CIFSSMBQFSInfo()
4635 le64_to_cpu(response_data->FreeAllocationUnits); in CIFSSMBQFSInfo()
4637 (unsigned long long)FSData->f_blocks, in CIFSSMBQFSInfo()
4638 (unsigned long long)FSData->f_bfree, in CIFSSMBQFSInfo()
4639 FSData->f_bsize); in CIFSSMBQFSInfo()
4644 if (rc == -EAGAIN) in CIFSSMBQFSInfo()
4669 pSMB->TotalDataCount = 0; in CIFSSMBQFSAttributeInfo()
4670 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSAttributeInfo()
4672 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSAttributeInfo()
4673 pSMB->MaxSetupCount = 0; in CIFSSMBQFSAttributeInfo()
4674 pSMB->Reserved = 0; in CIFSSMBQFSAttributeInfo()
4675 pSMB->Flags = 0; in CIFSSMBQFSAttributeInfo()
4676 pSMB->Timeout = 0; in CIFSSMBQFSAttributeInfo()
4677 pSMB->Reserved2 = 0; in CIFSSMBQFSAttributeInfo()
4679 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSAttributeInfo()
4680 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSAttributeInfo()
4681 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSAttributeInfo()
4682 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSAttributeInfo()
4683 pSMB->DataCount = 0; in CIFSSMBQFSAttributeInfo()
4684 pSMB->DataOffset = 0; in CIFSSMBQFSAttributeInfo()
4685 pSMB->SetupCount = 1; in CIFSSMBQFSAttributeInfo()
4686 pSMB->Reserved3 = 0; in CIFSSMBQFSAttributeInfo()
4687 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSAttributeInfo()
4688 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_ATTRIBUTE_INFO); in CIFSSMBQFSAttributeInfo()
4690 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSAttributeInfo()
4692 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSAttributeInfo()
4699 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSAttributeInfo()
4701 rc = -EIO; /* bad smb */ in CIFSSMBQFSAttributeInfo()
4703 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSAttributeInfo()
4706 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSAttributeInfo()
4708 memcpy(&tcon->fsAttrInfo, response_data, in CIFSSMBQFSAttributeInfo()
4714 if (rc == -EAGAIN) in CIFSSMBQFSAttributeInfo()
4739 pSMB->TotalDataCount = 0; in CIFSSMBQFSDeviceInfo()
4740 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSDeviceInfo()
4742 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBQFSDeviceInfo()
4743 pSMB->MaxSetupCount = 0; in CIFSSMBQFSDeviceInfo()
4744 pSMB->Reserved = 0; in CIFSSMBQFSDeviceInfo()
4745 pSMB->Flags = 0; in CIFSSMBQFSDeviceInfo()
4746 pSMB->Timeout = 0; in CIFSSMBQFSDeviceInfo()
4747 pSMB->Reserved2 = 0; in CIFSSMBQFSDeviceInfo()
4749 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQFSDeviceInfo()
4750 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQFSDeviceInfo()
4751 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQFSDeviceInfo()
4752 struct smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSDeviceInfo()
4754 pSMB->DataCount = 0; in CIFSSMBQFSDeviceInfo()
4755 pSMB->DataOffset = 0; in CIFSSMBQFSDeviceInfo()
4756 pSMB->SetupCount = 1; in CIFSSMBQFSDeviceInfo()
4757 pSMB->Reserved3 = 0; in CIFSSMBQFSDeviceInfo()
4758 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSDeviceInfo()
4759 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_FS_DEVICE_INFO); in CIFSSMBQFSDeviceInfo()
4761 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSDeviceInfo()
4763 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSDeviceInfo()
4770 if (rc || get_bcc(&pSMBr->hdr) < in CIFSSMBQFSDeviceInfo()
4772 rc = -EIO; /* bad smb */ in CIFSSMBQFSDeviceInfo()
4774 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSDeviceInfo()
4777 (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSDeviceInfo()
4779 memcpy(&tcon->fsDevInfo, response_data, in CIFSSMBQFSDeviceInfo()
4785 if (rc == -EAGAIN) in CIFSSMBQFSDeviceInfo()
4810 pSMB->TotalDataCount = 0; in CIFSSMBQFSUnixInfo()
4811 pSMB->DataCount = 0; in CIFSSMBQFSUnixInfo()
4812 pSMB->DataOffset = 0; in CIFSSMBQFSUnixInfo()
4813 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSUnixInfo()
4815 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSUnixInfo()
4816 pSMB->MaxSetupCount = 0; in CIFSSMBQFSUnixInfo()
4817 pSMB->Reserved = 0; in CIFSSMBQFSUnixInfo()
4818 pSMB->Flags = 0; in CIFSSMBQFSUnixInfo()
4819 pSMB->Timeout = 0; in CIFSSMBQFSUnixInfo()
4820 pSMB->Reserved2 = 0; in CIFSSMBQFSUnixInfo()
4822 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSUnixInfo()
4823 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSUnixInfo()
4824 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSUnixInfo()
4825 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSUnixInfo()
4826 pSMB->SetupCount = 1; in CIFSSMBQFSUnixInfo()
4827 pSMB->Reserved3 = 0; in CIFSSMBQFSUnixInfo()
4828 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSUnixInfo()
4829 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_CIFS_UNIX_INFO); in CIFSSMBQFSUnixInfo()
4831 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSUnixInfo()
4833 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSUnixInfo()
4840 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSUnixInfo()
4841 rc = -EIO; /* bad smb */ in CIFSSMBQFSUnixInfo()
4843 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSUnixInfo()
4846 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSUnixInfo()
4848 memcpy(&tcon->fsUnixInfo, response_data, in CIFSSMBQFSUnixInfo()
4854 if (rc == -EAGAIN) in CIFSSMBQFSUnixInfo()
4880 pSMB->MaxSetupCount = 0; in CIFSSMBSetFSUnixInfo()
4881 pSMB->Reserved = 0; in CIFSSMBSetFSUnixInfo()
4882 pSMB->Flags = 0; in CIFSSMBSetFSUnixInfo()
4883 pSMB->Timeout = 0; in CIFSSMBSetFSUnixInfo()
4884 pSMB->Reserved2 = 0; in CIFSSMBSetFSUnixInfo()
4886 - 4; in CIFSSMBSetFSUnixInfo()
4889 pSMB->MaxParameterCount = cpu_to_le16(4); in CIFSSMBSetFSUnixInfo()
4891 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBSetFSUnixInfo()
4892 pSMB->SetupCount = 1; in CIFSSMBSetFSUnixInfo()
4893 pSMB->Reserved3 = 0; in CIFSSMBSetFSUnixInfo()
4894 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FS_INFORMATION); in CIFSSMBSetFSUnixInfo()
4897 pSMB->DataCount = cpu_to_le16(12); in CIFSSMBSetFSUnixInfo()
4898 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFSUnixInfo()
4899 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFSUnixInfo()
4900 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFSUnixInfo()
4901 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFSUnixInfo()
4902 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFSUnixInfo()
4905 pSMB->FileNum = 0; in CIFSSMBSetFSUnixInfo()
4906 pSMB->InformationLevel = cpu_to_le16(SMB_SET_CIFS_UNIX_INFO); in CIFSSMBSetFSUnixInfo()
4909 pSMB->ClientUnixMajor = cpu_to_le16(CIFS_UNIX_MAJOR_VERSION); in CIFSSMBSetFSUnixInfo()
4910 pSMB->ClientUnixMinor = cpu_to_le16(CIFS_UNIX_MINOR_VERSION); in CIFSSMBSetFSUnixInfo()
4911 pSMB->ClientUnixCap = cpu_to_le64(cap); in CIFSSMBSetFSUnixInfo()
4914 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFSUnixInfo()
4916 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetFSUnixInfo()
4923 rc = -EIO; /* bad smb */ in CIFSSMBSetFSUnixInfo()
4927 if (rc == -EAGAIN) in CIFSSMBSetFSUnixInfo()
4955 pSMB->TotalDataCount = 0; in CIFSSMBQFSPosixInfo()
4956 pSMB->DataCount = 0; in CIFSSMBQFSPosixInfo()
4957 pSMB->DataOffset = 0; in CIFSSMBQFSPosixInfo()
4958 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQFSPosixInfo()
4960 pSMB->MaxDataCount = cpu_to_le16(100); in CIFSSMBQFSPosixInfo()
4961 pSMB->MaxSetupCount = 0; in CIFSSMBQFSPosixInfo()
4962 pSMB->Reserved = 0; in CIFSSMBQFSPosixInfo()
4963 pSMB->Flags = 0; in CIFSSMBQFSPosixInfo()
4964 pSMB->Timeout = 0; in CIFSSMBQFSPosixInfo()
4965 pSMB->Reserved2 = 0; in CIFSSMBQFSPosixInfo()
4967 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBQFSPosixInfo()
4968 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBQFSPosixInfo()
4969 pSMB->ParameterOffset = cpu_to_le16(offsetof(struct in CIFSSMBQFSPosixInfo()
4970 smb_com_transaction2_qfsi_req, InformationLevel) - 4); in CIFSSMBQFSPosixInfo()
4971 pSMB->SetupCount = 1; in CIFSSMBQFSPosixInfo()
4972 pSMB->Reserved3 = 0; in CIFSSMBQFSPosixInfo()
4973 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_FS_INFORMATION); in CIFSSMBQFSPosixInfo()
4974 pSMB->InformationLevel = cpu_to_le16(SMB_QUERY_POSIX_FS_INFO); in CIFSSMBQFSPosixInfo()
4976 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQFSPosixInfo()
4978 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQFSPosixInfo()
4985 if (rc || get_bcc(&pSMBr->hdr) < 13) { in CIFSSMBQFSPosixInfo()
4986 rc = -EIO; /* bad smb */ in CIFSSMBQFSPosixInfo()
4988 __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQFSPosixInfo()
4991 *) (((char *) &pSMBr->hdr.Protocol) + in CIFSSMBQFSPosixInfo()
4993 FSData->f_bsize = in CIFSSMBQFSPosixInfo()
4994 le32_to_cpu(response_data->BlockSize); in CIFSSMBQFSPosixInfo()
4999 if (FSData->f_bsize < 512) in CIFSSMBQFSPosixInfo()
5000 FSData->f_bsize = 4096; in CIFSSMBQFSPosixInfo()
5002 FSData->f_blocks = in CIFSSMBQFSPosixInfo()
5003 le64_to_cpu(response_data->TotalBlocks); in CIFSSMBQFSPosixInfo()
5004 FSData->f_bfree = in CIFSSMBQFSPosixInfo()
5005 le64_to_cpu(response_data->BlocksAvail); in CIFSSMBQFSPosixInfo()
5006 if (response_data->UserBlocksAvail == cpu_to_le64(-1)) { in CIFSSMBQFSPosixInfo()
5007 FSData->f_bavail = FSData->f_bfree; in CIFSSMBQFSPosixInfo()
5009 FSData->f_bavail = in CIFSSMBQFSPosixInfo()
5010 le64_to_cpu(response_data->UserBlocksAvail); in CIFSSMBQFSPosixInfo()
5012 if (response_data->TotalFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
5013 FSData->f_files = in CIFSSMBQFSPosixInfo()
5014 le64_to_cpu(response_data->TotalFileNodes); in CIFSSMBQFSPosixInfo()
5015 if (response_data->FreeFileNodes != cpu_to_le64(-1)) in CIFSSMBQFSPosixInfo()
5016 FSData->f_ffree = in CIFSSMBQFSPosixInfo()
5017 le64_to_cpu(response_data->FreeFileNodes); in CIFSSMBQFSPosixInfo()
5022 if (rc == -EAGAIN) in CIFSSMBQFSPosixInfo()
5030 * We can not use write of zero bytes trick to set file size due to need for
5057 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEOF()
5059 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBSetEOF()
5060 PATH_MAX, cifs_sb->local_nls, remap); in CIFSSMBSetEOF()
5064 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBSetEOF()
5068 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEOF()
5069 pSMB->MaxDataCount = cpu_to_le16(4100); in CIFSSMBSetEOF()
5070 pSMB->MaxSetupCount = 0; in CIFSSMBSetEOF()
5071 pSMB->Reserved = 0; in CIFSSMBSetEOF()
5072 pSMB->Flags = 0; in CIFSSMBSetEOF()
5073 pSMB->Timeout = 0; in CIFSSMBSetEOF()
5074 pSMB->Reserved2 = 0; in CIFSSMBSetEOF()
5076 InformationLevel) - 4; in CIFSSMBSetEOF()
5079 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5080 pSMB->InformationLevel = in CIFSSMBSetEOF()
5083 pSMB->InformationLevel = in CIFSSMBSetEOF()
5085 } else /* Set File Size */ { in CIFSSMBSetEOF()
5086 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetEOF()
5087 pSMB->InformationLevel = in CIFSSMBSetEOF()
5090 pSMB->InformationLevel = in CIFSSMBSetEOF()
5095 (struct file_end_of_file_info *) (((char *) &pSMB->hdr.Protocol) + in CIFSSMBSetEOF()
5097 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEOF()
5098 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEOF()
5099 pSMB->SetupCount = 1; in CIFSSMBSetEOF()
5100 pSMB->Reserved3 = 0; in CIFSSMBSetEOF()
5101 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEOF()
5103 pSMB->DataCount = cpu_to_le16(data_count); in CIFSSMBSetEOF()
5104 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEOF()
5105 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEOF()
5106 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEOF()
5107 pSMB->Reserved4 = 0; in CIFSSMBSetEOF()
5109 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetEOF()
5110 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEOF()
5111 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEOF()
5118 if (rc == -EAGAIN) in CIFSSMBSetEOF()
5140 pSMB->hdr.Pid = cpu_to_le16((__u16)cfile->pid); in CIFSSMBSetFileSize()
5141 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(cfile->pid >> 16)); in CIFSSMBSetFileSize()
5144 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileSize()
5145 pSMB->Reserved = 0; in CIFSSMBSetFileSize()
5146 pSMB->Flags = 0; in CIFSSMBSetFileSize()
5147 pSMB->Timeout = 0; in CIFSSMBSetFileSize()
5148 pSMB->Reserved2 = 0; in CIFSSMBSetFileSize()
5149 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileSize()
5153 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileSize()
5155 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileSize()
5156 pSMB->SetupCount = 1; in CIFSSMBSetFileSize()
5157 pSMB->Reserved3 = 0; in CIFSSMBSetFileSize()
5158 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileSize()
5160 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileSize()
5161 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileSize()
5162 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileSize()
5163 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileSize()
5164 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileSize()
5168 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileSize()
5169 parm_data->FileSize = cpu_to_le64(size); in CIFSSMBSetFileSize()
5170 pSMB->Fid = cfile->fid.netfid; in CIFSSMBSetFileSize()
5172 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5173 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5176 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5178 } else /* Set File Size */ { in CIFSSMBSetFileSize()
5179 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileSize()
5180 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5183 pSMB->InformationLevel = in CIFSSMBSetFileSize()
5186 pSMB->Reserved4 = 0; in CIFSSMBSetFileSize()
5188 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileSize()
5189 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileSize()
5196 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileSize()
5202 /* Some legacy servers such as NT4 require that the file times be set on
5203 an open handle, rather than by pathname - this is awkward due to
5217 cifs_dbg(FYI, "Set Times (via SetFileInfo)\n"); in CIFSSMBSetFileInfo()
5223 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileInfo()
5224 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileInfo()
5227 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileInfo()
5228 pSMB->Reserved = 0; in CIFSSMBSetFileInfo()
5229 pSMB->Flags = 0; in CIFSSMBSetFileInfo()
5230 pSMB->Timeout = 0; in CIFSSMBSetFileInfo()
5231 pSMB->Reserved2 = 0; in CIFSSMBSetFileInfo()
5232 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileInfo()
5239 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileInfo()
5241 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileInfo()
5242 pSMB->SetupCount = 1; in CIFSSMBSetFileInfo()
5243 pSMB->Reserved3 = 0; in CIFSSMBSetFileInfo()
5244 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileInfo()
5246 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileInfo()
5247 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileInfo()
5248 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileInfo()
5249 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileInfo()
5250 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileInfo()
5251 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileInfo()
5252 pSMB->Fid = fid; in CIFSSMBSetFileInfo()
5253 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetFileInfo()
5254 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetFileInfo()
5256 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetFileInfo()
5257 pSMB->Reserved4 = 0; in CIFSSMBSetFileInfo()
5259 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileInfo()
5261 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileInfo()
5264 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBSetFileInfo()
5267 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBSetFileInfo()
5282 cifs_dbg(FYI, "Set File Disposition (via SetFileInfo)\n"); in CIFSSMBSetFileDisposition()
5288 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBSetFileDisposition()
5289 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBSetFileDisposition()
5292 pSMB->MaxSetupCount = 0; in CIFSSMBSetFileDisposition()
5293 pSMB->Reserved = 0; in CIFSSMBSetFileDisposition()
5294 pSMB->Flags = 0; in CIFSSMBSetFileDisposition()
5295 pSMB->Timeout = 0; in CIFSSMBSetFileDisposition()
5296 pSMB->Reserved2 = 0; in CIFSSMBSetFileDisposition()
5297 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBSetFileDisposition()
5304 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetFileDisposition()
5306 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetFileDisposition()
5307 pSMB->SetupCount = 1; in CIFSSMBSetFileDisposition()
5308 pSMB->Reserved3 = 0; in CIFSSMBSetFileDisposition()
5309 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBSetFileDisposition()
5311 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetFileDisposition()
5312 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetFileDisposition()
5313 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetFileDisposition()
5314 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetFileDisposition()
5315 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetFileDisposition()
5316 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetFileDisposition()
5317 pSMB->Fid = fid; in CIFSSMBSetFileDisposition()
5318 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_DISPOSITION_INFO); in CIFSSMBSetFileDisposition()
5319 pSMB->Reserved4 = 0; in CIFSSMBSetFileDisposition()
5321 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetFileDisposition()
5323 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBSetFileDisposition()
5356 rc = CIFSSMBSetFileInfo(xid, tcon, data, fid.netfid, current->tgid); in CIFSSMBSetPathInfoFB()
5386 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetPathInfo()
5388 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetPathInfo()
5393 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetPathInfo()
5398 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetPathInfo()
5400 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetPathInfo()
5401 pSMB->MaxSetupCount = 0; in CIFSSMBSetPathInfo()
5402 pSMB->Reserved = 0; in CIFSSMBSetPathInfo()
5403 pSMB->Flags = 0; in CIFSSMBSetPathInfo()
5404 pSMB->Timeout = 0; in CIFSSMBSetPathInfo()
5405 pSMB->Reserved2 = 0; in CIFSSMBSetPathInfo()
5407 InformationLevel) - 4; in CIFSSMBSetPathInfo()
5409 data_offset = (char *) (&pSMB->hdr.Protocol) + offset; in CIFSSMBSetPathInfo()
5410 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetPathInfo()
5411 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetPathInfo()
5412 pSMB->SetupCount = 1; in CIFSSMBSetPathInfo()
5413 pSMB->Reserved3 = 0; in CIFSSMBSetPathInfo()
5414 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetPathInfo()
5417 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetPathInfo()
5418 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetPathInfo()
5419 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetPathInfo()
5420 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetPathInfo()
5421 if (tcon->ses->capabilities & CAP_INFOLEVEL_PASSTHRU) in CIFSSMBSetPathInfo()
5422 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO2); in CIFSSMBSetPathInfo()
5424 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_BASIC_INFO); in CIFSSMBSetPathInfo()
5425 pSMB->Reserved4 = 0; in CIFSSMBSetPathInfo()
5428 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetPathInfo()
5429 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetPathInfo()
5436 if (rc == -EAGAIN) in CIFSSMBSetPathInfo()
5439 if (rc == -EOPNOTSUPP) in CIFSSMBSetPathInfo()
5451 u64 mode = args->mode; in cifs_fill_unix_set_info()
5453 if (uid_valid(args->uid)) in cifs_fill_unix_set_info()
5454 uid = from_kuid(&init_user_ns, args->uid); in cifs_fill_unix_set_info()
5455 if (gid_valid(args->gid)) in cifs_fill_unix_set_info()
5456 gid = from_kgid(&init_user_ns, args->gid); in cifs_fill_unix_set_info()
5459 * Samba server ignores set of file size to zero due to bugs in some in cifs_fill_unix_set_info()
5460 * older clients, but we should be precise - we use SetFileSize to in cifs_fill_unix_set_info()
5461 * set file size and do not want to truncate file size to zero in cifs_fill_unix_set_info()
5463 * zero instead of -1 here in cifs_fill_unix_set_info()
5465 data_offset->EndOfFile = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5466 data_offset->NumOfBytes = cpu_to_le64(NO_CHANGE_64); in cifs_fill_unix_set_info()
5467 data_offset->LastStatusChange = cpu_to_le64(args->ctime); in cifs_fill_unix_set_info()
5468 data_offset->LastAccessTime = cpu_to_le64(args->atime); in cifs_fill_unix_set_info()
5469 data_offset->LastModificationTime = cpu_to_le64(args->mtime); in cifs_fill_unix_set_info()
5470 data_offset->Uid = cpu_to_le64(uid); in cifs_fill_unix_set_info()
5471 data_offset->Gid = cpu_to_le64(gid); in cifs_fill_unix_set_info()
5473 data_offset->DevMajor = cpu_to_le64(MAJOR(args->device)); in cifs_fill_unix_set_info()
5474 data_offset->DevMinor = cpu_to_le64(MINOR(args->device)); in cifs_fill_unix_set_info()
5475 data_offset->Permissions = cpu_to_le64(mode); in cifs_fill_unix_set_info()
5478 data_offset->Type = cpu_to_le32(UNIX_FILE); in cifs_fill_unix_set_info()
5480 data_offset->Type = cpu_to_le32(UNIX_DIR); in cifs_fill_unix_set_info()
5482 data_offset->Type = cpu_to_le32(UNIX_SYMLINK); in cifs_fill_unix_set_info()
5484 data_offset->Type = cpu_to_le32(UNIX_CHARDEV); in cifs_fill_unix_set_info()
5486 data_offset->Type = cpu_to_le32(UNIX_BLOCKDEV); in cifs_fill_unix_set_info()
5488 data_offset->Type = cpu_to_le32(UNIX_FIFO); in cifs_fill_unix_set_info()
5490 data_offset->Type = cpu_to_le32(UNIX_SOCKET); in cifs_fill_unix_set_info()
5503 cifs_dbg(FYI, "Set Unix Info (via SetFileInfo)\n"); in CIFSSMBUnixSetFileInfo()
5509 pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); in CIFSSMBUnixSetFileInfo()
5510 pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); in CIFSSMBUnixSetFileInfo()
5513 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetFileInfo()
5514 pSMB->Reserved = 0; in CIFSSMBUnixSetFileInfo()
5515 pSMB->Flags = 0; in CIFSSMBUnixSetFileInfo()
5516 pSMB->Timeout = 0; in CIFSSMBUnixSetFileInfo()
5517 pSMB->Reserved2 = 0; in CIFSSMBUnixSetFileInfo()
5518 param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; in CIFSSMBUnixSetFileInfo()
5526 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetFileInfo()
5528 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetFileInfo()
5529 pSMB->SetupCount = 1; in CIFSSMBUnixSetFileInfo()
5530 pSMB->Reserved3 = 0; in CIFSSMBUnixSetFileInfo()
5531 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); in CIFSSMBUnixSetFileInfo()
5533 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetFileInfo()
5534 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetFileInfo()
5535 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetFileInfo()
5536 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetFileInfo()
5537 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetFileInfo()
5538 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetFileInfo()
5539 pSMB->Fid = fid; in CIFSSMBUnixSetFileInfo()
5540 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetFileInfo()
5541 pSMB->Reserved4 = 0; in CIFSSMBUnixSetFileInfo()
5543 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetFileInfo()
5547 rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); in CIFSSMBUnixSetFileInfo()
5550 cifs_dbg(FYI, "Send error in Set Time (SetFileInfo) = %d\n", in CIFSSMBUnixSetFileInfo()
5553 /* Note: On -EAGAIN error only caller can retry on handle based calls in CIFSSMBUnixSetFileInfo()
5580 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBUnixSetPathInfo()
5582 cifsConvertToUTF16((__le16 *) pSMB->FileName, file_name, in CIFSSMBUnixSetPathInfo()
5587 name_len = copy_path_name(pSMB->FileName, file_name); in CIFSSMBUnixSetPathInfo()
5592 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBUnixSetPathInfo()
5594 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBUnixSetPathInfo()
5595 pSMB->MaxSetupCount = 0; in CIFSSMBUnixSetPathInfo()
5596 pSMB->Reserved = 0; in CIFSSMBUnixSetPathInfo()
5597 pSMB->Flags = 0; in CIFSSMBUnixSetPathInfo()
5598 pSMB->Timeout = 0; in CIFSSMBUnixSetPathInfo()
5599 pSMB->Reserved2 = 0; in CIFSSMBUnixSetPathInfo()
5601 InformationLevel) - 4; in CIFSSMBUnixSetPathInfo()
5606 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBUnixSetPathInfo()
5607 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBUnixSetPathInfo()
5608 pSMB->SetupCount = 1; in CIFSSMBUnixSetPathInfo()
5609 pSMB->Reserved3 = 0; in CIFSSMBUnixSetPathInfo()
5610 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBUnixSetPathInfo()
5612 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBUnixSetPathInfo()
5613 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBUnixSetPathInfo()
5614 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBUnixSetPathInfo()
5615 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBUnixSetPathInfo()
5616 pSMB->InformationLevel = cpu_to_le16(SMB_SET_FILE_UNIX_BASIC); in CIFSSMBUnixSetPathInfo()
5617 pSMB->Reserved4 = 0; in CIFSSMBUnixSetPathInfo()
5622 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBUnixSetPathInfo()
5623 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBUnixSetPathInfo()
5629 if (rc == -EAGAIN) in CIFSSMBUnixSetPathInfo()
5636 * Do a path-based QUERY_ALL_EAS call and parse the result. This is a common
5637 * function used by listxattr and getxattr type calls. When ea_name is set,
5654 struct nls_table *nls_codepage = cifs_sb->local_nls; in CIFSSMBQAllEAs()
5672 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBQAllEAs()
5674 cifsConvertToUTF16((__le16 *) pSMB->FileName, searchName, in CIFSSMBQAllEAs()
5679 list_len = copy_path_name(pSMB->FileName, searchName); in CIFSSMBQAllEAs()
5683 pSMB->TotalDataCount = 0; in CIFSSMBQAllEAs()
5684 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBQAllEAs()
5686 pSMB->MaxDataCount = cpu_to_le16(CIFSMaxBufSize); in CIFSSMBQAllEAs()
5687 pSMB->MaxSetupCount = 0; in CIFSSMBQAllEAs()
5688 pSMB->Reserved = 0; in CIFSSMBQAllEAs()
5689 pSMB->Flags = 0; in CIFSSMBQAllEAs()
5690 pSMB->Timeout = 0; in CIFSSMBQAllEAs()
5691 pSMB->Reserved2 = 0; in CIFSSMBQAllEAs()
5692 pSMB->ParameterOffset = cpu_to_le16(offsetof( in CIFSSMBQAllEAs()
5693 struct smb_com_transaction2_qpi_req, InformationLevel) - 4); in CIFSSMBQAllEAs()
5694 pSMB->DataCount = 0; in CIFSSMBQAllEAs()
5695 pSMB->DataOffset = 0; in CIFSSMBQAllEAs()
5696 pSMB->SetupCount = 1; in CIFSSMBQAllEAs()
5697 pSMB->Reserved3 = 0; in CIFSSMBQAllEAs()
5698 pSMB->SubCommand = cpu_to_le16(TRANS2_QUERY_PATH_INFORMATION); in CIFSSMBQAllEAs()
5700 pSMB->TotalParameterCount = cpu_to_le16(params); in CIFSSMBQAllEAs()
5701 pSMB->ParameterCount = pSMB->TotalParameterCount; in CIFSSMBQAllEAs()
5702 pSMB->InformationLevel = cpu_to_le16(SMB_INFO_QUERY_ALL_EAS); in CIFSSMBQAllEAs()
5703 pSMB->Reserved4 = 0; in CIFSSMBQAllEAs()
5705 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBQAllEAs()
5707 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBQAllEAs()
5720 if (rc || get_bcc(&pSMBr->hdr) < 4) { in CIFSSMBQAllEAs()
5721 rc = -EIO; /* bad smb */ in CIFSSMBQAllEAs()
5733 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); in CIFSSMBQAllEAs()
5735 (((char *) &pSMBr->hdr.Protocol) + data_offset); in CIFSSMBQAllEAs()
5737 list_len = le32_to_cpu(ea_response_data->list_len); in CIFSSMBQAllEAs()
5743 rc = -ENODATA; in CIFSSMBQAllEAs()
5748 end_of_smb = (char *)pByteArea(&pSMBr->hdr) + get_bcc(&pSMBr->hdr); in CIFSSMBQAllEAs()
5751 rc = -EIO; in CIFSSMBQAllEAs()
5756 list_len -= 4; in CIFSSMBQAllEAs()
5757 temp_fea = &ea_response_data->list; in CIFSSMBQAllEAs()
5763 list_len -= 4; in CIFSSMBQAllEAs()
5768 rc = -EIO; in CIFSSMBQAllEAs()
5772 name_len = temp_fea->name_len; in CIFSSMBQAllEAs()
5773 value_len = le16_to_cpu(temp_fea->value_len); in CIFSSMBQAllEAs()
5774 list_len -= name_len + 1 + value_len; in CIFSSMBQAllEAs()
5777 rc = -EIO; in CIFSSMBQAllEAs()
5789 rc = -ERANGE; in CIFSSMBQAllEAs()
5807 /* skip copy - calc size only */ in CIFSSMBQAllEAs()
5810 rc = -ERANGE; in CIFSSMBQAllEAs()
5820 rc = -ENODATA; in CIFSSMBQAllEAs()
5824 if (rc == -EAGAIN) in CIFSSMBQAllEAs()
5852 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { in CIFSSMBSetEA()
5854 cifsConvertToUTF16((__le16 *) pSMB->FileName, fileName, in CIFSSMBSetEA()
5859 name_len = copy_path_name(pSMB->FileName, fileName); in CIFSSMBSetEA()
5873 pSMB->MaxParameterCount = cpu_to_le16(2); in CIFSSMBSetEA()
5875 pSMB->MaxDataCount = cpu_to_le16(1000); in CIFSSMBSetEA()
5876 pSMB->MaxSetupCount = 0; in CIFSSMBSetEA()
5877 pSMB->Reserved = 0; in CIFSSMBSetEA()
5878 pSMB->Flags = 0; in CIFSSMBSetEA()
5879 pSMB->Timeout = 0; in CIFSSMBSetEA()
5880 pSMB->Reserved2 = 0; in CIFSSMBSetEA()
5882 InformationLevel) - 4; in CIFSSMBSetEA()
5884 pSMB->InformationLevel = in CIFSSMBSetEA()
5888 pSMB->ParameterOffset = cpu_to_le16(param_offset); in CIFSSMBSetEA()
5889 pSMB->DataOffset = cpu_to_le16(offset); in CIFSSMBSetEA()
5890 pSMB->SetupCount = 1; in CIFSSMBSetEA()
5891 pSMB->Reserved3 = 0; in CIFSSMBSetEA()
5892 pSMB->SubCommand = cpu_to_le16(TRANS2_SET_PATH_INFORMATION); in CIFSSMBSetEA()
5894 pSMB->DataCount = cpu_to_le16(count); in CIFSSMBSetEA()
5895 parm_data->list_len = cpu_to_le32(count); in CIFSSMBSetEA()
5896 parm_data->list.EA_flags = 0; in CIFSSMBSetEA()
5898 parm_data->list.name_len = (__u8)name_len; in CIFSSMBSetEA()
5899 /* EA names are always ASCII and NUL-terminated */ in CIFSSMBSetEA()
5900 strscpy(parm_data->list.name, ea_name ?: "", name_len + 1); in CIFSSMBSetEA()
5901 parm_data->list.value_len = cpu_to_le16(ea_value_len); in CIFSSMBSetEA()
5907 /* if (ea_value_len > buffer_size - 512 (enough for header)) */ in CIFSSMBSetEA()
5909 memcpy(parm_data->list.name + name_len + 1, in CIFSSMBSetEA()
5912 pSMB->TotalDataCount = pSMB->DataCount; in CIFSSMBSetEA()
5913 pSMB->ParameterCount = cpu_to_le16(params); in CIFSSMBSetEA()
5914 pSMB->TotalParameterCount = pSMB->ParameterCount; in CIFSSMBSetEA()
5915 pSMB->Reserved4 = 0; in CIFSSMBSetEA()
5917 pSMB->ByteCount = cpu_to_le16(byte_count); in CIFSSMBSetEA()
5918 rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, in CIFSSMBSetEA()
5925 if (rc == -EAGAIN) in CIFSSMBSetEA()